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