/** * Панель фильтров и сортировки */ 'use client'; import { useState } from 'react'; import { useUrlParams } from '@/hooks/useUrlParams'; export interface FilterOption { value: string; label: string; } export interface SortOption { value: string; label: string; } interface FilterPanelProps { filters?: { status?: FilterOption[]; organization?: FilterOption[]; type?: FilterOption[]; }; sortOptions?: SortOption[]; onFilterChange?: (filters: any) => void; onSortChange?: (sortBy: string, sortOrder: 'asc' | 'desc') => void; presets?: Array<{ name: string; filters: any }>; } export default function FilterPanel({ filters, sortOptions, onFilterChange, onSortChange, presets, }: FilterPanelProps) { const { params, setFilters, setSort, clearFilters } = useUrlParams(); const [isExpanded, setIsExpanded] = useState(false); const handleFilterChange = (key: string, value: string | string[]) => { const newFilters = { ...params, [key]: value }; setFilters(newFilters); onFilterChange?.(newFilters); }; const handleSortChange = (sortBy: string) => { const newSortOrder = params.sortBy === sortBy && params.sortOrder === 'asc' ? 'desc' : 'asc'; setSort(sortBy, newSortOrder); onSortChange?.(sortBy, newSortOrder); }; const handlePresetClick = (preset: { name: string; filters: any }) => { setFilters(preset.filters); onFilterChange?.(preset.filters); }; const hasActiveFilters = params.status || params.organization || params.type || params.dateFrom || params.dateTo; return (
{hasActiveFilters && ( )}
{sortOptions && sortOptions.length > 0 && (
{params.sortBy && ( )}
)}
{isExpanded && (
{/* Быстрые фильтры (presets) */} {presets && presets.length > 0 && (
{presets.map((preset, index) => ( ))}
)} {/* Фильтр по статусу */} {filters?.status && filters.status.length > 0 && (
)} {/* Фильтр по организации */} {filters?.organization && filters.organization.length > 0 && (
)} {/* Фильтр по типу */} {filters?.type && filters.type.length > 0 && (
)} {/* Фильтр по дате */}
handleFilterChange('dateFrom', e.target.value)} style={{ width: '100%', padding: '8px', border: '1px solid #ddd', borderRadius: '4px', fontSize: '14px', }} />
handleFilterChange('dateTo', e.target.value)} style={{ width: '100%', padding: '8px', border: '1px solid #ddd', borderRadius: '4px', fontSize: '14px', }} />
)}
); }