import { FC, useEffect, useState, ChangeEvent } from 'react'; import { Filter, CloseCircle } from 'iconsax-react'; import DatePicker from './DatePicker'; import Input from './Input'; import Select, { ItemsSelectType } from './Select'; // تعریف نوع داده برای فیلدهای مختلف export type DateFieldType = { type: 'date'; name: string; placeholder: string; defaultValue?: string; }; export type SelectFieldType = { type: 'select'; name: string; placeholder: string; options: ItemsSelectType[]; defaultValue?: string; }; export type InputFieldType = { type: 'input'; name: string; placeholder: string; defaultValue?: string; }; export type FieldType = DateFieldType | SelectFieldType | InputFieldType; // تعریف نوع داده برای مقادیر فیلترها export type FilterValues = Record; interface FiltersProps { fields: FieldType[]; onChange: (filters: FilterValues) => void; initialValues?: FilterValues; className?: string; fieldClassName?: string; searchField?: string; // نام فیلد جستجو که باید در انتها نمایش داده شود } const Filters: FC = ({ fields, onChange, initialValues = {}, className = "mt-6 md:mt-8 xl:mt-10 flex flex-col md:flex-row justify-between items-start md:items-center gap-4", fieldClassName = "flex flex-col sm:flex-row gap-3 md:gap-4 w-full md:w-auto", searchField = "search" // پیش‌فرض فیلد سرچ با نام search }) => { const [filters, setFilters] = useState({}); const [isFiltersOpen, setIsFiltersOpen] = useState(false); // تنظیم مقادیر اولیه useEffect(() => { if (Object.keys(initialValues).length > 0) { setFilters(initialValues); } else { // تنظیم مقادیر پیش‌فرض از فیلدها const defaultValues: FilterValues = {}; fields.forEach(field => { if ('defaultValue' in field && field.defaultValue !== undefined) { defaultValues[field.name] = field.defaultValue; } }); if (Object.keys(defaultValues).length > 0) { setFilters(defaultValues); onChange(defaultValues); } } }, [fields, initialValues, onChange]); const handleChange = (name: string, value: string | null) => { const newFilters = { ...filters, [name]: value }; setFilters(newFilters); onChange(newFilters); }; const handleInputChange = (name: string, event: ChangeEvent) => { handleChange(name, event.target.value); }; const renderField = (field: FieldType) => { const currentValue = filters[field.name]; switch (field.type) { case 'date': return ( handleChange(field.name, value)} defaultValue={currentValue || field.defaultValue || ''} /> ); case 'select': return ( handleInputChange(field.name, e)} /> ); } }; // جداسازی فیلد جستجو از سایر فیلدها const searchFieldObj = fields.find(field => field.name === searchField); const otherFields = fields.filter(field => field.name !== searchField); return (
{/* آیکون فیلتر برای موبایل */}
{searchFieldObj && (
{renderField(searchFieldObj)}
)}
{/* فیلترها برای دسکتاپ (همیشه نمایش داده می‌شوند) */}
{otherFields.map(renderField)}
{searchFieldObj && (
{renderField(searchFieldObj)}
)}
{/* فیلترها برای موبایل (قابل باز و بسته شدن) */} {isFiltersOpen && (
فیلتر کردن نتایج
{otherFields.map(field => (
{renderField(field)}
))}
)}
); }; export default Filters;