From 66e9f4c8c1f81353f30d6096c68f9daf7a60369b Mon Sep 17 00:00:00 2001
From: "S.Listl" <S.Listl@SLISTL.aditosoftware.local>
Date: Thu, 18 Apr 2019 11:31:28 +0200
Subject: [PATCH] Attribute theme tree

---
 .../2019.2/AditoBasic/init_AttributeType.xml  |  2 +-
 .../data/example_attribute/Attribute.xml      | 91 +++++++++++++++++++
 .../data/example_attribute/AttributeUsage.xml | 53 +++++++++++
 .../value/possibleItemsProcess.js             |  4 +-
 .../valueproxy/possibleItemsProcess.js        |  4 +-
 entity/Attribute_entity/Attribute_entity.aod  |  7 ++
 .../attribute_parent_id/valueProcess.js       |  2 +-
 .../attribute_type/displayValueProcess.js     |  5 +-
 .../attribute_type/stateProcess.js            |  5 +-
 .../attribute_type/valueProcess.js            |  2 +
 entity/Attribute_entity/onValidation.js       | 22 +++++
 .../recordcontainers/jdito/contentProcess.js  | 12 +--
 .../recordcontainers/jdito/onInsert.js        |  6 +-
 .../recordcontainers/jdito/onUpdate.js        |  6 +-
 .../_____LANGUAGE_EXTRA.aod                   |  6 ++
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |  7 ++
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     |  7 ++
 .../AttributePreview_view.aod                 |  4 +
 .../AttributeUsageFilter_view.aod             |  8 ++
 .../AttributeUsageMultiEdit_view.aod          |  8 ++
 20 files changed, 240 insertions(+), 21 deletions(-)
 create mode 100644 entity/Attribute_entity/onValidation.js

diff --git a/.liquibase/Data_alias/basic/2019.2/AditoBasic/init_AttributeType.xml b/.liquibase/Data_alias/basic/2019.2/AditoBasic/init_AttributeType.xml
index e8220a7670e..93ebb8ff36a 100644
--- a/.liquibase/Data_alias/basic/2019.2/AditoBasic/init_AttributeType.xml
+++ b/.liquibase/Data_alias/basic/2019.2/AditoBasic/init_AttributeType.xml
@@ -29,7 +29,7 @@
         <insert tableName="AB_KEYWORD_ENTRY">
             <column name="AB_KEYWORD_ENTRYID" value="191d7293-3b3f-4dc7-bbe2-9da1a897f7df"/>
             <column name="KEYID" value="VOID"/>
-            <column name="TITLE" value="Void"/>
+            <column name="TITLE" value="${ATTRIBUTE_VOID}"/>
             <column name="CONTAINER" value="AttributeType"/>
             <column name="SORTING" valueNumeric="9"/>
             <column name="ISACTIVE" valueNumeric="1"/>
diff --git a/.liquibase/Data_alias/basic/2019.2/data/example_attribute/Attribute.xml b/.liquibase/Data_alias/basic/2019.2/data/example_attribute/Attribute.xml
index 9895874d89a..83631681bae 100644
--- a/.liquibase/Data_alias/basic/2019.2/data/example_attribute/Attribute.xml
+++ b/.liquibase/Data_alias/basic/2019.2/data/example_attribute/Attribute.xml
@@ -1,6 +1,68 @@
 <?xml version="1.1" encoding="UTF-8" standalone="no"?>
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
     <changeSet author="s.listl" id="f1b149fb-bd9d-44b7-a334-8f6d77261b95">
