diff --git a/src/public/javascripts/entities/attribute.js b/src/public/javascripts/entities/attribute.js index 688b86d58..6fc76274d 100644 --- a/src/public/javascripts/entities/attribute.js +++ b/src/public/javascripts/entities/attribute.js @@ -27,6 +27,15 @@ class Attribute { return await this.treeCache.getNote(this.noteId); } + get jsonValue() { + try { + return JSON.parse(this.value); + } + catch (e) { + return null; + } + } + get toString() { return `Attribute(attributeId=${this.attributeId}, type=${this.type}, name=${this.name}, value=${this.value})`; } diff --git a/src/public/javascripts/services/note_tooltip.js b/src/public/javascripts/services/note_tooltip.js index f6a027545..9820a3ee6 100644 --- a/src/public/javascripts/services/note_tooltip.js +++ b/src/public/javascripts/services/note_tooltip.js @@ -1,6 +1,7 @@ import treeService from "./tree.js"; import linkService from "./link.js"; import treeCache from "./tree_cache.js"; +import utils from "./utils.js"; function setupGlobalTooltip() { $(document).on("mouseenter", "a", mouseEnterHandler); @@ -74,13 +75,18 @@ async function renderTooltip(note, noteComplement) { return '
Note has been deleted.
'; } - const attributes = await note.getAttributes(); + const attributes = note.getAttributes(); let content = ''; - const promoted = attributes.filter(attr => - (attr.type === 'label-definition' || attr.type === 'relation-definition') - && !attr.name.startsWith("child:") - && attr.value.isPromoted); + + const promoted = attributes + .filter(attr => attr.type === 'label-definition' || attr.type === 'relation-definition') + .filter(attr => !attr.name.startsWith("child:")) + .filter(attr => { + const json = attr.jsonValue; + + return json && json.isPromoted; + }); if (promoted.length > 0) { const $table = $("").addClass("promoted-attributes-in-tooltip"); @@ -116,12 +122,12 @@ async function renderTooltip(note, noteComplement) { content += $table.prop('outerHTML'); } - if (note.type === 'text') { + if (note.type === 'text' && !utils.isHtmlEmpty(noteComplement.content)) { // surround with
for a case when note's content is pure text (e.g. "[protected]") which // then fails the jquery non-empty text test content += '
' + noteComplement.content + '
'; } - else if (note.type === 'code') { + else if (note.type === 'code' && noteComplement.content && noteComplement.content.trim()) { content += $("
")
             .text(noteComplement.content)
             .prop('outerHTML');
@@ -133,10 +139,6 @@ async function renderTooltip(note, noteComplement) {
     }
     // other types of notes don't have tooltip preview
 
-    if (!$(content).text().trim() && note.type !== 'image') {
-        return "";
-    }
-
     return content;
 }
 
diff --git a/src/public/javascripts/widgets/attributes.js b/src/public/javascripts/widgets/attributes.js
index 2ad3fe358..80b860d86 100644
--- a/src/public/javascripts/widgets/attributes.js
+++ b/src/public/javascripts/widgets/attributes.js
@@ -34,7 +34,7 @@ export default class AttributesWidget extends CollapsibleWidget {
             .attr("href", "javascript:")
             .text("+show inherited")
             .on('click', async () => {
-                const attributes = await note.getAttributes();
+                const attributes = note.getAttributes();
                 const inheritedAttributes = attributes.filter(attr => attr.noteId !== this.noteId);
 
                 if (inheritedAttributes.length === 0) {
diff --git a/src/public/javascripts/widgets/promoted_attributes.js b/src/public/javascripts/widgets/promoted_attributes.js
index 56d6404da..8c9e71209 100644
--- a/src/public/javascripts/widgets/promoted_attributes.js
+++ b/src/public/javascripts/widgets/promoted_attributes.js
@@ -40,10 +40,14 @@ export default class PromotedAttributesWidget extends TabAwareWidget {
 
         const attributes = note.getAttributes();
 
-        const promoted = attributes.filter(attr =>
-            (attr.type === 'label-definition' || attr.type === 'relation-definition')
-            && !attr.name.startsWith("child:")
-            && attr.value.isPromoted);
+        const promoted = attributes
+            .filter(attr => attr.type === 'label-definition' || attr.type === 'relation-definition')
+            .filter(attr => !attr.name.startsWith("child:"))
+            .filter(attr => {
+                const json = attr.jsonValue;
+
+                return json && json.isPromoted;
+            });
 
         const hidePromotedAttributes = attributes.some(attr => attr.type === 'label' && attr.name === 'hidePromotedAttributes');
 
@@ -89,7 +93,7 @@ export default class PromotedAttributesWidget extends TabAwareWidget {
     }
 
     async createPromotedAttributeRow(definitionAttr, valueAttr) {
-        const definition = definitionAttr.value;
+        const definition = definitionAttr.jsonValue;
         const $tr = $("
"); const $labelCell = $("
").append(valueAttr.name); const $input = $("")