@shefing/quickfilter 1.0.11 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +859 -0
  2. package/dist/FilterField.d.ts.map +1 -1
  3. package/dist/FilterField.js +18 -9
  4. package/dist/FilterField.js.map +1 -1
  5. package/dist/QuickFilter.d.ts.map +1 -1
  6. package/dist/QuickFilter.js +227 -55
  7. package/dist/QuickFilter.js.map +1 -1
  8. package/dist/filters/components/checkbox-filter.d.ts +2 -1
  9. package/dist/filters/components/checkbox-filter.d.ts.map +1 -1
  10. package/dist/filters/components/checkbox-filter.js +9 -7
  11. package/dist/filters/components/checkbox-filter.js.map +1 -1
  12. package/dist/filters/components/date-filter.d.ts +2 -1
  13. package/dist/filters/components/date-filter.d.ts.map +1 -1
  14. package/dist/filters/components/date-filter.js +26 -24
  15. package/dist/filters/components/date-filter.js.map +1 -1
  16. package/dist/filters/components/select-filter.d.ts +2 -1
  17. package/dist/filters/components/select-filter.d.ts.map +1 -1
  18. package/dist/filters/components/select-filter.js +20 -18
  19. package/dist/filters/components/select-filter.js.map +1 -1
  20. package/dist/filters/components/small-select-filter.d.ts +2 -1
  21. package/dist/filters/components/small-select-filter.d.ts.map +1 -1
  22. package/dist/filters/components/small-select-filter.js +4 -3
  23. package/dist/filters/components/small-select-filter.js.map +1 -1
  24. package/dist/filters/constants/date-filter-options.d.ts +7 -4
  25. package/dist/filters/constants/date-filter-options.d.ts.map +1 -1
  26. package/dist/filters/constants/date-filter-options.js +25 -70
  27. package/dist/filters/constants/date-filter-options.js.map +1 -1
  28. package/dist/filters/types/filters-type.d.ts.map +1 -1
  29. package/dist/filters/types/filters-type.js.map +1 -1
  30. package/dist/filters/utils/date-helpers.d.ts +4 -3
  31. package/dist/filters/utils/date-helpers.d.ts.map +1 -1
  32. package/dist/filters/utils/date-helpers.js +14 -11
  33. package/dist/filters/utils/date-helpers.js.map +1 -1
  34. package/dist/filters/utils/layout-helpers.d.ts.map +1 -1
  35. package/dist/filters/utils/layout-helpers.js.map +1 -1
  36. package/dist/index.d.ts +6 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/labels.d.ts +326 -0
  40. package/dist/labels.d.ts.map +1 -0
  41. package/dist/labels.js +192 -0
  42. package/dist/labels.js.map +1 -0
  43. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/QuickFilter.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useConfig, useListQuery, useTranslation } from '@payloadcms/ui';\nimport type { ClientField, FieldAffectingData, OptionObject, SelectField } from 'payload';\nimport { getTranslation } from '@payloadcms/translations';\nimport FilterField from './FilterField';\nimport type {\n CheckboxFilterState,\n DateFilterValue,\n FilterDetaild,\n FilterRow,\n SelectFilterValue,\n} from './filters/types/filters-type';\nimport { groupFiltersByRow, parseColumns } from './filters/utils/layout-helpers';\nimport { ChevronDown, ChevronUp, Filter, X } from 'lucide-react';\n\nimport {\n futureDateFilterOptions,\n pastDateFilterOptions,\n} from './filters/constants/date-filter-options';\nimport { getDateRangeForOption } from './filters/utils/date-helpers';\nimport { Button } from './ui/button';\n\n// Recursive function to find fields by name\nfunction findFieldsByName(fields: ClientField[], fieldNames: string[]): ClientField[] {\n const results: ClientField[] = [];\n function recursiveSearch(currentFields: ClientField[]) {\n const filteredFields = currentFields.filter(\n (field) => 'name' in field && fieldNames.includes(field.name as string),\n );\n results.push(...filteredFields);\n currentFields.forEach((item) => {\n if (\n (item.type === 'array' || item.type === 'row' || item.type === 'collapsible') &&\n 'fields' in item &&\n Array.isArray(item.fields)\n ) {\n recursiveSearch(item.fields);\n } else if (item.type === 'tabs' && Array.isArray(item.tabs)) {\n item.tabs.forEach((tab) => {\n if ('fields' in tab && Array.isArray(tab.fields)) {\n recursiveSearch(tab.fields);\n }\n });\n } else if (item.type === 'blocks' && Array.isArray(item.blocks)) {\n item.blocks.forEach((block) => {\n if ('fields' in block && Array.isArray(block.fields)) {\n recursiveSearch(block.fields);\n }\n });\n }\n });\n }\n recursiveSearch(fields);\n return results;\n}\n\n// Helper function to convert UI state to a where query\nconst buildWhereClause = (\n values: Record<string, any>,\n fieldDefs: FilterDetaild[],\n isHebrew: boolean,\n): Record<string, any> => {\n const where: Record<string, any> = {};\n Object.entries(values).forEach(([fieldName, value]) => {\n if (!value) return;\n const fieldDef = fieldDefs.find((f) => f.name === fieldName);\n if (!fieldDef) return;\n switch (fieldDef.type) {\n case 'date': {\n const dateValue = value as DateFilterValue;\n let from: Date | undefined;\n let to: Date | undefined;\n\n if (dateValue.predefinedValue) {\n const locale = isHebrew ? 'he' : 'en';\n const range = getDateRangeForOption(dateValue.predefinedValue, locale);\n\n from = range.from;\n to = range.to;\n }\n // Fallback for custom date ranges\n else if (dateValue.customRange) {\n if (dateValue.customRange.from) {\n from = new Date(dateValue.customRange.from);\n }\n if (dateValue.customRange.to) {\n to = new Date(dateValue.customRange.to);\n }\n }\n\n // Construct the query\n if (from || to) {\n const dateQuery: any = {};\n if (from) dateQuery.greater_than_equal = from;\n if (to) dateQuery.less_than_equal = to;\n if (Object.keys(dateQuery).length > 0) {\n where[fieldName] = dateQuery;\n }\n }\n break;\n }\n case 'select': {\n const selectValue = value as SelectFilterValue;\n if (selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n if (selectValue.selectedValues.length === 1) {\n where[fieldName] = { equals: selectValue.selectedValues[0] };\n } else {\n where[fieldName] = { in: selectValue.selectedValues };\n }\n }\n break;\n }\n case 'checkbox': {\n const checkboxState = value as CheckboxFilterState;\n if (checkboxState === 'checked') {\n where[fieldName] = { equals: true };\n } else if (checkboxState === 'unchecked') {\n where[fieldName] = { equals: false };\n }\n // 'indeterminate' will not filter\n break;\n }\n }\n });\n return where;\n};\n\nconst QuickFilter = ({\n slug,\n filterList,\n}: {\n slug: string;\n filterList: (string | { name: string; width: string })[][];\n}) => {\n const localStorageKey = useMemo(() => `direct-filter-${slug}`, [slug]);\n\n const [fields, setFields] = useState<FilterDetaild[]>([]);\n const [filterRows, setFilterRows] = useState<FilterRow[]>([]);\n const [showFilters, setShowFilters] = useState(false);\n const { refineListData, query } = useListQuery();\n const { getEntityConfig } = useConfig();\n const { i18n } = useTranslation();\n\n const [filterValues, setFilterValues] = useState<Record<string, any>>(() => {\n if (typeof window == 'undefined') return {};\n try {\n const item = window.localStorage.getItem(localStorageKey);\n if (!item) {\n return {};\n }\n const dateTimeReviver = (key: string, value: any) => {\n const isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$/;\n if (typeof value === 'string' && isoDateRegex.test(value)) {\n return new Date(value);\n }\n return value;\n };\n return JSON.parse(item, dateTimeReviver);\n } catch (error) {\n console.error('Error reading and parsing filters from localStorage.', error);\n return {};\n }\n });\n\n useEffect(() => {\n const collection = getEntityConfig({ collectionSlug: slug });\n const flattenedFieldConfigs = filterList.flatMap((row, rowIndex) =>\n row.map((field, fieldIndex) => ({\n field,\n rowIndex,\n fieldIndex,\n })),\n );\n const fieldNames = flattenedFieldConfigs.map(({ field }) =>\n typeof field === 'string' ? field : field.name,\n );\n const matchedFields = findFieldsByName(collection?.fields || [], fieldNames);\n const simplifiedFields: FilterDetaild[] = matchedFields.map((field) => {\n const label = (field as FieldAffectingData).label;\n const translatedLabel = getTranslation(label as string, i18n);\n const fieldName = (field as FieldAffectingData).name as string;\n const fieldConfig = flattenedFieldConfigs.find(({ field: f }) =>\n typeof f === 'string' ? f === fieldName : f.name === fieldName,\n );\n return {\n name: fieldName,\n label: translatedLabel as string,\n type: field.type,\n options: (field as SelectField).options as OptionObject[],\n row: fieldConfig ? fieldConfig.rowIndex : 0,\n width:\n typeof fieldConfig?.field === 'object' && 'width' in fieldConfig.field\n ? fieldConfig.field.width\n : undefined,\n };\n });\n const sortedFields = flattenedFieldConfigs\n .map(({ field }) => {\n const fieldName = typeof field === 'string' ? field : field.name;\n return simplifiedFields.find((f) => f.name === fieldName);\n })\n .filter((f): f is FilterDetaild => !!f);\n setFields(sortedFields);\n setFilterRows(groupFiltersByRow(sortedFields));\n }, [slug, filterList, getEntityConfig, i18n]);\n\n useEffect(() => {\n if (fields.length === 0) {\n return;\n }\n const where = buildWhereClause(filterValues, fields, isHebrew);\n try {\n if (Object.keys(filterValues).length > 0) {\n localStorage.setItem(localStorageKey, JSON.stringify(filterValues));\n } else {\n localStorage.removeItem(localStorageKey);\n return;\n }\n } catch (error) {\n console.error('Failed to save filters to localStorage', error);\n }\n\n if (JSON.stringify(where) !== JSON.stringify(query.where)) {\n refineListData({\n columns: parseColumns(query.columns),\n where,\n page: '1',\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterValues, fields, localStorageKey]);\n\n const handleFilterChange = useCallback((fieldName: string, value: any) => {\n setFilterValues((prev) => {\n const newValues = { ...prev };\n if (\n value === undefined ||\n value === null ||\n value === 'indeterminate' ||\n (value && value.type === 'none')\n ) {\n delete newValues[fieldName];\n } else {\n newValues[fieldName] = value;\n }\n return newValues;\n });\n }, []);\n\n // This function remains largely the same.\n const getActiveFiltersDetails = () => {\n const activeFilters: string[] = [];\n const isHebrew = i18n.language === 'he';\n\n Object.entries(filterValues).forEach(([fieldName, value]) => {\n const field = fields.find((f) => f.name === fieldName);\n if (!field) return;\n\n switch (field.type) {\n case 'date':\n if (value !== undefined) {\n const dateValue = value as DateFilterValue;\n let dateDescription = '';\n\n if (dateValue.type === 'predefined' && dateValue.predefinedValue) {\n const allOptions = [...pastDateFilterOptions, ...futureDateFilterOptions];\n const option = allOptions.find((opt) => opt.value === dateValue.predefinedValue);\n dateDescription = option ? option.label : isHebrew ? 'מותאם אישית' : 'Custom';\n } else if (dateValue.type === 'custom' || dateValue.customRange) {\n dateDescription = isHebrew ? 'מותאם אישית' : 'Custom';\n }\n\n if (dateDescription) {\n activeFilters.push(`${field.label} (${dateDescription})`);\n }\n }\n break;\n case 'select': {\n const selectValue = value as SelectFilterValue;\n if (selectValue && selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n const count = selectValue.selectedValues.length;\n const totalOptions = field.options?.length || 0;\n if (selectValue.selectedValues.length === totalOptions) {\n activeFilters.push(`${field.label} (${isHebrew ? 'הכל' : 'All'})`);\n } else {\n activeFilters.push(`${field.label} (${count})`);\n }\n }\n break;\n }\n case 'checkbox':\n if (value !== 'indeterminate') {\n const checkboxValue =\n value === 'checked' ? (isHebrew ? 'כן' : 'Yes') : isHebrew ? 'לא' : 'No';\n activeFilters.push(`${field.label} (${checkboxValue})`);\n }\n break;\n }\n });\n\n return activeFilters;\n };\n\n const clearAllFilters = () => {\n refineListData({\n columns: parseColumns(query.columns),\n where: {},\n page: '1',\n });\n setFilterValues({});\n };\n\n const memoizedFilterRows = useMemo(() => {\n return filterRows.map((row) => (\n <div key={row.rowNumber}>\n <div className='flex flex-wrap gap-6 mb-4'>\n {row.filters.map((field) => (\n <FilterField\n key={field.name}\n field={field}\n onFilterChange={handleFilterChange}\n value={filterValues[field.name]}\n />\n ))}\n </div>\n </div>\n ));\n }, [filterRows, handleFilterChange, filterValues]);\n\n const toggleFilters = () => {\n setShowFilters((prev) => !prev);\n };\n\n const activeFiltersDetails = getActiveFiltersDetails();\n const hasActiveFilters = activeFiltersDetails.length > 0;\n const isHebrew = i18n.language === 'he';\n\n if (!fields.length) return null;\n\n return (\n <div className='filter-container useTw'>\n <div style={{ position: 'relative', top: '-24px', height: '0px' }}>\n <Button\n variant='outline'\n size='sm'\n onClick={toggleFilters}\n className={`flex items-center gap-2 bg-background border-muted-muted hover:bg-muted ${\n hasActiveFilters ? 'w-auto min-w-fit' : ''\n }`}\n >\n <Filter className={`h-4 w-4 ${hasActiveFilters ? 'fill-current' : ''}`} />\n\n {hasActiveFilters ? (\n <>\n <span className='text-sm truncate'>\n <strong>\n {isHebrew\n ? `${activeFiltersDetails.length === 1 ? 'סינון פעיל בעמודה' : 'סינון פעיל בעמודות'}: `\n : `${activeFiltersDetails.length === 1 ? 'Active filter on column' : 'Active filters on columns'}: `}\n </strong>{' '}\n {activeFiltersDetails.join(' • ')}\n </span>\n\n <span\n onClick={(e) => {\n e.stopPropagation();\n clearAllFilters();\n }}\n className='ml-1 p-0.5 hover:bg-muted rounded-sm transition-colors flex-shrink-0'\n >\n <X className='h-3 w-3 text-gray-500' />\n </span>\n </>\n ) : (\n <span className='text-sm truncate'>{isHebrew ? 'סינון מהיר' : 'Quick Filters'}</span>\n )}\n\n {showFilters ? <ChevronUp className='h-4 w-4' /> : <ChevronDown className='h-4 w-4' />}\n </Button>\n </div>\n {showFilters && <div className={'p-4 pb-2 bg-muted'}>{memoizedFilterRows}</div>}\n </div>\n );\n};\n\nexport default QuickFilter;\n"],"names":["useCallback","useEffect","useMemo","useState","useConfig","useListQuery","useTranslation","getTranslation","FilterField","groupFiltersByRow","parseColumns","ChevronDown","ChevronUp","Filter","X","futureDateFilterOptions","pastDateFilterOptions","getDateRangeForOption","Button","findFieldsByName","fields","fieldNames","results","recursiveSearch","currentFields","filteredFields","filter","field","includes","name","push","forEach","item","type","Array","isArray","tabs","tab","blocks","block","buildWhereClause","values","fieldDefs","isHebrew","where","Object","entries","fieldName","value","fieldDef","find","f","dateValue","from","to","predefinedValue","locale","range","customRange","Date","dateQuery","greater_than_equal","less_than_equal","keys","length","selectValue","selectedValues","equals","in","checkboxState","QuickFilter","slug","filterList","localStorageKey","setFields","filterRows","setFilterRows","showFilters","setShowFilters","refineListData","query","getEntityConfig","i18n","filterValues","setFilterValues","window","localStorage","getItem","dateTimeReviver","key","isoDateRegex","test","JSON","parse","error","console","collection","collectionSlug","flattenedFieldConfigs","flatMap","row","rowIndex","map","fieldIndex","matchedFields","simplifiedFields","label","translatedLabel","fieldConfig","options","width","undefined","sortedFields","setItem","stringify","removeItem","columns","page","handleFilterChange","prev","newValues","getActiveFiltersDetails","activeFilters","language","dateDescription","allOptions","option","opt","count","totalOptions","checkboxValue","clearAllFilters","memoizedFilterRows","div","className","filters","onFilterChange","rowNumber","toggleFilters","activeFiltersDetails","hasActiveFilters","style","position","top","height","variant","size","onClick","span","strong","join","e","stopPropagation"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/QuickFilter.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useConfig, useListQuery, useTranslation } from '@payloadcms/ui';\nimport type { ClientField, FieldAffectingData, OptionObject, SelectField } from 'payload';\nimport { getTranslation } from '@payloadcms/translations';\nimport FilterField from './FilterField';\nimport { getLabel, SupportedLocale } from './labels';\nimport type {\n CheckboxFilterState,\n DateFilterValue,\n FilterDetaild,\n FilterRow,\n SelectFilterValue,\n} from './filters/types/filters-type';\nimport { groupFiltersByRow, parseColumns } from './filters/utils/layout-helpers';\nimport { ChevronDown, ChevronUp, Filter, X } from 'lucide-react';\n\nimport { getDateRangeForOption } from './filters/utils/date-helpers';\nimport { isEqual } from 'lodash';\nimport {\n futureOptionKeys,\n getDateFilterOptions,\n pastOptionKeys,\n} from './filters/constants/date-filter-options';\nimport { Button } from './ui/button';\n\n// Recursive function to find fields by name\nfunction findFieldsByName(fields: ClientField[], fieldNames: string[]): ClientField[] {\n const results: ClientField[] = [];\n function recursiveSearch(currentFields: ClientField[]) {\n const filteredFields = currentFields.filter(\n (field) => 'name' in field && fieldNames.includes(field.name as string),\n );\n results.push(...filteredFields);\n currentFields.forEach((item) => {\n if (\n (item.type === 'array' || item.type === 'row' || item.type === 'collapsible') &&\n 'fields' in item &&\n Array.isArray(item.fields)\n ) {\n recursiveSearch(item.fields);\n } else if (item.type === 'tabs' && Array.isArray(item.tabs)) {\n item.tabs.forEach((tab) => {\n if ('fields' in tab && Array.isArray(tab.fields)) {\n recursiveSearch(tab.fields);\n }\n });\n } else if (item.type === 'blocks' && Array.isArray(item.blocks)) {\n item.blocks.forEach((block) => {\n if ('fields' in block && Array.isArray(block.fields)) {\n recursiveSearch(block.fields);\n }\n });\n }\n });\n }\n recursiveSearch(fields);\n return results;\n}\n\n// Builds an array of condition objects from the quick filter values\nconst buildQuickFilterConditions = (\n values: Record<string, any>,\n fieldDefs: FilterDetaild[],\n locale: SupportedLocale,\n): Record<string, any>[] => {\n const conditions: Record<string, any>[] = [];\n\n Object.entries(values).forEach(([fieldName, value]) => {\n if (!value) return;\n const fieldDef = fieldDefs.find((f) => f.name === fieldName);\n if (!fieldDef) return;\n\n let condition: Record<string, any> | null = null;\n\n switch (fieldDef.type) {\n case 'date': {\n const dateValue = value as DateFilterValue;\n let from: Date | undefined;\n let to: Date | undefined;\n\n if (dateValue.predefinedValue) {\n const range = getDateRangeForOption(dateValue.predefinedValue, locale);\n from = range.from;\n to = range.to;\n } else if (dateValue.customRange) {\n if (dateValue.customRange.from) from = new Date(dateValue.customRange.from);\n if (dateValue.customRange.to) to = new Date(dateValue.customRange.to);\n }\n\n if (from || to) {\n const dateQuery: any = {};\n if (from) dateQuery.greater_than_equal = from;\n if (to) dateQuery.less_than_equal = to;\n if (Object.keys(dateQuery).length > 0) {\n condition = { [fieldName]: dateQuery };\n }\n }\n break;\n }\n case 'select': {\n const selectValue = value as SelectFilterValue;\n if (selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n if (selectValue.selectedValues.length === 1) {\n condition = { [fieldName]: { equals: selectValue.selectedValues[0] } };\n } else {\n condition = { [fieldName]: { in: selectValue.selectedValues } };\n }\n }\n break;\n }\n case 'checkbox': {\n const checkboxState = value as CheckboxFilterState;\n if (checkboxState === 'checked') {\n condition = { [fieldName]: { equals: 'true' } };\n } else if (checkboxState === 'unchecked') {\n condition = { [fieldName]: { equals: 'false' } };\n }\n break;\n }\n }\n if (condition) {\n conditions.push(condition);\n }\n });\n return conditions;\n};\n\n// Helper function to remove quick filter conditions from a 'where' clause\nconst cleanWhereClause = (clause: any, fieldsToClean: Set<string>): any => {\n if (!clause || typeof clause !== 'object' || Array.isArray(clause)) {\n return clause;\n }\n\n const newClause: Record<string, any> = {};\n\n for (const key in clause) {\n if (key === 'and' || key === 'or') {\n const cleanedSubClauses = clause[key]\n .map((subClause: any) => cleanWhereClause(subClause, fieldsToClean))\n .filter(Boolean);\n\n if (cleanedSubClauses.length > 0) {\n newClause[key] = cleanedSubClauses;\n }\n } else if (!fieldsToClean.has(key)) {\n newClause[key] = clause[key];\n }\n }\n\n if (Object.keys(newClause).length === 0) {\n return null;\n }\n\n if (newClause.and?.length === 1 && Object.keys(newClause).length === 1) {\n return newClause.and[0];\n }\n if (newClause.or?.length === 1 && Object.keys(newClause).length === 1) {\n return newClause.or[0];\n }\n\n return newClause;\n};\n\n// Translates URL query conditions to the quick filter's internal state\nconst parseWhereClauseToFilterValues = (\n where: any,\n fields: FilterDetaild[],\n locale: SupportedLocale,\n): Record<string, any> => {\n const values: Record<string, any> = {};\n const fieldNames = new Set(fields.map((f) => f.name));\n\n const recursiveParse = (clause: any) => {\n if (!clause || typeof clause !== 'object') return;\n\n if (clause.and) {\n clause.and.forEach(recursiveParse);\n return;\n }\n if (clause.or) {\n clause.or.forEach(recursiveParse);\n return;\n }\n\n for (const fieldName in clause) {\n if (fieldNames.has(fieldName)) {\n const fieldDef = fields.find((f) => f.name === fieldName);\n const condition = clause[fieldName];\n\n if (fieldDef && condition && typeof condition === 'object') {\n if ('equals' in condition) {\n if (fieldDef.type === 'checkbox') {\n values[fieldName] = condition.equals == 'true' ? 'checked' : 'unchecked';\n } else if (fieldDef.type === 'select') {\n values[fieldName] = { selectedValues: [condition.equals] };\n }\n } else if ('in' in condition && Array.isArray(condition.in)) {\n if (fieldDef.type === 'select') {\n values[fieldName] = { selectedValues: condition.in };\n }\n } else if ('greater_than_equal' in condition || 'less_than_equal' in condition) {\n if (fieldDef.type === 'date') {\n const fromDate = condition.greater_than_equal\n ? new Date(condition.greater_than_equal)\n : null;\n const toDate = condition.less_than_equal ? new Date(condition.less_than_equal) : null;\n const allDateOptions = [...pastOptionKeys, ...futureOptionKeys];\n let matchedOption = null;\n\n for (const option of allDateOptions) {\n const range = getDateRangeForOption(option, locale);\n let isFromMatch;\n if (fromDate) {\n isFromMatch = range.from?.toDateString() === fromDate.toDateString();\n } else if (fromDate == null && range.to == undefined) {\n // all future: fromDate == null & range.to == undefined\n isFromMatch = true;\n }\n let isToMatch;\n if (toDate) {\n isToMatch = range.to?.toDateString() === toDate.toDateString();\n } else if (toDate == null && range.to == undefined) {\n // all future: fromDate == null & range.to == undefined\n isToMatch = true;\n }\n\n if (isFromMatch && isToMatch) {\n matchedOption = option;\n break;\n }\n }\n\n if (matchedOption) {\n values[fieldName] = {\n type: 'predefined',\n predefinedValue: matchedOption,\n };\n } else {\n values[fieldName] = {\n type: 'custom',\n customRange: {\n from: fromDate,\n to: toDate,\n },\n };\n }\n }\n }\n }\n }\n }\n };\n\n recursiveParse(where);\n return values;\n};\n\nconst QuickFilter = ({\n slug,\n filterList,\n}: {\n slug: string;\n filterList: (string | { name: string; width: string })[][];\n}) => {\n const localStorageKey = useMemo(() => `direct-filter-${slug}`, [slug]);\n\n const [fields, setFields] = useState<FilterDetaild[]>([]);\n const [filterRows, setFilterRows] = useState<FilterRow[]>([]);\n const [showFilters, setShowFilters] = useState(false);\n const { refineListData, query } = useListQuery();\n const { getEntityConfig } = useConfig();\n const { i18n } = useTranslation();\n const locale = i18n.language as SupportedLocale;\n const isSyncingFromQuery = useRef(false);\n\n const [filterValues, setFilterValues] = useState<Record<string, any>>(() => {\n if (typeof window == 'undefined') return {};\n try {\n const item = window.localStorage.getItem(localStorageKey);\n if (!item) return {};\n const dateTimeReviver = (key: string, value: any) => {\n const isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$/;\n if (typeof value === 'string' && isoDateRegex.test(value)) {\n return new Date(value);\n }\n return value;\n };\n return JSON.parse(item, dateTimeReviver);\n } catch (error) {\n console.error('Error reading and parsing filters from localStorage.', error);\n return {};\n }\n });\n\n // Build the list of filter fields from config\n useEffect(() => {\n const collection = getEntityConfig({ collectionSlug: slug });\n const flattenedFieldConfigs = filterList.flatMap((row, rowIndex) =>\n row.map((field, fieldIndex) => ({\n field,\n rowIndex,\n fieldIndex,\n })),\n );\n const fieldNames = flattenedFieldConfigs.map(({ field }) =>\n typeof field === 'string' ? field : field.name,\n );\n const matchedFields = findFieldsByName(collection?.fields || [], fieldNames);\n const simplifiedFields: FilterDetaild[] = matchedFields.map((field) => {\n const label = (field as FieldAffectingData).label;\n const translatedLabel = getTranslation(label as string, i18n);\n const fieldName = (field as FieldAffectingData).name as string;\n const fieldConfig = flattenedFieldConfigs.find(({ field: f }) =>\n typeof f === 'string' ? f === fieldName : f.name === fieldName,\n );\n return {\n name: fieldName,\n label: translatedLabel as string,\n type: field.type,\n options: (field as SelectField).options as OptionObject[],\n row: fieldConfig ? fieldConfig.rowIndex : 0,\n width:\n typeof fieldConfig?.field === 'object' && 'width' in fieldConfig.field\n ? fieldConfig.field.width\n : undefined,\n };\n });\n const sortedFields = flattenedFieldConfigs\n .map(({ field }) => {\n const fieldName = typeof field === 'string' ? field : field.name;\n return simplifiedFields.find((f) => f.name === fieldName);\n })\n .filter((f): f is FilterDetaild => !!f);\n setFields(sortedFields);\n setFilterRows(groupFiltersByRow(sortedFields));\n }, [slug, filterList, getEntityConfig, i18n]);\n // Sync from URL (query.where) into internal state\n useEffect(() => {\n if (fields.length === 0) return;\n\n const valuesFromQuery: Record<string, any> = parseWhereClauseToFilterValues(\n query.where,\n fields,\n locale,\n );\n\n if (!isEqual(valuesFromQuery, filterValues)) {\n // Lock to prevent feedback loop when internal state changes\n isSyncingFromQuery.current = true;\n setFilterValues(valuesFromQuery);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query.where, fields]);\n\n // Sync internal state (filterValues) back into the URL\n useEffect(() => {\n // If the change originated from the first effect, skip to avoid infinite loop\n if (isSyncingFromQuery.current) {\n isSyncingFromQuery.current = false;\n return;\n }\n\n if (fields.length === 0) return;\n\n const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, locale);\n const quickFilterFieldNames = new Set(fields.map((f) => f.name));\n const otherFilters = cleanWhereClause(query.where, quickFilterFieldNames);\n\n const allConditions = [...quickFilterConditions];\n if (otherFilters) {\n if (otherFilters.and && Array.isArray(otherFilters.and)) {\n allConditions.push(...otherFilters.and);\n } else if (Object.keys(otherFilters).length > 0) {\n allConditions.push(otherFilters);\n }\n }\n\n let newWhere: Record<string, any> = {};\n if (allConditions.length > 1) {\n newWhere = { and: allConditions };\n } else if (allConditions.length === 1) {\n newWhere = allConditions[0];\n }\n\n // Only update if the query has actually changed to avoid unnecessary updates\n if (!isEqual(newWhere, query.where)) {\n refineListData({\n columns: parseColumns(query.columns),\n where: newWhere,\n page: '1',\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterValues, fields, i18n.language, refineListData]);\n // Effect for persisting to localStorage\n useEffect(() => {\n try {\n if (Object.keys(filterValues).length > 0) {\n localStorage.setItem(localStorageKey, JSON.stringify(filterValues));\n } else {\n localStorage.removeItem(localStorageKey);\n }\n } catch (error) {\n console.error('Failed to save filters to localStorage', error);\n }\n }, [filterValues, localStorageKey]);\n\n // Updates only the internal state\n const handleFilterChange = useCallback((fieldName: string, value: any) => {\n setFilterValues((prev) => {\n const newValues = { ...prev };\n if (\n value === undefined ||\n value === null ||\n value === 'indeterminate' ||\n (value && value.type === 'none')\n ) {\n delete newValues[fieldName];\n } else {\n newValues[fieldName] = value;\n }\n return newValues;\n });\n }, []);\n\n // This function remains largely the same.\n const getActiveFiltersDetails = () => {\n const activeFilters: string[] = [];\n const locale = i18n.language as SupportedLocale;\n Object.entries(filterValues).forEach(([fieldName, value]) => {\n const field = fields.find((f) => f.name === fieldName);\n if (!field) return;\n\n switch (field.type) {\n case 'date':\n if (value !== undefined) {\n const dateValue = value as DateFilterValue;\n let dateDescription = '';\n\n if (dateValue.type === 'predefined' && dateValue.predefinedValue) {\n const { pastOptions, futureOptions } = getDateFilterOptions(locale);\n const allOptions = [...pastOptions, ...futureOptions];\n const option = allOptions.find((opt) => opt.value === dateValue.predefinedValue);\n dateDescription = option ? option.label : getLabel('custom', locale);\n } else if (dateValue.type === 'custom' || dateValue.customRange) {\n dateDescription = getLabel('custom', locale);\n }\n\n if (dateDescription) {\n activeFilters.push(`${field.label} (${dateDescription})`);\n }\n }\n break;\n case 'select': {\n const selectValue = value as SelectFilterValue;\n if (selectValue && selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n const totalOptions = field.options?.length || 0;\n\n if (selectValue.selectedValues.length === totalOptions) {\n activeFilters.push(`${field.label} (${getLabel('all', locale)})`);\n } else if (selectValue.selectedValues.length === 1) {\n // Show the actual option name when only one is selected\n const selectedOption = field.options?.find(\n (opt: any) => opt.value === selectValue.selectedValues[0],\n );\n const optionLabel = selectedOption\n ? selectedOption.label\n : selectValue.selectedValues[0];\n activeFilters.push(`${field.label} (${optionLabel})`);\n } else {\n // Show count for multiple selections\n activeFilters.push(`${field.label} (${selectValue.selectedValues.length})`);\n }\n }\n break;\n }\n case 'checkbox':\n if (value !== 'indeterminate') {\n const checkboxValue =\n value === 'checked' ? getLabel('yes', locale) : getLabel('no', locale);\n activeFilters.push(`${field.label} (${checkboxValue})`);\n }\n break;\n }\n });\n\n return activeFilters;\n };\n\n const clearAllFilters = () => {\n setFilterValues({});\n };\n\n const memoizedFilterRows = useMemo(() => {\n return filterRows.map((row) => (\n <div key={row.rowNumber}>\n <div className='flex flex-wrap gap-6 mb-4'>\n {row.filters.map((field) => (\n <FilterField\n key={field.name}\n field={field}\n onFilterChange={handleFilterChange}\n value={filterValues[field.name]}\n />\n ))}\n </div>\n </div>\n ));\n }, [filterRows, handleFilterChange, filterValues]);\n\n const toggleFilters = () => {\n setShowFilters((prev) => !prev);\n };\n\n const activeFiltersDetails = getActiveFiltersDetails();\n const hasActiveFilters = activeFiltersDetails.length > 0;\n\n if (!fields.length) return null;\n\n return (\n <div className='filter-container useTw'>\n <div style={{ position: 'relative', top: '-24px', height: '0px' }}>\n <Button\n variant='outline'\n size='sm'\n onClick={toggleFilters}\n className={`flex items-center gap-2 bg-background border-muted-muted hover:bg-muted ${\n hasActiveFilters ? 'w-auto min-w-fit' : ''\n }`}\n >\n <Filter className={`h-4 w-4 ${hasActiveFilters ? 'fill-current' : ''}`} />\n\n {hasActiveFilters ? (\n <>\n <span className='text-sm truncate'>\n <strong>\n {`${activeFiltersDetails.length === 1 ? getLabel('activeFilterSingular', locale) : getLabel('activeFilterPlural', locale)}: `}\n </strong>{' '}\n {activeFiltersDetails.join(' • ')}\n </span>\n\n <span\n onClick={(e) => {\n e.stopPropagation();\n clearAllFilters();\n }}\n className='ml-1 p-0.5 hover:bg-muted rounded-sm transition-colors flex-shrink-0'\n >\n <X className='h-3 w-3 text-gray-500' />\n </span>\n </>\n ) : (\n <span className='text-sm truncate'>{getLabel('quickFilters', locale)}</span>\n )}\n\n {showFilters ? <ChevronUp className='h-4 w-4' /> : <ChevronDown className='h-4 w-4' />}\n </Button>\n </div>\n {showFilters && <div className={'p-4 pb-2 bg-muted'}>{memoizedFilterRows}</div>}\n </div>\n );\n};\n\nexport default QuickFilter;\n"],"names":["useCallback","useEffect","useMemo","useRef","useState","useConfig","useListQuery","useTranslation","getTranslation","FilterField","getLabel","groupFiltersByRow","parseColumns","ChevronDown","ChevronUp","Filter","X","getDateRangeForOption","isEqual","futureOptionKeys","getDateFilterOptions","pastOptionKeys","Button","findFieldsByName","fields","fieldNames","results","recursiveSearch","currentFields","filteredFields","filter","field","includes","name","push","forEach","item","type","Array","isArray","tabs","tab","blocks","block","buildQuickFilterConditions","values","fieldDefs","locale","conditions","Object","entries","fieldName","value","fieldDef","find","f","condition","dateValue","from","to","predefinedValue","range","customRange","Date","dateQuery","greater_than_equal","less_than_equal","keys","length","selectValue","selectedValues","equals","in","checkboxState","cleanWhereClause","clause","fieldsToClean","newClause","key","cleanedSubClauses","map","subClause","Boolean","has","and","or","parseWhereClauseToFilterValues","where","Set","recursiveParse","fromDate","toDate","allDateOptions","matchedOption","option","isFromMatch","toDateString","undefined","isToMatch","QuickFilter","slug","filterList","localStorageKey","setFields","filterRows","setFilterRows","showFilters","setShowFilters","refineListData","query","getEntityConfig","i18n","language","isSyncingFromQuery","filterValues","setFilterValues","window","localStorage","getItem","dateTimeReviver","isoDateRegex","test","JSON","parse","error","console","collection","collectionSlug","flattenedFieldConfigs","flatMap","row","rowIndex","fieldIndex","matchedFields","simplifiedFields","label","translatedLabel","fieldConfig","options","width","sortedFields","valuesFromQuery","current","quickFilterConditions","quickFilterFieldNames","otherFilters","allConditions","newWhere","columns","page","setItem","stringify","removeItem","handleFilterChange","prev","newValues","getActiveFiltersDetails","activeFilters","dateDescription","pastOptions","futureOptions","allOptions","opt","totalOptions","selectedOption","optionLabel","checkboxValue","clearAllFilters","memoizedFilterRows","div","className","filters","onFilterChange","rowNumber","toggleFilters","activeFiltersDetails","hasActiveFilters","style","position","top","height","variant","size","onClick","span","strong","join","e","stopPropagation"],"mappings":"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"}