+<insert tableName="AB_ATTRIBUTE">
+	<column name="AB_ATTRIBUTEID" value="87d4ff5b-0ab6-4534-be26-76c6ef486072"/>
+	<column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
+	<column name="ATTRIBUTE_NAME" value="Abteilungen"/>
+	<column name="ATTRIBUTE_TYPE" value="GROUP                               "/>
+</insert>
+<insert tableName="AB_ATTRIBUTE">
+	<column name="AB_ATTRIBUTEID" value="29e6ddbf-77fd-4fb2-ae20-fdad9495dbd5"/>
+	<column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
+	<column name="ATTRIBUTE_NAME" value="Geschäftsleitung"/>
+	<column name="ATTRIBUTE_PARENT_ID" value="87d4ff5b-0ab6-4534-be26-76c6ef486072"/>
+	<column name="ATTRIBUTE_TYPE" value="VOID                                "/>
+	<column name="SORTING" valueNumeric="0"/>
+</insert>
+<insert tableName="AB_ATTRIBUTE">
+	<column name="AB_ATTRIBUTEID" value="c9d81109-4406-4205-8b90-e27acf587cf1"/>
+	<column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
+	<column name="ATTRIBUTE_NAME" value="Vertrieb"/>
+	<column name="ATTRIBUTE_PARENT_ID" value="87d4ff5b-0ab6-4534-be26-76c6ef486072"/>
+	<column name="ATTRIBUTE_TYPE" value="VOID                                "/>
+	<column name="SORTING" valueNumeric="1"/>
+</insert>
+<insert tableName="AB_ATTRIBUTE">
+	<column name="AB_ATTRIBUTEID" value="dc1427a9-056a-463a-a07f-f08f820fae0e"/>
+	<column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
+	<column name="ATTRIBUTE_NAME" value="Außendienst"/>
+	<column name="ATTRIBUTE_PARENT_ID" value="c9d81109-4406-4205-8b90-e27acf587cf1"/>
+	<column name="ATTRIBUTE_TYPE" value="VOID                                "/>
+	<column name="SORTING" valueNumeric="0"/>
+</insert>
+<insert tableName="AB_ATTRIBUTE">
+	<column name="AB_ATTRIBUTEID" value="5999ee67-44a4-4ec6-a4c4-6c6d58b8e50a"/>
+	<column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
+	<column name="ATTRIBUTE_NAME" value="Innendienst"/>
+	<column name="ATTRIBUTE_PARENT_ID" value="c9d81109-4406-4205-8b90-e27acf587cf1"/>
+	<column name="ATTRIBUTE_TYPE" value="VOID                                "/>
+	<column name="SORTING" valueNumeric="1"/>
+</insert>
+<insert tableName="AB_ATTRIBUTE">
+	<column name="AB_ATTRIBUTEID" value="93de7e9f-3ecd-45e7-aafe-020ab5f3ee79"/>
+	<column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
+	<column name="ATTRIBUTE_NAME" value="Marketing"/>
+	<column name="ATTRIBUTE_PARENT_ID" value="87d4ff5b-0ab6-4534-be26-76c6ef486072"/>
+	<column name="ATTRIBUTE_TYPE" value="VOID                                "/>
+	<column name="SORTING" valueNumeric="2"/>
+</insert>
+<insert tableName="AB_ATTRIBUTE">
+	<column name="AB_ATTRIBUTEID" value="e47c7fb1-1072-4f03-a275-e4b6331deec1"/>
+	<column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
+	<column name="ATTRIBUTE_NAME" value="IT/Service"/>
+	<column name="ATTRIBUTE_PARENT_ID" value="87d4ff5b-0ab6-4534-be26-76c6ef486072"/>
+	<column name="ATTRIBUTE_TYPE" value="VOID                                "/>
+	<column name="SORTING" valueNumeric="3"/>
+</insert>
+<insert tableName="AB_ATTRIBUTE">
+	<column name="AB_ATTRIBUTEID" value="c133a157-0109-4d88-8343-71db25b12fc5"/>
+	<column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
+	<column name="ATTRIBUTE_NAME" value="Produktion"/>
+	<column name="ATTRIBUTE_PARENT_ID" value="87d4ff5b-0ab6-4534-be26-76c6ef486072"/>
+	<column name="ATTRIBUTE_TYPE" value="VOID                                "/>
+	<column name="SORTING" valueNumeric="4"/>
+</insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="752d7706-ac6e-4b51-a918-4265531794a4"/>
 	<column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
@@ -77,6 +139,7 @@
 	<column name="ATTRIBUTE_NAME" value="0 gering"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="e73ed929-8631-46de-b28f-eb1423abb808"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="6266b41c-fa20-47b9-bd71-5633015d0796"/>
@@ -84,6 +147,7 @@
 	<column name="ATTRIBUTE_NAME" value="gut"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="dc52ede6-2b79-488c-b7bb-48877bd5d198"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="dc52ede6-2b79-488c-b7bb-48877bd5d198"/>
@@ -115,6 +179,7 @@
 	<column name="ATTRIBUTE_NAME" value="A"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="f11f65d0-4352-4f81-85d0-bfd034275e34"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="4fcd8bb8-72fd-48d0-9e64-4c80e5177c36"/>
@@ -153,6 +218,7 @@
 	<column name="ATTRIBUTE_NAME" value="Vollberechnung"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="965823ef-fe63-41f8-9b0b-432f17ac31a7"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="ab545654-1fce-4993-b763-0ec469781302"/>
@@ -231,6 +297,7 @@
 	<column name="ATTRIBUTE_NAME" value="Wein"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="7621696c-40ce-4cf2-92ec-74bc940e49ec"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="07fc6730-6c83-4996-bfd9-41c18765a10a"/>
