@shefing/quickfilter 1.0.54 → 1.0.58
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.
- package/dist/QuickFilter.d.ts +1 -0
- package/dist/QuickFilter.d.ts.map +1 -1
- package/dist/QuickFilter.js +2 -2
- package/dist/QuickFilter.js.map +1 -1
- package/dist/filters/components/checkbox-filter.js +1 -1
- package/dist/filters/components/checkbox-filter.js.map +1 -1
- package/dist/filters/components/small-select-filter.js +1 -1
- package/dist/filters/components/small-select-filter.js.map +1 -1
- package/package.json +1 -1
package/dist/QuickFilter.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuickFilter.d.ts","sourceRoot":"","sources":["../src/QuickFilter.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"QuickFilter.d.ts","sourceRoot":"","sources":["../src/QuickFilter.tsx"],"names":[],"mappings":"AAyGA,QAAA,MAAM,WAAW,0BAGd;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,CAAC,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,EAAE,CAAA;CAChF,gCAgTA,CAAA;AAED,eAAe,WAAW,CAAA"}
|
package/dist/QuickFilter.js
CHANGED
|
@@ -22,7 +22,7 @@ const getLocalizedLabel = (label, locale)=>{
|
|
|
22
22
|
function findFieldsByName(fields, fieldNames) {
|
|
23
23
|
const results = [];
|
|
24
24
|
function recursiveSearch(currentFields) {
|
|
25
|
-
const filteredFields = currentFields.filter((field)=>'name' in field && fieldNames.includes(field.name));
|
|
25
|
+
const filteredFields = currentFields.filter((field)=>'name' in field && fieldNames.includes(field.name) || 'virtual' in field && fieldNames.includes(field.virtual));
|
|
26
26
|
results.push(...filteredFields);
|
|
27
27
|
currentFields.forEach((item)=>{
|
|
28
28
|
if ((item.type === 'array' || item.type === 'row' || item.type === 'collapsible') && 'fields' in item && Array.isArray(item.fields)) {
|
|
@@ -91,7 +91,7 @@ const QuickFilter = ({ slug, filterList })=>{
|
|
|
91
91
|
rowIndex,
|
|
92
92
|
fieldIndex
|
|
93
93
|
})));
|
|
94
|
-
const fieldNames = flattenedFieldConfigs.map(({ field })=>typeof field === 'string' ? field : field.name);
|
|
94
|
+
const fieldNames = flattenedFieldConfigs.map(({ field })=>typeof field === 'string' ? field : field.virtualName ? field.virtualName : field.name);
|
|
95
95
|
const matchedFields = findFieldsByName(collection?.fields || [], fieldNames);
|
|
96
96
|
const simplifiedFields = matchedFields.map((field)=>{
|
|
97
97
|
const label = field.label;
|
package/dist/QuickFilter.js.map
CHANGED
|
@@ -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, ListQuery, OptionObject, SelectField } from 'payload'\nimport { getTranslation } from '@payloadcms/translations'\nimport FilterField from './FilterField'\nimport { getLabel, SupportedLocale } from './labels'\nimport type {\n DateFilterValue,\n FilterDetaild,\n FilterRow,\n SelectFilterValue,\n} from './filters/types/filters-type'\nimport { groupFiltersByRow } from './filters/utils/layout-helpers'\nimport { ChevronDown, ChevronUp, Filter, RefreshCw, X } from 'lucide-react'\nimport { isEqual } from 'lodash'\nimport { getDateFilterOptions } from './filters/constants/date-filter-options'\nimport { Button } from './ui/button'\nimport {\n buildQuickFilterConditions,\n parseWhereClauseToFilterValues,\n} from './lib/utils'\n\n// Helper function to get localized label\nconst getLocalizedLabel = (label: any, locale: SupportedLocale): string => {\n if (typeof label === 'object' && label !== null) {\n return label[locale] || label['en'] || Object.values(label)[0] || ''\n }\n return label || ''\n}\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 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\nconst QuickFilter = ({\n slug,\n filterList,\n}: {\n slug: string\n filterList: (string | { name: string; width: string })[][]\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\n const [filterValues, setFilterValues] = useState<Record<string, any>>({})\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 virtual: 'virtual' in field ? (field.virtual as string | boolean) : undefined,\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 const valuesFromQuery: Record<string, any> = parseWhereClauseToFilterValues(\n query.where,\n fields,\n locale,\n )\n if (!isEqual(filterValues, valuesFromQuery)) {\n // Lock to prevent feedback loop when internal state changes\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 (fields.length === 0) return\n const valuesFromQuery: Record<string, any> = parseWhereClauseToFilterValues(\n query.where,\n fields,\n locale,\n )\n if (Object.keys(filterValues).length == 0 && !query.where) {\n }\n if (isEqual(filterValues, valuesFromQuery)) {\n return\n }\n const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, locale)\n const quickFilterFieldNames = new Set(\n fields.map((f) => {\n let name = f.name\n if (typeof f.virtual === 'string') {\n name = f.virtual\n }\n return name\n }),\n )\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) || (Object.keys(newWhere).length == 0 && !query.where))) {\n const refinedData = {\n where: newWhere,\n page: 1,\n } as ListQuery\n\n refineListData(refinedData).then((r) => {\n console.log('Query refreshed', refinedData)\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterValues])\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) => {\n let name = f.name\n if (typeof f.virtual === 'string') {\n name = f.virtual\n }\n return name === fieldName\n })\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 ? getLocalizedLabel(selectedOption.label, locale)\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 refreshFilters = () => {\n refineListData(query)\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 let fieldName = field.name\n if (typeof field.virtual === 'string') {\n fieldName = field.virtual\n }\n return (\n <FilterField\n key={field.name}\n field={field}\n onFilterChange={handleFilterChange}\n value={filterValues[fieldName]}\n />\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 <span\n onClick={(e) => {\n e.stopPropagation()\n refreshFilters()\n }}\n className=\"ml-1 p-0.5 hover:bg-muted rounded-sm transition-colors flex-shrink-0\"\n >\n <RefreshCw 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","useState","useConfig","useListQuery","useTranslation","getTranslation","FilterField","getLabel","groupFiltersByRow","ChevronDown","ChevronUp","Filter","RefreshCw","X","isEqual","getDateFilterOptions","Button","buildQuickFilterConditions","parseWhereClauseToFilterValues","getLocalizedLabel","label","locale","Object","values","findFieldsByName","fields","fieldNames","results","recursiveSearch","currentFields","filteredFields","filter","field","includes","name","push","forEach","item","type","Array","isArray","tabs","tab","blocks","block","cleanWhereClause","clause","fieldsToClean","newClause","key","cleanedSubClauses","map","subClause","Boolean","length","has","keys","and","or","QuickFilter","slug","filterList","setFields","filterRows","setFilterRows","showFilters","setShowFilters","refineListData","query","getEntityConfig","i18n","language","filterValues","setFilterValues","collection","collectionSlug","flattenedFieldConfigs","flatMap","row","rowIndex","fieldIndex","matchedFields","simplifiedFields","translatedLabel","fieldName","fieldConfig","find","f","options","virtual","undefined","width","sortedFields","valuesFromQuery","where","quickFilterConditions","quickFilterFieldNames","Set","otherFilters","allConditions","newWhere","refinedData","page","then","r","console","log","handleFilterChange","value","prev","newValues","getActiveFiltersDetails","activeFilters","entries","dateValue","dateDescription","predefinedValue","pastOptions","futureOptions","allOptions","option","opt","customRange","selectValue","selectedValues","totalOptions","selectedOption","optionLabel","checkboxValue","clearAllFilters","refreshFilters","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, useState } from 'react'\nimport { useConfig, useListQuery, useTranslation } from '@payloadcms/ui'\nimport type { ClientField, FieldAffectingData, ListQuery, OptionObject, SelectField } from 'payload'\nimport { getTranslation } from '@payloadcms/translations'\nimport FilterField from './FilterField'\nimport { getLabel, SupportedLocale } from './labels'\nimport type {\n DateFilterValue,\n FilterDetaild,\n FilterRow,\n SelectFilterValue,\n} from './filters/types/filters-type'\nimport { groupFiltersByRow } from './filters/utils/layout-helpers'\nimport { ChevronDown, ChevronUp, Filter, RefreshCw, X } from 'lucide-react'\nimport { isEqual } from 'lodash'\nimport { getDateFilterOptions } from './filters/constants/date-filter-options'\nimport { Button } from './ui/button'\nimport {\n buildQuickFilterConditions,\n parseWhereClauseToFilterValues,\n} from './lib/utils'\n\n// Helper function to get localized label\nconst getLocalizedLabel = (label: any, locale: SupportedLocale): string => {\n if (typeof label === 'object' && label !== null) {\n return label[locale] || label['en'] || Object.values(label)[0] || ''\n }\n return label || ''\n}\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) =>\n ('name' in field && fieldNames.includes(field.name as string)) ||\n ('virtual' in field &&\n fieldNames.includes(field.virtual 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 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\nconst QuickFilter = ({\n slug,\n filterList,\n}: {\n slug: string\n filterList: (string | { name: string; width: string; virtualName: string })[][]\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\n const [filterValues, setFilterValues] = useState<Record<string, any>>({})\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.virtualName ? field.virtualName : field.name,\n )\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 virtual: 'virtual' in field ? (field.virtual as string | boolean) : undefined,\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 const valuesFromQuery: Record<string, any> = parseWhereClauseToFilterValues(\n query.where,\n fields,\n locale,\n )\n if (!isEqual(filterValues, valuesFromQuery)) {\n // Lock to prevent feedback loop when internal state changes\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 (fields.length === 0) return\n const valuesFromQuery: Record<string, any> = parseWhereClauseToFilterValues(\n query.where,\n fields,\n locale,\n )\n if (Object.keys(filterValues).length == 0 && !query.where) {\n }\n if (isEqual(filterValues, valuesFromQuery)) {\n return\n }\n const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, locale)\n const quickFilterFieldNames = new Set(\n fields.map((f) => {\n let name = f.name\n if (typeof f.virtual === 'string') {\n name = f.virtual\n }\n return name\n }),\n )\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) || (Object.keys(newWhere).length == 0 && !query.where))) {\n const refinedData = {\n where: newWhere,\n page: 1,\n } as ListQuery\n\n refineListData(refinedData).then((r) => {\n console.log('Query refreshed', refinedData)\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterValues])\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) => {\n let name = f.name\n if (typeof f.virtual === 'string') {\n name = f.virtual\n }\n return name === fieldName\n })\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 ? getLocalizedLabel(selectedOption.label, locale)\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 refreshFilters = () => {\n refineListData(query)\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 let fieldName = field.name\n if (typeof field.virtual === 'string') {\n fieldName = field.virtual\n }\n return (\n <FilterField\n key={field.name}\n field={field}\n onFilterChange={handleFilterChange}\n value={filterValues[fieldName]}\n />\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 <span\n onClick={(e) => {\n e.stopPropagation()\n refreshFilters()\n }}\n className=\"ml-1 p-0.5 hover:bg-muted rounded-sm transition-colors flex-shrink-0\"\n >\n <RefreshCw 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","useState","useConfig","useListQuery","useTranslation","getTranslation","FilterField","getLabel","groupFiltersByRow","ChevronDown","ChevronUp","Filter","RefreshCw","X","isEqual","getDateFilterOptions","Button","buildQuickFilterConditions","parseWhereClauseToFilterValues","getLocalizedLabel","label","locale","Object","values","findFieldsByName","fields","fieldNames","results","recursiveSearch","currentFields","filteredFields","filter","field","includes","name","virtual","push","forEach","item","type","Array","isArray","tabs","tab","blocks","block","cleanWhereClause","clause","fieldsToClean","newClause","key","cleanedSubClauses","map","subClause","Boolean","length","has","keys","and","or","QuickFilter","slug","filterList","setFields","filterRows","setFilterRows","showFilters","setShowFilters","refineListData","query","getEntityConfig","i18n","language","filterValues","setFilterValues","collection","collectionSlug","flattenedFieldConfigs","flatMap","row","rowIndex","fieldIndex","virtualName","matchedFields","simplifiedFields","translatedLabel","fieldName","fieldConfig","find","f","options","undefined","width","sortedFields","valuesFromQuery","where","quickFilterConditions","quickFilterFieldNames","Set","otherFilters","allConditions","newWhere","refinedData","page","then","r","console","log","handleFilterChange","value","prev","newValues","getActiveFiltersDetails","activeFilters","entries","dateValue","dateDescription","predefinedValue","pastOptions","futureOptions","allOptions","option","opt","customRange","selectValue","selectedValues","totalOptions","selectedOption","optionLabel","checkboxValue","clearAllFilters","refreshFilters","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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"}
|
|
@@ -41,7 +41,7 @@ export function CheckboxFilter({ label, checkboxLabel, value = 'indeterminate',
|
|
|
41
41
|
children: label
|
|
42
42
|
}),
|
|
43
43
|
/*#__PURE__*/ _jsxs("div", {
|
|
44
|
-
className: cn('flex items-center gap-
|
|
44
|
+
className: cn('flex items-center gap-1 transition-colors py-px', locale.direction === 'rtl' && 'justify-start'),
|
|
45
45
|
children: [
|
|
46
46
|
/*#__PURE__*/ _jsx("div", {
|
|
47
47
|
className: cn('flex items-center', locale.direction === 'rtl' && 'order-first'),
|
|
@@ -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 { 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-
|
|
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-1 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"}
|
|
@@ -88,7 +88,7 @@ export function SmallSelectFilter({ label, options, value, onChange, locale = {
|
|
|
88
88
|
children: label
|
|
89
89
|
}),
|
|
90
90
|
/*#__PURE__*/ _jsxs("div", {
|
|
91
|
-
className: cn('flex items-center gap-
|
|
91
|
+
className: cn('flex items-center gap-1 transition-colors py-0.5', locale.direction === 'rtl' && 'justify-start'),
|
|
92
92
|
children: [
|
|
93
93
|
/*#__PURE__*/ _jsx("div", {
|
|
94
94
|
className: cn('flex items-center', locale.direction === 'rtl' && 'order-first'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/filters/components/small-select-filter.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport { X } from 'lucide-react';\nimport { Locale, SelectFilterValue } from '../types/filters-type';\nimport { Label } from '../../ui/label';\nimport { cn } from '../../lib/utils';\nimport { Button } from '../../ui/button';\nimport { SupportedLocale } from '../../labels';\n\ninterface SmallSelectOption {\n value: string;\n label: string;\n}\n\ninterface SmallSelectFilterProps {\n label?: string;\n options: SmallSelectOption[];\n value?: SelectFilterValue;\n onChange: (value: SelectFilterValue) => void;\n locale?: Locale;\n className?: string;\n multiSelect?: boolean;\n maxOptions?: number;\n style?: React.CSSProperties;\n}\n\nexport function SmallSelectFilter({\n label,\n options,\n value,\n onChange,\n locale = { code: 'he', direction: 'rtl' },\n className,\n multiSelect = true,\n maxOptions = 3,\n style,\n}: SmallSelectFilterProps) {\n const [internalValue, setInternalValue] = useState<SelectFilterValue>(\n value || { type: 'none', selectedValues: [] },\n );\n\n const isRtl = locale?.direction === 'rtl';\n\n // Limit options to maxOptions\n const limitedOptions = options.slice(0, maxOptions);\n\n // Sync internal state with external value prop\n useEffect(() => {\n setInternalValue(value || { type: 'none', selectedValues: [] });\n }, [value]);\n\n const handleOptionToggle = (optionValue: string) => {\n let newSelectedValues: string[];\n\n if (multiSelect) {\n // Multiple selection mode - allow multiple choices\n if (internalValue.selectedValues.includes(optionValue)) {\n newSelectedValues = internalValue.selectedValues.filter((val) => val !== optionValue);\n } else {\n newSelectedValues = [...internalValue.selectedValues, optionValue];\n }\n } else {\n // Single selection mode\n if (internalValue.selectedValues.includes(optionValue)) {\n newSelectedValues = []; // Deselect if already selected\n } else {\n newSelectedValues = [optionValue]; // Select only this option\n }\n }\n\n const newValue: SelectFilterValue = {\n type:\n newSelectedValues.length === 0\n ? 'none'\n : newSelectedValues.length === options.length\n ? 'all'\n : 'some',\n selectedValues: newSelectedValues,\n };\n setInternalValue(newValue);\n onChange(newValue);\n };\n\n const handleClear = () => {\n const newValue: SelectFilterValue = { type: 'none', selectedValues: [] };\n setInternalValue(newValue);\n onChange(newValue);\n };\n\n const hasSelection = internalValue.selectedValues.length > 0;\n\n const isOptionSelected = (optionValue: string) => {\n return internalValue.selectedValues.includes(optionValue);\n };\n\n const getButtonColor = (optionValue: string, index: number) => {\n if (!isOptionSelected(optionValue)) {\n return 'useTw bg-background text-muted-foreground hover:bg-muted';\n }\n\n // Different colors for different options when selected\n const colors = [\n 'bg-blue-600 text-white hover:bg-blue-700', // First option - blue\n 'bg-green-600 text-white hover:bg-green-700', // Second option - green\n 'bg-purple-600 text-white hover:bg-purple-700', // Third option - purple\n ];\n return colors[index] || 'bg-accent text-accent-foreground hover:bg-accent/80';\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-
|
|
1
|
+
{"version":3,"sources":["../../../src/filters/components/small-select-filter.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport { X } from 'lucide-react';\nimport { Locale, SelectFilterValue } from '../types/filters-type';\nimport { Label } from '../../ui/label';\nimport { cn } from '../../lib/utils';\nimport { Button } from '../../ui/button';\nimport { SupportedLocale } from '../../labels';\n\ninterface SmallSelectOption {\n value: string;\n label: string;\n}\n\ninterface SmallSelectFilterProps {\n label?: string;\n options: SmallSelectOption[];\n value?: SelectFilterValue;\n onChange: (value: SelectFilterValue) => void;\n locale?: Locale;\n className?: string;\n multiSelect?: boolean;\n maxOptions?: number;\n style?: React.CSSProperties;\n}\n\nexport function SmallSelectFilter({\n label,\n options,\n value,\n onChange,\n locale = { code: 'he', direction: 'rtl' },\n className,\n multiSelect = true,\n maxOptions = 3,\n style,\n}: SmallSelectFilterProps) {\n const [internalValue, setInternalValue] = useState<SelectFilterValue>(\n value || { type: 'none', selectedValues: [] },\n );\n\n const isRtl = locale?.direction === 'rtl';\n\n // Limit options to maxOptions\n const limitedOptions = options.slice(0, maxOptions);\n\n // Sync internal state with external value prop\n useEffect(() => {\n setInternalValue(value || { type: 'none', selectedValues: [] });\n }, [value]);\n\n const handleOptionToggle = (optionValue: string) => {\n let newSelectedValues: string[];\n\n if (multiSelect) {\n // Multiple selection mode - allow multiple choices\n if (internalValue.selectedValues.includes(optionValue)) {\n newSelectedValues = internalValue.selectedValues.filter((val) => val !== optionValue);\n } else {\n newSelectedValues = [...internalValue.selectedValues, optionValue];\n }\n } else {\n // Single selection mode\n if (internalValue.selectedValues.includes(optionValue)) {\n newSelectedValues = []; // Deselect if already selected\n } else {\n newSelectedValues = [optionValue]; // Select only this option\n }\n }\n\n const newValue: SelectFilterValue = {\n type:\n newSelectedValues.length === 0\n ? 'none'\n : newSelectedValues.length === options.length\n ? 'all'\n : 'some',\n selectedValues: newSelectedValues,\n };\n setInternalValue(newValue);\n onChange(newValue);\n };\n\n const handleClear = () => {\n const newValue: SelectFilterValue = { type: 'none', selectedValues: [] };\n setInternalValue(newValue);\n onChange(newValue);\n };\n\n const hasSelection = internalValue.selectedValues.length > 0;\n\n const isOptionSelected = (optionValue: string) => {\n return internalValue.selectedValues.includes(optionValue);\n };\n\n const getButtonColor = (optionValue: string, index: number) => {\n if (!isOptionSelected(optionValue)) {\n return 'useTw bg-background text-muted-foreground hover:bg-muted';\n }\n\n // Different colors for different options when selected\n const colors = [\n 'bg-blue-600 text-white hover:bg-blue-700', // First option - blue\n 'bg-green-600 text-white hover:bg-green-700', // Second option - green\n 'bg-purple-600 text-white hover:bg-purple-700', // Third option - purple\n ];\n return colors[index] || 'bg-accent text-accent-foreground hover:bg-accent/80';\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-1 transition-colors py-0.5',\n locale.direction === 'rtl' && 'justify-start',\n )}\n >\n <div className={cn('flex items-center', locale.direction === 'rtl' && 'order-first')}>\n {/* Toggle Options */}\n <div className='flex rounded-md border overflow-hidden'>\n {limitedOptions.map((option, index) => (\n <Button\n key={option.value}\n variant='ghost'\n size='sm'\n className={cn(\n 'px-3 py-1 text-xs rounded-none border-0',\n index > 0 && 'border-l',\n getButtonColor(option.value, index),\n )}\n onClick={() => handleOptionToggle(option.value)}\n >\n {option.label}\n </Button>\n ))}\n </div>\n </div>\n\n {hasSelection && (\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 -ml-1',\n locale.direction === 'rtl' ? 'order-last' : 'order-last',\n )}\n onClick={handleClear}\n >\n <X className='useTw h-3 w-3' />\n </Button>\n )}\n </div>\n </div>\n );\n}\n"],"names":["useEffect","useState","X","Label","cn","Button","SmallSelectFilter","label","options","value","onChange","locale","code","direction","className","multiSelect","maxOptions","style","internalValue","setInternalValue","type","selectedValues","isRtl","limitedOptions","slice","handleOptionToggle","optionValue","newSelectedValues","includes","filter","val","newValue","length","handleClear","hasSelection","isOptionSelected","getButtonColor","index","colors","div","dir","map","option","variant","size","onClick"],"mappings":"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"}
|