🎨 Add automatic class return type to MetaModel::GetObject() and MetaModel::NewObject()

This commit is contained in:
Eric Espie
2025-12-18 17:24:20 +01:00
parent 49e58692e3
commit f010476923
19 changed files with 459 additions and 218 deletions

View File

@@ -849,5 +849,222 @@ Call $this->AddInitialAttributeFlags($sAttCode, $iFlags) for all the initial att
</methods>
</class>
</classes>
<property_trees _delta="define" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://www.combodo.com/itop-schema/3.3">
<property_tree id="DashletGroupBy" xsi:type="Combodo-PropertyTree">
<extends>Dashlet</extends>
<nodes>
<node id="title" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-Title</label>
<value-type xsi:type="Combodo-ValueType-Label"/><!-- LabelFormBlock -->
</node>
<node id="query" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-Query</label>
<data-transform>
<xml-node-empty-not-allowed/> <!-- mandatory quoi ! -->
</data-transform>
<value-type xsi:type="Combodo-ValueType-OQL"/><!-- OqlFormBlock -->
</node>
<node id="group_by" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-GroupBy</label>
<data-transform>
<xml-node-empty-not-allowed/>
</data-transform>
<value-type xsi:type="Combodo-ValueType-ClassAttributeGroupBy"> <!-- par défaut, il proposera le state attribute de la classe -->
<class>{{query.selected_class}}</class>
</value-type>
</node>
<node id="style" xsi:type="Combodo-Property"> <!-- possible de le cacher, etc.... celui-ci nous met dedans -->
<label>UI:DashletGroupBy:Prop-Style</label>
<data-transform>
<xml-node-empty-defaults-to>bars</xml-node-empty-defaults-to>
</data-transform>
<value-type xsi:type="Combodo-ValueType-Choice">
<values>
<value id="bars">
<label>UI:DashletGroupByBars:Label</label>
</value>
<value id="pie">
<label>UI:DashletGroupByPie:Label</label>
</value>
<value id="table">
<label>UI:DashletGroupByTable:Label</label>
</value>
</values>
</value-type>
</node>
<node id="aggregation_function" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-Function</label>
<data-transform>
<xml-node-empty-not-allowed/> <!-- mandatory quoi ! -->
</data-transform>
<value-type xsi:type="Combodo-ValueType-AggregateFunction"> <!-- par défaut : count -->
<class>{{query.selected_class}}</class> <!-- pour savoir si il y a des attributs additionnables -->
</value-type>
</node>
<node id="aggregation_attribute" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-FunctionAttribute</label>
<relevance-condition>{{aggregation_function.value != 'count'}}</relevance-condition>
<data-transform>
<xml-node-empty-not-allowed/> <!-- mandatory quoi ! -->
</data-transform>
<value-type xsi:type="Combodo-ValueType-ClassAttribute">
<class>{{query.selected_class}}</class>
<category>numeric</category>
</value-type>
</node>
<node id="order_by" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-OrderField</label>
<value-type xsi:type="Combodo-ValueType-ChoiceFromInput">
<values>
<value id="attribute">
<label>{{aggregation_attribute.label}}</label>
</value>
<value id="function">
<label>{{aggregation_function.label}}</label>
</value>
</values>
</value-type>
</node>
<node id="limit" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-Limit</label>
<relevance-condition>{{order_by.value = 'function'}}</relevance-condition>
<value-type xsi:type="Combodo-ValueType-Integer"/>
</node>
<node id="order_direction" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-OrderDirection</label>
<data-transform>
<xml-node-empty-not-allowed/>
</data-transform>
<value-type xsi:type="Combodo-ValueType-Choice">
<values>
<value id="asc">
<label>UI:DashletGroupBy:Order:asc</label>
</value>
<value id="desc">
<label>UI:DashletGroupBy:Order:desc</label>
</value>
</values>
</value-type>
<display-default>desc</display-default>
</node>
</nodes>
</property_tree>
<property_tree id="DashletBadge" xsi:type="Combodo-PropertyTree">
<extends>Dashlet</extends>
<nodes>
<node id="class" xsi:type="Combodo-Property">
<label>UI:DashletBadge:Prop-Class</label>
<value-type xsi:type="Combodo-ValueType-Class">
<categories-csv>bizmodel</categories-csv>
</value-type>
</node>
</nodes>
</property_tree>
<property_tree id="DashletHeaderDynamic" xsi:type="Combodo-PropertyTree">
<extends>Dashlet</extends>
<nodes>
<node id="title" xsi:type="Combodo-Property">
<label>UI:DashletHeaderDynamic:Prop-Title</label>
<value-type xsi:type="Combodo-ValueType-Label">
<not-blank/>
</value-type>
</node>
<node id="icon" xsi:type="Combodo-Property">
<label>UI:DashletHeaderDynamic:Prop-Icon</label>
<value-type xsi:type="Combodo-ValueType-Choice">
<values>
<value id="todo">
<label>ToDo</label>
</value>
</values>
</value-type>
</node>
<node id="subtitle" xsi:type="Combodo-Property">
<label>UI:DashletHeaderDynamic:Prop-Subtitle</label>
<value-type xsi:type="Combodo-ValueType-Label"/>
</node>
<node id="query" xsi:type="Combodo-Property">
<label>UI:DashletHeaderDynamic:Prop-Query</label>
<data-transform>
<xml-node-empty-not-allowed/>
</data-transform>
<value-type xsi:type="Combodo-ValueType-OQL"/>
</node>
<node id="group_by" xsi:type="Combodo-Property">
<label>UI:DashletHeaderDynamic:Prop-GroupBy</label>
<data-transform>
<xml-node-empty-not-allowed/>
</data-transform>
<value-type xsi:type="Combodo-ValueType-ClassAttribute">
<class>{{query.selected_class}}</class>
<category>enum</category>
</value-type>
</node>
<node id="values" xsi:type="Combodo-CollectionOfValues">
<label>UI:DashletHeaderDynamic:Prop-Values</label>
<data-transform>
<xml-format xsi:type="xml-format-csv"/>
</data-transform>
<value-type xsi:type="Combodo-ValueType-ClassAttributeValue">
<class>{{query.selected_class}}</class>
<attribute>{{group_by.value}}</attribute>
</value-type>
</node>
</nodes>
</property_tree>
<property_tree id="DashletHeaderStatic" xsi:type="Combodo-PropertyTree">
<extends>Dashlet</extends>
<nodes>
<node id="title" xsi:type="Combodo-Property">
<label>UI:DashletHeaderStatic:Prop-Title</label>
<value-type xsi:type="Combodo-ValueType-Label"/>
</node>
<node id="icon" xsi:type="Combodo-Property">
<label>UI:DashletHeaderStatic:Prop-Icon</label>
<value-type xsi:type="Combodo-ValueType-Icon"/>
</node>
</nodes>
</property_tree>
<property_tree id="DashletObjectList" xsi:type="Combodo-PropertyTree">
<extends>Dashlet</extends>
<nodes>
<node id="title" xsi:type="Combodo-Property">
<label>UI:DashletObjectList:Prop-Title</label>
<value-type xsi:type="Combodo-ValueType-Label">
</value-type>
</node>
<node id="query" xsi:type="Combodo-Property">
<label>UI:DashletObjectList:Prop-Query</label>
<value-type xsi:type="Combodo-ValueType-OQL"/>
</node>
<node id="menu" xsi:type="Combodo-Property">
<label>UI:DashletObjectList:Prop-Menu</label>
<value-type xsi:type="Combodo-ValueType-Boolean">
<on>
<!-- not so cute, but matches exactly 3.2 implementation of boolean fields -->
<label>UI:UserManagement:ActionAllowed:Yes</label>
<value>true</value>
</on>
<off>
<label>UI:UserManagement:ActionAllowed:No</label>
<value>false</value>
</off>
</value-type>
</node>
</nodes>
</property_tree>
<property_tree id="DashletPlainText" xsi:type="Combodo-PropertyTree">
<extends>Dashlet</extends>
<nodes>
<node id="text" xsi:type="Combodo-Property">
<label>UI:DashletPlainText:Prop-Text</label>
<constraints>
<not_blank/>
</constraints>
<value-type xsi:type="Combodo-ValueType-Text"/>
</node>
</nodes>
</property_tree>
</property_trees>
</meta>
</itop_design>