@@ -262,6 +329,7 @@
 	<column name="ATTRIBUTE_NAME" value="Gerät/Maschine"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="a844a395-e857-447d-b8f8-fa850bbceb82"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="e857f9ee-fb27-4507-8381-46ba0a181cef"/>
@@ -276,6 +344,7 @@
 	<column name="ATTRIBUTE_NAME" value="Fernreisen"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="25e97db1-f796-497d-9842-3efcbb5bebf1"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="4dce5406-9a91-4a92-b55e-d1313c18f9c6"/>
@@ -328,6 +397,7 @@
 	<column name="ATTRIBUTE_NAME" value="Kunde"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="c7d28377-8cb1-4f92-a9ac-ed08041a782b"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="d0a9eb78-6dcf-48e0-ba91-04a3ba104d26"/>
@@ -410,6 +480,7 @@
 	<column name="ATTRIBUTE_NAME" value="ORG"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="9e9568c5-ad8a-4c1e-a6e6-72c9b4a3acf7"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="2318607b-556a-4537-92f0-9870ee9a9201"/>
@@ -433,6 +504,7 @@
 	<column name="ATTRIBUTE_NAME" value="Maschinenbau"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="7e9927a4-41e4-426f-bddd-c3e9ee3b093e"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="e73ed929-8631-46de-b28f-eb1423abb808"/>
@@ -485,6 +557,7 @@
 	<column name="ATTRIBUTE_NAME" value="Ja"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="f310ae37-5ec3-47c6-839b-a92fc8fcd252"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="fd3963bc-8e60-411a-9911-b97eb73e5cf7"/>
@@ -522,6 +595,7 @@
 	<column name="ATTRIBUTE_NAME" value="Interessent"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="fd3963bc-8e60-411a-9911-b97eb73e5cf7"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="4a9625ed-0cd9-445f-ae13-5bdbfdf3f38c"/>
@@ -529,6 +603,7 @@
 	<column name="ATTRIBUTE_NAME" value="Fussball"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="65f0027d-7939-4342-b531-f31f10c3c045"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="66271d11-a275-4141-8f84-86ab2ed3fedf"/>
@@ -608,6 +683,7 @@
 	<column name="ATTRIBUTE_NAME" value="Zahlungsproblem Kunde"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="691452ec-3b9f-43dc-91a2-645a97b775b2"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="2bdb04cb-4cd3-4454-802c-8e2b4a5e2e36"/>
@@ -697,6 +773,7 @@
 	<column name="ATTRIBUTE_NAME" value="Wirtschaft"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="da8e8568-63e0-41d3-a83f-2d8ae4982ba5"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="bb62ae03-be34-4d34-885c-27591c5bf1b4"/>
@@ -758,6 +835,7 @@
 	<column name="ATTRIBUTE_NAME" value="Transportschaden"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="0ecd14d9-837c-47fc-9676-afe71f7e5518"/>
 	<column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
+	<column name="SORTING" valueNumeric="0"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="c0fb9a3a-89a5-46a4-9b95-f48c9481375e"/>
@@ -1615,6 +1693,19 @@
 		<param value="3f119858-9d69-4903-a572-d286be151f73"/>
 	</whereParams>
 </delete>
+<delete tableName="AB_ATTRIBUTE">
+	<where>AB_ATTRIBUTEID in (?, ?, ?, ?, ?, ?, ?, ?)</where>
+	<whereParams>
+		<param value="87d4ff5b-0ab6-4534-be26-76c6ef486072"/>
+		<param value="29e6ddbf-77fd-4fb2-ae20-fdad9495dbd5"/>
+		<param value="c9d81109-4406-4205-8b90-e27acf587cf1"/>
+		<param value="dc1427a9-056a-463a-a07f-f08f820fae0e"/>
+		<param value="5999ee67-44a4-4ec6-a4c4-6c6d58b8e50a"/>
+		<param value="93de7e9f-3ecd-45e7-aafe-020ab5f3ee79"/>
+		<param value="e47c7fb1-1072-4f03-a275-e4b6331deec1"/>
+		<param value="c133a157-0109-4d88-8343-71db25b12fc5"/>
+	</whereParams>
+</delete>
 </rollback>
     </changeSet>
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2019.2/data/example_attribute/AttributeUsage.xml b/.liquibase/Data_alias/basic/2019.2/data/example_attribute/AttributeUsage.xml
index ae2d23abf2d..08505990fec 100644
--- a/.liquibase/Data_alias/basic/2019.2/data/example_attribute/AttributeUsage.xml
+++ b/.liquibase/Data_alias/basic/2019.2/data/example_attribute/AttributeUsage.xml
@@ -1,6 +1,46 @@
 <?xml version="1.1" encoding="UTF-8" standalone="no"?>
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
     <changeSet author="s.listl" id="33bfbf9d-e3b9-4dd0-94e5-f22c74bc3014">
