mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 18:36:30 +01:00 
			
		
		
		
	backend log improvements
This commit is contained in:
		
							
								
								
									
										33
									
								
								db/migrations/0206__delete_search_and_sql_console_history.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								db/migrations/0206__delete_search_and_sql_console_history.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | // the history was previously not exposed and the fact they were not cleaned up is rather a side-effect than an intention | ||||||
|  |  | ||||||
|  | module.exports = () => { | ||||||
|  |     const cls = require("../../src/services/cls"); | ||||||
|  |     const beccaLoader = require("../../src/becca/becca_loader"); | ||||||
|  |     const becca = require("../../src/becca/becca"); | ||||||
|  |  | ||||||
|  |     cls.init(() => { | ||||||
|  |         beccaLoader.load(); | ||||||
|  |  | ||||||
|  |         // deleting just branches because they might be cloned (and therefore saved) also outside of the hidden subtree | ||||||
|  |  | ||||||
|  |         const searchRoot = becca.getNote('search'); | ||||||
|  |  | ||||||
|  |         for (const searchBranch of searchRoot.getChildBranches()) { | ||||||
|  |             const searchNote = searchBranch.getNote(); | ||||||
|  |  | ||||||
|  |             if (searchNote.type === 'search') { | ||||||
|  |                 searchBranch.deleteBranch('0206__delete_search_and_sql_console_history'); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         const sqlConsoleRoot = becca.getNote('sqlConsole'); | ||||||
|  |  | ||||||
|  |         for (const sqlConsoleBranch of sqlConsoleRoot.getChildBranches()) { | ||||||
|  |             const sqlConsoleNote = sqlConsoleBranch.getNote(); | ||||||
|  |  | ||||||
|  |             if (sqlConsoleNote.type === 'code' && sqlConsoleNote.mime === 'text/x-sqlite;schema=trilium') { | ||||||
|  |                 sqlConsoleBranch.deleteBranch('0206__delete_search_and_sql_console_history'); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | }; | ||||||
							
								
								
									
										2
									
								
								db/migrations/0207__rename_search_and_sql_console.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								db/migrations/0207__rename_search_and_sql_console.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | UPDATE notes SET title = 'SQL Console History' WHERE noteId = 'sqlConsole'; | ||||||
|  | UPDATE notes SET title = 'Search History' WHERE noteId = 'search'; | ||||||
							
								
								
									
										5
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										5
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,12 +1,11 @@ | |||||||
| { | { | ||||||
|   "name": "trilium", |   "name": "trilium", | ||||||
|   "version": "0.57.4", |   "version": "0.57.5", | ||||||
|   "lockfileVersion": 2, |   "lockfileVersion": 2, | ||||||
|   "requires": true, |   "requires": true, | ||||||
|   "packages": { |   "packages": { | ||||||
|     "": { |     "": { | ||||||
|       "name": "trilium", |       "version": "0.57.5", | ||||||
|       "version": "0.57.4", |  | ||||||
|       "hasInstallScript": true, |       "hasInstallScript": true, | ||||||
|       "license": "AGPL-3.0-only", |       "license": "AGPL-3.0-only", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|   | |||||||
| @@ -72,19 +72,35 @@ export default class RootCommandExecutor extends Component { | |||||||
|         options.toggle('leftPaneVisible'); |         options.toggle('leftPaneVisible'); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     async showBackendLogCommand() { | ||||||
|  |         await appContext.tabManager.openContextWithNote('backendLog', true); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     async showLaunchBarSubtreeCommand() { |     async showLaunchBarSubtreeCommand() { | ||||||
|         await appContext.tabManager.openContextWithNote('lbRoot', true, null, 'lbRoot'); |         await this.showAndHoistSubtree('lbRoot'); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     async showShareSubtreeCommand() { |     async showShareSubtreeCommand() { | ||||||
|         await appContext.tabManager.openContextWithNote('share', true, null, 'share'); |         await this.showAndHoistSubtree('share'); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     async showHiddenSubtreeCommand() { |     async showHiddenSubtreeCommand() { | ||||||
|         await appContext.tabManager.openContextWithNote('hidden', true, null, 'hidden'); |         await this.showAndHoistSubtree('hidden'); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     async showOptionsCommand() { |     async showOptionsCommand() { | ||||||
|         await appContext.tabManager.openContextWithNote('options', true, null, 'options') |         await this.showAndHoistSubtree('options'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async showSQLConsoleHistoryCommand() { | ||||||
|  |         await this.showAndHoistSubtree('sqlConsole'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async showSearchHistoryCommand() { | ||||||
|  |         await this.showAndHoistSubtree('search'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async showAndHoistSubtree(subtreeNoteId) { | ||||||
|  |         await appContext.tabManager.openContextWithNote(subtreeNoteId, true, null, subtreeNoteId); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -102,18 +102,18 @@ const TPL = ` | |||||||
|  |  | ||||||
|         <li class="dropdown-item" data-trigger-command="openNewWindow"> |         <li class="dropdown-item" data-trigger-command="openNewWindow"> | ||||||
|             <span class="bx bx-window-open"></span> |             <span class="bx bx-window-open"></span> | ||||||
|             Open new window |             Open New Window | ||||||
|             <kbd data-command="openNewWindow"></kbd> |             <kbd data-command="openNewWindow"></kbd> | ||||||
|         </li> |         </li> | ||||||
|  |  | ||||||
|         <li class="dropdown-item switch-to-mobile-version-button" data-trigger-command="switchToMobileVersion"> |         <li class="dropdown-item switch-to-mobile-version-button" data-trigger-command="switchToMobileVersion"> | ||||||
|             <span class="bx bx-mobile"></span> |             <span class="bx bx-mobile"></span> | ||||||
|             Switch to mobile version |             Switch to Mobile Version | ||||||
|         </li> |         </li> | ||||||
|          |          | ||||||
|         <li class="dropdown-item switch-to-desktop-version-button" data-trigger-command="switchToDesktopVersion"> |         <li class="dropdown-item switch-to-desktop-version-button" data-trigger-command="switchToDesktopVersion"> | ||||||
|             <span class="bx bx-desktop"></span> |             <span class="bx bx-desktop"></span> | ||||||
|             Switch to desktop version |             Switch to Desktop Version | ||||||
|         </li> |         </li> | ||||||
|          |          | ||||||
|         <span class="zoom-container dropdown-item"> |         <span class="zoom-container dropdown-item"> | ||||||
| @@ -123,26 +123,26 @@ const TPL = ` | |||||||
|             </div> |             </div> | ||||||
|              |              | ||||||
|             <div class="zoom-buttons"> |             <div class="zoom-buttons"> | ||||||
|                 <a data-trigger-command="toggleFullscreen" title="Toggle fullscreen" class="bx bx-expand-alt"></a> |                 <a data-trigger-command="toggleFullscreen" title="Toggle Fullscreen" class="bx bx-expand-alt"></a> | ||||||
|                  |                  | ||||||
|                   |                   | ||||||
|                  |                  | ||||||
|                 <a data-trigger-command="zoomOut" title="Zoom out" class="bx bx-minus"></a> |                 <a data-trigger-command="zoomOut" title="Zoom Out" class="bx bx-minus"></a> | ||||||
|                  |                  | ||||||
|                 <span class="zoom-state"></span> |                 <span class="zoom-state"></span> | ||||||
|                  |                  | ||||||
|                 <a data-trigger-command="zoomIn" title="Zoom in" class="bx bx-plus"></a> |                 <a data-trigger-command="zoomIn" title="Zoom In" class="bx bx-plus"></a> | ||||||
|             </div> |             </div> | ||||||
|         </span> |         </span> | ||||||
|  |  | ||||||
|         <li class="dropdown-item" data-trigger-command="showLaunchBarSubtree"> |         <li class="dropdown-item" data-trigger-command="showLaunchBarSubtree"> | ||||||
|             <span class="bx bx-sidebar"></span> |             <span class="bx bx-sidebar"></span> | ||||||
|             Configure launchbar |             Configure Launchbar | ||||||
|         </li> |         </li> | ||||||
|          |          | ||||||
|         <li class="dropdown-item" data-trigger-command="showShareSubtree"> |         <li class="dropdown-item" data-trigger-command="showShareSubtree"> | ||||||
|             <span class="bx bx-share-alt"></span> |             <span class="bx bx-share-alt"></span> | ||||||
|             Show share subtree |             Show Shared Notes Subtree | ||||||
|         </li> |         </li> | ||||||
|          |          | ||||||
|         <li class="dropdown-item dropdown-submenu"> |         <li class="dropdown-item dropdown-submenu"> | ||||||
| @@ -153,7 +153,7 @@ const TPL = ` | |||||||
|              |              | ||||||
|             <ul class="dropdown-menu"> |             <ul class="dropdown-menu"> | ||||||
|                 <li class="dropdown-item open-dev-tools-button" data-trigger-command="openDevTools"> |                 <li class="dropdown-item open-dev-tools-button" data-trigger-command="openDevTools"> | ||||||
|                     <span class="bx bx-terminal"></span> |                     <span class="bx bx-bug-alt"></span> | ||||||
|                     Open Dev Tools |                     Open Dev Tools | ||||||
|                     <kbd data-command="openDevTools"></kbd> |                     <kbd data-command="openDevTools"></kbd> | ||||||
|                 </li> |                 </li> | ||||||
| @@ -163,23 +163,33 @@ const TPL = ` | |||||||
|                     Open SQL Console |                     Open SQL Console | ||||||
|                     <kbd data-command="showSQLConsole"></kbd> |                     <kbd data-command="showSQLConsole"></kbd> | ||||||
|                 </li> |                 </li> | ||||||
|  |                  | ||||||
|  |                 <li class="dropdown-item" data-trigger-command="showSQLConsoleHistory"> | ||||||
|  |                     <span class="bx bx-empty"></span> | ||||||
|  |                     Open SQL Console History | ||||||
|  |                 </li> | ||||||
|  |                  | ||||||
|  |                 <li class="dropdown-item" data-trigger-command="showSearchHistory"> | ||||||
|  |                     <span class="bx bx-empty"></span> | ||||||
|  |                     Open Search History | ||||||
|  |                 </li> | ||||||
|          |          | ||||||
|                 <li class="dropdown-item" data-trigger-command="showBackendLog"> |                 <li class="dropdown-item" data-trigger-command="showBackendLog"> | ||||||
|                     <span class="bx bx-empty"></span> |                     <span class="bx bx-empty"></span> | ||||||
|                     Show backend log |                     Show Backend Log | ||||||
|                     <kbd data-command="showBackendLog"></kbd> |                     <kbd data-command="showBackendLog"></kbd> | ||||||
|                 </li> |                 </li> | ||||||
|                  |                  | ||||||
|                 <li class="dropdown-item" data-trigger-command="reloadFrontendApp"  |                 <li class="dropdown-item" data-trigger-command="reloadFrontendApp"  | ||||||
|                     title="Reload can help with some visual glitches without restarting the whole app."> |                     title="Reload can help with some visual glitches without restarting the whole app."> | ||||||
|                     <span class="bx bx-empty"></span> |                     <span class="bx bx-empty"></span> | ||||||
|                     Reload frontend |                     Reload Frontend | ||||||
|                     <kbd data-command="reloadFrontendApp"></kbd> |                     <kbd data-command="reloadFrontendApp"></kbd> | ||||||
|                 </li> |                 </li> | ||||||
|                  |                  | ||||||
|                 <li class="dropdown-item" data-trigger-command="showHiddenSubtree"> |                 <li class="dropdown-item" data-trigger-command="showHiddenSubtree"> | ||||||
|                     <span class="bx bx-empty"></span> |                     <span class="bx bx-empty"></span> | ||||||
|                     Show hidden subtree |                     Show Hidden Subtree | ||||||
|                 </li> |                 </li> | ||||||
|             </ul> |             </ul> | ||||||
|         </li> |         </li> | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ const TPL = ` | |||||||
|                     <span aria-hidden="true">×</span> |                     <span aria-hidden="true">×</span> | ||||||
|                 </button> |                 </button> | ||||||
|             </div> |             </div> | ||||||
|             <div class="modal-body"> |             e<div class="modal-body"> | ||||||
|                 <textarea class="backend-log-textarea" readonly="readonly" style="min-height: 600px; width: 100%;"></textarea> |                 <textarea class="backend-log-textarea" readonly="readonly" style="min-height: 600px; width: 100%;"></textarea> | ||||||
|             </div> |             </div> | ||||||
|             <div class="modal-footer"> |             <div class="modal-footer"> | ||||||
| @@ -44,10 +44,4 @@ export default class BackendLogDialog extends BasicWidget { | |||||||
|  |  | ||||||
|         this.scrollToBottom(); |         this.scrollToBottom(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     async showBackendLogEvent() { |  | ||||||
|         utils.openDialog(this.$widget); |  | ||||||
|  |  | ||||||
|         this.load(); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										44
									
								
								src/public/app/widgets/type_widgets/content/backend_log.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/public/app/widgets/type_widgets/content/backend_log.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | |||||||
|  | import NoteContextAwareWidget from "../../note_context_aware_widget.js"; | ||||||
|  | import server from "../../../services/server.js"; | ||||||
|  |  | ||||||
|  | const TPL = `<div style="height: 100%; display: flex; flex-direction: column;"> | ||||||
|  |     <style> | ||||||
|  |         .backend-log-textarea { | ||||||
|  |             flex-grow: 1;  | ||||||
|  |             width: 100%; | ||||||
|  |             border: none; | ||||||
|  |         }    | ||||||
|  |     </style> | ||||||
|  |  | ||||||
|  |     <textarea class="backend-log-textarea" readonly="readonly"></textarea> | ||||||
|  |      | ||||||
|  |     <div style="display: flex; justify-content: space-around; margin-top: 10px;"> | ||||||
|  |         <button class="refresh-backend-log-button btn btn-primary">Refresh</button> | ||||||
|  |     </div> | ||||||
|  | </div>`; | ||||||
|  |  | ||||||
|  | export default class ContentLogWidget extends NoteContextAwareWidget { | ||||||
|  |     doRender() { | ||||||
|  |         this.$widget = $(TPL); | ||||||
|  |         this.$backendLogTextArea = this.$widget.find(".backend-log-textarea"); | ||||||
|  |         this.$refreshBackendLog = this.$widget.find(".refresh-backend-log-button"); | ||||||
|  |  | ||||||
|  |         this.$refreshBackendLog.on('click', () => this.load()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     scrollToBottom() { | ||||||
|  |         this.$backendLogTextArea.scrollTop(this.$backendLogTextArea[0].scrollHeight); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async refresh() { | ||||||
|  |         await this.load(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async load() { | ||||||
|  |         const backendLog = await server.get('backend-log'); | ||||||
|  |  | ||||||
|  |         this.$backendLogTextArea.text(backendLog); | ||||||
|  |  | ||||||
|  |         this.scrollToBottom(); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -27,6 +27,7 @@ import DatabaseIntegrityCheckOptions from "./options/advanced/database_integrity | |||||||
| import ConsistencyChecksOptions from "./options/advanced/consistency_checks.js"; | import ConsistencyChecksOptions from "./options/advanced/consistency_checks.js"; | ||||||
| import VacuumDatabaseOptions from "./options/advanced/vacuum_database.js"; | import VacuumDatabaseOptions from "./options/advanced/vacuum_database.js"; | ||||||
| import DatabaseAnonymizationOptions from "./options/advanced/database_anonymization.js"; | import DatabaseAnonymizationOptions from "./options/advanced/database_anonymization.js"; | ||||||
|  | import ContentLogWidget from "./content/backend_log.js"; | ||||||
|  |  | ||||||
| const TPL = `<div class="note-detail-content-widget note-detail-printable"> | const TPL = `<div class="note-detail-content-widget note-detail-printable"> | ||||||
|     <style> |     <style> | ||||||
| @@ -85,7 +86,8 @@ const CONTENT_WIDGETS = { | |||||||
|         DatabaseAnonymizationOptions, |         DatabaseAnonymizationOptions, | ||||||
|         AdvancedSyncOptions, |         AdvancedSyncOptions, | ||||||
|         VacuumDatabaseOptions |         VacuumDatabaseOptions | ||||||
|     ] |     ], | ||||||
|  |     backendLog: [ ContentLogWidget ] | ||||||
| }; | }; | ||||||
|  |  | ||||||
| export default class ContentWidgetTypeWidget extends TypeWidget { | export default class ContentWidgetTypeWidget extends TypeWidget { | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ const build = require('./build'); | |||||||
| const packageJson = require('../../package'); | const packageJson = require('../../package'); | ||||||
| const {TRILIUM_DATA_DIR} = require('./data_dir'); | const {TRILIUM_DATA_DIR} = require('./data_dir'); | ||||||
|  |  | ||||||
| const APP_DB_VERSION = 205; | const APP_DB_VERSION = 207; | ||||||
| const SYNC_VERSION = 28; | const SYNC_VERSION = 28; | ||||||
| const CLIPPER_PROTOCOL_VERSION = "1.0"; | const CLIPPER_PROTOCOL_VERSION = "1.0"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ const HIDDEN_SUBTREE_DEFINITION = { | |||||||
|     children: [ |     children: [ | ||||||
|         { |         { | ||||||
|             id: 'search', |             id: 'search', | ||||||
|             title: 'search', |             title: 'Search History', | ||||||
|             type: 'doc' |             type: 'doc' | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
| @@ -42,7 +42,7 @@ const HIDDEN_SUBTREE_DEFINITION = { | |||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             id: 'sqlConsole', |             id: 'sqlConsole', | ||||||
|             title: 'SQL Console', |             title: 'SQL Console History', | ||||||
|             type: 'doc', |             type: 'doc', | ||||||
|             icon: 'bx-data' |             icon: 'bx-data' | ||||||
|         }, |         }, | ||||||
| @@ -57,6 +57,15 @@ const HIDDEN_SUBTREE_DEFINITION = { | |||||||
|             title: 'Bulk action', |             title: 'Bulk action', | ||||||
|             type: 'doc', |             type: 'doc', | ||||||
|         }, |         }, | ||||||
|  |         { | ||||||
|  |             id: 'backendLog', | ||||||
|  |             title: 'Backend Log', | ||||||
|  |             type: 'contentWidget', | ||||||
|  |             icon: 'bx-terminal', | ||||||
|  |             attributes: [ | ||||||
|  |                 { type: 'label', name: 'keepCurrentHoisting' } | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|         { |         { | ||||||
|             // place for user scripts hidden stuff (scripts should not create notes directly under hidden root) |             // place for user scripts hidden stuff (scripts should not create notes directly under hidden root) | ||||||
|             id: 'userHidden', |             id: 'userHidden', | ||||||
| @@ -158,8 +167,9 @@ const HIDDEN_SUBTREE_DEFINITION = { | |||||||
|                     isExpanded: true, |                     isExpanded: true, | ||||||
|                     attributes: [ { type: 'label', name: 'docName', value: 'launchbar_intro' } ], |                     attributes: [ { type: 'label', name: 'docName', value: 'launchbar_intro' } ], | ||||||
|                     children: [ |                     children: [ | ||||||
|                         { id: 'lbBackInHistory', title: 'Back in history', type: 'launcher', builtinWidget: 'backInHistoryButton', icon: 'bx bxs-left-arrow-square' }, |                         { 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: 'lbForwardInHistory', title: 'Forward in History', type: 'launcher', builtinWidget: 'forwardInHistoryButton', icon: 'bx bxs-right-arrow-square' }, | ||||||
|  |                         { id: 'lbBackendLog', title: 'Backend Log', type: 'launcher', targetNoteId: 'backendLog', icon: 'bx bx-terminal' }, | ||||||
|                     ] |                     ] | ||||||
|                 }, |                 }, | ||||||
|                 { |                 { | ||||||
|   | |||||||
| @@ -6,6 +6,8 @@ const cls = require("./cls"); | |||||||
| const dateUtils = require("./date_utils"); | const dateUtils = require("./date_utils"); | ||||||
| const log = require("./log"); | const log = require("./log"); | ||||||
| const hiddenSubtreeService = require("./hidden_subtree"); | const hiddenSubtreeService = require("./hidden_subtree"); | ||||||
|  | const searchService = require("./search/services/search.js"); | ||||||
|  | const SearchContext = require("./search/search_context.js"); | ||||||
|  |  | ||||||
| function getInboxNote(date) { | function getInboxNote(date) { | ||||||
|     const hoistedNote = getHoistedNote(); |     const hoistedNote = getHoistedNote(); | ||||||
| @@ -33,7 +35,7 @@ function getInboxNote(date) { | |||||||
|  |  | ||||||
| function createSqlConsole() { | function createSqlConsole() { | ||||||
|     const {note} = noteService.createNewNote({ |     const {note} = noteService.createNewNote({ | ||||||
|         parentNoteId: 'sqlConsole', |         parentNoteId: getMonthlyParentNoteId('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', | ||||||
| @@ -68,7 +70,7 @@ function saveSqlConsole(sqlConsoleNoteId) { | |||||||
|  |  | ||||||
| function createSearchNote(searchString, ancestorNoteId) { | function createSearchNote(searchString, ancestorNoteId) { | ||||||
|     const {note} = noteService.createNewNote({ |     const {note} = noteService.createNewNote({ | ||||||
|         parentNoteId: 'search', |         parentNoteId: getMonthlyParentNoteId('search'), | ||||||
|         title: 'Search: ' + searchString, |         title: 'Search: ' + searchString, | ||||||
|         content: "", |         content: "", | ||||||
|         type: 'search', |         type: 'search', | ||||||
| @@ -115,6 +117,28 @@ function saveSearchNote(searchNoteId) { | |||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function getMonthlyParentNoteId(rootNoteId) { | ||||||
|  |     const month = dateUtils.localNowDate().substring(0, 7); | ||||||
|  |     const labelName = `${rootNoteId}MonthNote`; | ||||||
|  |  | ||||||
|  |     let monthNote = searchService.findFirstNoteWithQuery(`#${labelName}="${month}"`, | ||||||
|  |         new SearchContext({ancestorNoteId: rootNoteId})); | ||||||
|  |  | ||||||
|  |     if (!monthNote) { | ||||||
|  |         monthNote = noteService.createNewNote({ | ||||||
|  |             parentNoteId: rootNoteId, | ||||||
|  |             title: month, | ||||||
|  |             content: '', | ||||||
|  |             isProtected: false, | ||||||
|  |             type: 'book' | ||||||
|  |         }).note | ||||||
|  |  | ||||||
|  |         monthNote.addLabel(labelName, month); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return monthNote.noteId; | ||||||
|  | } | ||||||
|  |  | ||||||
| function getHoistedNote() { | function getHoistedNote() { | ||||||
|     return becca.getNote(cls.getHoistedNoteId()); |     return becca.getNote(cls.getHoistedNoteId()); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user