From 49642b8281d79bd9769a546801dcde7256d31be2 Mon Sep 17 00:00:00 2001
From: Johannes Hoermann <j.hoermann@adito.de>
Date: Tue, 9 Apr 2019 15:45:18 +0200
Subject: [PATCH] Object relation fixes & administration

---
 .../_____SYSTEM_APPLICATION_NEON.aod          |   1 +
 entity/Context_entity/Context_entity.aod      |   8 ++
 .../ObjectRelationType_entity.aod             |  91 ++++++++++++++-
 .../dest_object_type/displayValueProcess.js   |  10 ++
 .../displayValueProcess.js                    |   5 +
 .../hierarchy/possibleItemsProcess.js         |   7 ++
 .../entityfields/hierarchy/valueProcess.js    |   8 ++
 .../onlyfirstside_param/valueProcess.js       |   3 +
 .../onlyfirstside_param/valueProcess.js       |   2 +
 .../removeusage/onActionProcess.js            |  14 +++
 .../source_object_type/displayValueProcess.js |  10 ++
 .../displayValueProcess.js                    |   5 +
 .../recordcontainers/jdito/contentProcess.js  |  10 +-
 .../recordcontainers/jdito/onDelete.js        |  23 ++++
 .../recordcontainers/jdito/onInsert.js        |  43 +++++++
 .../recordcontainers/jdito/onUpdate.js        |  88 ++++++++++++++
 .../ObjectRelationType_entity/titleProcess.js |   9 +-
 .../ObjectTree_entity/ObjectTree_entity.aod   |   7 +-
 .../alter/children/edit/stateProcess.js       |  30 -----
 .../recordcontainers/jdito/contentProcess.js  |  13 +--
 .../recordcontainers/jdito/contentProcess.js  |   4 +
 .../Organisation_entity.aod                   |   2 +-
 entity/Person_entity/Person_entity.aod        |   2 +-
 .../_____LANGUAGE_EXTRA.aod                   |  51 ++++++++
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     | 103 +++++++++++++++++
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     |  48 ++++++++
 .../ObjectRelationType/ObjectRelationType.aod |  18 +++
 .../ObjectRelationTypeEdit_view.aod           |  39 +++++++
 .../ObjectRelationTypeFilter_view.aod         |  38 ++++++
 .../ObjectRelationTypePreview_view.aod        |  17 +++
 .../OrganisationMain_view.aod                 |   5 -
 neonView/PersonMain_view/PersonMain_view.aod  |   5 -
 process/ObjectRelation_lib/process.js         | 109 +++++++++---------
 33 files changed, 713 insertions(+), 115 deletions(-)
 create mode 100644 entity/ObjectRelationType_entity/entityfields/dest_object_type/displayValueProcess.js
 create mode 100644 entity/ObjectRelationType_entity/entityfields/dest_relation_title/displayValueProcess.js
 create mode 100644 entity/ObjectRelationType_entity/entityfields/hierarchy/possibleItemsProcess.js
 create mode 100644 entity/ObjectRelationType_entity/entityfields/hierarchy/valueProcess.js
 create mode 100644 entity/ObjectRelationType_entity/entityfields/objectrelationtypes/children/onlyfirstside_param/valueProcess.js
 create mode 100644 entity/ObjectRelationType_entity/entityfields/onlyfirstside_param/valueProcess.js
 create mode 100644 entity/ObjectRelationType_entity/entityfields/removeusage/onActionProcess.js
 create mode 100644 entity/ObjectRelationType_entity/entityfields/source_object_type/displayValueProcess.js
 create mode 100644 entity/ObjectRelationType_entity/entityfields/source_relation_title/displayValueProcess.js
 create mode 100644 entity/ObjectRelationType_entity/recordcontainers/jdito/onDelete.js
 create mode 100644 entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js
 create mode 100644 entity/ObjectRelationType_entity/recordcontainers/jdito/onUpdate.js
 delete mode 100644 entity/ObjectTree_entity/entityfields/alter/children/edit/stateProcess.js
 create mode 100644 neonView/ObjectRelationTypeEdit_view/ObjectRelationTypeEdit_view.aod
 create mode 100644 neonView/ObjectRelationTypeFilter_view/ObjectRelationTypeFilter_view.aod
 create mode 100644 neonView/ObjectRelationTypePreview_view/ObjectRelationTypePreview_view.aod

diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index 74af7250a3..2d715c6e5a 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -33,6 +33,7 @@
         <node name="KeywordEntry" kind="10077" />
         <node name="KeywordAttribute" kind="10077" />
         <node name="Employee" kind="10077" />
+        <node name="ObjectRelationType" kind="10077" />
         <node name="INTERNAL_ADMINISTRATOR" kind="159" />
       </node>
     </node>
diff --git a/entity/Context_entity/Context_entity.aod b/entity/Context_entity/Context_entity.aod
index 6b92f784aa..df505cf735 100644
--- a/entity/Context_entity/Context_entity.aod
+++ b/entity/Context_entity/Context_entity.aod
@@ -41,6 +41,14 @@
     <entityProvider>
       <name>Context</name>
       <fieldType>DEPENDENCY_IN</fieldType>
+      <dependencies>
+        <entityDependency>
+          <name>dab09827-2eeb-403d-a070-ba805d2640ee</name>
+          <entityName>ObjectRelationType_entity</entityName>
+          <fieldName>Contexts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
       <children>
         <entityParameter>
           <name>excludeContexts_param</name>
diff --git a/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod b/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod
index 7569f2f522..ad564c0c73 100644
--- a/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod
+++ b/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod
@@ -2,6 +2,7 @@
 <entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.1">
   <name>ObjectRelationType_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:SPLIT</icon>
   <titleProcess>%aditoprj%/entity/ObjectRelationType_entity/titleProcess.js</titleProcess>
   <recordContainer>jdito</recordContainer>
   <entityFields>
@@ -21,7 +22,10 @@
       <valueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/uid/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
-      <name>RELATION_TITLE</name>
+      <name>SOURCE_RELATION_TITLE</name>
+      <title>Relation type 1</title>
+      <mandatory v="true" />
+      <displayValueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/source_relation_title/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityParameter>
       <name>SourceObjectType_param</name>
@@ -46,17 +50,100 @@
           <expose v="true" />
           <triggerRecalculation v="true" />
         </entityParameter>
