mirror of
				https://github.com/TriliumNext/Notes.git
				synced 2025-10-31 04:51:31 +08:00 
			
		
		
		
	generate hidden subtree declaratively
This commit is contained in:
		
							parent
							
								
									5fc9f5f3f9
								
							
						
					
					
						commit
						2ad19ddd36
					
				| @ -62,7 +62,6 @@ class Attribute extends AbstractEntity { | |||||||
|         return this; |         return this; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     init() { |     init() { | ||||||
|         if (this.attributeId) { |         if (this.attributeId) { | ||||||
|             this.becca.attributes[this.attributeId] = this; |             this.becca.attributes[this.attributeId] = this; | ||||||
| @ -163,11 +162,11 @@ class Attribute extends AbstractEntity { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     beforeSaving() { |     beforeSaving() { | ||||||
|         if (!this.value) { |         if (this.type === 'relation') { | ||||||
|             if (this.type === 'relation') { |             if (!(this.value in this.becca.notes)) { | ||||||
|                 throw new Error(`Cannot save relation ${this.name} since it does not target any note.`); |                 throw new Error(`Cannot save relation '${this.name}' since it target not existing note '${this.value}'.`); | ||||||
|             } |             } | ||||||
| 
 |         } else if (!this.value) { | ||||||
|             // null value isn't allowed
 |             // null value isn't allowed
 | ||||||
|             this.value = ""; |             this.value = ""; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ export default class OpenNoteButtonWidget extends OnClickButtonWidget { | |||||||
|                 if (!this.retried) { |                 if (!this.retried) { | ||||||
|                     this.retried = true; |                     this.retried = true; | ||||||
| 
 | 
 | ||||||
|                     setTimeout(() => this.targetNote(noteId), 15000); // should be higher than timeout for createMissingSpecialNotes
 |                     setTimeout(() => this.targetNote(noteId), 15000); // should be higher than timeout for checkHiddenSubtree
 | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 return; |                 return; | ||||||
|  | |||||||
| @ -44,7 +44,7 @@ export default class LauncherWidget extends BasicWidget { | |||||||
|         } else if (launcherType === 'builtinWidget') { |         } else if (launcherType === 'builtinWidget') { | ||||||
|             this.innerWidget = this.initBuiltinWidget(note); |             this.innerWidget = this.initBuiltinWidget(note); | ||||||
|         } else { |         } else { | ||||||
|             throw new Error(`Unrecognized launcher type '${launcherType}' for launcher '${note.noteId}' title ${note.title}`); |             throw new Error(`Unrecognized launcher type '${launcherType}' for launcher '${note.noteId}' title '${note.title}'`); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (!this.innerWidget) { |         if (!this.innerWidget) { | ||||||
|  | |||||||
| @ -36,12 +36,10 @@ export default class ContentWidgetTypeWidget extends TypeWidget { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     async doRefresh(note) { |     async doRefresh(note) { | ||||||
|         const contentWidget = note.getLabelValue('contentWidget'); |  | ||||||
| 
 |  | ||||||
|         this.$content.empty(); |         this.$content.empty(); | ||||||
|         this.children = []; |         this.children = []; | ||||||
| 
 | 
 | ||||||
|         const contentWidgets = CONTENT_WIDGETS[contentWidget]; |         const contentWidgets = CONTENT_WIDGETS[note.noteId]; | ||||||
| 
 | 
 | ||||||
|         if (contentWidgets) { |         if (contentWidgets) { | ||||||
|             for (const clazz of contentWidgets) { |             for (const clazz of contentWidgets) { | ||||||
| @ -54,7 +52,7 @@ export default class ContentWidgetTypeWidget extends TypeWidget { | |||||||
|                 await widget.refresh(); |                 await widget.refresh(); | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|             this.$content.append(`Unknown widget of type "${contentWidget}"`); |             this.$content.append(`Unknown widget for "${note.noteId}"`); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										283
									
								
								src/services/hidden_subtree.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										283
									
								
								src/services/hidden_subtree.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,283 @@ | |||||||
|  | const becca = require("../becca/becca"); | ||||||
|  | const noteService = require("./notes"); | ||||||
|  | const log = require("./log.js"); | ||||||
|  | 
 | ||||||
|  | const LBTPL_ROOT = "lbTplRoot"; | ||||||
|  | const LBTPL_BASE = "lbTplBase"; | ||||||
|  | const LBTPL_COMMAND = "lbTplCommand"; | ||||||
|  | const LBTPL_NOTE_LAUNCHER = "lbTplNoteLauncher"; | ||||||
|  | const LBTPL_SCRIPT = "lbTplScript"; | ||||||
|  | const LBTPL_BUILTIN_WIDGET = "lbTplBuiltinWidget"; | ||||||
|  | const LBTPL_SPACER = "lbTplSpacer"; | ||||||
|  | const LBTPL_CUSTOM_WIDGET = "lbTplCustomWidget"; | ||||||
|  | 
 | ||||||
|  | const HIDDEN_SUBTREE_DEFINITION = { | ||||||
|  |     id: 'hidden', | ||||||
|  |     title: 'hidden', | ||||||
|  |     type: 'doc', | ||||||
|  |     icon: 'bx bx-chip', | ||||||
|  |     // we want to keep the hidden subtree always last, otherwise there will be problems with e.g. keyboard navigation
 | ||||||
|  |     // over tree when it's in the middle
 | ||||||
|  |     notePosition: 999_999_999, | ||||||
|  |     attributes: [ | ||||||
|  |         // isInheritable: false means that this notePath is automatically not preffered but at the same time
 | ||||||
|  |         // the flag is not inherited to the children
 | ||||||
|  |         { type: 'label', name: 'archived' }, | ||||||
|  |         { type: 'label', name: 'excludeFromNoteMap', isInheritable: true } | ||||||
|  |     ], | ||||||
|  |     children: [ | ||||||
|  |         { | ||||||
|  |             id: 'search', | ||||||
|  |             title: 'search', | ||||||
|  |             type: 'doc' | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             id: 'globalNoteMap', | ||||||
|  |             title: 'Note Map', | ||||||
|  |             type: 'noteMap', | ||||||
|  |             attributes: [ | ||||||
|  |                 { type: 'label', name: 'mapRootId', value: 'hoisted' } | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             id: 'sqlConsole', | ||||||
|  |             title: 'SQL Console', | ||||||
|  |             type: 'doc', | ||||||
|  |             icon: 'bx-data' | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             id: 'share', | ||||||
|  |             title: 'Shared Notes', | ||||||
|  |             type: 'doc', | ||||||
|  |             attributes: [ { type: 'label', name: 'docName', value: 'share' } ] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             id: 'bulkAction', | ||||||
|  |             title: 'Bulk action', | ||||||
|  |             type: 'doc', | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             id: LBTPL_ROOT, | ||||||
|  |             title: 'Launch Bar Templates', | ||||||
|  |             type: 'doc', | ||||||
|  |             children: [ | ||||||
|  |                 { | ||||||
|  |                     id: LBTPL_BASE, | ||||||
|  |                     title: 'Base Abstract Launcher', | ||||||
|  |                     type: 'doc' | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     id: LBTPL_COMMAND, | ||||||
|  |                     title: 'Command Launcher', | ||||||
|  |                     type: 'doc', | ||||||
|  |                     attributes: [ | ||||||
|  |                         { type: 'relation', name: 'template', value: LBTPL_BASE }, | ||||||
|  |                         { type: 'label', name: 'launcherType', value: 'command' }, | ||||||
|  |                         { type: 'label', name: 'docName', value: 'launchbar_command_launcher' } | ||||||
|  |                     ] | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     id: LBTPL_NOTE_LAUNCHER, | ||||||
|  |                     title: 'Note Launcher', | ||||||
|  |                     type: 'doc', | ||||||
|  |                     attributes: [ | ||||||
|  |                         { type: 'relation', name: 'template', value: LBTPL_BASE }, | ||||||
|  |                         { type: 'label', name: 'launcherType', value: 'note' }, | ||||||
|  |                         { type: 'label', name: 'relation:targetNote', value: 'promoted' }, | ||||||
|  |                         { type: 'label', name: 'label:keyboardShortcut', value: 'promoted,text' }, | ||||||
|  |                         { type: 'label', name: 'docName', value: 'launchbar_note_launcher' } | ||||||
|  |                     ] | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     id: LBTPL_SCRIPT, | ||||||
|  |                     title: 'Script Launcher', | ||||||
|  |                     type: 'doc', | ||||||
|  |                     attributes: [ | ||||||
|  |                         { type: 'relation', name: 'template', value: LBTPL_BASE }, | ||||||
|  |                         { type: 'label', name: 'launcherType', value: 'script' }, | ||||||
|  |                         { type: 'label', name: 'relation:script', value: 'promoted' }, | ||||||
|  |                         { type: 'label', name: 'label:keyboardShortcut', value: 'promoted,text' }, | ||||||
|  |                         { type: 'label', name: 'docName', value: 'launchbar_script_launcher' } | ||||||
|  |                     ] | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     id: LBTPL_BUILTIN_WIDGET, | ||||||
|  |                     title: 'Built-in Widget', | ||||||
|  |                     type: 'doc', | ||||||
|  |                     attributes: [ | ||||||
|  |                         { type: 'relation', name: 'template', value: LBTPL_BASE }, | ||||||
|  |                         { type: 'label', name: 'launcherType', value: 'builtinWidget' } | ||||||
|  |                     ] | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     id: LBTPL_SPACER, | ||||||
|  |                     title: 'Spacer', | ||||||
|  |                     type: 'doc', | ||||||
|  |                     icon: 'bx-move-vertical', | ||||||
|  |                     attributes: [ | ||||||
|  |                         { type: 'relation', name: 'template', value: LBTPL_BUILTIN_WIDGET }, | ||||||
|  |                         { type: 'label', name: 'builtinWidget', value: 'spacer' }, | ||||||
|  |                         { type: 'label', name: 'label:baseSize', value: 'promoted,number' }, | ||||||
|  |                         { type: 'label', name: 'label:growthFactor', value: 'promoted,number' }, | ||||||
|  |                         { type: 'label', name: 'docName', value: 'launchbar_spacer' } | ||||||
|  |                     ] | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     id: LBTPL_CUSTOM_WIDGET, | ||||||
|  |                     title: 'Custom Widget', | ||||||
|  |                     type: 'doc', | ||||||
|  |                     attributes: [ | ||||||
|  |                         { type: 'relation', name: 'template', value: LBTPL_BASE }, | ||||||
|  |                         { type: 'label', name: 'launcherType', value: 'customWidget' }, | ||||||
|  |                         { type: 'label', name: 'relation:widget', value: 'promoted' }, | ||||||
|  |                         { type: 'label', name: 'docName', value: 'launchbar_widget_launcher' } | ||||||
|  |                     ] | ||||||
|  |                 }, | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             id: 'lbRoot', | ||||||
|  |             title: 'Launch bar', | ||||||
|  |             type: 'doc', | ||||||
|  |             icon: 'bx-sidebar', | ||||||
|  |             isExpanded: true, | ||||||
|  |             attributes: [ { type: 'label', name: 'docName', value: 'launchbar_intro' } ], | ||||||
|  |             children: [ | ||||||
|  |                 { | ||||||
|  |                     id: 'lbAvailableLaunchers', | ||||||
|  |                     title: 'Available Launchers', | ||||||
|  |                     type: 'doc', | ||||||
|  |                     icon: 'bx-hide', | ||||||
|  |                     isExpanded: true, | ||||||
|  |                     attributes: [ { type: 'label', name: 'docName', value: 'launchbar_intro' } ], | ||||||
|  |                     children: [ | ||||||
|  |                         { id: 'lbBackInHistory', title: 'Back in history', type: 'launcher', builtinWidget: 'backInHistoryButton', icon: 'bx bxs-left-arrow-square' }, | ||||||
|  |                         { id: 'lbForwardInHistory', title: 'Forward in history', type: 'launcher', builtinWidget: 'forwardInHistoryButton', icon: 'bx bxs-right-arrow-square' }, | ||||||
|  |                     ] | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     id: 'lbVisibleLaunchers', | ||||||
|  |                     title: 'Visible Launchers', | ||||||
|  |                     type: 'doc', | ||||||
|  |                     icon: 'bx-show', | ||||||
|  |                     isExpanded: true, | ||||||
|  |                     attributes: [ { type: 'label', name: 'docName', value: 'launchbar_intro' } ], | ||||||
|  |                     children: [ | ||||||
|  |                         { id: 'lbNewNote', title: 'New Note', type: 'launcher', command: 'createNoteIntoInbox', icon: 'bx bx-file-blank' }, | ||||||
|  |                         { id: 'lbSearch', title: 'Search Notes', type: 'launcher', command: 'searchNotes', icon: 'bx bx-search' }, | ||||||
|  |                         { id: 'lbJumpTo', title: 'Jump to Note', type: 'launcher', command: 'jumpToNote', icon: 'bx bx-send' }, | ||||||
|  |                         { id: 'lbNoteMap', title: 'Note Map', type: 'launcher', targetNoteId: 'globalNoteMap', icon: 'bx bx-map-alt' }, | ||||||
|  |                         { id: 'lbCalendar', title: 'Calendar', type: 'launcher', builtinWidget: 'calendar', icon: 'bx bx-calendar' }, | ||||||
|  |                         { id: 'lbRecentChanges', title: 'Recent Changes', type: 'launcher', command: 'showRecentChanges', icon: 'bx bx-history' }, | ||||||
|  |                         { id: 'lbSpacer1', title: 'Spacer', type: 'launcher', builtinWidget: 'spacer', baseSize: "50", growthFactor: "0" }, | ||||||
|  |                         { id: 'lbBookmarks', title: 'Bookmarks', type: 'launcher', builtinWidget: 'bookmarks', icon: 'bx bx-bookmark' }, | ||||||
|  |                         { id: 'lbSpacer2', title: 'Spacer', type: 'launcher', builtinWidget: 'spacer', baseSize: "0", growthFactor: "1" }, | ||||||
|  |                         { id: 'lbProtectedSession', title: 'Protected Session', type: 'launcher', builtinWidget: 'protectedSession', icon: 'bx bx bx-shield-quarter' }, | ||||||
|  |                         { id: 'lbSyncStatus', title: 'Sync Status', type: 'launcher', builtinWidget: 'syncStatus', icon: 'bx bx-wifi' } | ||||||
|  |                     ] | ||||||
|  |                 } | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             id: 'options', | ||||||
|  |             title: 'Options', | ||||||
|  |             type: 'book', | ||||||
|  |             children: [ | ||||||
|  |                 { id: 'optionsAppearance', title: 'Appearance', type: 'contentWidget' }, | ||||||
|  |                 { id: 'optionsShortcuts', title: 'Shortcuts', type: 'contentWidget' }, | ||||||
|  |                 { id: 'optionsTextNotes', title: 'Text Notes', type: 'contentWidget' }, | ||||||
|  |                 { id: 'optionsCodeNotes', title: 'Code Notes', type: 'contentWidget' }, | ||||||
|  |                 { id: 'optionsImages', title: 'Images', type: 'contentWidget' }, | ||||||
|  |                 { id: 'optionsSpellcheck', title: 'Spellcheck', type: 'contentWidget' }, | ||||||
|  |                 { id: 'optionsPassword', title: 'Password', type: 'contentWidget' }, | ||||||
|  |                 { id: 'optionsEtapi', title: 'ETAPI', type: 'contentWidget' }, | ||||||
|  |                 { id: 'optionsBackup', title: 'Backup', type: 'contentWidget' }, | ||||||
|  |                 { id: 'optionsSync', title: 'Sync', type: 'contentWidget' }, | ||||||
|  |                 { id: 'optionsOther', title: 'Other', type: 'contentWidget' }, | ||||||
|  |                 { id: 'optionsAdvanced', title: 'Advanced', type: 'contentWidget' } | ||||||
|  |             ] | ||||||
|  |         } | ||||||
|  |     ] | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | function checkHiddenSubtree() { | ||||||
|  |     checkHiddenSubtreeRecursively('root', HIDDEN_SUBTREE_DEFINITION); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function checkHiddenSubtreeRecursively(parentNoteId, item) { | ||||||
|  |     if (!item.id || !item.type || !item.title) { | ||||||
|  |         throw new Error(`Item does not contain mandatory properties: ` + JSON.stringify(item)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     let note = becca.notes[item.id]; | ||||||
|  |     let branch = becca.branches[item.id]; | ||||||
|  | 
 | ||||||
|  |     const attrs = [...(item.attributes || [])]; | ||||||
|  | 
 | ||||||
|  |     if (item.icon) { | ||||||
|  |         attrs.push({ type: 'label', name: 'iconClass', value: 'bx ' + item.icon }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!note) { | ||||||
|  |         ({note, branch} = noteService.createNewNote({ | ||||||
|  |             branchId: item.id, | ||||||
|  |             noteId: item.id, | ||||||
|  |             title: item.title, | ||||||
|  |             type: item.type, | ||||||
|  |             parentNoteId: parentNoteId, | ||||||
|  |             content: '', | ||||||
|  |             ignoreForbiddenParents: true | ||||||
|  |         })); | ||||||
|  | 
 | ||||||
|  |         if (item.type === 'launcher') { | ||||||
|  |             if (item.command) { | ||||||
|  |                 attrs.push({ type: 'relation', name: 'template', value: LBTPL_COMMAND }); | ||||||
|  |                 attrs.push({ type: 'label', name: 'command', value: item.command }); | ||||||
|  |             } else if (item.builtinWidget) { | ||||||
|  |                 if (item.builtinWidget === 'spacer') { | ||||||
|  |                     attrs.push({ type: 'relation', name: 'template', value: LBTPL_SPACER }); | ||||||
|  |                     attrs.push({ type: 'label', name: 'baseSize', value: item.baseSize }); | ||||||
|  |                     attrs.push({ type: 'label', name: 'growthFactor', value: item.growthFactor }); | ||||||
|  |                 } else { | ||||||
|  |                     attrs.push({ type: 'relation', name: 'template', value: LBTPL_BUILTIN_WIDGET }); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 attrs.push({ type: 'label', name: 'builtinWidget', value: item.builtinWidget }); | ||||||
|  |              } else if (item.targetNoteId) { | ||||||
|  |                 attrs.push({ type: 'relation', name: 'template', value: LBTPL_NOTE_LAUNCHER }); | ||||||
|  |                 attrs.push({ type: 'relation', name: 'targetNote', value: item.targetNoteId }); | ||||||
|  |             } else { | ||||||
|  |                 throw new Error(`No action defined for launcher ${JSON.stringify(item)}`); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!branch) { | ||||||
|  |         // not sure if there's some better way to recover
 | ||||||
|  |         log.error(`Cannot find branch id='${item.id}', ignoring...`); | ||||||
|  |     } else { | ||||||
|  |         if (item.notePosition !== undefined && branch.notePosition !== item.notePosition) { | ||||||
|  |             branch.notePosition = item.notePosition; | ||||||
|  |             branch.save(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (item.isExpanded !== undefined && branch.isExpanded !== item.isExpanded) { | ||||||
|  |             branch.isExpanded = item.isExpanded; | ||||||
|  |             branch.save(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (const attr of attrs) { | ||||||
|  |         if (!note.hasAttribute(attr.type, attr.name)) { | ||||||
|  |             note.addAttribute(attr.type, attr.name, attr.value); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (const child of item.children || []) { | ||||||
|  |         checkHiddenSubtreeRecursively(item.id, child); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | module.exports = { | ||||||
|  |     checkHiddenSubtree | ||||||
|  | }; | ||||||
| @ -5,8 +5,8 @@ const config = require('./config'); | |||||||
| const log = require('./log'); | const log = require('./log'); | ||||||
| const sql = require("./sql"); | const sql = require("./sql"); | ||||||
| const becca = require("../becca/becca"); | const becca = require("../becca/becca"); | ||||||
| const specialNotesService = require("../services/special_notes"); |  | ||||||
| const protectedSessionService = require("../services/protected_session"); | const protectedSessionService = require("../services/protected_session"); | ||||||
|  | const hiddenSubtreeService = require("./hidden_subtree"); | ||||||
| 
 | 
 | ||||||
| function getRunAtHours(note) { | function getRunAtHours(note) { | ||||||
|     try { |     try { | ||||||
| @ -52,7 +52,7 @@ function runNotesWithLabel(runAttrValue) { | |||||||
| 
 | 
 | ||||||
| sqlInit.dbReady.then(() => { | sqlInit.dbReady.then(() => { | ||||||
|     if (!process.env.TRILIUM_SAFE_MODE) { |     if (!process.env.TRILIUM_SAFE_MODE) { | ||||||
|         cls.init(() => specialNotesService.createMissingSpecialNotes()); |         cls.init(() => hiddenSubtreeService.checkHiddenSubtree()); | ||||||
| 
 | 
 | ||||||
|         setTimeout(cls.wrap(() => runNotesWithLabel('backendStartup')), 10 * 1000); |         setTimeout(cls.wrap(() => runNotesWithLabel('backendStartup')), 10 * 1000); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -5,15 +5,7 @@ const noteService = require("./notes"); | |||||||
| const cls = require("./cls"); | const cls = require("./cls"); | ||||||
| const dateUtils = require("./date_utils"); | const dateUtils = require("./date_utils"); | ||||||
| const log = require("./log.js"); | const log = require("./log.js"); | ||||||
| 
 | const hiddenSubtreeService = require("./hidden_subtree"); | ||||||
| const LBTPL_ROOT = "lbtpl_root"; |  | ||||||
| const LBTPL_BASE = "lbtpl_base"; |  | ||||||
| const LBTPL_COMMAND = "lbtpl_command"; |  | ||||||
| const LBTPL_NOTE_LAUNCHER = "lbtpl_notelauncher"; |  | ||||||
| const LBTPL_SCRIPT = "lbtpl_script"; |  | ||||||
| const LBTPL_BUILTIN_WIDGET = "lbtpl_builtinwidget"; |  | ||||||
| const LBTPL_SPACER = "lbtpl_spacer"; |  | ||||||
| const LBTPL_CUSTOM_WIDGET = "lbtpl_customwidget"; |  | ||||||
| 
 | 
 | ||||||
| function getInboxNote(date) { | function getInboxNote(date) { | ||||||
|     const hoistedNote = getHoistedNote(); |     const hoistedNote = getHoistedNote(); | ||||||
| @ -39,97 +31,9 @@ function getInboxNote(date) { | |||||||
|     return inbox; |     return inbox; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function getHiddenRoot() { |  | ||||||
|     let hidden = becca.getNote('hidden'); |  | ||||||
| 
 |  | ||||||
|     if (!hidden) { |  | ||||||
|         hidden = noteService.createNewNote({ |  | ||||||
|             branchId: 'hidden', |  | ||||||
|             noteId: 'hidden', |  | ||||||
|             title: 'hidden', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: 'root' |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         // isInheritable: false means that this notePath is automatically not preffered but at the same time
 |  | ||||||
|         // the flag is not inherited to the children
 |  | ||||||
|         hidden.addLabel('archived', "", false); |  | ||||||
|         hidden.addLabel('excludeFromNoteMap', "", true); |  | ||||||
|         hidden.addLabel('iconClass', "bx bx-chip", false); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     const MAX_POS = 999_999_999; |  | ||||||
| 
 |  | ||||||
|     const branch = hidden.getBranches()[0]; |  | ||||||
|     if (branch.notePosition !== MAX_POS) { |  | ||||||
|         // we want to keep the hidden subtree always last, otherwise there will be problems with e.g. keyboard navigation
 |  | ||||||
|         // over tree when it's in the middle
 |  | ||||||
|         branch.notePosition = MAX_POS; |  | ||||||
|         branch.save(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return hidden; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function getSearchRoot() { |  | ||||||
|     let searchRoot = becca.getNote('search'); |  | ||||||
| 
 |  | ||||||
|     if (!searchRoot) { |  | ||||||
|         searchRoot = noteService.createNewNote({ |  | ||||||
|             branchId: 'search', |  | ||||||
|             noteId: 'search', |  | ||||||
|             title: 'search', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: getHiddenRoot().noteId |  | ||||||
|         }).note; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return searchRoot; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function getGlobalNoteMap() { |  | ||||||
|     let globalNoteMap = becca.getNote('globalNoteMap'); |  | ||||||
| 
 |  | ||||||
|     if (!globalNoteMap) { |  | ||||||
|         globalNoteMap = noteService.createNewNote({ |  | ||||||
|             branchId: 'globalNoteMap', |  | ||||||
|             noteId: 'globalNoteMap', |  | ||||||
|             title: 'Global Note Map', |  | ||||||
|             type: 'noteMap', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: getHiddenRoot().noteId |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         globalNoteMap.addLabel('mapRootNoteId', 'hoisted'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return globalNoteMap; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function getSqlConsoleRoot() { |  | ||||||
|     let sqlConsoleRoot = becca.getNote('sqlConsole'); |  | ||||||
| 
 |  | ||||||
|     if (!sqlConsoleRoot) { |  | ||||||
|         sqlConsoleRoot = noteService.createNewNote({ |  | ||||||
|             branchId: 'sqlConsole', |  | ||||||
|             noteId: 'sqlConsole', |  | ||||||
|             title: 'SQL Console', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: getHiddenRoot().noteId |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         sqlConsoleRoot.addLabel('iconClass', 'bx bx-data'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return sqlConsoleRoot; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function createSqlConsole() { | function createSqlConsole() { | ||||||
|     const {note} = noteService.createNewNote({ |     const {note} = noteService.createNewNote({ | ||||||
|         parentNoteId: getSqlConsoleRoot().noteId, |         parentNoteId: 'sqlConsole', | ||||||
|         title: 'SQL Console', |         title: 'SQL Console', | ||||||
|         content: "SELECT title, isDeleted, isProtected FROM notes WHERE noteId = ''\n\n\n\n", |         content: "SELECT title, isDeleted, isProtected FROM notes WHERE noteId = ''\n\n\n\n", | ||||||
|         type: 'code', |         type: 'code', | ||||||
| @ -163,7 +67,7 @@ function saveSqlConsole(sqlConsoleNoteId) { | |||||||
| 
 | 
 | ||||||
| function createSearchNote(searchString, ancestorNoteId) { | function createSearchNote(searchString, ancestorNoteId) { | ||||||
|     const {note} = noteService.createNewNote({ |     const {note} = noteService.createNewNote({ | ||||||
|         parentNoteId: getSearchRoot().noteId, |         parentNoteId: 'search', | ||||||
|         title: 'Search: ' + searchString, |         title: 'Search: ' + searchString, | ||||||
|         content: "", |         content: "", | ||||||
|         type: 'search', |         type: 'search', | ||||||
| @ -213,215 +117,36 @@ function getHoistedNote() { | |||||||
|     return becca.getNote(cls.getHoistedNoteId()); |     return becca.getNote(cls.getHoistedNoteId()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function getShareRoot() { |  | ||||||
|     let shareRoot = becca.getNote('share'); |  | ||||||
| 
 |  | ||||||
|     if (!shareRoot) { |  | ||||||
|         const hiddenRoot = getHiddenRoot(); |  | ||||||
| 
 |  | ||||||
|         shareRoot = noteService.createNewNote({ |  | ||||||
|             branchId: 'share', |  | ||||||
|             noteId: 'share', |  | ||||||
|             title: 'Shared notes', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: hiddenRoot.noteId |  | ||||||
|         }).note; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!shareRoot.hasOwnedLabel("docName")) { |  | ||||||
|         shareRoot.addLabel("docName", "share"); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return shareRoot; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function getBulkActionNote() { |  | ||||||
|     let bulkActionNote = becca.getNote('bulkAction'); |  | ||||||
| 
 |  | ||||||
|     if (!bulkActionNote) { |  | ||||||
|         bulkActionNote = noteService.createNewNote({ |  | ||||||
|             branchId: 'bulkAction', |  | ||||||
|             noteId: 'bulkAction', |  | ||||||
|             title: 'Bulk action', |  | ||||||
|             type: 'text', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: getHiddenRoot().noteId |  | ||||||
|         }).note; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return bulkActionNote; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function getLaunchBarRoot() { |  | ||||||
|     let note = becca.getNote('lbRoot'); |  | ||||||
| 
 |  | ||||||
|     if (!note) { |  | ||||||
|         note = noteService.createNewNote({ |  | ||||||
|             branchId: 'lbRoot', |  | ||||||
|             noteId: 'lbRoot', |  | ||||||
|             title: 'Launch bar', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: getHiddenRoot().noteId |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         note.addLabel("iconClass", "bx bx-sidebar"); |  | ||||||
|         note.addLabel("docName", "launchbar_intro"); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return note; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function getLaunchBarAvailableLaunchersRoot() { |  | ||||||
|     let note = becca.getNote('lbAvailableLaunchers'); |  | ||||||
| 
 |  | ||||||
|     if (!note) { |  | ||||||
|         note = noteService.createNewNote({ |  | ||||||
|             branchId: 'lbAvailableLaunchers', |  | ||||||
|             noteId: 'lbAvailableLaunchers', |  | ||||||
|             title: 'Available launchers', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: getLaunchBarRoot().noteId, |  | ||||||
|             ignoreForbiddenParents: true |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         note.addLabel("iconClass", "bx bx-hide"); |  | ||||||
|         note.addLabel("docName", "launchbar_intro"); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     const branch = becca.getBranch('lbAvailableLaunchers'); |  | ||||||
|     if (!branch.isExpanded) { |  | ||||||
|         branch.isExpanded = true; |  | ||||||
|         branch.save(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return note; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function getLaunchBarVisibleLaunchersRoot() { |  | ||||||
|     let note = becca.getNote('lbVisibleLaunchers'); |  | ||||||
| 
 |  | ||||||
|     if (!note) { |  | ||||||
|         note = noteService.createNewNote({ |  | ||||||
|             branchId: 'lbVisibleLaunchers', |  | ||||||
|             noteId: 'lbVisibleLaunchers', |  | ||||||
|             title: 'Visible launchers', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: getLaunchBarRoot().noteId, |  | ||||||
|             ignoreForbiddenParents: true |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         note.addLabel("iconClass", "bx bx-show"); |  | ||||||
|         note.addLabel("docName", "launchbar_intro"); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     const branch = becca.getBranch('lbVisibleLaunchers'); |  | ||||||
|     if (!branch.isExpanded) { |  | ||||||
|         branch.isExpanded = true; |  | ||||||
|         branch.save(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return note; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const launchers = [ |  | ||||||
|     // visible launchers:
 |  | ||||||
|     { id: 'lbNewNote', command: 'createNoteIntoInbox', title: 'New note', icon: 'bx bx-file-blank', isVisible: true }, |  | ||||||
|     { id: 'lbSearch', command: 'searchNotes', title: 'Search notes', icon: 'bx bx-search', isVisible: true }, |  | ||||||
|     { id: 'lbJumpTo', command: 'jumpToNote', title: 'Jump to note', icon: 'bx bx-send', isVisible: true }, |  | ||||||
|     { id: 'lbNoteMap', targetNoteId: 'globalNotemap', title: 'Note map', icon: 'bx bx-map-alt', isVisible: true }, |  | ||||||
|     { id: 'lbCalendar', builtinWidget: 'calendar', title: 'Calendar', icon: 'bx bx-calendar', isVisible: true }, |  | ||||||
|     { id: 'lbSpacer1', builtinWidget: 'spacer', title: 'Spacer', isVisible: true, baseSize: "50", growthFactor: "0" }, |  | ||||||
|     { id: 'lbBookmarks', builtinWidget: 'bookmarks', title: 'Bookmarks', icon: 'bx bx-bookmark', isVisible: true }, |  | ||||||
|     { id: 'lbSpacer2', builtinWidget: 'spacer', title: 'Spacer', isVisible: true, baseSize: "0", growthFactor: "1" }, |  | ||||||
|     { id: 'lbProtectedSession', builtinWidget: 'protectedSession', title: 'Protected session', icon: 'bx bx bx-shield-quarter', isVisible: true }, |  | ||||||
|     { id: 'lbSyncStatus', builtinWidget: 'syncStatus', title: 'Sync status', icon: 'bx bx-wifi', isVisible: true }, |  | ||||||
| 
 |  | ||||||
|     // available launchers:
 |  | ||||||
|     { id: 'lbRecentChanges', command: 'showRecentChanges', title: 'Recent changes', icon: 'bx bx-history', isVisible: false }, |  | ||||||
|     { id: 'lbBackInHistory', builtinWidget: 'backInHistoryButton', title: 'Back in history', icon: 'bx bxs-left-arrow-square', isVisible: false }, |  | ||||||
|     { id: 'lbForwardInHistory', builtinWidget: 'forwardInHistoryButton', title: 'Forward in history', icon: 'bx bxs-right-arrow-square', isVisible: false }, |  | ||||||
| ]; |  | ||||||
| 
 |  | ||||||
| function createLaunchers() { |  | ||||||
|     for (const launcher of launchers) { |  | ||||||
|         let note = becca.getNote(launcher.id); |  | ||||||
| 
 |  | ||||||
|         if (note) { |  | ||||||
|             continue; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         const parentNoteId = launcher.isVisible |  | ||||||
|             ? getLaunchBarVisibleLaunchersRoot().noteId |  | ||||||
|             : getLaunchBarAvailableLaunchersRoot().noteId; |  | ||||||
| 
 |  | ||||||
|         note = noteService.createNewNote({ |  | ||||||
|             noteId: launcher.id, |  | ||||||
|             title: launcher.title, |  | ||||||
|             type: 'launcher', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: parentNoteId |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         if (launcher.icon) { |  | ||||||
|             note.addLabel('iconClass', launcher.icon); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (launcher.command) { |  | ||||||
|             note.addRelation('template', LBTPL_COMMAND); |  | ||||||
|             note.addLabel('command', launcher.command); |  | ||||||
|         } else if (launcher.builtinWidget) { |  | ||||||
|             if (launcher.builtinWidget === 'spacer') { |  | ||||||
|                 note.addRelation('template', LBTPL_SPACER); |  | ||||||
|                 note.addLabel("baseSize", launcher.baseSize); |  | ||||||
|                 note.addLabel("growthFactor", launcher.growthFactor); |  | ||||||
|             } else { |  | ||||||
|                 note.addRelation('template', LBTPL_BUILTIN_WIDGET); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             note.addLabel('builtinWidget', launcher.builtinWidget); |  | ||||||
|         } else if (launcher.targetNoteId) { |  | ||||||
|             note.addRelation('template', LBTPL_NOTE_LAUNCHER); |  | ||||||
|             note.addRelation('targetNote', launcher.targetNoteId); |  | ||||||
|         } else { |  | ||||||
|             throw new Error(`No action defined for launcher ${JSON.stringify(launcher)}`); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function createLauncher(parentNoteId, launcherType) { | function createLauncher(parentNoteId, launcherType) { | ||||||
|     let note; |     let note; | ||||||
| 
 | 
 | ||||||
|     if (launcherType === 'note') { |     if (launcherType === 'note') { | ||||||
|         note = noteService.createNewNote({ |         note = noteService.createNewNote({ | ||||||
|             title: "Note launcher", |             title: "Note Launcher", | ||||||
|             type: 'launcher', |             type: 'launcher', | ||||||
|             content: '', |             content: '', | ||||||
|             parentNoteId: parentNoteId |             parentNoteId: parentNoteId | ||||||
|         }).note; |         }).note; | ||||||
| 
 | 
 | ||||||
|         note.addRelation('template', LBTPL_NOTE_LAUNCHER); |         note.addRelation('template', 'lbTplNoteLauncher'); | ||||||
|     } else if (launcherType === 'script') { |     } else if (launcherType === 'script') { | ||||||
|         note = noteService.createNewNote({ |         note = noteService.createNewNote({ | ||||||
|             title: "Script launcher", |             title: "Script Launcher", | ||||||
|             type: 'launcher', |             type: 'launcher', | ||||||
|             content: '', |             content: '', | ||||||
|             parentNoteId: parentNoteId |             parentNoteId: parentNoteId | ||||||
|         }).note; |         }).note; | ||||||
| 
 | 
 | ||||||
|         note.addRelation('template', LBTPL_SCRIPT); |         note.addRelation('template', 'lbTplScriptLauncher'); | ||||||
|     } else if (launcherType === 'customWidget') { |     } else if (launcherType === 'customWidget') { | ||||||
|         note = noteService.createNewNote({ |         note = noteService.createNewNote({ | ||||||
|             title: "Widget launcher", |             title: "Widget Launcher", | ||||||
|             type: 'launcher', |             type: 'launcher', | ||||||
|             content: '', |             content: '', | ||||||
|             parentNoteId: parentNoteId |             parentNoteId: parentNoteId | ||||||
|         }).note; |         }).note; | ||||||
| 
 | 
 | ||||||
|         note.addRelation('template', LBTPL_CUSTOM_WIDGET); |         note.addRelation('template', 'lbTplCustomWidget'); | ||||||
|     } else if (launcherType === 'spacer') { |     } else if (launcherType === 'spacer') { | ||||||
|         note = noteService.createNewNote({ |         note = noteService.createNewNote({ | ||||||
|             title: "Spacer", |             title: "Spacer", | ||||||
| @ -430,9 +155,9 @@ function createLauncher(parentNoteId, launcherType) { | |||||||
|             parentNoteId: parentNoteId |             parentNoteId: parentNoteId | ||||||
|         }).note; |         }).note; | ||||||
| 
 | 
 | ||||||
|         note.addRelation('template', LBTPL_SPACER); |         note.addRelation('template', 'lbTplSpacer'); | ||||||
|     } else { |     } else { | ||||||
|         throw new Error(`Unrecognized launcher type ${launcherType}`); |         throw new Error(`Unrecognized launcher type '${launcherType}'`); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return { |     return { | ||||||
| @ -441,193 +166,6 @@ function createLauncher(parentNoteId, launcherType) { | |||||||
|     }; |     }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function initHiddenRoot() { |  | ||||||
|     const hidden = getHiddenRoot(); |  | ||||||
| 
 |  | ||||||
|     if (!hidden.hasOwnedLabel("docName")) { |  | ||||||
|         hidden.addLabel("docName", "hidden"); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!hidden.hasOwnedLabel('excludeFromNoteMap')) { |  | ||||||
|         hidden.addLabel('excludeFromNoteMap', "", true); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function createLauncherTemplates() { |  | ||||||
|     if (!(LBTPL_ROOT in becca.notes)) { |  | ||||||
|         noteService.createNewNote({ |  | ||||||
|             branchId: LBTPL_ROOT, |  | ||||||
|             noteId: LBTPL_ROOT, |  | ||||||
|             title: 'Launch bar templates', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: getHiddenRoot().noteId |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!(LBTPL_BASE in becca.notes)) { |  | ||||||
|         noteService.createNewNote({ |  | ||||||
|             branchId: LBTPL_BASE, |  | ||||||
|             noteId: LBTPL_BASE, |  | ||||||
|             title: 'Launch bar base launcher', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: LBTPL_ROOT |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!(LBTPL_COMMAND in becca.notes)) { |  | ||||||
|         const tpl = noteService.createNewNote({ |  | ||||||
|             branchId: LBTPL_COMMAND, |  | ||||||
|             noteId: LBTPL_COMMAND, |  | ||||||
|             title: 'Command launcher', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: LBTPL_ROOT |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         tpl.addRelation('template', LBTPL_BASE); |  | ||||||
|         tpl.addLabel('launcherType', 'command'); |  | ||||||
|         tpl.addLabel('docName', 'launchbar_command_launcher'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!(LBTPL_NOTE_LAUNCHER in becca.notes)) { |  | ||||||
|         const tpl = noteService.createNewNote({ |  | ||||||
|             branchId: LBTPL_NOTE_LAUNCHER, |  | ||||||
|             noteId: LBTPL_NOTE_LAUNCHER, |  | ||||||
|             title: 'Note launcher', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: LBTPL_ROOT |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         tpl.addRelation('template', LBTPL_BASE); |  | ||||||
|         tpl.addLabel('launcherType', 'note'); |  | ||||||
|         tpl.addLabel('relation:targetNote', 'promoted'); |  | ||||||
|         tpl.addLabel('docName', 'launchbar_note_launcher'); |  | ||||||
|         tpl.addLabel('label:keyboardShortcut', 'promoted,text'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!(LBTPL_SCRIPT in becca.notes)) { |  | ||||||
|         const tpl = noteService.createNewNote({ |  | ||||||
|             branchId: LBTPL_SCRIPT, |  | ||||||
|             noteId: LBTPL_SCRIPT, |  | ||||||
|             title: 'Script', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: LBTPL_ROOT |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         tpl.addRelation('template', LBTPL_BASE); |  | ||||||
|         tpl.addLabel('launcherType', 'script'); |  | ||||||
|         tpl.addLabel('relation:script', 'promoted'); |  | ||||||
|         tpl.addLabel('docName', 'launchbar_script_launcher'); |  | ||||||
|         tpl.addLabel('label:keyboardShortcut', 'promoted,text'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!(LBTPL_BUILTIN_WIDGET in becca.notes)) { |  | ||||||
|         const tpl = noteService.createNewNote({ |  | ||||||
|             branchId: LBTPL_BUILTIN_WIDGET, |  | ||||||
|             noteId: LBTPL_BUILTIN_WIDGET, |  | ||||||
|             title: 'Builtin widget', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: LBTPL_ROOT |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         tpl.addRelation('template', LBTPL_BASE); |  | ||||||
|         tpl.addLabel('launcherType', 'builtinWidget'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!(LBTPL_SPACER in becca.notes)) { |  | ||||||
|         const tpl = noteService.createNewNote({ |  | ||||||
|             branchId: LBTPL_SPACER, |  | ||||||
|             noteId: LBTPL_SPACER, |  | ||||||
|             title: 'Spacer', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: LBTPL_ROOT |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         tpl.addRelation('template', LBTPL_BUILTIN_WIDGET); |  | ||||||
|         tpl.addLabel('builtinWidget', 'spacer'); |  | ||||||
|         tpl.addLabel('iconClass', 'bx bx-move-vertical'); |  | ||||||
|         tpl.addLabel('label:baseSize', 'promoted,number'); |  | ||||||
|         tpl.addLabel('label:growthFactor', 'promoted,number'); |  | ||||||
|         tpl.addLabel('docName', 'launchbar_spacer'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!(LBTPL_CUSTOM_WIDGET in becca.notes)) { |  | ||||||
|         const tpl = noteService.createNewNote({ |  | ||||||
|             branchId: LBTPL_CUSTOM_WIDGET, |  | ||||||
|             noteId: LBTPL_CUSTOM_WIDGET, |  | ||||||
|             title: 'Custom widget', |  | ||||||
|             type: 'doc', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: LBTPL_ROOT |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         tpl.addRelation('template', LBTPL_BASE); |  | ||||||
|         tpl.addLabel('launcherType', 'customWidget'); |  | ||||||
|         tpl.addLabel('relation:widget', 'promoted'); |  | ||||||
|         tpl.addLabel('docName', 'launchbar_widget_launcher'); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const OPTIONS_ROOT = "opt_root"; |  | ||||||
| const OPTIONS_APPEARANCE = "opt_appearance"; |  | ||||||
| const OPTIONS_ADVANCED = "opt_advanced"; |  | ||||||
| const OPTIONS_BACKUP = "opt_backup"; |  | ||||||
| const OPTIONS_CODE_NOTES = "opt_code_notes"; |  | ||||||
| const OPTIONS_ETAPI = "opt_etapi"; |  | ||||||
| const OPTIONS_IMAGES = "opt_images"; |  | ||||||
| const OPTIONS_OTHER = "opt_other"; |  | ||||||
| const OPTIONS_PASSWORD = "opt_password"; |  | ||||||
| const OPTIONS_SHORTCUTS = "opt_shortcuts"; |  | ||||||
| const OPTIONS_SPELLCHECK = "opt_spellcheck"; |  | ||||||
| const OPTIONS_SYNC = "opt_sync"; |  | ||||||
| const OPTIONS_TEXT_NOTES = "opt_textnotes"; |  | ||||||
| 
 |  | ||||||
| function createOptionNotes() { |  | ||||||
|     if (!(OPTIONS_ROOT in becca.notes)) { |  | ||||||
|         noteService.createNewNote({ |  | ||||||
|             branchId: OPTIONS_ROOT, |  | ||||||
|             noteId: OPTIONS_ROOT, |  | ||||||
|             title: 'Options', |  | ||||||
|             type: 'book', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: getHiddenRoot().noteId |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!(OPTIONS_APPEARANCE in becca.notes)) { |  | ||||||
|         const note = noteService.createNewNote({ |  | ||||||
|             branchId: OPTIONS_APPEARANCE, |  | ||||||
|             noteId: OPTIONS_APPEARANCE, |  | ||||||
|             title: 'Appearance', |  | ||||||
|             type: 'contentWidget', |  | ||||||
|             content: '', |  | ||||||
|             parentNoteId: OPTIONS_ROOT |  | ||||||
|         }).note; |  | ||||||
| 
 |  | ||||||
|         note.addLabel('contentWidget', 'optionsAppearance'); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function createMissingSpecialNotes() { |  | ||||||
|     initHiddenRoot(); |  | ||||||
|     getSqlConsoleRoot(); |  | ||||||
|     getGlobalNoteMap(); |  | ||||||
|     getBulkActionNote(); |  | ||||||
|     createLauncherTemplates(); |  | ||||||
|     getLaunchBarRoot(); |  | ||||||
|     getLaunchBarAvailableLaunchersRoot(); |  | ||||||
|     getLaunchBarVisibleLaunchersRoot(); |  | ||||||
|     createLaunchers(); |  | ||||||
|     createOptionNotes(); |  | ||||||
|     getShareRoot(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function resetLauncher(noteId) { | function resetLauncher(noteId) { | ||||||
|     const note = becca.getNote(noteId); |     const note = becca.getNote(noteId); | ||||||
| 
 | 
 | ||||||
| @ -648,7 +186,7 @@ function resetLauncher(noteId) { | |||||||
|         log.info(`Note ${noteId} is not a resettable launcher note.`); |         log.info(`Note ${noteId} is not a resettable launcher note.`); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     createMissingSpecialNotes(); |     hiddenSubtreeService.checkHiddenSubtree(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| module.exports = { | module.exports = { | ||||||
| @ -657,10 +195,6 @@ module.exports = { | |||||||
|     saveSqlConsole, |     saveSqlConsole, | ||||||
|     createSearchNote, |     createSearchNote, | ||||||
|     saveSearchNote, |     saveSearchNote, | ||||||
|     createMissingSpecialNotes, |  | ||||||
|     getShareRoot, |  | ||||||
|     getHiddenRoot, |  | ||||||
|     getBulkActionNote, |  | ||||||
|     createLauncher, |     createLauncher, | ||||||
|     resetLauncher |     resetLauncher | ||||||
| }; | }; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 zadam
						zadam