@shefing/quickfilter 1.0.31 → 1.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +62 -4
  2. package/dist/QuickFilter.d.ts.map +1 -1
  3. package/dist/QuickFilter.js +33 -231
  4. package/dist/QuickFilter.js.map +1 -1
  5. package/dist/filters/components/select-filter.js +2 -2
  6. package/dist/filters/components/select-filter.js.map +1 -1
  7. package/dist/filters/constants/date-filter-options.d.ts +2 -2
  8. package/dist/filters/constants/date-filter-options.d.ts.map +1 -1
  9. package/dist/filters/constants/date-filter-options.js +4 -1
  10. package/dist/filters/constants/date-filter-options.js.map +1 -1
  11. package/dist/filters/utils/date-helpers.d.ts.map +1 -1
  12. package/dist/filters/utils/date-helpers.js +26 -0
  13. package/dist/filters/utils/date-helpers.js.map +1 -1
  14. package/dist/index.d.ts +1 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +1 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/labels.d.ts +38 -2
  19. package/dist/labels.d.ts.map +1 -1
  20. package/dist/labels.js +19 -1
  21. package/dist/labels.js.map +1 -1
  22. package/dist/lib/utils.d.ts +4 -0
  23. package/dist/lib/utils.d.ts.map +1 -1
  24. package/dist/lib/utils.js +186 -0
  25. package/dist/lib/utils.js.map +1 -1
  26. package/dist/nav/NavHamburger/index.d.ts +5 -0
  27. package/dist/nav/NavHamburger/index.d.ts.map +1 -0
  28. package/dist/nav/NavHamburger/index.js +20 -0
  29. package/dist/nav/NavHamburger/index.js.map +1 -0
  30. package/dist/nav/NavWrapper/index.d.ts +7 -0
  31. package/dist/nav/NavWrapper/index.d.ts.map +1 -0
  32. package/dist/nav/NavWrapper/index.js +25 -0
  33. package/dist/nav/NavWrapper/index.js.map +1 -0
  34. package/dist/nav/NavWrapper/index.scss +27 -0
  35. package/dist/nav/getNavPrefs.d.ts +3 -0
  36. package/dist/nav/getNavPrefs.d.ts.map +1 -0
  37. package/dist/nav/getNavPrefs.js +31 -0
  38. package/dist/nav/getNavPrefs.js.map +1 -0
  39. package/dist/nav/index.client.d.ts +8 -0
  40. package/dist/nav/index.client.d.ts.map +1 -0
  41. package/dist/nav/index.client.js +93 -0
  42. package/dist/nav/index.client.js.map +1 -0
  43. package/dist/nav/index.d.ts +9 -0
  44. package/dist/nav/index.d.ts.map +1 -0
  45. package/dist/nav/index.js +200 -0
  46. package/dist/nav/index.js.map +1 -0
  47. package/dist/nav/index.scss +163 -0
  48. package/dist/ui/button.d.ts +1 -1
  49. package/dist/ui/command.d.ts +7 -7
  50. package/package.json +6 -1
