From 0d7c572f2c73228c6bfbb5e30e73247e81db19cb Mon Sep 17 00:00:00 2001 From: mkelvers Date: Sat, 13 Jun 2026 22:29:26 +0200 Subject: [PATCH] feat: add search/actions.ts --- static/search/actions.ts | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 static/search/actions.ts diff --git a/static/search/actions.ts b/static/search/actions.ts new file mode 100644 index 0000000..220b3b6 --- /dev/null +++ b/static/search/actions.ts @@ -0,0 +1,52 @@ +import { state, searchInput, searchDialog } from "./state"; +import { setSearchState, setClearButtonState, clearResults } from "./render"; +import { cancelScheduledFetch, fetchSearchItems } from "./fetch"; + +export const openSearch = (): void => { + if (!searchInput) { + window.location.href = "/search"; + return; + } + + state.lastFocusedSearchOpener = + document.activeElement instanceof HTMLElement ? document.activeElement : null; + if (searchDialog) { + setSearchState(true); + searchInput.value = ""; + state.lastQuery = ""; + cancelScheduledFetch(); + setClearButtonState(false); + clearResults(); + } + searchInput.focus(); +}; + +export const closeSearch = (): void => { + if (!searchDialog || !searchInput) { + return; + } + + setSearchState(false); + cancelScheduledFetch(); + if (state.activeRequestController) { + state.activeRequestController.abort(); + state.activeRequestController = undefined; + } + searchInput.value = ""; + state.lastQuery = ""; + setClearButtonState(false); + clearResults(); + state.lastFocusedSearchOpener?.focus(); +}; + +export const clearSearchInput = (): void => { + if (!searchInput) { + return; + } + + searchInput.value = ""; + searchInput.focus(); + cancelScheduledFetch(); + setClearButtonState(false); + fetchSearchItems(""); +};