* All apps: new custom-field type serial allowing to generate incremented serial number with a given format e.g. "RE2024-0001"

WIP allow to place custom-fields in tabs:
This commit is contained in:
ralf 2024-03-30 11:18:28 +02:00
parent 143bfce59b
commit cb5665acd0
5 changed files with 27 additions and 12 deletions

View File

@ -15,9 +15,7 @@ use EGroupware\Api\Framework;
use EGroupware\Api\Etemplate;
/**
* Customfields class - manages customfield definitions in egw_config table
*
* The repository name (config_name) is 'customfields'.
* Customfields class - manages custom-field definitions in egw_customfields table through Api\Storage\Customfields class.
*
* Applications can have customfields by sub-type by having a template
* named '<appname>.admin.types'. See admin.customfields.types as an
@ -381,7 +379,16 @@ class admin_customfields
if (!empty($content['cf_values']))
{
$values = array();
if($content['cf_values'][0] === '@')
if ($content['cf_type'] === 'serial')
{
if (!preg_match(Api\Storage\Customfields::SERIAL_PREG, $content['cf_values']))
{
Api\Etemplate::set_validation_error('cf_values', lang('Invalid Format, must end in a group of digits e.g. %1 or %2', "'0000'", "'RE2024-0000'"));
break;
}
$values = $content['cf_values'];
}
elseif($content['cf_values'][0] === '@')
{
$values['@'] = substr($content['cf_values'], $content['cf_values'][1] === '=' ? 2:1);
}
@ -500,6 +507,7 @@ class admin_customfields
else
{
$readonlys['button[delete]'] = true;
$content['cf_order'] = 10*(1+count($this->fields));
}
if (is_array($content['cf_values']))
{
@ -751,7 +759,7 @@ class admin_customfields
foreach($rows as &$row)
{
$row['cf_values'] = json_decode($row['cf_values'], true);
$row['cf_values'] = json_decode($row['cf_values'], true) ?? $row['cf_values'];
if (is_array($row['cf_values']))
{
$values = '';

View File

@ -571,6 +571,7 @@ interface admin de Schnittstelle
international use admin de Internationale Benutzung
invalid argument '%1' !!! admin de Ungültiges Argument "%1"!
invalid email admin de Ungültige E-Mail-Adresse
invalid format, must end in a group of digits e.g. %1 or %2 admin de Ungültiges Format, muss in einer Gruppe von Zahlen enden z.B. %1 oder %2
invalid formated date "%1"! admin de Ungültig formatiertes Datum "%1"!
invalid remote id or name "%1"! admin de Ungültige Remote-ID oder Name "%1"!
invalid type "%1"! admin de Ungültiger Typ "%1"!

View File

@ -571,6 +571,7 @@ interface admin en Interface
international use admin en International use
invalid argument '%1' !!! admin en Invalid argument '%1'!
invalid email admin en Invalid email
invalid format, must end in a group of digits e.g. %1 or %2 admin en Invalid Format, must end in a group of digits e.g. %1 or %2
invalid formated date "%1"! admin en Invalid formated date "%1"!
invalid remote id or name "%1"! admin en Invalid remote ID or name "%1"!
invalid type "%1"! admin en Invalid type "%1"!

View File

@ -690,8 +690,7 @@ export class et2_customfields_list extends et2_valueWidget implements et2_IDetac
_setup_serial(field_name, field, attrs)
{
delete (attrs.label);
field.type = "number"
attrs.precision = 0;
field.type = "textbox"
attrs.readonly = true;
return true;
}

View File

@ -407,7 +407,7 @@ class Customfields implements \IteratorAggregate
$cfs[$cf['name']] = $cf;
}
if($old['order'] != $cf['order'] || $cf['order'] % 10 !== 0)
if($old['order'] != $cf['order'] || (int)$cf['order'] % 10 !== 0)
{
$cfs[$cf['name']]['order'] = $cf['order'];
uasort($cfs, function($a1, $a2){
@ -650,13 +650,18 @@ class Customfields implements \IteratorAggregate
}
}
/**
* Regular expression for serial value/format allowing e.g. "RE2024-0000" for using a prefix of "RE2024-" and a 4-digit number
*/
const SERIAL_PREG = '/\d+$/';
/**
* Generate a new serial-number from the database
*
* @param int $id cf_id for custom-field
* @return int the new serial number
* @return string the new (formatted) serial number
*/
public static function getSerial(int $id) : int
public static function getSerial(int $id) : string
{
self::$db->transaction_begin();
foreach(self::$db->select(self::TABLE, 'cf_values', $where=[
@ -664,13 +669,14 @@ class Customfields implements \IteratorAggregate
'cf_type' => 'serial',
], __LINE__, __FILE__, false, 'FOR UPDATE') as $row)
{
if (empty($row['cf_values']) || !is_numeric($row['cf_values']))
// we increment the last digit-group
if (empty($row['cf_values']) || !preg_match(self::SERIAL_PREG, $row['cf_values'], $matches))
{
$row['cf_values'] = 1;
}
else
{
$row['cf_values'] += 1;
$row['cf_values'] = preg_replace(self::SERIAL_PREG, sprintf('%0'.strlen($matches[0]).'d', 1+(int)$matches[0]), $row['cf_values']);
}
break;
}