From 1023a9621eac977720fe6a90dada17c96311c174 Mon Sep 17 00:00:00 2001
From: "f.maier" <f.maier@adito.de>
Date: Thu, 21 Oct 2021 11:30:51 +0200
Subject: [PATCH] [Projekt: xRM-ContactManagement][TicketNr.:
 2001606][Bild-Spalte in Tabellen mitaufnehmen]

---
 .../product_id/displayValueProcess.js         |  6 ++--
 .../product_id.displayvalue/expression.js     | 10 +++----
 .../Advertising_entity/Advertising_entity.aod |  8 ++++++
 .../picture.value/expression.js               | 12 ++++++++
 .../CommunicationSettings_entity.aod          |  8 ++++++
 .../picture.value/expression.js               | 13 +++++++++
 entity/Contact_entity/Contact_entity.aod      |  8 ++++++
 .../picture.value/expression.js               | 12 ++++++++
 .../DescriptionTranslation_entity.aod         |  8 ++++++
 .../picture.value/expression.js               | 12 ++++++++
 .../ExportTemplateSelection_entity.aod        |  2 +-
 .../entityfields/exportcount/titleProcess.js  | 13 ---------
 .../ExportTemplate_entity.aod                 |  1 -
 entity/Forecast_entity/Forecast_entity.aod    |  8 ++++++
 .../picture.value/expression.js               | 10 +++++++
 .../InterestLink_entity.aod                   |  8 ++++++
 .../picture.value/expression.js               | 12 ++++++++
 entity/Offeritem_entity/Offeritem_entity.aod  |  8 ++++++
 .../product_id/displayValueProcess.js         |  8 ++++--
 .../picture.value/expression.js               | 12 ++++++++
 .../product_id.displayvalue/expression.js     |  3 +-
 entity/Orderitem_entity/Orderitem_entity.aod  |  8 ++++++
 .../product_id/displayValueProcess.js         |  8 ++++--
 .../picture.value/expression.js               | 12 ++++++++
 .../product_id.displayvalue/expression.js     |  3 +-
 entity/Planning_entity/Planning_entity.aod    |  8 ++++++
 .../picture.value/expression.js               | 10 +++++++
 entity/Prod2prod_entity/Prod2prod_entity.aod  |  7 +++++
 .../recordcontainers/jdito/contentProcess.js  |  5 +++-
 .../Timetracking_entity.aod                   |  8 ++++++
 .../contact_id.displayvalue/expression.js     |  2 +-
 .../picture.value/expression.js               | 14 ++++++++++
 .../AdvertisingFilter_view.aod                |  2 +-
 .../AdvertisingPreview_view.aod               |  2 +-
 .../CommunicationSettingsFilter_view.aod      |  2 +-
 .../CommunicationSettingsPreview_view.aod     |  2 +-
 .../ContactList_view/ContactList_view.aod     |  4 +++
 .../DescriptionTranslationFilter_view.aod     |  8 ++++++
 .../DescriptionTranslationPreview_view.aod    | 18 ++++--------
 .../ForecastFilter_view.aod                   | 12 ++++++++
 .../ForecastPreview_view.aod                  |  1 +
 .../InterestLinkFilter_view.aod               |  4 +++
 .../OfferitemFilter_view.aod                  |  8 ++++++
 .../OfferitemPreview_view.aod                 | 24 ++++++++--------
 .../OrderitemFilter_view.aod                  | 12 ++++++++
 .../OrderitemPreview_view.aod                 | 14 ++++------
 .../PlanningFilter_view.aod                   | 12 ++++++++
 .../PlanningMultiEditOverlay_view.aod         |  4 +++
 .../PlanningOrganisationFilter_view.aod       | 12 ++++++++
 .../Prod2prodFilter_view.aod                  |  8 ++++++
 .../TimetrackingFilter_view.aod               |  8 ++++++
 .../TimetrackingPreview_view.aod              | 27 +++++-------------
 process/Product_lib/process.js                | 28 +++++++++++++++++++
 53 files changed, 390 insertions(+), 89 deletions(-)
 create mode 100644 entity/Advertising_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
 create mode 100644 entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
 create mode 100644 entity/Contact_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
 create mode 100644 entity/DescriptionTranslation_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
 delete mode 100644 entity/ExportTemplateSelection_entity/entityfields/exportcount/titleProcess.js
 create mode 100644 entity/Forecast_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
 create mode 100644 entity/InterestLink_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
 create mode 100644 entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
 create mode 100644 entity/Orderitem_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
 create mode 100644 entity/Planning_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
 create mode 100644 entity/Timetracking_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js

diff --git a/entity/AdvertisingItem_entity/entityfields/product_id/displayValueProcess.js b/entity/AdvertisingItem_entity/entityfields/product_id/displayValueProcess.js
index b4a2de7925..34b95afc4d 100644
--- a/entity/AdvertisingItem_entity/entityfields/product_id/displayValueProcess.js
+++ b/entity/AdvertisingItem_entity/entityfields/product_id/displayValueProcess.js
@@ -1,8 +1,10 @@
+import("system.neon");
+import("Product_lib");
 import("system.vars");
 import("system.result");
 import("Sql_lib");
 
-if(vars.get("$field.PRODUCT_ID"))
+if(vars.get("$field.PRODUCT_ID") && vars.get("$sys.viewmode") != neon.FRAME_VIEWMODE_TABLE)
 {
-    result.string(newSelect("PRODUCT.PRODUCTNAME").from("PRODUCT").whereIfSet("PRODUCT.PRODUCTID", vars.get("$field.PRODUCT_ID")).cell());
+    result.string(ProductUtils.getProductName(vars.get("$field.PRODUCT_ID")));
 }
\ No newline at end of file
diff --git a/entity/AdvertisingItem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js b/entity/AdvertisingItem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js
index c3affdfee4..deadc02e14 100644
--- a/entity/AdvertisingItem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js
+++ b/entity/AdvertisingItem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js
@@ -1,8 +1,6 @@
-import("system.vars");
+import("Product_lib");
 import("system.result");
-import("Sql_lib");
 
-result.string(newSelect("PRODUCT.PRODUCTNAME")
-                        .from("PRODUCT")
-                        .where("ADVERTISINGITEM.PRODUCT_ID = PRODUCT.PRODUCTID")
-                        .toString());
\ No newline at end of file
+result.string(ProductUtils.getProductNameSubSql("ADVERTISINGITEM.PRODUCT_ID"));
+                        
+                        
\ No newline at end of file
diff --git a/entity/Advertising_entity/Advertising_entity.aod b/entity/Advertising_entity/Advertising_entity.aod
index a2e6c6eddc..6313f129f4 100644
--- a/entity/Advertising_entity/Advertising_entity.aod
+++ b/entity/Advertising_entity/Advertising_entity.aod
@@ -241,6 +241,10 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityField>
+      <name>PICTURE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -327,6 +331,10 @@
         <dbRecordFieldMapping>
           <name>OBJECT_ROWID.displayValue</name>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PICTURE.value</name>
