diff --git a/src/core/js/ext_map.js b/src/core/js/ext_map.js index f0283cddc4940dc5ac56594a0a1b2fda7f9ea047..96ce6a2c83b1a7eda7d7a76fae1d6dd88e24ce80 100644 --- a/src/core/js/ext_map.js +++ b/src/core/js/ext_map.js @@ -601,9 +601,17 @@ var caosdb_map = new function () { * @returns {HTMLElement} a popup element. */ this._make_map_popup = function (entity, datamodel, lat, lng) { + const id = getEntityID(entity); const role_label = $(entity).find( - ".label.caosdb-f-entity-role").first().clone(); + ".badge.caosdb-f-entity-role").first().clone(); const parent_list = caosdb_map.make_parent_labels(entity); + + const entity_on_page = $(`#${id}`).length > 0; + const href = entity_on_page ? `#${id}` : connection.getBasePath() + `Entity/${id}` + const link_title = entity_on_page ? "Jump to this entity." : "Browse to this entity."; + const link = $(`<a class="float-end" title="${link_title}" href="${href}"/>`) + .append(`<i class="bi bi-box-arrow-up-right"></i></a>`); + const name = caosdb_map.make_entity_name_label(entity); const dms_lat = L.NumberFormatter.toDMS(lat); const dms_lng = L.NumberFormatter.toDMS(lng); @@ -617,6 +625,7 @@ var caosdb_map = new function () { const ret = $('<div/>') .append(role_label) .append(parent_list) + .append(link) .append(name) .append(loc); return ret[0]; @@ -1498,23 +1507,22 @@ var caosdb_map = new function () { */ this.make_entity_name_label = function (entity) { const name = getEntityName(entity); - const id = getEntityID(entity); - - const entity_on_page = $(`#${id}`).length > 0; - const href = entity_on_page ? `#${id}` : connection.getBasePath() + `Entity/${id}` - const link_title = entity_on_page ? "Jump to this entity." : "Browse to this entity."; - const link = $(`<a title="${link_title}" href="${href}"/>`) - .addClass("pull-right") - .append(`<i class="bi bi-box-arrow-up-right"></i></a>`); - const name_label = $('<div/>') + const name_label = $('<div class=""/>') // TODO move to global css .css({ "margin-top": "4px", "margin-bottom": "4px" }) .text(name) - .append(link); + + const id = getEntityID(entity); + resolve_references.resolve_reference(id).then(reference_info => { + name_label.append(reference_info.text); + if(reference_info.callback) { + name_label.append(reference_info.callback(reference_info.data)); + } + }); return name_label[0]; } diff --git a/src/core/js/ext_references.js b/src/core/js/ext_references.js index cabf5741c2aab2ac7a9ca2d0d4c363f8a3530341..e2c4ece42cfdf9902761ddfa34cb83a4b88deed2 100644 --- a/src/core/js/ext_references.js +++ b/src/core/js/ext_references.js @@ -299,6 +299,8 @@ var resolve_references = new function () { * understood and used by the `callback` function. */ + this._cache = {}; + /** * Return a reference_info for an entity. * @@ -318,40 +320,49 @@ var resolve_references = new function () { * the entity which is to be resolved. @return {reference_info} */ this.resolve_reference = async function (id) { - 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(!resolve_references._cache[id]) { + resolve_references._cache[id] = resolve_references + ._resolve_reference_no_cache(id); + } - const entity = (await resolve_references.retrieve(id))[0]; - - // TODO handle multiple parents - const par = resolve_references.getParents(entity)[0] || {}; - - var ret = { - "text": id - }; - if (getEntityHeadingAttribute(entity, "path") !== - undefined || par.name == "Image") { - // show file name - var pths = getEntityHeadingAttribute(entity, "path") - .split("/"); - ret["text"] = pths[pths.length - 1]; - } else if (par.name === "TestReferenced" && typeof resolve_references.test_resolver === "function") { - // this is a test case, initialized by the test suite. - ret = resolve_references.test_resolver(entity); - } else { - var name = getEntityName(entity); - if (typeof name !== "undefined" && name.length > 0) { - ret["text"] = name; - } - } + return await resolve_references._cache[id]; + } - return ret; + this._resolve_reference_no_cache = async function (id) { + 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; + } + } + + const entity = (await resolve_references.retrieve(id))[0]; + + // TODO handle multiple parents + const par = resolve_references.getParents(entity)[0] || {}; + + var ret = { + "text": id + }; + if (getEntityHeadingAttribute(entity, "path") !== + undefined || par.name == "Image") { + // show file name + var pths = getEntityHeadingAttribute(entity, "path") + .split("/"); + ret["text"] = pths[pths.length - 1]; + } else if (par.name === "TestReferenced" && typeof resolve_references.test_resolver === "function") { + // this is a test case, initialized by the test suite. + ret = resolve_references.test_resolver(entity); + } else { + var name = getEntityName(entity); + if (typeof name !== "undefined" && name.length > 0) { + ret["text"] = name; + } + } + + return ret; }