mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 18:36:30 +01:00 
			
		
		
		
	Add full text search in autocomplete
This commit is contained in:
		| @@ -32,8 +32,7 @@ async function autocompleteSourceForCKEditor(queryText) { | |||||||
| async function autocompleteSource(term, cb, options = {}) { | async function autocompleteSource(term, cb, options = {}) { | ||||||
|     const activeNoteId = appContext.tabManager.getActiveContextNoteId(); |     const activeNoteId = appContext.tabManager.getActiveContextNoteId(); | ||||||
|  |  | ||||||
|     let results = await server.get(`autocomplete?query=${encodeURIComponent(term)}&activeNoteId=${activeNoteId}`); |     let results = await server.get(`autocomplete?query=${encodeURIComponent(term)}&activeNoteId=${activeNoteId}&fastSearch=${options.fastSearch}`); | ||||||
|  |  | ||||||
|     if (term.trim().length >= 1 && options.allowCreatingNotes) { |     if (term.trim().length >= 1 && options.allowCreatingNotes) { | ||||||
|         results = [ |         results = [ | ||||||
|             { |             { | ||||||
| @@ -103,6 +102,15 @@ function showRecentNotes($el) { | |||||||
|     $el.trigger(e); |     $el.trigger(e); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function fullTextSearch($el,options){ | ||||||
|  |     const searchString = $el.autocomplete("val") | ||||||
|  |         clearText($el); | ||||||
|  |         options.fastSearch = false; | ||||||
|  |         $el.autocomplete("val", searchString); | ||||||
|  |         $el.autocomplete('open'); | ||||||
|  |         options.fastSearch = true; | ||||||
|  | } | ||||||
|  |  | ||||||
| function initNoteAutocomplete($el, options) { | function initNoteAutocomplete($el, options) { | ||||||
|     if ($el.hasClass("note-autocomplete-input") || utils.isMobile()) { |     if ($el.hasClass("note-autocomplete-input") || utils.isMobile()) { | ||||||
|         // clear any event listener added in previous invocation of this function |         // clear any event listener added in previous invocation of this function | ||||||
| @@ -123,10 +131,14 @@ function initNoteAutocomplete($el, options) { | |||||||
|         .addClass("input-group-text show-recent-notes-button bx bx-time") |         .addClass("input-group-text show-recent-notes-button bx bx-time") | ||||||
|         .prop("title", "Show recent notes"); |         .prop("title", "Show recent notes"); | ||||||
|  |  | ||||||
|  |     const $fullTextSearchButton = $("<button>") | ||||||
|  |         .addClass("input-group-text full-text-search-button bx bx-search") | ||||||
|  |         .prop("title", "Full text search. (Shift+Enter)");     | ||||||
|  |  | ||||||
|     const $goToSelectedNoteButton = $("<button>") |     const $goToSelectedNoteButton = $("<button>") | ||||||
|         .addClass("input-group-text go-to-selected-note-button bx bx-arrow-to-right"); |         .addClass("input-group-text go-to-selected-note-button bx bx-arrow-to-right"); | ||||||
|  |  | ||||||
|     $el.after($clearTextButton).after($showRecentNotesButton); |     $el.after($clearTextButton).after($showRecentNotesButton).after($fullTextSearchButton); | ||||||
|  |  | ||||||
|     if (!options.hideGoToSelectedNoteButton) { |     if (!options.hideGoToSelectedNoteButton) { | ||||||
|         $el.after($goToSelectedNoteButton); |         $el.after($goToSelectedNoteButton); | ||||||
| @@ -142,6 +154,10 @@ function initNoteAutocomplete($el, options) { | |||||||
|         return false; |         return false; | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  |     $fullTextSearchButton.on('click', e => { | ||||||
|  |         fullTextSearch($el, options); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|     let autocompleteOptions = {}; |     let autocompleteOptions = {}; | ||||||
|     if (options.container) { |     if (options.container) { | ||||||
|         autocompleteOptions.dropdownMenuContainer = options.container; |         autocompleteOptions.dropdownMenuContainer = options.container; | ||||||
| @@ -158,7 +174,16 @@ function initNoteAutocomplete($el, options) { | |||||||
|             } |             } | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |     $el.on('keydown', async (event) => { | ||||||
|  |         if (event.shiftKey && event.key === 'Enter') { | ||||||
|  |             // Prevent Enter from triggering autoComplete. | ||||||
|  |             event.stopImmediatePropagation(); | ||||||
|  |             event.preventDefault(); | ||||||
|  |             fullTextSearch($el,options) | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|      |      | ||||||
|  |     options.fastSearch = true; // Perform fast search by default | ||||||
|     $el.autocomplete({ |     $el.autocomplete({ | ||||||
|         ...autocompleteOptions, |         ...autocompleteOptions, | ||||||
|         appendTo: document.querySelector('body'), |         appendTo: document.querySelector('body'), | ||||||
|   | |||||||
| @@ -14,6 +14,8 @@ function getAutocomplete(req: Request) { | |||||||
|         throw new ValidationError("Invalid query data type."); |         throw new ValidationError("Invalid query data type."); | ||||||
|     } |     } | ||||||
|     const query = (req.query.query || "").trim(); |     const query = (req.query.query || "").trim(); | ||||||
|  |     const fastSearch = String(req.query.fastSearch).toLowerCase() === "false" ? false : true; | ||||||
|  |      | ||||||
|     const activeNoteId = req.query.activeNoteId || 'none'; |     const activeNoteId = req.query.activeNoteId || 'none'; | ||||||
|  |  | ||||||
|     let results; |     let results; | ||||||
| @@ -24,7 +26,7 @@ function getAutocomplete(req: Request) { | |||||||
|         results = getRecentNotes(activeNoteId); |         results = getRecentNotes(activeNoteId); | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|         results = searchService.searchNotesForAutocomplete(query); |         results = searchService.searchNotesForAutocomplete(query, fastSearch); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const msTaken = Date.now() - timestampStarted; |     const msTaken = Date.now() - timestampStarted; | ||||||
|   | |||||||
| @@ -340,9 +340,9 @@ function findFirstNoteWithQuery(query: string, searchContext: SearchContext): BN | |||||||
|     return searchResults.length > 0 ? becca.notes[searchResults[0].noteId] : null; |     return searchResults.length > 0 ? becca.notes[searchResults[0].noteId] : null; | ||||||
| } | } | ||||||
|  |  | ||||||
| function searchNotesForAutocomplete(query: string) { | function searchNotesForAutocomplete(query: string, fastSearch: boolean = true) { | ||||||
|     const searchContext = new SearchContext({ |     const searchContext = new SearchContext({ | ||||||
|         fastSearch: true, |         fastSearch: fastSearch, | ||||||
|         includeArchivedNotes: false, |         includeArchivedNotes: false, | ||||||
|         includeHiddenNotes: true, |         includeHiddenNotes: true, | ||||||
|         fuzzyAttributeSearch: true, |         fuzzyAttributeSearch: true, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user