+          <expression>%aditoprj%/entity/Advertising_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <linkInformation>
         <linkInformation>
diff --git a/entity/Advertising_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js b/entity/Advertising_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
new file mode 100644
index 0000000000..178f767874
--- /dev/null
+++ b/entity/Advertising_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
@@ -0,0 +1,12 @@
+import("Product_lib");
+import("Person_lib");
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.result");
+import("Sql_lib");
+
+var sqlMask = new SqlMaskingUtils();
+
+var sql = sqlMask.concatenate(["'TEXT:'", "(" + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.advertisingStatus(), "ADVERTISING.STATUS") + ")"]);
+
+result.string(sql.toString());
\ No newline at end of file
diff --git a/entity/CommunicationSettings_entity/CommunicationSettings_entity.aod b/entity/CommunicationSettings_entity/CommunicationSettings_entity.aod
index 8a34a28bae..ee03291546 100644
--- a/entity/CommunicationSettings_entity/CommunicationSettings_entity.aod
+++ b/entity/CommunicationSettings_entity/CommunicationSettings_entity.aod
@@ -213,6 +213,10 @@
       <contentType>BOOLEAN</contentType>
       <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/isactive/valueProcess.js</valueProcess>
     </entityField>
+    <entityField>
+      <name>PICTURE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -319,6 +323,10 @@
           <recordfield>COMMUNICATIONSETTINGS.ISACTIVE</recordfield>
           <isFilterable v="true" />
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PICTURE.value</name>
+          <expression>%aditoprj%/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <linkInformation>
         <linkInformation>
diff --git a/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js b/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
new file mode 100644
index 0000000000..151dab31e9
--- /dev/null
+++ b/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
@@ -0,0 +1,13 @@
+import("Product_lib");
+import("Person_lib");
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.result");
+import("Sql_lib");
+
+var sqlMask = new SqlMaskingUtils();
+
+var sql = sqlMask.concatenate(["'TEXT:'", 
+    "(" + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.communicationSettingStatus(), "COMMUNICATIONSETTINGS.STATUS") + ")"]);
+
+result.string(sql.toString());
\ No newline at end of file
diff --git a/entity/Contact_entity/Contact_entity.aod b/entity/Contact_entity/Contact_entity.aod
index 1933fdd556..2a21349579 100644
--- a/entity/Contact_entity/Contact_entity.aod
+++ b/entity/Contact_entity/Contact_entity.aod
@@ -275,6 +275,10 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityField>
+      <name>PICTURE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -367,6 +371,10 @@
           <name>DEPARTMENT.displayValue</name>
           <expression>%aditoprj%/entity/Contact_entity/recordcontainers/db/recordfieldmappings/department.displayvalue/expression.js</expression>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PICTURE.value</name>
+          <expression>%aditoprj%/entity/Contact_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <linkInformation>
         <linkInformation>
diff --git a/entity/Contact_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js b/entity/Contact_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
new file mode 100644
index 0000000000..443ec0029c
--- /dev/null
+++ b/entity/Contact_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
@@ -0,0 +1,12 @@
+import("Product_lib");
+import("Person_lib");
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.result");
+import("Sql_lib");
+
+var sqlMask = new SqlMaskingUtils();
+
+var sql = sqlMask.concatenate(["'TEXT:'", "ORGANISATION.NAME"]);
+
+result.string(sql.toString());
\ No newline at end of file
diff --git a/entity/DescriptionTranslation_entity/DescriptionTranslation_entity.aod b/entity/DescriptionTranslation_entity/DescriptionTranslation_entity.aod
index 0be0b503e6..de4a3074d3 100644
--- a/entity/DescriptionTranslation_entity/DescriptionTranslation_entity.aod
+++ b/entity/DescriptionTranslation_entity/DescriptionTranslation_entity.aod
@@ -69,6 +69,10 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityField>
+      <name>PICTURE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -100,6 +104,10 @@
           <name>LANG.displayValue</name>
           <expression>%aditoprj%/entity/DescriptionTranslation_entity/recordcontainers/db/recordfieldmappings/lang.displayvalue/expression.js</expression>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PICTURE.value</name>
+          <expression>%aditoprj%/entity/DescriptionTranslation_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <linkInformation>
         <linkInformation>
diff --git a/entity/DescriptionTranslation_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js b/entity/DescriptionTranslation_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
new file mode 100644
index 0000000000..7e503d7b46
--- /dev/null
+++ b/entity/DescriptionTranslation_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
@@ -0,0 +1,12 @@
+import("Product_lib");
+import("Person_lib");
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.result");
+import("Sql_lib");
+
+var sqlMask = new SqlMaskingUtils();
+
+var sql = sqlMask.concatenate(["'TEXT:'", "(" + LanguageKeywordUtils.getResolvedTitleSqlPart("DESCRIPTIONTRANSLATION.LANG") + ")"]);
+
+result.string(sql.toString());
diff --git a/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod b/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod
index 7f406a3337..bf8dd47ba4 100644
--- a/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod
+++ b/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod
@@ -88,7 +88,7 @@
     <entityField>
       <name>exportCount</name>
       <documentation>%aditoprj%/entity/ExportTemplateSelection_entity/entityfields/exportcount/documentation.adoc</documentation>
-      <titleProcess>%aditoprj%/entity/ExportTemplateSelection_entity/entityfields/exportcount/titleProcess.js</titleProcess>
+      <title>Datasets are exported</title>
       <valueProcess>%aditoprj%/entity/ExportTemplateSelection_entity/entityfields/exportcount/valueProcess.js</valueProcess>
     </entityField>
     <entityProvider>
diff --git a/entity/ExportTemplateSelection_entity/entityfields/exportcount/titleProcess.js b/entity/ExportTemplateSelection_entity/entityfields/exportcount/titleProcess.js
deleted file mode 100644
index d12a65747f..0000000000
--- a/entity/ExportTemplateSelection_entity/entityfields/exportcount/titleProcess.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import("system.translate");
-import("system.result");
-import("system.vars");
-
-var comingFrom = vars.get("$field.comingfrom")
-var res
-
-if(comingFrom == "Organisation")
-    res = translate.text("Organisations will be exported");
-else if(comingFrom == "Person")
-    res = translate.text("Contacts will be exported");
-
-result.string(res)
\ No newline at end of file
diff --git a/entity/ExportTemplate_entity/ExportTemplate_entity.aod b/entity/ExportTemplate_entity/ExportTemplate_entity.aod
index bc87544aeb..e1ad54b46f 100644
--- a/entity/ExportTemplate_entity/ExportTemplate_entity.aod
+++ b/entity/ExportTemplate_entity/ExportTemplate_entity.aod
@@ -185,7 +185,6 @@
     </entityConsumer>
     <entityField>
       <name>PICTURE</name>