@@ -6,7 +6,8 @@ interface CheckboxFilterProps {
6
6
  onChange: (state: CheckboxFilterState) => void;
7
7
  locale?: Locale;
8
8
  className?: string;
9
+ style?: React.CSSProperties;
9
10
  }
10
- export declare function CheckboxFilter({ label, checkboxLabel, value, onChange, locale, className, }: CheckboxFilterProps): import("react").JSX.Element;
11
+ export declare function CheckboxFilter({ label, checkboxLabel, value, onChange, locale, className, style }: CheckboxFilterProps): import("react").JSX.Element;
11
12
  export {};
12
13
  //# sourceMappingURL=checkbox-filter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox-filter.d.ts","sourceRoot":"","sources":["../../../src/filters/components/checkbox-filter.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAKpE,UAAU,mBAAmB;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,aAAa,EACb,KAAuB,EACvB,QAAQ,EACR,MAAyC,EACzC,SAAS,GACV,EAAE,mBAAmB,+BA4GrB"}
1
+ {"version":3,"file":"checkbox-filter.d.ts","sourceRoot":"","sources":["../../../src/filters/components/checkbox-filter.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAOnE,UAAU,mBAAmB;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,mBAAmB,CAAA;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC5B;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,aAAa,EACb,KAAuB,EACvB,QAAQ,EACR,MAAyC,EACzC,SAAS,EACT,KAAK,EACN,EAAE,mBAAmB,+BA4GrB"}
@@ -2,15 +2,16 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useState } from 'react';
4
4
  import { X } from 'lucide-react';