+        <entityParameter>
+          <name>OnlyFirstSide_param</name>
+          <valueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/objectrelationtypes/children/onlyfirstside_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
       </children>
     </entityProvider>
+    <entityParameter>
+      <name>OnlyFirstSide_param</name>
+      <valueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/onlyfirstside_param/valueProcess.js</valueProcess>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityField>
+      <name>RELATION_TYPE</name>
+    </entityField>
+    <entityField>
+      <name>DIRECTION</name>
+    </entityField>
+    <entityField>
+      <name>HIERARCHY</name>
+      <title>Hierarchy</title>
+      <contentType>BOOLEAN</contentType>
+      <possibleItemsProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/hierarchy/possibleItemsProcess.js</possibleItemsProcess>
+      <valueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/hierarchy/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DEST_OBJECT_TYPE</name>
+      <title>Context 2</title>
+      <consumer>Contexts</consumer>
+      <displayValueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/dest_object_type/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>SOURCE_OBJECT_TYPE</name>
+      <title>Context 1</title>
+      <consumer>Contexts</consumer>
+      <mandatory v="true" />
+      <displayValueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/source_object_type/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>AB_OBJECTRELATIONTYPE1</name>
+    </entityField>
+    <entityField>
+      <name>AB_OBJECTRELATIONTYPE2</name>
+    </entityField>
+    <entityField>
+      <name>SIDE</name>
+    </entityField>
+    <entityField>
+      <name>DEST_OBJECTRELATIONTYPEID</name>
+    </entityField>
+    <entityField>
+      <name>DEST_RELATION_TITLE</name>
+      <title>Relation type 2</title>
+      <displayValueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/dest_relation_title/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>Contexts</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>Context</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityActionField>
+      <name>removeUsage</name>
+      <fieldType>ACTION</fieldType>
+      <title>Delete all usage</title>
+      <onActionProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/removeusage/onActionProcess.js</onActionProcess>
+      <iconId>NEON:TRASH</iconId>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
       <contentProcess>%aditoprj%/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <onUpdate>%aditoprj%/entity/ObjectRelationType_entity/recordcontainers/jdito/onUpdate.js</onUpdate>
+      <onDelete>%aditoprj%/entity/ObjectRelationType_entity/recordcontainers/jdito/onDelete.js</onDelete>
       <recordFields>
         <element>UID.value</element>
-        <element>RELATION_TITLE.value</element>
+        <element>SOURCE_RELATION_TITLE.value</element>
+        <element>RELATION_TYPE.value</element>
+        <element>DIRECTION.value</element>
+        <element>HIERARCHY.value</element>
+        <element>DEST_OBJECT_TYPE.value</element>
+        <element>SOURCE_OBJECT_TYPE.value</element>
+        <element>AB_OBJECTRELATIONTYPE1.value</element>
+        <element>AB_OBJECTRELATIONTYPE2.value</element>
+        <element>SIDE.value</element>
+        <element>DEST_OBJECTRELATIONTYPEID.value</element>
+        <element>DEST_RELATION_TITLE.value</element>
       </recordFields>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/ObjectRelationType_entity/entityfields/dest_object_type/displayValueProcess.js b/entity/ObjectRelationType_entity/entityfields/dest_object_type/displayValueProcess.js
new file mode 100644
index 0000000000..4cee3b90ca
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/dest_object_type/displayValueProcess.js
@@ -0,0 +1,10 @@
+import("Context_lib");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.DEST_OBJECT_TYPE")) {
+    result.string("");
+} else if (vars.exists("$field.DEST_OBJECT_TYPE") && vars.get("$field.DEST_OBJECT_TYPE")) {
+    result.string(ContextUtils.getContext(vars.get("$field.DEST_OBJECT_TYPE"))[2]);
+}
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/entityfields/dest_relation_title/displayValueProcess.js b/entity/ObjectRelationType_entity/entityfields/dest_relation_title/displayValueProcess.js
new file mode 100644
index 0000000000..6aecb834c5
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/dest_relation_title/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("system.translate");
+
+result.string(translate.text(vars.get("$field.DEST_RELATION_TITLE")));
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/entityfields/hierarchy/possibleItemsProcess.js b/entity/ObjectRelationType_entity/entityfields/hierarchy/possibleItemsProcess.js
new file mode 100644
index 0000000000..b88d5392d1
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/hierarchy/possibleItemsProcess.js
@@ -0,0 +1,7 @@
+import("system.translate");
+import("system.result");
+
+result.object([
+     ["1", translate.text("Yes")]
+    ,["0", translate.text("No")]
+]);
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/entityfields/hierarchy/valueProcess.js b/entity/ObjectRelationType_entity/entityfields/hierarchy/valueProcess.js
new file mode 100644
index 0000000000..b3028ee4f3
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/hierarchy/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    result.string("0")
+}
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/entityfields/objectrelationtypes/children/onlyfirstside_param/valueProcess.js b/entity/ObjectRelationType_entity/entityfields/objectrelationtypes/children/onlyfirstside_param/valueProcess.js
new file mode 100644
index 0000000000..755662df16
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/objectrelationtypes/children/onlyfirstside_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("0")
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/entityfields/onlyfirstside_param/valueProcess.js b/entity/ObjectRelationType_entity/entityfields/onlyfirstside_param/valueProcess.js
new file mode 100644
index 0000000000..985b9f8612
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/onlyfirstside_param/valueProcess.js
@@ -0,0 +1,2 @@
+import("system.result");
+result.string("1");
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/entityfields/removeusage/onActionProcess.js b/entity/ObjectRelationType_entity/entityfields/removeusage/onActionProcess.js
new file mode 100644
index 0000000000..7de1f5f6cb
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/removeusage/onActionProcess.js
@@ -0,0 +1,14 @@
+import("system.translate");
+import("system.question");
+import("system.vars");
+import("system.db");
+import("Sql_lib");
+
+if (vars.get("$field.UID") && vars.get("$field.DEST_OBJECTRELATIONTYPEID"))
+{
+    db.deleteData("AB_OBJECTRELATION", SqlCondition.begin()
+                                   .andPrepareVars("AB_OBJECTRELATION.AB_OBJECTRELATIONTYPE1", "$field.UID")
+                                   .andPrepareVars("AB_OBJECTRELATION.AB_OBJECTRELATIONTYPE2", "$field.DEST_OBJECTRELATIONTYPEID").build("1=2"));
+    question.showMessage(translate.withArguments("Deleted all usages of \"%0\".", [translate.text(vars.get("$field.SOURCE_RELATION_TITLE")) + " -> " + translate.text(vars.get("$field.DEST_RELATION_TITLE"))]), question.INFORMATION, translate.text("Successful"))
+}
+
diff --git a/entity/ObjectRelationType_entity/entityfields/source_object_type/displayValueProcess.js b/entity/ObjectRelationType_entity/entityfields/source_object_type/displayValueProcess.js
new file mode 100644
index 0000000000..762ebccbcb
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/source_object_type/displayValueProcess.js
@@ -0,0 +1,10 @@
+import("Context_lib");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.SOURCE_OBJECT_TYPE")) {
+    result.string("");
+} else if (vars.exists("$field.SOURCE_OBJECT_TYPE") && vars.get("$field.SOURCE_OBJECT_TYPE")) {
+    result.string(ContextUtils.getContext(vars.get("$field.SOURCE_OBJECT_TYPE"))[2]);
+}
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/entityfields/source_relation_title/displayValueProcess.js b/entity/ObjectRelationType_entity/entityfields/source_relation_title/displayValueProcess.js
new file mode 100644
index 0000000000..abba412e0e
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/source_relation_title/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("system.translate");
+
+result.string(translate.text(vars.get("$field.SOURCE_RELATION_TITLE")));
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js b/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js
index 23e43cb44c..698419fadb 100644
--- a/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js
@@ -1,6 +1,12 @@
-import("system.logging");
 import("system.result");
 import("system.vars");
 import("ObjectRelation_lib");
 