-      <title>Picture</title>
       <contentType>IMAGE</contentType>
     </entityField>
   </entityFields>
diff --git a/entity/Forecast_entity/Forecast_entity.aod b/entity/Forecast_entity/Forecast_entity.aod
index a596f7e006..8d2b49c8a0 100644
--- a/entity/Forecast_entity/Forecast_entity.aod
+++ b/entity/Forecast_entity/Forecast_entity.aod
@@ -123,6 +123,10 @@
       <name>KIND</name>
       <valueProcess>%aditoprj%/entity/Forecast_entity/entityfields/kind/valueProcess.js</valueProcess>
     </entityField>
+    <entityField>
+      <name>PICTURE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -177,6 +181,10 @@
           <name>KIND.value</name>
           <recordfield>FORECAST.KIND</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PICTURE.value</name>
+          <expression>%aditoprj%/entity/Forecast_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <linkInformation>
         <linkInformation>
diff --git a/entity/Forecast_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js b/entity/Forecast_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
new file mode 100644
index 0000000000..d8a3ca2410
--- /dev/null
+++ b/entity/Forecast_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
@@ -0,0 +1,10 @@
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.result");
+import("Sql_lib");
+
+var sqlMask = new SqlMaskingUtils();
+
+var sql = sqlMask.concatenate(["'TEXT:'", KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.productGroupcode(), "FORECAST.GROUPCODE")]);
+
+result.string(sql.toString());
\ No newline at end of file
diff --git a/entity/InterestLink_entity/InterestLink_entity.aod b/entity/InterestLink_entity/InterestLink_entity.aod
index fc1a14a5db..1ac1a55774 100644
--- a/entity/InterestLink_entity/InterestLink_entity.aod
+++ b/entity/InterestLink_entity/InterestLink_entity.aod
@@ -100,6 +100,10 @@
       <iconId>VAADIN:CURLY_BRACKETS</iconId>
       <stateProcess>%aditoprj%/entity/InterestLink_entity/entityfields/openadminview/stateProcess.js</stateProcess>
     </entityActionField>
+    <entityField>
+      <name>PICTURE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -154,6 +158,10 @@
           <name>DATE_NEW.value</name>
           <recordfield>INTERESTLINK.DATE_NEW</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PICTURE.value</name>
+          <expression>%aditoprj%/entity/InterestLink_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <linkInformation>
         <linkInformation>
diff --git a/entity/InterestLink_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js b/entity/InterestLink_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
new file mode 100644
index 0000000000..96223909b2
--- /dev/null
+++ b/entity/InterestLink_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
@@ -0,0 +1,12 @@
+import("Product_lib");
+import("Person_lib");
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.result");
+import("Sql_lib");
+
+var sqlMask = new SqlMaskingUtils();
+
+var sql = sqlMask.concatenate(["'TEXT:'", "INTEREST.TITLE"]);
+
+result.string(sql.toString());
\ No newline at end of file
diff --git a/entity/Offeritem_entity/Offeritem_entity.aod b/entity/Offeritem_entity/Offeritem_entity.aod
index 5657ac3d3c..87a0d3f6ca 100644
--- a/entity/Offeritem_entity/Offeritem_entity.aod
+++ b/entity/Offeritem_entity/Offeritem_entity.aod
@@ -296,6 +296,10 @@
       <state>READONLY</state>
       <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/currency/valueProcess.js</valueProcess>
     </entityField>
+    <entityField>
+      <name>PICTURE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -408,6 +412,10 @@
           <name>DISCOUNT.displayValue</name>
           <expression>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/discount.displayvalue/expression.js</expression>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PICTURE.value</name>
+          <expression>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <linkInformation>
         <linkInformation>
diff --git a/entity/Offeritem_entity/entityfields/product_id/displayValueProcess.js b/entity/Offeritem_entity/entityfields/product_id/displayValueProcess.js
index e10bbc483b..34b95afc4d 100644
--- a/entity/Offeritem_entity/entityfields/product_id/displayValueProcess.js
+++ b/entity/Offeritem_entity/entityfields/product_id/displayValueProcess.js
@@ -1,6 +1,10 @@
+import("system.neon");
+import("Product_lib");
 import("system.vars");
 import("system.result");
 import("Sql_lib");
 
-if(vars.get("$field.PRODUCT_ID"))
-    result.string(newSelect("PRODUCT.PRODUCTNAME").from("PRODUCT").whereIfSet("PRODUCT.PRODUCTID", vars.get("$field.PRODUCT_ID")).cell());
\ No newline at end of file
+if(vars.get("$field.PRODUCT_ID") && vars.get("$sys.viewmode") != neon.FRAME_VIEWMODE_TABLE)
+{
+    result.string(ProductUtils.getProductName(vars.get("$field.PRODUCT_ID")));
+}
\ No newline at end of file
diff --git a/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js b/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
new file mode 100644
index 0000000000..266ce0e685
--- /dev/null
+++ b/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
@@ -0,0 +1,12 @@
+import("Product_lib");
+import("Person_lib");
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.result");
+import("Sql_lib");
+
+var sqlMask = new SqlMaskingUtils();
+
+var sql = sqlMask.concatenate(["'TEXT:'", "(" + ProductUtils.getProductNameSubSql("OFFERITEM.PRODUCT_ID") + ")"]);
+
+result.string(sql.toString());
\ No newline at end of file
diff --git a/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js b/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js
index 505fda0b8e..a3c7e1a4b0 100644
--- a/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js
+++ b/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js
@@ -1,5 +1,6 @@
+import("Product_lib");
 import("system.vars");
 import("system.result");
 
 // TODO: remove when #title is used as display value for lookups
-result.string("(select PRODUCT.PRODUCTNAME from PRODUCT where OFFERITEM.PRODUCT_ID = PRODUCT.PRODUCTID)");
\ No newline at end of file
+result.string(ProductUtils.getProductNameSubSql("OFFERITEM.PRODUCT_ID"));
\ No newline at end of file
diff --git a/entity/Orderitem_entity/Orderitem_entity.aod b/entity/Orderitem_entity/Orderitem_entity.aod
index 2ba72ab532..b6f5ec9513 100644
--- a/entity/Orderitem_entity/Orderitem_entity.aod
+++ b/entity/Orderitem_entity/Orderitem_entity.aod
@@ -278,6 +278,10 @@
       <state>READONLY</state>
       <valueProcess>%aditoprj%/entity/Orderitem_entity/entityfields/currency/valueProcess.js</valueProcess>
     </entityField>
