'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 */}
{/* Clear Filters Button */}
{hasActiveFilters && (
)}
)}
)
}