+<insert tableName="AB_ATTRIBUTEUSAGE">
+	<column name="AB_ATTRIBUTEUSAGEID" value="c401df51-da3f-4a99-a645-777dc717f6a8"/>
+	<column name="AB_ATTRIBUTE_ID" value="87d4ff5b-0ab6-4534-be26-76c6ef486072"/>
+	<column name="OBJECT_TYPE" value="Employee"/>
+</insert>	
+<insert tableName="AB_ATTRIBUTEUSAGE">
+	<column name="AB_ATTRIBUTEUSAGEID" value="356de618-4e0d-48e7-a2bc-942bd479cdb8"/>
+	<column name="AB_ATTRIBUTE_ID" value="29e6ddbf-77fd-4fb2-ae20-fdad9495dbd5"/>
+	<column name="OBJECT_TYPE" value="Employee"/>
+</insert>	
+<insert tableName="AB_ATTRIBUTEUSAGE">
+	<column name="AB_ATTRIBUTEUSAGEID" value="4a352aad-f691-4f2c-b9bf-d7e6bdb93ffa"/>
+	<column name="AB_ATTRIBUTE_ID" value="c9d81109-4406-4205-8b90-e27acf587cf1"/>
+	<column name="OBJECT_TYPE" value="Employee"/>
+</insert>	
+<insert tableName="AB_ATTRIBUTEUSAGE">
+	<column name="AB_ATTRIBUTEUSAGEID" value="0f184647-c20d-411d-91e7-b390824a4e43"/>
+	<column name="AB_ATTRIBUTE_ID" value="dc1427a9-056a-463a-a07f-f08f820fae0e"/>
+	<column name="OBJECT_TYPE" value="Employee"/>
+</insert>	
+<insert tableName="AB_ATTRIBUTEUSAGE">
+	<column name="AB_ATTRIBUTEUSAGEID" value="28c7b827-a54a-4848-af8e-c42130d9080e"/>
+	<column name="AB_ATTRIBUTE_ID" value="5999ee67-44a4-4ec6-a4c4-6c6d58b8e50a"/>
+	<column name="OBJECT_TYPE" value="Employee"/>
+</insert>	
+<insert tableName="AB_ATTRIBUTEUSAGE">
+	<column name="AB_ATTRIBUTEUSAGEID" value="a67b3d1a-caca-42da-8fe9-842ad681041c"/>
+	<column name="AB_ATTRIBUTE_ID" value="93de7e9f-3ecd-45e7-aafe-020ab5f3ee79"/>
+	<column name="OBJECT_TYPE" value="Employee"/>
+</insert>	
+<insert tableName="AB_ATTRIBUTEUSAGE">
+	<column name="AB_ATTRIBUTEUSAGEID" value="a2fd0be6-71e7-467f-9e9d-e68154dbccaf"/>
+	<column name="AB_ATTRIBUTE_ID" value="e47c7fb1-1072-4f03-a275-e4b6331deec1"/>
+	<column name="OBJECT_TYPE" value="Employee"/>
+</insert>	
+<insert tableName="AB_ATTRIBUTEUSAGE">
+	<column name="AB_ATTRIBUTEUSAGEID" value="d3d463dc-64c3-4e6a-a6a2-28d03ca08f34"/>
+	<column name="AB_ATTRIBUTE_ID" value="c133a157-0109-4d88-8343-71db25b12fc5"/>
+	<column name="OBJECT_TYPE" value="Employee"/>
+</insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
 	<column name="AB_ATTRIBUTEUSAGEID" value="3234f4e2-0ee7-4782-9b10-c953b7b1be29"/>
 	<column name="AB_ATTRIBUTE_ID" value="97b449a5-d9b4-42ff-b9b0-4f8b27b8a9ec"/>
@@ -769,6 +809,19 @@
 		<param value="04278ec-6e1b-42d7-bbcc-00fd4a1b1db7"/>
 	</whereParams>
 </delete>
+<delete tableName="AB_ATTRIBUTEUSAGE">
+	<where>AB_ATTRIBUTEUSAGEID in (?, ?, ?, ?, ?, ?, ?, ?)</where>
+	<whereParams>
+		<param value="c401df51-da3f-4a99-a645-777dc717f6a8"/>
+		<param value="356de618-4e0d-48e7-a2bc-942bd479cdb8"/>
+		<param value="4a352aad-f691-4f2c-b9bf-d7e6bdb93ffa"/>
+		<param value="0f184647-c20d-411d-91e7-b390824a4e43"/>
+		<param value="28c7b827-a54a-4848-af8e-c42130d9080e"/>
+		<param value="a67b3d1a-caca-42da-8fe9-842ad681041c"/>
+		<param value="a2fd0be6-71e7-467f-9e9d-e68154dbccaf"/>
+		<param value="d3d463dc-64c3-4e6a-a6a2-28d03ca08f34"/>
+	</whereParams>
+</delete>
 </rollback>
     </changeSet>
 </databaseChangeLog>
