mirror of
				https://github.com/TriliumNext/Notes.git
				synced 2025-10-31 21:11:30 +08:00 
			
		
		
		
	Merge branch 'Highlighted-Text' of https://github.com/SiriusXT/trilium into Highlighted-Text
This commit is contained in:
		
						commit
						463d145cb7
					
				| @ -991,7 +991,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -1904,7 +1904,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -1916,7 +1916,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -1461,7 +1461,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -2174,7 +2174,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -267,7 +267,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line24">line 24</a> | ||||
|         <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line29">line 29</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -335,7 +335,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line20">line 20</a> | ||||
|         <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line25">line 25</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -403,7 +403,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line26">line 26</a> | ||||
|         <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line31">line 31</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -471,7 +471,7 @@ | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line22">line 22</a> | ||||
|         <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line27">line 27</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -1319,7 +1319,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -1251,7 +1251,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and ' | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -3254,7 +3254,7 @@ JSON MIME type. See also createNewNote() for more options. | ||||
|      | ||||
| 
 | ||||
|      | ||||
|     <h4 class="name" id="ensureNoteIsPresentInParent"><span class="type-signature"></span>ensureNoteIsPresentInParent<span class="signature">(noteId, parentNoteId, prefix)</span><span class="type-signature"> → {void}</span></h4> | ||||
|     <h4 class="name" id="ensureNoteIsPresentInParent"><span class="type-signature"></span>ensureNoteIsPresentInParent<span class="signature">(noteId, parentNoteId, prefix)</span><span class="type-signature"> → {Object}</span></h4> | ||||
|      | ||||
| 
 | ||||
|      | ||||
| @ -3262,7 +3262,7 @@ JSON MIME type. See also createNewNote() for more options. | ||||
| 
 | ||||
| 
 | ||||
| <div class="description"> | ||||
|     If there's no branch between note and parent note, create one. Otherwise, do nothing. | ||||
|     If there's no branch between note and parent note, create one. Otherwise, do nothing. Returns the new or existing branch. | ||||
| </div> | ||||
| 
 | ||||
| 
 | ||||
| @ -3437,7 +3437,7 @@ JSON MIME type. See also createNewNote() for more options. | ||||
|     </dt> | ||||
|     <dd> | ||||
|          | ||||
| <span class="param-type">void</span> | ||||
| <span class="param-type">Object</span> | ||||
| 
 | ||||
| 
 | ||||
|     </dd> | ||||
| @ -7889,7 +7889,7 @@ exists, then we'll use that transaction. | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -212,7 +212,7 @@ module.exports = AbstractBeccaEntity; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -124,7 +124,7 @@ class BAttribute extends AbstractBeccaEntity { | ||||
|         } | ||||
| 
 | ||||
