@shefing/quickfilter 1.0.0
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/README.md +0 -0
- package/dist/FilterField.d.ts +8 -0
- package/dist/FilterField.d.ts.map +1 -0
- package/dist/FilterField.js +87 -0
- package/dist/FilterField.js.map +1 -0
- package/dist/QuickFilter.d.ts +9 -0
- package/dist/QuickFilter.d.ts.map +1 -0
- package/dist/QuickFilter.js +331 -0
- package/dist/QuickFilter.js.map +1 -0
- package/dist/filters/components/checkbox-filter.d.ts +12 -0
- package/dist/filters/components/checkbox-filter.d.ts.map +1 -0
- package/dist/filters/components/checkbox-filter.js +104 -0
- package/dist/filters/components/checkbox-filter.js.map +1 -0
- package/dist/filters/components/date-filter.d.ts +11 -0
- package/dist/filters/components/date-filter.d.ts.map +1 -0
- package/dist/filters/components/date-filter.js +379 -0
- package/dist/filters/components/date-filter.js.map +1 -0
- package/dist/filters/components/select-filter.d.ts +14 -0
- package/dist/filters/components/select-filter.d.ts.map +1 -0
- package/dist/filters/components/select-filter.js +223 -0
- package/dist/filters/components/select-filter.js.map +1 -0
- package/dist/filters/components/small-select-filter.d.ts +18 -0
- package/dist/filters/components/small-select-filter.d.ts.map +1 -0
- package/dist/filters/components/small-select-filter.js +120 -0
- package/dist/filters/components/small-select-filter.js.map +1 -0
- package/dist/filters/constants/date-filter-options.d.ts +6 -0
- package/dist/filters/constants/date-filter-options.d.ts.map +1 -0
- package/dist/filters/constants/date-filter-options.js +74 -0
- package/dist/filters/constants/date-filter-options.js.map +1 -0
- package/dist/filters/types/filters-type.d.ts +99 -0
- package/dist/filters/types/filters-type.d.ts.map +1 -0
- package/dist/filters/types/filters-type.js +3 -0
- package/dist/filters/types/filters-type.js.map +1 -0
- package/dist/filters/utils/date-helpers.d.ts +23 -0
- package/dist/filters/utils/date-helpers.d.ts.map +1 -0
- package/dist/filters/utils/date-helpers.js +159 -0
- package/dist/filters/utils/date-helpers.js.map +1 -0
- package/dist/filters/utils/layout-helpers.d.ts +6 -0
- package/dist/filters/utils/layout-helpers.d.ts.map +1 -0
- package/dist/filters/utils/layout-helpers.js +73 -0
- package/dist/filters/utils/layout-helpers.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +18 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/badge.d.ts +10 -0
- package/dist/ui/badge.d.ts.map +1 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +1 -0
- package/dist/ui/button.d.ts +12 -0
- package/dist/ui/button.d.ts.map +1 -0
- package/dist/ui/button.js +45 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/calendar.d.ts +9 -0
- package/dist/ui/calendar.d.ts.map +1 -0
- package/dist/ui/calendar.js +126 -0
- package/dist/ui/calendar.js.map +1 -0
- package/dist/ui/checkbox.d.ts +5 -0
- package/dist/ui/checkbox.d.ts.map +1 -0
- package/dist/ui/checkbox.js +21 -0
- package/dist/ui/checkbox.js.map +1 -0
- package/dist/ui/command.d.ts +81 -0
- package/dist/ui/command.d.ts.map +1 -0
- package/dist/ui/command.js +80 -0
- package/dist/ui/command.js.map +1 -0
- package/dist/ui/dialog.d.ts +20 -0
- package/dist/ui/dialog.d.ts.map +1 -0
- package/dist/ui/dialog.js +61 -0
- package/dist/ui/dialog.js.map +1 -0
- package/dist/ui/label.d.ts +6 -0
- package/dist/ui/label.d.ts.map +1 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +1 -0
- package/dist/ui/popover.d.ts +7 -0
- package/dist/ui/popover.d.ts.map +1 -0
- package/dist/ui/popover.js +20 -0
- package/dist/ui/popover.js.map +1 -0
- package/dist/ui/separator.d.ts +5 -0
- package/dist/ui/separator.d.ts.map +1 -0
- package/dist/ui/separator.js +16 -0
- package/dist/ui/separator.js.map +1 -0
- package/package.json +69 -0
package/README.md
ADDED
|
File without changes
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
declare const FilterField: ({ field, onFilterChange, value: controlledValue, }: {
|
|
3
|
+
field: any;
|
|
4
|
+
onFilterChange: (fieldName: string, value: any) => void;
|
|
5
|
+
value: any;
|
|
6
|
+
}) => React.JSX.Element;
|
|
7
|
+
export default FilterField;
|
|
8
|
+
//# sourceMappingURL=FilterField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterField.d.ts","sourceRoot":"","sources":["../src/FilterField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAsB,MAAM,OAAO,CAAA;AAU1C,QAAA,MAAM,WAAW,uDAId;IACD,KAAK,EAAE,GAAG,CAAA;IACV,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;IACvD,KAAK,EAAE,GAAG,CAAA;CACX,sBAsFA,CAAA;AAED,eAAe,WAAW,CAAA"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// FilterField.tsx (הקובץ המתוקן)
|
|
2
|
+
'use client';
|
|
3
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
4
|
+
import React, { useCallback } from 'react';
|
|
5
|
+
import { useTranslation } from '@payloadcms/ui';
|
|
6
|
+
import { rtlLanguages } from '@payloadcms/translations';
|
|
7
|
+
import { DateFilter } from './filters/components/date-filter';
|
|
8
|
+
import { SmallSelectFilter } from './filters/components/small-select-filter';
|
|
9
|
+
import { SelectFilter } from './filters/components/select-filter';
|
|
10
|
+
import { CheckboxFilter } from './filters/components/checkbox-filter';
|
|
11
|
+
const FilterField = ({ field, onFilterChange, value: controlledValue })=>{
|
|
12
|
+
const { i18n } = useTranslation();
|
|
13
|
+
const localeLang = i18n.language;
|
|
14
|
+
const isRTL = rtlLanguages.includes(localeLang);
|
|
15
|
+
const direction = isRTL ? 'rtl' : 'ltr';
|
|
16
|
+
const userLocale = {
|
|
17
|
+
code: localeLang,
|
|
18
|
+
direction
|
|
19
|
+
};
|
|
20
|
+
const handleDateFilterChange = useCallback((value)=>{
|
|
21
|
+
onFilterChange(field.name, value);
|
|
22
|
+
}, [
|
|
23
|
+
onFilterChange,
|
|
24
|
+
field.name
|
|
25
|
+
]);
|
|
26
|
+
const handleSelectFilterChange = useCallback((value)=>{
|
|
27
|
+
onFilterChange(field.name, value);
|
|
28
|
+
}, [
|
|
29
|
+
onFilterChange,
|
|
30
|
+
field.name
|
|
31
|
+
]);
|
|
32
|
+
const handleCheckboxFilterChange = useCallback((state)=>{
|
|
33
|
+
onFilterChange(field.name, state);
|
|
34
|
+
}, [
|
|
35
|
+
onFilterChange,
|
|
36
|
+
field.name
|
|
37
|
+
]);
|
|
38
|
+
switch(field.type){
|
|
39
|
+
case 'date':
|
|
40
|
+
return /*#__PURE__*/ _jsx(DateFilter, {
|
|
41
|
+
label: field.label,
|
|
42
|
+
value: controlledValue,
|
|
43
|
+
onChange: handleDateFilterChange,
|
|
44
|
+
locale: userLocale,
|
|
45
|
+
className: ` w-[${field.width || '250px'}]`
|
|
46
|
+
}, field.name);
|
|
47
|
+
case 'select':
|
|
48
|
+
if (field.options.length <= 3) {
|
|
49
|
+
return /*#__PURE__*/ _jsx(SmallSelectFilter, {
|
|
50
|
+
label: field.label,
|
|
51
|
+
options: (field.options || []).map((option)=>({
|
|
52
|
+
label: option.label,
|
|
53
|
+
value: option.value
|
|
54
|
+
})),
|
|
55
|
+
onChange: handleSelectFilterChange,
|
|
56
|
+
value: controlledValue,
|
|
57
|
+
locale: userLocale,
|
|
58
|
+
className: ` w-[${field.width || '250px'}]`
|
|
59
|
+
}, field.name);
|
|
60
|
+
}
|
|
61
|
+
return /*#__PURE__*/ _jsx(SelectFilter, {
|
|
62
|
+
label: field.label,
|
|
63
|
+
options: (field.options || []).map((option)=>({
|
|
64
|
+
label: option.label,
|
|
65
|
+
value: option.value
|
|
66
|
+
})),
|
|
67
|
+
onChange: handleSelectFilterChange,
|
|
68
|
+
value: controlledValue,
|
|
69
|
+
locale: userLocale,
|
|
70
|
+
className: ` w-[${field.width || '250px'}]`
|
|
71
|
+
}, field.name);
|
|
72
|
+
case 'checkbox':
|
|
73
|
+
return /*#__PURE__*/ _jsx(CheckboxFilter, {
|
|
74
|
+
label: field.label,
|
|
75
|
+
onChange: handleCheckboxFilterChange,
|
|
76
|
+
value: controlledValue,
|
|
77
|
+
checkboxLabel: '',
|
|
78
|
+
locale: userLocale,
|
|
79
|
+
className: ` w-[${field.width || '250px'}]`
|
|
80
|
+
}, field.name);
|
|
81
|
+
default:
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
export default FilterField;
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=FilterField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/FilterField.tsx"],"sourcesContent":["// FilterField.tsx (הקובץ המתוקן)\n\n'use client'\nimport React, { useCallback } from 'react'\nimport { useTranslation } from '@payloadcms/ui'\nimport { rtlLanguages } from '@payloadcms/translations'\nimport { DateFilter } from './filters/components/date-filter'\nimport { Locale } from './filters/types/filters-type'\nimport { SmallSelectFilter } from './filters/components/small-select-filter'\nimport { SelectFilter } from './filters/components/select-filter'\nimport { CheckboxFilter } from './filters/components/checkbox-filter'\n\n\nconst FilterField = ({\n field,\n onFilterChange,\n value: controlledValue,\n}: {\n field: any\n onFilterChange: (fieldName: string, value: any) => void\n value: any\n}) => {\n const { i18n } = useTranslation()\n const localeLang = i18n.language\n const isRTL = (rtlLanguages as readonly string[]).includes(localeLang)\n const direction = isRTL ? 'rtl' : 'ltr'\n const userLocale = { code: localeLang, direction }\n\n const handleDateFilterChange = useCallback(\n (value: any) => {\n onFilterChange(field.name, value)\n },\n [onFilterChange, field.name],\n )\n\n const handleSelectFilterChange = useCallback(\n (value: any) => {\n onFilterChange(field.name, value)\n },\n [onFilterChange, field.name],\n )\n\n const handleCheckboxFilterChange = useCallback(\n (state: any) => {\n onFilterChange(field.name, state)\n },\n [onFilterChange, field.name],\n )\n\n switch (field.type) {\n case 'date':\n return (\n <DateFilter\n label={field.label}\n value={controlledValue}\n key={field.name}\n onChange={handleDateFilterChange}\n locale={userLocale as Locale}\n className={` w-[${field.width || '250px'}]`}\n />\n )\n case 'select':\n if (field.options.length <= 3) {\n return (\n <SmallSelectFilter\n label={field.label}\n key={field.name}\n options={(field.options || []).map((option: any) => ({\n label: option.label,\n value: option.value,\n }))}\n onChange={handleSelectFilterChange}\n value={controlledValue}\n locale={userLocale as Locale}\n className={` w-[${field.width || '250px'}]`}\n />\n )\n }\n return (\n <SelectFilter\n label={field.label}\n key={field.name}\n options={(field.options || []).map((option: any) => ({\n label: option.label,\n value: option.value,\n }))}\n onChange={handleSelectFilterChange}\n value={controlledValue}\n locale={userLocale as Locale}\n className={` w-[${field.width || '250px'}]`}\n />\n )\n case 'checkbox':\n return (\n <CheckboxFilter\n label={field.label}\n key={field.name}\n onChange={handleCheckboxFilterChange}\n value={controlledValue}\n checkboxLabel={''}\n locale={userLocale as Locale}\n className={` w-[${field.width || '250px'}]`}\n />\n )\n default:\n return null\n }\n}\n\nexport default FilterField\n"],"names":["React","useCallback","useTranslation","rtlLanguages","DateFilter","SmallSelectFilter","SelectFilter","CheckboxFilter","FilterField","field","onFilterChange","value","controlledValue","i18n","localeLang","language","isRTL","includes","direction","userLocale","code","handleDateFilterChange","name","handleSelectFilterChange","handleCheckboxFilterChange","state","type","label","onChange","locale","className","width","options","length","map","option","checkboxLabel"],"mappings":"AAAA,iCAAiC;AAEjC;;AACA,OAAOA,SAASC,WAAW,QAAQ,QAAO;AAC1C,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,SAASC,YAAY,QAAQ,2BAA0B;AACvD,SAASC,UAAU,QAAQ,mCAAkC;AAE7D,SAASC,iBAAiB,QAAQ,2CAA0C;AAC5E,SAASC,YAAY,QAAQ,qCAAoC;AACjE,SAASC,cAAc,QAAQ,uCAAsC;AAGrE,MAAMC,cAAc,CAAC,EACnBC,KAAK,EACLC,cAAc,EACdC,OAAOC,eAAe,EAKvB;IACC,MAAM,EAAEC,IAAI,EAAE,GAAGX;IACjB,MAAMY,aAAaD,KAAKE,QAAQ;IAChC,MAAMC,QAAQ,AAACb,aAAmCc,QAAQ,CAACH;IAC3D,MAAMI,YAAYF,QAAQ,QAAQ;IAClC,MAAMG,aAAa;QAAEC,MAAMN;QAAYI;IAAU;IAEjD,MAAMG,yBAAyBpB,YAC7B,CAACU;QACCD,eAAeD,MAAMa,IAAI,EAAEX;IAC7B,GACA;QAACD;QAAgBD,MAAMa,IAAI;KAAC;IAG9B,MAAMC,2BAA2BtB,YAC/B,CAACU;QACCD,eAAeD,MAAMa,IAAI,EAAEX;IAC7B,GACA;QAACD;QAAgBD,MAAMa,IAAI;KAAC;IAG9B,MAAME,6BAA6BvB,YACjC,CAACwB;QACCf,eAAeD,MAAMa,IAAI,EAAEG;IAC7B,GACA;QAACf;QAAgBD,MAAMa,IAAI;KAAC;IAG9B,OAAQb,MAAMiB,IAAI;QAChB,KAAK;YACH,qBACE,KAACtB;gBACCuB,OAAOlB,MAAMkB,KAAK;gBAClBhB,OAAOC;gBAEPgB,UAAUP;gBACVQ,QAAQV;gBACRW,WAAW,CAAC,IAAI,EAAErB,MAAMsB,KAAK,IAAI,QAAQ,CAAC,CAAC;eAHtCtB,MAAMa,IAAI;QAMrB,KAAK;YACH,IAAIb,MAAMuB,OAAO,CAACC,MAAM,IAAI,GAAG;gBAC7B,qBACE,KAAC5B;oBACCsB,OAAOlB,MAAMkB,KAAK;oBAElBK,SAAS,AAACvB,CAAAA,MAAMuB,OAAO,IAAI,EAAE,AAAD,EAAGE,GAAG,CAAC,CAACC,SAAiB,CAAA;4BACnDR,OAAOQ,OAAOR,KAAK;4BACnBhB,OAAOwB,OAAOxB,KAAK;wBACrB,CAAA;oBACAiB,UAAUL;oBACVZ,OAAOC;oBACPiB,QAAQV;oBACRW,WAAW,CAAC,IAAI,EAAErB,MAAMsB,KAAK,IAAI,QAAQ,CAAC,CAAC;mBARtCtB,MAAMa,IAAI;YAWrB;YACA,qBACE,KAAChB;gBACCqB,OAAOlB,MAAMkB,KAAK;gBAElBK,SAAS,AAACvB,CAAAA,MAAMuB,OAAO,IAAI,EAAE,AAAD,EAAGE,GAAG,CAAC,CAACC,SAAiB,CAAA;wBACnDR,OAAOQ,OAAOR,KAAK;wBACnBhB,OAAOwB,OAAOxB,KAAK;oBACrB,CAAA;gBACAiB,UAAUL;gBACVZ,OAAOC;gBACPiB,QAAQV;gBACRW,WAAW,CAAC,IAAI,EAAErB,MAAMsB,KAAK,IAAI,QAAQ,CAAC,CAAC;eARtCtB,MAAMa,IAAI;QAWrB,KAAK;YACH,qBACE,KAACf;gBACCoB,OAAOlB,MAAMkB,KAAK;gBAElBC,UAAUJ;gBACVb,OAAOC;gBACPwB,eAAe;gBACfP,QAAQV;gBACRW,WAAW,CAAC,IAAI,EAAErB,MAAMsB,KAAK,IAAI,QAAQ,CAAC,CAAC;eALtCtB,MAAMa,IAAI;QAQrB;YACE,OAAO;IACX;AACF;AAEA,eAAed,YAAW"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QuickFilter.d.ts","sourceRoot":"","sources":["../src/QuickFilter.tsx"],"names":[],"mappings":"AA0GA,QAAA,MAAM,WAAW,0BAGd;IACD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,CAAC,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,EAAE,CAAC;CAC5D,gCA2OA,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
4
|
+
import { useConfig, useListQuery, useTranslation } from '@payloadcms/ui';
|
|
5
|
+
import { getTranslation } from '@payloadcms/translations';
|
|
6
|
+
import FilterField from './FilterField';
|
|
7
|
+
import { groupFiltersByRow, parseColumns } from './filters/utils/layout-helpers';
|
|
8
|
+
import { ChevronDown, ChevronUp, Filter, X } from 'lucide-react';
|
|
9
|
+
import { futureDateFilterOptions, pastDateFilterOptions } from './filters/constants/date-filter-options';
|
|
10
|
+
import { Button } from './ui/button';
|
|
11
|
+
// Recursive function to find fields by name
|
|
12
|
+
function findFieldsByName(fields, fieldNames) {
|
|
13
|
+
const results = [];
|
|
14
|
+
function recursiveSearch(currentFields) {
|
|
15
|
+
const filteredFields = currentFields.filter((field)=>'name' in field && fieldNames.includes(field.name));
|
|
16
|
+
results.push(...filteredFields);
|
|
17
|
+
currentFields.forEach((item)=>{
|
|
18
|
+
if ((item.type === 'array' || item.type === 'row' || item.type === 'collapsible') && 'fields' in item && Array.isArray(item.fields)) {
|
|
19
|
+
recursiveSearch(item.fields);
|
|
20
|
+
} else if (item.type === 'tabs' && Array.isArray(item.tabs)) {
|
|
21
|
+
item.tabs.forEach((tab)=>{
|
|
22
|
+
if ('fields' in tab && Array.isArray(tab.fields)) {
|
|
23
|
+
recursiveSearch(tab.fields);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
} else if (item.type === 'blocks' && Array.isArray(item.blocks)) {
|
|
27
|
+
item.blocks.forEach((block)=>{
|
|
28
|
+
if ('fields' in block && Array.isArray(block.fields)) {
|
|
29
|
+
recursiveSearch(block.fields);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
recursiveSearch(fields);
|
|
36
|
+
return results;
|
|
37
|
+
}
|
|
38
|
+
// Helper function to convert UI state to a where query
|
|
39
|
+
const buildWhereClause = (values, fieldDefs)=>{
|
|
40
|
+
const where = {};
|
|
41
|
+
Object.entries(values).forEach(([fieldName, value])=>{
|
|
42
|
+
if (!value) return;
|
|
43
|
+
const fieldDef = fieldDefs.find((f)=>f.name === fieldName);
|
|
44
|
+
if (!fieldDef) return;
|
|
45
|
+
switch(fieldDef.type){
|
|
46
|
+
case 'date':
|
|
47
|
+
{
|
|
48
|
+
const dateValue = value;
|
|
49
|
+
if (dateValue.customRange) {
|
|
50
|
+
const { from, to } = dateValue.customRange;
|
|
51
|
+
const dateQuery = {};
|
|
52
|
+
if (from) dateQuery.greater_than_equal = from;
|
|
53
|
+
if (to) dateQuery.less_than_equal = to;
|
|
54
|
+
if (Object.keys(dateQuery).length > 0) {
|
|
55
|
+
where[fieldName] = dateQuery;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case 'select':
|
|
61
|
+
{
|
|
62
|
+
const selectValue = value;
|
|
63
|
+
if (selectValue.selectedValues && selectValue.selectedValues.length > 0) {
|
|
64
|
+
if (selectValue.selectedValues.length === 1) {
|
|
65
|
+
where[fieldName] = {
|
|
66
|
+
equals: selectValue.selectedValues[0]
|
|
67
|
+
};
|
|
68
|
+
} else {
|
|
69
|
+
where[fieldName] = {
|
|
70
|
+
in: selectValue.selectedValues
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
case 'checkbox':
|
|
77
|
+
{
|
|
78
|
+
const checkboxState = value;
|
|
79
|
+
if (checkboxState === 'checked') {
|
|
80
|
+
where[fieldName] = {
|
|
81
|
+
equals: true
|
|
82
|
+
};
|
|
83
|
+
} else if (checkboxState === 'unchecked') {
|
|
84
|
+
where[fieldName] = {
|
|
85
|
+
equals: false
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return where;
|
|
93
|
+
};
|
|
94
|
+
const QuickFilter = ({ slug, filterList })=>{
|
|
95
|
+
const localStorageKey = useMemo(()=>`direct-filter-${slug}`, [
|
|
96
|
+
slug
|
|
97
|
+
]);
|
|
98
|
+
const [fields, setFields] = useState([]);
|
|
99
|
+
const [filterRows, setFilterRows] = useState([]);
|
|
100
|
+
const [showFilters, setShowFilters] = useState(false);
|
|
101
|
+
const { refineListData, query } = useListQuery();
|
|
102
|
+
const { getEntityConfig } = useConfig();
|
|
103
|
+
const { i18n } = useTranslation();
|
|
104
|
+
const [filterValues, setFilterValues] = useState(()=>{
|
|
105
|
+
try {
|
|
106
|
+
const item = window.localStorage.getItem(localStorageKey);
|
|
107
|
+
return item ? JSON.parse(item) : {};
|
|
108
|
+
} catch (error) {
|
|
109
|
+
console.error('Error reading filters from localStorage.', error);
|
|
110
|
+
return {};
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
useEffect(()=>{
|
|
114
|
+
const collection = getEntityConfig({
|
|
115
|
+
collectionSlug: slug
|
|
116
|
+
});
|
|
117
|
+
const flattenedFieldConfigs = filterList.flatMap((row, rowIndex)=>row.map((field, fieldIndex)=>({
|
|
118
|
+
field,
|
|
119
|
+
rowIndex,
|
|
120
|
+
fieldIndex
|
|
121
|
+
})));
|
|
122
|
+
const fieldNames = flattenedFieldConfigs.map(({ field })=>typeof field === 'string' ? field : field.name);
|
|
123
|
+
const matchedFields = findFieldsByName(collection?.fields || [], fieldNames);
|
|
124
|
+
const simplifiedFields = matchedFields.map((field)=>{
|
|
125
|
+
const label = field.label;
|
|
126
|
+
const translatedLabel = getTranslation(label, i18n);
|
|
127
|
+
const fieldName = field.name;
|
|
128
|
+
const fieldConfig = flattenedFieldConfigs.find(({ field: f })=>typeof f === 'string' ? f === fieldName : f.name === fieldName);
|
|
129
|
+
return {
|
|
130
|
+
name: fieldName,
|
|
131
|
+
label: translatedLabel,
|
|
132
|
+
type: field.type,
|
|
133
|
+
options: field.options,
|
|
134
|
+
row: fieldConfig ? fieldConfig.rowIndex : 0,
|
|
135
|
+
width: typeof fieldConfig?.field === 'object' && 'width' in fieldConfig.field ? fieldConfig.field.width : undefined
|
|
136
|
+
};
|
|
137
|
+
});
|
|
138
|
+
const sortedFields = flattenedFieldConfigs.map(({ field })=>{
|
|
139
|
+
const fieldName = typeof field === 'string' ? field : field.name;
|
|
140
|
+
return simplifiedFields.find((f)=>f.name === fieldName);
|
|
141
|
+
}).filter((f)=>!!f);
|
|
142
|
+
setFields(sortedFields);
|
|
143
|
+
setFilterRows(groupFiltersByRow(sortedFields));
|
|
144
|
+
}, [
|
|
145
|
+
slug,
|
|
146
|
+
filterList,
|
|
147
|
+
getEntityConfig,
|
|
148
|
+
i18n
|
|
149
|
+
]);
|
|
150
|
+
useEffect(()=>{
|
|
151
|
+
// Wait until field metadata has been loaded.
|
|
152
|
+
if (fields.length === 0) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const where = buildWhereClause(filterValues, fields);
|
|
156
|
+
try {
|
|
157
|
+
if (Object.keys(filterValues).length > 0) {
|
|
158
|
+
localStorage.setItem(localStorageKey, JSON.stringify(filterValues));
|
|
159
|
+
} else {
|
|
160
|
+
localStorage.removeItem(localStorageKey);
|
|
161
|
+
}
|
|
162
|
+
} catch (error) {
|
|
163
|
+
console.error('Failed to save filters to localStorage', error);
|
|
164
|
+
}
|
|
165
|
+
if (JSON.stringify(where) !== JSON.stringify(query.where)) {
|
|
166
|
+
refineListData({
|
|
167
|
+
columns: parseColumns(query.columns),
|
|
168
|
+
where,
|
|
169
|
+
page: '1'
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}, [
|
|
173
|
+
filterValues,
|
|
174
|
+
fields,
|
|
175
|
+
query,
|
|
176
|
+
refineListData,
|
|
177
|
+
localStorageKey
|
|
178
|
+
]);
|
|
179
|
+
const handleFilterChange = useCallback((fieldName, value)=>{
|
|
180
|
+
setFilterValues((prev)=>{
|
|
181
|
+
const newValues = {
|
|
182
|
+
...prev
|
|
183
|
+
};
|
|
184
|
+
if (value === undefined || value === null || value === 'indeterminate' || value && value.type === 'none') {
|
|
185
|
+
delete newValues[fieldName];
|
|
186
|
+
} else {
|
|
187
|
+
newValues[fieldName] = value;
|
|
188
|
+
}
|
|
189
|
+
return newValues;
|
|
190
|
+
});
|
|
191
|
+
}, []);
|
|
192
|
+
// This function remains largely the same.
|
|
193
|
+
const getActiveFiltersDetails = ()=>{
|
|
194
|
+
const activeFilters = [];
|
|
195
|
+
const isHebrew = i18n.language === 'he';
|
|
196
|
+
Object.entries(filterValues).forEach(([fieldName, value])=>{
|
|
197
|
+
const field = fields.find((f)=>f.name === fieldName);
|
|
198
|
+
if (!field) return;
|
|
199
|
+
switch(field.type){
|
|
200
|
+
case 'date':
|
|
201
|
+
if (value !== undefined) {
|
|
202
|
+
const dateValue = value;
|
|
203
|
+
let dateDescription = '';
|
|
204
|
+
if (dateValue.type === 'predefined' && dateValue.predefinedValue) {
|
|
205
|
+
const allOptions = [
|
|
206
|
+
...pastDateFilterOptions,
|
|
207
|
+
...futureDateFilterOptions
|
|
208
|
+
];
|
|
209
|
+
const option = allOptions.find((opt)=>opt.value === dateValue.predefinedValue);
|
|
210
|
+
dateDescription = option ? option.label : isHebrew ? 'מותאם אישית' : 'Custom';
|
|
211
|
+
} else if (dateValue.type === 'custom' || dateValue.customRange) {
|
|
212
|
+
dateDescription = isHebrew ? 'מותאם אישית' : 'Custom';
|
|
213
|
+
}
|
|
214
|
+
if (dateDescription) {
|
|
215
|
+
activeFilters.push(`${field.label} (${dateDescription})`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
break;
|
|
219
|
+
case 'select':
|
|
220
|
+
{
|
|
221
|
+
const selectValue = value;
|
|
222
|
+
if (selectValue && selectValue.selectedValues && selectValue.selectedValues.length > 0) {
|
|
223
|
+
const count = selectValue.selectedValues.length;
|
|
224
|
+
const totalOptions = field.options?.length || 0;
|
|
225
|
+
if (selectValue.selectedValues.length === totalOptions) {
|
|
226
|
+
activeFilters.push(`${field.label} (${isHebrew ? 'הכל' : 'All'})`);
|
|
227
|
+
} else {
|
|
228
|
+
activeFilters.push(`${field.label} (${count})`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
case 'checkbox':
|
|
234
|
+
if (value !== 'indeterminate') {
|
|
235
|
+
const checkboxValue = value === 'checked' ? isHebrew ? 'כן' : 'Yes' : isHebrew ? 'לא' : 'No';
|
|
236
|
+
activeFilters.push(`${field.label} (${checkboxValue})`);
|
|
237
|
+
}
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
return activeFilters;
|
|
242
|
+
};
|
|
243
|
+
const clearAllFilters = ()=>{
|
|
244
|
+
setFilterValues({});
|
|
245
|
+
};
|
|
246
|
+
const memoizedFilterRows = useMemo(()=>{
|
|
247
|
+
return filterRows.map((row)=>/*#__PURE__*/ _jsx("div", {
|
|
248
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
249
|
+
className: "flex flex-wrap gap-6 mb-4",
|
|
250
|
+
children: row.filters.map((field)=>/*#__PURE__*/ _jsx(FilterField, {
|
|
251
|
+
field: field,
|
|
252
|
+
onFilterChange: handleFilterChange,
|
|
253
|
+
value: filterValues[field.name]
|
|
254
|
+
}, field.name))
|
|
255
|
+
})
|
|
256
|
+
}, row.rowNumber));
|
|
257
|
+
}, [
|
|
258
|
+
filterRows,
|
|
259
|
+
handleFilterChange,
|
|
260
|
+
filterValues
|
|
261
|
+
]);
|
|
262
|
+
const toggleFilters = ()=>{
|
|
263
|
+
setShowFilters((prev)=>!prev);
|
|
264
|
+
};
|
|
265
|
+
const activeFiltersDetails = getActiveFiltersDetails();
|
|
266
|
+
const hasActiveFilters = activeFiltersDetails.length > 0;
|
|
267
|
+
const isHebrew = i18n.language === 'he';
|
|
268
|
+
if (!fields.length) return null;
|
|
269
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
270
|
+
className: "filter-container useTw",
|
|
271
|
+
children: [
|
|
272
|
+
/*#__PURE__*/ _jsx("div", {
|
|
273
|
+
style: {
|
|
274
|
+
position: 'relative',
|
|
275
|
+
top: '-24px',
|
|
276
|
+
height: '0px'
|
|
277
|
+
},
|
|
278
|
+
children: /*#__PURE__*/ _jsxs(Button, {
|
|
279
|
+
variant: "outline",
|
|
280
|
+
size: "sm",
|
|
281
|
+
onClick: toggleFilters,
|
|
282
|
+
className: `flex items-center gap-2 bg-background border-muted-muted hover:bg-muted ${hasActiveFilters ? 'w-auto min-w-fit' : ''}`,
|
|
283
|
+
children: [
|
|
284
|
+
/*#__PURE__*/ _jsx(Filter, {
|
|
285
|
+
className: `h-4 w-4 ${hasActiveFilters ? 'fill-current' : ''}`
|
|
286
|
+
}),
|
|
287
|
+
hasActiveFilters ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
288
|
+
children: [
|
|
289
|
+
/*#__PURE__*/ _jsxs("span", {
|
|
290
|
+
className: "text-sm truncate",
|
|
291
|
+
children: [
|
|
292
|
+
/*#__PURE__*/ _jsx("strong", {
|
|
293
|
+
children: isHebrew ? `${activeFiltersDetails.length === 1 ? 'סינון פעיל בעמודה' : 'סינון פעיל בעמודות'}: ` : `${activeFiltersDetails.length === 1 ? 'Active filter on column' : 'Active filters on columns'}: `
|
|
294
|
+
}),
|
|
295
|
+
' ',
|
|
296
|
+
activeFiltersDetails.join(' • ')
|
|
297
|
+
]
|
|
298
|
+
}),
|
|
299
|
+
/*#__PURE__*/ _jsx("span", {
|
|
300
|
+
onClick: (e)=>{
|
|
301
|
+
e.stopPropagation();
|
|
302
|
+
clearAllFilters();
|
|
303
|
+
},
|
|
304
|
+
className: "ml-1 p-0.5 hover:bg-muted rounded-sm transition-colors flex-shrink-0",
|
|
305
|
+
children: /*#__PURE__*/ _jsx(X, {
|
|
306
|
+
className: "h-3 w-3 text-gray-500"
|
|
307
|
+
})
|
|
308
|
+
})
|
|
309
|
+
]
|
|
310
|
+
}) : /*#__PURE__*/ _jsx("span", {
|
|
311
|
+
className: "text-sm truncate",
|
|
312
|
+
children: isHebrew ? 'סינון מהיר' : 'Quick Filters'
|
|
313
|
+
}),
|
|
314
|
+
showFilters ? /*#__PURE__*/ _jsx(ChevronUp, {
|
|
315
|
+
className: "h-4 w-4"
|
|
316
|
+
}) : /*#__PURE__*/ _jsx(ChevronDown, {
|
|
317
|
+
className: "h-4 w-4"
|
|
318
|
+
})
|
|
319
|
+
]
|
|
320
|
+
})
|
|
321
|
+
}),
|
|
322
|
+
showFilters && /*#__PURE__*/ _jsx("div", {
|
|
323
|
+
className: 'p-4 pb-2 bg-muted/70',
|
|
324
|
+
children: memoizedFilterRows
|
|
325
|
+
})
|
|
326
|
+
]
|
|
327
|
+
});
|
|
328
|
+
};
|
|
329
|
+
export default QuickFilter;
|
|
330
|
+
|
|
331
|
+
//# sourceMappingURL=QuickFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/QuickFilter.tsx"],"sourcesContent":["'use client';\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 { 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): 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 if (dateValue.customRange) {\n const { from, to } = dateValue.customRange;\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 try {\n const item = window.localStorage.getItem(localStorageKey);\n return item ? JSON.parse(item) : {};\n } catch (error) {\n console.error('Error reading 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 // Wait until field metadata has been loaded.\n if (fields.length === 0) {\n return;\n }\n\n const where = buildWhereClause(filterValues, fields);\n\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\n if (JSON.stringify(where) !== JSON.stringify(query.where)) {\n refineListData({\n columns: parseColumns(query.columns),\n where,\n page: '1',\n });\n }\n }, [filterValues, fields, query, refineListData, 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 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/70'}>{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","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","where","Object","entries","fieldName","value","fieldDef","find","f","dateValue","customRange","from","to","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","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","isHebrew","language","dateDescription","predefinedValue","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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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CheckboxFilterState, Locale } from '../types/filters-type';
|
|
2
|
+
interface CheckboxFilterProps {
|
|
3
|
+
label?: string;
|
|
4
|
+
checkboxLabel: string;
|
|
5
|
+
value?: CheckboxFilterState;
|
|
6
|
+
onChange: (state: CheckboxFilterState) => void;
|
|
7
|
+
locale?: Locale;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function CheckboxFilter({ label, checkboxLabel, value, onChange, locale, className, }: CheckboxFilterProps): import("react").JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=checkbox-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox-filter.d.ts","sourceRoot":"","sources":["../../../src/filters/components/checkbox-filter.tsx"],"names":[],"mappings":"AAKA,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,+BA6IrB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { X } from 'lucide-react';
|
|
5
|
+
import { Label } from '../../ui/label';
|
|
6
|
+
import { cn } from '../../lib/utils';
|
|
7
|
+
import { Button } from '../../ui/button';
|
|
8
|
+
export function CheckboxFilter({ label, checkboxLabel, value = 'indeterminate', onChange, locale = {
|
|
9
|
+
code: 'he',
|
|
10
|
+
direction: 'rtl'
|
|
11
|
+
}, className }) {
|
|
12
|
+
const [internalState, setInternalState] = useState(value);
|
|
13
|
+
const isHebrew = locale.code === 'he';
|
|
14
|
+
// Sync internal state with external value prop
|
|
15
|
+
useEffect(()=>{
|
|
16
|
+
setInternalState(value);
|
|
17
|
+
}, [
|
|
18
|
+
value
|
|
19
|
+
]);
|
|
20
|
+
const handleToggle = (newState)=>{
|
|
21
|
+
setInternalState(newState);
|
|
22
|
+
onChange(newState);
|
|
23
|
+
};
|
|
24
|
+
const handleClear = ()=>{
|
|
25
|
+
setInternalState('indeterminate');
|
|
26
|
+
onChange('indeterminate');
|
|
27
|
+
};
|
|
28
|
+
const isActive = internalState === 'checked' || internalState === 'unchecked';
|
|
29
|
+
const labels_toggle = {
|
|
30
|
+
yes: isHebrew ? 'כן' : 'YES',
|
|
31
|
+
no: isHebrew ? 'לא' : 'NO'
|
|
32
|
+
};
|
|
33
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
34
|
+
className: cn('space-y-1', className),
|
|
35
|
+
dir: locale.direction,
|
|
36
|
+
children: [
|
|
37
|
+
label && /*#__PURE__*/ _jsx(Label, {
|
|
38
|
+
className: cn('useTw text-sm font-medium', isHebrew && 'text-right block'),
|
|
39
|
+
children: label
|
|
40
|
+
}),
|
|
41
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
42
|
+
className: cn('flex items-center gap-3 transition-colors py-px', locale.direction === 'rtl' && 'justify-start'),
|
|
43
|
+
children: [
|
|
44
|
+
/*#__PURE__*/ _jsx("div", {
|
|
45
|
+
className: cn('flex items-center', locale.direction === 'rtl' && 'order-first'),
|
|
46
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
47
|
+
className: "flex rounded-md border overflow-hidden",
|
|
48
|
+
children: locale.direction === 'rtl' ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
49
|
+
children: [
|
|
50
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
51
|
+
variant: internalState === 'checked' ? 'default' : 'ghost',
|
|
52
|
+
size: "sm",
|
|
53
|
+
className: cn('px-3 py-1 text-xs rounded-none border-0', internalState === 'checked' ? 'bg-green-600 text-white hover:bg-green-700' : 'bg-background text-muted-foreground hover:bg-muted'),
|
|
54
|
+
onClick: ()=>handleToggle('checked'),
|
|
55
|
+
children: labels_toggle.yes
|
|
56
|
+
}),
|
|
57
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
58
|
+
variant: internalState === 'unchecked' ? 'default' : 'ghost',
|
|
59
|
+
size: "sm",
|
|
60
|
+
className: cn('px-3 py-1 text-xs rounded-none border-0 border-l', internalState === 'unchecked' ? 'bg-red-600 text-white hover:bg-red-700' : 'bg-background text-muted-foreground hover:bg-muted'),
|
|
61
|
+
onClick: ()=>handleToggle('unchecked'),
|
|
62
|
+
children: labels_toggle.no
|
|
63
|
+
})
|
|
64
|
+
]
|
|
65
|
+
}) : /*#__PURE__*/ _jsxs(_Fragment, {
|
|
66
|
+
children: [
|
|
67
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
68
|
+
variant: internalState === 'unchecked' ? 'default' : 'ghost',
|
|
69
|
+
size: "sm",
|
|
70
|
+
className: cn('px-3 py-1 text-xs rounded-none border-0', internalState === 'unchecked' ? 'bg-red-600 text-white hover:bg-red-700' : 'bg-background text-muted-foreground hover:bg-muted'),
|
|
71
|
+
onClick: ()=>handleToggle('unchecked'),
|
|
72
|
+
children: labels_toggle.no
|
|
73
|
+
}),
|
|
74
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
75
|
+
variant: internalState === 'checked' ? 'default' : 'ghost',
|
|
76
|
+
size: "sm",
|
|
77
|
+
className: cn('px-3 py-1 text-xs rounded-none border-0 border-l', internalState === 'checked' ? 'bg-green-600 text-white hover:bg-green-700' : 'bg-background text-muted-foreground hover:bg-muted'),
|
|
78
|
+
onClick: ()=>handleToggle('checked'),
|
|
79
|
+
children: labels_toggle.yes
|
|
80
|
+
})
|
|
81
|
+
]
|
|
82
|
+
})
|
|
83
|
+
})
|
|
84
|
+
}),
|
|
85
|
+
checkboxLabel && /*#__PURE__*/ _jsx(Label, {
|
|
86
|
+
className: cn('useTw cursor-pointer select-none text-sm', isHebrew && 'text-right', locale.direction === 'rtl' && 'order-2'),
|
|
87
|
+
children: checkboxLabel
|
|
88
|
+
}),
|
|
89
|
+
(internalState === 'checked' || internalState === 'unchecked') && /*#__PURE__*/ _jsx(Button, {
|
|
90
|
+
variant: "ghost",
|
|
91
|
+
size: "sm",
|
|
92
|
+
className: cn('h-5 w-5 p-0 hover:bg-muted rounded-full -mt-1', checkboxLabel ? locale.direction === 'rtl' ? 'order-last -ml-1' : 'order-last -mr-1' : locale.direction === 'rtl' ? 'ml-[80px] order-last' : 'mr-[80px] order-last'),
|
|
93
|
+
onClick: handleClear,
|
|
94
|
+
children: /*#__PURE__*/ _jsx(X, {
|
|
95
|
+
className: "h-3 w-3"
|
|
96
|
+
})
|
|
97
|
+
})
|
|
98
|
+
]
|
|
99
|
+
})
|
|
100
|
+
]
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=checkbox-filter.js.map
|