-result.object(ObjectRelationUtils.getPossibleRelationTypes(vars.get("$param.SourceObjectType_param")));
\ No newline at end of file
+if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
+{
+    result.object([ObjectRelationUtils.getRelationType(vars.get("$local.idvalues")[0])]);
+}
+else
+{
+    result.object(ObjectRelationUtils.getPossibleRelationTypes(vars.get("$param.SourceObjectType_param"), true, vars.get("$param.OnlyFirstSide_param") == "1"));
+}
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/recordcontainers/jdito/onDelete.js b/entity/ObjectRelationType_entity/recordcontainers/jdito/onDelete.js
new file mode 100644
index 0000000000..78bb374858
--- /dev/null
+++ b/entity/ObjectRelationType_entity/recordcontainers/jdito/onDelete.js
@@ -0,0 +1,23 @@
+import("system.logging");
+import("system.vars");
+import("system.db");
+import("system.translate");
+import("system.question");
+import("Sql_lib");
+
+var usageCount = db.cell(SqlCondition.begin()
+                                   .andPrepareVars("AB_OBJECTRELATION.AB_OBJECTRELATIONTYPE1", "$field.UID")
+                                   .andPrepareVars("AB_OBJECTRELATION.AB_OBJECTRELATIONTYPE2", "$field.DEST_OBJECTRELATIONTYPEID")
+                                   .buildSql("select count(*) from AB_OBJECTRELATION", "1=2"))
+
+if (usageCount <= 0)
+{
+    db.deleteData("AB_OBJECTRELATIONTYPE", SqlCondition.begin()
+                                   .andPrepareVars("AB_OBJECTRELATIONTYPE.RELATION_TYPE", "$field.RELATION_TYPE")
+                                   .build("1=2"));
+}
+else
+{
+    // TODO: server hängt bei question.showMessage
+    //question.showMessage(translate.withArguments("There are still %0 relations using the type %1.", [usageCount, translate.text(vars.get("$field.SOURCE_RELATION_TITLE")) + " -> " + translate.text(vars.get("$field.DEST_RELATION_TITLE"))]), question.WARNING, translate.text("Cannot remove relation type"))
+}
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js b/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 0000000000..b9f87162f4
--- /dev/null
+++ b/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,43 @@
+import("system.util");
+import("ObjectRelation_lib");
+import("system.vars");
+import("system.db");
+import("system.util");
+
+var newRelationType = util.getNewUUID();
+
+db.insertData("AB_OBJECTRELATIONTYPE", [
+    "AB_OBJECTRELATIONTYPEID",
+    "OBJECT_TYPE",
+    "RELATION_TITLE",
+    "RELATION_TYPE",
+    "SIDE",
+    "HIERARCHY"
+], null, [
+    util.getNewUUID(),
+    vars.get("$field.SOURCE_OBJECT_TYPE"),
+    vars.get("$field.SOURCE_RELATION_TITLE"),
+    newRelationType,
+    1,
+    vars.get("$field.HIERARCHY")
+]);
+
+if ((vars.get("$field.SOURCE_RELATION_TITLE") != vars.get("$field.DEST_RELATION_TITLE") || vars.get("$field.SOURCE_OBJECT_TYPE") != vars.get("$field.DEST_OBJECT_TYPE"))
+    && vars.get("$field.DEST_OBJECT_TYPE") && vars.get("$field.DEST_RELATION_TITLE"))
+{
+    db.insertData("AB_OBJECTRELATIONTYPE", [
+        "AB_OBJECTRELATIONTYPEID",
+        "OBJECT_TYPE",
+        "RELATION_TITLE",
+        "RELATION_TYPE",
+        "SIDE",
+        "HIERARCHY"
+    ], null, [
+        util.getNewUUID(),
+        vars.get("$field.DEST_OBJECT_TYPE"),
+        vars.get("$field.DEST_RELATION_TITLE"),
+        newRelationType,
+        2,
+        vars.get("$field.HIERARCHY")
+    ]);
+}
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/recordcontainers/jdito/onUpdate.js b/entity/ObjectRelationType_entity/recordcontainers/jdito/onUpdate.js
new file mode 100644
index 0000000000..4df0c2df9e
--- /dev/null
+++ b/entity/ObjectRelationType_entity/recordcontainers/jdito/onUpdate.js
@@ -0,0 +1,88 @@
+import("system.util");
+import("Sql_lib");
+import("system.db");
+import("system.vars");
+
+var usageCount = db.cell(SqlCondition.begin()
+                                   .andPrepareVars("AB_OBJECTRELATION.AB_OBJECTRELATIONTYPE1", "$field.UID")
+                                   .andPrepareVars("AB_OBJECTRELATION.AB_OBJECTRELATIONTYPE2", "$field.DEST_OBJECTRELATIONTYPEID")
+                                   .buildSql("select count(*) from AB_OBJECTRELATION", "1=2"))
+
+if (usageCount <= 0)
+{
+    var type1Fields = {};
+    var type2Fields = {};
+
+    vars.get("local.changed").forEach(function(pChange)
+    {
+        var fieldName = pChange.split(".")[0];
+
+        switch (pChange.split("_")[0])
+        {
+            case "SOURCE":
+                type1Fields[fieldName.replace("SOURCE_", "")] = vars.get("$field." + fieldName);
+                break;
+            case "DEST":
+                type2Fields[fieldName.replace("DEST_", "")] = vars.get("$field." + fieldName);
+                break;
+            default:
+                type1Fields[fieldName] = vars.get("$field." + fieldName);
+                type2Fields[fieldName] = vars.get("$field." + fieldName);
+        }
+    });
+
+    var updates = [];
+    var type1Cond = SqlCondition.begin().andPrepareVars("AB_OBJECTRELATIONTYPE.AB_OBJECTRELATIONTYPEID", "$field.UID").build("1=2");
+    var type2Cond = SqlCondition.begin().andPrepareVars("AB_OBJECTRELATIONTYPE.AB_OBJECTRELATIONTYPEID", "$field.DEST_OBJECTRELATIONTYPEID").build("1=2");
+
+    for (let field in type1Fields) {
+        updates.push(["AB_OBJECTRELATIONTYPE", [field], null, [type1Fields[field]], type1Cond]);
+    }
+
+    // delete, if type2  is empty -> convert it to a "same"-type
+    if ((vars.get("$field.SOURCE_RELATION_TITLE") == vars.get("$field.DEST_RELATION_TITLE") && vars.get("$field.SOURCE_OBJECT_TYPE") == vars.get("$field.DEST_OBJECT_TYPE"))
+        || !vars.get("$field.DEST_OBJECT_TYPE") && !vars.get("$field.DEST_RELATION_TITLE"))
+    {
+        db.deleteData("AB_OBJECTRELATIONTYPE", type2Cond);
+    }
+    else
+    {   // update if already existing
+        if (vars.get("$field.DIRECTION") != "same")
+        {    
+            for (let field in type2Fields) {
+                updates.push(["AB_OBJECTRELATIONTYPE", [field], null, [type2Fields[field]], type2Cond]);
+            }
+        }
+        else
+        {   // insert if it was "same" before
+            if ((vars.get("$field.SOURCE_RELATION_TITLE") != vars.get("$field.DEST_RELATION_TITLE") || vars.get("$field.SOURCE_OBJECT_TYPE") != vars.get("$field.DEST_OBJECT_TYPE"))
+            && vars.get("$field.DEST_OBJECT_TYPE") && vars.get("$field.DEST_RELATION_TITLE"))
+            {
+                db.insertData("AB_OBJECTRELATIONTYPE", [
+                    "AB_OBJECTRELATIONTYPEID",
+                    "OBJECT_TYPE",
+                    "RELATION_TITLE",
+                    "RELATION_TYPE",
+                    "SIDE",
+                    "HIERARCHY"
+                ], null, [
+                    util.getNewUUID(),
+                    vars.get("$field.DEST_OBJECT_TYPE"),
+                    vars.get("$field.DEST_RELATION_TITLE"),
+                    vars.get("$field.RELATION_TYPE"),
+                    2,
+                    vars.get("$field.HIERARCHY")
+                ]);
+
+            }
+        }
+    }
+
+    db.updates(updates);
+}
+else
+{
+    // TODO: server hängt bei question.showMessage
+    //question.showMessage(translate.withArguments("There are still %0 relations using the type %1.", [usageCount, translate.text(vars.get("$field.SOURCE_RELATION_TITLE")) + " -> " + translate.text(vars.get("$field.DEST_RELATION_TITLE"))]), question.WARNING, translate.text("Cannot remove relation type"))
+}
+
diff --git a/entity/ObjectRelationType_entity/titleProcess.js b/entity/ObjectRelationType_entity/titleProcess.js
index 71a9111fb4..dbc0c50030 100644
--- a/entity/ObjectRelationType_entity/titleProcess.js
+++ b/entity/ObjectRelationType_entity/titleProcess.js
@@ -2,4 +2,11 @@ import("system.translate");
 import("system.vars");
 import("system.result");
 