5
- import { Label } from '../../ui/label';
6
5
  import { cn } from '../../lib/utils';
6
+ import { Label } from '../../ui/label';
7
7
  import { Button } from '../../ui/button';
8
+ import { getLabel } from '../../labels';
8
9
  export function CheckboxFilter({ label, checkboxLabel, value = 'indeterminate', onChange, locale = {
9
10
  code: 'he',
10
11
  direction: 'rtl'
11
- }, className }) {
12
+ }, className, style }) {
12
13
  const [internalState, setInternalState] = useState(value);
13
- const isHebrew = locale.code === 'he';
14
+ const isRTL = locale.direction === 'rtl';
14
15
  // Sync internal state with external value prop
15
16
  useEffect(()=>{
16
17
  setInternalState(value);
@@ -27,15 +28,16 @@ export function CheckboxFilter({ label, checkboxLabel, value = 'indeterminate',
27
28
  };
28
29
  const isActive = internalState === 'checked' || internalState === 'unchecked';
29
30
  const labels_toggle = {
30
- yes: isHebrew ? 'כן' : 'Yes',
31
- no: isHebrew ? 'לא' : 'No'
31
+ yes: getLabel('yes', locale.code),
32
+ no: getLabel('no', locale.code)
32
33
  };
33
34
  return /*#__PURE__*/ _jsxs("div", {
34
35
  className: cn('space-y-1', className),
35
36
  dir: locale.direction,
37
+ style: style,
36
38
  children: [
37
39
  label && /*#__PURE__*/ _jsx(Label, {
38
- className: cn('useTw text-sm font-medium', isHebrew && 'text-right block'),
40
+ className: cn('useTw text-sm font-medium', isRTL && 'text-right block'),
39
41
  children: label
40
42
  }),
41
43
  /*#__PURE__*/ _jsxs("div", {
@@ -64,7 +66,7 @@ export function CheckboxFilter({ label, checkboxLabel, value = 'indeterminate',
64
66
  })
65
67
  }),
66
68
  checkboxLabel && /*#__PURE__*/ _jsx(Label, {
67
- className: cn('useTw cursor-pointer select-none text-sm', isHebrew && 'text-right', locale.direction === 'rtl' && 'order-2'),
69
+ className: cn('useTw cursor-pointer select-none text-sm', isRTL && 'text-right', locale.direction === 'rtl' && 'order-2'),
68
70
  children: checkboxLabel
69
71
  }),
70
72
  (internalState === 'checked' || internalState === 'unchecked') && /*#__PURE__*/ _jsx(Button, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/filters/components/checkbox-filter.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\nimport { X } from 'lucide-react';\nimport { CheckboxFilterState, Locale } from '../types/filters-type';\nimport { Label } from '../../ui/label';\nimport { cn } from '../../lib/utils';\nimport { Button } from '../../ui/button';\n\ninterface CheckboxFilterProps {\n label?: string;\n checkboxLabel: string;\n value?: CheckboxFilterState;\n onChange: (state: CheckboxFilterState) => void;\n locale?: Locale;\n className?: string;\n}\n\nexport function CheckboxFilter({\n label,\n checkboxLabel,\n value = 'indeterminate',\n onChange,\n locale = { code: 'he', direction: 'rtl' },\n className,\n}: CheckboxFilterProps) {\n const [internalState, setInternalState] = useState<CheckboxFilterState>(value);\n\n const isHebrew = locale.code === 'he';\n\n // Sync internal state with external value prop\n useEffect(() => {\n setInternalState(value);\n }, [value]);\n\n const handleToggle = (newState: 'checked' | 'unchecked') => {\n setInternalState(newState);\n onChange(newState);\n };\n\n const handleClear = () => {\n setInternalState('indeterminate');\n onChange('indeterminate');\n };\n\n const isActive = internalState === 'checked' || internalState === 'unchecked';\n\n const labels_toggle = {\n yes: isHebrew ? 'כן' : 'Yes',\n no: isHebrew ? 'לא' : 'No',\n };\n\n return (\n <div className={cn('space-y-1', className)} dir={locale.direction}>\n {label && (\n <Label className={cn('useTw text-sm font-medium', isHebrew && 'text-right block')}>\n {label}\n </Label>\n )}\n\n <div\n className={cn(\n 'flex items-center gap-3 transition-colors py-px',\n locale.direction === 'rtl' && 'justify-start',\n )}\n >\n <div className={cn('flex items-center', locale.direction === 'rtl' && 'order-first')}>\n {/* Two Button Toggle */}\n <div className='flex rounded-md border overflow-hidden'>\n {/* In RTL, YES comes first, in LTR, NO comes first */}\n <Button\n variant={internalState === 'checked' ? 'default' : 'ghost'}\n size='sm'\n className={cn(\n 'useTW px-3 py-1 text-xs rounded-none border-0',\n internalState === 'checked'\n ? 'bg-green-600 text-white hover:bg-green-700'\n : 'bg-background text-muted-foreground hover:bg-muted',\n )}\n onClick={() => handleToggle('checked')}\n >\n {labels_toggle.yes}\n </Button>\n <Button\n variant={internalState === 'unchecked' ? 'default' : 'ghost'}\n size='sm'\n className={cn(\n 'useTw px-3 py-1 text-xs rounded-none border-0 border-l',\n internalState === 'unchecked'\n ? 'bg-red-600 text-white hover:bg-red-700'\n : 'bg-background text-muted-foreground hover:bg-muted',\n )}\n onClick={() => handleToggle('unchecked')}\n >\n {labels_toggle.no}\n </Button>\n </div>\n </div>\n\n {checkboxLabel && (\n <Label\n className={cn(\n 'useTw cursor-pointer select-none text-sm',\n isHebrew && 'text-right',\n locale.direction === 'rtl' && 'order-2',\n )}\n >\n {checkboxLabel}\n </Label>\n )}\n\n {(internalState === 'checked' || internalState === 'unchecked') && (\n <Button\n variant='ghost'\n size='sm'\n className={cn(\n 'h-5 w-5 p-0 hover:bg-muted rounded-full -mt-1',\n checkboxLabel\n ? locale.direction === 'rtl'\n ? 'order-last -ml-1'\n : 'order-last -mr-1'\n : locale.direction === 'rtl'\n ? 'ml-[80px] order-last'\n : 'mr-[80px] order-last',\n )}\n onClick={handleClear}\n >\n <X className='h-3 w-3' />\n </Button>\n )}\n </div>\n </div>\n );\n}\n"],"names":["useEffect","useState","X","Label","cn","Button","CheckboxFilter","label","checkboxLabel","value","onChange","locale","code","direction","className","internalState","setInternalState","isHebrew","handleToggle","newState","handleClear","isActive","labels_toggle","yes","no","div","dir","variant","size","onClick"],"mappings":"AAAA;;AAEA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,QAAQ;AAC5C,SAASC,CAAC,QAAQ,eAAe;AAEjC,SAASC,KAAK,QAAQ,iBAAiB;AACvC,SAASC,EAAE,QAAQ,kBAAkB;AACrC,SAASC,MAAM,QAAQ,kBAAkB;AAWzC,OAAO,SAASC,eAAe,EAC7BC,KAAK,EACLC,aAAa,EACbC,QAAQ,eAAe,EACvBC,QAAQ,EACRC,SAAS;IAAEC,MAAM;IAAMC,WAAW;AAAM,CAAC,EACzCC,SAAS,EACW;IACpB,MAAM,CAACC,eAAeC,iBAAiB,GAAGf,SAA8BQ;IAExE,MAAMQ,WAAWN,OAAOC,IAAI,KAAK;IAEjC,+CAA+C;IAC/CZ,UAAU;QACRgB,iBAAiBP;IACnB,GAAG;QAACA;KAAM;IAEV,MAAMS,eAAe,CAACC;QACpBH,iBAAiBG;QACjBT,SAASS;IACX;IAEA,MAAMC,cAAc;QAClBJ,iBAAiB;QACjBN,SAAS;IACX;IAEA,MAAMW,WAAWN,kBAAkB,aAAaA,kBAAkB;IAElE,MAAMO,gBAAgB;QACpBC,KAAKN,WAAW,OAAO;QACvBO,IAAIP,WAAW,OAAO;IACxB;IAEA,qBACE,MAACQ;QAAIX,WAAWV,GAAG,aAAaU;QAAYY,KAAKf,OAAOE,SAAS;;YAC9DN,uBACC,KAACJ;gBAAMW,WAAWV,GAAG,6BAA6Ba,YAAY;0BAC3DV;;0BAIL,MAACkB;gBACCX,WAAWV,GACT,mDACAO,OAAOE,SAAS,KAAK,SAAS;;kCAGhC,KAACY;wBAAIX,WAAWV,GAAG,qBAAqBO,OAAOE,SAAS,KAAK,SAAS;kCAEpE,cAAA,MAACY;4BAAIX,WAAU;;8CAEb,KAACT;oCACCsB,SAASZ,kBAAkB,YAAY,YAAY;oCACnDa,MAAK;oCACLd,WAAWV,GACT,iDACAW,kBAAkB,YACd,+CACA;oCAENc,SAAS,IAAMX,aAAa;8CAE3BI,cAAcC,GAAG;;8CAEpB,KAAClB;oCACCsB,SAASZ,kBAAkB,cAAc,YAAY;oCACrDa,MAAK;oCACLd,WAAWV,GACT,0DACAW,kBAAkB,cACd,2CACA;oCAENc,SAAS,IAAMX,aAAa;8CAE3BI,cAAcE,EAAE;;;;;oBAKtBhB,+BACC,KAACL;wBACCW,WAAWV,GACT,4CACAa,YAAY,cACZN,OAAOE,SAAS,KAAK,SAAS;kCAG/BL;;oBAIHO,CAAAA,kBAAkB,aAAaA,kBAAkB,WAAU,mBAC3D,KAACV;wBACCsB,SAAQ;wBACRC,MAAK;wBACLd,WAAWV,GACT,iDACAI,gBACIG,OAAOE,SAAS,KAAK,QACnB,qBACA,qBACFF,OAAOE,SAAS,KAAK,QACnB,yBACA;wBAERgB,SAAST;kCAET,cAAA,KAAClB;4BAAEY,WAAU;;;;;;;AAMzB"}
1
+ {"version":3,"sources":["../../../src/filters/components/checkbox-filter.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect, useState } from 'react'\nimport { X } from 'lucide-react'\nimport { CheckboxFilterState, Locale } from '../types/filters-type'\nimport { cn } from '../../lib/utils'\nimport { Label } from '../../ui/label'\nimport { Button } from '../../ui/button'\nimport { getLabel } from '../../labels'\n\n\ninterface CheckboxFilterProps {\n label?: string\n checkboxLabel: string\n value?: CheckboxFilterState\n onChange: (state: CheckboxFilterState) => void\n locale?: Locale\n className?: string\n style?: React.CSSProperties\n}\n\nexport function CheckboxFilter({\n label,\n checkboxLabel,\n value = 'indeterminate',\n onChange,\n locale = { code: 'he', direction: 'rtl' },\n className,\n style\n}: CheckboxFilterProps) {\n const [internalState, setInternalState] = useState<CheckboxFilterState>(value)\n\n const isRTL = locale.direction === 'rtl'\n\n // Sync internal state with external value prop\n useEffect(() => {\n setInternalState(value)\n }, [value])\n\n const handleToggle = (newState: 'checked' | 'unchecked') => {\n setInternalState(newState)\n onChange(newState)\n }\n\n const handleClear = () => {\n setInternalState('indeterminate')\n onChange('indeterminate')\n }\n\n const isActive = internalState === 'checked' || internalState === 'unchecked'\n\n const labels_toggle = {\n yes: getLabel('yes', locale.code),\n no: getLabel('no', locale.code),\n }\n\n return (\n <div className={cn('space-y-1', className)} dir={locale.direction} style={style}>\n {label && (\n <Label className={cn('useTw text-sm font-medium', isRTL && 'text-right block')}>\n {label}\n </Label>\n )}\n\n <div\n className={cn(\n 'flex items-center gap-3 transition-colors py-px',\n locale.direction === 'rtl' && 'justify-start',\n )}\n >\n <div className={cn('flex items-center', locale.direction === 'rtl' && 'order-first')}>\n {/* Two Button Toggle */}\n <div className=\"flex rounded-md border overflow-hidden\">\n {/* In RTL, YES comes first, in LTR, NO comes first */}\n <Button\n variant={internalState === 'checked' ? 'default' : 'ghost'}\n size=\"sm\"\n className={cn(\n 'useTW px-3 py-1 text-xs rounded-none border-0',\n internalState === 'checked'\n ? 'bg-green-600 text-white hover:bg-green-700'\n : 'bg-background text-muted-foreground hover:bg-muted',\n )}\n onClick={() => handleToggle('checked')}\n >\n {labels_toggle.yes}\n </Button>\n <Button\n variant={internalState === 'unchecked' ? 'default' : 'ghost'}\n size=\"sm\"\n className={cn(\n 'useTw px-3 py-1 text-xs rounded-none border-0 border-l',\n internalState === 'unchecked'\n ? 'bg-red-600 text-white hover:bg-red-700'\n : 'bg-background text-muted-foreground hover:bg-muted',\n )}\n onClick={() => handleToggle('unchecked')}\n >\n {labels_toggle.no}\n </Button>\n </div>\n </div>\n\n {checkboxLabel && (\n <Label\n className={cn(\n 'useTw cursor-pointer select-none text-sm',\n isRTL && 'text-right',\n locale.direction === 'rtl' && 'order-2',\n )}\n >\n {checkboxLabel}\n </Label>\n )}\n\n {(internalState === 'checked' || internalState === 'unchecked') && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n 'h-5 w-5 p-0 hover:bg-muted rounded-full -mt-1',\n checkboxLabel\n ? locale.direction === 'rtl'\n ? 'order-last -ml-1'\n : 'order-last -mr-1'\n : locale.direction === 'rtl'\n ? 'ml-[80px] order-last'\n : 'mr-[80px] order-last',\n )}\n onClick={handleClear}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n )}\n </div>\n </div>\n )\n}"],"names":["useEffect","useState","X","cn","Label","Button","getLabel","CheckboxFilter","label","checkboxLabel","value","onChange","locale","code","direction","className","style","internalState","setInternalState","isRTL","handleToggle","newState","handleClear","isActive","labels_toggle","yes","no","div","dir","variant","size","onClick"],"mappings":"AAAA;;AAEA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAC3C,SAASC,CAAC,QAAQ,eAAc;AAEhC,SAASC,EAAE,QAAQ,kBAAiB;AACpC,SAASC,KAAK,QAAQ,iBAAgB;AACtC,SAASC,MAAM,QAAQ,kBAAiB;AACxC,SAASC,QAAQ,QAAQ,eAAc;AAavC,OAAO,SAASC,eAAe,EAC7BC,KAAK,EACLC,aAAa,EACbC,QAAQ,eAAe,EACvBC,QAAQ,EACRC,SAAS;IAAEC,MAAM;IAAMC,WAAW;AAAM,CAAC,EACzCC,SAAS,EACTC,KAAK,EACe;IACpB,MAAM,CAACC,eAAeC,iBAAiB,GAAGjB,SAA8BS;IAExE,MAAMS,QAAQP,OAAOE,SAAS,KAAK;IAEnC,+CAA+C;IAC/Cd,UAAU;QACRkB,iBAAiBR;IACnB,GAAG;QAACA;KAAM;IAEV,MAAMU,eAAe,CAACC;QACpBH,iBAAiBG;QACjBV,SAASU;IACX;IAEA,MAAMC,cAAc;QAClBJ,iBAAiB;QACjBP,SAAS;IACX;IAEA,MAAMY,WAAWN,kBAAkB,aAAaA,kBAAkB;IAElE,MAAMO,gBAAgB;QACpBC,KAAKnB,SAAS,OAAOM,OAAOC,IAAI;QAChCa,IAAIpB,SAAS,MAAMM,OAAOC,IAAI;IAChC;IAEA,qBACE,MAACc;QAAIZ,WAAWZ,GAAG,aAAaY;QAAYa,KAAKhB,OAAOE,SAAS;QAAEE,OAAOA;;YACvER,uBACC,KAACJ;gBAAMW,WAAWZ,GAAG,6BAA6BgB,SAAS;0BACxDX;;0BAIL,MAACmB;gBACCZ,WAAWZ,GACT,mDACAS,OAAOE,SAAS,KAAK,SAAS;;kCAGhC,KAACa;wBAAIZ,WAAWZ,GAAG,qBAAqBS,OAAOE,SAAS,KAAK,SAAS;kCAEpE,cAAA,MAACa;4BAAIZ,WAAU;;8CAEb,KAACV;oCACCwB,SAASZ,kBAAkB,YAAY,YAAY;oCACnDa,MAAK;oCACLf,WAAWZ,GACT,iDACAc,kBAAkB,YACd,+CACA;oCAENc,SAAS,IAAMX,aAAa;8CAE3BI,cAAcC,GAAG;;8CAEpB,KAACpB;oCACCwB,SAASZ,kBAAkB,cAAc,YAAY;oCACrDa,MAAK;oCACLf,WAAWZ,GACT,0DACAc,kBAAkB,cACd,2CACA;oCAENc,SAAS,IAAMX,aAAa;8CAE3BI,cAAcE,EAAE;;;;;oBAKtBjB,+BACC,KAACL;wBACCW,WAAWZ,GACT,4CACAgB,SAAS,cACTP,OAAOE,SAAS,KAAK,SAAS;kCAG/BL;;oBAIHQ,CAAAA,kBAAkB,aAAaA,kBAAkB,WAAU,mBAC3D,KAACZ;wBACCwB,SAAQ;wBACRC,MAAK;wBACLf,WAAWZ,GACT,iDACAM,gBACIG,OAAOE,SAAS,KAAK,QACnB,qBACA,qBACFF,OAAOE,SAAS,KAAK,QACnB,yBACA;wBAERiB,SAAST;kCAET,cAAA,KAACpB;4BAAEa,WAAU;;;;;;;AAMzB"}
@@ -5,7 +5,8 @@ interface DateFilterProps {
5
5
  onChange: (value: DateFilterValue) => void;
6
6
  locale?: Locale;
7
7
  className?: string;
8
+ style?: React.CSSProperties;
8
9
  }
9
- export declare function DateFilter({ label, value, onChange, locale, className, }: DateFilterProps): import("react").JSX.Element;
10
+ export declare function DateFilter({ label, value, onChange, locale, className, style, }: DateFilterProps): import("react").JSX.Element;
10
11
  export {};
11
12
  //# sourceMappingURL=date-filter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-filter.d.ts","sourceRoot":"","sources":["../../../src/filters/components/date-filter.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAa,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAQ3E,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAyC,EACzC,SAAS,GACV,EAAE,eAAe,+BA6VjB"}
1
+ {"version":3,"file":"date-filter.d.ts","sourceRoot":"","sources":["../../../src/filters/components/date-filter.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAa,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAW3E,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAyC,EACzC,SAAS,EACT,KAAK,GACN,EAAE,eAAe,+BAiVjB"}
@@ -2,7 +2,6 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useState } from 'react';
4
4
  import { CalendarIcon, ChevronDown, X } from 'lucide-react';
5
- import { futureDateFilterOptions, futureDateFilterOptionsEn, pastDateFilterOptions, pastDateFilterOptionsEn } from '../constants/date-filter-options';
6
5
  import { formatDate, getDateRangeForOption } from '../utils/date-helpers';
7
6
  import { Button } from '../../ui/button';
8
7
  import { cn } from '../../lib/utils';
@@ -10,10 +9,12 @@ import { Label } from '../../ui/label';
10
9
  import { Popover, PopoverContent, PopoverTrigger } from '../../ui/popover';
11
10
  import { Separator } from '../../ui/separator';
12
11
  import { Calendar } from '../../ui/calendar';
12
+ import { getDateFilterOptions } from '../constants/date-filter-options';
13
+ import { getLabel } from '../../labels';
13
14
  export function DateFilter({ label, value, onChange, locale = {
14
15
  code: 'he',
15
16
  direction: 'rtl'
16
- }, className }) {
17
+ }, className, style }) {
17
18
  const [internalValue, setInternalValue] = useState(value);
18
19
  const [customRange, setCustomRange] = useState({
19
20
  from: undefined,
@@ -23,9 +24,9 @@ export function DateFilter({ label, value, onChange, locale = {
23
24
  const [isOpen, setIsOpen] = useState(false);
24
25
  const [openFromCalendar, setOpenFromCalendar] = useState(false);
25
26
  const [openToCalendar, setOpenToCalendar] = useState(false);
26
- const isHebrew = locale.code === 'he';
27
- const pastOptions = isHebrew ? pastDateFilterOptions : pastDateFilterOptionsEn;
28
- const futureOptions = isHebrew ? futureDateFilterOptions : futureDateFilterOptionsEn;
27
+ const isRTL = locale.direction === 'rtl';
28
+ const localeCode = locale.code;
29
+ const { pastOptions, futureOptions } = getDateFilterOptions(localeCode);
29
30
  // Sync internal state with external value prop
30
31
  useEffect(()=>{
31
32
  setInternalValue(value);
@@ -36,15 +37,15 @@ export function DateFilter({ label, value, onChange, locale = {
36
37
  value
37
38
  ]);
38
39
  const labels = {
39
- selectOption: isHebrew ? 'בחר אפשרות' : 'Select Option',
40
- from: isHebrew ? 'מתאריך' : 'From',
41
- to: isHebrew ? 'עד תאריך' : 'To',
42
- selectDate: isHebrew ? 'בחר תאריך' : 'Select Date',
43
- past: isHebrew ? 'עבר' : 'Past',
44
- future: isHebrew ? 'עתיד' : 'Future',
45
- custom: isHebrew ? 'טווח מותאם אישית' : 'Custom Range',
46
- apply: isHebrew ? 'החל' : 'Apply',
47
- cancel: isHebrew ? 'ביטול' : 'Cancel'
40
+ selectOption: getLabel('selectOption', localeCode),
41
+ from: getLabel('from', localeCode),
42
+ to: getLabel('to', localeCode),
43
+ selectDate: getLabel('selectDate', localeCode),
44
+ past: getLabel('past', localeCode),
45
+ future: getLabel('future', localeCode),
46
+ custom: getLabel('customRange', localeCode),
47
+ apply: getLabel('apply', localeCode),
48
+ cancel: getLabel('cancel', localeCode)
48
49
  };
49
50
  const handlePredefinedSelect = (optionValue)=>{
50
51
  setShowCustom(false);
@@ -122,7 +123,7 @@ export function DateFilter({ label, value, onChange, locale = {
122
123
  };
123
124
  const formatDateRange = (description)=>{
124
125
  // Check if description contains a date range (has " - " in it)
125
- if (description.includes(' - ') && isHebrew) {
126
+ if (description.includes(' - ') && isRTL) {
126
127
  // Split by " - " and reverse the order for RTL
127
128
  const parts = description.replace(/[()]/g, '').split(' - ');
128
129
  if (parts.length === 2) {
@@ -136,7 +137,7 @@ export function DateFilter({ label, value, onChange, locale = {
136
137
  const formattedDescription = formatDateRange(dateRange.description);
137
138
  return /*#__PURE__*/ _jsx(Button, {
138
139
  variant: "ghost",
139
- className: cn(' w-full h-auto py-1 px-2 text-xs leading-tight justify-start', isHebrew ? ' text-right' : ' text-left', internalValue?.predefinedValue === option.value && 'bg-accent'),
140
+ className: cn(' w-full h-auto py-1 px-2 text-xs leading-tight justify-start', isRTL ? ' text-right' : ' text-left', internalValue?.predefinedValue === option.value && 'bg-accent'),
140
141
  onClick: ()=>handlePredefinedSelect(option.value),
141
142
  children: /*#__PURE__*/ _jsxs("div", {
142
143
  className: cn('flex flex-col'),
@@ -157,9 +158,10 @@ export function DateFilter({ label, value, onChange, locale = {
157
158
  return /*#__PURE__*/ _jsxs("div", {
158
159
  className: cn('useTw space-y-1', className),
159
160
  dir: locale.direction,
161
+ style: style,
160
162
  children: [
161
163
  label && /*#__PURE__*/ _jsx(Label, {
162
- className: cn('useTw text-sm font-medium', isHebrew && 'text-right block'),
164
+ className: cn('useTw text-sm font-medium', isRTL && 'text-right block'),
163
165
  children: label
164
166
  }),
165
167
  /*#__PURE__*/ _jsxs("div", {
@@ -179,7 +181,7 @@ export function DateFilter({ label, value, onChange, locale = {
179
181
  className: "useTw w-full justify-between bg-background relative min-w-70",
180
182
  children: [
181
183
  /*#__PURE__*/ _jsx("span", {
182
- className: `useTw truncate ${isHebrew && 'text-right'}`,
184
+ className: `useTw truncate ${isRTL && 'text-right'}`,
183
185
  children: getDisplayValue()
184
186
  }),
185
187
  /*#__PURE__*/ _jsx(ChevronDown, {
@@ -200,7 +202,7 @@ export function DateFilter({ label, value, onChange, locale = {
200
202
  className: "space-y-1",
201
203
  children: [
202
204
  /*#__PURE__*/ _jsx("div", {
203
- className: cn('text-sm font-semibold text-muted-foreground mb-2', isHebrew && 'text-right'),
205
+ className: cn('text-sm font-semibold text-muted-foreground mb-2', isRTL && 'text-right'),
204
206
  children: labels.future
205
207
  }),
206
208
  /*#__PURE__*/ _jsx("div", {
@@ -215,7 +217,7 @@ export function DateFilter({ label, value, onChange, locale = {
215
217
  className: "space-y-1",
216
218
  children: [
217
219
  /*#__PURE__*/ _jsx("div", {
218
- className: cn('text-sm font-semibold text-muted-foreground mb-2', isHebrew && 'text-right'),
220
+ className: cn('text-sm font-semibold text-muted-foreground mb-2', isRTL && 'text-right'),
219
221
  children: labels.past
220
222
  }),
221
223
  /*#__PURE__*/ _jsx("div", {
@@ -236,7 +238,7 @@ export function DateFilter({ label, value, onChange, locale = {
236
238
  children: [
237
239
  /*#__PURE__*/ _jsx(Button, {
238
240
  variant: "ghost",
239
- className: cn('useTw w-full justify-start h-auto py-2 px-2', (showCustom || internalValue?.type === 'custom') && 'bg-accent', isHebrew && 'justify-start text-right'),
241
+ className: cn('useTw w-full justify-start h-auto py-2 px-2', (showCustom || internalValue?.type === 'custom') && 'bg-accent', isRTL && 'justify-start text-right'),
240
242
  onClick: handleCustomSelect,
241
243
  children: labels.custom
242
244
  }),
@@ -250,7 +252,7 @@ export function DateFilter({ label, value, onChange, locale = {
250
252
  className: cn('flex items-center gap-2'),
251
253
  children: [
252
254
  /*#__PURE__*/ _jsx(Label, {
253
- className: cn('useTw text-xs w-[20%]', isHebrew && 'text-right text-start'),
255
+ className: cn('useTw text-xs w-[20%]', isRTL && 'text-right'),
254
256
  children: labels.from
255
257
  }),
256
258
  /*#__PURE__*/ _jsxs(Popover, {
@@ -299,7 +301,7 @@ export function DateFilter({ label, value, onChange, locale = {
299
301
  className: cn('flex items-center gap-2'),
300
302
  children: [
301
303
  /*#__PURE__*/ _jsx(Label, {
302
- className: cn('useTw useTw text-xs w-[20%]', isHebrew && 'text-right text-strat'),
304
+ className: cn('useTw text-xs w-[20%]', isRTL && 'text-right'),
303
305
  children: labels.to
304
306
  }),
305
307
  /*#__PURE__*/ _jsxs(Popover, {
@@ -373,7 +375,7 @@ export function DateFilter({ label, value, onChange, locale = {
373
375
  ]
374
376
  }),
375
377
  hasValue() && /*#__PURE__*/ _jsx("button", {
376
- className: `useTw absolute ${isHebrew ? 'left-8' : 'right-8'} top-1/2 -translate-y-1/2 h-4 w-4 p-0 hover:bg-muted rounded-sm flex items-center justify-center z-10 `,
378
+ className: `useTw absolute ${isRTL ? 'left-8' : 'right-8'} top-1/2 -translate-y-1/2 h-4 w-4 p-0 hover:bg-muted rounded-sm flex items-center justify-center z-10 `,
377
379
  onClick: (e)=>{
378
380
  e.stopPropagation();
379
381
  handleClearAll();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/filters/components/date-filter.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\nimport { CalendarIcon, ChevronDown, X } from 'lucide-react';\n\nimport {\n futureDateFilterOptions,\n futureDateFilterOptionsEn,\n pastDateFilterOptions,\n pastDateFilterOptionsEn,\n} from '../constants/date-filter-options';\nimport { formatDate, getDateRangeForOption } from '../utils/date-helpers';\nimport { DateFilterValue, DateRange, Locale } from '../types/filters-type';\nimport { Button } from '../../ui/button';\nimport { cn } from '../../lib/utils';\nimport { Label } from '../../ui/label';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../ui/popover';\nimport { Separator } from '../../ui/separator';\nimport { Calendar } from '../../ui/calendar';\n\ninterface DateFilterProps {\n label?: string;\n value?: DateFilterValue;\n onChange: (value: DateFilterValue) => void;\n locale?: Locale;\n className?: string;\n}\n\nexport function DateFilter({\n label,\n value,\n onChange,\n locale = { code: 'he', direction: 'rtl' },\n className,\n}: DateFilterProps) {\n const [internalValue, setInternalValue] = useState<DateFilterValue | undefined>(value);\n const [customRange, setCustomRange] = useState<DateRange>({ from: undefined, to: undefined });\n const [showCustom, setShowCustom] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n const [openFromCalendar, setOpenFromCalendar] = useState(false);\n const [openToCalendar, setOpenToCalendar] = useState(false);\n\n const isHebrew = locale.code === 'he';\n const pastOptions = isHebrew ? pastDateFilterOptions : pastDateFilterOptionsEn;\n const futureOptions = isHebrew ? futureDateFilterOptions : futureDateFilterOptionsEn;\n\n // Sync internal state with external value prop\n useEffect(() => {\n setInternalValue(value);\n if (value?.type === 'custom' && value.customRange) {\n setCustomRange(value.customRange);\n }\n }, [value]);\n\n const labels = {\n selectOption: isHebrew ? 'בחר אפשרות' : 'Select Option',\n from: isHebrew ? 'מתאריך' : 'From',\n to: isHebrew ? 'עד תאריך' : 'To',\n selectDate: isHebrew ? 'בחר תאריך' : 'Select Date',\n past: isHebrew ? 'עבר' : 'Past',\n future: isHebrew ? 'עתיד' : 'Future',\n custom: isHebrew ? 'טווח מותאם אישית' : 'Custom Range',\n apply: isHebrew ? 'החל' : 'Apply',\n cancel: isHebrew ? 'ביטול' : 'Cancel',\n };\n\n const handlePredefinedSelect = (optionValue: string) => {\n setShowCustom(false);\n setIsOpen(false);\n\n const dateRange = getDateRangeForOption(optionValue, locale.code);\n const newValue: DateFilterValue = {\n type: 'predefined',\n predefinedValue: optionValue,\n customRange: { from: dateRange.from, to: dateRange.to },\n };\n\n setInternalValue(newValue);\n onChange(newValue);\n };\n\n const handleCustomSelect = () => {\n setShowCustom(true);\n };\n\n const handleCustomRangeChange = (newRange: DateRange) => {\n setCustomRange(newRange);\n };\n\n const handleApplyCustomRange = () => {\n const newValue: DateFilterValue = {\n type: 'custom',\n customRange,\n };\n\n setInternalValue(newValue);\n onChange(newValue);\n setIsOpen(false);\n setShowCustom(false);\n };\n\n const handleCancelCustomRange = () => {\n setIsOpen(false);\n setShowCustom(false);\n setCustomRange({ from: undefined, to: undefined });\n };\n\n const handleClearAll = () => {\n setInternalValue(undefined);\n setCustomRange({ from: undefined, to: undefined });\n setShowCustom(false);\n onChange({} as DateFilterValue);\n };\n\n const hasValue = () => {\n return (\n internalValue && (internalValue.type === 'predefined' || internalValue.type === 'custom')\n );\n };\n\n const getDisplayValue = () => {\n if (internalValue?.type === 'custom' && internalValue.customRange) {\n const { from, to } = internalValue.customRange;\n if (from && to) {\n return `${formatDate(from, 'dd/MM/yyyy')}-${formatDate(to, 'dd/MM/yyyy')}`;\n } else if (from) {\n return `${labels.from}: ${formatDate(from, 'dd/MM/yyyy')}`;\n } else if (to) {\n return `${labels.to}: ${formatDate(to, 'dd/MM/yyyy')}`;\n }\n return labels.custom;\n }\n\n if (internalValue?.type === 'predefined' && internalValue.predefinedValue) {\n const allOptions = [...pastOptions, ...futureOptions];\n const option = allOptions.find((opt) => opt.value === internalValue.predefinedValue);\n const dateRange = getDateRangeForOption(internalValue.predefinedValue, locale.code);\n return `${option?.label || internalValue.predefinedValue} ${dateRange.description}`;\n }\n\n return labels.selectOption;\n };\n\n const formatDateRange = (description: string) => {\n // Check if description contains a date range (has \" - \" in it)\n if (description.includes(' - ') && isHebrew) {\n // Split by \" - \" and reverse the order for RTL\n const parts = description.replace(/[()]/g, '').split(' - ');\n if (parts.length === 2) {\n return `(${parts[1]}-${parts[0]})`;\n }\n }\n return description;\n };\n\n const renderOptionWithDate = (option: { value: string; label: string }) => {\n const dateRange = getDateRangeForOption(option.value, locale.code);\n const formattedDescription = formatDateRange(dateRange.description);\n\n return (\n <Button\n key={option.value}\n variant='ghost'\n className={cn(\n ' w-full h-auto py-1 px-2 text-xs leading-tight justify-start',\n isHebrew ? ' text-right' : ' text-left',\n internalValue?.predefinedValue === option.value && 'bg-accent',\n )}\n onClick={() => handlePredefinedSelect(option.value)}\n >\n <div className={cn('flex flex-col')}>\n <span className='font-medium'>{option.label}</span>\n <span className='text-[10px] text-muted-foreground' dir={locale.direction}>\n {formattedDescription}\n </span>\n </div>\n </Button>\n );\n };\n\n return (\n <div className={cn('useTw space-y-1', className)} dir={locale.direction}>\n {label && (\n <Label className={cn('useTw text-sm font-medium', isHebrew && 'text-right block')}>\n {label}\n </Label>\n )}\n\n <div className='relative useTw'>\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild className='useTw'>\n <Button\n variant='outline'\n role='combobox'\n aria-expanded={isOpen}\n className='useTw w-full justify-between bg-background relative min-w-70'\n >\n <span className={`useTw truncate ${isHebrew && 'text-right'}`}>\n {getDisplayValue()}\n </span>\n <ChevronDown className='useTw h-4 w-4 shrink-0 opacity-50' />\n </Button>\n </PopoverTrigger>\n <PopoverContent className='useTw w-80 p-0'>\n <div className='p-4'>\n <div className='grid grid-cols-2 gap-4'>\n {/* Future Options - Left column */}\n <div className='space-y-1'>\n <div\n className={cn(\n 'text-sm font-semibold text-muted-foreground mb-2',\n isHebrew && 'text-right',\n )}\n >\n {labels.future}\n </div>\n <div className='space-y-0.5'>\n {futureOptions.map((option) => (\n <div key={option.value}>{renderOptionWithDate(option)}</div>\n ))}\n </div>\n </div>\n\n {/* Past Options - Right column */}\n <div className='space-y-1'>\n <div\n className={cn(\n 'text-sm font-semibold text-muted-foreground mb-2',\n isHebrew && 'text-right',\n )}\n >\n {labels.past}\n </div>\n <div className='space-y-0.5'>\n {pastOptions.map((option) => (\n <div key={option.value}>{renderOptionWithDate(option)}</div>\n ))}\n </div>\n </div>\n </div>\n\n <Separator className='my-4' />\n\n {/* Custom Option */}\n <div className='space-y-3'>\n <Button\n variant='ghost'\n className={cn(\n 'useTw w-full justify-start h-auto py-2 px-2',\n (showCustom || internalValue?.type === 'custom') && 'bg-accent',\n isHebrew && 'justify-start text-right',\n )}\n onClick={handleCustomSelect}\n >\n {labels.custom}\n </Button>\n\n {/* Custom Date Range - appears next to custom label */}\n {showCustom && (\n <div className='space-y-3 pl-2'>\n <div className='grid grid-cols-1 gap-3'>\n {/* From Date */}\n <div className={cn('flex items-center gap-2')}>\n <Label\n className={cn(\n 'useTw text-xs w-[20%]',\n isHebrew && 'text-right text-start',\n )}\n >\n {labels.from}\n </Label>\n <Popover open={openFromCalendar} onOpenChange={setOpenFromCalendar}>\n <PopoverTrigger asChild className='useTw'>\n <Button\n variant='outline'\n className={cn(\n 'useTw w-[60%] justify-start text-left font-normal text-xs h-8 bg-background',\n !customRange.from && 'text-muted-foreground',\n )}\n >\n <CalendarIcon className='useTw mr-1 h-3 w-3' />\n <span dir={locale.direction}>\n {customRange.from\n ? formatDate(customRange.from, 'dd/MM/yyyy')\n : labels.selectDate}\n </span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className='useTw w-auto p-0' align='start'>\n <Calendar\n mode='single'\n selected={customRange.from}\n onSelect={(date) => {\n handleCustomRangeChange({ ...customRange, from: date });\n setOpenFromCalendar(false);\n }}\n initialFocus\n className='useTw'\n />\n </PopoverContent>\n </Popover>\n </div>\n\n {/* To Date */}\n <div className={cn('flex items-center gap-2')}>\n <Label\n className={cn(\n 'useTw useTw text-xs w-[20%]',\n isHebrew && 'text-right text-strat',\n )}\n >\n {labels.to}\n </Label>\n <Popover open={openToCalendar} onOpenChange={setOpenToCalendar}>\n <PopoverTrigger asChild className='useTw'>\n <Button\n variant='outline'\n className={cn(\n 'useTw w-[60%] justify-start text-left font-normal text-xs h-8 bg-background',\n !customRange.to && 'text-muted-foreground',\n )}\n >\n <CalendarIcon className='useTw mr-1 h-3 w-3' />\n <span dir={locale.direction}>\n {customRange.to\n ? formatDate(customRange.to, 'dd/MM/yyyy')\n : labels.selectDate}\n </span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className='useTw w-auto p-0' align='start'>\n <Calendar\n mode='single'\n selected={customRange.to}\n onSelect={(date) => {\n handleCustomRangeChange({ ...customRange, to: date });\n setOpenToCalendar(false);\n }}\n initialFocus\n className='useTw'\n />\n </PopoverContent>\n </Popover>\n </div>\n </div>\n\n {/* Action Buttons */}\n <div className='flex gap-2'>\n <Button\n onClick={handleApplyCustomRange}\n className='useTw flex-1 text-xs h-8'\n disabled={!customRange.from && !customRange.to}\n >\n {labels.apply}\n </Button>\n <Button\n onClick={handleCancelCustomRange}\n variant='outline'\n className='useTw flex-1 text-xs h-8 bg-transparent'\n >\n {labels.cancel}\n </Button>\n </div>\n </div>\n )}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n {hasValue() && (\n <button\n className={`useTw absolute ${isHebrew ? 'left-8' : 'right-8'} top-1/2 -translate-y-1/2 h-4 w-4 p-0 hover:bg-muted rounded-sm flex items-center justify-center z-10 `}\n onClick={(e) => {\n e.stopPropagation();\n handleClearAll();\n }}\n >\n <X className='useTw h-3 w-3' />\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"names":["useEffect","useState","CalendarIcon","ChevronDown","X","futureDateFilterOptions","futureDateFilterOptionsEn","pastDateFilterOptions","pastDateFilterOptionsEn","formatDate","getDateRangeForOption","Button","cn","Label","Popover","PopoverContent","PopoverTrigger","Separator","Calendar","DateFilter","label","value","onChange","locale","code","direction","className","internalValue","setInternalValue","customRange","setCustomRange","from","undefined","to","showCustom","setShowCustom","isOpen","setIsOpen","openFromCalendar","setOpenFromCalendar","openToCalendar","setOpenToCalendar","isHebrew","pastOptions","futureOptions","type","labels","selectOption","selectDate","past","future","custom","apply","cancel","handlePredefinedSelect","optionValue","dateRange","newValue","predefinedValue","handleCustomSelect","handleCustomRangeChange","newRange","handleApplyCustomRange","handleCancelCustomRange","handleClearAll","hasValue","getDisplayValue","allOptions","option","find","opt","description","formatDateRange","includes","parts","replace","split","length","renderOptionWithDate","formattedDescription","variant","onClick","div","span","dir","open","onOpenChange","asChild","role","aria-expanded","map","align","mode","selected","onSelect","date","initialFocus","disabled","button","e","stopPropagation"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/filters/components/date-filter.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\nimport { CalendarIcon, ChevronDown, X } from 'lucide-react';\n\nimport { formatDate, getDateRangeForOption } from '../utils/date-helpers';\nimport { DateFilterValue, DateRange, Locale } from '../types/filters-type';\nimport { Button } from '../../ui/button';\nimport { cn } from '../../lib/utils';\nimport { Label } from '../../ui/label';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../ui/popover';\nimport { Separator } from '../../ui/separator';\nimport { Calendar } from '../../ui/calendar';\nimport { getDateFilterOptions } from '../constants/date-filter-options';\nimport { SupportedLocale, getLabel } from '../../labels';\n\n\ninterface DateFilterProps {\n label?: string;\n value?: DateFilterValue;\n onChange: (value: DateFilterValue) => void;\n locale?: Locale;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function DateFilter({\n label,\n value,\n onChange,\n locale = { code: 'he', direction: 'rtl' },\n className,\n style,\n}: DateFilterProps) {\n const [internalValue, setInternalValue] = useState<DateFilterValue | undefined>(value);\n const [customRange, setCustomRange] = useState<DateRange>({ from: undefined, to: undefined });\n const [showCustom, setShowCustom] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n const [openFromCalendar, setOpenFromCalendar] = useState(false);\n const [openToCalendar, setOpenToCalendar] = useState(false);\n\n const isRTL = locale.direction === 'rtl';\n const localeCode = locale.code as SupportedLocale;\n const { pastOptions, futureOptions } = getDateFilterOptions(localeCode);\n\n // Sync internal state with external value prop\n useEffect(() => {\n setInternalValue(value);\n if (value?.type === 'custom' && value.customRange) {\n setCustomRange(value.customRange);\n }\n }, [value]);\n\n const labels = {\n selectOption: getLabel('selectOption', localeCode),\n from: getLabel('from', localeCode),\n to: getLabel('to', localeCode),\n selectDate: getLabel('selectDate', localeCode),\n past: getLabel('past', localeCode),\n future: getLabel('future', localeCode),\n custom: getLabel('customRange', localeCode),\n apply: getLabel('apply', localeCode),\n cancel: getLabel('cancel', localeCode),\n };\n\n const handlePredefinedSelect = (optionValue: string) => {\n setShowCustom(false);\n setIsOpen(false);\n\n const dateRange = getDateRangeForOption(optionValue, locale.code);\n const newValue: DateFilterValue = {\n type: 'predefined',\n predefinedValue: optionValue,\n customRange: { from: dateRange.from, to: dateRange.to },\n };\n\n setInternalValue(newValue);\n onChange(newValue);\n };\n\n const handleCustomSelect = () => {\n setShowCustom(true);\n };\n\n const handleCustomRangeChange = (newRange: DateRange) => {\n setCustomRange(newRange);\n };\n\n const handleApplyCustomRange = () => {\n const newValue: DateFilterValue = {\n type: 'custom',\n customRange,\n };\n\n setInternalValue(newValue);\n onChange(newValue);\n setIsOpen(false);\n setShowCustom(false);\n };\n\n const handleCancelCustomRange = () => {\n setIsOpen(false);\n setShowCustom(false);\n setCustomRange({ from: undefined, to: undefined });\n };\n\n const handleClearAll = () => {\n setInternalValue(undefined);\n setCustomRange({ from: undefined, to: undefined });\n setShowCustom(false);\n onChange({} as DateFilterValue);\n };\n\n const hasValue = () => {\n return (\n internalValue && (internalValue.type === 'predefined' || internalValue.type === 'custom')\n );\n };\n\n const getDisplayValue = () => {\n if (internalValue?.type === 'custom' && internalValue.customRange) {\n const { from, to } = internalValue.customRange;\n if (from && to) {\n return `${formatDate(from, 'dd/MM/yyyy')}-${formatDate(to, 'dd/MM/yyyy')}`;\n } else if (from) {\n return `${labels.from}: ${formatDate(from, 'dd/MM/yyyy')}`;\n } else if (to) {\n return `${labels.to}: ${formatDate(to, 'dd/MM/yyyy')}`;\n }\n return labels.custom;\n }\n\n if (internalValue?.type === 'predefined' && internalValue.predefinedValue) {\n const allOptions = [...pastOptions, ...futureOptions];\n const option = allOptions.find((opt) => opt.value === internalValue.predefinedValue);\n const dateRange = getDateRangeForOption(internalValue.predefinedValue, locale.code);\n return `${option?.label || internalValue.predefinedValue} ${dateRange.description}`;\n }\n\n return labels.selectOption;\n };\n\n const formatDateRange = (description: string) => {\n // Check if description contains a date range (has \" - \" in it)\n if (description.includes(' - ') && isRTL) {\n // Split by \" - \" and reverse the order for RTL\n const parts = description.replace(/[()]/g, '').split(' - ');\n if (parts.length === 2) {\n return `(${parts[1]}-${parts[0]})`;\n }\n }\n return description;\n };\n\n const renderOptionWithDate = (option: { value: string; label: string }) => {\n const dateRange = getDateRangeForOption(option.value, locale.code);\n const formattedDescription = formatDateRange(dateRange.description);\n\n return (\n <Button\n key={option.value}\n variant='ghost'\n className={cn(\n ' w-full h-auto py-1 px-2 text-xs leading-tight justify-start',\n isRTL ? ' text-right' : ' text-left',\n internalValue?.predefinedValue === option.value && 'bg-accent',\n )}\n onClick={() => handlePredefinedSelect(option.value)}\n >\n <div className={cn('flex flex-col')}>\n <span className='font-medium'>{option.label}</span>\n <span className='text-[10px] text-muted-foreground' dir={locale.direction}>\n {formattedDescription}\n </span>\n </div>\n </Button>\n );\n };\n\n return (\n <div className={cn('useTw space-y-1', className)} dir={locale.direction} style={style}>\n {label && (\n <Label className={cn('useTw text-sm font-medium', isRTL && 'text-right block')}>\n {label}\n </Label>\n )}\n\n <div className='relative useTw'>\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild className='useTw'>\n <Button\n variant='outline'\n role='combobox'\n aria-expanded={isOpen}\n className='useTw w-full justify-between bg-background relative min-w-70'\n >\n <span className={`useTw truncate ${isRTL && 'text-right'}`}>{getDisplayValue()}</span>\n <ChevronDown className='useTw h-4 w-4 shrink-0 opacity-50' />\n </Button>\n </PopoverTrigger>\n <PopoverContent className='useTw w-80 p-0'>\n <div className='p-4'>\n <div className='grid grid-cols-2 gap-4'>\n {/* Future Options - Left column */}\n <div className='space-y-1'>\n <div\n className={cn(\n 'text-sm font-semibold text-muted-foreground mb-2',\n isRTL && 'text-right',\n )}\n >\n {labels.future}\n </div>\n <div className='space-y-0.5'>\n {futureOptions.map((option) => (\n <div key={option.value}>{renderOptionWithDate(option)}</div>\n ))}\n </div>\n </div>\n\n {/* Past Options - Right column */}\n <div className='space-y-1'>\n <div\n className={cn(\n 'text-sm font-semibold text-muted-foreground mb-2',\n isRTL && 'text-right',\n )}\n >\n {labels.past}\n </div>\n <div className='space-y-0.5'>\n {pastOptions.map((option) => (\n <div key={option.value}>{renderOptionWithDate(option)}</div>\n ))}\n </div>\n </div>\n </div>\n\n <Separator className='my-4' />\n\n {/* Custom Option */}\n <div className='space-y-3'>\n <Button\n variant='ghost'\n className={cn(\n 'useTw w-full justify-start h-auto py-2 px-2',\n (showCustom || internalValue?.type === 'custom') && 'bg-accent',\n isRTL && 'justify-start text-right',\n )}\n onClick={handleCustomSelect}\n >\n {labels.custom}\n </Button>\n\n {/* Custom Date Range - appears next to custom label */}\n {showCustom && (\n <div className='space-y-3 pl-2'>\n <div className='grid grid-cols-1 gap-3'>\n {/* From Date */}\n <div className={cn('flex items-center gap-2')}>\n <Label className={cn('useTw text-xs w-[20%]', isRTL && 'text-right')}>\n {labels.from}\n </Label>\n <Popover open={openFromCalendar} onOpenChange={setOpenFromCalendar}>\n <PopoverTrigger asChild className='useTw'>\n <Button\n variant='outline'\n className={cn(\n 'useTw w-[60%] justify-start text-left font-normal text-xs h-8 bg-background',\n !customRange.from && 'text-muted-foreground',\n )}\n >\n <CalendarIcon className='useTw mr-1 h-3 w-3' />\n <span dir={locale.direction}>\n {customRange.from\n ? formatDate(customRange.from, 'dd/MM/yyyy')\n : labels.selectDate}\n </span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className='useTw w-auto p-0' align='start'>\n <Calendar\n mode='single'\n selected={customRange.from}\n onSelect={(date) => {\n handleCustomRangeChange({ ...customRange, from: date });\n setOpenFromCalendar(false);\n }}\n initialFocus\n className='useTw'\n />\n </PopoverContent>\n </Popover>\n </div>\n\n {/* To Date */}\n <div className={cn('flex items-center gap-2')}>\n <Label className={cn('useTw text-xs w-[20%]', isRTL && 'text-right')}>\n {labels.to}\n </Label>\n <Popover open={openToCalendar} onOpenChange={setOpenToCalendar}>\n <PopoverTrigger asChild className='useTw'>\n <Button\n variant='outline'\n className={cn(\n 'useTw w-[60%] justify-start text-left font-normal text-xs h-8 bg-background',\n !customRange.to && 'text-muted-foreground',\n )}\n >\n <CalendarIcon className='useTw mr-1 h-3 w-3' />\n <span dir={locale.direction}>\n {customRange.to\n ? formatDate(customRange.to, 'dd/MM/yyyy')\n : labels.selectDate}\n </span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className='useTw w-auto p-0' align='start'>\n <Calendar\n mode='single'\n selected={customRange.to}\n onSelect={(date) => {\n handleCustomRangeChange({ ...customRange, to: date });\n setOpenToCalendar(false);\n }}\n initialFocus\n className='useTw'\n />\n </PopoverContent>\n </Popover>\n </div>\n </div>\n\n {/* Action Buttons */}\n <div className='flex gap-2'>\n <Button\n onClick={handleApplyCustomRange}\n className='useTw flex-1 text-xs h-8'\n disabled={!customRange.from && !customRange.to}\n >\n {labels.apply}\n </Button>\n <Button\n onClick={handleCancelCustomRange}\n variant='outline'\n className='useTw flex-1 text-xs h-8 bg-transparent'\n >\n {labels.cancel}\n </Button>\n </div>\n </div>\n )}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n {hasValue() && (\n <button\n className={`useTw absolute ${isRTL ? 'left-8' : 'right-8'} top-1/2 -translate-y-1/2 h-4 w-4 p-0 hover:bg-muted rounded-sm flex items-center justify-center z-10 `}\n onClick={(e) => {\n e.stopPropagation();\n handleClearAll();\n }}\n >\n <X className='useTw h-3 w-3' />\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"names":["useEffect","useState","CalendarIcon","ChevronDown","X","formatDate","getDateRangeForOption","Button","cn","Label","Popover","PopoverContent","PopoverTrigger","Separator","Calendar","getDateFilterOptions","getLabel","DateFilter","label","value","onChange","locale","code","direction","className","style","internalValue","setInternalValue","customRange","setCustomRange","from","undefined","to","showCustom","setShowCustom","isOpen","setIsOpen","openFromCalendar","setOpenFromCalendar","openToCalendar","setOpenToCalendar","isRTL","localeCode","pastOptions","futureOptions","type","labels","selectOption","selectDate","past","future","custom","apply","cancel","handlePredefinedSelect","optionValue","dateRange","newValue","predefinedValue","handleCustomSelect","handleCustomRangeChange","newRange","handleApplyCustomRange","handleCancelCustomRange","handleClearAll","hasValue","getDisplayValue","allOptions","option","find","opt","description","formatDateRange","includes","parts","replace","split","length","renderOptionWithDate","formattedDescription","variant","onClick","div","span","dir","open","onOpenChange","asChild","role","aria-expanded","map","align","mode","selected","onSelect","date","initialFocus","disabled","button","e","stopPropagation"],"mappings":"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"}
@@ -8,7 +8,8 @@ interface SelectFilterProps {
8
8
  locale?: Locale;
9
9
  className?: string;
10
10
  multiSelect?: boolean;
11
+ style?: React.CSSProperties;
11
12
  }
12
- export declare function SelectFilter({ label, options, value, onChange, placeholder, locale, className, multiSelect, }: SelectFilterProps): import("react").JSX.Element;
13
+ export declare function SelectFilter({ label, options, value, onChange, placeholder, locale, className, multiSelect, style, }: SelectFilterProps): import("react").JSX.Element;
13
14
  export {};
14
15
  //# sourceMappingURL=select-filter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"select-filter.d.ts","sourceRoot":"","sources":["../../../src/filters/components/select-filter.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAgBtF,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,WAAW,EACX,MAAyC,EACzC,SAAS,EACT,WAAkB,GACnB,EAAE,iBAAiB,+BAmMnB"}
1
+ {"version":3,"file":"select-filter.d.ts","sourceRoot":"","sources":["../../../src/filters/components/select-filter.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAiBtF,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,WAAW,EACX,MAAyC,EACzC,SAAS,EACT,WAAkB,EAClB,KAAK,GACN,EAAE,iBAAiB,+BAmMnB"}