Files
Todo/components/GlobalSearch.tsx
Paul Bailey 0143097e69 feat: Add search and filter UI components
- Created SearchBar component with debounced input
- Built FilterPanel component with controls for priority, completion, tags, and due date
- Added sort controls (field and direction)
- Implemented filter clear functionality
- Display search results with highlighted text
- Added GlobalSearch component for home page
- Integrated search and filter into list detail view
- Added CSS styles for search highlighting

Requirements: 6.1, 6.2, 6.3, 6.4, 8.1, 8.2, 8.3
2025-12-01 19:25:09 +00:00

72 lines
1.5 KiB
TypeScript

'use client'
import { useState, useCallback } from 'react'
import SearchBar from './SearchBar'
import SearchResults from './SearchResults'
import { searchItems } from '@/lib/actions'
interface ItemWithList {
id: string
title: string
description: string | null
completed: boolean
priority: string
dueDate: Date | null
tags: any
notes: string | null
list: {
id: string
title: string
color: string
}
}
export default function GlobalSearch() {
const [searchQuery, setSearchQuery] = useState('')
const [searchResults, setSearchResults] = useState<ItemWithList[]>([])
const [isSearching, setIsSearching] = useState(false)
const handleSearch = useCallback(async (query: string) => {
setSearchQuery(query)
if (!query.trim()) {
setSearchResults([])
setIsSearching(false)
return
}
setIsSearching(true)
try {
const results = await searchItems(query)
setSearchResults(results as ItemWithList[])
} catch (error) {
console.error('Search error:', error)
setSearchResults([])
} finally {
setIsSearching(false)
}
}, [])
const handleClose = useCallback(() => {
setSearchQuery('')
setSearchResults([])
}, [])
return (
<div className="space-y-4">
<SearchBar
onSearch={handleSearch}
placeholder="Search all tasks..."
/>
{searchQuery.trim() && (
<SearchResults
results={searchResults}
query={searchQuery}
onClose={handleClose}
/>
)}
</div>
)
}