diff --git a/entity/AttributeRelationTree_entity/entityfields/value/possibleItemsProcess.js b/entity/AttributeRelationTree_entity/entityfields/value/possibleItemsProcess.js
index 4a079812c98..26adcbcda38 100644
--- a/entity/AttributeRelationTree_entity/entityfields/value/possibleItemsProcess.js
+++ b/entity/AttributeRelationTree_entity/entityfields/value/possibleItemsProcess.js
@@ -14,7 +14,7 @@ if (attrType == $AttributeTypes.COMBO)
         .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_ACTIVE", "1")
         .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", attributeId)
         .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE)
-        .buildSql("select AB_ATTRIBUTEID, ATTRIBUTE_NAME from AB_ATTRIBUTE", "1=2", "order by ATTRIBUTE_NAME");
+        .buildSql("select AB_ATTRIBUTEID, ATTRIBUTE_NAME from AB_ATTRIBUTE", "1=2", "order by SORTING asc");
     var valueList = db.table(valueSql);
     
     result.object(valueList);
@@ -37,7 +37,7 @@ else if (attrType == $AttributeTypes.KEYWORD)
     
     var sql = SqlCondition.begin()
         .andPrepare("AB_KEYWORD_ENTRY.CONTAINER", db.cell(attrKeywordSelect))
-        .buildSql("select AB_KEYWORD_ENTRY.KEYID, AB_KEYWORD_ENTRY.TITLE from AB_KEYWORD_ENTRY");
+        .buildSql("select AB_KEYWORD_ENTRY.KEYID, AB_KEYWORD_ENTRY.TITLE from AB_KEYWORD_ENTRY", "1=2", "order by SORTING asc");
     var keywords = db.table(sql).map(function (row)
     {
         return [row[0], translate.text(row[1])];
diff --git a/entity/AttributeRelation_entity/entityfields/valueproxy/possibleItemsProcess.js b/entity/AttributeRelation_entity/entityfields/valueproxy/possibleItemsProcess.js
index 4f20aef0cd6..104cdfb6913 100644
--- a/entity/AttributeRelation_entity/entityfields/valueproxy/possibleItemsProcess.js
+++ b/entity/AttributeRelation_entity/entityfields/valueproxy/possibleItemsProcess.js
@@ -14,7 +14,7 @@ if (attrType == $AttributeTypes.COMBO)
         .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_ACTIVE", "1")
         .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", attributeId)
         .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE)
-        .buildSql("select AB_ATTRIBUTEID, ATTRIBUTE_NAME from AB_ATTRIBUTE", "1=2", "order by ATTRIBUTE_NAME");
+        .buildSql("select AB_ATTRIBUTEID, ATTRIBUTE_NAME from AB_ATTRIBUTE", "1=2", "order by SORTING asc");
     var valueList = db.table(valueSql);
     result.object(valueList);
 }
@@ -36,7 +36,7 @@ else if (attrType == $AttributeTypes.KEYWORD)
     
     var sql = SqlCondition.begin()
         .andPrepare("AB_KEYWORD_ENTRY.CONTAINER", db.cell(attrKeywordSelect))
