From 82e98ced85db0b7286e2070d9b93b2f2fc9b58d4 Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 5 Jan 2021 13:45:23 +0100 Subject: [PATCH] =?UTF-8?q?N=C2=B02677=20-=20Add=20style=20definition=20fo?= =?UTF-8?q?r=20enums=20(MetaModel::GetEnumStyle()=20API)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/attributedef.class.inc.php | 2 +- core/metamodel.class.php | 23 +++++++- .../datamodel.itop-request-mgmt.xml | 5 ++ setup/compiler.class.inc.php | 12 +++-- test/core/MetaModelTest.php | 54 ++++++++++++++++--- 5 files changed, 82 insertions(+), 14 deletions(-) diff --git a/core/attributedef.class.inc.php b/core/attributedef.class.inc.php index fac45c133..f03e666b9 100644 --- a/core/attributedef.class.inc.php +++ b/core/attributedef.class.inc.php @@ -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'); diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 722675e2c..39be94e85 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -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); + } } diff --git a/datamodels/2.x/itop-request-mgmt/datamodel.itop-request-mgmt.xml b/datamodels/2.x/itop-request-mgmt/datamodel.itop-request-mgmt.xml index cf18574d0..e232dcb6e 100755 --- a/datamodels/2.x/itop-request-mgmt/datamodel.itop-request-mgmt.xml +++ b/datamodels/2.x/itop-request-mgmt/datamodel.itop-request-mgmt.xml @@ -121,6 +121,11 @@ + + #2B6CB0 + #FFFFFF + + status new false diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php index 79343d139..3dbd40aa8 100644 --- a/setup/compiler.class.inc.php +++ b/setup/compiler.class.inc.php @@ -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'); diff --git a/test/core/MetaModelTest.php b/test/core/MetaModelTest.php index f59c845dc..093500ea2 100644 --- a/test/core/MetaModelTest.php +++ b/test/core/MetaModelTest.php @@ -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