N°2677 - Add style definition for enums (MetaModel::GetEnumStyle() API)

This commit is contained in:
Eric
2021-01-05 13:45:23 +01:00
parent 2dea5447b4
commit 82e98ced85
5 changed files with 82 additions and 14 deletions

View File

@@ -5184,7 +5184,7 @@ class AttributeEnum extends AttributeString
*
* @return \ormStyle|null
*/
protected function GetStyle(?string $sValue): ?ormStyle
public function GetStyle(?string $sValue): ?ormStyle
{
if ($this->IsParam('styled_values')) {
$aStyles = $this->Get('styled_values');

View File

@@ -7518,8 +7518,7 @@ abstract class MetaModel
$sKey = self::DBGetKey($sClass);
$sRootKey = self::DBGetKey($sRootClass);
$sRootField = self::DBGetClassField($sRootClass);
if ($sTable != $sRootTable)
{
if ($sTable != $sRootTable) {
// Copy the finalclass of the root table
$sRequest = "UPDATE `$sTable`,`$sRootTable` SET `$sTable`.`$sField` = `$sRootTable`.`$sRootField` WHERE `$sTable`.`$sKey` = `$sRootTable`.`$sRootKey`";
$aRequests[] = $sRequest;
@@ -7528,6 +7527,26 @@ abstract class MetaModel
return $aRequests;
}
/**
* @param string $sClass
* @param string $sAttCode
* @param string $sValue
*
* @return \ormStyle|null
* @throws \Exception
* @throws \CoreException
*/
public static function GetEnumStyle(string $sClass, string $sAttCode, string $sValue = ''): ?ormStyle
{
$oAttDef = self::GetAttributeDef($sClass, $sAttCode);
if (!$oAttDef instanceof AttributeEnum) {
throw new CoreException("MetaModel::GetEnumStyle() Attribute $sAttCode of class $sClass is not an AttributeEnum\n");
}
/** @var AttributeEnum $oAttDef */
return $oAttDef->GetStyle($sValue);
}
}

View File

@@ -121,6 +121,11 @@
</style>
</value>
</values>
<default_style>
<main_color>#2B6CB0</main_color>
<complementary_color>#FFFFFF</complementary_color>
<decoration_classes/>
</default_style>
<sql>status</sql>
<default_value>new</default_value>
<is_null_allowed>false</is_null_allowed>

View File

@@ -1379,8 +1379,10 @@ CSS;
}
$sValues = '"'.implode(',', $aValues).'"';
$aParameters['allowed_values'] = "new ValueSetEnum($sValues)";
$sStyledValues = "[".implode(',', $aStyledValues)."]";
$aParameters['styled_values'] = "$sStyledValues";
if (count($aStyledValues) > 0) {
$sStyledValues = "[".implode(',', $aStyledValues)."]";
$aParameters['styled_values'] = "$sStyledValues";
}
$oStyleNode = $oField->GetOptionalElement('default_style');
if ($oStyleNode) {
$sMainColor = $this->GetMandatoryPropString($oStyleNode, 'main_color');
@@ -1440,8 +1442,10 @@ CSS;
}
// new style... $sValues = 'array('.implode(', ', $aValues).')';
$sValues = '"'.implode(',', $aValues).'"';
$sStyledValues = "[".implode(',', $aStyledValues)."]";
$aParameters['styled_values'] = "$sStyledValues";
if (count($aStyledValues) > 0) {
$sStyledValues = "[".implode(',', $aStyledValues)."]";
$aParameters['styled_values'] = "$sStyledValues";
}
$oStyleNode = $oField->GetOptionalElement('default_style');
if ($oStyleNode) {
$sMainColor = $this->GetMandatoryPropString($oStyleNode, 'main_color');

View File

@@ -4,6 +4,7 @@
namespace Combodo\iTop\Test\UnitTest\Core;
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
use CoreException;
use MetaModel;
/**
@@ -255,8 +256,7 @@ class MetaModelTest extends ItopDataTestCase
$m_PluginManager->GetPlugins($interface, $className);
$pluginInstance = $m_PluginManager->GetPlugins($interface, $className);
if (sizeof($expectedResults)==0)
{
if (sizeof($expectedResults) == 0) {
$this->assertNull($pluginInstance);
return;
}
@@ -265,16 +265,56 @@ class MetaModelTest extends ItopDataTestCase
$this->assertTrue(is_a($pluginInstance, $expectedResults[0]));
}
public function getPluginsProvider(){
public function getPluginsProvider()
{
$aInterfaces = [
"empty conf" => [ 0, [], [], [], 'Wizzard', Gryffindor::class],
"simple instance retrieval" => [ 1, [Gryffindor::class], [ 'Wizzard' => [ Gryffindor::class]], [], 'Wizzard', Gryffindor::class],
"check instanceof parameter" => [ 1, [Gryffindor::class], [ 'Wizzard' => [ Gryffindor::class, Slytherin::class]], [], 'Wizzard', Gryffindor::class],
"try to retrieve a non instanciable object" => [ 1, [Gryffindor::class], [ 'Wizzard' => [ Gryffindor::class, Muggle::class]], [], 'Wizzard', Gryffindor::class ],
"empty conf" => [0, [], [], [], 'Wizzard', Gryffindor::class],
"simple instance retrieval" => [1, [Gryffindor::class], ['Wizzard' => [Gryffindor::class]], [], 'Wizzard', Gryffindor::class],
"check instanceof parameter" => [1, [Gryffindor::class], ['Wizzard' => [Gryffindor::class, Slytherin::class]], [], 'Wizzard', Gryffindor::class],
"try to retrieve a non instanciable object" => [1, [Gryffindor::class], ['Wizzard' => [Gryffindor::class, Muggle::class]], [], 'Wizzard', Gryffindor::class],
];
return $aInterfaces;
}
/**
* @dataProvider GetEnumStyleProvider
*/
public function testGetEnumStyle($sClass, $sAttCode, $sValue, $sAwaitedCSSClass)
{
$oStyle = MetaModel::GetEnumStyle($sClass, $sAttCode, $sValue);
if (is_null($sAwaitedCSSClass)) {
self::assertNull($oStyle);
return;
}
self::assertInstanceOf('ormStyle', $oStyle);
self::assertEquals($sAwaitedCSSClass, $oStyle->GetStyleClass());
}
public function GetEnumStyleProvider()
{
return [
'status-new' => ['UserRequest', 'status', 'new', 'ibo-enum--UserRequest-status-new'],
'status-default' => ['UserRequest', 'status', '', 'ibo-enum--UserRequest-status'],
'urgency' => ['UserRequest', 'origin', 'mail', null],
];
}
public function testGetEnumStyleException()
{
try {
MetaModel::GetEnumStyle('Contact', 'name', '');
} catch (CoreException $e) {
self::assertContains('AttributeEnum', $e->getMessage());
return;
}
// Should not get here
assertTrue(false);
}
}
abstract class Wizzard