From f96e5cd047c93105296a0e14f661df8ad1ac4d20 Mon Sep 17 00:00:00 2001 From: sabaimran Date: Tue, 21 Jan 2025 08:30:40 -0800 Subject: [PATCH] Allow file filter dropdown to pop up automatically when typing "file:" --- src/interface/web/app/search/page.tsx | 70 +++++++++++++++++++++------ 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/src/interface/web/app/search/page.tsx b/src/interface/web/app/search/page.tsx index 8a5d9268..6bb49cb4 100644 --- a/src/interface/web/app/search/page.tsx +++ b/src/interface/web/app/search/page.tsx @@ -149,7 +149,7 @@ function FileCard({ {file.file_name.split("/").pop()} - +
@@ -166,8 +166,8 @@ function FileCard({
- -

+ +

{!selectedFileFullText && ( void; isMobileWidth: boolean; - explicitFile?: string; + inputText?: string; + onClose: () => void; } function FileFilterComboBox(props: FileFilterComboBoxProps) { const [open, setOpen] = useState(false); - const [value, setValue] = useState(props.explicitFile || ""); + const [value, setValue] = useState(props.inputText || ""); + const [noMatchingFiles, setNoMatchingFiles] = useState(false); + const [inputText, setInputText] = useState(""); useEffect(() => { - if (props.explicitFile) { - setValue(props.explicitFile); + if (props.inputText) { + if (props.inputText === "INITIALIZE") { + setOpen(true); + setInputText(""); + } else { + setInputText(props.inputText); + if (props.allFiles.includes(props.inputText)) { + setValue(props.inputText); + } + } + } else { + setInputText(""); } - }, [props.explicitFile]); + }, [props.inputText]); + + useEffect(() => { + if (inputText && !props.allFiles.includes(inputText)) { + setNoMatchingFiles(true); + setValue(""); + } else if (!inputText) { + setNoMatchingFiles(false); + setValue(""); + } else { + setNoMatchingFiles(false); + setValue(inputText); + } + }, [inputText, props.allFiles]); + + useEffect(() => { + if (!open) { + props.onClose(); + } + }, [open]); return ( - + - + setInputText(e.currentTarget.value)} /> No files found. @@ -578,8 +610,11 @@ export default function Search() { if (extractedFileFilterValue) { setSelectedFileFilter(extractedFileFilterValue); + } else { + setSelectedFileFilter("INITIALIZE"); } } + }, [searchQuery]); function handleSearchInputChange(value: string) { @@ -604,8 +639,12 @@ export default function Search() { } function applySuggestion(suggestion: string) { - // Append the file: filter with the selected suggestion - const newQuery = `file:"${suggestion}" ${searchQuery}`; + // Scrub any existing `file:` filter + const fileFilterRegex = /file:([^"\s]*|"[^"]*")?/i; + const searchQueryWithoutFileFilter = searchQuery.replace(fileFilterRegex, "").trim(); + + // Prepend the file: filter with the selected suggestion + const newQuery = `file:"${suggestion}" ${searchQueryWithoutFileFilter}`; setSearchQuery(newQuery); searchInputRef.current?.focus(); search(); @@ -771,7 +810,8 @@ export default function Search() { allFiles={allFiles} onChooseFile={(file) => applySuggestion(file)} isMobileWidth={isMobileWidth} - explicitFile={selectedFileFilter} + inputText={selectedFileFilter} + onClose={() => searchInputRef.current?.focus()} />