From 499c86b6808fe2c6039256874412c9740c3035d8 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Wed, 25 Mar 2026 08:51:16 +0100 Subject: [PATCH] feat: add onQueryChange prop and serverFiltered flag to CommandPalette Enables server-side exchange search from the command palette. Server-filtered results skip client-side text matching since they matched on content not visible in title/meta. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../composites/CommandPalette/CommandPalette.tsx | 6 ++++-- src/design-system/composites/CommandPalette/types.ts | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/design-system/composites/CommandPalette/CommandPalette.tsx b/src/design-system/composites/CommandPalette/CommandPalette.tsx index 77cc96a..69921a3 100644 --- a/src/design-system/composites/CommandPalette/CommandPalette.tsx +++ b/src/design-system/composites/CommandPalette/CommandPalette.tsx @@ -12,6 +12,7 @@ interface CommandPaletteProps { onSelect: (result: SearchResult) => void data: SearchResult[] onOpen?: () => void + onQueryChange?: (query: string) => void } const CATEGORY_LABELS: Record = { @@ -60,7 +61,7 @@ function highlightText(text: string, query: string, matchRanges?: [number, numbe return <>{parts} } -export function CommandPalette({ open, onClose, onSelect, data, onOpen }: CommandPaletteProps) { +export function CommandPalette({ open, onClose, onSelect, data, onOpen, onQueryChange }: CommandPaletteProps) { const [query, setQuery] = useState('') const [activeCategory, setActiveCategory] = useState('all') const [scopeFilters, setScopeFilters] = useState([]) @@ -102,7 +103,7 @@ export function CommandPalette({ open, onClose, onSelect, data, onOpen }: Comman if (query.trim()) { const q = query.toLowerCase() results = results.filter( - (r) => r.title.toLowerCase().includes(q) || r.meta.toLowerCase().includes(q), + (r) => r.serverFiltered || r.title.toLowerCase().includes(q) || r.meta.toLowerCase().includes(q), ) } @@ -208,6 +209,7 @@ export function CommandPalette({ open, onClose, onSelect, data, onOpen }: Comman onChange={(e) => { setQuery(e.target.value) setFocusedIdx(0) + onQueryChange?.(e.target.value) }} aria-label="Search" /> diff --git a/src/design-system/composites/CommandPalette/types.ts b/src/design-system/composites/CommandPalette/types.ts index 6b86343..bd0c623 100644 --- a/src/design-system/composites/CommandPalette/types.ts +++ b/src/design-system/composites/CommandPalette/types.ts @@ -13,6 +13,8 @@ export interface SearchResult { path?: string expandedContent?: string matchRanges?: [number, number][] + /** Skip client-side query filtering (result already matched server-side) */ + serverFiltered?: boolean } export interface ScopeFilter {