From efb44b89136b6111b2af64c1bc19870718ed14ca Mon Sep 17 00:00:00 2001 From: DawidKrynski Date: Fri, 25 Sep 2026 18:34:01 +0200 Subject: [PATCH] fix(web): remember selected search type (#31799) --- .../search-bar/SearchTextSection.svelte | 2 +- .../managers/search-manager.svelte.spec.ts | 35 +++++++++++++++++++ web/src/lib/managers/search-manager.svelte.ts | 9 ++++- 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 web/src/lib/managers/search-manager.svelte.spec.ts diff --git a/web/src/lib/components/shared-components/search-bar/SearchTextSection.svelte b/web/src/lib/components/shared-components/search-bar/SearchTextSection.svelte index 928e68efc..22c87d9a3 100644 --- a/web/src/lib/components/shared-components/search-bar/SearchTextSection.svelte +++ b/web/src/lib/components/shared-components/search-bar/SearchTextSection.svelte @@ -9,7 +9,7 @@ let queryType = $derived(searchManager.filter.queryType); const setType = (type: 'smart' | 'metadata' | 'description' | 'fullPath' | 'ocr') => { - searchManager.filter.queryType = type; + searchManager.setQueryType(type); }; diff --git a/web/src/lib/managers/search-manager.svelte.spec.ts b/web/src/lib/managers/search-manager.svelte.spec.ts new file mode 100644 index 000000000..565d70e13 --- /dev/null +++ b/web/src/lib/managers/search-manager.svelte.spec.ts @@ -0,0 +1,35 @@ +import { searchManager } from '$lib/managers/search-manager.svelte'; + +describe('SearchManager', () => { + beforeEach(() => { + localStorage.clear(); + searchManager.reset(); + }); + + it('defaults to smart search', () => { + expect(searchManager.filter.queryType).toBe('smart'); + }); + + it('remembers the selected query type', () => { + searchManager.setQueryType('metadata'); + expect(searchManager.filter.queryType).toBe('metadata'); + + searchManager.reset(); + expect(searchManager.filter.queryType).toBe('metadata'); + }); + + it('overrides a previously stored query type', () => { + localStorage.setItem('searchQueryType', 'metadata'); + searchManager.reset(); + + searchManager.setQueryType('smart'); + searchManager.reset(); + expect(searchManager.filter.queryType).toBe('smart'); + }); + + it('ignores an invalid stored query type', () => { + localStorage.setItem('searchQueryType', 'invalid'); + searchManager.reset(); + expect(searchManager.filter.queryType).toBe('smart'); + }); +}); diff --git a/web/src/lib/managers/search-manager.svelte.ts b/web/src/lib/managers/search-manager.svelte.ts index d6949fb82..32cd379fd 100644 --- a/web/src/lib/managers/search-manager.svelte.ts +++ b/web/src/lib/managers/search-manager.svelte.ts @@ -7,6 +7,8 @@ import { Route } from '$lib/route'; import type { SearchFilter } from '$lib/types'; import { asLocalTimeISO, parseUtcDate } from '$lib/utils/date-time'; +const QUERY_TYPE_STORAGE_KEY = 'searchQueryType'; + class SearchManager { #filter = $state(this.#fromQuery({})); @@ -22,6 +24,11 @@ class SearchManager { this.#filter = this.#fromQuery(query); } + setQueryType(queryType: SearchFilter['queryType']) { + this.#filter.queryType = queryType; + localStorage.setItem(QUERY_TYPE_STORAGE_KEY, queryType); + } + async submit() { await goto(Route.search(this.#toQuery())); } @@ -143,7 +150,7 @@ class SearchManager { } #defaultQueryType(): QueryType { - const storedQueryType = localStorage.getItem('searchQueryType') as QueryType; + const storedQueryType = localStorage.getItem(QUERY_TYPE_STORAGE_KEY) as QueryType; return validQueryTypes.has(storedQueryType) ? storedQueryType : QueryType.SMART; } }