mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 10:26:08 +01:00 
			
		
		
		
	Fix and improve JSDoc for APIs
This commit is contained in:
		| @@ -20,7 +20,7 @@ | |||||||
|     "switch-server": "rm -rf ./node_modules/better-sqlite3 && npm install", |     "switch-server": "rm -rf ./node_modules/better-sqlite3 && npm install", | ||||||
|     "switch-electron": "./node_modules/.bin/electron-rebuild", |     "switch-electron": "./node_modules/.bin/electron-rebuild", | ||||||
|     "build-backend-docs": "rm -rf ./docs/backend_api && ./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/backend_api src/becca/entities/*.js src/services/backend_script_api.js src/services/sql.js", |     "build-backend-docs": "rm -rf ./docs/backend_api && ./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/backend_api src/becca/entities/*.js src/services/backend_script_api.js src/services/sql.js", | ||||||
|     "build-frontend-docs": "rm -rf ./docs/frontend_api && ./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/app/entities/*.js src/public/app/services/frontend_script_api.js src/public/app/widgets/right_panel_widget.js", |     "build-frontend-docs": "rm -rf ./docs/frontend_api && ./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/app/entities/*.js src/public/app/services/frontend_script_api.js src/public/app/widgets/basic_widget.js src/public/app/widgets/note_context_aware_widget.js src/public/app/widgets/right_panel_widget.js", | ||||||
|     "build-docs": "npm run build-backend-docs && npm run build-frontend-docs", |     "build-docs": "npm run build-backend-docs && npm run build-frontend-docs", | ||||||
|     "webpack": "webpack -c webpack.config.js", |     "webpack": "webpack -c webpack.config.js", | ||||||
|     "test-jasmine": "jasmine", |     "test-jasmine": "jasmine", | ||||||
|   | |||||||
| @@ -38,7 +38,10 @@ class BAttachment extends AbstractBeccaEntity { | |||||||
|  |  | ||||||
|         /** @type {string} */ |         /** @type {string} */ | ||||||
|         this.attachmentId = row.attachmentId; |         this.attachmentId = row.attachmentId; | ||||||
|         /** @type {string} either noteId or revisionId to which this attachment belongs */ |         /**  | ||||||
|  |          * either noteId or revisionId to which this attachment belongs | ||||||
|  |          * @type {string} | ||||||
|  |          */ | ||||||
|         this.ownerId = row.ownerId; |         this.ownerId = row.ownerId; | ||||||
|         /** @type {string} */ |         /** @type {string} */ | ||||||
|         this.role = row.role; |         this.role = row.role; | ||||||
| @@ -59,7 +62,10 @@ class BAttachment extends AbstractBeccaEntity { | |||||||
|         /** @type {string} */ |         /** @type {string} */ | ||||||
|         this.utcDateScheduledForErasureSince = row.utcDateScheduledForErasureSince; |         this.utcDateScheduledForErasureSince = row.utcDateScheduledForErasureSince; | ||||||
|  |  | ||||||
|         /** @type {int} optionally added to the entity */ |         /** | ||||||
|  |          * optionally added to the entity | ||||||
|  |          * @type {int} | ||||||
|  |          */ | ||||||
|         this.contentLength = row.contentLength; |         this.contentLength = row.contentLength; | ||||||
|  |  | ||||||
|         this.decrypt(); |         this.decrypt(); | ||||||
|   | |||||||
| @@ -7,6 +7,12 @@ const dateUtils = require("../../services/date_utils"); | |||||||
| const promotedAttributeDefinitionParser = require("../../services/promoted_attribute_definition_parser"); | const promotedAttributeDefinitionParser = require("../../services/promoted_attribute_definition_parser"); | ||||||
| const {sanitizeAttributeName} = require("../../services/sanitize_attribute_name"); | const {sanitizeAttributeName} = require("../../services/sanitize_attribute_name"); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * There are currently only two types of attributes, labels or relations. | ||||||
|  |  * @typedef {"label" | "relation"} AttributeType | ||||||
|  |  */ | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Attribute is an abstract concept which has two real uses - label (key - value pair) |  * Attribute is an abstract concept which has two real uses - label (key - value pair) | ||||||
|  * and relation (representing named relationship between source and target note) |  * and relation (representing named relationship between source and target note) | ||||||
| @@ -47,7 +53,7 @@ class BAttribute extends AbstractBeccaEntity { | |||||||
|         this.attributeId = attributeId; |         this.attributeId = attributeId; | ||||||
|         /** @type {string} */ |         /** @type {string} */ | ||||||
|         this.noteId = noteId; |         this.noteId = noteId; | ||||||
|         /** @type {string} */ |         /** @type {AttributeType} */ | ||||||
|         this.type = type; |         this.type = type; | ||||||
|         /** @type {string} */ |         /** @type {string} */ | ||||||
|         this.name = name; |         this.name = name; | ||||||
|   | |||||||
| @@ -17,6 +17,21 @@ dayjs.extend(utc); | |||||||
| const LABEL = 'label'; | const LABEL = 'label'; | ||||||
| const RELATION = 'relation'; | const RELATION = 'relation'; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * There are many different Note types, some of which are entirely opaque to the | ||||||
|  |  * end user. Those types should be used only for checking against, they are | ||||||
|  |  * not for direct use. | ||||||
|  |  * @typedef {"file" | "image" | "search" | "noteMap" | "launcher" | "doc" | "contentWidget" | "text" | "relationMap" | "render" | "canvas" | "mermaid" | "book" | "webView" | "code"} NoteType | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @typedef {Object} NotePathRecord | ||||||
|  |  * @property {boolean} isArchived | ||||||
|  |  * @property {boolean} isInHoistedSubTree | ||||||
|  |  * @property {Array<string>} notePath | ||||||
|  |  * @property {boolean} isHidden | ||||||
|  |  */ | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Trilium's main entity, which can represent text note, image, code note, file attachment etc. |  * Trilium's main entity, which can represent text note, image, code note, file attachment etc. | ||||||
|  * |  * | ||||||
| @@ -60,7 +75,7 @@ class BNote extends AbstractBeccaEntity { | |||||||
|         this.noteId = noteId; |         this.noteId = noteId; | ||||||
|         /** @type {string} */ |         /** @type {string} */ | ||||||
|         this.title = title; |         this.title = title; | ||||||
|         /** @type {string} */ |         /** @type {NoteType} */ | ||||||
|         this.type = type; |         this.type = type; | ||||||
|         /** @type {string} */ |         /** @type {string} */ | ||||||
|         this.mime = mime; |         this.mime = mime; | ||||||
| @@ -76,7 +91,10 @@ class BNote extends AbstractBeccaEntity { | |||||||
|         this.utcDateCreated = utcDateCreated || dateUtils.utcNowDateTime(); |         this.utcDateCreated = utcDateCreated || dateUtils.utcNowDateTime(); | ||||||
|         /** @type {string} */ |         /** @type {string} */ | ||||||
|         this.utcDateModified = utcDateModified; |         this.utcDateModified = utcDateModified; | ||||||
|         /** @type {boolean} - set during the deletion operation, before it is completed (removed from becca completely) */ |         /**  | ||||||
|  |          * set during the deletion operation, before it is completed (removed from becca completely) | ||||||
|  |          * @type {boolean} | ||||||
|  |          */ | ||||||
|         this.isBeingDeleted = false; |         this.isBeingDeleted = false; | ||||||
|  |  | ||||||
|         // ------ Derived attributes ------ |         // ------ Derived attributes ------ | ||||||
| @@ -1166,7 +1184,7 @@ class BNote extends AbstractBeccaEntity { | |||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @param {string} [hoistedNoteId='root'] |      * @param {string} [hoistedNoteId='root'] | ||||||
|      * @return {Array<{isArchived: boolean, isInHoistedSubTree: boolean, notePath: Array<string>, isHidden: boolean}>} |      * @return {Array<NotePathRecord>} | ||||||
|      */ |      */ | ||||||
|     getSortedNotePathRecords(hoistedNoteId = 'root') { |     getSortedNotePathRecords(hoistedNoteId = 'root') { | ||||||
|         const isHoistedRoot = hoistedNoteId === 'root'; |         const isHoistedRoot = hoistedNoteId === 'root'; | ||||||
|   | |||||||
| @@ -1,3 +1,7 @@ | |||||||
|  | /** | ||||||
|  |  * Attachment is a file directly tied into a note without | ||||||
|  |  * being a hidden child. | ||||||
|  |  */ | ||||||
| class FAttachment { | class FAttachment { | ||||||
|     constructor(froca, row) { |     constructor(froca, row) { | ||||||
|         /** @type {Froca} */ |         /** @type {Froca} */ | ||||||
| @@ -24,7 +28,10 @@ class FAttachment { | |||||||
|         /** @type {string} */ |         /** @type {string} */ | ||||||
|         this.utcDateScheduledForErasureSince = row.utcDateScheduledForErasureSince; |         this.utcDateScheduledForErasureSince = row.utcDateScheduledForErasureSince; | ||||||
|  |  | ||||||
|         /** @type {int} optionally added to the entity */ |         /** | ||||||
|  |          * optionally added to the entity  | ||||||
|  |          * @type {int} | ||||||
|  |          */ | ||||||
|         this.contentLength = row.contentLength; |         this.contentLength = row.contentLength; | ||||||
|  |  | ||||||
|         this.froca.attachments[this.attachmentId] = this; |         this.froca.attachments[this.attachmentId] = this; | ||||||
|   | |||||||
| @@ -1,5 +1,10 @@ | |||||||
| import promotedAttributeDefinitionParser from '../services/promoted_attribute_definition_parser.js'; | import promotedAttributeDefinitionParser from '../services/promoted_attribute_definition_parser.js'; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * There are currently only two types of attributes, labels or relations. | ||||||
|  |  * @typedef {"label" | "relation"} AttributeType | ||||||
|  |  */ | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Attribute is an abstract concept which has two real uses - label (key - value pair) |  * Attribute is an abstract concept which has two real uses - label (key - value pair) | ||||||
|  * and relation (representing named relationship between source and target note) |  * and relation (representing named relationship between source and target note) | ||||||
| @@ -17,7 +22,7 @@ class FAttribute { | |||||||
|         this.attributeId = row.attributeId; |         this.attributeId = row.attributeId; | ||||||
|         /** @type {string} */ |         /** @type {string} */ | ||||||
|         this.noteId = row.noteId; |         this.noteId = row.noteId; | ||||||
|         /** @type {string} */ |         /** @type {AttributeType} */ | ||||||
|         this.type = row.type; |         this.type = row.type; | ||||||
|         /** @type {string} */ |         /** @type {string} */ | ||||||
|         this.name = row.name; |         this.name = row.name; | ||||||
|   | |||||||
| @@ -25,6 +25,25 @@ const NOTE_TYPE_ICONS = { | |||||||
|     "contentWidget": "bx bxs-widget" |     "contentWidget": "bx bxs-widget" | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * There are many different Note types, some of which are entirely opaque to the | ||||||
|  |  * end user. Those types should be used only for checking against, they are | ||||||
|  |  * not for direct use. | ||||||
|  |  * @typedef {"file" | "image" | "search" | "noteMap" | "launcher" | "doc" | "contentWidget" | "text" | "relationMap" | "render" | "canvas" | "mermaid" | "book" | "webView" | "code"} NoteType | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @typedef {Object} NotePathRecord | ||||||
|  |  * @property {boolean} isArchived | ||||||
|  |  * @property {boolean} isInHoistedSubTree | ||||||
|  |  * @property {boolean} isSearch | ||||||
|  |  * @property {Array<string>} notePath | ||||||
|  |  * @property {boolean} isHidden | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Note is the main node and concept in Trilium. | ||||||
|  |  */ | ||||||
| class FNote { | class FNote { | ||||||
|     /** |     /** | ||||||
|      * @param {Froca} froca |      * @param {Froca} froca | ||||||
| @@ -65,8 +84,8 @@ class FNote { | |||||||
|         /** @type {boolean} */ |         /** @type {boolean} */ | ||||||
|         this.isProtected = !!row.isProtected; |         this.isProtected = !!row.isProtected; | ||||||
|         /** |         /** | ||||||
|          * one of 'text', 'code', 'file' or 'render' |          * See {@see NoteType} for info on values. | ||||||
|          * @type {string} |          * @type {NoteType} | ||||||
|          */ |          */ | ||||||
|         this.type = row.type; |         this.type = row.type; | ||||||
|         /** |         /** | ||||||
| @@ -371,7 +390,7 @@ class FNote { | |||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @param {string} [hoistedNoteId='root'] |      * @param {string} [hoistedNoteId='root'] | ||||||
|      * @return {Array<{isArchived: boolean, isInHoistedSubTree: boolean, isSearch: boolean, notePath: Array<string>, isHidden: boolean}>} |      * @return {Array<NotePathRecord>} | ||||||
|      */ |      */ | ||||||
|     getSortedNotePathRecords(hoistedNoteId = 'root') { |     getSortedNotePathRecords(hoistedNoteId = 'root') { | ||||||
|         const isHoistedRoot = hoistedNoteId === 'root'; |         const isHoistedRoot = hoistedNoteId === 'root'; | ||||||
| @@ -450,7 +469,7 @@ class FNote { | |||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @param {FAttribute[]} attributes |      * @param {FAttribute[]} attributes | ||||||
|      * @param {string} type |      * @param {AttributeType} type | ||||||
|      * @param {string} name |      * @param {string} name | ||||||
|      * @return {FAttribute[]} |      * @return {FAttribute[]} | ||||||
|      * @private |      * @private | ||||||
| @@ -579,7 +598,7 @@ class FNote { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @param {string} type - attribute type (label, relation, etc.) |      * @param {AttributeType} type - attribute type (label, relation, etc.) | ||||||
|      * @param {string} name - attribute name |      * @param {string} name - attribute name | ||||||
|      * @returns {boolean} true if note has an attribute with given type and name (including inherited) |      * @returns {boolean} true if note has an attribute with given type and name (including inherited) | ||||||
|      */ |      */ | ||||||
| @@ -590,7 +609,7 @@ class FNote { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @param {string} type - attribute type (label, relation, etc.) |      * @param {AttributeType} type - attribute type (label, relation, etc.) | ||||||
|      * @param {string} name - attribute name |      * @param {string} name - attribute name | ||||||
|      * @returns {boolean} true if note has an attribute with given type and name (including inherited) |      * @returns {boolean} true if note has an attribute with given type and name (including inherited) | ||||||
|      */ |      */ | ||||||
| @@ -599,7 +618,7 @@ class FNote { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @param {string} type - attribute type (label, relation, etc.) |      * @param {AttributeType} type - attribute type (label, relation, etc.) | ||||||
|      * @param {string} name - attribute name |      * @param {string} name - attribute name | ||||||
|      * @returns {FAttribute} attribute of the given type and name. If there are more such attributes, first is returned. Returns null if there's no such attribute belonging to this note. |      * @returns {FAttribute} attribute of the given type and name. If there are more such attributes, first is returned. Returns null if there's no such attribute belonging to this note. | ||||||
|      */ |      */ | ||||||
| @@ -610,7 +629,7 @@ class FNote { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @param {string} type - attribute type (label, relation, etc.) |      * @param {AttributeType} type - attribute type (label, relation, etc.) | ||||||
|      * @param {string} name - attribute name |      * @param {string} name - attribute name | ||||||
|      * @returns {FAttribute} attribute of the given type and name. If there are more such attributes, first is returned. Returns null if there's no such attribute belonging to this note. |      * @returns {FAttribute} attribute of the given type and name. If there are more such attributes, first is returned. Returns null if there's no such attribute belonging to this note. | ||||||
|      */ |      */ | ||||||
| @@ -621,7 +640,7 @@ class FNote { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @param {string} type - attribute type (label, relation, etc.) |      * @param {AttributeType} type - attribute type (label, relation, etc.) | ||||||
|      * @param {string} name - attribute name |      * @param {string} name - attribute name | ||||||
|      * @returns {string} attribute value of the given type and name or null if no such attribute exists. |      * @returns {string} attribute value of the given type and name or null if no such attribute exists. | ||||||
|      */ |      */ | ||||||
| @@ -632,7 +651,7 @@ class FNote { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @param {string} type - attribute type (label, relation, etc.) |      * @param {AttributeType} type - attribute type (label, relation, etc.) | ||||||
|      * @param {string} name - attribute name |      * @param {string} name - attribute name | ||||||
|      * @returns {string} attribute value of the given type and name or null if no such attribute exists. |      * @returns {string} attribute value of the given type and name or null if no such attribute exists. | ||||||
|      */ |      */ | ||||||
|   | |||||||
| @@ -15,6 +15,18 @@ import BasicWidget from "../widgets/basic_widget.js"; | |||||||
| import SpacedUpdate from "./spaced_update.js"; | import SpacedUpdate from "./spaced_update.js"; | ||||||
| import shortcutService from "./shortcuts.js"; | import shortcutService from "./shortcuts.js"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * A whole number | ||||||
|  |  * @typedef {number} int | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * An instance of the frontend api available globally. | ||||||
|  |  * @global | ||||||
|  |  * @var {FrontendScriptApi} api | ||||||
|  |  */ | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * <p>This is the main frontend API interface for scripts. All the properties and methods are published in the "api" object |  * <p>This is the main frontend API interface for scripts. All the properties and methods are published in the "api" object | ||||||
|  * available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.startNote.title);</code></p> |  * available in the JS frontend notes. You can use e.g. <code>api.showMessage(api.startNote.title);</code></p> | ||||||
| @@ -22,26 +34,44 @@ import shortcutService from "./shortcuts.js"; | |||||||
|  * @constructor |  * @constructor | ||||||
|  */ |  */ | ||||||
| function FrontendScriptApi(startNote, currentNote, originEntity = null, $container = null) { | function FrontendScriptApi(startNote, currentNote, originEntity = null, $container = null) { | ||||||
|     /** @property {jQuery} container of all the rendered script content */ |     /**  | ||||||
|  |      * Container of all the rendered script content | ||||||
|  |      * @type {jQuery} | ||||||
|  |      * */ | ||||||
|     this.$container = $container; |     this.$container = $container; | ||||||
|  |  | ||||||
|     /** @property {object} note where the script started executing */ |     /** | ||||||
|  |      * Note where the script started executing | ||||||
|  |      * @type {FNote} | ||||||
|  |      */ | ||||||
|     this.startNote = startNote; |     this.startNote = startNote; | ||||||
|     /** @property {object} note where the script is currently executing */ |  | ||||||
|  |     /** | ||||||
|  |      * Note where the script is currently executing | ||||||
|  |      * @type {FNote} | ||||||
|  |      */ | ||||||
|     this.currentNote = currentNote; |     this.currentNote = currentNote; | ||||||
|     /** @property {object|null} entity whose event triggered this execution */ |     /**  | ||||||
|  |      * Entity whose event triggered this execution | ||||||
|  |      * @type {object|null} | ||||||
|  |      */ | ||||||
|     this.originEntity = originEntity; |     this.originEntity = originEntity; | ||||||
|  |  | ||||||
|     /** @property {dayjs} day.js library for date manipulation. See {@link https://day.js.org} for documentation */ |     /** | ||||||
|  |      * day.js library for date manipulation. | ||||||
|  |      * See {@link https://day.js.org} for documentation | ||||||
|  |      * @see https://day.js.org | ||||||
|  |      * @type {dayjs} | ||||||
|  |      */ | ||||||
|     this.dayjs = dayjs; |     this.dayjs = dayjs; | ||||||
|  |  | ||||||
|     /** @property {RightPanelWidget} */ |     /** @type {RightPanelWidget} */ | ||||||
|     this.RightPanelWidget = RightPanelWidget; |     this.RightPanelWidget = RightPanelWidget; | ||||||
|  |  | ||||||
|     /** @property {NoteContextAwareWidget} */ |     /** @type {NoteContextAwareWidget} */ | ||||||
|     this.NoteContextAwareWidget = NoteContextAwareWidget; |     this.NoteContextAwareWidget = NoteContextAwareWidget; | ||||||
|  |  | ||||||
|     /** @property {BasicWidget} */ |     /** @type {BasicWidget} */ | ||||||
|     this.BasicWidget = BasicWidget; |     this.BasicWidget = BasicWidget; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -114,12 +144,12 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | |||||||
|      * @deprecated you can now create/modify launchers in the top-left Menu -> Configure Launchbar |      * @deprecated you can now create/modify launchers in the top-left Menu -> Configure Launchbar | ||||||
|      *             for special needs there's also backend API's createOrUpdateLauncher() |      *             for special needs there's also backend API's createOrUpdateLauncher() | ||||||
|      * @param {object} opts |      * @param {object} opts | ||||||
|      * @property {string} [opts.id] - id of the button, used to identify the old instances of this button to be replaced |      * @param {string} opts.title | ||||||
|  |      * @param {function} opts.action - callback handling the click on the button | ||||||
|  |      * @param {string} [opts.id] - id of the button, used to identify the old instances of this button to be replaced | ||||||
|      *                          ID is optional because of BC, but not specifying it is deprecated. ID can be alphanumeric only. |      *                          ID is optional because of BC, but not specifying it is deprecated. ID can be alphanumeric only. | ||||||
|      * @property {string} opts.title |      * @param {string} [opts.icon] - name of the boxicon to be used (e.g. "time" for "bx-time" icon) | ||||||
|      * @property {string} [opts.icon] - name of the boxicon to be used (e.g. "time" for "bx-time" icon) |      * @param {string} [opts.shortcut] - keyboard shortcut for the button, e.g. "alt+t" | ||||||
|      * @property {function} opts.action - callback handling the click on the button |  | ||||||
|      * @property {string} [opts.shortcut] - keyboard shortcut for the button, e.g. "alt+t" |  | ||||||
|      */ |      */ | ||||||
|     this.addButtonToToolbar = async opts => { |     this.addButtonToToolbar = async opts => { | ||||||
|         console.warn("api.addButtonToToolbar() has been deprecated since v0.58 and may be removed in the future. Use  Menu -> Configure Launchbar to create/update launchers instead."); |         console.warn("api.addButtonToToolbar() has been deprecated since v0.58 and may be removed in the future. Use  Menu -> Configure Launchbar to create/update launchers instead."); | ||||||
| @@ -150,9 +180,9 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | |||||||
|      * Internally this serializes the anonymous function into string and sends it to backend via AJAX. |      * Internally this serializes the anonymous function into string and sends it to backend via AJAX. | ||||||
|      * |      * | ||||||
|      * @method |      * @method | ||||||
|      * @param {string} script - script to be executed on the backend |      * @param {string|Function} script - script to be executed on the backend | ||||||
|      * @param {Array.<?>} params - list of parameters to the anonymous function to be sent to backend |      * @param {Array<any>} params - list of parameters to the anonymous function to be sent to backend | ||||||
|      * @returns {Promise<*>} return value of the executed function on the backend |      * @returns {Promise<any>} return value of the executed function on the backend | ||||||
|      */ |      */ | ||||||
|     this.runOnBackend = async (script, params = []) => { |     this.runOnBackend = async (script, params = []) => { | ||||||
|         if (typeof script === "function") { |         if (typeof script === "function") { | ||||||
| @@ -300,7 +330,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, $contain | |||||||
|      * @param {boolean} [params.showTooltip=true] - enable/disable tooltip on the link |      * @param {boolean} [params.showTooltip=true] - enable/disable tooltip on the link | ||||||
|      * @param {boolean} [params.showNotePath=false] - show also whole note's path as part of the link |      * @param {boolean} [params.showNotePath=false] - show also whole note's path as part of the link | ||||||
|      * @param {boolean} [params.showNoteIcon=false] - show also note icon before the title |      * @param {boolean} [params.showNoteIcon=false] - show also note icon before the title | ||||||
|      * @param {string} [params.title=] - custom link tile with note's title as default |      * @param {string} [params.title] - custom link tile with note's title as default | ||||||
|      */ |      */ | ||||||
|     this.createLink = linkService.createLink; |     this.createLink = linkService.createLink; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,11 @@ | |||||||
| import Component from "../components/component.js"; | import Component from "../components/component.js"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * This is the base widget for all other widgets. | ||||||
|  |  *  | ||||||
|  |  * For information on using widgets, see the tutorial {@tutorial widget_basics}. | ||||||
|  |  */ | ||||||
| class BasicWidget extends Component { | class BasicWidget extends Component { | ||||||
|     constructor() { |     constructor() { | ||||||
|         super(); |         super(); | ||||||
| @@ -64,6 +70,11 @@ class BasicWidget extends Component { | |||||||
|         return this; |         return this; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Accepts a string of CSS to add with the widget. | ||||||
|  |      * @param {string} block  | ||||||
|  |      * @returns {this} for chaining | ||||||
|  |      */ | ||||||
|     cssBlock(block) { |     cssBlock(block) { | ||||||
|         this.cssEl = block; |         this.cssEl = block; | ||||||
|         return this; |         return this; | ||||||
| @@ -112,7 +123,10 @@ class BasicWidget extends Component { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * for overriding |      * Method used for rendering the widget. | ||||||
|  |      *  | ||||||
|  |      * Your class should override this method. | ||||||
|  |      * @returns {JQuery<HTMLElement>} Your widget. | ||||||
|      */ |      */ | ||||||
|     doRender() {} |     doRender() {} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,7 +1,11 @@ | |||||||
| import BasicWidget from "./basic_widget.js"; | import BasicWidget from "./basic_widget.js"; | ||||||
| import appContext from "../components/app_context.js"; | import appContext from "../components/app_context.js"; | ||||||
|  |  | ||||||
| export default class NoteContextAwareWidget extends BasicWidget { | /** | ||||||
|  |  * This widget allows for changing and updating depending on the active note. | ||||||
|  |  * @extends {BasicWidget} | ||||||
|  |  */ | ||||||
|  | class NoteContextAwareWidget extends BasicWidget { | ||||||
|     isNoteContext(ntxId) { |     isNoteContext(ntxId) { | ||||||
|         if (Array.isArray(ntxId)) { |         if (Array.isArray(ntxId)) { | ||||||
|             return this.noteContext && ntxId.includes(this.noteContext.ntxId); |             return this.noteContext && ntxId.includes(this.noteContext.ntxId); | ||||||
| @@ -43,6 +47,9 @@ export default class NoteContextAwareWidget extends BasicWidget { | |||||||
|         return this.noteContext?.ntxId; |         return this.noteContext?.ntxId; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * @returns {boolean} true when an active note exists | ||||||
|  |      */ | ||||||
|     isEnabled() { |     isEnabled() { | ||||||
|         return !!this.note; |         return !!this.note; | ||||||
|     } |     } | ||||||
| @@ -58,6 +65,8 @@ export default class NoteContextAwareWidget extends BasicWidget { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|  |      * Override this method to be able to refresh your | ||||||
|  |      * widget with each note. | ||||||
|      * @param {FNote} note |      * @param {FNote} note | ||||||
|      * @returns {Promise<void>} |      * @returns {Promise<void>} | ||||||
|      */ |      */ | ||||||
| @@ -109,3 +118,5 @@ export default class NoteContextAwareWidget extends BasicWidget { | |||||||
|         await this.refresh(); |         await this.refresh(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | export default NoteContextAwareWidget; | ||||||
|   | |||||||
| @@ -9,11 +9,19 @@ const WIDGET_TPL = ` | |||||||
|     </div> |     </div> | ||||||
| </div>`; | </div>`; | ||||||
|  |  | ||||||
| export default class RightPanelWidget extends NoteContextAwareWidget { | /** | ||||||
|  |  * This widget manages rendering panels in the right-hand pane. | ||||||
|  |  * @extends {NoteContextAwareWidget} | ||||||
|  |  */ | ||||||
|  | class RightPanelWidget extends NoteContextAwareWidget { | ||||||
|  |     /** Title to show in the panel. */ | ||||||
|     get widgetTitle() { return "Untitled widget"; } |     get widgetTitle() { return "Untitled widget"; } | ||||||
|  |  | ||||||
|     get help() { return {}; } |     get help() { return {}; } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Do not override this method unless you know what you're doing. | ||||||
|  |      */ | ||||||
|     doRender() { |     doRender() { | ||||||
|         this.$widget = $(WIDGET_TPL); |         this.$widget = $(WIDGET_TPL); | ||||||
|         this.contentSized(); |         this.contentSized(); | ||||||
| @@ -30,6 +38,13 @@ export default class RightPanelWidget extends NoteContextAwareWidget { | |||||||
|         this.initialized = this.doRenderBody(); |         this.initialized = this.doRenderBody(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* for overriding */ |     /** | ||||||
|  |      * Method used for rendering the body of the widget. | ||||||
|  |      *  | ||||||
|  |      * Your class should override this method. | ||||||
|  |      * @returns {JQuery<HTMLElement>} The body of your widget. | ||||||
|  |      */ | ||||||
|     async doRenderBody() {} |     async doRenderBody() {} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | export default RightPanelWidget; | ||||||
| @@ -20,6 +20,18 @@ const specialNotesService = require("./special_notes"); | |||||||
| const branchService = require("./branches"); | const branchService = require("./branches"); | ||||||
| const exportService = require("./export/zip"); | const exportService = require("./export/zip"); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * A whole number | ||||||
|  |  * @typedef {number} int | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * An instance of the frontend api available globally. | ||||||
|  |  * @global | ||||||
|  |  * @var {BackendScriptApi} api | ||||||
|  |  */ | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * <p>This is the main backend API interface for scripts. All the properties and methods are published in the "api" object |  * <p>This is the main backend API interface for scripts. All the properties and methods are published in the "api" object | ||||||
|  * available in the JS backend notes. You can use e.g. <code>api.log(api.startNote.title);</code></p> |  * available in the JS backend notes. You can use e.g. <code>api.log(api.startNote.title);</code></p> | ||||||
| @@ -27,11 +39,20 @@ const exportService = require("./export/zip"); | |||||||
|  * @constructor |  * @constructor | ||||||
|  */ |  */ | ||||||
| function BackendScriptApi(currentNote, apiParams) { | function BackendScriptApi(currentNote, apiParams) { | ||||||
|     /** @property {BNote} note where the script started executing */ |     /** | ||||||
|  |      * Note where the script started executing | ||||||
|  |      * @type {BNote} | ||||||
|  |      */ | ||||||
|     this.startNote = apiParams.startNote; |     this.startNote = apiParams.startNote; | ||||||
|     /** @property {BNote} note where the script is currently executing. Don't mix this up with the concept of active note */ |     /** | ||||||
|  |      * Note where the script is currently executing. Don't mix this up with the concept of active note | ||||||
|  |      * @type {BNote} | ||||||
|  |      */ | ||||||
|     this.currentNote = currentNote; |     this.currentNote = currentNote; | ||||||
|     /** @property {AbstractBeccaEntity} entity whose event triggered this execution */ |     /** | ||||||
|  |      * Entity whose event triggered this execution | ||||||
|  |      * @type {AbstractBeccaEntity} | ||||||
|  |      */ | ||||||
|     this.originEntity = apiParams.originEntity; |     this.originEntity = apiParams.originEntity; | ||||||
|  |  | ||||||
|     for (const key in apiParams) { |     for (const key in apiParams) { | ||||||
| @@ -39,13 +60,20 @@ function BackendScriptApi(currentNote, apiParams) { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @property {axios} Axios library for HTTP requests. See {@link https://axios-http.com} for documentation |      * Axios library for HTTP requests. See {@link https://axios-http.com} for documentation | ||||||
|  |      * @type {axios}  | ||||||
|      * @deprecated use native (browser compatible) fetch() instead |      * @deprecated use native (browser compatible) fetch() instead | ||||||
|      */ |      */ | ||||||
|     this.axios = axios; |     this.axios = axios; | ||||||
|     /** @property {dayjs} day.js library for date manipulation. See {@link https://day.js.org} for documentation */ |     /** | ||||||
|  |      * day.js library for date manipulation. See {@link https://day.js.org} for documentation  | ||||||
|  |      * @type {dayjs} | ||||||
|  |      */ | ||||||
|     this.dayjs = dayjs; |     this.dayjs = dayjs; | ||||||
|     /** @property {axios} xml2js library for XML parsing. See {@link https://github.com/Leonidas-from-XIV/node-xml2js} for documentation */ |     /**  | ||||||
|  |      * xml2js library for XML parsing. See {@link https://github.com/Leonidas-from-XIV/node-xml2js} for documentation | ||||||
|  |      * @type {xml2js}  | ||||||
|  |      */ | ||||||
|     this.xml2js = xml2js; |     this.xml2js = xml2js; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -206,16 +234,16 @@ function BackendScriptApi(currentNote, apiParams) { | |||||||
|     /** |     /** | ||||||
|      * @method |      * @method | ||||||
|      * |      * | ||||||
|      * @property {object} params |      * @param {object} params | ||||||
|      * @property {string} params.parentNoteId |      * @param {string} params.parentNoteId | ||||||
|      * @property {string} params.title |      * @param {string} params.title | ||||||
|      * @property {string|buffer} params.content |      * @param {string|Buffer} params.content | ||||||
|      * @property {string} params.type - text, code, file, image, search, book, relationMap, canvas |      * @param {NoteType} params.type - text, code, file, image, search, book, relationMap, canvas | ||||||
|      * @property {string} [params.mime] - value is derived from default mimes for type |      * @param {string} [params.mime] - value is derived from default mimes for type | ||||||
|      * @property {boolean} [params.isProtected=false] |      * @param {boolean} [params.isProtected=false] | ||||||
|      * @property {boolean} [params.isExpanded=false] |      * @param {boolean} [params.isExpanded=false] | ||||||
|      * @property {string} [params.prefix=''] |      * @param {string} [params.prefix=''] | ||||||
|      * @property {int} [params.notePosition] - default is last existing notePosition in a parent + 10 |      * @param {int} [params.notePosition] - default is last existing notePosition in a parent + 10 | ||||||
|      * @returns {{note: BNote, branch: BBranch}} object contains newly created entities note and branch |      * @returns {{note: BNote, branch: BBranch}} object contains newly created entities note and branch | ||||||
|      */ |      */ | ||||||
|     this.createNewNote = noteService.createNewNote; |     this.createNewNote = noteService.createNewNote; | ||||||
| @@ -228,14 +256,14 @@ function BackendScriptApi(currentNote, apiParams) { | |||||||
|      * @param {string} title |      * @param {string} title | ||||||
|      * @param {string} [content=""] |      * @param {string} [content=""] | ||||||
|      * @param {object} [extraOptions={}] |      * @param {object} [extraOptions={}] | ||||||
|      * @property {boolean} [extraOptions.json=false] - should the note be JSON |      * @param {boolean} [extraOptions.json=false] - should the note be JSON | ||||||
|      * @property {boolean} [extraOptions.isProtected=false] - should the note be protected |      * @param {boolean} [extraOptions.isProtected=false] - should the note be protected | ||||||
|      * @property {string} [extraOptions.type='text'] - note type |      * @param {string} [extraOptions.type='text'] - note type | ||||||
|      * @property {string} [extraOptions.mime='text/html'] - MIME type of the note |      * @param {string} [extraOptions.mime='text/html'] - MIME type of the note | ||||||
|      * @property {object[]} [extraOptions.attributes=[]] - attributes to be created for this note |      * @param {object[]} [extraOptions.attributes=[]] - attributes to be created for this note | ||||||
|      * @property {string} extraOptions.attributes.type - attribute type - label, relation etc. |      * @param {AttributeType} extraOptions.attributes.type - attribute type - label, relation etc. | ||||||
|      * @property {string} extraOptions.attributes.name - attribute name |      * @param {string} extraOptions.attributes.name - attribute name | ||||||
|      * @property {string} [extraOptions.attributes.value] - attribute value |      * @param {string} [extraOptions.attributes.value] - attribute value | ||||||
|      * @returns {{note: BNote, branch: BBranch}} object contains newly created entities note and branch |      * @returns {{note: BNote, branch: BBranch}} object contains newly created entities note and branch | ||||||
|      */ |      */ | ||||||
|     this.createNote = (parentNoteId, title, content = "", extraOptions= {}) => { |     this.createNote = (parentNoteId, title, content = "", extraOptions= {}) => { | ||||||
| @@ -370,10 +398,10 @@ function BackendScriptApi(currentNote, apiParams) { | |||||||
|      * @method |      * @method | ||||||
|      * @param {string} parentNoteId - this note's child notes will be sorted |      * @param {string} parentNoteId - this note's child notes will be sorted | ||||||
|      * @param {object} [sortConfig] |      * @param {object} [sortConfig] | ||||||
|      * @property {string} [sortConfig.sortBy=title] - 'title', 'dateCreated', 'dateModified' or a label name |      * @param {string} [sortConfig.sortBy=title] - 'title', 'dateCreated', 'dateModified' or a label name | ||||||
|      *                                See {@link https://github.com/zadam/trilium/wiki/Sorting} for details. |      *                                See {@link https://github.com/zadam/trilium/wiki/Sorting} for details. | ||||||
|      * @property {boolean} [sortConfig.reverse=false] |      * @param {boolean} [sortConfig.reverse=false] | ||||||
|      * @property {boolean} [sortConfig.foldersFirst=false] |      * @param {boolean} [sortConfig.foldersFirst=false] | ||||||
|      * @returns {void} |      * @returns {void} | ||||||
|      */ |      */ | ||||||
|     this.sortNotes = (parentNoteId, sortConfig = {}) => treeService.sortNotes( |     this.sortNotes = (parentNoteId, sortConfig = {}) => treeService.sortNotes( | ||||||
| @@ -404,7 +432,7 @@ function BackendScriptApi(currentNote, apiParams) { | |||||||
|      * |      * | ||||||
|      * @method |      * @method | ||||||
|      * @param {function} func |      * @param {function} func | ||||||
|      * @returns {?} result of func callback |      * @returns {any} result of func callback | ||||||
|      */ |      */ | ||||||
|     this.transactional = sql.transactional; |     this.transactional = sql.transactional; | ||||||
|  |  | ||||||
| @@ -432,7 +460,8 @@ function BackendScriptApi(currentNote, apiParams) { | |||||||
|     this.unescapeHtml = utils.unescapeHtml; |     this.unescapeHtml = utils.unescapeHtml; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * @property {module:sql} sql |      * sql | ||||||
|  |      * @type {module:sql} | ||||||
|      */ |      */ | ||||||
|     this.sql = sql; |     this.sql = sql; | ||||||
|  |  | ||||||
| @@ -447,18 +476,18 @@ function BackendScriptApi(currentNote, apiParams) { | |||||||
|      * |      * | ||||||
|      * @method |      * @method | ||||||
|      * @param {object} opts |      * @param {object} opts | ||||||
|      * @property {string} opts.id - id of the launcher, only alphanumeric at least 6 characters long |      * @param {string} opts.id - id of the launcher, only alphanumeric at least 6 characters long | ||||||
|      * @property {string} opts.type - one of |      * @param {"note" | "script" | "customWidget"} opts.type - one of | ||||||
|      *                          * "note" - activating the launcher will navigate to the target note (specified in targetNoteId param) |      *                          * "note" - activating the launcher will navigate to the target note (specified in targetNoteId param) | ||||||
|      *                          * "script" -  activating the launcher will execute the script (specified in scriptNoteId param) |      *                          * "script" -  activating the launcher will execute the script (specified in scriptNoteId param) | ||||||
|      *                          * "customWidget" - the launcher will be rendered with a custom widget (specified in widgetNoteId param) |      *                          * "customWidget" - the launcher will be rendered with a custom widget (specified in widgetNoteId param) | ||||||
|      * @property {string} opts.title |      * @param {string} opts.title | ||||||
|      * @property {boolean} [opts.isVisible=false] - if true, will be created in the "Visible launchers", otherwise in "Available launchers" |      * @param {boolean} [opts.isVisible=false] - if true, will be created in the "Visible launchers", otherwise in "Available launchers" | ||||||
|      * @property {string} [opts.icon] - name of the boxicon to be used (e.g. "bx-time") |      * @param {string} [opts.icon] - name of the boxicon to be used (e.g. "bx-time") | ||||||
|      * @property {string} [opts.keyboardShortcut] - will activate the target note/script upon pressing, e.g. "ctrl+e" |      * @param {string} [opts.keyboardShortcut] - will activate the target note/script upon pressing, e.g. "ctrl+e" | ||||||
|      * @property {string} [opts.targetNoteId] - for type "note" |      * @param {string} [opts.targetNoteId] - for type "note" | ||||||
|      * @property {string} [opts.scriptNoteId] - for type "script" |      * @param {string} [opts.scriptNoteId] - for type "script" | ||||||
|      * @property {string} [opts.widgetNoteId] - for type "customWidget" |      * @param {string} [opts.widgetNoteId] - for type "customWidget" | ||||||
|      * @returns {{note: BNote}} |      * @returns {{note: BNote}} | ||||||
|      */ |      */ | ||||||
|     this.createOrUpdateLauncher = opts => { |     this.createOrUpdateLauncher = opts => { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user