cleaning up search override functionality

This commit is contained in:
Cole Goldsmith 2025-10-03 17:18:38 -05:00
parent 7339dfef9c
commit dd5db8acc1
4 changed files with 42 additions and 4 deletions

View file

@ -50,6 +50,7 @@ export const filterAccentClasses: Record<FilterColor, string> = {
export function KnowledgeFilterPanel() { export function KnowledgeFilterPanel() {
const { const {
queryOverride,
selectedFilter, selectedFilter,
parsedFilterData, parsedFilterData,
setSelectedFilter, setSelectedFilter,
@ -320,6 +321,7 @@ export function KnowledgeFilterPanel() {
className="font-mono placeholder:font-mono" className="font-mono placeholder:font-mono"
onChange={(e) => setQuery(e.target.value)} onChange={(e) => setQuery(e.target.value)}
rows={2} rows={2}
disabled={!!queryOverride}
/> />
</div> </div>

View file

@ -2,12 +2,13 @@
import { themeQuartz, type ColDef } from "ag-grid-community"; import { themeQuartz, type ColDef } from "ag-grid-community";
import { AgGridReact, type CustomCellRendererProps } from "ag-grid-react"; import { AgGridReact, type CustomCellRendererProps } from "ag-grid-react";
import { Cloud, FileIcon, Search, X } from "lucide-react"; import { ArrowRight, Cloud, FileIcon, Search, X } from "lucide-react";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { import {
type ChangeEvent, type ChangeEvent,
FormEvent, FormEvent,
useCallback, useCallback,
useEffect,
useRef, useRef,
useState, useState,
} from "react"; } from "react";
@ -28,6 +29,7 @@ import { filterAccentClasses } from "@/components/knowledge-filter-panel";
import GoogleDriveIcon from "../settings/icons/google-drive-icon"; import GoogleDriveIcon from "../settings/icons/google-drive-icon";
import OneDriveIcon from "../settings/icons/one-drive-icon"; import OneDriveIcon from "../settings/icons/one-drive-icon";
import SharePointIcon from "../settings/icons/share-point-icon"; import SharePointIcon from "../settings/icons/share-point-icon";
import { cn } from "@/lib/utils";
// Function to get the appropriate icon for a connector type // Function to get the appropriate icon for a connector type
function getSourceIcon(connectorType?: string) { function getSourceIcon(connectorType?: string) {
@ -244,6 +246,11 @@ function SearchPage() {
} }
}; };
// Reset the query text when the selected filter changes
useEffect(() => {
setSearchQueryInput(queryOverride);
}, [queryOverride]);
return ( return (
<> <>
<div className="flex flex-col h-full"> <div className="flex flex-col h-full">
@ -257,7 +264,7 @@ function SearchPage() {
className="flex flex-1 gap-3 max-w-full" className="flex flex-1 gap-3 max-w-full"
onSubmit={handleSearch} onSubmit={handleSearch}
> >
<div className="primary-input min-h-10 !flex items-center flex-nowrap focus-within:border-foreground transition-colors !p-[0.3rem] max-w-[min(640px,100%)] min-w-[100px]"> <div className="primary-input group/input min-h-10 !flex items-center flex-nowrap focus-within:border-foreground transition-colors !p-[0.3rem] max-w-[min(640px,100%)] min-w-[100px]">
{selectedFilter?.name && ( {selectedFilter?.name && (
<div <div
title={selectedFilter?.name} title={selectedFilter?.name}
@ -288,6 +295,29 @@ function SearchPage() {
setSearchQueryInput(e.target.value) setSearchQueryInput(e.target.value)
} }
/> />
{queryOverride && (
<Button
variant="ghost"
className="h-full !px-1.5 !py-0"
type="button"
onClick={() => {
setSearchQueryInput("");
setQueryOverride("");
}}
>
<X className="h-4 w-4" />
</Button>
)}
<Button
variant="ghost"
className={cn(
"h-full !px-1.5 !py-0 hidden group-focus-within/input:block",
searchQueryInput && "block"
)}
type="submit"
>
<ArrowRight className="h-4 w-4" />
</Button>
</div> </div>
{/* <Button {/* <Button
type="submit" type="submit"

View file

@ -126,7 +126,7 @@ export function LayoutWrapper({ children }: { children: React.ReactNode }) {
</header> </header>
<div <div
className={cn( className={cn(
"app-grid-cols-arrangement group", "app-grid-cols-arrangement",
isPanelOpen && isOnKnowledgePage && !isMenuOpen && "filters-open", isPanelOpen && isOnKnowledgePage && !isMenuOpen && "filters-open",
isMenuOpen && "notifications-open" isMenuOpen && "notifications-open"
)} )}

View file

@ -5,6 +5,7 @@ import React, {
createContext, createContext,
type ReactNode, type ReactNode,
useContext, useContext,
useEffect,
useState, useState,
} from "react"; } from "react";
@ -75,7 +76,7 @@ export function KnowledgeFilterProvider({
useState<ParsedQueryData | null>(null); useState<ParsedQueryData | null>(null);
const [isPanelOpen, setIsPanelOpen] = useState(false); const [isPanelOpen, setIsPanelOpen] = useState(false);
const [createMode, setCreateMode] = useState(false); const [createMode, setCreateMode] = useState(false);
const [queryOverride, setQueryOverride] = useState(''); const [queryOverride, setQueryOverride] = useState("");
const setSelectedFilter = (filter: KnowledgeFilter | null) => { const setSelectedFilter = (filter: KnowledgeFilter | null) => {
setSelectedFilterState(filter); setSelectedFilterState(filter);
@ -139,6 +140,11 @@ export function KnowledgeFilterProvider({
setCreateMode(false); setCreateMode(false);
}; };
// Clear the search override when we change filters
useEffect(() => {
setQueryOverride("");
}, [selectedFilter]);
const value: KnowledgeFilterContextType = { const value: KnowledgeFilterContextType = {
selectedFilter, selectedFilter,
parsedFilterData, parsedFilterData,