+    <entityField>
+      <name>PICTURE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -368,6 +372,10 @@
           <isFilterable v="true" />
           <isLookupFilter v="true" />
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PICTURE.value</name>
+          <expression>%aditoprj%/entity/Orderitem_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <linkInformation>
         <linkInformation>
diff --git a/entity/Orderitem_entity/entityfields/product_id/displayValueProcess.js b/entity/Orderitem_entity/entityfields/product_id/displayValueProcess.js
index e10bbc483b..99ef423450 100644
--- a/entity/Orderitem_entity/entityfields/product_id/displayValueProcess.js
+++ b/entity/Orderitem_entity/entityfields/product_id/displayValueProcess.js
@@ -1,6 +1,10 @@
+import("Product_lib");
+import("system.neon");
 import("system.vars");
 import("system.result");
 import("Sql_lib");
 
-if(vars.get("$field.PRODUCT_ID"))
-    result.string(newSelect("PRODUCT.PRODUCTNAME").from("PRODUCT").whereIfSet("PRODUCT.PRODUCTID", vars.get("$field.PRODUCT_ID")).cell());
\ No newline at end of file
+if(vars.get("$field.PRODUCT_ID") && vars.get("$sys.viewmode") != neon.FRAME_VIEWMODE_TABLE)
+{
+    result.string(ProductUtils.getProductName(vars.get("$field.PRODUCT_ID")));
+}
\ No newline at end of file
diff --git a/entity/Orderitem_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js b/entity/Orderitem_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
new file mode 100644
index 0000000000..75190112fb
--- /dev/null
+++ b/entity/Orderitem_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
@@ -0,0 +1,12 @@
+import("Product_lib");
+import("Person_lib");
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.result");
+import("Sql_lib");
+
+var sqlMask = new SqlMaskingUtils();
+
+var sql = sqlMask.concatenate(["'TEXT:'", "(" + ProductUtils.getProductNameSubSql("SALESORDERITEM.PRODUCT_ID") + ")"]);
+
+result.string(sql.toString());
\ No newline at end of file
diff --git a/entity/Orderitem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js b/entity/Orderitem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js
index c356272a55..60e5f9a443 100644
--- a/entity/Orderitem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js
+++ b/entity/Orderitem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js
@@ -1,5 +1,6 @@
+import("Product_lib");
 import("system.vars");
 import("system.result");
 
 // TODO: remove when #title is used as display value for lookups
-result.string("(select PRODUCT.PRODUCTNAME from PRODUCT where SALESORDERITEM.PRODUCT_ID = PRODUCT.PRODUCTID)");
\ No newline at end of file
+result.string(ProductUtils.getProductNameSubSql("SALESORDERITEM.PRODUCT_ID"));
\ No newline at end of file
diff --git a/entity/Planning_entity/Planning_entity.aod b/entity/Planning_entity/Planning_entity.aod
index 7db241b3cd..272d77a080 100644
--- a/entity/Planning_entity/Planning_entity.aod
+++ b/entity/Planning_entity/Planning_entity.aod
@@ -197,6 +197,10 @@
       <name>PlanningIds_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityField>
+      <name>PICTURE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -259,6 +263,10 @@
           <name>GROUPCODE.displayValue</name>
           <expression>%aditoprj%/entity/Planning_entity/recordcontainers/db/recordfieldmappings/groupcode.displayvalue/expression.js</expression>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PICTURE.value</name>
+          <expression>%aditoprj%/entity/Planning_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <linkInformation>
         <linkInformation>
diff --git a/entity/Planning_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js b/entity/Planning_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
new file mode 100644
index 0000000000..efc140d384
--- /dev/null
+++ b/entity/Planning_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
@@ -0,0 +1,10 @@
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.result");
+import("Sql_lib");
+
+var sqlMask = new SqlMaskingUtils();
+
+var sql = sqlMask.concatenate(["'TEXT:'", KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.forecastStatus(), "FORECAST.STATUS")]);
+
+result.string(sql.toString());
\ No newline at end of file
diff --git a/entity/Prod2prod_entity/Prod2prod_entity.aod b/entity/Prod2prod_entity/Prod2prod_entity.aod
index 4136115ae9..2cc4ae001d 100644
--- a/entity/Prod2prod_entity/Prod2prod_entity.aod
+++ b/entity/Prod2prod_entity/Prod2prod_entity.aod
@@ -140,6 +140,10 @@
     <entityField>
       <name>UID</name>
     </entityField>
+    <entityField>
+      <name>PICTURE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -190,6 +194,9 @@
         <jDitoRecordFieldMapping>
           <name>unit.displayValue</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>PICTURE.value</name>
+        </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>currentPurchasePrice.value</name>
         </jDitoRecordFieldMapping>
diff --git a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
index bb1b8c2231..9c60cc28a8 100644
--- a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
@@ -7,6 +7,8 @@ import("Sql_lib");
 import("Keyword_lib");
 import("KeywordRegistry_basic");
 
