'use client' import { useState } from 'react' import { Filter, X, ChevronDown, ChevronUp } from 'lucide-react' export interface FilterState { priority: 'low' | 'medium' | 'high' | null completed: boolean | null tags: string[] dueDateRange: { start: Date | null; end: Date | null } sortBy: 'createdAt' | 'dueDate' | 'priority' | 'title' sortOrder: 'asc' | 'desc' } interface FilterPanelProps { filters: FilterState onFiltersChange: (filters: FilterState) => void availableTags?: string[] showListScope?: boolean } export default function FilterPanel({ filters, onFiltersChange, availableTags = [], showListScope = false }: FilterPanelProps) { const [isExpanded, setIsExpanded] = useState(false) const hasActiveFilters = filters.priority !== null || filters.completed !== null || filters.tags.length > 0 || filters.dueDateRange.start !== null || filters.dueDateRange.end !== null const handlePriorityChange = (priority: 'low' | 'medium' | 'high' | null) => { onFiltersChange({ ...filters, priority }) } const handleCompletedChange = (completed: boolean | null) => { onFiltersChange({ ...filters, completed }) } const handleTagToggle = (tag: string) => { const newTags = filters.tags.includes(tag) ? filters.tags.filter(t => t !== tag) : [...filters.tags, tag] onFiltersChange({ ...filters, tags: newTags }) } const handleDueDateStartChange = (date: string) => { const start = date ? new Date(date) : null onFiltersChange({ ...filters, dueDateRange: { ...filters.dueDateRange, start } }) } const handleDueDateEndChange = (date: string) => { const end = date ? new Date(date) : null onFiltersChange({ ...filters, dueDateRange: { ...filters.dueDateRange, end } }) } const handleSortByChange = (sortBy: FilterState['sortBy']) => { onFiltersChange({ ...filters, sortBy }) } const handleSortOrderToggle = () => { onFiltersChange({ ...filters, sortOrder: filters.sortOrder === 'asc' ? 'desc' : 'asc' }) } const handleClearFilters = () => { onFiltersChange({ priority: null, completed: null, tags: [], dueDateRange: { start: null, end: null }, sortBy: 'createdAt', sortOrder: 'desc' }) } return (
{/* Header */} {/* Filter Controls */} {isExpanded && (
{/* Sort Controls */}
{/* Priority Filter */}
{/* Completion Status Filter */}
{/* Tags Filter */} {availableTags.length > 0 && (
{availableTags.map((tag) => ( ))}
)} {/* Due Date Range Filter */}
handleDueDateStartChange(e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500" />
handleDueDateEndChange(e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500" />
{/* Clear Filters Button */} {hasActiveFilters && ( )}
)}
) }