-        .buildSql("select AB_KEYWORD_ENTRY.KEYID, AB_KEYWORD_ENTRY.TITLE from AB_KEYWORD_ENTRY");
+        .buildSql("select AB_KEYWORD_ENTRY.KEYID, AB_KEYWORD_ENTRY.TITLE from AB_KEYWORD_ENTRY", "1=2", "order by SORTING asc");
     var keywords = db.table(sql).map(function (row)
     {
         return [row[0], translate.text(row[1])];
diff --git a/entity/Attribute_entity/Attribute_entity.aod b/entity/Attribute_entity/Attribute_entity.aod
index abf185d2812..8eeb24834a8 100644
--- a/entity/Attribute_entity/Attribute_entity.aod
+++ b/entity/Attribute_entity/Attribute_entity.aod
@@ -5,6 +5,7 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Attribute_entity/documentation.adoc</documentation>
   <afterUiInit>%aditoprj%/entity/Attribute_entity/afterUiInit.js</afterUiInit>
+  <onValidation>%aditoprj%/entity/Attribute_entity/onValidation.js</onValidation>
   <iconId>VAADIN:TAG</iconId>
   <titleProcess>%aditoprj%/entity/Attribute_entity/titleProcess.js</titleProcess>
   <recordContainer>jdito</recordContainer>
@@ -282,6 +283,11 @@
       <name>UID</name>
       <searchable v="false" />
     </entityField>
+    <entityField>
+      <name>SORTING</name>
+      <title>Sorting</title>
+      <searchable v="false" />
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -299,6 +305,7 @@
         <element>ATTRIBUTE_TYPE.value</element>
         <element>ATTRIBUTE_TYPE.displayValue</element>
         <element>KEYWORD_CONTAINER.value</element>
+        <element>SORTING.value</element>
       </recordFields>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/Attribute_entity/entityfields/attribute_parent_id/valueProcess.js b/entity/Attribute_entity/entityfields/attribute_parent_id/valueProcess.js
index b0787c12933..6f4ceebb844 100644
--- a/entity/Attribute_entity/entityfields/attribute_parent_id/valueProcess.js
+++ b/entity/Attribute_entity/entityfields/attribute_parent_id/valueProcess.js
@@ -2,5 +2,5 @@ import("system.neon");
 import("system.result");
 import("system.vars");
 
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.AttrParentId_param") && vars.get("$param.AttrParentId_param"))
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.AttrParentId_param") && vars.get("$param.AttrParentId_param") && !vars.get("$this.value"))
     result.string(vars.get("$param.AttrParentId_param"));
\ No newline at end of file
diff --git a/entity/Attribute_entity/entityfields/attribute_type/displayValueProcess.js b/entity/Attribute_entity/entityfields/attribute_type/displayValueProcess.js
index 84b0b0897c6..8c164c65749 100644
--- a/entity/Attribute_entity/entityfields/attribute_type/displayValueProcess.js
+++ b/entity/Attribute_entity/entityfields/attribute_type/displayValueProcess.js
@@ -8,7 +8,6 @@ import("KeywordRegistry_basic");
 
 if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$field.ATTRIBUTE_PARENT_ID") != "")
 {
-    var type = AttributeUtil.getAttributeType(vars.get("$field.ATTRIBUTE_PARENT_ID"));
-    if (type == $AttributeTypes.COMBO)
-        result.string(KeywordUtils.getViewValue($KeywordRegistry.attributeType(), $AttributeTypes.COMBOVALUE));
+    var type = vars.get("$field.ATTRIBUTE_TYPE").trim();
+    result.string(KeywordUtils.getViewValue($KeywordRegistry.attributeType(), type));
 }
\ No newline at end of file
diff --git a/entity/Attribute_entity/entityfields/attribute_type/stateProcess.js b/entity/Attribute_entity/entityfields/attribute_type/stateProcess.js
index 20869c2a59b..184ef602b20 100644
--- a/entity/Attribute_entity/entityfields/attribute_type/stateProcess.js
+++ b/entity/Attribute_entity/entityfields/attribute_type/stateProcess.js
@@ -6,8 +6,9 @@ import("Attribute_lib");
 import("Sql_lib");
 
 var type = vars.get("$field.ATTRIBUTE_TYPE").trim();
-var state = neon.COMPONENTSTATE_AUTO
-if (type == $AttributeTypes.COMBOVALUE)
+var parentType = AttributeUtil.getAttributeType(vars.get("$field.ATTRIBUTE_PARENT_ID"));
+var state = neon.COMPONENTSTATE_EDITABLE;
+if (parentType == $AttributeTypes.COMBO || parentType == $AttributeTypes.VOID)
 {
     state = neon.COMPONENTSTATE_READONLY;
 }
diff --git a/entity/Attribute_entity/entityfields/attribute_type/valueProcess.js b/entity/Attribute_entity/entityfields/attribute_type/valueProcess.js
index 28020da1dda..dce209f82e8 100644
--- a/entity/Attribute_entity/entityfields/attribute_type/valueProcess.js
+++ b/entity/Attribute_entity/entityfields/attribute_type/valueProcess.js
@@ -9,4 +9,6 @@ if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$field.
     var type = AttributeUtil.getAttributeType(vars.get("$field.ATTRIBUTE_PARENT_ID"));
     if (type == $AttributeTypes.COMBO)
         result.string($AttributeTypes.COMBOVALUE);
+    else if (type == $AttributeTypes.VOID)
+        result.string($AttributeTypes.VOID);
 }
\ No newline at end of file
diff --git a/entity/Attribute_entity/onValidation.js b/entity/Attribute_entity/onValidation.js
new file mode 100644
index 00000000000..b29f26919c0
--- /dev/null
+++ b/entity/Attribute_entity/onValidation.js
@@ -0,0 +1,22 @@
+import("system.translate");
+import("system.db");
+import("system.vars");
+import("system.text");
+import("system.neon");
+import("Sql_lib");
+
+//TODO: this should no happen in onValidation; waiting for #1032668
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    var parentId = vars.get("$field.ATTRIBUTE_PARENT_ID");
+    if (parentId)
+    {
+        var cond = SqlCondition.begin().andPrepare("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", parentId);
+        var maskingHelper = new SqlMaskingUtils();
+        var newCodeNumber = db.cell(cond.buildSql("select " + maskingHelper.max("AB_ATTRIBUTE.SORTING") + " from AB_ATTRIBUTE", "1 = 2"));
+        newCodeNumber = Number(newCodeNumber);//if no number exists till no, start value will be 1 (due to: ++0)
+        if (isNaN(newCodeNumber))
+            throw new TypeError(translate.text("The code number is not a valid number."));
+        neon.setFieldValue("$field.SORTING", ++newCodeNumber);
+    }
+}
\ No newline at end of file
diff --git a/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js b/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js
index 0eb7f5b41e0..db6a619a464 100644
--- a/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js
@@ -11,7 +11,9 @@ import("Attribute_lib");
 var sqlSelect = "select AB_ATTRIBUTEID, ATTRIBUTE_ACTIVE, " 
     + "ATTRIBUTE_NAME, ATTRIBUTE_PARENT_ID, ATTRIBUTE_TYPE, " 
     + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.attributeType(), "ATTRIBUTE_TYPE")
