diff --git a/docs/frontend_api/NoteShort.html b/docs/frontend_api/NoteShort.html
index 3fb72f5b2..19c7b6425 100644
--- a/docs/frontend_api/NoteShort.html
+++ b/docs/frontend_api/NoteShort.html
@@ -1039,7 +1039,7 @@
-
(async) getAttribute(type, name) → {Promise.<Attribute>}
+ getAttribute(type, name) → {Attribute}
@@ -1199,7 +1199,7 @@
-Promise.<Attribute>
+Attribute
@@ -1217,7 +1217,7 @@
- (async) getAttributes(typeopt, nameopt) → {Promise.<Array.<Attribute>>}
+ getAttributes(typeopt, nameopt) → {Array.<Attribute>}
@@ -1399,7 +1399,7 @@
-Promise.<Array.<Attribute>>
+Array.<Attribute>
@@ -1417,7 +1417,7 @@
- (async) getAttributeValue(type, name) → {Promise.<string>}
+ getAttributeValue(type, name) → {string}
@@ -1577,7 +1577,7 @@
-Promise.<string>
+string
@@ -1595,7 +1595,7 @@
- (async) getBranches() → {Promise.<Array.<Branch>>}
+ getBranches() → {Array.<Branch>}
@@ -1679,7 +1679,7 @@
-Promise.<Array.<Branch>>
+Array.<Branch>
@@ -1799,7 +1799,7 @@
- (async) getChildBranches() → {Promise.<Array.<Branch>>}
+ getChildBranches() → {Array.<Branch>}
@@ -1883,7 +1883,7 @@
-Promise.<Array.<Branch>>
+Array.<Branch>
@@ -2105,7 +2105,7 @@
- (async) getLabel(name) → {Promise.<Attribute>}
+ getLabel(name) → {Attribute}
@@ -2242,7 +2242,7 @@
-Promise.<Attribute>
+Attribute
@@ -2260,7 +2260,7 @@
- (async) getLabelDefinitions(nameopt) → {Promise.<Array.<Attribute>>}
+ getLabelDefinitions(nameopt) → {Array.<Attribute>}
@@ -2409,7 +2409,7 @@
-Promise.<Array.<Attribute>>
+Array.<Attribute>
@@ -2427,7 +2427,7 @@
- (async) getLabels(nameopt) → {Promise.<Array.<Attribute>>}
+ getLabels(nameopt) → {Array.<Attribute>}
@@ -2576,7 +2576,7 @@
-Promise.<Array.<Attribute>>
+Array.<Attribute>
@@ -2594,7 +2594,7 @@
- (async) getLabelValue(name) → {Promise.<string>}
+ getLabelValue(name) → {string}
@@ -2731,7 +2731,7 @@
-Promise.<string>
+string
@@ -4361,7 +4361,7 @@
- (async) getParentNotes() → {Promise.<Array.<NoteShort>>}
+ getParentNotes() → {Array.<NoteShort>}
@@ -4445,7 +4445,7 @@
-Promise.<Array.<NoteShort>>
+Array.<NoteShort>
@@ -4463,7 +4463,7 @@
- (async) getRelation(name) → {Promise.<Attribute>}
+ getRelation(name) → {Attribute}
@@ -4600,7 +4600,7 @@
-Promise.<Attribute>
+Attribute
@@ -4618,7 +4618,7 @@
- (async) getRelationDefinitions(nameopt) → {Promise.<Array.<Attribute>>}
+ getRelationDefinitions(nameopt) → {Array.<Attribute>}
@@ -4767,7 +4767,7 @@
-Promise.<Array.<Attribute>>
+Array.<Attribute>
@@ -4785,7 +4785,7 @@
- (async) getRelations(nameopt) → {Promise.<Array.<Attribute>>}
+ getRelations(nameopt) → {Array.<Attribute>}
@@ -4934,7 +4934,7 @@
-Promise.<Array.<Attribute>>
+Array.<Attribute>
@@ -5273,7 +5273,7 @@
- (async) getRelationValue(name) → {Promise.<string>}
+ getRelationValue(name) → {string}
@@ -5410,7 +5410,7 @@
-Promise.<string>
+string
@@ -5534,7 +5534,7 @@
- (async) hasAttribute(type, name) → {Promise.<boolean>}
+ hasAttribute(type, name) → {boolean}
@@ -5694,7 +5694,7 @@
-Promise.<boolean>
+boolean
@@ -5814,7 +5814,7 @@
- (async) hasLabel(name) → {Promise.<boolean>}
+ hasLabel(name) → {boolean}
@@ -5951,7 +5951,7 @@
-Promise.<boolean>
+boolean
@@ -6457,7 +6457,7 @@
- (async) hasRelation(name) → {Promise.<boolean>}
+ hasRelation(name) → {boolean}
@@ -6594,7 +6594,7 @@
-Promise.<boolean>
+boolean
diff --git a/docs/frontend_api/entities_note_short.js.html b/docs/frontend_api/entities_note_short.js.html
index 772230b86..bffc5366b 100644
--- a/docs/frontend_api/entities_note_short.js.html
+++ b/docs/frontend_api/entities_note_short.js.html
@@ -136,8 +136,8 @@ class NoteShort {
return Object.values(this.parentToBranch);
}
- /** @returns {Promise<Branch[]>} */
- async getBranches() {
+ /** @returns {Branch[]} */
+ getBranches() {
const branchIds = Object.values(this.parentToBranch);
return this.treeCache.getBranches(branchIds);
@@ -148,8 +148,8 @@ class NoteShort {
return this.children.length > 0;
}
- /** @returns {Promise<Branch[]>} */
- async getChildBranches() {
+ /** @returns {Branch[]} */
+ getChildBranches() {
// don't use Object.values() to guarantee order
const branchIds = this.children.map(childNoteId => this.childToBranch[childNoteId]);
@@ -161,9 +161,9 @@ class NoteShort {
return this.parents;
}
- /** @returns {Promise<NoteShort[]>} */
- async getParentNotes() {
- return await this.treeCache.getNotes(this.parents);
+ /** @returns {NoteShort[]} */
+ getParentNotes() {
+ return this.treeCache.getNotesFromCache(this.parents);
}
/** @returns {string[]} */
@@ -192,9 +192,9 @@ class NoteShort {
/**
* @param {string} [type] - (optional) attribute type to filter
* @param {string} [name] - (optional) attribute name to filter
- * @returns {Promise<Attribute[]>} all note's attributes, including inherited ones
+ * @returns {Attribute[]} all note's attributes, including inherited ones
*/
- async getAttributes(type, name) {
+ getAttributes(type, name) {
const ownedAttributes = this.getOwnedAttributes();
const attrArrs = [
@@ -202,16 +202,16 @@ class NoteShort {
];
for (const templateAttr of ownedAttributes.filter(oa => oa.type === 'relation' && oa.name === 'template')) {
- const templateNote = await this.treeCache.getNote(templateAttr.value);
+ const templateNote = this.treeCache.getNoteFromCache(templateAttr.value);
if (templateNote) {
- attrArrs.push(await templateNote.getAttributes());
+ attrArrs.push(templateNote.getAttributes());
}
}
if (this.noteId !== 'root') {
- for (const parentNote of await this.getParentNotes()) {
- attrArrs.push(await parentNote.getInheritableAttributes());
+ for (const parentNote of this.getParentNotes()) {
+ attrArrs.push(parentNote.getInheritableAttributes());
}
}
@@ -232,8 +232,8 @@ class NoteShort {
}
}
- async getInheritableAttributes() {
- const attrs = await this.getAttributes();
+ getInheritableAttributes() {
+ const attrs = this.getAttributes();
return attrs.filter(attr => attr.isInheritable);
}
@@ -248,18 +248,18 @@ class NoteShort {
/**
* @param {string} [name] - label name to filter
- * @returns {Promise<Attribute[]>} all note's labels (attributes with type label), including inherited ones
+ * @returns {Attribute[]} all note's labels (attributes with type label), including inherited ones
*/
- async getLabels(name) {
- return await this.getAttributes(LABEL, name);
+ getLabels(name) {
+ return this.getAttributes(LABEL, name);
}
/**
* @param {string} [name] - label name to filter
- * @returns {Promise<Attribute[]>} all note's label definitions, including inherited ones
+ * @returns {Attribute[]} all note's label definitions, including inherited ones
*/
- async getLabelDefinitions(name) {
- return await this.getAttributes(LABEL_DEFINITION, name);
+ getLabelDefinitions(name) {
+ return this.getAttributes(LABEL_DEFINITION, name);
}
/**
@@ -272,27 +272,27 @@ class NoteShort {
/**
* @param {string} [name] - relation name to filter
- * @returns {Promise<Attribute[]>} all note's relations (attributes with type relation), including inherited ones
+ * @returns {Attribute[]} all note's relations (attributes with type relation), including inherited ones
*/
- async getRelations(name) {
- return await this.getAttributes(RELATION, name);
+ getRelations(name) {
+ return this.getAttributes(RELATION, name);
}
/**
* @param {string} [name] - relation name to filter
- * @returns {Promise<Attribute[]>} all note's relation definitions including inherited ones
+ * @returns {Attribute[]} all note's relation definitions including inherited ones
*/
- async getRelationDefinitions(name) {
- return await this.getAttributes(RELATION_DEFINITION, name);
+ getRelationDefinitions(name) {
+ return this.getAttributes(RELATION_DEFINITION, name);
}
/**
* @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)
+ * @returns {boolean} true if note has an attribute with given type and name (including inherited)
*/
- async hasAttribute(type, name) {
- return !!await this.getAttribute(type, name);
+ hasAttribute(type, name) {
+ return !!this.getAttribute(type, name);
}
/**
@@ -318,10 +318,10 @@ class NoteShort {
/**
* @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.
+ * @returns {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(type, name);
+ getAttribute(type, name) {
+ const attributes = this.getAttributes(type, name);
return attributes.length > 0 ? attributes[0] : 0;
}
@@ -340,10 +340,10 @@ class NoteShort {
/**
* @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.
+ * @returns {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);
+ getAttributeValue(type, name) {
+ const attr = this.getAttribute(type, name);
return attr ? attr.value : null;
}
@@ -356,9 +356,9 @@ class NoteShort {
/**
* @param {string} name - label name
- * @returns {Promise<boolean>} true if label exists (including inherited)
+ * @returns {boolean} true if label exists (including inherited)
*/
- async hasLabel(name) { return await this.hasAttribute(LABEL, name); }
+ hasLabel(name) { return this.hasAttribute(LABEL, name); }
/**
* @param {string} name - relation name
@@ -368,9 +368,9 @@ class NoteShort {
/**
* @param {string} name - relation name
- * @returns {Promise<boolean>} true if relation exists (including inherited)
+ * @returns {boolean} true if relation exists (including inherited)
*/
- async hasRelation(name) { return await this.hasAttribute(RELATION, name); }
+ hasRelation(name) { return this.hasAttribute(RELATION, name); }
/**
* @param {string} name - label name
@@ -380,9 +380,9 @@ class NoteShort {
/**
* @param {string} name - label name
- * @returns {Promise<Attribute>} label if it exists, null otherwise
+ * @returns {Attribute} label if it exists, null otherwise
*/
- async getLabel(name) { return await this.getAttribute(LABEL, name); }
+ getLabel(name) { return this.getAttribute(LABEL, name); }
/**
* @param {string} name - relation name
@@ -392,9 +392,9 @@ class NoteShort {
/**
* @param {string} name - relation name
- * @returns {Promise<Attribute>} relation if it exists, null otherwise
+ * @returns {Attribute} relation if it exists, null otherwise
*/
- async getRelation(name) { return await this.getAttribute(RELATION, name); }
+ getRelation(name) { return this.getAttribute(RELATION, name); }
/**
* @param {string} name - label name
@@ -404,9 +404,9 @@ class NoteShort {
/**
* @param {string} name - label name
- * @returns {Promise<string>} label value if label exists, null otherwise
+ * @returns {string} label value if label exists, null otherwise
*/
- async getLabelValue(name) { return await this.getAttributeValue(LABEL, name); }
+ getLabelValue(name) { return this.getAttributeValue(LABEL, name); }
/**
* @param {string} name - relation name
@@ -416,9 +416,9 @@ class NoteShort {
/**
* @param {string} name - relation name
- * @returns {Promise<string>} relation value if relation exists, null otherwise
+ * @returns {string} relation value if relation exists, null otherwise
*/
- async getRelationValue(name) { return await this.getAttributeValue(RELATION, name); }
+ getRelationValue(name) { return this.getAttributeValue(RELATION, name); }
/**
* @param {string} name
@@ -435,7 +435,7 @@ class NoteShort {
* @returns {Promise<NoteShort[]>}
*/
async getRelationTargets(name) {
- const relations = await this.getRelations(name);
+ const relations = this.getRelations(name);
const targets = [];
for (const relation of relations) {
@@ -474,8 +474,8 @@ class NoteShort {
return dto;
}
- async getCssClass() {
- const labels = await this.getLabels('cssClass');
+ getCssClass() {
+ const labels = this.getLabels('cssClass');
return labels.map(l => l.value).join(' ');
}
}
diff --git a/docs/frontend_api/services_frontend_script_api.js.html b/docs/frontend_api/services_frontend_script_api.js.html
index a49e3f105..b026ce913 100644
--- a/docs/frontend_api/services_frontend_script_api.js.html
+++ b/docs/frontend_api/services_frontend_script_api.js.html
@@ -86,7 +86,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain
await ws.waitForMaxKnownSyncId();
await appContext.tabManager.getActiveTabContext().setNote(notePath);
- appContext.triggerCommand('focusAndSelectTitle');
+ appContext.triggerEvent('focusAndSelectTitle');
};
/**
@@ -310,7 +310,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain
* @method
* @returns {NoteShort} active note (loaded into right pane)
*/
- this.getActiveTabNote = appContext.tabManager.getActiveTabNote;
+ this.getActiveTabNote = () => appContext.tabManager.getActiveTabNote();
/**
* See https://ckeditor.com/docs/ckeditor5/latest/api/module_core_editor_editor-Editor.html for a documentation on the returned instance.
@@ -324,7 +324,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain
* @method
* @returns {Promise<string|null>} returns note path of active note or null if there isn't active note
*/
- this.getActiveTabNotePath = appContext.tabManager.getActiveTabNotePath;
+ this.getActiveTabNotePath = () => appContext.tabManager.getActiveTabNotePath();
/**
* @method
diff --git a/src/public/javascripts/services/ws.js b/src/public/javascripts/services/ws.js
index 321220c75..0fe4ce0b6 100644
--- a/src/public/javascripts/services/ws.js
+++ b/src/public/javascripts/services/ws.js
@@ -203,6 +203,25 @@ subscribeToMessages(message => {
});
async function processSyncRows(syncRows) {
+ const missingNoteIds = [];
+
+ syncRows.forEach(({entityName, entity}) => {
+ if (entityName === 'branches' && !(entity.parentNoteId in treeCache.notes)) {
+ missingNoteIds.push(entity.parentNoteId);
+ }
+ else if (entityName === 'attributes'
+ && entity.type === 'relation'
+ && entity.name === 'template'
+ && !(entity.noteId in treeCache.notes)) {
+
+ missingNoteIds.push(entity.value);
+ }
+ });
+
+ if (missingNoteIds.length > 0) {
+ await treeCache.reloadNotes(missingNoteIds);
+ }
+
const loadResults = new LoadResults(treeCache);
syncRows.filter(sync => sync.entityName === 'notes').forEach(sync => {