From 0dcd0be01d3e6976f17284288a55bfadbe47ee82 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Wed, 17 Jul 2024 23:07:54 +0200
Subject: [PATCH] WIP: running

---
 src/core/js/ext_references.js                 | 104 +++++++++++++++---
 .../caosdb_default_person.js                  |  30 +++--
 2 files changed, 103 insertions(+), 31 deletions(-)

diff --git a/src/core/js/ext_references.js b/src/core/js/ext_references.js
index 13210b60..a6b7f42d 100644
--- a/src/core/js/ext_references.js
+++ b/src/core/js/ext_references.js
@@ -275,8 +275,9 @@ var resolve_references =
          * named `par`.
          *
          * @param {HTMLElement} entity - entity in HTML
-         *     representation.  @param
-         * {string} par - parent name.  @return {boolean}
+         *     representation.  
+         * @param {string} par - parent name.  
+         * @return {boolean}
          */
         this.is_child =
             function(entity, par) {
@@ -289,6 +290,45 @@ var resolve_references =
                 return false;
             };
 
+        /**
+         * Return true iff the entity has at least one direct parent
+         * named `par`.
+         *
+         * @param {GRPC Entity} entity - GRPC entity object
+         * @param {string} par - parent name.  
+         * @return {boolean}
+         */
+        this.is_child_g =
+            function(entity, par) {
+                var pars = []
+                entity.getParentsList().forEach((e)=>{pars.push(e.getName().toLowerCase())});
+                if (pars.indexOf(par.toLowerCase())!=-1){
+                    return true;
+                } else {
+                    return false;
+                }
+            };
+
+        /**
+         * Return the value of the property with the given name
+         *
+         * @param {GRPC Entity} entity - GRPC entity object
+         * @param {string} pname - property name
+         * @return {object}
+         */
+        this.get_property_g =
+            function(entity, pname) {
+                var pnames = [];
+                entity.getPropertiesList().forEach((e)=>{pnames.push(e.getName().toLowerCase())});
+                var index = pnames.indexOf(pname.toLowerCase());
+                if (index!=-1){
+                    return entity.getPropertiesList()[index].getValue();
+                } else {
+                    return null;
+                }
+            };
+
+
         /**
          * @typedef {reference_info}
          * @property {string} text
@@ -324,23 +364,26 @@ var resolve_references =
          * is to be resolved.  @return {reference_info}
          */
         this.resolve_reference =
