From 8d7ee4cb1a45157af575716b000567f66502b8a4 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 9 Apr 2024 22:11:52 -0700 Subject: [PATCH] Allow disabling advanced search in global search --- .../admin/settings/settings.component.html | 8 ++++++++ .../admin/settings/settings.component.spec.ts | 2 +- .../admin/settings/settings.component.ts | 6 ++++++ src-ui/src/app/data/ui-settings.ts | 6 ++++++ .../app/services/rest/search.service.spec.ts | 18 ++++++++++++++++++ src-ui/src/app/services/rest/search.service.ts | 13 +++++++++++-- src/documents/views.py | 4 +++- 7 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src-ui/src/app/components/admin/settings/settings.component.html b/src-ui/src/app/components/admin/settings/settings.component.html index 0fc744edb..6cd0d9ca4 100644 --- a/src-ui/src/app/components/admin/settings/settings.component.html +++ b/src-ui/src/app/components/admin/settings/settings.component.html @@ -197,6 +197,14 @@ +

Global search

+ +
+
+ +
+
+

Notes

diff --git a/src-ui/src/app/components/admin/settings/settings.component.spec.ts b/src-ui/src/app/components/admin/settings/settings.component.spec.ts index d53f57b69..c696c1b4c 100644 --- a/src-ui/src/app/components/admin/settings/settings.component.spec.ts +++ b/src-ui/src/app/components/admin/settings/settings.component.spec.ts @@ -305,7 +305,7 @@ describe('SettingsComponent', () => { expect(toastErrorSpy).toHaveBeenCalled() expect(storeSpy).toHaveBeenCalled() expect(appearanceSettingsSpy).not.toHaveBeenCalled() - expect(setSpy).toHaveBeenCalledTimes(25) + expect(setSpy).toHaveBeenCalledTimes(26) // succeed storeSpy.mockReturnValueOnce(of(true)) diff --git a/src-ui/src/app/components/admin/settings/settings.component.ts b/src-ui/src/app/components/admin/settings/settings.component.ts index 33f6949a1..57315c86a 100644 --- a/src-ui/src/app/components/admin/settings/settings.component.ts +++ b/src-ui/src/app/components/admin/settings/settings.component.ts @@ -99,6 +99,7 @@ export class SettingsComponent defaultPermsEditUsers: new FormControl(null), defaultPermsEditGroups: new FormControl(null), documentEditingRemoveInboxTags: new FormControl(null), + searchDbOnly: new FormControl(null), notificationsConsumerNewDocument: new FormControl(null), notificationsConsumerSuccess: new FormControl(null), @@ -299,6 +300,7 @@ export class SettingsComponent documentEditingRemoveInboxTags: this.settings.get( SETTINGS_KEYS.DOCUMENT_EDITING_REMOVE_INBOX_TAGS ), + searchDbOnly: this.settings.get(SETTINGS_KEYS.SEARCH_DB_ONLY), savedViews: {}, } } @@ -522,6 +524,10 @@ export class SettingsComponent SETTINGS_KEYS.DOCUMENT_EDITING_REMOVE_INBOX_TAGS, this.settingsForm.value.documentEditingRemoveInboxTags ) + this.settings.set( + SETTINGS_KEYS.SEARCH_DB_ONLY, + this.settingsForm.value.searchDbOnly + ) this.settings.setLanguage(this.settingsForm.value.displayLanguage) this.settings .storeSettings() diff --git a/src-ui/src/app/data/ui-settings.ts b/src-ui/src/app/data/ui-settings.ts index 41f9ba361..6f8f246ff 100644 --- a/src-ui/src/app/data/ui-settings.ts +++ b/src-ui/src/app/data/ui-settings.ts @@ -56,6 +56,7 @@ export const SETTINGS_KEYS = { DEFAULT_PERMS_EDIT_GROUPS: 'general-settings:permissions:default-edit-groups', DOCUMENT_EDITING_REMOVE_INBOX_TAGS: 'general-settings:document-editing:remove-inbox-tags', + SEARCH_DB_ONLY: 'general-settings:search:db-only', } export const SETTINGS: UiSetting[] = [ @@ -219,4 +220,9 @@ export const SETTINGS: UiSetting[] = [ type: 'boolean', default: false, }, + { + key: SETTINGS_KEYS.SEARCH_DB_ONLY, + type: 'boolean', + default: false, + }, ] diff --git a/src-ui/src/app/services/rest/search.service.spec.ts b/src-ui/src/app/services/rest/search.service.spec.ts index 7f42aa7da..346b8a092 100644 --- a/src-ui/src/app/services/rest/search.service.spec.ts +++ b/src-ui/src/app/services/rest/search.service.spec.ts @@ -6,10 +6,13 @@ import { Subscription } from 'rxjs' import { TestBed } from '@angular/core/testing' import { environment } from 'src/environments/environment' import { SearchService } from './search.service' +import { SettingsService } from '../settings.service' +import { SETTINGS_KEYS } from 'src/app/data/ui-settings' let httpTestingController: HttpTestingController let service: SearchService let subscription: Subscription +let settingsService: SettingsService const endpoint = 'search/autocomplete' describe('SearchService', () => { @@ -20,6 +23,7 @@ describe('SearchService', () => { }) httpTestingController = TestBed.inject(HttpTestingController) + settingsService = TestBed.inject(SettingsService) service = TestBed.inject(SearchService) }) @@ -36,4 +40,18 @@ describe('SearchService', () => { ) expect(req.request.method).toEqual('GET') }) + + it('should call correct api endpoint on globalSearch', () => { + const query = 'apple' + service.globalSearch(query).subscribe() + httpTestingController.expectOne( + `${environment.apiBaseUrl}search/?query=${query}` + ) + + settingsService.set(SETTINGS_KEYS.SEARCH_DB_ONLY, true) + subscription = service.globalSearch(query).subscribe() + httpTestingController.expectOne( + `${environment.apiBaseUrl}search/?query=${query}&db_only=true` + ) + }) }) diff --git a/src-ui/src/app/services/rest/search.service.ts b/src-ui/src/app/services/rest/search.service.ts index 3518b55fb..e732002e1 100644 --- a/src-ui/src/app/services/rest/search.service.ts +++ b/src-ui/src/app/services/rest/search.service.ts @@ -13,6 +13,8 @@ import { StoragePath } from 'src/app/data/storage-path' import { Tag } from 'src/app/data/tag' import { User } from 'src/app/data/user' import { Workflow } from 'src/app/data/workflow' +import { SettingsService } from '../settings.service' +import { SETTINGS_KEYS } from 'src/app/data/ui-settings' export interface GlobalSearchResult { total: number @@ -33,7 +35,10 @@ export interface GlobalSearchResult { providedIn: 'root', }) export class SearchService { - constructor(private http: HttpClient) {} + constructor( + private http: HttpClient, + private settingsService: SettingsService + ) {} autocomplete(term: string): Observable { return this.http.get( @@ -43,9 +48,13 @@ export class SearchService { } globalSearch(query: string): Observable { + let params = new HttpParams().set('query', query) + if (this.settingsService.get(SETTINGS_KEYS.SEARCH_DB_ONLY)) { + params = params.set('db_only', true) + } return this.http.get( `${environment.apiBaseUrl}search/`, - { params: new HttpParams().set('query', query) } + { params } ) } } diff --git a/src/documents/views.py b/src/documents/views.py index 7d5f677c9..09354b542 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -1110,6 +1110,8 @@ class GlobalSearchView(PassUserMixin): elif len(query) < 3: return HttpResponseBadRequest("Query must be at least 3 characters") + db_only = request.query_params.get("db_only", False) + OBJECT_LIMIT = 3 docs = [] if request.user.has_perm("documents.view_document"): @@ -1120,7 +1122,7 @@ class GlobalSearchView(PassUserMixin): ) # First search by title docs = all_docs.filter(title__icontains=query)[:OBJECT_LIMIT] - if len(docs) < OBJECT_LIMIT: + if not db_only and len(docs) < OBJECT_LIMIT: # If we don't have enough results, search by content from documents import index