| 
									
										
										
										
											2018-08-06 22:29:03 +02:00
										 |  |  | import server from "./server.js"; | 
					
						
							| 
									
										
										
										
											2022-12-01 13:07:23 +01:00
										 |  |  | import appContext from "../components/app_context.js"; | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  | import utils from './utils.js'; | 
					
						
							| 
									
										
										
										
											2020-09-21 00:07:46 +02:00
										 |  |  | import noteCreateService from './note_create.js'; | 
					
						
							| 
									
										
										
										
											2021-04-16 23:01:56 +02:00
										 |  |  | import froca from "./froca.js"; | 
					
						
							| 
									
										
										
										
											2024-12-14 01:48:56 +02:00
										 |  |  | import { t } from "./i18n.js"; | 
					
						
							| 
									
										
										
										
											2018-08-16 21:02:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-09 21:49:37 +02:00
										 |  |  | // this key needs to have this value, so it's hit by the tooltip
 | 
					
						
							| 
									
										
										
										
											2020-05-16 22:11:09 +02:00
										 |  |  | const SELECTED_NOTE_PATH_KEY = "data-note-path"; | 
					
						
							| 
									
										
										
										
											2018-11-14 00:05:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-08 21:44:43 +01:00
										 |  |  | const SELECTED_EXTERNAL_LINK_KEY = "data-external-link"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-21 22:08:54 +02:00
										 |  |  | async function autocompleteSourceForCKEditor(queryText) { | 
					
						
							|  |  |  |     return await new Promise((res, rej) => { | 
					
						
							|  |  |  |         autocompleteSource(queryText, rows => { | 
					
						
							|  |  |  |             res(rows.map(row => { | 
					
						
							|  |  |  |                 return { | 
					
						
							|  |  |  |                     action: row.action, | 
					
						
							|  |  |  |                     noteTitle: row.noteTitle, | 
					
						
							| 
									
										
										
										
											2022-12-21 15:19:05 +01:00
										 |  |  |                     id: `@${row.notePathTitle}`, | 
					
						
							| 
									
										
										
										
											2020-09-21 22:08:54 +02:00
										 |  |  |                     name: row.notePathTitle, | 
					
						
							| 
									
										
										
										
											2022-12-21 15:19:05 +01:00
										 |  |  |                     link: `#${row.notePath}`, | 
					
						
							| 
									
										
										
										
											2020-09-21 22:08:54 +02:00
										 |  |  |                     notePath: row.notePath, | 
					
						
							|  |  |  |                     highlightedNotePathTitle: row.highlightedNotePathTitle | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             })); | 
					
						
							| 
									
										
										
										
											2021-01-18 22:52:07 +01:00
										 |  |  |         }, { | 
					
						
							|  |  |  |             allowCreatingNotes: true | 
					
						
							| 
									
										
										
										
											2020-09-21 22:08:54 +02:00
										 |  |  |         }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-27 09:51:34 +08:00
										 |  |  | async function autocompleteSource(term, cb, options = {}) { | 
					
						
							|  |  |  |     const fastSearch = options.fastSearch === false ? false : true; | 
					
						
							| 
									
										
										
										
											2024-11-26 16:20:38 +08:00
										 |  |  |     if (fastSearch === false) { | 
					
						
							| 
									
										
										
										
											2024-11-27 09:51:34 +08:00
										 |  |  |         if (term.trim().length === 0){ | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-11-26 16:20:38 +08:00
										 |  |  |         cb( | 
					
						
							|  |  |  |             [{ | 
					
						
							|  |  |  |                 noteTitle: term, | 
					
						
							| 
									
										
										
										
											2024-12-14 01:48:56 +02:00
										 |  |  |                 highlightedNotePathTitle: t("quick-search.searching") | 
					
						
							| 
									
										
										
										
											2024-11-26 16:20:38 +08:00
										 |  |  |             }] | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2021-05-22 12:35:41 +02:00
										 |  |  |     const activeNoteId = appContext.tabManager.getActiveContextNoteId(); | 
					
						
							| 
									
										
										
										
											2020-09-21 00:07:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-26 15:41:18 +08:00
										 |  |  |     let results = await server.get(`autocomplete?query=${encodeURIComponent(term)}&activeNoteId=${activeNoteId}&fastSearch=${fastSearch}`); | 
					
						
							| 
									
										
										
										
											2021-01-18 22:52:07 +01:00
										 |  |  |     if (term.trim().length >= 1 && options.allowCreatingNotes) { | 
					
						
							| 
									
										
										
										
											2020-09-21 00:07:46 +02:00
										 |  |  |         results = [ | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2020-09-21 22:08:54 +02:00
										 |  |  |                 action: 'create-note', | 
					
						
							| 
									
										
										
										
											2020-09-21 00:07:46 +02:00
										 |  |  |                 noteTitle: term, | 
					
						
							| 
									
										
										
										
											2020-09-21 22:08:54 +02:00
										 |  |  |                 parentNoteId: activeNoteId || 'root', | 
					
						
							| 
									
										
										
										
											2024-12-14 01:48:56 +02:00
										 |  |  |                 highlightedNotePathTitle: t("note_autocomplete.create-note", { term }) | 
					
						
							| 
									
										
										
										
											2020-09-21 00:07:46 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         ].concat(results); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-08-16 21:02:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-24 13:11:57 +08:00
										 |  |  |     if (term.trim().length >= 1 && options.allowJumpToSearchNotes) { | 
					
						
							| 
									
										
										
										
											2024-11-20 14:22:39 +08:00
										 |  |  |         results = results.concat([ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 action: 'search-notes', | 
					
						
							|  |  |  |                 noteTitle: term, | 
					
						
							| 
									
										
										
										
											2024-12-14 01:48:56 +02:00
										 |  |  |                 highlightedNotePathTitle: `${t("note_autocomplete.search-for", { term })} <kbd style='color: var(--muted-text-color); background-color: transparent; float: right;'>Ctrl+Enter</kbd>` | 
					
						
							| 
									
										
										
										
											2024-11-20 14:22:39 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-08 21:44:43 +01:00
										 |  |  |     if (term.match(/^[a-z]+:\/\/.+/i) && options.allowExternalLinks) { | 
					
						
							|  |  |  |         results = [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 action: 'external-link', | 
					
						
							|  |  |  |                 externalLink: term, | 
					
						
							| 
									
										
										
										
											2024-12-14 01:48:56 +02:00
										 |  |  |                 highlightedNotePathTitle: t("note_autocomplete.insert-external-link", { term }) | 
					
						
							| 
									
										
										
										
											2021-01-08 21:44:43 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         ].concat(results); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-21 00:07:46 +02:00
										 |  |  |     cb(results); | 
					
						
							| 
									
										
										
										
											2018-08-16 21:02:42 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-08-06 22:29:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-13 23:16:26 +01:00
										 |  |  | function clearText($el) { | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |     if (utils.isMobile()) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-16 22:11:09 +02:00
										 |  |  |     $el.setSelectedNotePath(""); | 
					
						
							| 
									
										
										
										
											2019-11-09 17:39:48 +01:00
										 |  |  |     $el.autocomplete("val", "").trigger('change'); | 
					
						
							| 
									
										
										
										
											2018-11-13 23:16:26 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-05 14:22:11 +01:00
										 |  |  | function setText($el, text) { | 
					
						
							|  |  |  |     if (utils.isMobile()) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $el.setSelectedNotePath(""); | 
					
						
							|  |  |  |     $el | 
					
						
							|  |  |  |         .autocomplete("val", text.trim()) | 
					
						
							|  |  |  |         .autocomplete("open"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 09:51:14 +01:00
										 |  |  | function showRecentNotes($el) { | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |     if (utils.isMobile()) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-16 22:11:09 +02:00
										 |  |  |     $el.setSelectedNotePath(""); | 
					
						
							| 
									
										
										
										
											2018-11-07 09:51:14 +01:00
										 |  |  |     $el.autocomplete("val", ""); | 
					
						
							| 
									
										
										
										
											2024-11-24 13:10:33 +08:00
										 |  |  |     $el.autocomplete('open'); | 
					
						
							| 
									
										
										
										
											2019-11-09 17:45:22 +01:00
										 |  |  |     $el.trigger('focus'); | 
					
						
							| 
									
										
										
										
											2018-11-07 09:51:14 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-27 09:51:34 +08:00
										 |  |  | function fullTextSearch($el, options){ | 
					
						
							| 
									
										
										
										
											2024-11-24 13:10:33 +08:00
										 |  |  |     const searchString = $el.autocomplete('val'); | 
					
						
							| 
									
										
										
										
											2024-11-27 09:51:34 +08:00
										 |  |  |     if (options.fastSearch === false || searchString.trim().length === 0) { | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2024-11-27 10:10:37 +08:00
										 |  |  |     }     | 
					
						
							|  |  |  |     $el.trigger('focus'); | 
					
						
							| 
									
										
										
										
											2024-11-27 09:51:34 +08:00
										 |  |  |     options.fastSearch = false; | 
					
						
							|  |  |  |     $el.autocomplete('val', ''); | 
					
						
							|  |  |  |     $el.setSelectedNotePath(""); | 
					
						
							|  |  |  |     $el.autocomplete('val', searchString); | 
					
						
							| 
									
										
										
										
											2024-11-27 10:14:13 +08:00
										 |  |  |     // Set a delay to avoid resetting to true before full text search (await server.get) is called.
 | 
					
						
							| 
									
										
										
										
											2024-11-27 09:51:34 +08:00
										 |  |  |     setTimeout(() => { options.fastSearch = true; }, 100); | 
					
						
							| 
									
										
										
										
											2024-11-23 20:51:51 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-14 11:28:52 +01:00
										 |  |  | function initNoteAutocomplete($el, options) { | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |     if ($el.hasClass("note-autocomplete-input") || utils.isMobile()) { | 
					
						
							| 
									
										
										
										
											2020-10-02 21:44:21 +02:00
										 |  |  |         // clear any event listener added in previous invocation of this function
 | 
					
						
							|  |  |  |         $el.off('autocomplete:noteselected'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |         return $el; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-11-13 23:16:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |     options = options || {}; | 
					
						
							| 
									
										
										
										
											2018-11-13 23:16:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |     $el.addClass("note-autocomplete-input"); | 
					
						
							| 
									
										
										
										
											2018-11-14 11:17:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-03 17:08:07 +02:00
										 |  |  |     const $clearTextButton = $("<button>") | 
					
						
							|  |  |  |         .addClass("input-group-text input-clearer-button bx bxs-tag-x") | 
					
						
							| 
									
										
										
										
											2024-12-14 01:48:56 +02:00
										 |  |  |         .prop("title", t("note_autocomplete.clear-text-field")); | 
					
						
							| 
									
										
										
										
											2018-11-14 11:28:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-03 17:08:07 +02:00
										 |  |  |     const $showRecentNotesButton = $("<button>") | 
					
						
							|  |  |  |         .addClass("input-group-text show-recent-notes-button bx bx-time") | 
					
						
							| 
									
										
										
										
											2024-12-14 01:48:56 +02:00
										 |  |  |         .prop("title", t("note_autocomplete.show-recent-notes")); | 
					
						
							| 
									
										
										
										
											2018-11-14 11:28:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-23 20:51:51 +08:00
										 |  |  |     const $fullTextSearchButton = $("<button>") | 
					
						
							|  |  |  |         .addClass("input-group-text full-text-search-button bx bx-search") | 
					
						
							| 
									
										
										
										
											2024-12-14 01:48:56 +02:00
										 |  |  |         .prop("title", `${t("note_autocomplete.full-text-search")} (Shift+Enter)`);  | 
					
						
							| 
									
										
										
										
											2024-11-23 20:51:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 01:40:20 +02:00
										 |  |  |     const $goToSelectedNoteButton = $("<a>") | 
					
						
							| 
									
										
										
										
											2023-05-07 21:18:21 +02:00
										 |  |  |         .addClass("input-group-text go-to-selected-note-button bx bx-arrow-to-right"); | 
					
						
							| 
									
										
										
										
											2018-08-06 22:29:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-23 20:51:51 +08:00
										 |  |  |     $el.after($clearTextButton).after($showRecentNotesButton).after($fullTextSearchButton); | 
					
						
							| 
									
										
										
										
											2018-08-06 22:29:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |     if (!options.hideGoToSelectedNoteButton) { | 
					
						
							| 
									
										
										
										
											2024-09-03 17:08:07 +02:00
										 |  |  |         $el.after($goToSelectedNoteButton); | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-01-10 21:04:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-09 17:39:48 +01:00
										 |  |  |     $clearTextButton.on('click', () => clearText($el)); | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-09 17:39:48 +01:00
										 |  |  |     $showRecentNotesButton.on('click', e => { | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |         showRecentNotes($el); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // this will cause the click not give focus to the "show recent notes" button
 | 
					
						
							| 
									
										
										
										
											2023-06-23 00:26:47 +08:00
										 |  |  |         // this is important because otherwise input will lose focus immediately and not show the results
 | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2024-11-17 12:18:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-23 20:51:51 +08:00
										 |  |  |     $fullTextSearchButton.on('click', e => { | 
					
						
							|  |  |  |         fullTextSearch($el, options); | 
					
						
							| 
									
										
										
										
											2024-11-26 15:41:18 +08:00
										 |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2024-11-23 20:51:51 +08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-26 17:03:09 +03:00
										 |  |  |     let autocompleteOptions = {}; | 
					
						
							|  |  |  |     if (options.container) { | 
					
						
							|  |  |  |         autocompleteOptions.dropdownMenuContainer = options.container; | 
					
						
							| 
									
										
										
										
											2023-08-26 17:07:04 +03:00
										 |  |  |         autocompleteOptions.debug = true;   // don't close on blur
 | 
					
						
							| 
									
										
										
										
											2023-08-26 17:03:09 +03:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-24 13:11:57 +08:00
										 |  |  |     if (options.allowJumpToSearchNotes) { | 
					
						
							| 
									
										
										
										
											2024-11-20 14:22:39 +08:00
										 |  |  |         $el.on('keydown', (event) => { | 
					
						
							|  |  |  |             if (event.ctrlKey && event.key === 'Enter') { | 
					
						
							|  |  |  |                 // Prevent Ctrl + Enter from triggering autoComplete.
 | 
					
						
							|  |  |  |                 event.stopImmediatePropagation(); | 
					
						
							|  |  |  |                 event.preventDefault(); | 
					
						
							|  |  |  |                 $el.trigger('autocomplete:selected', { action: 'search-notes', noteTitle: $el.autocomplete("val")}); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-11-23 20:51:51 +08:00
										 |  |  |     $el.on('keydown', async (event) => { | 
					
						
							|  |  |  |         if (event.shiftKey && event.key === 'Enter') { | 
					
						
							|  |  |  |             // Prevent Enter from triggering autoComplete.
 | 
					
						
							|  |  |  |             event.stopImmediatePropagation(); | 
					
						
							|  |  |  |             event.preventDefault(); | 
					
						
							|  |  |  |             fullTextSearch($el,options) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |     $el.autocomplete({ | 
					
						
							| 
									
										
										
										
											2023-08-26 17:03:09 +03:00
										 |  |  |         ...autocompleteOptions, | 
					
						
							| 
									
										
										
										
											2023-08-26 17:48:12 +03:00
										 |  |  |         appendTo: document.querySelector('body'), | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |         hint: false, | 
					
						
							|  |  |  |         autoselect: true, | 
					
						
							| 
									
										
										
										
											2022-06-03 08:07:27 +02:00
										 |  |  |         // openOnFocus has to be false, otherwise re-focus (after return from note type chooser dialog) forces
 | 
					
						
							| 
									
										
										
										
											2023-05-05 23:41:11 +02:00
										 |  |  |         // re-querying of the autocomplete source which then changes the currently selected suggestion
 | 
					
						
							| 
									
										
										
										
											2022-06-03 08:07:27 +02:00
										 |  |  |         openOnFocus: false, | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |         minLength: 0, | 
					
						
							|  |  |  |         tabAutocomplete: false | 
					
						
							|  |  |  |     }, [ | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-11-27 09:51:34 +08:00
										 |  |  |             source: (term, cb) => autocompleteSource(term, cb, options), | 
					
						
							| 
									
										
										
										
											2020-05-16 22:11:09 +02:00
										 |  |  |             displayKey: 'notePathTitle', | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |             templates: { | 
					
						
							| 
									
										
										
										
											2020-09-21 00:07:46 +02:00
										 |  |  |                 suggestion: suggestion => suggestion.highlightedNotePathTitle | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             // we can't cache identical searches because notes can be created / renamed, new recent notes can be added
 | 
					
						
							|  |  |  |             cache: false | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ]); | 
					
						
							| 
									
										
										
										
											2018-11-07 09:51:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-21 00:07:46 +02:00
										 |  |  |     $el.on('autocomplete:selected', async (event, suggestion) => { | 
					
						
							| 
									
										
										
										
											2021-01-08 21:44:43 +01:00
										 |  |  |         if (suggestion.action === 'external-link') { | 
					
						
							|  |  |  |             $el.setSelectedNotePath(null); | 
					
						
							|  |  |  |             $el.setSelectedExternalLink(suggestion.externalLink); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $el.autocomplete("val", suggestion.externalLink); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $el.autocomplete("close"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $el.trigger('autocomplete:externallinkselected', [suggestion]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-21 22:08:54 +02:00
										 |  |  |         if (suggestion.action === 'create-note') { | 
					
						
							| 
									
										
										
										
											2024-09-03 17:08:07 +02:00
										 |  |  |             const { success, noteType, templateNoteId } = await noteCreateService.chooseNoteType(); | 
					
						
							| 
									
										
										
										
											2022-06-02 14:16:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (!success) { | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-03 17:08:07 +02:00
										 |  |  |             const { note } = await noteCreateService.createNote(suggestion.parentNoteId, { | 
					
						
							| 
									
										
										
										
											2020-09-21 00:07:46 +02:00
										 |  |  |                 title: suggestion.noteTitle, | 
					
						
							| 
									
										
										
										
											2022-06-02 14:16:49 +02:00
										 |  |  |                 activate: false, | 
					
						
							|  |  |  |                 type: noteType, | 
					
						
							|  |  |  |                 templateNoteId: templateNoteId | 
					
						
							| 
									
										
										
										
											2020-09-21 00:07:46 +02:00
										 |  |  |             }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-15 00:06:13 +02:00
										 |  |  |             const hoistedNoteId = appContext.tabManager.getActiveContext()?.hoistedNoteId; | 
					
						
							|  |  |  |             suggestion.notePath = note.getBestNotePathString(hoistedNoteId); | 
					
						
							| 
									
										
										
										
											2020-09-21 00:07:46 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-20 14:22:39 +08:00
										 |  |  |         if (suggestion.action === 'search-notes') { | 
					
						
							|  |  |  |             const searchString = suggestion.noteTitle; | 
					
						
							|  |  |  |             appContext.triggerCommand('searchNotes', { searchString }); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:11 +02:00
										 |  |  |         $el.setSelectedNotePath(suggestion.notePath); | 
					
						
							| 
									
										
										
										
											2021-01-08 21:44:43 +01:00
										 |  |  |         $el.setSelectedExternalLink(null); | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:11 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $el.autocomplete("val", suggestion.noteTitle); | 
					
						
							| 
									
										
										
										
											2020-09-21 00:07:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $el.autocomplete("close"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-21 22:08:54 +02:00
										 |  |  |         $el.trigger('autocomplete:noteselected', [suggestion]); | 
					
						
							| 
									
										
										
										
											2020-09-03 17:38:11 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-22 20:53:59 +02:00
										 |  |  |     $el.on('autocomplete:closed', () => { | 
					
						
							|  |  |  |         if (!$el.val().trim()) { | 
					
						
							|  |  |  |             clearText($el); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2018-11-07 09:51:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-11 22:52:17 +02:00
										 |  |  |     $el.on('autocomplete:opened', () => { | 
					
						
							|  |  |  |         if ($el.attr("readonly")) { | 
					
						
							|  |  |  |             $el.autocomplete('close'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-02 21:44:21 +02:00
										 |  |  |     // clear any event listener added in previous invocation of this function
 | 
					
						
							|  |  |  |     $el.off('autocomplete:noteselected'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 09:51:14 +01:00
										 |  |  |     return $el; | 
					
						
							| 
									
										
										
										
											2018-08-06 22:29:03 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-24 10:10:36 +01:00
										 |  |  | function init() { | 
					
						
							| 
									
										
										
										
											2020-05-16 22:11:09 +02:00
										 |  |  |     $.fn.getSelectedNotePath = function () { | 
					
						
							| 
									
										
										
										
											2018-12-24 10:10:36 +01:00
										 |  |  |         if (!$(this).val().trim()) { | 
					
						
							|  |  |  |             return ""; | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2020-05-16 22:11:09 +02:00
										 |  |  |             return $(this).attr(SELECTED_NOTE_PATH_KEY); | 
					
						
							| 
									
										
										
										
											2018-12-24 10:10:36 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2018-11-12 23:34:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-12 23:39:05 +02:00
										 |  |  |     $.fn.getSelectedNoteId = function () { | 
					
						
							|  |  |  |         const notePath = $(this).getSelectedNotePath(); | 
					
						
							| 
									
										
										
										
											2023-01-13 10:09:41 +01:00
										 |  |  |         if (!notePath) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-12 23:39:05 +02:00
										 |  |  |         const chunks = notePath.split('/'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return chunks.length >= 1 ? chunks[chunks.length - 1] : null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-16 22:11:09 +02:00
										 |  |  |     $.fn.setSelectedNotePath = function (notePath) { | 
					
						
							|  |  |  |         notePath = notePath || ""; | 
					
						
							| 
									
										
										
										
											2018-11-14 11:17:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-16 22:11:09 +02:00
										 |  |  |         $(this).attr(SELECTED_NOTE_PATH_KEY, notePath); | 
					
						
							| 
									
										
										
										
											2018-11-14 11:17:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-24 10:10:36 +01:00
										 |  |  |         $(this) | 
					
						
							|  |  |  |             .closest(".input-group") | 
					
						
							|  |  |  |             .find(".go-to-selected-note-button") | 
					
						
							| 
									
										
										
										
											2020-05-16 22:11:09 +02:00
										 |  |  |             .toggleClass("disabled", !notePath.trim()) | 
					
						
							| 
									
										
										
										
											2023-05-07 21:29:09 +02:00
										 |  |  |             .attr("href", `#${notePath}`); // we also set href here so tooltip can be displayed
 | 
					
						
							| 
									
										
										
										
											2018-12-24 10:10:36 +01:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2021-01-08 21:44:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     $.fn.getSelectedExternalLink = function () { | 
					
						
							|  |  |  |         if (!$(this).val().trim()) { | 
					
						
							|  |  |  |             return ""; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return $(this).attr(SELECTED_EXTERNAL_LINK_KEY); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $.fn.setSelectedExternalLink = function (externalLink) { | 
					
						
							| 
									
										
										
										
											2023-05-07 21:29:09 +02:00
										 |  |  |         if (externalLink) { | 
					
						
							|  |  |  |             $(this) | 
					
						
							|  |  |  |                 .closest(".input-group") | 
					
						
							|  |  |  |                 .find(".go-to-selected-note-button") | 
					
						
							|  |  |  |                 .toggleClass("disabled", true); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-01-08 21:44:43 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-01-19 22:10:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     $.fn.setNote = async function (noteId) { | 
					
						
							| 
									
										
										
										
											2021-04-16 22:57:37 +02:00
										 |  |  |         const note = noteId ? await froca.getNote(noteId, true) : null; | 
					
						
							| 
									
										
										
										
											2021-01-19 22:10:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $(this) | 
					
						
							|  |  |  |             .val(note ? note.title : "") | 
					
						
							|  |  |  |             .setSelectedNotePath(noteId); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-12-24 10:10:36 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-08-06 22:29:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default { | 
					
						
							| 
									
										
										
										
											2020-09-21 22:08:54 +02:00
										 |  |  |     autocompleteSourceForCKEditor, | 
					
						
							| 
									
										
										
										
											2018-08-16 21:02:42 +02:00
										 |  |  |     initNoteAutocomplete, | 
					
						
							| 
									
										
										
										
											2018-12-24 10:10:36 +01:00
										 |  |  |     showRecentNotes, | 
					
						
							| 
									
										
										
										
											2021-01-05 14:22:11 +01:00
										 |  |  |     setText, | 
					
						
							| 
									
										
										
										
											2018-12-24 10:10:36 +01:00
										 |  |  |     init | 
					
						
							| 
									
										
										
										
											2020-05-16 22:11:09 +02:00
										 |  |  | } |