-result.string(translate.text(vars.get("$field.RELATION_TITLE")))
\ No newline at end of file
+if (vars.exists("$param.OnlyFirstSide_param") && vars.get("$param.OnlyFirstSide_param") == "1" && vars.get("$field.DIRECTION") != "same")
+{
+    result.string(translate.text(vars.get("$field.SOURCE_RELATION_TITLE")) + " -> " + translate.text(vars.get("$field.DEST_RELATION_TITLE")));
+}
+else
+{
+    result.string(translate.text(vars.get("$field.SOURCE_RELATION_TITLE")));
+}
\ No newline at end of file
diff --git a/entity/ObjectTree_entity/ObjectTree_entity.aod b/entity/ObjectTree_entity/ObjectTree_entity.aod
index d940f4a75f..78ee2dcbcd 100644
--- a/entity/ObjectTree_entity/ObjectTree_entity.aod
+++ b/entity/ObjectTree_entity/ObjectTree_entity.aod
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.1">
   <name>ObjectTree_entity</name>
-  <title>Object tree</title>
+  <title>Object relation</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <recordContainer>jdito</recordContainer>
   <entityFields>
@@ -108,6 +108,7 @@
       <title>Relation</title>
       <consumer>Objects</consumer>
       <linkedContextProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/target_id/linkedContextProcess.js</linkedContextProcess>
+      <mandatory v="true" />
       <searchable v="false" />
       <stateProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/target_id/stateProcess.js</stateProcess>
       <displayValueProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/target_id/displayValueProcess.js</displayValueProcess>
@@ -127,6 +128,7 @@
       <name>OBJECTRELATIONTYPEID</name>
       <title>Relationtype</title>
       <consumer>ObjectRelationTypes</consumer>
+      <mandatory v="true" />
       <stateProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/objectrelationtypeid/stateProcess.js</stateProcess>
       <valueProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/objectrelationtypeid/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/objectrelationtypeid/displayValueProcess.js</displayValueProcess>
@@ -167,9 +169,8 @@
           <name>edit</name>
           <fieldType>ACTION</fieldType>
           <onActionProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/alter/children/edit/onActionProcess.js</onActionProcess>
+          <isSelectionAction v="true" />
           <iconId>NEON:PENCIL</iconId>