|         if (this.type === 'relation' && !(this.value in this.becca.notes)) { | ||||
|             throw new Error(`Cannot save relation '${this.name}' of note '${this.noteId}' since it target not existing note '${this.value}'.`); | ||||
|             throw new Error(`Cannot save relation '${this.name}' of note '${this.noteId}' since it targets not existing note '${this.value}'.`); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -276,7 +276,7 @@ module.exports = BAttribute; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -319,7 +319,7 @@ module.exports = BBranch; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -120,7 +120,7 @@ module.exports = BEtapiToken; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -560,6 +560,20 @@ class BNote extends AbstractBeccaEntity { | ||||
|      */ | ||||
|     hasLabel(name, value) { return this.hasAttribute(LABEL, name, value); } | ||||
| 
 | ||||
|     /** | ||||
|      * @param {string} name - label name | ||||
|      * @returns {boolean} true if label exists (including inherited) and does not have "false" value. | ||||
|      */ | ||||
|     isLabelTruthy(name) { | ||||
|         const label = this.getLabel(name); | ||||
| 
 | ||||
|         if (!label) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         return label && label.value !== 'false'; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param {string} name - label name | ||||
|      * @param {string} [value] - label value | ||||
| @ -761,6 +775,21 @@ class BNote extends AbstractBeccaEntity { | ||||
|         return this.hasAttribute('label', 'archived'); | ||||
|     } | ||||
| 
 | ||||
|     areAllNotePathsArchived() { | ||||
|         // there's a slight difference between note being itself archived and all its note paths being archived | ||||
|         // - note is archived when it itself has an archived label or inherits it | ||||
|         // - note does not have or inherit archived label, but each note paths contains a note with (non-inheritable) | ||||
|         //   archived label | ||||
| 
 | ||||
|         const bestNotePathRecord = this.getSortedNotePathRecords()[0]; | ||||
| 
 | ||||
|         if (!bestNotePathRecord) { | ||||
|             throw new Error(`No note path available for note '${this.noteId}'`); | ||||
|         } | ||||
| 
 | ||||
|         return bestNotePathRecord.isArchived; | ||||
|     } | ||||
| 
 | ||||
|     hasInheritableArchivedLabel() { | ||||
|         for (const attr of this.getAttributes()) { | ||||
|             if (attr.name === 'archived' && attr.type === LABEL && attr.isInheritable) { | ||||
| @ -1164,6 +1193,8 @@ class BNote extends AbstractBeccaEntity { | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Gives all possible note paths leading to this note. Paths containing search note are ignored (could form cycles) | ||||
|      * | ||||
|      * @returns {string[][]} - array of notePaths (each represented by array of noteIds constituting the particular note path) | ||||
|      */ | ||||
|     getAllNotePaths() { | ||||
| @ -1171,18 +1202,73 @@ class BNote extends AbstractBeccaEntity { | ||||
|             return [['root']]; | ||||
|         } | ||||
| 
 | ||||
|         const notePaths = []; | ||||
|         const parentNotes = this.getParentNotes(); | ||||
|         let notePaths = []; | ||||
| 
 | ||||
|         for (const parentNote of this.getParentNotes()) { | ||||
|             for (const parentPath of parentNote.getAllNotePaths()) { | ||||
|                 parentPath.push(this.noteId); | ||||
|                 notePaths.push(parentPath); | ||||
|         if (parentNotes.length === 1) { // optimization for most common case | ||||
|             notePaths = parentNotes[0].getAllNotePaths(); | ||||
|         } else { | ||||
|             notePaths = parentNotes.flatMap(parentNote => parentNote.getAllNotePaths()); | ||||
|         } | ||||
| 
 | ||||
|         for (const notePath of notePaths) { | ||||
|             notePath.push(this.noteId); | ||||
|         } | ||||
| 
 | ||||
|         return notePaths; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param {string} [hoistedNoteId='root'] | ||||
|      * @return {Array<{isArchived: boolean, isInHoistedSubTree: boolean, notePath: Array<string>, isHidden: boolean}>} | ||||
|      */ | ||||
|     getSortedNotePathRecords(hoistedNoteId = 'root') { | ||||
|         const isHoistedRoot = hoistedNoteId === 'root'; | ||||
| 
 | ||||
|         const notePaths = this.getAllNotePaths().map(path => ({ | ||||
|             notePath: path, | ||||
|             isInHoistedSubTree: isHoistedRoot || path.includes(hoistedNoteId), | ||||
|             isArchived: path.some(noteId => this.becca.notes[noteId].isArchived), | ||||
|             isHidden: path.includes('_hidden') | ||||
|         })); | ||||
| 
 | ||||
|         notePaths.sort((a, b) => { | ||||
|             if (a.isInHoistedSubTree !== b.isInHoistedSubTree) { | ||||
|                 return a.isInHoistedSubTree ? -1 : 1; | ||||
|             } else if (a.isArchived !== b.isArchived) { | ||||
|                 return a.isArchived ? 1 : -1; | ||||
|             } else if (a.isHidden !== b.isHidden) { | ||||
|                 return a.isHidden ? 1 : -1; | ||||
|             } else { | ||||
|                 return a.notePath.length - b.notePath.length; | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         return notePaths; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns note path considered to be the "best" | ||||
|      * | ||||
|      * @param {string} [hoistedNoteId='root'] | ||||
|      * @return {string[]} array of noteIds constituting the particular note path | ||||
|      */ | ||||
|     getBestNotePath(hoistedNoteId = 'root') { | ||||
|         return this.getSortedNotePathRecords(hoistedNoteId)[0]?.notePath; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns note path considered to be the "best" | ||||
|      * | ||||
|      * @param {string} [hoistedNoteId='root'] | ||||
|      * @return {string} serialized note path (e.g. 'root/a1h315/js725h') | ||||
|      */ | ||||
|     getBestNotePathString(hoistedNoteId = 'root') { | ||||
|         const notePath = this.getBestNotePath(hoistedNoteId); | ||||
| 
 | ||||
|         return notePath?.join("/"); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @return boolean - true if there's no non-hidden path, note is not cloned to the visible tree | ||||
|      */ | ||||
| @ -1196,9 +1282,7 @@ class BNote extends AbstractBeccaEntity { | ||||
|                 return false; | ||||
|             } else if (parentNote.noteId === '_hidden') { | ||||
|                 continue; | ||||
|             } | ||||
| 
 | ||||
|             if (!parentNote.isHiddenCompletely()) { | ||||
|             } else if (!parentNote.isHiddenCompletely()) { | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
| @ -1392,7 +1476,7 @@ class BNote extends AbstractBeccaEntity { | ||||
| 
 | ||||
|     /** | ||||
|      * @param parentNoteId | ||||
|      * @returns {{success: boolean, message: string}} | ||||
|      * @returns {{success: boolean, message: string, branchId: string, notePath: string}} | ||||
|      */ | ||||
|     cloneTo(parentNoteId) { | ||||
|         const cloningService = require("../../services/cloning"); | ||||
| @ -1550,7 +1634,7 @@ module.exports = BNote; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -194,12 +194,14 @@ class BNoteRevision extends AbstractBeccaEntity { | ||||
|             utcDateLastEdited: this.utcDateLastEdited, | ||||
|             utcDateCreated: this.utcDateCreated, | ||||
|             utcDateModified: this.utcDateModified, | ||||
|             content: this.content, // used when retrieving full note revision to frontend | ||||
|             contentLength: this.contentLength | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     getPojoToSave() { | ||||
|         const pojo = this.getPojo(); | ||||
|         delete pojo.content; // not getting persisted | ||||
|         delete pojo.contentLength; // not getting persisted | ||||
| 
 | ||||
|         if (pojo.isProtected) { | ||||
| @ -233,7 +235,7 @@ module.exports = BNoteRevision; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -44,6 +44,11 @@ class BOption extends AbstractBeccaEntity { | ||||
|     constructor(row) { | ||||
|         super(); | ||||
| 
 | ||||
|         this.updateFromRow(row); | ||||
|         this.becca.options[this.name] = this; | ||||
|     } | ||||
| 
 | ||||
|     updateFromRow(row) { | ||||
|         /** @type {string} */ | ||||
|         this.name = row.name; | ||||
|         /** @type {string} */ | ||||
| @ -52,8 +57,6 @@ class BOption extends AbstractBeccaEntity { | ||||
|         this.isSynced = !!row.isSynced; | ||||
|         /** @type {string} */ | ||||
|         this.utcDateModified = row.utcDateModified; | ||||
| 
 | ||||
|         this.becca.options[this.name] = this; | ||||
|     } | ||||
| 
 | ||||
|     beforeSaving() { | ||||
| @ -89,7 +92,7 @@ module.exports = BOption; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -77,7 +77,7 @@ module.exports = BRecentNote; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -56,7 +56,7 @@ | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -1300,7 +1300,7 @@ | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -165,13 +165,13 @@ function BackendScriptApi(currentNote, apiParams) { | ||||
|     this.getNoteWithLabel = attributeService.getNoteWithLabel; | ||||
| 
 | ||||
|     /** | ||||
|      * If there's no branch between note and parent note, create one. Otherwise, do nothing. | ||||
|      * If there's no branch between note and parent note, create one. Otherwise, do nothing. Returns the new or existing branch. | ||||
|      * | ||||
|      * @method | ||||
|      * @param {string} noteId | ||||
|      * @param {string} parentNoteId | ||||
|      * @param {string} prefix - if branch will be created between note and parent note, set this prefix | ||||
|      * @returns {void} | ||||
|      * @returns {{branch: BBranch|null}} | ||||
|      */ | ||||
|     this.ensureNoteIsPresentInParent = cloningService.ensureNoteIsPresentInParent; | ||||
| 
 | ||||
| @ -499,11 +499,11 @@ function BackendScriptApi(currentNote, apiParams) { | ||||
|         if (opts.type === 'script' && !opts.scriptNoteId) { throw new Error("scriptNoteId is mandatory for launchers of type 'script'"); } | ||||
|         if (opts.type === 'customWidget' && !opts.widgetNoteId) { throw new Error("widgetNoteId is mandatory for launchers of type 'customWidget'"); } | ||||
| 
 | ||||
|         const parentNoteId = !!opts.isVisible ? '_lbVisibleLaunchers' : '_lbAvailableLaunchers'; | ||||
|         const parentNoteId = opts.isVisible ? '_lbVisibleLaunchers' : '_lbAvailableLaunchers'; | ||||
|         const noteId = 'al_' + opts.id; | ||||
| 
 | ||||
|         const launcherNote = | ||||
|             becca.getNote(opts.id) || | ||||
|             becca.getNote(noteId) || | ||||
|             specialNotesService.createLauncher({ | ||||
|                 noteId: noteId, | ||||
|                 parentNoteId: parentNoteId, | ||||
| @ -542,7 +542,7 @@ function BackendScriptApi(currentNote, apiParams) { | ||||
|         if (opts.icon) { | ||||
|             launcherNote.setLabel('iconClass', `bx ${opts.icon}`); | ||||
|         } else { | ||||
|             launcherNote.removeLabel('keyboardShortcut'); | ||||
|             launcherNote.removeLabel('iconClass'); | ||||
|         } | ||||
| 
 | ||||
|         return {note: launcherNote}; | ||||
| @ -584,7 +584,7 @@ module.exports = BackendScriptApi; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -245,7 +245,7 @@ function wrap(query, func) { | ||||
|             // in these cases error should be simply ignored. | ||||
|             console.log(e.message); | ||||
| 
 | ||||
|             return null | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         throw e; | ||||
| @ -309,7 +309,7 @@ function fillParamList(paramIds, truncate = true) { | ||||
|     } | ||||
| 
 | ||||
|     // doing it manually to avoid this showing up on the sloq query list | ||||
|     const s = stmt(`INSERT INTO param_list VALUES ${paramIds.map(paramId => `(?)`).join(',')}`, paramIds); | ||||
|     const s = stmt(`INSERT INTO param_list VALUES ${paramIds.map(paramId => `(?)`).join(',')}`); | ||||
| 
 | ||||
|     s.run(paramIds); | ||||
| } | ||||
| @ -413,7 +413,7 @@ module.exports = { | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -850,7 +850,7 @@ and relation (representing named relationship between source and target note)</d | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -1062,7 +1062,7 @@ parents.</div> | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -781,7 +781,7 @@ | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -342,115 +342,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line69">line 69</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| </dl> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|          | ||||
|              | ||||
| <h4 class="name" id="CollapsibleWidget"><span class="type-signature"></span>CollapsibleWidget<span class="type-signature"></span></h4> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     <h5 class="subsection-title">Properties:</h5> | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
| <table class="props"> | ||||
|     <thead> | ||||
|     <tr> | ||||
|          | ||||
| 
 | ||||
|         <th>Type</th> | ||||
| 
 | ||||
|          | ||||
| 
 | ||||
|          | ||||
| 
 | ||||
|         <th class="last">Description</th> | ||||
|     </tr> | ||||
|     </thead> | ||||
| 
 | ||||
|     <tbody> | ||||
|      | ||||
| 
 | ||||
|         <tr> | ||||
|              | ||||
| 
 | ||||
|             <td class="type"> | ||||
|              | ||||
|                  | ||||
| <span class="param-type">RightPanelWidget</span> | ||||
| 
 | ||||
| 
 | ||||
|              | ||||
|             </td> | ||||
| 
 | ||||
|              | ||||
| 
 | ||||
|              | ||||
| 
 | ||||
|             <td class="description last"></td> | ||||
|         </tr> | ||||
| 
 | ||||
|      | ||||
|     </tbody> | ||||
| </table> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| <dl class="details"> | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
|         <dt class="important tag-deprecated">Deprecated:</dt><dd><ul class="dummy"><li>use api.RightPanelWidget instead</li></ul></dd> | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line42">line 42</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line45">line 45</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -556,115 +448,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line48">line 48</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| </dl> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|          | ||||
|              | ||||
| <h4 class="name" id="NoteContextCachingWidget"><span class="type-signature"></span>NoteContextCachingWidget<span class="type-signature"></span></h4> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     <h5 class="subsection-title">Properties:</h5> | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
| <table class="props"> | ||||
|     <thead> | ||||
|     <tr> | ||||
|          | ||||
| 
 | ||||
|         <th>Type</th> | ||||
| 
 | ||||
|          | ||||
| 
 | ||||
|          | ||||
| 
 | ||||
|         <th class="last">Description</th> | ||||
|     </tr> | ||||
|     </thead> | ||||
| 
 | ||||
|     <tbody> | ||||
|      | ||||
| 
 | ||||
|         <tr> | ||||
|              | ||||
| 
 | ||||
|             <td class="type"> | ||||
|              | ||||
|                  | ||||
| <span class="param-type">NoteContextAwareWidget</span> | ||||
| 
 | ||||
| 
 | ||||
|              | ||||
|             </td> | ||||
| 
 | ||||
|              | ||||
| 
 | ||||
|              | ||||
| 
 | ||||
|             <td class="description last"></td> | ||||
|         </tr> | ||||
| 
 | ||||
|      | ||||
|     </tbody> | ||||
| </table> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| <dl class="details"> | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
|         <dt class="important tag-deprecated">Deprecated:</dt><dd><ul class="dummy"><li>use NoteContextAwareWidget instead</li></ul></dd> | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line66">line 66</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line42">line 42</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -770,223 +554,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line45">line 45</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| </dl> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|          | ||||
|              | ||||
| <h4 class="name" id="TabAwareWidget"><span class="type-signature"></span>TabAwareWidget<span class="type-signature"></span></h4> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     <h5 class="subsection-title">Properties:</h5> | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
| <table class="props"> | ||||
|     <thead> | ||||
|     <tr> | ||||
|          | ||||
| 
 | ||||
|         <th>Type</th> | ||||
| 
 | ||||
|          | ||||
| 
 | ||||
|          | ||||
| 
 | ||||
|         <th class="last">Description</th> | ||||
|     </tr> | ||||
|     </thead> | ||||
| 
 | ||||
|     <tbody> | ||||
|      | ||||
| 
 | ||||
|         <tr> | ||||
|              | ||||
| 
 | ||||
|             <td class="type"> | ||||
|              | ||||
|                  | ||||
| <span class="param-type">NoteContextAwareWidget</span> | ||||
| 
 | ||||
| 
 | ||||
|              | ||||
|             </td> | ||||
| 
 | ||||
|              | ||||
| 
 | ||||
|              | ||||
| 
 | ||||
|             <td class="description last"></td> | ||||
|         </tr> | ||||
| 
 | ||||
|      | ||||
|     </tbody> | ||||
| </table> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| <dl class="details"> | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
|         <dt class="important tag-deprecated">Deprecated:</dt><dd><ul class="dummy"><li>use NoteContextAwareWidget instead</li></ul></dd> | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line54">line 54</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| </dl> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|          | ||||
|              | ||||
| <h4 class="name" id="TabCachingWidget"><span class="type-signature"></span>TabCachingWidget<span class="type-signature"></span></h4> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     <h5 class="subsection-title">Properties:</h5> | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
| <table class="props"> | ||||
|     <thead> | ||||
|     <tr> | ||||
|          | ||||
| 
 | ||||
|         <th>Type</th> | ||||
| 
 | ||||
|          | ||||
| 
 | ||||
|          | ||||
| 
 | ||||
|         <th class="last">Description</th> | ||||
|     </tr> | ||||
|     </thead> | ||||
| 
 | ||||
|     <tbody> | ||||
|      | ||||
| 
 | ||||
|         <tr> | ||||
|              | ||||
| 
 | ||||
|             <td class="type"> | ||||
|              | ||||
|                  | ||||
| <span class="param-type">NoteContextAwareWidget</span> | ||||
| 
 | ||||
| 
 | ||||
|              | ||||
|             </td> | ||||
| 
 | ||||
|              | ||||
| 
 | ||||
|              | ||||
| 
 | ||||
|             <td class="description last"></td> | ||||
|         </tr> | ||||
| 
 | ||||
|      | ||||
|     </tbody> | ||||
| </table> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| <dl class="details"> | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
|         <dt class="important tag-deprecated">Deprecated:</dt><dd><ul class="dummy"><li>use NoteContextAwareWidget instead</li></ul></dd> | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line60">line 60</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line39">line 39</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -1558,7 +1126,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line88">line 88</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line64">line 64</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -1713,7 +1281,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line78">line 78</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line54">line 54</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -2054,7 +1622,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line148">line 148</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line124">line 124</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -2191,7 +1759,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line337">line 337</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line313">line 313</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -2399,7 +1967,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line479">line 479</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line455">line 455</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -2781,7 +2349,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line329">line 329</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line305">line 305</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -2914,7 +2482,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line275">line 275</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line251">line 251</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -3024,7 +2592,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line359">line 359</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line335">line 335</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -3130,7 +2698,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line343">line 343</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line319">line 319</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -3236,7 +2804,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line374">line 374</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line350">line 350</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -3346,7 +2914,7 @@ available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line351">line 351</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line327">line 327</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -3457,7 +3025,7 @@ implementation of actual widget type. | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line368">line 368</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line344">line 344</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -3612,7 +3180,7 @@ implementation of actual widget type. | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line383">line 383</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line359">line 359</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -3767,7 +3335,7 @@ implementation of actual widget type. | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line427">line 427</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line403">line 403</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -3874,7 +3442,7 @@ if some action needs to happen on only one specific instance. | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line268">line 268</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line244">line 244</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -4029,7 +3597,7 @@ if some action needs to happen on only one specific instance. | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line445">line 445</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line421">line 421</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -4185,7 +3753,7 @@ if some action needs to happen on only one specific instance. | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line238">line 238</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line214">line 214</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -4386,7 +3954,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line251">line 251</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line227">line 227</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -4492,7 +4060,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line418">line 418</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line394">line 394</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -4647,7 +4215,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line436">line 436</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line412">line 412</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -4802,7 +4370,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line454">line 454</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line430">line 430</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -4952,7 +4520,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line519">line 519</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line495">line 495</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -5130,7 +4698,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line121">line 121</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line97">line 97</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -5308,7 +4876,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line103">line 103</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line79">line 79</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -5459,7 +5027,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line282">line 282</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line258">line 258</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -5637,7 +5205,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line398">line 398</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line374">line 374</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -5811,7 +5379,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line408">line 408</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line384">line 384</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -5966,7 +5534,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line508">line 508</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line484">line 484</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -6120,7 +5688,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line499">line 499</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line475">line 475</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -6275,7 +5843,7 @@ otherwise (by e.g. createNoteLink()) | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line259">line 259</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line235">line 235</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -6436,7 +6004,7 @@ Internally this serializes the anonymous function into string and sends it to ba | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line181">line 181</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line157">line 157</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -6596,7 +6164,7 @@ Internally this serializes the anonymous function into string and sends it to ba | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line225">line 225</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line201">line 201</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -6752,7 +6320,7 @@ Internally this serializes the anonymous function into string and sends it to ba | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line213">line 213</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line189">line 189</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -6907,7 +6475,7 @@ Internally this serializes the anonymous function into string and sends it to ba | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line463">line 463</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line439">line 439</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -7058,7 +6626,7 @@ Internally this serializes the anonymous function into string and sends it to ba | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line390">line 390</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line366">line 366</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -7213,7 +6781,7 @@ Internally this serializes the anonymous function into string and sends it to ba | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line298">line 298</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line274">line 274</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -7350,7 +6918,7 @@ Internally this serializes the anonymous function into string and sends it to ba | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line290">line 290</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line266">line 266</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -7510,7 +7078,7 @@ Internally this serializes the anonymous function into string and sends it to ba | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line307">line 307</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line283">line 283</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -7670,7 +7238,7 @@ Internally this serializes the anonymous function into string and sends it to ba | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line316">line 316</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line292">line 292</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -7762,7 +7330,7 @@ Typical use case is when new note has been created, we should wait until it is s | ||||
|      | ||||
|     <dt class="tag-source">Source:</dt> | ||||
|     <dd class="tag-source"><ul class="dummy"><li> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line491">line 491</a> | ||||
|         <a href="services_frontend_script_api.js.html">services/frontend_script_api.js</a>, <a href="services_frontend_script_api.js.html#line467">line 467</a> | ||||
|     </li></ul></dd> | ||||
|      | ||||
| 
 | ||||
| @ -7832,7 +7400,7 @@ Typical use case is when new note has been created, we should wait until it is s | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -121,7 +121,7 @@ export default FAttribute; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -105,7 +105,7 @@ export default FBranch; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -101,7 +101,7 @@ class FNote { | ||||
|         this.mime = row.mime; | ||||
|     } | ||||
| 
 | ||||
|     addParent(parentNoteId, branchId) { | ||||
|     addParent(parentNoteId, branchId, sort = true) { | ||||
|         if (parentNoteId === 'none') { | ||||
|             return; | ||||
|         } | ||||
| @ -111,6 +111,10 @@ class FNote { | ||||
|         } | ||||
| 
 | ||||
|         this.parentToBranch[parentNoteId] = branchId; | ||||
| 
 | ||||
|         if (sort) { | ||||
|             this.sortParents(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     addChild(childNoteId, branchId, sort = true) { | ||||
| @ -217,7 +221,7 @@ class FNote { | ||||
| 
 | ||||
|     // will sort the parents so that non-search & non-archived are first and archived at the end | ||||
|     // this is done so that non-search & non-archived paths are always explored as first when looking for note path | ||||
|     resortParents() { | ||||
|     sortParents() { | ||||
|         this.parents.sort((aNoteId, bNoteId) => { | ||||
|             const aBranchId = this.parentToBranch[aNoteId]; | ||||
| 
 | ||||
| @ -225,7 +229,7 @@ class FNote { | ||||
|                 return 1; | ||||
|             } | ||||
| 
 | ||||
|             const aNote = this.froca.getNoteFromCache([aNoteId]); | ||||
|             const aNote = this.froca.getNoteFromCache(aNoteId); | ||||
| 
 | ||||
|             if (aNote.isArchived || aNote.isHiddenCompletely()) { | ||||
|                 return 1; | ||||
| @ -271,6 +275,11 @@ class FNote { | ||||
|         return this.__filterAttrs(this.__getCachedAttributes([]), type, name); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param {string[]} path | ||||
|      * @return {FAttribute[]} | ||||
|      * @private | ||||
|      */ | ||||
|     __getCachedAttributes(path) { | ||||
|         // notes/clones cannot form tree cycles, it is possible to create attribute inheritance cycle via templates | ||||
|         // when template instance is a parent of template itself | ||||
| @ -323,63 +332,49 @@ class FNote { | ||||
|         return this.noteId === 'root'; | ||||
|     } | ||||
| 
 | ||||
|     getAllNotePaths(encounteredNoteIds = null) { | ||||
|     /** | ||||
|      * Gives all possible note paths leading to this note. Paths containing search note are ignored (could form cycles) | ||||
|      * | ||||
|      * @returns {string[][]} - array of notePaths (each represented by array of noteIds constituting the particular note path) | ||||
|      */ | ||||
|     getAllNotePaths() { | ||||
|         if (this.noteId === 'root') { | ||||
|             return [['root']]; | ||||
|         } | ||||
| 
 | ||||
|         if (!encounteredNoteIds) { | ||||
|             encounteredNoteIds = new Set(); | ||||
|         const parentNotes = this.getParentNotes().filter(note => note.type !== 'search'); | ||||
|         let notePaths = []; | ||||
| 
 | ||||
|         if (parentNotes.length === 1) { // optimization for most common case | ||||
|             notePaths = parentNotes[0].getAllNotePaths(); | ||||
|         } else { | ||||
|             notePaths = parentNotes.flatMap(parentNote => parentNote.getAllNotePaths()); | ||||
|         } | ||||
| 
 | ||||
|         encounteredNoteIds.add(this.noteId); | ||||
| 
 | ||||
|         const parentNotes = this.getParentNotes(); | ||||
|         let paths; | ||||
| 
 | ||||
|         if (parentNotes.length === 1) { // optimization for the most common case | ||||
|             if (encounteredNoteIds.has(parentNotes[0].noteId)) { | ||||
|                 return []; | ||||
|             } | ||||
|             else { | ||||
|                 paths = parentNotes[0].getAllNotePaths(encounteredNoteIds); | ||||
|             } | ||||
|         } | ||||
|         else { | ||||
|             paths = []; | ||||
| 
 | ||||
|             for (const parentNote of parentNotes) { | ||||
|                 if (encounteredNoteIds.has(parentNote.noteId)) { | ||||
|                     continue; | ||||
|         for (const notePath of notePaths) { | ||||
|             notePath.push(this.noteId); | ||||
|         } | ||||
| 
 | ||||
|                 const newSet = new Set(encounteredNoteIds); | ||||
| 
 | ||||
|                 paths.push(...parentNote.getAllNotePaths(newSet)); | ||||
|             } | ||||
|         return notePaths; | ||||
|     } | ||||
| 
 | ||||
|         for (const path of paths) { | ||||
|             path.push(this.noteId); | ||||
|         } | ||||
|     /** | ||||
|      * @param {string} [hoistedNoteId='root'] | ||||
|      * @return {Array<{isArchived: boolean, isInHoistedSubTree: boolean, notePath: Array<string>, isHidden: boolean}>} | ||||
|      */ | ||||
|     getSortedNotePathRecords(hoistedNoteId = 'root') { | ||||
|         const isHoistedRoot = hoistedNoteId === 'root'; | ||||
| 
 | ||||
|         return paths; | ||||
|     } | ||||
| 
 | ||||
|     getSortedNotePaths(hoistedNotePath = 'root') { | ||||
|         const notePaths = this.getAllNotePaths().map(path => ({ | ||||
|             notePath: path, | ||||
|             isInHoistedSubTree: path.includes(hoistedNotePath), | ||||
|             isArchived: path.find(noteId => froca.notes[noteId].isArchived), | ||||
|             isSearch: path.find(noteId => froca.notes[noteId].type === 'search'), | ||||
|             isInHoistedSubTree: isHoistedRoot || path.includes(hoistedNoteId), | ||||
|             isArchived: path.some(noteId => froca.notes[noteId].isArchived), | ||||
|             isHidden: path.includes('_hidden') | ||||
|         })); | ||||
| 
 | ||||
|         notePaths.sort((a, b) => { | ||||
|             if (a.isInHoistedSubTree !== b.isInHoistedSubTree) { | ||||
|                 return a.isInHoistedSubTree ? -1 : 1; | ||||
|             } else if (a.isSearch !== b.isSearch) { | ||||
|                 return a.isSearch ? 1 : -1; | ||||
|             } else if (a.isArchived !== b.isArchived) { | ||||
|                 return a.isArchived ? 1 : -1; | ||||
|             } else if (a.isHidden !== b.isHidden) { | ||||
| @ -392,6 +387,28 @@ class FNote { | ||||
|         return notePaths; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns note path considered to be the "best" | ||||
|      * | ||||
|      * @param {string} [hoistedNoteId='root'] | ||||
|      * @return {string[]} array of noteIds constituting the particular note path | ||||
|      */ | ||||
|     getBestNotePath(hoistedNoteId = 'root') { | ||||
|         return this.getSortedNotePathRecords(hoistedNoteId)[0]?.notePath; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns note path considered to be the "best" | ||||
|      * | ||||
|      * @param {string} [hoistedNoteId='root'] | ||||
|      * @return {string} serialized note path (e.g. 'root/a1h315/js725h') | ||||
|      */ | ||||
|     getBestNotePathString(hoistedNoteId = 'root') { | ||||
|         const notePath = this.getBestNotePath(hoistedNoteId); | ||||
| 
 | ||||
|         return notePath?.join("/"); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @return boolean - true if there's no non-hidden path, note is not cloned to the visible tree | ||||
|      */ | ||||
| @ -403,7 +420,7 @@ class FNote { | ||||
|         for (const parentNote of this.getParentNotes()) { | ||||
|             if (parentNote.noteId === 'root') { | ||||
|                 return false; | ||||
|             } else if (parentNote.noteId === '_hidden') { | ||||
|             } else if (parentNote.noteId === '_hidden' || parentNote.type === 'search') { | ||||
|                 continue; | ||||
|             } | ||||
| 
 | ||||
| @ -415,6 +432,13 @@ class FNote { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param {FAttribute[]} attributes | ||||
|      * @param {string} type | ||||
|      * @param {string} name | ||||
|      * @return {FAttribute[]} | ||||
|      * @private | ||||
|      */ | ||||
|     __filterAttrs(attributes, type, name) { | ||||
|         this.__validateTypeName(type, name); | ||||
| 
 | ||||
| @ -551,7 +575,9 @@ class FNote { | ||||
|      * @returns {boolean} true if note has an attribute with given type and name (including inherited) | ||||
|      */ | ||||
|     hasAttribute(type, name) { | ||||
|         return !!this.getAttribute(type, name); | ||||
|         const attributes = this.getAttributes(); | ||||
| 
 | ||||
|         return attributes.some(attr => attr.name === name && attr.type === type); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -619,6 +645,20 @@ class FNote { | ||||
|      */ | ||||
|     hasLabel(name) { return this.hasAttribute(LABEL, name); } | ||||
| 
 | ||||
|     /** | ||||
|      * @param {string} name - label name | ||||
|      * @returns {boolean} true if label exists (including inherited) and does not have "false" value. | ||||
|      */ | ||||
|     isLabelTruthy(name) { | ||||
|         const label = this.getLabel(name); | ||||
| 
 | ||||
|         if (!label) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         return label && label.value !== 'false'; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param {string} name - relation name | ||||
|      * @returns {boolean} true if relation exists (excluding inherited) | ||||
| @ -730,7 +770,14 @@ class FNote { | ||||
|             }); | ||||
| 
 | ||||
|         // attrs are not resorted if position changes after initial load | ||||
|         promotedAttrs.sort((a, b) => a.position < b.position ? -1 : 1); | ||||
|         promotedAttrs.sort((a, b) => { | ||||
|             if (a.noteId === b.noteId) { | ||||
|                 return a.position < b.position ? -1 : 1; | ||||
|             } else { | ||||
|                 // inherited promoted attributes should stay grouped: https://github.com/zadam/trilium/issues/3761 | ||||
|                 return a.noteId < b.noteId ? -1 : 1; | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         return promotedAttrs; | ||||
|     } | ||||
| @ -930,7 +977,7 @@ export default FNote; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -82,7 +82,7 @@ export default FNoteComplement; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -56,7 +56,7 @@ | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
| @ -63,36 +63,12 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | ||||
|     /** @property {dayjs} day.js library for date manipulation. See {@link https://day.js.org} for documentation */ | ||||
|     this.dayjs = dayjs; | ||||
| 
 | ||||
|     /** | ||||
|      * @property {RightPanelWidget} | ||||
|      * @deprecated use api.RightPanelWidget instead | ||||
|      */ | ||||
|     this.CollapsibleWidget = RightPanelWidget; | ||||
| 
 | ||||
|     /** @property {RightPanelWidget} */ | ||||
|     this.RightPanelWidget = RightPanelWidget; | ||||
| 
 | ||||
|     /** @property {NoteContextAwareWidget} */ | ||||
|     this.NoteContextAwareWidget = NoteContextAwareWidget; | ||||
| 
 | ||||
|     /** | ||||
|      * @property {NoteContextAwareWidget} | ||||
|      * @deprecated use NoteContextAwareWidget instead | ||||
|      */ | ||||
|     this.TabAwareWidget = NoteContextAwareWidget; | ||||
| 
 | ||||
|     /** | ||||
|      * @property {NoteContextAwareWidget} | ||||
|      * @deprecated use NoteContextAwareWidget instead | ||||
|      */ | ||||
|     this.TabCachingWidget = NoteContextAwareWidget; | ||||
| 
 | ||||
|     /** | ||||
|      * @property {NoteContextAwareWidget} | ||||
|      * @deprecated use NoteContextAwareWidget instead | ||||
|      */ | ||||
|     this.NoteContextCachingWidget = NoteContextAwareWidget; | ||||
| 
 | ||||
|     /** @property {BasicWidget} */ | ||||
|     this.BasicWidget = BasicWidget; | ||||
| 
 | ||||
| @ -117,7 +93,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | ||||
|         await ws.waitForMaxKnownEntityChangeId(); | ||||
| 
 | ||||
|         await appContext.tabManager.getActiveContext().setNote(notePath); | ||||
|         appContext.triggerEvent('focusAndSelectTitle'); | ||||
|         await appContext.triggerEvent('focusAndSelectTitle'); | ||||
|     }; | ||||
| 
 | ||||
|     /** | ||||
| @ -134,7 +110,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | ||||
|         await appContext.tabManager.openContextWithNote(notePath, { activate }); | ||||
| 
 | ||||
|         if (activate) { | ||||
|             appContext.triggerEvent('focusAndSelectTitle'); | ||||
|             await appContext.triggerEvent('focusAndSelectTitle'); | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
| @ -152,10 +128,10 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | ||||
|         const subContexts = appContext.tabManager.getActiveContext().getSubContexts(); | ||||
|         const {ntxId} = subContexts[subContexts.length - 1]; | ||||
| 
 | ||||
|         appContext.triggerCommand("openNewNoteSplit", {ntxId, notePath}); | ||||
|         await appContext.triggerCommand("openNewNoteSplit", {ntxId, notePath}); | ||||
| 
 | ||||
|         if (activate) { | ||||
|             appContext.triggerEvent('focusAndSelectTitle'); | ||||
|             await appContext.triggerEvent('focusAndSelectTitle'); | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
| @ -581,7 +557,7 @@ export default FrontendScriptApi; | ||||
| <br class="clear"> | ||||
| 
 | ||||
| <footer> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a> | ||||
|     Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> | ||||
| </footer> | ||||
| 
 | ||||
| <script> prettyPrint(); </script> | ||||
|  | ||||
							
								
								
									
										14
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										14
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -12,7 +12,7 @@ | ||||
|       "dependencies": { | ||||
|         "@braintree/sanitize-url": "6.0.2", | ||||
|         "@electron/remote": "2.0.9", | ||||
|         "@excalidraw/excalidraw": "0.15.2", | ||||
|         "@excalidraw/excalidraw": "0.14.2", | ||||
|         "archiver": "5.3.1", | ||||
|         "async-mutex": "0.4.0", | ||||
|         "axios": "1.4.0", | ||||
| @ -462,9 +462,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@excalidraw/excalidraw": { | ||||
|       "version": "0.15.2", | ||||
|       "resolved": "https://registry.npmjs.org/@excalidraw/excalidraw/-/excalidraw-0.15.2.tgz", | ||||
|       "integrity": "sha512-rTI02kgWSTXiUdIkBxt9u/581F3eXcqQgJdIxmz54TFtG3ughoxO5fr4t7Fr2LZIturBPqfocQHGKZ0t2KLKgw==", | ||||
|       "version": "0.14.2", | ||||
|       "resolved": "https://registry.npmjs.org/@excalidraw/excalidraw/-/excalidraw-0.14.2.tgz", | ||||
|       "integrity": "sha512-8LdjpTBWEK5waDWB7Bt/G9YBI4j0OxkstUhvaDGz7dwQGfzF6FW5CXBoYHNEoX0qmb+Fg/NPOlZ7FrKsrSVCqg==", | ||||
|       "peerDependencies": { | ||||
|         "react": "^17.0.2 || ^18.2.0", | ||||
|         "react-dom": "^17.0.2 || ^18.2.0" | ||||
| @ -13591,9 +13591,9 @@ | ||||
|       "dev": true | ||||
|     }, | ||||
|     "@excalidraw/excalidraw": { | ||||
|       "version": "0.15.2", | ||||
|       "resolved": "https://registry.npmjs.org/@excalidraw/excalidraw/-/excalidraw-0.15.2.tgz", | ||||
|       "integrity": "sha512-rTI02kgWSTXiUdIkBxt9u/581F3eXcqQgJdIxmz54TFtG3ughoxO5fr4t7Fr2LZIturBPqfocQHGKZ0t2KLKgw==", | ||||
|       "version": "0.14.2", | ||||
|       "resolved": "https://registry.npmjs.org/@excalidraw/excalidraw/-/excalidraw-0.14.2.tgz", | ||||
|       "integrity": "sha512-8LdjpTBWEK5waDWB7Bt/G9YBI4j0OxkstUhvaDGz7dwQGfzF6FW5CXBoYHNEoX0qmb+Fg/NPOlZ7FrKsrSVCqg==", | ||||
|       "requires": {} | ||||
|     }, | ||||
|     "@gar/promisify": { | ||||
|  | ||||
| @ -33,7 +33,7 @@ | ||||
|   "dependencies": { | ||||
|     "@braintree/sanitize-url": "6.0.2", | ||||
|     "@electron/remote": "2.0.9", | ||||
|     "@excalidraw/excalidraw": "0.15.2", | ||||
|     "@excalidraw/excalidraw": "0.14.2", | ||||
|     "archiver": "5.3.1", | ||||
|     "async-mutex": "0.4.0", | ||||
|     "axios": "1.4.0", | ||||
|  | ||||
| @ -69,18 +69,6 @@ function reload() { | ||||
|     require('../services/ws').reloadFrontend(); | ||||
| } | ||||
| 
 | ||||
| function postProcessEntityUpdate(entityName, entity) { | ||||
|     if (entityName === 'notes') { | ||||
|         noteUpdated(entity); | ||||
|     } else if (entityName === 'branches') { | ||||
|         branchUpdated(entity); | ||||
|     } else if (entityName === 'attributes') { | ||||
|         attributeUpdated(entity); | ||||
|     } else if (entityName === 'note_reordering') { | ||||
|         noteReorderingUpdated(entity); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| eventService.subscribeBeccaLoader([eventService.ENTITY_CHANGE_SYNCED],  ({entityName, entityRow}) => { | ||||
|     if (!becca.loaded) { | ||||
|         return; | ||||
| @ -112,6 +100,25 @@ eventService.subscribeBeccaLoader(eventService.ENTITY_CHANGED,  ({entityName, en | ||||
|     postProcessEntityUpdate(entityName, entity); | ||||
| }); | ||||
| 
 | ||||
| /** | ||||
|  * This gets run on entity being created or updated. | ||||
|  * | ||||
|  * @param entityName | ||||
|  * @param entityRow - can be a becca entity (change comes from this trilium instance) or just a row (from sync). | ||||
|  *                    Should be therefore treated as a row. | ||||
|  */ | ||||
| function postProcessEntityUpdate(entityName, entityRow) { | ||||
|     if (entityName === 'notes') { | ||||
|         noteUpdated(entityRow); | ||||
|     } else if (entityName === 'branches') { | ||||
|         branchUpdated(entityRow); | ||||
|     } else if (entityName === 'attributes') { | ||||
|         attributeUpdated(entityRow); | ||||
|     } else if (entityName === 'note_reordering') { | ||||
|         noteReorderingUpdated(entityRow); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| eventService.subscribeBeccaLoader([eventService.ENTITY_DELETED, eventService.ENTITY_DELETE_SYNCED],  ({entityName, entityId}) => { | ||||
|     if (!becca.loaded) { | ||||
|         return; | ||||
| @ -149,6 +156,7 @@ function branchDeleted(branchId) { | ||||
|             .filter(parentBranch => parentBranch.branchId !== branch.branchId); | ||||
| 
 | ||||
|         if (childNote.parents.length > 0) { | ||||
|             // subtree notes might lose some inherited attributes
 | ||||
|             childNote.invalidateSubTree(); | ||||
|         } | ||||
|     } | ||||
| @ -163,8 +171,8 @@ function branchDeleted(branchId) { | ||||
|     delete becca.branches[branch.branchId]; | ||||
| } | ||||
| 
 | ||||
| function noteUpdated(entity) { | ||||
|     const note = becca.notes[entity.noteId]; | ||||
| function noteUpdated(entityRow) { | ||||
|     const note = becca.notes[entityRow.noteId]; | ||||
| 
 | ||||
|     if (note) { | ||||
|         // type / mime could have been changed, and they are present in flatTextCache
 | ||||
| @ -172,15 +180,19 @@ function noteUpdated(entity) { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| function branchUpdated(branch) { | ||||
|     const childNote = becca.notes[branch.noteId]; | ||||
| function branchUpdated(branchRow) { | ||||
|     const childNote = becca.notes[branchRow.noteId]; | ||||
| 
 | ||||
|     if (childNote) { | ||||
|         childNote.flatTextCache = null; | ||||
|         childNote.sortParents(); | ||||
| 
 | ||||
|         // notes in the subtree can get new inherited attributes
 | ||||
|         // this is in theory needed upon branch creation, but there's no create event for sync changes
 | ||||
|         childNote.invalidateSubTree(); | ||||
|     } | ||||
| 
 | ||||
|     const parentNote = becca.notes[branch.parentNoteId]; | ||||
|     const parentNote = becca.notes[branchRow.parentNoteId]; | ||||
| 
 | ||||
|     if (parentNote) { | ||||
|         parentNote.sortChildren(); | ||||
| @ -222,8 +234,10 @@ function attributeDeleted(attributeId) { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| function attributeUpdated(attribute) { | ||||
|     const note = becca.notes[attribute.noteId]; | ||||
| /** @param {BAttribute} attributeRow */ | ||||
| function attributeUpdated(attributeRow) { | ||||
|     const attribute = becca.attributes[attributeRow.attributeId]; | ||||
|     const note = becca.notes[attributeRow.noteId]; | ||||
| 
 | ||||
|     if (note) { | ||||
|         if (attribute.isAffectingSubtree || note.isInherited()) { | ||||
|  | ||||
| @ -12,6 +12,7 @@ const TaskContext = require("../../services/task_context"); | ||||
| const dayjs = require("dayjs"); | ||||
| const utc = require('dayjs/plugin/utc'); | ||||
| const eventService = require("../../services/events"); | ||||
| const cls = require("../../services/cls.js"); | ||||
| dayjs.extend(utc); | ||||
| 
 | ||||
| const LABEL = 'label'; | ||||
| @ -84,7 +85,7 @@ class BNote extends AbstractBeccaEntity { | ||||
|         this.decrypt(); | ||||
| 
 | ||||
|         /** @type {string|null} */ | ||||
|         this.flatTextCache = null; | ||||
|         this.__flatTextCache = null; | ||||
| 
 | ||||
|         return this; | ||||
|     } | ||||
| @ -108,7 +109,7 @@ class BNote extends AbstractBeccaEntity { | ||||
|         this.__attributeCache = null; | ||||
|         /** @type {BAttribute[]|null} | ||||
|          * @private */ | ||||
|         this.inheritableAttributeCache = null; | ||||
|         this.__inheritableAttributeCache = null; | ||||
| 
 | ||||
|         /** @type {BAttribute[]} | ||||
|          * @private */ | ||||
| @ -118,7 +119,7 @@ class BNote extends AbstractBeccaEntity { | ||||
| 
 | ||||
|         /** @type {BNote[]|null} | ||||
|          * @private */ | ||||
|         this.ancestorCache = null; | ||||
|         this.__ancestorCache = null; | ||||
| 
 | ||||
|         // following attributes are filled during searching from database
 | ||||
| 
 | ||||
| @ -316,11 +317,13 @@ class BNote extends AbstractBeccaEntity { | ||||
|             isSynced: true | ||||
|         }); | ||||
| 
 | ||||
|         if (!cls.isEntityEventsDisabled()) { | ||||
|             eventService.emit(eventService.ENTITY_CHANGED, { | ||||
|                 entityName: 'note_contents', | ||||
|                 entity: this | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     setJsonContent(content) { | ||||
|         this.setContent(JSON.stringify(content, null, '\t')); | ||||
| @ -454,11 +457,11 @@ class BNote extends AbstractBeccaEntity { | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             this.inheritableAttributeCache = []; | ||||
|             this.__inheritableAttributeCache = []; | ||||
| 
 | ||||
|             for (const attr of this.__attributeCache) { | ||||
|                 if (attr.isInheritable) { | ||||
|                     this.inheritableAttributeCache.push(attr); | ||||
|                     this.__inheritableAttributeCache.push(attr); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| @ -475,11 +478,11 @@ class BNote extends AbstractBeccaEntity { | ||||
|             return []; | ||||
|         } | ||||
| 
 | ||||
|         if (!this.inheritableAttributeCache) { | ||||
|             this.__getAttributes(path); // will refresh also this.inheritableAttributeCache
 | ||||
|         if (!this.__inheritableAttributeCache) { | ||||
|             this.__getAttributes(path); // will refresh also this.__inheritableAttributeCache
 | ||||
|         } | ||||
| 
 | ||||
|         return this.inheritableAttributeCache; | ||||
|         return this.__inheritableAttributeCache; | ||||
|     } | ||||
| 
 | ||||
|     __validateTypeName(type, name) { | ||||
| @ -813,40 +816,40 @@ class BNote extends AbstractBeccaEntity { | ||||
|      * @returns {string} - returns flattened textual representation of note, prefixes and attributes | ||||
|      */ | ||||
|     getFlatText() { | ||||
|         if (!this.flatTextCache) { | ||||
|             this.flatTextCache = `${this.noteId} ${this.type} ${this.mime} `; | ||||
|         if (!this.__flatTextCache) { | ||||
|             this.__flatTextCache = `${this.noteId} ${this.type} ${this.mime} `; | ||||
| 
 | ||||
|             for (const branch of this.parentBranches) { | ||||
|                 if (branch.prefix) { | ||||
|                     this.flatTextCache += `${branch.prefix} `; | ||||
|                     this.__flatTextCache += `${branch.prefix} `; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             this.flatTextCache += `${this.title} `; | ||||
|             this.__flatTextCache += `${this.title} `; | ||||
| 
 | ||||
|             for (const attr of this.getAttributes()) { | ||||
|                 // it's best to use space as separator since spaces are filtered from the search string by the tokenization into words
 | ||||
|                 this.flatTextCache += `${attr.type === 'label' ? '#' : '~'}${attr.name}`; | ||||
|                 this.__flatTextCache += `${attr.type === 'label' ? '#' : '~'}${attr.name}`; | ||||
| 
 | ||||
|                 if (attr.value) { | ||||
|                     this.flatTextCache += `=${attr.value}`; | ||||
|                     this.__flatTextCache += `=${attr.value}`; | ||||
|                 } | ||||
| 
 | ||||
|                 this.flatTextCache += ' '; | ||||
|                 this.__flatTextCache += ' '; | ||||
|             } | ||||
| 
 | ||||
|             this.flatTextCache = utils.normalize(this.flatTextCache); | ||||
|             this.__flatTextCache = utils.normalize(this.__flatTextCache); | ||||
|         } | ||||
| 
 | ||||
|         return this.flatTextCache; | ||||
|         return this.__flatTextCache; | ||||
|     } | ||||
| 
 | ||||
|     invalidateThisCache() { | ||||
|         this.flatTextCache = null; | ||||
|         this.__flatTextCache = null; | ||||
| 
 | ||||
|         this.__attributeCache = null; | ||||
|         this.inheritableAttributeCache = null; | ||||
|         this.ancestorCache = null; | ||||
|         this.__inheritableAttributeCache = null; | ||||
|         this.__ancestorCache = null; | ||||
|     } | ||||
| 
 | ||||
|     invalidateSubTree(path = []) { | ||||
| @ -875,24 +878,6 @@ class BNote extends AbstractBeccaEntity { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     invalidateSubtreeFlatText() { | ||||
|         this.flatTextCache = null; | ||||
| 
 | ||||
|         for (const childNote of this.children) { | ||||
|             childNote.invalidateSubtreeFlatText(); | ||||
|         } | ||||
| 
 | ||||
|         for (const targetRelation of this.targetRelations) { | ||||
|             if (targetRelation.name === 'template' || targetRelation.name === 'inherit') { | ||||
|                 const note = targetRelation.note; | ||||
| 
 | ||||
|                 if (note) { | ||||
|                     note.invalidateSubtreeFlatText(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     getRelationDefinitions() { | ||||
|         return this.getLabels() | ||||
|             .filter(l => l.name.startsWith("relation:")); | ||||
| @ -1083,28 +1068,28 @@ class BNote extends AbstractBeccaEntity { | ||||
| 
 | ||||
|     /** @returns {BNote[]} */ | ||||
|     getAncestors() { | ||||
|         if (!this.ancestorCache) { | ||||
|         if (!this.__ancestorCache) { | ||||
|             const noteIds = new Set(); | ||||
|             this.ancestorCache = []; | ||||
|             this.__ancestorCache = []; | ||||
| 
 | ||||
|             for (const parent of this.parents) { | ||||
|                 if (noteIds.has(parent.noteId)) { | ||||
|                     continue; | ||||
|                 } | ||||
| 
 | ||||
|                 this.ancestorCache.push(parent); | ||||
|                 this.__ancestorCache.push(parent); | ||||
|                 noteIds.add(parent.noteId); | ||||
| 
 | ||||
|                 for (const ancestorNote of parent.getAncestors()) { | ||||
|                     if (!noteIds.has(ancestorNote.noteId)) { | ||||
|                         this.ancestorCache.push(ancestorNote); | ||||
|                         this.__ancestorCache.push(ancestorNote); | ||||
|                         noteIds.add(ancestorNote.noteId); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return this.ancestorCache; | ||||
|         return this.__ancestorCache; | ||||
|     } | ||||
| 
 | ||||
|     /** @returns {boolean} */ | ||||
| @ -1192,7 +1177,7 @@ class BNote extends AbstractBeccaEntity { | ||||
| 
 | ||||
|     /** | ||||
|      * @param {string} [hoistedNoteId='root'] | ||||
|      * @return {{isArchived: boolean, isInHoistedSubTree: boolean, notePath: string[], isHidden: boolean}[]} | ||||
|      * @return {Array<{isArchived: boolean, isInHoistedSubTree: boolean, notePath: Array<string>, isHidden: boolean}>} | ||||
|      */ | ||||
|     getSortedNotePathRecords(hoistedNoteId = 'root') { | ||||
|         const isHoistedRoot = hoistedNoteId === 'root'; | ||||
| @ -1491,7 +1476,7 @@ class BNote extends AbstractBeccaEntity { | ||||
|         if (this.isProtected && !this.isDecrypted && protectedSessionService.isProtectedSessionAvailable()) { | ||||
|             try { | ||||
|                 this.title = protectedSessionService.decryptString(this.title); | ||||
|                 this.flatTextCache = null; | ||||
|                 this.__flatTextCache = null; | ||||
| 
 | ||||
|                 this.isDecrypted = true; | ||||
|             } | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /** @param {BNote} note */ | ||||
| function mapNoteToPojo(note) { | ||||
|     return { | ||||
|         noteId: note.noteId, | ||||
| @ -17,6 +18,7 @@ function mapNoteToPojo(note) { | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| /** @param {BBranch} branch */ | ||||
| function mapBranchToPojo(branch) { | ||||
|     return { | ||||
|         branchId: branch.branchId, | ||||
| @ -29,6 +31,7 @@ function mapBranchToPojo(branch) { | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| /** @param {BAttribute} attr */ | ||||
| function mapAttributeToPojo(attr) { | ||||
|     return { | ||||
|         attributeId: attr.attributeId, | ||||
|  | ||||
| @ -332,7 +332,7 @@ class FNote { | ||||
| 
 | ||||
|     /** | ||||
|      * @param {string} [hoistedNoteId='root'] | ||||
|      * @return {{isArchived: boolean, isInHoistedSubTree: boolean, notePath: string[], isHidden: boolean}[]} | ||||
|      * @return {Array<{isArchived: boolean, isInHoistedSubTree: boolean, notePath: Array<string>, isHidden: boolean}>} | ||||
|      */ | ||||
|     getSortedNotePathRecords(hoistedNoteId = 'root') { | ||||
|         const isHoistedRoot = hoistedNoteId === 'root'; | ||||
|  | ||||
| @ -56,13 +56,15 @@ export default class TitleBarButtonsWidget extends BasicWidget { | ||||
|         const $maximizeBtn = this.$widget.find(".maximize-btn"); | ||||
|         const $closeBtn = this.$widget.find(".close-btn"); | ||||
| 
 | ||||
|         //When the window is restarted, the window will not be reset when it is set to the top, so get the window status and set the icon background
 | ||||
|         (function () { | ||||
|         // When the window is restarted, the window will not be reset when it is set to the top,
 | ||||
|         // so get the window status and set the icon background
 | ||||
|         setTimeout(() => { | ||||
|             const remote = utils.dynamicRequire('@electron/remote'); | ||||
|             if (remote.BrowserWindow.getFocusedWindow().isAlwaysOnTop()) { | ||||
|             if (remote.BrowserWindow.getFocusedWindow()?.isAlwaysOnTop()) { | ||||
|                 $topBtn.addClass('active'); | ||||
|             } | ||||
|         }()); | ||||
|         }, 1000); | ||||
| 
 | ||||
|         $topBtn.on('click', () => { | ||||
|             $topBtn.trigger('blur'); | ||||
|             const remote = utils.dynamicRequire('@electron/remote'); | ||||
|  | ||||
| @ -54,11 +54,10 @@ function deriveMime(type, mime) { | ||||
| } | ||||
| 
 | ||||
| function copyChildAttributes(parentNote, childNote) { | ||||
|     const hasAlreadyTemplate = childNote.hasRelation('template'); | ||||
| 
 | ||||
|     for (const attr of parentNote.getAttributes()) { | ||||
|         if (attr.name.startsWith("child:")) { | ||||
|             const name = attr.name.substr(6); | ||||
|             const hasAlreadyTemplate = childNote.hasRelation('template'); | ||||
| 
 | ||||
|             if (hasAlreadyTemplate && attr.type === 'relation' && name === 'template') { | ||||
|                 // if the note already has a template, it means the template was chosen by the user explicitly
 | ||||
| @ -174,7 +173,7 @@ function createNewNote(params) { | ||||
| 
 | ||||
|             // TODO: think about what can happen if the note already exists with the forced ID
 | ||||
|             //       I guess on DB it's going to be fine, but becca references between entities
 | ||||
|             //       might get messed up (two Note instance for the same ID existing in the references)
 | ||||
|             //       might get messed up (two note instances for the same ID existing in the references)
 | ||||
|             note = new BNote({ | ||||
|                 noteId: params.noteId, // optionally can force specific noteId
 | ||||
|                 title: params.title, | ||||
| @ -195,7 +194,7 @@ function createNewNote(params) { | ||||
|         } | ||||
|         finally { | ||||
|             if (!isEntityEventsDisabled) { | ||||
|                 // re-enable entity events only if there were previously enabled
 | ||||
|                 // re-enable entity events only if they were previously enabled
 | ||||
|                 // (they can be disabled in case of import)
 | ||||
|                 cls.enableEntityEvents(); | ||||
|             } | ||||
| @ -215,27 +214,14 @@ function createNewNote(params) { | ||||
| 
 | ||||
|         copyChildAttributes(parentNote, note); | ||||
| 
 | ||||
|         eventService.emit(eventService.ENTITY_CREATED, { entityName: 'notes', entity: note }); | ||||
|         eventService.emit(eventService.ENTITY_CHANGED, { entityName: 'notes', entity: note }); | ||||
|         triggerNoteTitleChanged(note); | ||||
| 
 | ||||
|         eventService.emit(eventService.ENTITY_CREATED, { | ||||
|             entityName: 'notes', | ||||
|             entity: note | ||||
|         }); | ||||
| 
 | ||||
|         eventService.emit(eventService.ENTITY_CREATED, { | ||||
|             entityName: 'note_contents', | ||||
|             entity: note | ||||
|         }); | ||||
| 
 | ||||
|         eventService.emit(eventService.ENTITY_CREATED, { | ||||
|             entityName: 'branches', | ||||
|             entity: branch | ||||
|         }); | ||||
| 
 | ||||
|         eventService.emit(eventService.CHILD_NOTE_CREATED, { | ||||
|             childNote: note, | ||||
|             parentNote: parentNote | ||||
|         }); | ||||
|         // note_contents doesn't use "created" event
 | ||||
|         eventService.emit(eventService.ENTITY_CHANGED, { entityName: 'note_contents', entity: note }); | ||||
|         eventService.emit(eventService.ENTITY_CREATED, { entityName: 'branches', entity: branch }); | ||||
|         eventService.emit(eventService.ENTITY_CHANGED, { entityName: 'branches', entity: branch }); | ||||
|         eventService.emit(eventService.CHILD_NOTE_CREATED, { childNote: note, parentNote: parentNote }); | ||||
| 
 | ||||
|         log.info(`Created new note '${note.noteId}', branch '${branch.branchId}' of type '${note.type}', mime '${note.mime}'`); | ||||
| 
 | ||||
|  | ||||
| @ -40,7 +40,7 @@ class SNote extends AbstractShacaEntity { | ||||
|         /** @param {SAttribute[]|null} */ | ||||
|         this.__attributeCache = null; | ||||
|         /** @param {SAttribute[]|null} */ | ||||
|         this.inheritableAttributeCache = null; | ||||
|         this.__inheritableAttributeCache = null; | ||||
| 
 | ||||
|         /** @param {SAttribute[]} */ | ||||
|         this.targetRelations = []; | ||||
| @ -190,11 +190,11 @@ class SNote extends AbstractShacaEntity { | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             this.inheritableAttributeCache = []; | ||||
|             this.__inheritableAttributeCache = []; | ||||
| 
 | ||||
|             for (const attr of this.__attributeCache) { | ||||
|                 if (attr.isInheritable) { | ||||
|                     this.inheritableAttributeCache.push(attr); | ||||
|                     this.__inheritableAttributeCache.push(attr); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| @ -208,11 +208,11 @@ class SNote extends AbstractShacaEntity { | ||||
|             return []; | ||||
|         } | ||||
| 
 | ||||
|         if (!this.inheritableAttributeCache) { | ||||
|             this.__getAttributes(path); // will refresh also this.inheritableAttributeCache
 | ||||
|         if (!this.__inheritableAttributeCache) { | ||||
|             this.__getAttributes(path); // will refresh also this.__inheritableAttributeCache
 | ||||
|         } | ||||
| 
 | ||||
|         return this.inheritableAttributeCache; | ||||
|         return this.__inheritableAttributeCache; | ||||
|     } | ||||
| 
 | ||||
|     /** @returns {boolean} */ | ||||
|  | ||||
							
								
								
									
										116
									
								
								test-etapi/get-inherited-attribute-cloned.http
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								test-etapi/get-inherited-attribute-cloned.http
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,116 @@ | ||||
| POST {{triliumHost}}/etapi/create-note | ||||
| Authorization: {{authToken}} | ||||
| Content-Type: application/json | ||||
| 
 | ||||
| { | ||||
|   "parentNoteId": "root", | ||||
|   "title": "Hello parent", | ||||
|   "type": "text", | ||||
|   "content": "Hi there!" | ||||
| } | ||||
| 
 | ||||
| > {% | ||||
| client.assert(response.status === 201); | ||||
| client.global.set("parentNoteId", response.body.note.noteId); | ||||
| client.global.set("parentBranchId", response.body.branch.branchId); | ||||
| %} | ||||
| 
 | ||||
| ### Create inheritable parent attribute | ||||
| 
 | ||||
| POST {{triliumHost}}/etapi/attributes | ||||
| Authorization: {{authToken}} | ||||
| Content-Type: application/json | ||||
| 
 | ||||
| { | ||||
|   "noteId": "{{parentNoteId}}", | ||||
|   "type": "label", | ||||
|   "name": "mylabel", | ||||
|   "value": "", | ||||
|   "isInheritable": true, | ||||
|   "position": 10 | ||||
| } | ||||
| 
 | ||||
| > {% | ||||
| client.assert(response.status === 201); | ||||
| client.global.set("parentAttributeId", response.body.attributeId); | ||||
| %} | ||||
| 
 | ||||
| ### Create child note under root | ||||
| 
 | ||||
| POST {{triliumHost}}/etapi/create-note | ||||
| Authorization: {{authToken}} | ||||
| Content-Type: application/json | ||||
| 
 | ||||
| { | ||||
|   "parentNoteId": "root", | ||||
|   "title": "Hello child", | ||||
|   "type": "text", | ||||
|   "content": "Hi there!" | ||||
| } | ||||
| 
 | ||||
| > {% | ||||
| client.assert(response.status === 201); | ||||
| client.global.set("childNoteId", response.body.note.noteId); | ||||
| client.global.set("childBranchId", response.body.branch.branchId); | ||||
| %} | ||||
| 
 | ||||
| ### Create child attribute | ||||
| 
 | ||||
| POST {{triliumHost}}/etapi/attributes | ||||
| Authorization: {{authToken}} | ||||
| Content-Type: application/json | ||||
| 
 | ||||
| { | ||||
|   "noteId": "{{childNoteId}}", | ||||
|   "type": "label", | ||||
|   "name": "mylabel", | ||||
|   "value": "val", | ||||
|   "isInheritable": false, | ||||
|   "position": 10 | ||||
| } | ||||
| 
 | ||||
| > {% | ||||
| client.assert(response.status === 201); | ||||
| client.global.set("childAttributeId", response.body.attributeId); | ||||
| %} | ||||
| 
 | ||||
| ### Clone child to parent | ||||
| 
 | ||||
| POST {{triliumHost}}/etapi/branches | ||||
| Authorization: {{authToken}} | ||||
| Content-Type: application/json | ||||
| 
 | ||||
| { | ||||
|   "noteId": "{{childNoteId}}", | ||||
|   "parentNoteId": "{{parentNoteId}}" | ||||
| } | ||||
| 
 | ||||
| > {% | ||||
| client.assert(response.status === 201); | ||||
| client.assert(response.body.parentNoteId == client.global.get("parentNoteId")); | ||||
| %} | ||||
| 
 | ||||
| ### | ||||
| 
 | ||||
| GET {{triliumHost}}/etapi/notes/{{childNoteId}} | ||||
| Authorization: {{authToken}} | ||||
| 
 | ||||
| > {% | ||||
| 
 | ||||
| function hasAttribute(list, attributeId) { | ||||
|   for (let i = 0; i < list.length; i++) { | ||||
|     if (list[i]["attributeId"] === attributeId) { | ||||
|       return true; | ||||
|     } | ||||
|   } | ||||
|   return false; | ||||
| } | ||||
| 
 | ||||
| client.assert(response.status === 200); | ||||
| client.assert(response.body.noteId == client.global.get("childNoteId")); | ||||
| client.assert(response.body.attributes.length == 2); | ||||
| client.assert(hasAttribute(response.body.attributes,  | ||||
|   client.global.get("parentAttributeId"))); | ||||
| client.assert(hasAttribute(response.body.attributes,  | ||||
|   client.global.get("childAttributeId"))); | ||||
| %} | ||||
							
								
								
									
										44
									
								
								test-etapi/get-inherited-attribute.http
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								test-etapi/get-inherited-attribute.http
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | ||||
| POST {{triliumHost}}/etapi/attributes | ||||
| Authorization: {{authToken}} | ||||
| Content-Type: application/json | ||||
| 
 | ||||
| { | ||||
|   "noteId": "root", | ||||
|   "type": "label", | ||||
|   "name": "mylabel", | ||||
|   "value": "val", | ||||
|   "isInheritable": true | ||||
| } | ||||
| 
 | ||||
| > {% client.global.set("createdAttributeId", response.body.attributeId); %} | ||||
| 
 | ||||
| ### | ||||
| 
 | ||||
| POST {{triliumHost}}/etapi/create-note | ||||
| Authorization: {{authToken}} | ||||
| Content-Type: application/json | ||||
| 
 | ||||
| { | ||||
|   "parentNoteId": "root", | ||||
|   "title": "Hello", | ||||
|   "type": "text", | ||||
|   "content": "Hi there!" | ||||
| } | ||||
| 
 | ||||
| > {% | ||||
| client.global.set("createdNoteId", response.body.note.noteId); | ||||
| client.global.set("createdBranchId", response.body.branch.branchId); | ||||
| %} | ||||
| 
 | ||||
| ### | ||||
| 
 | ||||
| GET {{triliumHost}}/etapi/notes/{{createdNoteId}} | ||||
| Authorization: {{authToken}} | ||||
| 
 | ||||
| > {% | ||||
| client.assert(response.status === 200); | ||||
| client.assert(response.body.noteId == client.global.get("createdNoteId")); | ||||
| client.assert(response.body.attributes.length == 1); | ||||
| client.assert(response.body.attributes[0].attributeId ==  | ||||
|   client.global.get("createdAttributeId")); | ||||
| %} | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 SiriusXT
						SiriusXT