package/README.md CHANGED
@@ -12,7 +12,6 @@ Transform your PayloadCMS admin experience with instant, intuitive filters that
12
12
  | **🎛️ Multiple Filter Types** | Date, select, checkbox, and small select filters | ![Types](https://img.shields.io/badge/Types-4-blue) |
13
13
  | **📱 Responsive Layout** | Configurable row-based layout with custom widths | ![Responsive](https://img.shields.io/badge/Layout-Responsive-orange) |
14
14
  | **🌍 Internationalization** | Full i18n support with RTL language compatibility | ![i18n](https://img.shields.io/badge/Languages-6-purple) |
15
- | **💾 Persistent State** | Filters persist in localStorage and URL parameters | ![Persistent](https://img.shields.io/badge/State-Persistent-yellow) |
16
15
  | **📅 Smart Date Filtering** | Predefined ranges + custom date picker | ![Dates](https://img.shields.io/badge/Dates-Smart-red) |
17
16
 
18
17
  ### 🎥 See It In Action
@@ -188,8 +187,8 @@ filterList: [
188
187
 
189
188
  **✨ What you get:**
190
189
 
191
- - 🕐 **Predefined time ranges**: Yesterday, Last Week, Last Month, All Past
192
- - 🔮 **Future options**: Today, Next Week, Next Month, All Future
190
+ - 🕐 **Predefined time ranges**: Yesterday, Last Week, Last Month, Last 7 Days, Last 30 Days, Last Year, Last 2 Years, All Past
191
+ - 🔮 **Future options**: Today, This Week, This Month, Next 7 Days, Next 30 Days, Today And Future, All Future
193
192
  - 🎯 **Custom range**: Pick any from/to dates
194
193
  - 🌍 **Localized**: Date formats adapt to user's language
195
194
 
@@ -352,7 +351,6 @@ Perfect for boolean fields like:
352
351
  | **🎯 Simplicity** | Click and filter | Navigate to filter page, fill form, submit |
353
352
  | **⚡ Speed** | Instant results as you click | Wait for page reload every time |
354
353
  | **👀 Clarity** | `🔍 3 Active filters: Status • Role • Date` | Guess what filters are active |
355
- | **💾 Persistent** | Filters persist across sessions | Start over every time |
356
354
 
357
355
 
358
356
  </details>
@@ -479,6 +477,66 @@ CollectionQuickFilterPlugin({
479
477
 
480
478
  </details>
481
479
 
480
+ ### 🧭 NavDefaultFilter Component
481
+
482
+ <details>
483
+ <summary>⚙️ <strong>Using NavDefaultFilter in your admin UI</strong></summary>
484
+
485
+ The NavDefaultFilter component allows you to apply default filters to collection views directly from the navigation menu. This means users will see filtered data immediately when they click on a collection.
486
+
487
+ ```typescript
488
+ // payload.config.ts
489
+ export default buildConfig({
490
+ admin: {
491
+ components: {
492
+ Nav: '@shefing/quickfilter/nav',
493
+ },
494
+ },
495
+ // ... rest of your config
496
+ });
497
+ ```
498
+
499
+ **🎯 Collection Configuration Examples:**
500
+
501
+ 1. Filter to show only today's and future meetings:
502
+
503
+ ```typescript
504
+ export const Meetings: CollectionConfig = {
505
+ slug: 'meetings',
506
+ custom: {
507
+ defaultFilter: {
508
+ 'meetingDate': 'todayAndFuture'
509
+ },
510
+ },
511
+ // ... rest of your collection config
512
+ };
513
+ ```
514
+
515
+ 2. Filter to show only unhandled items:
516
+
517
+ ```typescript
518
+ export const Tasks: CollectionConfig = {
519
+ slug: 'tasks',
520
+ custom: {
521
+ filterList: [['type', 'createdAt', 'meetingDate', 'holdingsLimit', 'handled', 'acquireTask']],
522
+ defaultFilter: {
523
+ 'handled': {
524
+ equals: false
525
+ }
526
+ }
527
+ },
528
+ // ... rest of your collection config
529
+ };
530
+ ```
531
+
532
+ **✨ Benefits:**
533
+
534
+ - 🎯 **Context-aware navigation**: Users see the most relevant data immediately
535
+ - ⏱️ **Time-saving**: No need to manually apply filters after navigation
536
+ - 🧠 **Smart defaults**: Configure different default views for different collections
537
+
538
+ </details>
539
+
482
540
 
483
541
 
484
542
  ## Contributing
@@ -1 +1 @@
1
- {"version":3,"file":"QuickFilter.d.ts","sourceRoot":"","sources":["../src/QuickFilter.tsx"],"names":[],"mappings":"AA2QA,QAAA,MAAM,WAAW,0BAGO;IACtB,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,gCAmTA,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"QuickFilter.d.ts","sourceRoot":"","sources":["../src/QuickFilter.tsx"],"names":[],"mappings":"AAsGA,QAAA,MAAM,WAAW,0BAGd;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,CAAC,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,EAAE,CAAA;CAC3D,gCA0RA,CAAA;AAED,eAAe,WAAW,CAAA"}
@@ -1,16 +1,16 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { useCallback, useEffect, useMemo, useState } from 'react';
4
4
  import { useConfig, useListQuery, useTranslation } from '@payloadcms/ui';
5
5
  import { getTranslation } from '@payloadcms/translations';
6
6
  import FilterField from './FilterField';
7
7
  import { getLabel } from './labels';
8
- import { groupFiltersByRow, parseColumns } from './filters/utils/layout-helpers';
9
- import { ChevronDown, ChevronUp, Filter, X } from 'lucide-react';
10
- import { getDateRangeForOption } from './filters/utils/date-helpers';
8
+ import { groupFiltersByRow } from './filters/utils/layout-helpers';
9
+ import { ChevronDown, ChevronUp, Filter, RefreshCw, X } from 'lucide-react';
11
10
  import { isEqual } from 'lodash';
12
- import { futureOptionKeys, getDateFilterOptions, pastOptionKeys } from './filters/constants/date-filter-options';
11
+ import { getDateFilterOptions } from './filters/constants/date-filter-options';
13
12
  import { Button } from './ui/button';
13
+ import { buildQuickFilterConditions, parseWhereClauseToFilterValues } from './lib/utils';
14
14
  // Helper function to get localized label
15
15
  const getLocalizedLabel = (label, locale)=>{
16
16
  if (typeof label === 'object' && label !== null) {
@@ -45,85 +45,6 @@ function findFieldsByName(fields, fieldNames) {
45
45
  recursiveSearch(fields);
46
46
  return results;
47
47
  }
48
- // Builds an array of condition objects from the quick filter values
49
- const buildQuickFilterConditions = (values, fieldDefs, locale)=>{
50
- const conditions = [];
51
- Object.entries(values).forEach(([fieldName, value])=>{
52
- if (!value) return;
53
- const fieldDef = fieldDefs.find((f)=>f.name === fieldName);
54
- if (!fieldDef) return;
55
- let condition = null;
56
- switch(fieldDef.type){
57
- case 'date':
58
- {
59
- const dateValue = value;
60
- let from;
61
- let to;
62
- if (dateValue.predefinedValue) {
63
- const range = getDateRangeForOption(dateValue.predefinedValue, locale);
64
- from = range.from;
65
- to = range.to;
66
- } else if (dateValue.customRange) {
67
- if (dateValue.customRange.from) from = new Date(dateValue.customRange.from);
68
- if (dateValue.customRange.to) to = new Date(dateValue.customRange.to);
69
- }
70
- if (from || to) {
71
- const dateQuery = {};
72
- if (from) dateQuery.greater_than_equal = from;
73
- if (to) dateQuery.less_than_equal = to;
74
- if (Object.keys(dateQuery).length > 0) {
75
- condition = {
76
- [fieldName]: dateQuery
77
- };
78
- }
79
- }
80
- break;
81
- }
82
- case 'select':
83
- {
84
- const selectValue = value;
85
- if (selectValue.selectedValues && selectValue.selectedValues.length > 0) {
86
- if (selectValue.selectedValues.length === 1) {
87
- condition = {
88
- [fieldName]: {
89
- equals: selectValue.selectedValues[0]
90
- }
91
- };
92
- } else {
93
- condition = {
94
- [fieldName]: {
95
- in: selectValue.selectedValues
96
- }
97
- };
98
- }
99
- }
100
- break;
101
- }
102
- case 'checkbox':
103
- {
104
- const checkboxState = value;
105
- if (checkboxState === 'checked') {
106
- condition = {
107
- [fieldName]: {
108
- equals: 'true'
109
- }
110
- };
111
- } else if (checkboxState === 'unchecked') {
112
- condition = {
113
- [fieldName]: {
114
- equals: 'false'
115
- }
116
- };
117
- }
118
- break;
119
- }
120
- }
121
- if (condition) {
122
- conditions.push(condition);
123
- }
124
- });
125
- return conditions;
126
- };
127
48
  // Helper function to remove quick filter conditions from a 'where' clause
128
49
  const cleanWhereClause = (clause, fieldsToClean)=>{
129
50
  if (!clause || typeof clause !== 'object' || Array.isArray(clause)) {
@@ -151,98 +72,7 @@ const cleanWhereClause = (clause, fieldsToClean)=>{
151
72
  }
152
73
  return newClause;
153
74
  };
154
- // Translates URL query conditions to the quick filter's internal state
155
- const parseWhereClauseToFilterValues = (where, fields, locale)=>{
156
- const values = {};
157
- const fieldNames = new Set(fields.map((f)=>f.name));
158
- const recursiveParse = (clause)=>{
159
- if (!clause || typeof clause !== 'object') return;
160
- if (clause.and) {
161
- clause.and.forEach(recursiveParse);
162
- return;
163
- }
164
- if (clause.or) {
165
- clause.or.forEach(recursiveParse);
166
- return;
167
- }
168
- for(const fieldName in clause){
169
- if (fieldNames.has(fieldName)) {
170
- const fieldDef = fields.find((f)=>f.name === fieldName);
171
- const condition = clause[fieldName];
172
- if (fieldDef && condition && typeof condition === 'object') {
173
- if ('equals' in condition) {
174
- if (fieldDef.type === 'checkbox') {
175
- values[fieldName] = condition.equals == 'true' ? 'checked' : 'unchecked';
176
- } else if (fieldDef.type === 'select') {
177
- values[fieldName] = {
178
- selectedValues: [
179
- condition.equals
180
- ]
181
- };
182
- }
183
- } else if ('in' in condition && Array.isArray(condition.in)) {
184
- if (fieldDef.type === 'select') {
185
- values[fieldName] = {
186
- selectedValues: condition.in
187
- };
188
- }
189
- } else if ('greater_than_equal' in condition || 'less_than_equal' in condition) {
190
- if (fieldDef.type === 'date') {
191
- const fromDate = condition.greater_than_equal ? new Date(condition.greater_than_equal) : null;
192
- const toDate = condition.less_than_equal ? new Date(condition.less_than_equal) : null;
193
- const allDateOptions = [
194
- ...pastOptionKeys,
195
- ...futureOptionKeys
196
- ];
197
- let matchedOption = null;
198
- for (const option of allDateOptions){
199
- const range = getDateRangeForOption(option, locale);
200
- let isFromMatch;
201
- if (fromDate) {
202
- isFromMatch = range.from?.toDateString() === fromDate.toDateString();
203
- } else if (fromDate == null && range.to == undefined) {
204
- // all future: fromDate == null & range.to == undefined
205
- isFromMatch = true;
206
- }
207
- let isToMatch;
208
- if (toDate) {
209
- isToMatch = range.to?.toDateString() === toDate.toDateString();
210
- } else if (toDate == null && range.to == undefined) {
211
- // all future: fromDate == null & range.to == undefined
212
- isToMatch = true;
213
- }
214
- if (isFromMatch && isToMatch) {
215
- matchedOption = option;
216
- break;
217
- }
218
- }
219
- if (matchedOption) {
220
- values[fieldName] = {
221
- type: 'predefined',
222
- predefinedValue: matchedOption
223
- };
224
- } else {
225
- values[fieldName] = {
226
- type: 'custom',
227
- customRange: {
228
- from: fromDate,
229
- to: toDate
230
- }
231
- };
232
- }
233
- }
234
- }
235
- }
236
- }
237
- }
238
- };
239
- recursiveParse(where);
240
- return values;
241
- };
242
75
  const QuickFilter = ({ slug, filterList })=>{
243
- const localStorageKey = useMemo(()=>`direct-filter-${slug}`, [
244
- slug
245
- ]);
246
76
  const [fields, setFields] = useState([]);
247
77
  const [filterRows, setFilterRows] = useState([]);
248
78
  const [showFilters, setShowFilters] = useState(false);
@@ -250,25 +80,7 @@ const QuickFilter = ({ slug, filterList })=>{
250
80
  const { getEntityConfig } = useConfig();
251
81
  const { i18n } = useTranslation();
252
82
  const locale = i18n.language;
253
- const isSyncingFromQuery = useRef(false);
254
- const [filterValues, setFilterValues] = useState(()=>{
255
- if (typeof window == 'undefined') return {};
256
- try {
257
- const item = window.localStorage.getItem(localStorageKey);
258
- if (!item) return {};
259
- const dateTimeReviver = (key, value)=>{
260
- const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/;
261
- if (typeof value === 'string' && isoDateRegex.test(value)) {
262
- return new Date(value);
263
- }
264
- return value;
265
- };
266
- return JSON.parse(item, dateTimeReviver);
267
- } catch (error) {
268
- console.error('Error reading and parsing filters from localStorage.', error);
269
- return {};
270
- }
271
- });
83
+ const [filterValues, setFilterValues] = useState({});
272
84
  // Build the list of filter fields from config
273
85
  useEffect(()=>{
274
86
  const collection = getEntityConfig({
@@ -311,9 +123,8 @@ const QuickFilter = ({ slug, filterList })=>{
311
123
  useEffect(()=>{
312
124
  if (fields.length === 0) return;
313
125
  const valuesFromQuery = parseWhereClauseToFilterValues(query.where, fields, locale);
314
- if (!isEqual(valuesFromQuery, filterValues)) {
126
+ if (!isEqual(filterValues, valuesFromQuery)) {
315
127
  // Lock to prevent feedback loop when internal state changes
316
- isSyncingFromQuery.current = true;
317
128
  setFilterValues(valuesFromQuery);
318
129
  }
319
130
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -323,12 +134,12 @@ const QuickFilter = ({ slug, filterList })=>{
323
134
  ]);
324
135
  // Sync internal state (filterValues) back into the URL
325
136
  useEffect(()=>{
326
- // If the change originated from the first effect, skip to avoid infinite loop
327
- if (isSyncingFromQuery.current) {
328
- isSyncingFromQuery.current = false;
137
+ if (fields.length === 0) return;
138
+ const valuesFromQuery = parseWhereClauseToFilterValues(query.where, fields, locale);
139
+ if (Object.keys(filterValues).length == 0 && !query.where) {}
140
+ if (isEqual(filterValues, valuesFromQuery)) {
329
141
  return;
330
142
  }
331
- if (fields.length === 0) return;
332
143
  const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, locale);
333
144
  const quickFilterFieldNames = new Set(fields.map((f)=>f.name));
334
145
  const otherFilters = cleanWhereClause(query.where, quickFilterFieldNames);
@@ -351,40 +162,18 @@ const QuickFilter = ({ slug, filterList })=>{
351
162
  newWhere = allConditions[0];
352
163
  }
353
164
  // Only update if the query has actually changed to avoid unnecessary updates
354
- if (!isEqual(newWhere, query.where)) {
355
- if (newWhere && Object.keys(newWhere).length > 0) {
356
- const refinedData = {
357
- where: newWhere,
358
- page: 1
359
- };
360
- if (query.columns) {
361
- refinedData.columns = parseColumns(query.columns);
362
- }
363
- refineListData(refinedData).then((r)=>{
364
- console.log("Query refreshed", refinedData);
365
- });
366
- }
165
+ if (!(isEqual(newWhere, query.where) || Object.keys(newWhere).length == 0 && !query.where)) {
166
+ const refinedData = {
167
+ where: newWhere,
168
+ page: 1
169
+ };
170
+ refineListData(refinedData).then((r)=>{
171
+ console.log('Query refreshed', refinedData);
172
+ });
367
173
  }
368
174
  // eslint-disable-next-line react-hooks/exhaustive-deps
369
175
  }, [
370
- filterValues,
371
- fields,
372
- i18n.language
373
- ]);
374
- // Effect for persisting to localStorage
375
- useEffect(()=>{
376
- try {
377
- if (Object.keys(filterValues).length > 0) {
378
- localStorage.setItem(localStorageKey, JSON.stringify(filterValues));
379
- } else {
380
- localStorage.removeItem(localStorageKey);
381
- }
382
- } catch (error) {
383
- console.error('Failed to save filters to localStorage', error);
384
- }
385
- }, [
386
- filterValues,
387
- localStorageKey
176
+ filterValues
388
177
  ]);
389
178
  // Updates only the internal state
390
179
  const handleFilterChange = useCallback((fieldName, value)=>{
@@ -460,6 +249,9 @@ const QuickFilter = ({ slug, filterList })=>{
460
249
  const clearAllFilters = ()=>{
461
250
  setFilterValues({});
462
251
  };
252
+ const refreshFilters = ()=>{
253
+ refineListData(query);
254
+ };
463
255
  const memoizedFilterRows = useMemo(()=>{
464
256
  return filterRows.map((row)=>/*#__PURE__*/ _jsx("div", {
465
257
  children: /*#__PURE__*/ _jsx("div", {
@@ -521,6 +313,16 @@ const QuickFilter = ({ slug, filterList })=>{
521
313
  children: /*#__PURE__*/ _jsx(X, {
522
314
  className: "h-3 w-3 text-gray-500"
523
315
  })
316
+ }),
317
+ /*#__PURE__*/ _jsx("span", {
318
+ onClick: (e)=>{
319
+ e.stopPropagation();
320
+ refreshFilters();
321
+ },
322
+ className: "ml-1 p-0.5 hover:bg-muted rounded-sm transition-colors flex-shrink-0",
323
+ children: /*#__PURE__*/ _jsx(RefreshCw, {
324
+ className: "h-3 w-3 text-gray-500"
325
+ })
524
326
  })
525
327
  ]
526
328
  }) : /*#__PURE__*/ _jsx("span", {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/QuickFilter.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useConfig, useListQuery, useTranslation } from '@payloadcms/ui';\nimport type { ClientField, FieldAffectingData, ListQuery, OptionObject, SelectField } from 'payload'\nimport { getTranslation } from '@payloadcms/translations';\nimport FilterField from './FilterField';\nimport { getLabel, SupportedLocale } from './labels';\nimport type {\n CheckboxFilterState,\n DateFilterValue,\n FilterDetaild,\n FilterRow,\n SelectFilterValue,\n} from './filters/types/filters-type';\nimport { groupFiltersByRow, parseColumns } from './filters/utils/layout-helpers';\nimport { ChevronDown, ChevronUp, Filter, X } from 'lucide-react';\n\nimport { getDateRangeForOption } from './filters/utils/date-helpers';\nimport { isEqual } from 'lodash';\nimport {\n futureOptionKeys,\n getDateFilterOptions,\n pastOptionKeys,\n} from './filters/constants/date-filter-options';\nimport { Button } from './ui/button';\n\n// 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// Builds an array of condition objects from the quick filter values\nconst buildQuickFilterConditions = (\n values: Record<string, any>,\n fieldDefs: FilterDetaild[],\n locale: SupportedLocale,\n): Record<string, any>[] => {\n const conditions: Record<string, any>[] = [];\n\n Object.entries(values).forEach(([fieldName, value]) => {\n if (!value) return;\n const fieldDef = fieldDefs.find((f) => f.name === fieldName);\n if (!fieldDef) return;\n\n let condition: Record<string, any> | null = null;\n\n switch (fieldDef.type) {\n case 'date': {\n const dateValue = value as DateFilterValue;\n let from: Date | undefined;\n let to: Date | undefined;\n\n if (dateValue.predefinedValue) {\n const range = getDateRangeForOption(dateValue.predefinedValue, locale);\n from = range.from;\n to = range.to;\n } else if (dateValue.customRange) {\n if (dateValue.customRange.from) from = new Date(dateValue.customRange.from);\n if (dateValue.customRange.to) to = new Date(dateValue.customRange.to);\n }\n\n if (from || to) {\n const dateQuery: any = {};\n if (from) dateQuery.greater_than_equal = from;\n if (to) dateQuery.less_than_equal = to;\n if (Object.keys(dateQuery).length > 0) {\n condition = { [fieldName]: dateQuery };\n }\n }\n break;\n }\n case 'select': {\n const selectValue = value as SelectFilterValue;\n if (selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n if (selectValue.selectedValues.length === 1) {\n condition = { [fieldName]: { equals: selectValue.selectedValues[0] } };\n } else {\n condition = { [fieldName]: { in: selectValue.selectedValues } };\n }\n }\n break;\n }\n case 'checkbox': {\n const checkboxState = value as CheckboxFilterState;\n if (checkboxState === 'checked') {\n condition = { [fieldName]: { equals: 'true' } };\n } else if (checkboxState === 'unchecked') {\n condition = { [fieldName]: { equals: 'false' } };\n }\n break;\n }\n }\n if (condition) {\n conditions.push(condition);\n }\n });\n return conditions;\n};\n\n// Helper function to remove quick filter conditions from a 'where' clause\nconst cleanWhereClause = (clause: any, fieldsToClean: Set<string>): any => {\n if (!clause || typeof clause !== 'object' || Array.isArray(clause)) {\n return clause;\n }\n\n const newClause: Record<string, any> = {};\n\n for (const key in clause) {\n if (key === 'and' || key === 'or') {\n const cleanedSubClauses = clause[key]\n .map((subClause: any) => cleanWhereClause(subClause, fieldsToClean))\n .filter(Boolean);\n\n if (cleanedSubClauses.length > 0) {\n newClause[key] = cleanedSubClauses;\n }\n } else if (!fieldsToClean.has(key)) {\n newClause[key] = clause[key];\n }\n }\n\n if (Object.keys(newClause).length === 0) {\n return null;\n }\n\n if (newClause.and?.length === 1 && Object.keys(newClause).length === 1) {\n return newClause.and[0];\n }\n if (newClause.or?.length === 1 && Object.keys(newClause).length === 1) {\n return newClause.or[0];\n }\n\n return newClause;\n};\n\n// Translates URL query conditions to the quick filter's internal state\nconst parseWhereClauseToFilterValues = (\n where: any,\n fields: FilterDetaild[],\n locale: SupportedLocale,\n): Record<string, any> => {\n const values: Record<string, any> = {};\n const fieldNames = new Set(fields.map((f) => f.name));\n\n const recursiveParse = (clause: any) => {\n if (!clause || typeof clause !== 'object') return;\n\n if (clause.and) {\n clause.and.forEach(recursiveParse);\n return;\n }\n if (clause.or) {\n clause.or.forEach(recursiveParse);\n return;\n }\n\n for (const fieldName in clause) {\n if (fieldNames.has(fieldName)) {\n const fieldDef = fields.find((f) => f.name === fieldName);\n const condition = clause[fieldName];\n\n if (fieldDef && condition && typeof condition === 'object') {\n if ('equals' in condition) {\n if (fieldDef.type === 'checkbox') {\n values[fieldName] = condition.equals == 'true' ? 'checked' : 'unchecked';\n } else if (fieldDef.type === 'select') {\n values[fieldName] = { selectedValues: [condition.equals] };\n }\n } else if ('in' in condition && Array.isArray(condition.in)) {\n if (fieldDef.type === 'select') {\n values[fieldName] = { selectedValues: condition.in };\n }\n } else if ('greater_than_equal' in condition || 'less_than_equal' in condition) {\n if (fieldDef.type === 'date') {\n const fromDate = condition.greater_than_equal\n ? new Date(condition.greater_than_equal)\n : null;\n const toDate = condition.less_than_equal ? new Date(condition.less_than_equal) : null;\n const allDateOptions = [...pastOptionKeys, ...futureOptionKeys];\n let matchedOption = null;\n\n for (const option of allDateOptions) {\n const range = getDateRangeForOption(option, locale);\n let isFromMatch;\n if (fromDate) {\n isFromMatch = range.from?.toDateString() === fromDate.toDateString();\n } else if (fromDate == null && range.to == undefined) {\n // all future: fromDate == null & range.to == undefined\n isFromMatch = true;\n }\n let isToMatch;\n if (toDate) {\n isToMatch = range.to?.toDateString() === toDate.toDateString();\n } else if (toDate == null && range.to == undefined) {\n // all future: fromDate == null & range.to == undefined\n isToMatch = true;\n }\n\n if (isFromMatch && isToMatch) {\n matchedOption = option;\n break;\n }\n }\n\n if (matchedOption) {\n values[fieldName] = {\n type: 'predefined',\n predefinedValue: matchedOption,\n };\n } else {\n values[fieldName] = {\n type: 'custom',\n customRange: {\n from: fromDate,\n to: toDate,\n },\n };\n }\n }\n }\n }\n }\n }\n };\n\n recursiveParse(where);\n return values;\n};\n\nconst QuickFilter = ({\n slug,\n filterList,\n }: {\n slug: string;\n filterList: (string | { name: string; width: string })[][];\n}) => {\n const localStorageKey = useMemo(() => `direct-filter-${slug}`, [slug]);\n\n const [fields, setFields] = useState<FilterDetaild[]>([]);\n const [filterRows, setFilterRows] = useState<FilterRow[]>([]);\n const [showFilters, setShowFilters] = useState(false);\n const { refineListData, query } = useListQuery();\n const { getEntityConfig } = useConfig();\n const { i18n } = useTranslation();\n const locale = i18n.language as SupportedLocale;\n const isSyncingFromQuery = useRef(false);\n\n const [filterValues, setFilterValues] = useState<Record<string, any>>(() => {\n if (typeof window == 'undefined') return {};\n try {\n const item = window.localStorage.getItem(localStorageKey);\n if (!item) return {};\n const dateTimeReviver = (key: string, value: any) => {\n const isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$/;\n if (typeof value === 'string' && isoDateRegex.test(value)) {\n return new Date(value);\n }\n return value;\n };\n return JSON.parse(item, dateTimeReviver);\n } catch (error) {\n console.error('Error reading and parsing filters from localStorage.', error);\n return {};\n }\n });\n\n // Build the list of filter fields from config\n useEffect(() => {\n const collection = getEntityConfig({ collectionSlug: slug });\n const flattenedFieldConfigs = filterList.flatMap((row, rowIndex) =>\n row.map((field, fieldIndex) => ({\n field,\n rowIndex,\n fieldIndex,\n })),\n );\n const fieldNames = flattenedFieldConfigs.map(({ field }) =>\n typeof field === 'string' ? field : field.name,\n );\n const matchedFields = findFieldsByName(collection?.fields || [], fieldNames);\n const simplifiedFields: FilterDetaild[] = matchedFields.map((field) => {\n const label = (field as FieldAffectingData).label;\n const translatedLabel = getTranslation(label as string, i18n);\n const fieldName = (field as FieldAffectingData).name as string;\n const fieldConfig = flattenedFieldConfigs.find(({ field: f }) =>\n typeof f === 'string' ? f === fieldName : f.name === fieldName,\n );\n return {\n name: fieldName,\n label: translatedLabel as string,\n type: field.type,\n options: (field as SelectField).options as OptionObject[],\n row: fieldConfig ? fieldConfig.rowIndex : 0,\n width:\n typeof fieldConfig?.field === 'object' && 'width' in fieldConfig.field\n ? fieldConfig.field.width\n : undefined,\n };\n });\n const sortedFields = flattenedFieldConfigs\n .map(({ field }) => {\n const fieldName = typeof field === 'string' ? field : field.name;\n return simplifiedFields.find((f) => f.name === fieldName);\n })\n .filter((f): f is FilterDetaild => !!f);\n setFields(sortedFields);\n setFilterRows(groupFiltersByRow(sortedFields));\n }, [slug, filterList, getEntityConfig, i18n]);\n // Sync from URL (query.where) into internal state\n useEffect(() => {\n if (fields.length === 0) return;\n\n const valuesFromQuery: Record<string, any> = parseWhereClauseToFilterValues(\n query.where,\n fields,\n locale,\n );\n\n if (!isEqual(valuesFromQuery, filterValues)) {\n // Lock to prevent feedback loop when internal state changes\n isSyncingFromQuery.current = true;\n setFilterValues(valuesFromQuery);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query.where, fields]);\n\n // Sync internal state (filterValues) back into the URL\n useEffect(() => {\n // If the change originated from the first effect, skip to avoid infinite loop\n if (isSyncingFromQuery.current) {\n isSyncingFromQuery.current = false;\n return;\n }\n\n if (fields.length === 0) return;\n\n const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, locale);\n const quickFilterFieldNames = new Set(fields.map((f) => f.name));\n const otherFilters = cleanWhereClause(query.where, quickFilterFieldNames);\n\n const allConditions = [...quickFilterConditions];\n if (otherFilters) {\n if (otherFilters.and && Array.isArray(otherFilters.and)) {\n allConditions.push(...otherFilters.and);\n } else if (Object.keys(otherFilters).length > 0) {\n allConditions.push(otherFilters);\n }\n }\n\n let newWhere: Record<string, any> = {};\n if (allConditions.length > 1) {\n newWhere = { and: allConditions };\n } else if (allConditions.length === 1) {\n newWhere = allConditions[0];\n }\n\n // Only update if the query has actually changed to avoid unnecessary updates\n if (!isEqual(newWhere, query.where)) {\n if(newWhere && Object.keys(newWhere).length > 0){\n const refinedData = {\n where: newWhere,\n page: 1,\n } as ListQuery;\n\n if (query.columns) {\n refinedData.columns = parseColumns(query.columns);\n }\n\n refineListData(refinedData).then(r => {\n console.log(\"Query refreshed\",refinedData)\n });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterValues, fields, i18n.language]);\n // Effect for persisting to localStorage\n useEffect(() => {\n try {\n if (Object.keys(filterValues).length > 0) {\n localStorage.setItem(localStorageKey, JSON.stringify(filterValues));\n } else {\n localStorage.removeItem(localStorageKey);\n }\n } catch (error) {\n console.error('Failed to save filters to localStorage', error);\n }\n }, [filterValues, localStorageKey]);\n\n // Updates only the internal state\n const handleFilterChange = useCallback((fieldName: string, value: any) => {\n setFilterValues((prev) => {\n const newValues = { ...prev };\n if (\n value === undefined ||\n value === null ||\n value === 'indeterminate' ||\n (value && value.type === 'none')\n ) {\n delete newValues[fieldName];\n } else {\n newValues[fieldName] = value;\n }\n return newValues;\n });\n }, []);\n\n // This function remains largely the same.\n const getActiveFiltersDetails = () => {\n const activeFilters: string[] = [];\n const locale = i18n.language as SupportedLocale;\n Object.entries(filterValues).forEach(([fieldName, value]) => {\n const field = fields.find((f) => f.name === fieldName);\n if (!field) return;\n\n switch (field.type) {\n case 'date':\n if (value !== undefined) {\n const dateValue = value as DateFilterValue;\n let dateDescription = '';\n\n if (dateValue.type === 'predefined' && dateValue.predefinedValue) {\n const { pastOptions, futureOptions } = getDateFilterOptions(locale);\n const allOptions = [...pastOptions, ...futureOptions];\n const option = allOptions.find((opt) => opt.value === dateValue.predefinedValue);\n dateDescription = option ? option.label : getLabel('custom', locale);\n } else if (dateValue.type === 'custom' || dateValue.customRange) {\n dateDescription = getLabel('custom', locale);\n }\n\n if (dateDescription) {\n activeFilters.push(`${field.label} (${dateDescription})`);\n }\n }\n break;\n case 'select': {\n const selectValue = value as SelectFilterValue;\n if (selectValue && selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n const totalOptions = field.options?.length || 0;\n\n if (selectValue.selectedValues.length === totalOptions) {\n activeFilters.push(`${field.label} (${getLabel('all', locale)})`);\n } else if (selectValue.selectedValues.length === 1) {\n // Show the actual option name when only one is selected\n const selectedOption = field.options?.find(\n (opt: any) => opt.value === selectValue.selectedValues[0],\n );\n const optionLabel = selectedOption\n ? 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 memoizedFilterRows = useMemo(() => {\n return filterRows.map((row) => (\n <div key={row.rowNumber}>\n <div className='flex flex-wrap gap-6 mb-4'>\n {row.filters.map((field) => (\n <FilterField\n key={field.name}\n field={field}\n onFilterChange={handleFilterChange}\n value={filterValues[field.name]}\n />\n ))}\n </div>\n </div>\n ));\n }, [filterRows, handleFilterChange, filterValues]);\n\n const toggleFilters = () => {\n setShowFilters((prev) => !prev);\n };\n\n const activeFiltersDetails = getActiveFiltersDetails();\n const hasActiveFilters = activeFiltersDetails.length > 0;\n\n if (!fields.length) return null;\n\n return (\n <div className='filter-container useTw'>\n <div style={{ position: 'relative', top: '-24px', height: '0px' }}>\n <Button\n variant='outline'\n size='sm'\n onClick={toggleFilters}\n className={`flex items-center gap-2 bg-background border-muted-muted hover:bg-muted ${\n hasActiveFilters ? 'w-auto min-w-fit' : ''\n }`}\n >\n <Filter className={`h-4 w-4 ${hasActiveFilters ? 'fill-current' : ''}`} />\n\n {hasActiveFilters ? (\n <>\n <span className='text-sm truncate'>\n <strong>\n {`${activeFiltersDetails.length === 1 ? getLabel('activeFilterSingular', locale) : getLabel('activeFilterPlural', locale)}: `}\n </strong>{' '}\n {activeFiltersDetails.join(' • ')}\n </span>\n\n <span\n onClick={(e) => {\n e.stopPropagation();\n clearAllFilters();\n }}\n className='ml-1 p-0.5 hover:bg-muted rounded-sm transition-colors flex-shrink-0'\n >\n <X className='h-3 w-3 text-gray-500' />\n </span>\n </>\n ) : (\n <span className='text-sm truncate'>{getLabel('quickFilters', locale)}</span>\n )}\n\n {showFilters ? <ChevronUp className='h-4 w-4' /> : <ChevronDown className='h-4 w-4' />}\n </Button>\n </div>\n {showFilters && <div className={'p-4 pb-2 bg-muted'}>{memoizedFilterRows}</div>}\n </div>\n );\n};\n\nexport default QuickFilter;\n"],"names":["useCallback","useEffect","useMemo","useRef","useState","useConfig","useListQuery","useTranslation","getTranslation","FilterField","getLabel","groupFiltersByRow","parseColumns","ChevronDown","ChevronUp","Filter","X","getDateRangeForOption","isEqual","futureOptionKeys","getDateFilterOptions","pastOptionKeys","Button","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","buildQuickFilterConditions","fieldDefs","conditions","entries","fieldName","value","fieldDef","find","f","condition","dateValue","from","to","predefinedValue","range","customRange","Date","dateQuery","greater_than_equal","less_than_equal","keys","length","selectValue","selectedValues","equals","in","checkboxState","cleanWhereClause","clause","fieldsToClean","newClause","key","cleanedSubClauses","map","subClause","Boolean","has","and","or","parseWhereClauseToFilterValues","where","Set","recursiveParse","fromDate","toDate","allDateOptions","matchedOption","option","isFromMatch","toDateString","undefined","isToMatch","QuickFilter","slug","filterList","localStorageKey","setFields","filterRows","setFilterRows","showFilters","setShowFilters","refineListData","query","getEntityConfig","i18n","language","isSyncingFromQuery","filterValues","setFilterValues","window","localStorage","getItem","dateTimeReviver","isoDateRegex","test","JSON","parse","error","console","collection","collectionSlug","flattenedFieldConfigs","flatMap","row","rowIndex","fieldIndex","matchedFields","simplifiedFields","translatedLabel","fieldConfig","options","width","sortedFields","valuesFromQuery","current","quickFilterConditions","quickFilterFieldNames","otherFilters","allConditions","newWhere","refinedData","page","columns","then","r","log","setItem","stringify","removeItem","handleFilterChange","prev","newValues","getActiveFiltersDetails","activeFilters","dateDescription","pastOptions","futureOptions","allOptions","opt","totalOptions","selectedOption","optionLabel","checkboxValue","clearAllFilters","memoizedFilterRows","div","className","filters","onFilterChange","rowNumber","toggleFilters","activeFiltersDetails","hasActiveFilters","style","position","top","height","variant","size","onClick","span","strong","join","e","stopPropagation"],"mappings":"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"}
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 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(fields.map((f) => f.name))\n const otherFilters = cleanWhereClause(query.where, quickFilterFieldNames)\n\n const allConditions = [...quickFilterConditions]\n if (otherFilters) {\n if (otherFilters.and && Array.isArray(otherFilters.and)) {\n allConditions.push(...otherFilters.and)\n } else if (Object.keys(otherFilters).length > 0) {\n allConditions.push(otherFilters)\n }\n }\n\n let newWhere: Record<string, any> = {}\n if (allConditions.length > 1) {\n newWhere = { and: allConditions }\n } else if (allConditions.length === 1) {\n newWhere = allConditions[0]\n }\n\n // Only update if the query has actually changed to avoid unnecessary updates\n if (!(isEqual(newWhere, query.where) || (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) => f.name === fieldName)\n if (!field) return\n\n switch (field.type) {\n case 'date':\n if (value !== undefined) {\n const dateValue = value as DateFilterValue\n let dateDescription = ''\n\n if (dateValue.type === 'predefined' && dateValue.predefinedValue) {\n const { pastOptions, futureOptions } = getDateFilterOptions(locale)\n const allOptions = [...pastOptions, ...futureOptions]\n const option = allOptions.find((opt) => opt.value === dateValue.predefinedValue)\n dateDescription = option ? option.label : getLabel('custom', locale)\n } else if (dateValue.type === 'custom' || dateValue.customRange) {\n dateDescription = getLabel('custom', locale)\n }\n\n if (dateDescription) {\n activeFilters.push(`${field.label} (${dateDescription})`)\n }\n }\n break\n case 'select': {\n const selectValue = value as SelectFilterValue\n if (selectValue && selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n const totalOptions = field.options?.length || 0\n\n if (selectValue.selectedValues.length === totalOptions) {\n activeFilters.push(`${field.label} (${getLabel('all', locale)})`)\n } else if (selectValue.selectedValues.length === 1) {\n // Show the actual option name when only one is selected\n const selectedOption = field.options?.find(\n (opt: any) => opt.value === selectValue.selectedValues[0],\n )\n const optionLabel = selectedOption\n ? 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 <FilterField\n key={field.name}\n field={field}\n onFilterChange={handleFilterChange}\n value={filterValues[field.name]}\n />\n ))}\n </div>\n </div>\n ))\n }, [filterRows, handleFilterChange, filterValues])\n\n const toggleFilters = () => {\n setShowFilters((prev) => !prev)\n }\n\n const activeFiltersDetails = getActiveFiltersDetails()\n const hasActiveFilters = activeFiltersDetails.length > 0\n\n if (!fields.length) return null\n\n return (\n <div className=\"filter-container useTw\">\n <div style={{ position: 'relative', top: '-24px', height: '0px' }}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={toggleFilters}\n className={`flex items-center gap-2 bg-background border-muted-muted hover:bg-muted ${\n hasActiveFilters ? 'w-auto min-w-fit' : ''\n }`}\n >\n <Filter className={`h-4 w-4 ${hasActiveFilters ? 'fill-current' : ''}`} />\n\n {hasActiveFilters ? (\n <>\n <span className=\"text-sm truncate\">\n <strong>\n {`${activeFiltersDetails.length === 1 ? getLabel('activeFilterSingular', locale) : getLabel('activeFilterPlural', locale)}: `}\n </strong>{' '}\n {activeFiltersDetails.join(' • ')}\n </span>\n\n <span\n onClick={(e) => {\n e.stopPropagation()\n clearAllFilters()\n }}\n className=\"ml-1 p-0.5 hover:bg-muted rounded-sm transition-colors flex-shrink-0\"\n >\n <X className=\"h-3 w-3 text-gray-500\" />\n </span>\n <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","width","undefined","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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"}
@@ -203,7 +203,7 @@ export function SelectFilter({ label, options, value, onChange, placeholder, loc
203
203
  }),
204
204
  multiSelect && selectedValues.length > 0 && selectedValues.length < options.length && /*#__PURE__*/ _jsx("div", {
205
205
  className: "flex flex-wrap gap-1 mt-2",
206
- children: selectedValues.map((value)=>{
206
+ children: selectedValues.map((value, index)=>{
207
207
  const option = options.find((opt)=>opt.value === value);
208
208
  return /*#__PURE__*/ _jsxs(Badge, {
209
209
  variant: "secondary",
@@ -216,7 +216,7 @@ export function SelectFilter({ label, options, value, onChange, placeholder, loc
216
216
  children: "×"
217
217
  })
218
218
  ]
219
- }, value);
219
+ }, value + index);
220
220
  })
221
221
  })
222
222
  ]