-            async function(id) {
+            async function(entity) {
                 const custom_reference_resolver =
                     window["${BUILD_EXT_REFERENCES_CUSTOM_RESOLVER}"];
                 if (custom_reference_resolver &&
                     typeof custom_reference_resolver.resolve === "function") {
                     // try custom_reference_resolver and fall-back to standard
                     // implementation
-                    var ret = await custom_reference_resolver.resolve(id);
-                    if (ret) {
-                        return ret;
+                    if (custom_reference_resolver.new_resolve) {
+                        var ret = await custom_reference_resolver.resolve(entity);
+                        if (ret) {
+                            return ret;
+                        }
+                    } else {
+                        var ret = await custom_reference_resolver.resolve(entity.getId());
+                        if (ret) {
+                            return ret;
+                        }
                     }
                 }
 
-
-
-                const entity = (await resolve_references.retrieve(id))[0];
-
                 // TODO handle multiple parents
                 const par = resolve_references.getParents(entity)[0] || {};
                 const name = getEntityName(entity);
@@ -394,13 +437,20 @@ var resolve_references =
          * @return {reference_info} the resolved reference information
          */
         this.update_single_resolvable_reference =
-            async function(rs) {
+            async function(rs, entities_prom) {
                 $(rs).find(".caosdb-id-button").hide();
                 const target = resolve_references.add_target(rs);
+                const entities=await entities_prom;
                 const id = getEntityID(rs);
+                const entity = entities[id];
+                if (entity.getId()!=id){
+                    console.error("IDs do not match!!!!");
+                }
+                console.log("Entity looks good!!!!");
+                console.log(typeof entity.getParentsList==="function");
                 target.textContent = id;
                 const resolved_entity_info =
-                    (await resolve_references.resolve_reference(id));
+                    (await resolve_references.resolve_reference(entity));
                 target.textContent = resolved_entity_info.text;
                 return resolved_entity_info;
             };
@@ -442,6 +492,22 @@ var resolve_references =
                     .toArray();
             };
 
+        /**
+         * This function retrieves all entities corresponding to the given 
+         * IDs.
+         *
+         * @param {Set} ids
+         */
+        this._create_entity_dict = async function(ids) {
+            resp = await GrpcTransactionService.retrieve(Array.from(ids));
+            edict = {};
+            for (eresp of resp.getResponsesList()) {
+                var ent = eresp.getRetrieveResponse().getEntityResponse().getEntity();
+                edict[ent.getId()] = ent;
+            }
+            return edict;
+        }
+
         /**
          * This function updates all references in the body which are inside
          * of the current viewport.
@@ -485,7 +551,8 @@ var resolve_references =
                             // the view port.
                             const first_ref_info =
                                 await resolve_references.update_single_resolvable_reference(
-                                    rs[0]);
+                                    rs[0], 
+                                    resolve_references._create_entity_dict([getEntityID(rs[0])]));
 
                             first_ref_info["index"] = 0;
 
@@ -497,11 +564,16 @@ var resolve_references =
                                     resolve_references.add_summary_field(property_value);
 
                                 // collect ref infos for the summary
+                                const entity_ids = new Set
+                                for (var j = 1; j < rs.length; j++) {
+                                    entity_ids.add(getEntityID(rs[j]))
+                                }
+                                entities_prom = resolve_references._create_entity_dict(ids);
                                 const ref_infos = [first_ref_info];
                                 for (var j = 1; j < rs.length; j++) {
                                     const ref_info =
                                         resolve_references.update_single_resolvable_reference(
-                                            rs[j]);
+                                            rs[j], entities_prom);
                                     ref_info["index"] = j;
                                     ref_infos.push(ref_info);
                                 }
@@ -550,7 +622,9 @@ var resolve_references =
 
                         // discard return value as it is not needed for any summary
                         // generation as above.
-                        resolve_references.update_single_resolvable_reference(rs[i]);
+                        resolve_references.update_single_resolvable_reference(
+                                    rs[i], 
+                                    resolve_references._create_entity_dict([getEntityID(rs[i])]));
                     }
                 }
             }
diff --git a/src/core/js/reference_resolver/caosdb_default_person.js b/src/core/js/reference_resolver/caosdb_default_person.js
index f8aa34c5..fc4eb61b 100644
--- a/src/core/js/reference_resolver/caosdb_default_person.js
+++ b/src/core/js/reference_resolver/caosdb_default_person.js
@@ -42,24 +42,22 @@ var caosdb_default_person_reference = new function () {
     /**
      * Return the name of a person as firstname + lastname
      */
-    this.get_person_str = function (el) {
-        var valpr = getProperties(el);
-        if (valpr == undefined) {
-            return;
+    this.get_person_str = function (entity) {
+        var lname  =""
+        if (resolve_references.get_property_g(entity, lastname_prop_name)!=null){
+            lname = resolve_references.get_property_g(entity, lastname_prop_name).getScalarValue().getStringValue();
         }
-        return valpr.filter(valprel =>
-                valprel.name.toLowerCase().trim() ==
-                firstname_prop_name.toLowerCase())[0].value +
-            " " +
-            valpr.filter(valprel => valprel.name.toLowerCase().trim() ==
-                lastname_prop_name.toLowerCase())[0].value;
+        var fname =""
+        if (resolve_references.get_property_g(entity, firstname_prop_name)!=null){
+            fname= resolve_references.get_property_g(entity, firstname_prop_name).getScalarValue().getStringValue();
+        }
+        return fname+" " +lname;
     }
-
-    this.resolve = async function (id) {
-
-        const entity = (await resolve_references.retrieve(id))[0];
-
-        if (resolve_references.is_child(entity, person_rt_name)) {
+    this.new_resolve = true; // enable new syntax
+    this.resolve = async function (entity) {
+        console.log("whats that?");
+        console.log(entity);
+        if (resolve_references.is_child_g(entity, person_rt_name)) {
             return {
                 "text": caosdb_default_person_reference.get_person_str(entity)
             };
-- 
GitLab