-          <state>DISABLED</state>
-          <stateProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/alter/children/edit/stateProcess.js</stateProcess>
         </entityActionField>
       </children>
     </entityActionGroup>
diff --git a/entity/ObjectTree_entity/entityfields/alter/children/edit/stateProcess.js b/entity/ObjectTree_entity/entityfields/alter/children/edit/stateProcess.js
deleted file mode 100644
index 60b83bbcbd..0000000000
--- a/entity/ObjectTree_entity/entityfields/alter/children/edit/stateProcess.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import("system.logging");
-import("system.result");
-import("system.neon");
-import("system.vars");
-logging.log("aaaaaaaaaaaaa " + vars.get("$sys.selection"))
-logging.log("aaaaaaaaaaaaa " + vars.get("$sys." + "viewmode"))
-if (vars.get("$sys." + "viewmode") == neon.FRAME_VIEWMODE_COMPONENT)
-if (vars.exists("$sys." + "selection") && vars.get("$sys." + "selection"))
-{    
-    var selectedRows = JSON.parse(vars.get("$sys." + "selection"));
-    var isObjectRelationNode = false;
-    if (selectedRows.length > 0)
-    {
-        logging.log(selectedRows.toSource())
-        var uid = JSON.parse(selectedRows[0]);
-        logging.log(uid.toSource())
-        isObjectRelationNode = typeof uid[2] == "string";
-    }  
-    logging.log(isObjectRelationNode)
-    if (isObjectRelationNode)
-    {
-        result.string(neon.COMPONENTSTATE_EDITABLE)
-    }
-    else
-    {
-        result.string(neon.COMPONENTSTATE_DISABLED)
-    }
-}
-else
-    result.string(neon.COMPONENTSTATE_DISABLED)
\ No newline at end of file
diff --git a/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js b/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js
index 70b8263604..565597b0b4 100644
--- a/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js
@@ -30,8 +30,6 @@ if (uidParam)
         _insertEntry(tree, _getEntryData(uid[0], relationTypeData[3], relationTypeData[7], relationTypeData[8], undefined, false, uid[6]), "", 0, uid[3], relationTypeData[10]);
 
     }
-   /* else
-        tree = [["", "", "", "", "", "", "", ""]]*/
 }
 else
 {
@@ -163,17 +161,12 @@ function _loadObjectRelationTree(pObjectId, pObjectType, pObjectRelationTypeId,
                 if (direction == "same")
                     relationTypeIdForNew = thisRelationTypeId
 
-                // add both sides. Only one will succeed, because the prevObjectId will be filtered and it will just return []
-                let uids = _insertEntry(tree, entryData, pNodeId, pLayer, destObjectType, thisRelationTypeId, 0);
+                // add both sides. Only one will succeed, because the prevObjectId will be filtered
+                _insertEntry(tree, entryData, pNodeId, pLayer, destObjectType, thisRelationTypeId, 0);
                 if (direction == "same")
                 {
                     var otherEntryData = _getEntryData(pNodeId[0], "normal", relationType1, relationType2, prevObjectId, true);
-                    uids = uids.concat(_insertEntry(tree, otherEntryData, pNodeId, pLayer, destObjectType, thisRelationTypeId, 1));
-                }
-                                
-                for (let i = 0; i < uids.length; i++) 
-                {   
-                    _loadObjectRelationTree(uids[i][0], uids[i][3], pObjectRelationTypeId, uids[i], pLayer+1, pRelationTypeData);
+                    uids.concat(_insertEntry(tree, otherEntryData, pNodeId, pLayer, destObjectType, thisRelationTypeId, 1));
                 }
             }
         }
diff --git a/entity/Object_entity/recordcontainers/jdito/contentProcess.js b/entity/Object_entity/recordcontainers/jdito/contentProcess.js
index 4497cff400..cc89716725 100644
--- a/entity/Object_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Object_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("system.db");
 import("system.vars");
 import("system.result");
@@ -10,6 +11,9 @@ if (vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param"
     if (vars.exists("$param.ExcludedObjectIds_param") && vars.get("$param.ExcludedObjectIds_param"))
         excludedIds = JSON.parse(vars.get("$param.ExcludedObjectIds_param"));
     
+    logging.log("aa22aa" + vars.get("$param.ExcludedObjectIds_param").toSource())
+    logging.log("aa22aa" + vars.get("$param.ObjectType_param").toSource())
+
     result.object(db.table(ContextUtils.getContextDataSql(vars.get("$param.ObjectType_param"), undefined, false, undefined, false, excludedIds)))
 } 
 else
diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index bbbd5c1c67..6e44479793 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -564,7 +564,7 @@
     </entityParameter>
     <entityConsumer>
       <name>ObjectTrees</name>
-      <title>Relation tree</title>
+      <title>Object relation</title>
       <fieldType>DEPENDENCY_OUT</fieldType>
       <dependency>
         <name>dependency</name>
diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index 2e33f29ccd..eb5d2f205c 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -637,7 +637,7 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
     </entityConsumer>
     <entityConsumer>
       <name>ObjectTrees</name>
-      <title>Relation tree</title>
+      <title>Object relation</title>
       <fieldType>DEPENDENCY_OUT</fieldType>
       <dependency>
         <name>dependency</name>
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index db5e07b9e3..bc40627b52 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -2742,9 +2742,60 @@
     <entry>
       <key>Salesproject phases</key>
     </entry>
+    <entry>
+      <key>Object type 1</key>
+    </entry>
+    <entry>
+      <key>Object type 2</key>
+    </entry>
+    <entry>
+      <key>Objectrelation type</key>
+    </entry>
     <entry>
       <key>Key figures</key>
     </entry>
+    <entry>
+      <key>Delete all usage</key>
+    </entry>
+    <entry>
+      <key>Deleted all usages of \"%0\".</key>
+    </entry>
+    <entry>
+      <key>promotion target ofc</key>
+    </entry>
+    <entry>
+      <key>Successful</key>
+    </entry>
+    <entry>
+      <key>Relation type 1</key>
+    </entry>
+    <entry>
+      <key>Relation type 2</key>
+    </entry>
+    <entry>
+      <key>Relation type</key>
+    </entry>
+    <entry>
+      <key>Context 1</key>
+    </entry>
+    <entry>
+      <key>Context 2</key>
+    </entry>
+    <entry>
+      <key>Title 1</key>
+    </entry>
+    <entry>
+      <key>Title 2</key>
+    </entry>
+    <entry>
+      <key>Hierarchy</key>
+    </entry>
+    <entry>
+      <key>Object relation</key>
+    </entry>
+    <entry>
+      <key>Type 2 enabled</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 e520e49219..7351586623 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -3250,6 +3250,7 @@
     </entry>
     <entry>
       <key>Object tree</key>
