- /**
+ import server from '../services/server.js';
+
+const LABEL = 'label';
+const LABEL_DEFINITION = 'label-definition';
+const RELATION = 'relation';
+const RELATION_DEFINITION = 'relation-definition';
+
+/**
* This note's representation is used in note tree and is kept in TreeCache.
* Its notable omission is the note content.
*/
@@ -99,6 +106,140 @@ class NoteShort {
return await this.treeCache.getNotes(this.getChildNoteIds());
}
+ /**
+ * @param {string} [name] - attribute name to filter
+ * @returns {Promise<Attribute[]>}
+ */
+ async getAttributes(name) {
+ if (!this.attributeCache) {
+ this.attributeCache = await server.get('notes/' + this.noteId + '/attributes');
+ }
+
+ if (name) {
+ return this.attributeCache.filter(attr => attr.name === name);
+ }
+ else {
+ return this.attributeCache;
+ }
+ }
+
+ /**
+ * @param {string} [name] - label name to filter
+ * @returns {Promise<Attribute[]>} all note's labels (attributes with type label), including inherited ones
+ */
+ async getLabels(name) {
+ return (await this.getAttributes(name)).filter(attr => attr.type === LABEL);
+ }
+
+ /**
+ * @param {string} [name] - label name to filter
+ * @returns {Promise<Attribute[]>} all note's label definitions, including inherited ones
+ */
+ async getLabelDefinitions(name) {
+ return (await this.getAttributes(name)).filter(attr => attr.type === LABEL_DEFINITION);
+ }
+
+ /**
+ * @param {string} [name] - relation name to filter
+ * @returns {Promise<Attribute[]>} all note's relations (attributes with type relation), including inherited ones
+ */
+ async getRelations(name) {
+ return (await this.getAttributes(name)).filter(attr => attr.type === RELATION);
+ }
+
+ /**
+ * @param {string} [name] - relation name to filter
+ * @returns {Promise<Attribute[]>} all note's relation definitions including inherited ones
+ */
+ async getRelationDefinitions(name) {
+ return (await this.getAttributes(name)).filter(attr => attr.type === RELATION_DEFINITION);
+ }
+
+ /**
+ * @param {string} type - attribute type (label, relation, etc.)
+ * @param {string} name - attribute name
+ * @returns {Promise<boolean>} true if note has an attribute with given type and name (including inherited)
+ */
+ async hasAttribute(type, name) {
+ return !!await this.getAttribute(type, name);
+ }
+
+ /**
+ * @param {string} type - attribute type (label, relation, etc.)
+ * @param {string} name - attribute name
+ * @returns {Promise<Attribute>} attribute of given type and name. If there's more such attributes, first is returned. Returns null if there's no such attribute belonging to this note.
+ */
+ async getAttribute(type, name) {
+ const attributes = await this.getAttributes();
+
+ return attributes.find(attr => attr.type === type && attr.name === name);
+ }
+
+ /**
+ * @param {string} type - attribute type (label, relation, etc.)
+ * @param {string} name - attribute name
+ * @returns {Promise<string>} attribute value of given type and name or null if no such attribute exists.
+ */
+ async getAttributeValue(type, name) {
+ const attr = await this.getAttribute(type, name);
+
+ return attr ? attr.value : null;
+ }
+
+ /**
+ * @param {string} name - label name
+ * @returns {Promise<boolean>} true if label exists (including inherited)
+ */
+ async hasLabel(name) { return await this.hasAttribute(LABEL, name); }
+
+ /**
+ * @param {string} name - relation name
+ * @returns {Promise<boolean>} true if relation exists (including inherited)
+ */
+ async hasRelation(name) { return await this.hasAttribute(RELATION, name); }
+
+ /**
+ * @param {string} name - label name
+ * @returns {Promise<Attribute>} label if it exists, null otherwise
+ */
+ async getLabel(name) { return await this.getAttribute(LABEL, name); }
+
+ /**
+ * @param {string} name - relation name
+ * @returns {Promise<Attribute>} relation if it exists, null otherwise
+ */
+ async getRelation(name) { return await this.getAttribute(RELATION, name); }
+
+ /**
+ * @param {string} name - label name
+ * @returns {Promise<string>} label value if label exists, null otherwise
+ */
+ async getLabelValue(name) { return await this.getAttributeValue(LABEL, name); }
+
+ /**
+ * @param {string} name - relation name
+ * @returns {Promise<string>} relation value if relation exists, null otherwise
+ */
+ async getRelationValue(name) { return await this.getAttributeValue(RELATION, name); }
+
+ /**
+ * @param {string} name
+ * @returns {Promise<Note>|null} target note of the relation or null (if target is empty or note was not found)
+ */
+ async getRelationTarget(name) {
+ const relation = await this.getRelation(name);
+
+ return relation ? await repository.getNote(relation.value) : null;
+ }
+
+ /**
+ * Clear note's attributes cache to force fresh reload for next attribute request.
+ * Cache is note instance scoped.
+ */
+ invalidateAttributeCache() {
+ this.attributeCache = null;
+ }
+
get toString() {
return `Note(noteId=${this.noteId}, title=${this.title})`;
}
@@ -107,6 +248,7 @@ class NoteShort {
const dto = Object.assign({}, this);
delete dto.treeCache;
delete dto.archived;
+ delete dto.attributeCache;
return dto;
}
diff --git a/docs/frontend_api/global.html b/docs/frontend_api/global.html
index 369553f4c..a73e78e1b 100644
--- a/docs/frontend_api/global.html
+++ b/docs/frontend_api/global.html
@@ -303,7 +303,7 @@
Source:
diff --git a/docs/frontend_api/services_frontend_script_api.js.html b/docs/frontend_api/services_frontend_script_api.js.html
index 20a3ecf24..9ce981b93 100644
--- a/docs/frontend_api/services_frontend_script_api.js.html
+++ b/docs/frontend_api/services_frontend_script_api.js.html
@@ -34,6 +34,7 @@ import linkService from './link.js';
import treeCache from './tree_cache.js';
import noteDetailService from './note_detail.js';
import noteTypeService from './note_type.js';
+import noteTooltipService from './note_tooltip.js';
/**
* This is the main frontend API interface for scripts. It's published in the local "api" object.
@@ -253,6 +254,12 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null) {
* @param {array} types - list of mime types to be used
*/
this.setCodeMimeTypes = noteTypeService.setCodeMimeTypes;
+
+ /**
+ * @method
+ * @param {object} $el - jquery object on which to setup the tooltip
+ */
+ this.setupElementTooltip = noteTooltipService.setupElementTooltip
}
export default FrontendScriptApi;