View File

@@ -1185,169 +1185,5 @@
</property>
</properties>
</attribute_properties_definition>
<property_trees _delta="define" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://www.combodo.com/itop-schema/3.3">
<property_tree id="DashletGroupBy" xsi:type="Combodo-PropertyTree">
<extends>Dashlet</extends>
<nodes>
<node id="title" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-Title</label>
<value-type xsi:type="Combodo-ValueTypeLabel"/><!-- LabelFormBlock -->
</node>
<node id="query" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-Query</label>
<data-transform>
<xml-node-empty-not-allowed/> <!-- mandatory quoi ! -->
</data-transform>
<value-type xsi:type="Combodo-ValueTypeOQL"/><!-- OqlFormBlock -->
</node>
<node id="group_by" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-GroupBy</label>
<data-transform>
<xml-node-empty-not-allowed/>
</data-transform>
<value-type xsi:type="Combodo-ValueTypeClassAttributeGroupBy"> <!-- par défaut, il proposera le state attribute de la classe -->
<class>{{query.selected_class}}</class>
</value-type>
</node>
<node id="style" xsi:type="Combodo-Property"> <!-- possible de le cacher, etc.... celui-ci nous met dedans -->
<label>UI:DashletGroupBy:Prop-Style</label>
<data-transform>
<xml-node-empty-defaults-to>bars</xml-node-empty-defaults-to>
</data-transform>
<value-type xsi:type="Combodo-ValueTypeChoice">
<values>
<value id="bars">
<label>UI:DashletGroupByBars:Label</label>
</value>
<value id="pie">
<label>UI:DashletGroupByPie:Label</label>
</value>
<value id="table">
<label>UI:DashletGroupByTable:Label</label>
</value>
</values>
</value-type>
</node>
<node id="aggregation_function" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-Function</label>
<data-transform>
<xml-node-empty-not-allowed/> <!-- mandatory quoi ! -->
</data-transform>
<value-type xsi:type="Combodo-ValueTypeAggregateFunction"> <!-- par défaut : count -->
<class>{{query.selected_class}}</class> <!-- pour savoir si il y a des attributs additionnables -->
</value-type>
</node>
<node id="aggregation_attribute" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-FunctionAttribute</label>
<relevance-condition>{{aggregation_function.value != 'count'}}</relevance-condition>
<data-transform>
<xml-node-empty-not-allowed/> <!-- mandatory quoi ! -->
</data-transform>
<value-type xsi:type="Combodo-ValueTypeClassAttribute">
<class>{{query.selected_class}}</class>
<category>numeric</category>
</value-type>
</node>
<node id="order_by" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-OrderField</label>
<value-type xsi:type="Combodo-ValueTypeChoiceFromInput">
<values>
<value id="attribute">
<label>{{aggregation_attribute.label}}</label>
</value>
<value id="function">
<label>{{aggregation_function.label}}</label>
</value>
</values>
</value-type>
</node>
<node id="limit" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-Limit</label>
<relevance-condition>{{order_by.value = 'function'}}</relevance-condition>
<value-type xsi:type="Combodo-ValueTypeInteger"/>
</node>
<node id="order_direction" xsi:type="Combodo-Property">
<label>UI:DashletGroupBy:Prop-OrderDirection</label>
<data-transform>
<xml-node-empty-not-allowed/>
</data-transform>
<value-type xsi:type="Combodo-ValueTypeChoice">
<values>
<value id="asc">
<label>UI:DashletGroupBy:Order:asc</label>
</value>
<value id="desc">
<label>UI:DashletGroupBy:Order:desc</label>
</value>
</values>
</value-type>
<display-default>desc</display-default>
</node>
</nodes>
</property_tree>
<property_tree id="DashletBadge" xsi:type="Combodo-PropertyTree">
<extends>Dashlet</extends>
<nodes>
<node id="class" xsi:type="Combodo-Property">
<label>UI:DashletBadge:Prop-Class</label>
<value-type xsi:type="Combodo-ValueTypeClass">
<categories-csv>bizmodel</categories-csv>
</value-type>
</node>
</nodes>
</property_tree>
<property_tree id="DashletHeaderDynamic" xsi:type="Combodo-PropertyTree">
<extends>Dashlet</extends>
<nodes>
<node id="title" xsi:type="Combodo-Property">
<label>UI:DashletHeaderDynamic:Prop-Title</label>
<value-type xsi:type="Combodo-ValueTypeLabel">
<not-blank/>
</value-type>
</node>
<node id="icon" xsi:type="Combodo-Property">
<label>UI:DashletHeaderDynamic:Prop-Icon</label>
<value-type xsi:type="Combodo-ValueTypeChoice">
<values>
<value id="todo">
<label>ToDo</label>
</value>
</values>
</value-type>
</node>
<node id="subtitle" xsi:type="Combodo-Property">
<label>UI:DashletHeaderDynamic:Prop-Subtitle</label>
<value-type xsi:type="Combodo-ValueTypeLabel"/>
</node>
<node id="query" xsi:type="Combodo-Property">
<label>UI:DashletHeaderDynamic:Prop-Query</label>
<data-transform>
<xml-node-empty-not-allowed/>
</data-transform>
<value-type xsi:type="Combodo-ValueTypeOQL"/>
</node>
<node id="group_by" xsi:type="Combodo-Property">
<label>UI:DashletHeaderDynamic:Prop-GroupBy</label>
<data-transform>
<xml-node-empty-not-allowed/>
</data-transform>
<value-type xsi:type="Combodo-ValueTypeClassAttribute">
<class>{{query.selected_class}}</class>
<category>enum</category>
</value-type>
</node>
<node id="values" xsi:type="Combodo-CollectionOfValues">
<label>UI:DashletHeaderDynamic:Prop-Values</label>
<data-transform>
<xml-format xsi:type="xml-format-csv"/>
</data-transform>
<value-type xsi:type="Combodo-ValueTypeClassAttributeValue">
<class>{{query.selected_class}}</class>
<attribute>{{group_by.value}}</attribute>
</value-type>
</node>
</nodes>
</property_tree>
</property_trees>
</meta>
</itop_design>