+      <value>Beziehungen</value>
     </entry>
     <entry>
       <key>&amp;Aufg / Term (%0/%1)</key>
@@ -3539,6 +3540,108 @@
     <entry>
       <key>Salesproject Phases</key>
     </entry>
+    <entry>
+      <key>Salesproject Phases</key>
+    </entry>
+    <entry>
+      <key>Key figures</key>
+    </entry>
+    <entry>
+      <key>Objectrelation type</key>
+      <value>Beziehungstyp</value>
+    </entry>
+    <entry>
+      <key>Kennzahlen</key>
+    </entry>
+    <entry>
+      <key>Count</key>
+    </entry>
+    <entry>
+      <key>Forecast actual year </key>
+    </entry>
+    <entry>
+      <key>Chart</key>
+    </entry>
+    <entry>
+      <key>Salesproject Charts</key>
+    </entry>
+    <entry>
+      <key>Relation</key>
+    </entry>
+    <entry>
+      <key>Zeigt wie viele Vertriebsprojekte in den einzelnen Vertriebsphasen sind. </key>
+    </entry>
+    <entry>
+      <key>test1eee</key>
+    </entry>
+    <entry>
+      <key>Object type 1</key>
+      <value>Typ 1</value>
+    </entry>
+    <entry>
+      <key>Object type 2</key>
+      <value>Typ 2</value>
+    </entry>
+    <entry>
+      <key>test2</key>
+    </entry>
+    <entry>
+      <key>Title 1</key>
+      <value>Titel 1</value>
+    </entry>
+    <entry>
+      <key>Title 2</key>
+      <value>Titel 2</value>
+    </entry>
+    <entry>
+      <key>Hierarchy</key>
+      <value>Hierarchie</value>
+    </entry>
+    <entry>
+      <key>Object relation</key>
+      <value>Beziehungen</value>
+    </entry>
+    <entry>
+      <key>Type 2 enabled</key>
+      <value>Typ 2 aktiviert</value>
+    </entry>
+    <entry>
+      <key>Relation type 1</key>
+      <value>Beziehungsart 1</value>
+    </entry>
+    <entry>
+      <key>Relation type 2</key>
+      <value>Beziehungsart 2</value>
+    </entry>
+    <entry>
+      <key>Relation type</key>
+      <value>Beziehungstyp</value>
+    </entry>
+    <entry>
+      <key>Context 1</key>
+      <value>Kontext 1</value>
+    </entry>
+    <entry>
+      <key>Context 2</key>
+      <value>Kontext2</value>
+    </entry>
+    <entry>
+      <key>Tochter</key>
+    </entry>
+    <entry>
+      <key>Delete all usage</key>
+      <value>Lösche jede Verwendung</value>
+    </entry>
+    <entry>
+      <key>Deleted all usages of \"%0\".</key>
+      <value>Jede Verwendung von \"%0\" wurde gelöscht.</value>
+    </entry>
+    <entry>
+      <key>promotion target ofc</key>
+    </entry>
+    <entry>
+      <key>Successful</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 0cd508f221..698a13751f 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -2776,6 +2776,54 @@
     <entry>
       <key>Key figures</key>
     </entry>
+    <entry>
+      <key>Relation</key>
+    </entry>
+    <entry>
+      <key>Object type 1</key>
+    </entry>
+    <entry>
+      <key>Object type 2</key>
+    </entry>
+    <entry>
+      <key>Title 1</key>
+    </entry>
+    <entry>
+      <key>Title 2</key>
+    </entry>
+    <entry>
+      <key>Hierarchy</key>
+    </entry>
+    <entry>
+      <key>Object relation</key>
+    </entry>
+    <entry>
+      <key>Relation type 1</key>
+    </entry>
+    <entry>
+      <key>Relation type 2</key>
+    </entry>
+    <entry>
+      <key>Relation type</key>
+    </entry>
+    <entry>
+      <key>Context 1</key>
+    </entry>
+    <entry>
+      <key>Context 2</key>
+    </entry>
+    <entry>
+      <key>Delete all usage</key>
+    </entry>
+    <entry>
+      <key>Deleted all usages of \"%0\".</key>
+    </entry>
+    <entry>
+      <key>promotion target ofc</key>
+    </entry>
+    <entry>
+      <key>Successful</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonContext/ObjectRelationType/ObjectRelationType.aod b/neonContext/ObjectRelationType/ObjectRelationType.aod
index f3285ed72a..5e82a52756 100644
--- a/neonContext/ObjectRelationType/ObjectRelationType.aod
+++ b/neonContext/ObjectRelationType/ObjectRelationType.aod
@@ -1,6 +1,24 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
   <name>ObjectRelationType</name>
+  <title>Relation type</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterview>ObjectRelationTypeFilter_view</filterview>
+  <editview>ObjectRelationTypeEdit_view</editview>
+  <preview>ObjectRelationTypePreview_view</preview>
   <entity>ObjectRelationType_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>3bee0408-8a9b-4188-8ebf-0b9671bbf436</name>
+      <view>ObjectRelationTypeFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>afb5b3c7-fb34-4511-8b72-34808d64e226</name>
+      <view>ObjectRelationTypeEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>b4cb3fc0-03ed-48d5-bd0c-725623865bc3</name>
+      <view>ObjectRelationTypePreview_view</view>
+    </neonViewReference>
+  </references>
 </neonContext>