-    + ", KEYWORD_CONTAINER from AB_ATTRIBUTE";
+    + ", KEYWORD_CONTAINER, SORTING from AB_ATTRIBUTE";
+
+var sqlOrder = " order by ATTRIBUTE_PARENT_ID asc, SORTING asc";
 
 var condition = new SqlCondition();
 
@@ -46,10 +48,8 @@ else if (objectType)  //if there's an objectType, it comes from the AttributeRel
 } 
 else 
 {
-    var type = vars.exists("$param.AttrParentType_param") && vars.get("$param.AttrParentType_param");
-    if (type == $AttributeTypes.COMBO)
-        condition.andPrepareVars("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", "$param.AttrParentId_param");        
-    else if (type == $AttributeTypes.GROUP)
+    var type = vars.exists("$param.AttrParentType_param") && vars.get("$param.AttrParentType_param");   
+    if (AttributeTypeUtil.isGroupType(type))
     {
         var parentId = vars.exists("$param.AttrParentId_param") && vars.get("$param.AttrParentId_param");
         if (parentId)
@@ -66,7 +66,7 @@ if (vars.exists("$local.filter") && vars.get("$local.filter"))
     condition.andSqlCondition((JditoFilterUtils.getSqlCondition(filter, "AB_ATTRIBUTE")));
 }
 
-var attributes = db.table(condition.buildSql(sqlSelect, "1=1"));
+var attributes = db.table(condition.buildSql(sqlSelect, "1=1", sqlOrder));
 
 if (attributes.length > 1)
     attributes = _sortArrayForTree(attributes);
diff --git a/entity/Attribute_entity/recordcontainers/jdito/onInsert.js b/entity/Attribute_entity/recordcontainers/jdito/onInsert.js
index 0b179785ecd..4562756bb00 100644
--- a/entity/Attribute_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/Attribute_entity/recordcontainers/jdito/onInsert.js
@@ -7,7 +7,8 @@ var columns = [
     "ATTRIBUTE_NAME",
     "ATTRIBUTE_PARENT_ID",
     "ATTRIBUTE_TYPE",
-    "KEYWORD_CONTAINER"
+    "KEYWORD_CONTAINER",
+    "SORTING"
 ];
 var values = [
     vars.get("$field.UID"),
@@ -15,7 +16,8 @@ var values = [
     vars.get("$field.ATTRIBUTE_NAME"),
     vars.get("$field.ATTRIBUTE_PARENT_ID"),
     vars.get("$field.ATTRIBUTE_TYPE"),
-    vars.get("$field.KEYWORD_CONTAINER")
+    vars.get("$field.KEYWORD_CONTAINER"),
+    vars.get("$field.SORTING")
 ];
 
 db.insertData("AB_ATTRIBUTE", columns, null, values);
\ No newline at end of file
diff --git a/entity/Attribute_entity/recordcontainers/jdito/onUpdate.js b/entity/Attribute_entity/recordcontainers/jdito/onUpdate.js
index 152518a6dc3..232f0ee995b 100644
--- a/entity/Attribute_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/Attribute_entity/recordcontainers/jdito/onUpdate.js
@@ -7,14 +7,16 @@ var columns = [
     "ATTRIBUTE_NAME",
     "ATTRIBUTE_PARENT_ID",
     "ATTRIBUTE_TYPE",
-    "KEYWORD_CONTAINER"
+    "KEYWORD_CONTAINER",
+    "SORTING"
 ];
 var values = [
     vars.get("$field.ATTRIBUTE_ACTIVE"),
     vars.get("$field.ATTRIBUTE_NAME"),
     vars.get("$field.ATTRIBUTE_PARENT_ID"),
     vars.get("$field.ATTRIBUTE_TYPE"),
-    vars.get("$field.KEYWORD_CONTAINER")
+    vars.get("$field.KEYWORD_CONTAINER"),
+    vars.get("$field.SORTING")
 ];
 
 var condition = SqlCondition.begin()
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index fd1ca6e258c..e68b7b423c2 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -2913,6 +2913,12 @@
     <entry>
       <key>${SQL_LIB_UNDEFINED_VALUE} field: %0</key>
     </entry>
+    <entry>
+      <key>My tasks</key>
+    </entry>
+    <entry>
+      <key>${ATTRIBUTE_VOID}</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 6d5b8bac925..008eeb3a3de 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -50,6 +50,10 @@
       <key>Salesproject phases</key>
       <value>Vertriebsprojektphasen</value>
     </entry>
+    <entry>
+      <key>${ATTRIBUTE_VOID}</key>
+      <value>Kein Wert</value>
+    </entry>
     <entry>
       <key>Turnover</key>
       <value>Umsatz</value>
@@ -3731,6 +3735,9 @@
       <key>${SQL_LIB_UNDEFINED_VALUE} field: %0</key>
       <value>Der Wert für das Feld %0 ist undefined.</value>
     </entry>
+    <entry>
+      <key>MyTasks</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index da13cfb7dfd..e2a9a226e1d 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -2945,6 +2945,13 @@
       <key>${SQL_LIB_UNDEFINED_VALUE} field: %0</key>
       <value>The value for the field %0 is undefined.</value>
     </entry>
+    <entry>
+      <key>My tasks</key>
+    </entry>
+    <entry>
+      <key>${ATTRIBUTE_VOID}</key>
+      <value>Void</value>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonView/AttributePreview_view/AttributePreview_view.aod b/neonView/AttributePreview_view/AttributePreview_view.aod
index 7a86c4599a0..5a8e785eb74 100644
--- a/neonView/AttributePreview_view/AttributePreview_view.aod
+++ b/neonView/AttributePreview_view/AttributePreview_view.aod
@@ -25,6 +25,10 @@
           <name>70953962-9472-484b-ac95-567d2249f42e</name>
           <entityField>ATTRIBUTE_ACTIVE</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>1b1cfdcb-fcab-4ca9-b0e0-b69fe88b65f0</name>
+          <entityField>SORTING</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <genericViewTemplate>
diff --git a/neonView/AttributeUsageFilter_view/AttributeUsageFilter_view.aod b/neonView/AttributeUsageFilter_view/AttributeUsageFilter_view.aod
index 87500bc6ffd..be89cedfa70 100644
--- a/neonView/AttributeUsageFilter_view/AttributeUsageFilter_view.aod
+++ b/neonView/AttributeUsageFilter_view/AttributeUsageFilter_view.aod
@@ -18,6 +18,14 @@
           <name>ba8d5468-4e59-4ab8-8174-afcca1ae0d9e</name>
           <entityField>OBJECT_TYPE</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>22924cb1-25df-4c5c-92ec-2e51cb5b330b</name>
+          <entityField>MIN_COUNT</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>ee879f6d-dc3a-4e85-9711-e470c0eb9cc4</name>
+          <entityField>MAX_COUNT</entityField>
+        </neonTableColumn>
       </columns>
     </tableViewTemplate>
   </children>
diff --git a/neonView/AttributeUsageMultiEdit_view/AttributeUsageMultiEdit_view.aod b/neonView/AttributeUsageMultiEdit_view/AttributeUsageMultiEdit_view.aod
index 0ecf44f96e8..ce7b20e704a 100644
--- a/neonView/AttributeUsageMultiEdit_view/AttributeUsageMultiEdit_view.aod
+++ b/neonView/AttributeUsageMultiEdit_view/AttributeUsageMultiEdit_view.aod
@@ -17,6 +17,14 @@
           <entityField>OBJECT_TYPE</entityField>
           <width v="75" />
         </neonTableColumn>
+        <neonTableColumn>
+          <name>4eb1b225-5856-4585-b6dd-401d1334d8ba</name>
+          <entityField>MIN_COUNT</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>16bd5079-6496-4c5f-a821-ae145e1bc981</name>
+          <entityField>MAX_COUNT</entityField>
+        </neonTableColumn>
       </columns>
     </genericMultipleViewTemplate>
   </children>
-- 
GitLab