View File

@@ -553,6 +553,9 @@ return array(
'Combodo\\iTop\\PropertyTree\\AbstractProperty' => $baseDir . '/sources/PropertyTree/AbstractProperty.php',
'Combodo\\iTop\\PropertyTree\\CollectionOfTrees' => $baseDir . '/sources/PropertyTree/CollectionOfTrees.php',
'Combodo\\iTop\\PropertyTree\\CollectionOfValues' => $baseDir . '/sources/PropertyTree/CollectionOfValues.php',
'Combodo\\iTop\\PropertyTree\\CollectionType\\AbstractCollectionType' => $baseDir . '/sources/PropertyTree/CollectionType/AbstractCollectionType.php',
'Combodo\\iTop\\PropertyTree\\CollectionType\\CollectionTypeCollection' => $baseDir . '/sources/PropertyTree/CollectionType/CollectionTypeCollection.php',
'Combodo\\iTop\\PropertyTree\\CollectionType\\CollectionTypeFactory' => $baseDir . '/sources/PropertyTree/CollectionType/CollectionTypeFactory.php',
'Combodo\\iTop\\PropertyTree\\Property' => $baseDir . '/sources/PropertyTree/Property.php',
'Combodo\\iTop\\PropertyTree\\PropertyTree' => $baseDir . '/sources/PropertyTree/PropertyTree.php',
'Combodo\\iTop\\PropertyTree\\PropertyTreeDesign' => $baseDir . '/sources/PropertyTree/PropertyTreeDesign.php',
@@ -560,6 +563,7 @@ return array(
'Combodo\\iTop\\PropertyTree\\PropertyTreeFactory' => $baseDir . '/sources/PropertyTree/PropertyTreeFactory.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\AbstractValueType' => $baseDir . '/sources/PropertyTree/ValueType/AbstractValueType.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeAggregateFunction' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeAggregateFunction.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeBoolean' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeBoolean.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeChoice' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeChoice.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeChoiceFromInput' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeChoiceFromInput.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeClass' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeClass.php',
@@ -567,11 +571,13 @@ return array(
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeClassAttributeGroupBy' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeClassAttributeGroupBy.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeClassAttributeValue' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeClassAttributeValue.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeFactory' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeFactory.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeIcon' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeIcon.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeInteger' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeInteger.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeLabel' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeLabel.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeOQL' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeOQL.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeProfileName' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeProfileName.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeString' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeString.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeText' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeText.php',
'Combodo\\iTop\\Renderer\\BlockRenderer' => $baseDir . '/sources/Renderer/BlockRenderer.php',
'Combodo\\iTop\\Renderer\\Bootstrap\\BsFieldRendererMappings' => $baseDir . '/sources/Renderer/Bootstrap/BsFieldRendererMappings.php',
'Combodo\\iTop\\Renderer\\Bootstrap\\BsFormRenderer' => $baseDir . '/sources/Renderer/Bootstrap/BsFormRenderer.php',

View File

@@ -939,6 +939,9 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Combodo\\iTop\\PropertyTree\\AbstractProperty' => __DIR__ . '/../..' . '/sources/PropertyTree/AbstractProperty.php',
'Combodo\\iTop\\PropertyTree\\CollectionOfTrees' => __DIR__ . '/../..' . '/sources/PropertyTree/CollectionOfTrees.php',
'Combodo\\iTop\\PropertyTree\\CollectionOfValues' => __DIR__ . '/../..' . '/sources/PropertyTree/CollectionOfValues.php',
'Combodo\\iTop\\PropertyTree\\CollectionType\\AbstractCollectionType' => __DIR__ . '/../..' . '/sources/PropertyTree/CollectionType/AbstractCollectionType.php',
'Combodo\\iTop\\PropertyTree\\CollectionType\\CollectionTypeCollection' => __DIR__ . '/../..' . '/sources/PropertyTree/CollectionType/CollectionTypeCollection.php',
'Combodo\\iTop\\PropertyTree\\CollectionType\\CollectionTypeFactory' => __DIR__ . '/../..' . '/sources/PropertyTree/CollectionType/CollectionTypeFactory.php',
'Combodo\\iTop\\PropertyTree\\Property' => __DIR__ . '/../..' . '/sources/PropertyTree/Property.php',
'Combodo\\iTop\\PropertyTree\\PropertyTree' => __DIR__ . '/../..' . '/sources/PropertyTree/PropertyTree.php',
'Combodo\\iTop\\PropertyTree\\PropertyTreeDesign' => __DIR__ . '/../..' . '/sources/PropertyTree/PropertyTreeDesign.php',
@@ -946,6 +949,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Combodo\\iTop\\PropertyTree\\PropertyTreeFactory' => __DIR__ . '/../..' . '/sources/PropertyTree/PropertyTreeFactory.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\AbstractValueType' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/AbstractValueType.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeAggregateFunction' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeAggregateFunction.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeBoolean' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeBoolean.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeChoice' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeChoice.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeChoiceFromInput' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeChoiceFromInput.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeClass' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeClass.php',
@@ -953,11 +957,13 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeClassAttributeGroupBy' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeClassAttributeGroupBy.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeClassAttributeValue' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeClassAttributeValue.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeFactory' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeFactory.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeIcon' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeIcon.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeInteger' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeInteger.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeLabel' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeLabel.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeOQL' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeOQL.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeProfileName' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeProfileName.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeString' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeString.php',
'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeText' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeText.php',
'Combodo\\iTop\\Renderer\\BlockRenderer' => __DIR__ . '/../..' . '/sources/Renderer/BlockRenderer.php',
'Combodo\\iTop\\Renderer\\Bootstrap\\BsFieldRendererMappings' => __DIR__ . '/../..' . '/sources/Renderer/Bootstrap/BsFieldRendererMappings.php',
'Combodo\\iTop\\Renderer\\Bootstrap\\BsFormRenderer' => __DIR__ . '/../..' . '/sources/Renderer/Bootstrap/BsFormRenderer.php',

View File

@@ -11,6 +11,8 @@ use Combodo\iTop\Forms\Block\AbstractFormBlock;
use Combodo\iTop\Forms\Block\AbstractTypeFormBlock;
use Combodo\iTop\Forms\FormType\Base\CollectionFormType;
use Combodo\iTop\Forms\IO\Format\ClassIOFormat;
use Combodo\iTop\Forms\IO\Format\IntegerIOFormat;
use Combodo\iTop\Forms\IO\Format\NumberIOFormat;
use Combodo\iTop\Forms\Register\IORegister;
use Combodo\iTop\Forms\Register\OptionsRegister;
use Combodo\iTop\Forms\Register\RegisterException;
@@ -23,10 +25,8 @@ use Combodo\iTop\Forms\Register\RegisterException;
*/
class CollectionBlock extends AbstractTypeFormBlock
{
// Inputs
public const INPUT_CLASS_NAME = 'class';
private AbstractTypeFormBlock $oPrototypeBlock;
public const OUTPUT_COUNT = 'count';
/** @inheritdoc */
public function GetFormType(): string
@@ -53,7 +53,7 @@ class CollectionBlock extends AbstractTypeFormBlock
protected function RegisterIO(IORegister $oIORegister): void
{
parent::RegisterIO($oIORegister);
$oIORegister->AddInput(self::INPUT_CLASS_NAME, ClassIOFormat::class);
$oIORegister->AddOutput(self::OUTPUT_COUNT, IntegerIOFormat::class);
}
/** @inheritdoc */

View File

@@ -104,7 +104,7 @@ class AttributeChoiceFormBlock extends ChoiceFormBlock
}
break;
case 'group_by':
case 'groupable':
$aForbiddenAttType = [
'AttributeLinkedSet',
'AttributeFriendlyName',

View File

@@ -9,7 +9,6 @@ namespace Combodo\iTop\PropertyTree;
use Combodo\iTop\DesignElement;
use Combodo\iTop\PropertyTree\ValueType\AbstractValueType;
use utils;
/**
* @since 3.3.0

View File

@@ -9,6 +9,10 @@ namespace Combodo\iTop\PropertyTree;
use Combodo\iTop\DesignElement;
use Combodo\iTop\Forms\Block\Base\CollectionBlock;
use Combodo\iTop\PropertyTree\CollectionType\AbstractCollectionType;
use Combodo\iTop\PropertyTree\CollectionType\CollectionTypeFactory;
use Combodo\iTop\PropertyTree\ValueType\AbstractValueType;
use Combodo\iTop\PropertyTree\ValueType\ValueTypeFactory;
/**
* @since 3.3.0
@@ -16,6 +20,7 @@ use Combodo\iTop\Forms\Block\Base\CollectionBlock;
class CollectionOfTrees extends AbstractProperty
{
protected ?string $sButtonLabel;
protected ?AbstractCollectionType $oCollectionType;
/**
* @inheritDoc
@@ -27,6 +32,13 @@ class CollectionOfTrees extends AbstractProperty
$this->sButtonLabel = $oDomNode->GetChildText('button-label');
$oCollectionTypeNode = $oDomNode->GetOptionalElement('collection-type');
if ($oCollectionTypeNode) {
$this->oCollectionType = CollectionTypeFactory::GetInstance()->CreateCollectionTypeFromDomNode($oCollectionTypeNode);
} else {
throw new PropertyTreeException("Node: {$this->sId}, missing collection-type in node specification");
}
// read child properties
foreach ($oDomNode->GetUniqueElement('prototype')->childNodes as $oNode) {
if ($oNode instanceof DesignElement) {

View File

@@ -0,0 +1,34 @@
<?php
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\PropertyTree\CollectionType;
use Combodo\iTop\DesignElement;
use utils;
abstract class AbstractCollectionType
{
abstract public function GetFormBlockClass(): string;
public function InitFromDomNode(DesignElement $oDomNode): void
{
$sBlockNodeClass = $this->GetFormBlockClass();
$oBlockNode = new $sBlockNodeClass('foo');
foreach ($oBlockNode->GetInputs() as $oInput) {
$sInputName = $oInput->GetName();
$this->aInputs[$sInputName] = $oInput;
$sInputValue = $oDomNode->GetChildText($sInputName);
if (utils::IsNotNullOrEmptyString($sInputValue)) {
$this->aInputValues[$sInputName] = $sInputValue;
}
}
foreach ($oBlockNode->GetOutputs() as $oOutput) {
$this->aOutputs[] = $oOutput->GetName();
}
}
}

View File

@@ -0,0 +1,18 @@
<?php
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\PropertyTree\CollectionType;
use Combodo\iTop\Forms\Block\Base\CollectionBlock;
class CollectionTypeCollection extends AbstractCollectionType
{
public function GetFormBlockClass(): string
{
return CollectionBlock::class;
}
}

View File

@@ -0,0 +1,50 @@
<?php
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\PropertyTree\CollectionType;
use Combodo\iTop\DesignElement;
use Combodo\iTop\PropertyTree\PropertyTreeException;
class CollectionTypeFactory
{
private static CollectionTypeFactory $oInstance;
protected function __construct()
{
}
final public static function GetInstance(): CollectionTypeFactory
{
if (!isset(static::$oInstance)) {
static::$oInstance = new CollectionTypeFactory();
}
return static::$oInstance;
}
/**
* @param \Combodo\iTop\DesignElement $oDomNode
*
* @return \Combodo\iTop\PropertyTree\CollectionType\AbstractCollectionType
* @throws \Combodo\iTop\PropertyTree\PropertyTreeException
*/
public function CreateCollectionTypeFromDomNode(DesignElement $oDomNode): AbstractCollectionType
{
$sNodeType = $oDomNode->getAttribute('xsi:type');
if (is_a($sNodeType, AbstractCollectionType::class, true)) {
$oNode = new $sNodeType();
$oNode->InitFromDomNode($oDomNode);
return $oNode;
}
throw new PropertyTreeException('Unknown collection-type node class: '.json_encode($sNodeType));
}
}

View File

@@ -9,6 +9,7 @@ namespace Combodo\iTop\PropertyTree;
use Combodo\iTop\DesignDocument;
use Exception;
use ReturnTypeWillChange;
use utils;
class PropertyTreeDesign extends DesignDocument
@@ -70,7 +71,7 @@ class PropertyTreeDesign extends DesignDocument
* @return int
*/
// Return type union is not supported by PHP 7.4, we can remove the following PHP attribute and add the return type once iTop min PHP version is PHP 8.0+
#[\ReturnTypeWillChange]
#[ReturnTypeWillChange]
public function save($filename, $options = null)
{
$this->documentElement->setAttribute('xsi:noNamespaceSchemaLocation', 'https://www.combodo.com/itop-schema/'.ITOP_DESIGN_LATEST_VERSION);

View File

@@ -7,6 +7,8 @@
namespace Combodo\iTop\PropertyTree;
class PropertyTreeException extends \Exception
use Exception;
class PropertyTreeException extends Exception
{
}

View File

@@ -9,7 +9,6 @@ namespace Combodo\iTop\PropertyTree;
use Combodo\iTop\DesignDocument;
use Combodo\iTop\DesignElement;
use utils;
class PropertyTreeFactory
{

View File

@@ -0,0 +1,19 @@
<?php
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\PropertyTree\ValueType;
use Combodo\iTop\Forms\Block\Base\CheckboxFormBlock;
use Combodo\iTop\PropertyTree\ValueType\AbstractValueType;
class ValueTypeBoolean extends AbstractValueType
{
public function GetFormBlockClass(): string
{
return CheckboxFormBlock::class;
}
}

View File

@@ -0,0 +1,18 @@
<?php
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\PropertyTree\ValueType;
use Combodo\iTop\Forms\Block\Base\ChoiceFormBlock;
class ValueTypeIcon extends AbstractValueType
{
public function GetFormBlockClass(): string
{
return ChoiceFormBlock::class;
}
}

View File

@@ -0,0 +1,18 @@
<?php
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\PropertyTree\ValueType;
use Combodo\iTop\Forms\Block\Base\TextAreaFormBlock;
class ValueTypeText extends AbstractValueType
{
public function GetFormBlockClass(): string
{
return TextAreaFormBlock::class;
}
}

View File

@@ -102,14 +102,19 @@ class_alias(\Combodo\iTop\PropertyTree\Property::class, 'Combodo-Property');
class_alias(\Combodo\iTop\PropertyTree\CollectionOfValues::class, 'Combodo-CollectionOfValues');
class_alias(\Combodo\iTop\PropertyTree\CollectionOfTrees::class, 'Combodo-CollectionOfTrees');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeAggregateFunction::class, 'Combodo-ValueTypeAggregateFunction');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeChoice::class, 'Combodo-ValueTypeChoice');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeChoiceFromInput::class, 'Combodo-ValueTypeChoiceFromInput');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeClass::class, 'Combodo-ValueTypeClass');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeClassAttribute::class, 'Combodo-ValueTypeClassAttribute');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeClassAttributeGroupBy::class, 'Combodo-ValueTypeClassAttributeGroupBy');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeClassAttributeValue::class, 'Combodo-ValueTypeClassAttributeValue');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeInteger::class, 'Combodo-ValueTypeInteger');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeLabel::class, 'Combodo-ValueTypeLabel');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeOQL::class, 'Combodo-ValueTypeOQL');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeString::class, 'Combodo-ValueTypeString');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeAggregateFunction::class, 'Combodo-ValueType-AggregateFunction');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeBoolean::class, 'Combodo-ValueType-Boolean');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeChoice::class, 'Combodo-ValueType-Choice');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeChoiceFromInput::class, 'Combodo-ValueType-ChoiceFromInput');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeClass::class, 'Combodo-ValueType-Class');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeClassAttribute::class, 'Combodo-ValueType-ClassAttribute');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeClassAttributeGroupBy::class, 'Combodo-ValueType-ClassAttributeGroupBy');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeClassAttributeValue::class, 'Combodo-ValueType-ClassAttributeValue');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeIcon::class, 'Combodo-ValueType-Icon');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeInteger::class, 'Combodo-ValueType-Integer');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeLabel::class, 'Combodo-ValueType-Label');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeOQL::class, 'Combodo-ValueType-OQL');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeString::class, 'Combodo-ValueType-String');
class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeText::class, 'Combodo-ValueType-Text');
class_alias(\Combodo\iTop\PropertyTree\CollectionType\CollectionTypeCollection::class, 'Combodo-CollectionType-Collection');