diff --git a/neonView/ObjectRelationTypeEdit_view/ObjectRelationTypeEdit_view.aod b/neonView/ObjectRelationTypeEdit_view/ObjectRelationTypeEdit_view.aod
new file mode 100644
index 0000000000..0395015611
--- /dev/null
+++ b/neonView/ObjectRelationTypeEdit_view/ObjectRelationTypeEdit_view.aod
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>ObjectRelationTypeEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Info</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>adb2c427-89fd-4f8d-abae-39c8273c9916</name>
+          <entityField>SOURCE_RELATION_TITLE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>ffaf9de0-6866-4d0a-80af-42b57169d83e</name>
+          <entityField>SOURCE_OBJECT_TYPE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>0fd227e4-2896-4ce3-b699-8e5ce82a2862</name>
+          <entityField>DEST_RELATION_TITLE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>e7578539-f60d-4136-af56-9fd587ed34ec</name>
+          <entityField>DEST_OBJECT_TYPE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>945f613e-ce96-419d-8a71-f3196e41e444</name>
+          <entityField>HIERARCHY</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/ObjectRelationTypeFilter_view/ObjectRelationTypeFilter_view.aod b/neonView/ObjectRelationTypeFilter_view/ObjectRelationTypeFilter_view.aod
new file mode 100644
index 0000000000..474bfcaaf5
--- /dev/null
+++ b/neonView/ObjectRelationTypeFilter_view/ObjectRelationTypeFilter_view.aod
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>ObjectRelationTypeFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>RelationTypes</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>e526e3fb-2776-42f9-b75e-67a5dc7bde9d</name>
+          <entityField>SOURCE_RELATION_TITLE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>89ee84eb-b50b-47e4-863c-7537c8a2c1d0</name>
+          <entityField>SOURCE_OBJECT_TYPE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>2230c73a-f5d9-44bb-bcfa-67d42a24881b</name>
+          <entityField>DEST_RELATION_TITLE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>755d8ce7-3995-457c-b5f2-39f5aae361f6</name>
+          <entityField>DEST_OBJECT_TYPE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>3e9e27c1-e971-4431-9f47-1d8fe436be76</name>
+          <entityField>HIERARCHY</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/ObjectRelationTypePreview_view/ObjectRelationTypePreview_view.aod b/neonView/ObjectRelationTypePreview_view/ObjectRelationTypePreview_view.aod
new file mode 100644
index 0000000000..0b02d9141e
--- /dev/null
+++ b/neonView/ObjectRelationTypePreview_view/ObjectRelationTypePreview_view.aod
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>ObjectRelationTypePreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <cardViewTemplate>
+      <name>header</name>
+      <titleField>SOURCE_RELATION_TITLE</titleField>
+      <entityField>#ENTITY</entityField>
+    </cardViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/OrganisationMain_view/OrganisationMain_view.aod b/neonView/OrganisationMain_view/OrganisationMain_view.aod
index 33c7ef2568..af17888c14 100644
--- a/neonView/OrganisationMain_view/OrganisationMain_view.aod
+++ b/neonView/OrganisationMain_view/OrganisationMain_view.aod
@@ -45,11 +45,6 @@
       <entityField>Documents</entityField>
       <view>DocumentFilter_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>ab7d3db4-af9d-4903-b28a-6347f2512a54</name>
-      <entityField>ObjectRelations</entityField>
-      <view>ObjectRelationFilter_view</view>
-    </neonViewReference>
     <neonViewReference>
       <name>c82aff98-ede5-4d9e-a902-89f71ed7dbb0</name>
       <entityField>ObjectTrees</entityField>
diff --git a/neonView/PersonMain_view/PersonMain_view.aod b/neonView/PersonMain_view/PersonMain_view.aod
index 81c60ecc29..6720704e06 100644
--- a/neonView/PersonMain_view/PersonMain_view.aod
+++ b/neonView/PersonMain_view/PersonMain_view.aod
@@ -34,11 +34,6 @@
       <entityField>Documents</entityField>
       <view>DocumentFilter_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>a713a58e-eae0-4657-9cb0-ffffbd41d4ab</name>
-      <entityField>ObjectRelations</entityField>
-      <view>ObjectRelationFilter_view</view>
-    </neonViewReference>
     <neonViewReference>
       <name>cb8ff3df-772b-4c12-8814-f9101295b1ba</name>
       <entityField>ObjectTrees</entityField>
diff --git a/process/ObjectRelation_lib/process.js b/process/ObjectRelation_lib/process.js
index f44bc3ead9..710f0c64e9 100644
--- a/process/ObjectRelation_lib/process.js
+++ b/process/ObjectRelation_lib/process.js
@@ -13,59 +13,81 @@ function ObjectRelationUtils() {}
  * Get all possible relationTypes by a objectType. (objectrelationtypeId and title)
  * Normally it only returns the id and title. If you set pFullInfo to true, you will get additional information, too.
  * 
- * @param {String} pObjectType the object type to load the relation types for.] 
- * @param {Boolean} [pFullInfo=false] return also RELATION_TYPE, direction (normal, reverse, same), hierarchy, OBJECT_TYPE dest, OBJECT_TYPE source, objectrelationtypeId1, objectrelationtypeId2, side, objectrelationtypeId
+ * @param {String} [pObjectType=undefined] the object type to load the relation types for.] 
+ * @param {Boolean} [pFullInfo=false] return also RELATION_TYPE, direction (normal, reverse, same), hierarchy, OBJECT_TYPE dest, OBJECT_TYPE source, objectrelationtypeId1, objectrelationtypeId2, side, objectrelationtypeId, other title
  * 
  * @return {String[][]}
  */