+var sqlMask = new SqlMaskingUtils();
+
 var query = newSelect([
     "PROD2PROD.PROD2PRODID",                // UID.value
     "PROD2PROD.PROD2PRODID",                // PROD2PRODID.value
@@ -23,7 +25,8 @@ var query = newSelect([
     KeywordUtils.getResolvedTitleSqlPart(   // unit.displaValue
         $KeywordRegistry.quantityUnit(),
         "PRODUCT.UNIT"
-    )
+    ),
+    sqlMask.concatenate(["'TEXT:'", "PRODUCT.PRODUCTCODE"])
 ]).from("PROD2PROD")
 .join("PRODUCT", "PRODUCT.PRODUCTID = PROD2PROD.SOURCE_ID");
 
diff --git a/entity/Timetracking_entity/Timetracking_entity.aod b/entity/Timetracking_entity/Timetracking_entity.aod
index bf1a1db9fb..8422d4687a 100644
--- a/entity/Timetracking_entity/Timetracking_entity.aod
+++ b/entity/Timetracking_entity/Timetracking_entity.aod
@@ -114,6 +114,10 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityField>
+      <name>PICTURE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -154,6 +158,10 @@
           <name>TRACKINGMINUTES.value</name>
           <recordfield>TIMETRACKING.TRACKINGMINUTES</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PICTURE.value</name>
+          <expression>%aditoprj%/entity/Timetracking_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <linkInformation>
         <linkInformation>
diff --git a/entity/Timetracking_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js b/entity/Timetracking_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js
index 418c211fe3..e6b609c1fc 100644
--- a/entity/Timetracking_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js
+++ b/entity/Timetracking_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js
@@ -1,4 +1,4 @@
 import("system.result");
 import("Person_lib");
 
-result.string(PersUtils.getResolvingDisplaySubSql("CONTACT_ID"))
\ No newline at end of file
+result.string(PersUtils.getResolvingDisplaySubSql("CONTACT_ID"));
\ No newline at end of file
diff --git a/entity/Timetracking_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js b/entity/Timetracking_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
new file mode 100644
index 0000000000..e1797504c1
--- /dev/null
+++ b/entity/Timetracking_entity/recordcontainers/db/recordfieldmappings/picture.value/expression.js
@@ -0,0 +1,14 @@
+import("Person_lib");
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.result");
+import("Sql_lib");
+
+var sqlMask = new SqlMaskingUtils();
+
+var sql = sqlMask.concatenate(["'TEXT:'", "(" + newSelect(sqlMask.concatenate(["FIRSTNAME, ' ', LASTNAME"]))
+    .from("PERSON")
+    .join("CONTACT", "PERSON_ID = PERSONID")
+    .where("CONTACT.CONTACTID = TIMETRACKING.CONTACT_ID") + ")"]);
+
+result.string(sql.toString());
\ No newline at end of file
diff --git a/neonView/AdvertisingFilter_view/AdvertisingFilter_view.aod b/neonView/AdvertisingFilter_view/AdvertisingFilter_view.aod
index 842cca711c..0142ccd3be 100644
--- a/neonView/AdvertisingFilter_view/AdvertisingFilter_view.aod
+++ b/neonView/AdvertisingFilter_view/AdvertisingFilter_view.aod
@@ -16,7 +16,7 @@
       <columns>
         <neonTableColumn>
           <name>8c3e1048-7f7a-4210-a849-198f5b569c04</name>
-          <entityField>#ICON</entityField>
+          <entityField>PICTURE</entityField>
         </neonTableColumn>
         <neonTableColumn>
           <name>b8971987-29bb-48dc-b9fc-075a63ef0b4e</name>
diff --git a/neonView/AdvertisingPreview_view/AdvertisingPreview_view.aod b/neonView/AdvertisingPreview_view/AdvertisingPreview_view.aod
index d8d0a57add..7f185600c6 100644
--- a/neonView/AdvertisingPreview_view/AdvertisingPreview_view.aod
+++ b/neonView/AdvertisingPreview_view/AdvertisingPreview_view.aod
@@ -11,7 +11,7 @@
   <children>
     <cardViewTemplate>
       <name>Card</name>
-      <iconField>#ICON</iconField>
+      <iconField>PICTURE</iconField>
       <titleField>STATUS</titleField>
       <subtitleField>CONTACT_ID</subtitleField>
       <descriptionField>RESPONSIBLE_ID</descriptionField>
diff --git a/neonView/CommunicationSettingsFilter_view/CommunicationSettingsFilter_view.aod b/neonView/CommunicationSettingsFilter_view/CommunicationSettingsFilter_view.aod
index 7c2518ba09..9ed01d96a4 100644
--- a/neonView/CommunicationSettingsFilter_view/CommunicationSettingsFilter_view.aod
+++ b/neonView/CommunicationSettingsFilter_view/CommunicationSettingsFilter_view.aod
@@ -14,7 +14,7 @@
       <columns>
         <neonTreeTableColumn>
           <name>1e698c64-ce5c-46d1-8c90-290d5ea187c7</name>
-          <entityField>ICON</entityField>
+          <entityField>PICTURE</entityField>
         </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>5738f47a-57cd-4e6a-a017-1a5ab80581ac</name>
diff --git a/neonView/CommunicationSettingsPreview_view/CommunicationSettingsPreview_view.aod b/neonView/CommunicationSettingsPreview_view/CommunicationSettingsPreview_view.aod
index 80f8488429..41516c7ace 100644
--- a/neonView/CommunicationSettingsPreview_view/CommunicationSettingsPreview_view.aod
+++ b/neonView/CommunicationSettingsPreview_view/CommunicationSettingsPreview_view.aod
@@ -11,7 +11,7 @@
   <children>
     <cardViewTemplate>
       <name>Card</name>
-      <iconField>ICON</iconField>
+      <iconField>PICTURE</iconField>
       <titleField>#CONTENTTITLE</titleField>
       <subtitleField>STATUS</subtitleField>
       <isEditable v="false" />
diff --git a/neonView/ContactList_view/ContactList_view.aod b/neonView/ContactList_view/ContactList_view.aod
index f5f7695c21..0b8de21bdc 100644
--- a/neonView/ContactList_view/ContactList_view.aod
+++ b/neonView/ContactList_view/ContactList_view.aod
@@ -15,6 +15,10 @@
       <isDeletable v="false" />
       <isEditable v="false" />
       <columns>
+        <neonTableColumn>
+          <name>5c3b4a01-f8d6-45df-92aa-8e39c94789f5</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>ef71b5ad-8581-4845-ae66-7df17d1459e0</name>
           <entityField>ORGANISATION_CONTACTID</entityField>
diff --git a/neonView/DescriptionTranslationFilter_view/DescriptionTranslationFilter_view.aod b/neonView/DescriptionTranslationFilter_view/DescriptionTranslationFilter_view.aod
index ba3690b8e6..3dc9a54ea8 100644
--- a/neonView/DescriptionTranslationFilter_view/DescriptionTranslationFilter_view.aod
+++ b/neonView/DescriptionTranslationFilter_view/DescriptionTranslationFilter_view.aod
@@ -12,6 +12,10 @@
       <name>translation</name>
       <entityField>#ENTITY</entityField>
       <columns>
+        <neonTableColumn>
+          <name>b33e3ff8-ec3a-4d5d-8961-3b18175502a3</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>4bdaf352-d5f1-44a1-9cca-7cb877928ba5</name>
           <entityField>LANG</entityField>
@@ -26,6 +30,10 @@
       <name>Treetable</name>
       <entityField>#ENTITY</entityField>
       <columns>
+        <neonTreeTableColumn>
+          <name>5303f922-1e77-48db-94b3-f803e10f91c3</name>
+          <entityField>PICTURE</entityField>
+        </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>a9046b9c-0324-4e19-a22b-ae39c6a1c8c4</name>
           <entityField>LANG</entityField>
diff --git a/neonView/DescriptionTranslationPreview_view/DescriptionTranslationPreview_view.aod b/neonView/DescriptionTranslationPreview_view/DescriptionTranslationPreview_view.aod
index 6d15eecc7d..907c3d70c5 100644
--- a/neonView/DescriptionTranslationPreview_view/DescriptionTranslationPreview_view.aod
+++ b/neonView/DescriptionTranslationPreview_view/DescriptionTranslationPreview_view.aod
@@ -10,19 +10,11 @@
     </boxLayout>
   </layout>
   <children>
-    <genericViewTemplate>
-      <name>TranslationInfo</name>
-      <showDrawer v="true" />
-      <drawerCaption>Description</drawerCaption>
-      <hideLabels v="true" />
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>5e432839-ca9a-4a29-8006-0a1673d94c92</name>
-          <entityField>LANG</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
+    <cardViewTemplate>
+      <name>Card</name>
+      <iconField>PICTURE</iconField>
+      <titleField>LANG</titleField>
+    </cardViewTemplate>
     <genericViewTemplate>
       <name>Description</name>
       <showDrawer v="true" />
diff --git a/neonView/ForecastFilter_view/ForecastFilter_view.aod b/neonView/ForecastFilter_view/ForecastFilter_view.aod
index 2003610345..f232cf1d4c 100644
--- a/neonView/ForecastFilter_view/ForecastFilter_view.aod
+++ b/neonView/ForecastFilter_view/ForecastFilter_view.aod
@@ -18,6 +18,10 @@
         <element>INFO</element>
       </editableColumns>
       <columns>
+        <neonTableColumn>
+          <name>68de81f0-00c6-4e11-a8d3-2922a202a1b0</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>ed63515d-4c7b-4e40-92b0-81fa1395b0f1</name>
           <entityField>GROUPCODE</entityField>
@@ -50,6 +54,10 @@
       <subtitleField>VOLUME</subtitleField>
       <entityField>#ENTITY</entityField>
       <columns>
+        <neonTableColumn>
+          <name>b7acab7d-5e92-45b5-9b41-e653ee1e5679</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>323f26d7-4ac2-4ff9-91d1-7459cc7e3469</name>
           <entityField>GROUPCODE</entityField>
@@ -72,6 +80,10 @@
       <name>Treetable</name>
       <entityField>#ENTITY</entityField>
       <columns>
+        <neonTreeTableColumn>
+          <name>a6a83c1c-6ea0-4f06-bf8a-8d6b071b1a64</name>
+          <entityField>PICTURE</entityField>
+        </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>9bdb1cf9-5348-464d-84fb-747d509b0eef</name>
           <entityField>GROUPCODE</entityField>
diff --git a/neonView/ForecastPreview_view/ForecastPreview_view.aod b/neonView/ForecastPreview_view/ForecastPreview_view.aod
index c358340227..83d8efb894 100644
--- a/neonView/ForecastPreview_view/ForecastPreview_view.aod
+++ b/neonView/ForecastPreview_view/ForecastPreview_view.aod
@@ -11,6 +11,7 @@
   <children>
     <cardViewTemplate>
       <name>Header</name>
+      <iconField>PICTURE</iconField>
       <titleField>GROUPCODE</titleField>
       <descriptionField>DATE_START</descriptionField>
       <entityField>#ENTITY</entityField>
diff --git a/neonView/InterestLinkFilter_view/InterestLinkFilter_view.aod b/neonView/InterestLinkFilter_view/InterestLinkFilter_view.aod
index 162387862c..7b5f66f6dd 100644
--- a/neonView/InterestLinkFilter_view/InterestLinkFilter_view.aod
+++ b/neonView/InterestLinkFilter_view/InterestLinkFilter_view.aod
@@ -12,6 +12,10 @@
     <tableViewTemplate>
       <name>Table</name>
       <columns>
+        <neonTableColumn>
+          <name>435b5eb5-3854-4906-bd93-dbfed0bbe01c</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>261f0387-dd00-486d-add4-56d0c64be583</name>
           <entityField>INTEREST_ID</entityField>
diff --git a/neonView/OfferitemFilter_view/OfferitemFilter_view.aod b/neonView/OfferitemFilter_view/OfferitemFilter_view.aod
index ce595dd965..f7aa53c60c 100644
--- a/neonView/OfferitemFilter_view/OfferitemFilter_view.aod
+++ b/neonView/OfferitemFilter_view/OfferitemFilter_view.aod
@@ -18,6 +18,10 @@
       </editableColumns>
       <favoriteActionGroup1>group</favoriteActionGroup1>
       <columns>
+        <neonTableColumn>
+          <name>10cd8712-bb90-4c03-ac07-10d318c1e6e9</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTreeTableColumn>
           <name>91e85f61-5e5d-48f8-aeb1-a5740ec07e25</name>
           <entityField>ITEMPOSITION</entityField>
@@ -82,6 +86,10 @@
       <entityField>#ENTITY</entityField>
       <favoriteActionGroup1>group</favoriteActionGroup1>
       <columns>
+        <neonTreeTableColumn>
+          <name>6f0c91ac-1e3a-4d42-a063-b7daf1805a1e</name>
+          <entityField>PICTURE</entityField>
+        </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>91e85f61-5e5d-48f8-aeb1-a5740ec07e25</name>
           <entityField>ITEMPOSITION</entityField>
diff --git a/neonView/OfferitemPreview_view/OfferitemPreview_view.aod b/neonView/OfferitemPreview_view/OfferitemPreview_view.aod
index 9f7d0ff449..719a8984f8 100644
--- a/neonView/OfferitemPreview_view/OfferitemPreview_view.aod
+++ b/neonView/OfferitemPreview_view/OfferitemPreview_view.aod
@@ -8,6 +8,12 @@
     </boxLayout>
   </layout>
   <children>
+    <cardViewTemplate>
+      <name>Card</name>
+      <iconField>PICTURE</iconField>
+      <titleField>PRODUCT_ID</titleField>
+      <subtitleField>ITEMPOSITION</subtitleField>
+    </cardViewTemplate>
     <genericViewTemplate>
       <name>Info</name>
       <showDrawer v="true" />
@@ -15,15 +21,7 @@
       <entityField>#ENTITY</entityField>
       <fields>
         <entityFieldLink>
-          <name>171901d8-32a2-4689-aeb3-e00936172330</name>
-          <entityField>ITEMPOSITION</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>335b6954-46ab-4235-9681-3ebd261af72a</name>
-          <entityField>PRODUCT_ID</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>e792d720-187f-4aa1-917c-1c8065222b72</name>
+          <name>f0a31e9a-4e20-474b-85a4-07dd46062486</name>
           <entityField>QUANTITY</entityField>
         </entityFieldLink>
         <entityFieldLink>
@@ -42,6 +40,10 @@
           <name>b161516e-f1ee-47c6-ae92-a37bbe0ae564</name>
           <entityField>TotalPrice</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>69948799-9ec2-4fba-843d-7b86f9e4585f</name>
+          <entityField>TotalPrice</entityField>
+        </entityFieldLink>
         <entityFieldLink>
           <name>f8043352-f756-4854-9caa-a9aea073e4fe</name>
           <entityField>DISCOUNT</entityField>
@@ -50,10 +52,6 @@
           <name>e25386dc-a740-4f93-a1f0-32317cf5a36a</name>
           <entityField>OPTIONAL</entityField>
         </entityFieldLink>
-        <entityFieldLink>
-          <name>69948799-9ec2-4fba-843d-7b86f9e4585f</name>
-          <entityField>TotalPrice</entityField>
-        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <genericViewTemplate>
diff --git a/neonView/OrderitemFilter_view/OrderitemFilter_view.aod b/neonView/OrderitemFilter_view/OrderitemFilter_view.aod
index 5696e2e72d..289133336b 100644
--- a/neonView/OrderitemFilter_view/OrderitemFilter_view.aod
+++ b/neonView/OrderitemFilter_view/OrderitemFilter_view.aod
@@ -16,6 +16,10 @@
       <entityField>#ENTITY</entityField>
       <favoriteActionGroup1>group</favoriteActionGroup1>
       <columns>
+        <neonTableColumn>
+          <name>e34ac276-72e4-4699-a564-830a3dd1aa46</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>8c74810d-d127-4e64-8fbf-1b3db1835232</name>
           <entityField>ITEMPOSITION</entityField>
@@ -59,6 +63,10 @@
       <entityField>#ENTITY</entityField>
       <favoriteActionGroup1>group</favoriteActionGroup1>
       <columns>
+        <neonTreeTableColumn>
+          <name>63a667e9-3729-4ceb-98db-bb4d39bf6420</name>
+          <entityField>PICTURE</entityField>
+        </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>d07130dd-7727-45cc-8f8c-ae5d2972d21d</name>
           <entityField>ITEMPOSITION</entityField>
@@ -107,6 +115,10 @@
         <element>INFO</element>
       </editableColumns>
       <columns>
+        <neonTableColumn>
+          <name>85d30b0c-1e03-4b46-a4d1-caa3e2e7e589</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>5bc12f25-59d4-49b5-bbb8-4ff791303cb7</name>
           <entityField>ITEMPOSITION</entityField>
diff --git a/neonView/OrderitemPreview_view/OrderitemPreview_view.aod b/neonView/OrderitemPreview_view/OrderitemPreview_view.aod
index ccbae0155b..554b0bdc40 100644
--- a/neonView/OrderitemPreview_view/OrderitemPreview_view.aod
+++ b/neonView/OrderitemPreview_view/OrderitemPreview_view.aod
@@ -8,20 +8,18 @@
     </headerFooterLayout>
   </layout>
   <children>
+    <cardViewTemplate>
+      <name>Card</name>
+      <iconField>PICTURE</iconField>
+      <titleField>PRODUCT_ID</titleField>
+      <subtitleField>ITEMPOSITION</subtitleField>
+    </cardViewTemplate>
     <genericViewTemplate>
       <name>Info</name>
       <showDrawer v="true" />
       <drawerCaption>Details</drawerCaption>
       <entityField>#ENTITY</entityField>
       <fields>
-        <entityFieldLink>
-          <name>ad4fb267-277c-47ca-ad3d-c518cd234a39</name>
-          <entityField>ITEMPOSITION</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>a704c785-f27f-431b-a6ac-77fd21217d9d</name>
-          <entityField>PRODUCT_ID</entityField>
-        </entityFieldLink>
         <entityFieldLink>
           <name>d501d9d5-f149-4685-903d-0394dc6e40e2</name>
           <entityField>QUANTITY</entityField>
diff --git a/neonView/PlanningFilter_view/PlanningFilter_view.aod b/neonView/PlanningFilter_view/PlanningFilter_view.aod
index 93e3ba9a59..8e3102318e 100644
--- a/neonView/PlanningFilter_view/PlanningFilter_view.aod
+++ b/neonView/PlanningFilter_view/PlanningFilter_view.aod
@@ -13,6 +13,10 @@
       <name>Table</name>
       <favoriteActionGroup1>FilterViewActions</favoriteActionGroup1>
       <columns>
+        <neonTableColumn>
+          <name>b0c6fa20-9647-4a78-a6bf-006da824826d</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>2024c784-29c3-498b-80b3-f2e378f25773</name>
           <entityField>CONTACT_ID</entityField>
@@ -47,6 +51,10 @@
       <name>TreeTable</name>
       <favoriteActionGroup1>FilterViewActions</favoriteActionGroup1>
       <columns>
+        <neonTreeTableColumn>
+          <name>1e6b027f-2c23-42e7-995f-aa291b9ecb7d</name>
+          <entityField>PICTURE</entityField>
+        </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>9664cd27-0bd3-48e1-bc4e-b80e8ce52c64</name>
           <entityField>CONTACT_ID</entityField>
@@ -84,6 +92,10 @@
       </editableColumns>
       <favoriteActionGroup1>FilterViewActions</favoriteActionGroup1>
       <columns>
+        <neonTableColumn>
+          <name>40c6e73b-bf74-4ebe-bdb3-a81431fb3179</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>9dc22f85-20d3-4891-810e-74570c1faf80</name>
           <entityField>FORECAST_YEAR</entityField>
diff --git a/neonView/PlanningMultiEditOverlay_view/PlanningMultiEditOverlay_view.aod b/neonView/PlanningMultiEditOverlay_view/PlanningMultiEditOverlay_view.aod
index e190fa525c..4636aeff1d 100644
--- a/neonView/PlanningMultiEditOverlay_view/PlanningMultiEditOverlay_view.aod
+++ b/neonView/PlanningMultiEditOverlay_view/PlanningMultiEditOverlay_view.aod
@@ -19,6 +19,10 @@
       <isDeletable v="false" />
       <isEditable v="false" />
       <columns>
+        <neonTableColumn>
+          <name>dd5202ce-c167-46d2-a606-bafc64ca1d46</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>bb541f09-5a3c-4905-a73e-4a94b8dd4aba</name>
           <entityField>CONTACT_ID</entityField>
diff --git a/neonView/PlanningOrganisationFilter_view/PlanningOrganisationFilter_view.aod b/neonView/PlanningOrganisationFilter_view/PlanningOrganisationFilter_view.aod
index ed4339a63e..86ec2ce27a 100644
--- a/neonView/PlanningOrganisationFilter_view/PlanningOrganisationFilter_view.aod
+++ b/neonView/PlanningOrganisationFilter_view/PlanningOrganisationFilter_view.aod
@@ -16,6 +16,10 @@
       </editableColumns>
       <favoriteActionGroup1>FilterViewActions</favoriteActionGroup1>
       <columns>
+        <neonTableColumn>
+          <name>6c6cdc5d-1c78-4445-ae4f-361cd40563a0</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>9dc22f85-20d3-4891-810e-74570c1faf80</name>
           <entityField>FORECAST_YEAR</entityField>
@@ -64,6 +68,10 @@
       <name>Table</name>
       <favoriteActionGroup1>FilterViewActions</favoriteActionGroup1>
       <columns>
+        <neonTableColumn>
+          <name>58ecb5ec-ea5f-4a35-b76b-f6b855b2762e</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>2024c784-29c3-498b-80b3-f2e378f25773</name>
           <entityField>CONTACT_ID</entityField>
@@ -98,6 +106,10 @@
       <name>TreeTable</name>
       <favoriteActionGroup1>FilterViewActions</favoriteActionGroup1>
       <columns>
+        <neonTreeTableColumn>
+          <name>33dab0a4-01f6-48b9-b1e0-6bd5b089d2d7</name>
+          <entityField>PICTURE</entityField>
+        </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>9664cd27-0bd3-48e1-bc4e-b80e8ce52c64</name>
           <entityField>CONTACT_ID</entityField>
diff --git a/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod b/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod
index c009ab9b93..ef67b19dbe 100644
--- a/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod
+++ b/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod
@@ -20,6 +20,10 @@
       </devices>
       <title>Parts list</title>
       <columns>
+        <neonTreeTableColumn>
+          <name>20ab6e11-ed41-4e54-973a-fa3be1be0764</name>
+          <entityField>PICTURE</entityField>
+        </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>43d3c9b0-21ab-4996-8d24-af74a5ee1e1a</name>
           <entityField>PRODUCTCODE</entityField>
@@ -63,6 +67,10 @@
         <element>TAKEPRICE</element>
       </editableColumns>
       <columns>
+        <neonTableColumn>
+          <name>6804d8c8-4eea-4d10-acf3-beb7e3e69244</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>82c22185-4532-4084-a7d2-0f64270e50b4</name>
           <entityField>PRODUCTCODE</entityField>
diff --git a/neonView/TimetrackingFilter_view/TimetrackingFilter_view.aod b/neonView/TimetrackingFilter_view/TimetrackingFilter_view.aod
index 4a8121fb00..cb734d95b7 100644
--- a/neonView/TimetrackingFilter_view/TimetrackingFilter_view.aod
+++ b/neonView/TimetrackingFilter_view/TimetrackingFilter_view.aod
@@ -18,6 +18,10 @@
       <descriptionField>TRACKINGDATE</descriptionField>
       <entityField>#ENTITY</entityField>
       <columns>
+        <neonTableColumn>
+          <name>162997d8-5ea1-4ee2-9fb1-add45d2a0d52</name>
+          <entityField>PICTURE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>fa423332-8987-4fc2-981c-66447678b922</name>
           <entityField>TRACKINGDATE</entityField>
@@ -40,6 +44,10 @@
       <name>Treetable</name>
       <entityField>#ENTITY</entityField>
       <columns>
+        <neonTreeTableColumn>
+          <name>d20a13e9-97e1-461e-8aab-8dec1a23a647</name>
+          <entityField>PICTURE</entityField>
+        </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>314436db-0a9e-4113-ab70-7922a7a03ab5</name>
           <entityField>TRACKINGDATE</entityField>
diff --git a/neonView/TimetrackingPreview_view/TimetrackingPreview_view.aod b/neonView/TimetrackingPreview_view/TimetrackingPreview_view.aod
index 59b86472d8..8072e61cb5 100644
--- a/neonView/TimetrackingPreview_view/TimetrackingPreview_view.aod
+++ b/neonView/TimetrackingPreview_view/TimetrackingPreview_view.aod
@@ -8,26 +8,13 @@
     </headerFooterLayout>
   </layout>
   <children>
-    <genericViewTemplate>
-      <name>Details</name>
-      <showDrawer v="true" />
-      <drawerCaption>Details</drawerCaption>
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>835197c0-2e0c-4989-8d5b-80ccd064d55e</name>
-          <entityField>CONTACT_ID</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>ce7d8cc0-ac9c-4195-861f-23483db6cd91</name>
-          <entityField>TRACKINGDATE</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>45f4f97c-5fde-4c90-9dba-4e5b540328b3</name>
-          <entityField>TRACKINGMINUTES</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
+    <cardViewTemplate>
+      <name>Card</name>
+      <iconField>PICTURE</iconField>
+      <titleField>CONTACT_ID</titleField>
+      <subtitleField>TRACKINGDATE</subtitleField>
+      <informationField>TRACKINGMINUTES</informationField>
+    </cardViewTemplate>
     <genericViewTemplate>
       <name>Info</name>
       <showDrawer v="true" />
diff --git a/process/Product_lib/process.js b/process/Product_lib/process.js
index 8f4bb1eed7..51f13baf3e 100644
--- a/process/Product_lib/process.js
+++ b/process/Product_lib/process.js
@@ -410,6 +410,34 @@ ProductUtils.removeImage = function(pProductId)
     return ImageUtils.remove("PRODUCT", "IMAGE", pProductId);
 }
 
+/**
+ * returns the product name for the productid
+ * 
+ * @param {String} pProductId the id of the product.
+ * @return {String} the name of the product
+ */
+ProductUtils.getProductName = function(pProductId)
+{
+    return newSelect("PRODUCT.PRODUCTNAME")
+    .from("PRODUCT")
+    .whereIfSet("PRODUCT.PRODUCTID", pProductId)
+    .cell();
+}
+
+/**
+ * returns the product name for the productid
+ * 
+ * @param {String} pProductIdColumn the productIdColumn
+ * @return {String} the name of the product as subSQL
+ */
+ProductUtils.getProductNameSubSql = function(pProductIdColumn)
+{
+    return newSelect("PRODUCT.PRODUCTNAME")
+    .from("PRODUCT")
+    .whereIfSet("PRODUCT.PRODUCTID = " + pProductIdColumn)
+    .toString();
+}
+
 /**
  * Class containing utility functions for Prod2Prod (Parts list)
  * 
-- 
GitLab