View File

@@ -43,12 +43,12 @@ class FormsCompilerTest extends ItopDataTestCase
<nodes>
<node id="title_property" xsi:type="Combodo-Property">
<label>UI:BasicTest:Prop-Title</label>
<value-type xsi:type="Combodo-ValueTypeLabel">
<value-type xsi:type="Combodo-ValueType-Label">
</value-type>
</node>
<node id="class_property" xsi:type="Combodo-Property">
<label>UI:BasicTest:Prop-Class</label>
<value-type xsi:type="Combodo-ValueTypeClass">
<value-type xsi:type="Combodo-ValueType-Class">
<categories-csv>test</categories-csv>
</value-type>
</node>
@@ -115,12 +115,12 @@ PHP,
<nodes>
<node id="aggregate_function_property" xsi:type="Combodo-Property">
<label>UI:AggregateFunction</label>
<value-type xsi:type="Combodo-ValueTypeAggregateFunction">
<value-type xsi:type="Combodo-ValueType-AggregateFunction">
</value-type>
</node>
<node id="choice_property" xsi:type="Combodo-Property">
<label>UI:Choice</label>
<value-type xsi:type="Combodo-ValueTypeChoice">
<value-type xsi:type="Combodo-ValueType-Choice">
<values>
<value id="value_a">
<label>Label A</label>
@@ -133,48 +133,48 @@ PHP,
</node>
<node id="class_property" xsi:type="Combodo-Property">
<label>UI:Class</label>
<value-type xsi:type="Combodo-ValueTypeClass">
<value-type xsi:type="Combodo-ValueType-Class">
<categories-csv>test</categories-csv>
</value-type>
</node>
<node id="class_attribute_property" xsi:type="Combodo-Property">
<label>UI:ClassAttribute</label>
<value-type xsi:type="Combodo-ValueTypeClassAttribute">
<value-type xsi:type="Combodo-ValueType-ClassAttribute">
</value-type>
</node>
<node id="class_attribute_group_by_property" xsi:type="Combodo-Property">
<label>UI:ClassAttributeGroupBy</label>
<value-type xsi:type="Combodo-ValueTypeClassAttributeGroupBy">
<value-type xsi:type="Combodo-ValueType-ClassAttributeGroupBy">
</value-type>
</node>
<node id="class_attribute_value_property" xsi:type="Combodo-Property">
<label>UI:ClassAttributeValue</label>
<value-type xsi:type="Combodo-ValueTypeClassAttributeValue">
<value-type xsi:type="Combodo-ValueType-ClassAttributeValue">
</value-type>
</node>
<node id="integer_property" xsi:type="Combodo-Property">
<label>UI:Integer</label>
<value-type xsi:type="Combodo-ValueTypeInteger">
<value-type xsi:type="Combodo-ValueType-Integer">
</value-type>
</node>
<node id="label_property" xsi:type="Combodo-Property">
<label>UI:Label</label>
<value-type xsi:type="Combodo-ValueTypeLabel">
<value-type xsi:type="Combodo-ValueType-Label">
</value-type>
</node>
<node id="oql_property" xsi:type="Combodo-Property">
<label>UI:OQL</label>
<value-type xsi:type="Combodo-ValueTypeOQL">
<value-type xsi:type="Combodo-ValueType-OQL">
</value-type>
</node>
<node id="string_property" xsi:type="Combodo-Property">
<label>UI:String</label>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
<node id="choice_from_input" xsi:type="Combodo-Property">
<label>UI:ChoiceFromInput</label>
<value-type xsi:type="Combodo-ValueTypeChoiceFromInput">
<value-type xsi:type="Combodo-ValueType-ChoiceFromInput">
<values>
<value id="value_a">
<label>{{class_attribute_property.label}}</label>
@@ -257,15 +257,16 @@ PHP,
<node id="sub_tree_collection" xsi:type="Combodo-CollectionOfTrees">
<label>UI:SubTree</label>
<button-label>UI:AddSubTree</button-label>
<collection-type xsi:type="Combodo-CollectionType-Collection"/>
<prototype>
<node id="string_property" xsi:type="Combodo-Property">
<label>UI:String</label>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
<node id="integer_property" xsi:type="Combodo-Property">
<label>UI:Integer</label>
<value-type xsi:type="Combodo-ValueTypeInteger">
<value-type xsi:type="Combodo-ValueType-Integer">
</value-type>
</node>
</prototype>
@@ -309,7 +310,7 @@ PHP,
<nodes>
<node id="class_attribute_property" xsi:type="Combodo-Property">
<label>UI:ClassAttribute</label>
<value-type xsi:type="Combodo-ValueTypeClassAttribute">
<value-type xsi:type="Combodo-ValueType-ClassAttribute">
<class>Contact</class>
<invalid-input>Test</invalid-input>
</value-type>
@@ -338,7 +339,7 @@ PHP,
<nodes>
<node id="class_attribute_property" xsi:type="Combodo-Property">
<label>'Class' and "Attribute"</label>
<value-type xsi:type="Combodo-ValueTypeClassAttribute">
<value-type xsi:type="Combodo-ValueType-ClassAttribute">
<class>{{CONCAT("'", '"')}}</class>
<category>'Class' and "Attribute"</category>
<invalid-input>Test</invalid-input>
@@ -373,13 +374,13 @@ PHP,
<nodes>
<node id="class_property" xsi:type="Combodo-Property">
<label>UI:Class</label>
<value-type xsi:type="Combodo-ValueTypeClass">
<value-type xsi:type="Combodo-ValueType-Class">
<categories-csv>test</categories-csv>
</value-type>
</node>
<node id="class_attribute_property" xsi:type="Combodo-Property">
<label>UI:ClassAttribute</label>
<value-type xsi:type="Combodo-ValueTypeClassAttribute">
<value-type xsi:type="Combodo-ValueType-ClassAttribute">
<class>{{class_property.text}}</class>
</value-type>
</node>
@@ -413,13 +414,13 @@ PHP,
<nodes>
<node id="class_property" xsi:type="Combodo-Property">
<label>UI:Class</label>
<value-type xsi:type="Combodo-ValueTypeClass">
<value-type xsi:type="Combodo-ValueType-Class">
<categories-csv>test</categories-csv>
</value-type>
</node>
<node id="class_attribute_property" xsi:type="Combodo-Property">
<label>UI:ClassAttribute</label>
<value-type xsi:type="Combodo-ValueTypeClassAttribute">
<value-type xsi:type="Combodo-ValueType-ClassAttribute">
<class>{{IF(class_property.value = '', 'Person', class_property.value)}}</class>
</value-type>
</node>
@@ -458,13 +459,13 @@ PHP,
<nodes>
<node id="source_property" xsi:type="Combodo-Property">
<label>UI:Source</label>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
<node id="dependant_property" xsi:type="Combodo-Property">
<label>UI:Dependant</label>
<relevance-condition>{{source_property.text != 'count'}}</relevance-condition>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
</nodes>
@@ -500,18 +501,18 @@ PHP,
<nodes>
<node id="source_a_property" xsi:type="Combodo-Property">
<label>UI:Source</label>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
<node id="source_b_property" xsi:type="Combodo-Property">
<label>UI:Source</label>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
<node id="dependant_property" xsi:type="Combodo-Property">
<label>UI:Dependant</label>
<relevance-condition>{{IF(source_a_property.text != '', source_a_property.text, source_b_property.text)}}</relevance-condition>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
</nodes>
@@ -551,7 +552,7 @@ PHP,
<nodes>
<node id="class_property" xsi:type="Combodo-Property">
<label>UI:Class</label>
<value-type xsi:type="Combodo-ValueTypeClass">
<value-type xsi:type="Combodo-ValueType-Class">
<categories-csv>addon/authentication,grant_by_profile,silo</categories-csv>
</value-type>
</node>
@@ -569,9 +570,9 @@ class FormFor__ClassCategory extends Combodo\iTop\Forms\Block\Base\FormBlock
\Dict::S('Class:UserExternal') => 'UserExternal',
\Dict::S('Class:UserLDAP') => 'UserLDAP',
\Dict::S('Class:UserLocal') => 'UserLocal',
\Dict::S('Class:AuditRule') => 'AuditRule',
\Dict::S('Class:AuditCategory') => 'AuditCategory',
\Dict::S('Class:AuditDomain') => 'AuditDomain',
\Dict::S('Class:AuditRule') => 'AuditRule',
\Dict::S('Class:QueryOQL') => 'QueryOQL',
\Dict::S('Class:ActionEmail') => 'ActionEmail',
\Dict::S('Class:TriggerOnPortalUpdate') => 'TriggerOnPortalUpdate',
@@ -651,7 +652,7 @@ PHP,
<node id="dependant_property" xsi:type="Combodo-Property">
<label>UI:Dependant</label>
<relevance-condition>{{source_property.text == 'count'}}</relevance-condition>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
</nodes>
@@ -669,7 +670,7 @@ XML,
<node id="dependant_property" xsi:type="Combodo-Property">
<label>UI:Dependant</label>
<relevance-condition>{{source_property.text = 'count'}}</relevance-condition>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
</nodes>
@@ -686,13 +687,13 @@ XML,
<nodes>
<node id="source_property" xsi:type="Combodo-Property">
<label>UI:Source</label>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
<node id="dependant_property" xsi:type="Combodo-Property">
<label>UI:Dependant</label>
<relevance-condition>{{source_property.text_output != 'count'}}</relevance-condition>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
</nodes>
@@ -709,13 +710,13 @@ XML,
<nodes>
<node id="source_property" xsi:type="Combodo-Property">
<label>UI:Source</label>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
<node id="dependant_property" xsi:type="Combodo-Property">
<label>UI:Dependant</label>
<relevance-condition>{{source_property != 'count'}}</relevance-condition>
<value-type xsi:type="Combodo-ValueTypeString">
<value-type xsi:type="Combodo-ValueType-String">
</value-type>
</node>
</nodes>