-ObjectRelationUtils.getPossibleRelationTypes = function(pObjectType, pFullInfo)
+ObjectRelationUtils.getPossibleRelationTypes = function(pObjectType, pFullInfo, pOnlyFirstSide, pRelationTypeId)
 {
     var sql = " from AB_OBJECTRELATIONTYPE main \n\
-            left join AB_OBJECTRELATIONTYPE type2 on (type2.AB_OBJECTRELATIONTYPEID <> main.AB_OBJECTRELATIONTYPEID and type2.RELATION_TYPE = main.RELATION_TYPE) \n\
-            where case when type2.OBJECT_TYPE is null then main.OBJECT_TYPE else type2.OBJECT_TYPE end = ? "
+            left join AB_OBJECTRELATIONTYPE type2 on (type2.AB_OBJECTRELATIONTYPEID <> main.AB_OBJECTRELATIONTYPEID and type2.RELATION_TYPE = main.RELATION_TYPE) ";
+    var cond = "";
     
-    // only id and title:
-    if (pFullInfo == undefined || pFullInfo == false)
+    var params = [];
+    
+    if (pObjectType)
+    {
+        cond = "where case when type2.OBJECT_TYPE is null then main.OBJECT_TYPE else type2.OBJECT_TYPE end = ? "
+        params.push([pObjectType, db.getColumnTypes("AB_OBJECTRELATIONTYPE", ["OBJECT_TYPE"])[0]]);
+    }
+    
+    if (pRelationTypeId)
     {
-        pFullInfo = [];
+        if (!cond)
+            cond = "where ";
+        else
+            cond += " and ";
         
-        return (db.table(
-        ["select main.AB_OBJECTRELATIONTYPEID, main.RELATION_TITLE" + sql, 
-            [
-              [pObjectType, db.getColumnTypes("AB_OBJECTRELATIONTYPE", ["OBJECT_TYPE"])[0]]
-            ]
-        ]));
+        cond += " main.AB_OBJECTRELATIONTYPEID = ? ";
+        params.push([pRelationTypeId, db.getColumnTypes("AB_OBJECTRELATIONTYPE", ["AB_OBJECTRELATIONTYPEID"])[0]]);
+    }
+    
+    if (pOnlyFirstSide == "1")
+    {
+        if (!cond)
+            cond = "where ";
+        else
+            cond += " and ";
         
+        cond += " main.SIDE = 1 "
     }
     
-    // full info:    
-    var relationTypes = (db.table(
-    ["select main.AB_OBJECTRELATIONTYPEID, main.RELATION_TITLE, main.RELATION_TYPE, \n\
+    sql += cond;
+    
+    // only id and title:
+    if (pFullInfo == undefined || pFullInfo == false)
+    {
+        sql = "select main.AB_OBJECTRELATIONTYPEID, main.RELATION_TITLE" + sql;
+    }
+    else
+    {
+        sql = "select main.AB_OBJECTRELATIONTYPEID, main.RELATION_TITLE, main.RELATION_TYPE, \n\
         case when type2.AB_OBJECTRELATIONTYPEID is null then 'same' \n\
              when main.SIDE = 1 then 'normal'\n\
              else 'reverse'\n\
         end direction,\n\
         main.HIERARCHY, \n\
-        type2.OBJECT_TYPE objectType, \n\
-        main.OBJECT_TYPE objectType, \n\
+        type2.OBJECT_TYPE destObjectType, \n\
+        main.OBJECT_TYPE sourceObjectType, \n\
         -- typeId of Object2\n\
         case when main.SIDE = 1 then main.AB_OBJECTRELATIONTYPEID\n\
              else type2.AB_OBJECTRELATIONTYPEID end objectrelationtypeId1,\n\
         -- typeId of Object1\n\
         case when type2.AB_OBJECTRELATIONTYPEID is null or main.SIDE = 2 then main.AB_OBJECTRELATIONTYPEID\n\
              else type2.AB_OBJECTRELATIONTYPEID end objectrelationtypeId2, \n\
-        main.SIDE, case when type2.AB_OBJECTRELATIONTYPEID is  null then main.AB_OBJECTRELATIONTYPEID else type2.AB_OBJECTRELATIONTYPEID end" + sql, 
-        [
-          [pObjectType, db.getColumnTypes("AB_OBJECTRELATIONTYPE", ["OBJECT_TYPE"])[0]]
-        ]
-    ]));
-
-    return relationTypes;
+        main.SIDE,\n\
+        case when type2.AB_OBJECTRELATIONTYPEID is  null then main.AB_OBJECTRELATIONTYPEID else type2.AB_OBJECTRELATIONTYPEID end,\n\
+        type2.RELATION_TITLE" + sql;
+    }
+       
+    // full info:
+    return (db.table([sql, params]));
 }
 
 /**
  * Get relationType by a RelationTypeId.
- * returns the objectrelationtypeId, title, RELATION_TYPE, direction (normal, reverse, same), hierarchy, OBJECT_TYPE dest, OBJECT_TYPE source, objectrelationtypeId1, objectrelationtypeId2, side,objectrelationtypeId
+ * returns the objectrelationtypeId, title, RELATION_TYPE, direction (normal, reverse, same), hierarchy, OBJECT_TYPE dest, OBJECT_TYPE source, objectrelationtypeId1, objectrelationtypeId2, side,objectrelationtypeId, other title
  * 
  * @param {String} pRelationTypeId the RelationTypeId to load the full relation type for.
  * 
@@ -73,32 +95,9 @@ ObjectRelationUtils.getPossibleRelationTypes = function(pObjectType, pFullInfo)
  */
 ObjectRelationUtils.getRelationType = function(pRelationTypeId)
 {
-    // TODO: funktionen evtl. zusammenfassen
-    var sql = " from AB_OBJECTRELATIONTYPE main \n\
-            left join AB_OBJECTRELATIONTYPE type2 on (type2.AB_OBJECTRELATIONTYPEID <> main.AB_OBJECTRELATIONTYPEID and type2.RELATION_TYPE = main.RELATION_TYPE) \n\
-            where main.AB_OBJECTRELATIONTYPEID = ?"
-    
-    // full info:    
-    var relationType = (db.array(db.ROW,
-    ["select main.AB_OBJECTRELATIONTYPEID, main.RELATION_TITLE, main.RELATION_TYPE, \n\
-        case when type2.AB_OBJECTRELATIONTYPEID is null then 'same' \n\
-             when main.SIDE = 1 then 'normal'\n\
-             else 'reverse'\n\
-        end direction,\n\
-        main.HIERARCHY, \n\
-        type2.OBJECT_TYPE objectType, \n\
-        main.OBJECT_TYPE objectType, \n\
-        -- typeId of Object2\n\
-        case when main.SIDE = 1 then main.AB_OBJECTRELATIONTYPEID\n\
-             else type2.AB_OBJECTRELATIONTYPEID end objectrelationtypeId1,\n\
-        -- typeId of Object1\n\
-        case when type2.AB_OBJECTRELATIONTYPEID is null or main.SIDE = 2 then main.AB_OBJECTRELATIONTYPEID\n\
-             else type2.AB_OBJECTRELATIONTYPEID end objectrelationtypeId2, \n\
-        main.SIDE, case when type2.AB_OBJECTRELATIONTYPEID is  null then main.AB_OBJECTRELATIONTYPEID else type2.AB_OBJECTRELATIONTYPEID end" + sql, 
-        [
-          [pRelationTypeId, db.getColumnTypes("AB_OBJECTRELATIONTYPE", ["AB_OBJECTRELATIONTYPEID"])[0]],
-        ]
-    ]));
-
-    return relationType;
+    var data = ObjectRelationUtils.getPossibleRelationTypes(undefined, true, false, pRelationTypeId);
+    if (data.length > 0)
+        return data[0];
+    else
+        return [];
 }
\ No newline at end of file
-- 
GitLab