@strapi/admin 5.39.0 → 5.41.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.
@@ -32,7 +32,39 @@ function _interopNamespaceDefault(e) {
32
32
  var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
33
33
 
34
34
  const [FiltersProvider, useFilters] = Context.createContext('Filters');
35
+ const getFilterDetails = (filterEntry, options)=>{
36
+ const [name] = Object.keys(filterEntry);
37
+ const option = options.find((o)=>o.name === name);
38
+ if (!option) {
39
+ return null;
40
+ }
41
+ const operatorObj = option.type === 'relation' ? filterEntry[name]?.[option.mainField?.name ?? 'id'] : filterEntry[name];
42
+ if (typeof operatorObj !== 'object' || operatorObj === null) {
43
+ return null;
44
+ }
45
+ const [operator] = Object.keys(operatorObj);
46
+ if (!operator) {
47
+ return null;
48
+ }
49
+ return {
50
+ name,
51
+ operator,
52
+ value: operatorObj[operator]
53
+ };
54
+ };
55
+ const isFilterMatch = (filterEntry, options, target)=>{
56
+ const details = getFilterDetails(filterEntry, options);
57
+ if (!details || details.name !== target.name || details.operator !== target.filter) {
58
+ return false;
59
+ }
60
+ if (filters.FILTERS_WITH_NO_VALUE.includes(target.filter)) {
61
+ return true;
62
+ }
63
+ const decoded = typeof details.value === 'string' ? decodeURIComponent(details.value) : details.value;
64
+ return decoded === target.value;
65
+ };
35
66
  const Root = ({ children, disabled = false, onChange, options = [], onOpenChange, open: openProp, defaultOpen, ...restProps })=>{
67
+ const [editingFilter, setEditingFilter] = React__namespace.useState(null);
36
68
  const handleChange = (data)=>{
37
69
  if (onChange) {
38
70
  onChange(data);
@@ -43,6 +75,13 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
43
75
  defaultProp: defaultOpen,
44
76
  onChange: onOpenChange
45
77
  });
78
+ React__namespace.useEffect(()=>{
79
+ if (!open) {
80
+ setEditingFilter(null);
81
+ }
82
+ }, [
83
+ open
84
+ ]);
46
85
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Root, {
47
86
  open: open,
48
87
  onOpenChange: setOpen,
@@ -52,6 +91,8 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
52
91
  disabled: disabled,
53
92
  onChange: handleChange,
54
93
  options: options,
94
+ editingFilter: editingFilter,
95
+ setEditingFilter: setEditingFilter,
55
96
  children: children
56
97
  })
57
98
  });
@@ -89,6 +130,17 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
89
130
  const options = useFilters('Popover', ({ options })=>options);
90
131
  const onChange = useFilters('Popover', ({ onChange })=>onChange);
91
132
  const setOpen = useFilters('Popover', ({ setOpen })=>setOpen);
133
+ const editingFilter = useFilters('Popover', ({ editingFilter })=>editingFilter);
134
+ const setEditingFilter = useFilters('Popover', ({ setEditingFilter })=>setEditingFilter);
135
+ const initialValues = React__namespace.useMemo(()=>{
136
+ return editingFilter ?? {
137
+ name: options[0]?.name,
138
+ filter: filters.BASE_FILTERS[0].value
139
+ };
140
+ }, [
141
+ editingFilter,
142
+ options
143
+ ]);
92
144
  if (options.length === 0) {
93
145
  return null;
94
146
  }
@@ -115,15 +167,20 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
115
167
  */ const operatorValuePairing = {
116
168
  [data.filter]: value
117
169
  };
118
- const newFilterQuery = {
170
+ const newFilterEntry = {
171
+ [data.name]: fieldOptions.type === 'relation' ? {
172
+ [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing
173
+ } : operatorValuePairing
174
+ };
175
+ const existingFilters = query.filters?.$and ?? [];
176
+ const newFilterQuery = editingFilter ? {
177
+ ...query.filters,
178
+ $and: existingFilters.map((filter)=>isFilterMatch(filter, options, editingFilter) ? newFilterEntry : filter)
179
+ } : {
119
180
  ...query.filters,
120
181
  $and: [
121
- ...query.filters?.$and ?? [],
122
- {
123
- [data.name]: fieldOptions.type === 'relation' ? {
124
- [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing
125
- } : operatorValuePairing
126
- }
182
+ ...existingFilters,
183
+ newFilterEntry
127
184
  ]
128
185
  };
129
186
  setQuery({
@@ -131,6 +188,7 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
131
188
  page: 1
132
189
  }, 'push', true);
133
190
  setOpen(false);
191
+ setEditingFilter(null);
134
192
  };
135
193
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Content, {
136
194
  style: {
@@ -140,10 +198,7 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
140
198
  padding: 3,
141
199
  children: /*#__PURE__*/ jsxRuntime.jsx(Form.Form, {
142
200
  method: "POST",
143
- initialValues: {
144
- name: options[0]?.name,
145
- filter: filters.BASE_FILTERS[0].value
146
- },
201
+ initialValues: initialValues,
147
202
  onSubmit: handleSubmit,
148
203
  children: ({ values: formValues, modified, isSubmitting })=>{
149
204
  const filter = options.find((filter)=>filter.name === formValues.name);
@@ -192,7 +247,7 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
192
247
  ].map((field)=>/*#__PURE__*/ jsxRuntime.jsx(Renderer.InputRenderer, {
193
248
  ...field
194
249
  }, field.name)),
195
- filter && formValues.filter && formValues.filter !== '$null' && formValues.filter !== '$notNull' ? /*#__PURE__*/ jsxRuntime.jsx(Input, {
250
+ filter && formValues.filter && !filters.FILTERS_WITH_NO_VALUE.includes(formValues.filter) ? /*#__PURE__*/ jsxRuntime.jsx(Input, {
196
251
  ...filter,
197
252
  label: null,
198
253
  "aria-label": filter.label,
@@ -207,7 +262,10 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
207
262
  startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Plus, {}),
208
263
  type: "submit",
209
264
  fullWidth: true,
210
- children: formatMessage({
265
+ children: editingFilter ? formatMessage({
266
+ id: 'app.utils.update-filter',
267
+ defaultMessage: 'Update filter'
268
+ }) : formatMessage({
211
269
  id: 'app.utils.add-filter',
212
270
  defaultMessage: 'Add filter'
213
271
  })
@@ -215,7 +273,7 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
215
273
  ]
216
274
  });
217
275
  }
218
- })
276
+ }, editingFilter ? `edit-${editingFilter.name}-${editingFilter.filter}-${editingFilter.value ?? 'empty'}` : 'create')
219
277
  })
220
278
  });
221
279
  };
@@ -285,25 +343,11 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
285
343
  * Check the name, operator and value to see if it already exists in the query
286
344
  * if it does, remove it.
287
345
  */ const nextFilters = (query?.filters?.$and ?? []).filter((filter)=>{
288
- const [attributeName] = Object.keys(filter);
289
- if (attributeName !== data.name) {
346
+ const details = getFilterDetails(filter, options);
347
+ if (!details) {
290
348
  return true;
291
349
  }
292
- const { type, mainField } = options.find(({ name })=>name === attributeName);
293
- if (type === 'relation') {
294
- const filterObj = filter[attributeName][mainField?.name ?? 'id'];
295
- if (typeof filterObj === 'object') {
296
- const [operator] = Object.keys(filterObj);
297
- const value = filterObj[operator];
298
- return !(operator === data.filter && value === data.value);
299
- }
300
- return true;
301
- } else {
302
- const filterObj = filter[attributeName];
303
- const [operator] = Object.keys(filterObj);
304
- const value = filterObj[operator];
305
- return !(operator === data.filter && value === data.value);
306
- }
350
+ return !(details.name === data.name && details.operator === data.filter && details.value === data.value);
307
351
  });
308
352
  setQuery({
309
353
  filters: {
@@ -317,48 +361,37 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
317
361
  }
318
362
  return /*#__PURE__*/ jsxRuntime.jsx(jsxRuntime.Fragment, {
319
363
  children: query?.filters?.$and?.map((queryFilter)=>{
320
- const [attributeName] = Object.keys(queryFilter);
321
- const filter = options.find(({ name })=>name === attributeName);
322
- const filterObj = queryFilter[attributeName];
323
- if (!filter || typeof filterObj !== 'object' || filterObj === null) {
364
+ const details = getFilterDetails(queryFilter, options);
365
+ if (!details || typeof details.value === 'object') {
324
366
  return null;
325
367
  }
326
- if (filter.type === 'relation') {
327
- const modelFilter = filterObj[filter.mainField?.name ?? 'id'];
328
- if (typeof modelFilter === 'object') {
329
- const [operator] = Object.keys(modelFilter);
330
- const value = modelFilter[operator];
331
- return /*#__PURE__*/ jsxRuntime.jsx(AttributeTag, {
332
- ...filter,
333
- onClick: handleClick,
334
- operator: operator,
335
- value: value
336
- }, `${attributeName}-${operator}-${value}`);
337
- }
368
+ const filter = options.find(({ name })=>name === details.name);
369
+ if (!filter) {
338
370
  return null;
339
- } else {
340
- const [operator] = Object.keys(filterObj);
341
- const value = filterObj[operator];
342
- /**
343
- * Something has gone wrong here, because the attribute is not a relation
344
- * but we have a nested filter object.
345
- */ if (typeof value === 'object') {
346
- return null;
347
- }
348
- return /*#__PURE__*/ jsxRuntime.jsx(AttributeTag, {
349
- ...filter,
350
- onClick: handleClick,
351
- operator: operator,
352
- value: value
353
- }, `${attributeName}-${operator}-${value}`);
354
371
  }
372
+ return /*#__PURE__*/ jsxRuntime.jsx(AttributeTag, {
373
+ ...filter,
374
+ onRemove: handleClick,
375
+ operator: details.operator,
376
+ value: String(details.value)
377
+ }, `${details.name}-${details.operator}-${details.value}`);
355
378
  })
356
379
  });
357
380
  };
358
- const AttributeTag = ({ input, label, mainField, name, onClick, operator, options, value, ...filter })=>{
381
+ const AttributeTag = ({ input, label, mainField, name, onRemove, operator, options, value, ...filter })=>{
359
382
  const { formatMessage, formatDate, formatTime, formatNumber } = reactIntl.useIntl();
360
- const handleClick = ()=>{
361
- onClick({
383
+ const setOpen = useFilters('AttributeTag', ({ setOpen })=>setOpen);
384
+ const setEditingFilter = useFilters('AttributeTag', ({ setEditingFilter })=>setEditingFilter);
385
+ const handleEdit = ()=>{
386
+ setEditingFilter({
387
+ name,
388
+ filter: operator,
389
+ value: filters.FILTERS_WITH_NO_VALUE.includes(operator) ? undefined : decodeURIComponent(value)
390
+ });
391
+ setOpen(true);
392
+ };
393
+ const handleRemove = ()=>{
394
+ onRemove({
362
395
  name,
363
396
  value,
364
397
  filter: operator
@@ -403,15 +436,22 @@ const AttributeTag = ({ input, label, mainField, name, onClick, operator, option
403
436
  });
404
437
  formattedValue = selectedOption ? typeof selectedOption === 'string' ? selectedOption : selectedOption.label ?? selectedOption.value : value;
405
438
  }
406
- const content = `${label} ${formatMessage({
439
+ const operatorLabel = formatMessage({
407
440
  id: `components.FilterOptions.FILTER_TYPES.${operator}`,
408
441
  defaultMessage: operator
409
- })} ${operator !== '$null' && operator !== '$notNull' ? formattedValue : ''}`;
442
+ });
443
+ const content = filters.FILTERS_WITH_NO_VALUE.includes(operator) ? `${label} ${operatorLabel}` : `${label} ${operatorLabel} ${formattedValue}`;
410
444
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Tag, {
411
445
  padding: 1,
412
- onClick: handleClick,
446
+ onClick: handleRemove,
413
447
  icon: /*#__PURE__*/ jsxRuntime.jsx(icons.Cross, {}),
414
- children: content
448
+ label: content,
449
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
450
+ tag: "span",
451
+ cursor: "pointer",
452
+ onClick: handleEdit,
453
+ children: content
454
+ })
415
455
  });
416
456
  };
417
457
  /* -------------------------------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"Filters.js","sources":["../../../../../admin/src/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Popover, Tag } from '@strapi/design-system';\nimport { Plus, Filter as FilterIcon, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport {\n BASE_FILTERS,\n CONTAINS_FILTERS,\n FilterOption,\n IS_SENSITIVE_FILTERS,\n NUMERIC_FILTERS,\n STRING_PARSE_FILTERS,\n FILTERS_WITH_NO_VALUE,\n} from '../constants/filters';\nimport { useControllableState } from '../hooks/useControllableState';\nimport { useQueryParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\nimport { Form, InputProps } from './Form';\nimport { InputRenderer } from './FormInputs/Renderer';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterFormData {\n name: string;\n filter: string;\n value?: string;\n}\n\ninterface FitlersContextValue {\n disabled: boolean;\n onChange: (data: FilterFormData) => void;\n options: Filters.Filter[];\n setOpen: (open: boolean) => void;\n}\n\nconst [FiltersProvider, useFilters] = createContext<FitlersContextValue>('Filters');\n\ninterface RootProps extends Partial<FitlersContextValue>, Popover.Props {\n children: React.ReactNode;\n}\n\nconst Root = ({\n children,\n disabled = false,\n onChange,\n options = [],\n onOpenChange,\n open: openProp,\n defaultOpen,\n ...restProps\n}: RootProps) => {\n const handleChange = (data: FilterFormData) => {\n if (onChange) {\n onChange(data);\n }\n };\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen} {...restProps}>\n <FiltersProvider\n setOpen={setOpen}\n disabled={disabled}\n onChange={handleChange}\n options={options}\n >\n {children}\n </FiltersProvider>\n </Popover.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst Trigger = React.forwardRef<HTMLButtonElement, Filters.TriggerProps>(\n ({ label }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const disabled = useFilters('Trigger', ({ disabled }) => disabled);\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"tertiary\"\n ref={forwardedRef}\n startIcon={<FilterIcon />}\n size=\"S\"\n disabled={disabled}\n >\n {label || formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n/**\n * The zIndex property is used to override the zIndex of the Portal element of the Popover.\n * This is needed to ensure that the DatePicker is rendered above the Popover when opened.\n * The issue was that both the DatePicker and the Popover are rendered in a Portal and have the same zIndex.\n * On init, since the DatePicker is rendered before the Popover in the DOM,\n * it's causing the issue of appearing behind the Popover.\n */\nconst PopoverImpl = ({ zIndex }: { zIndex?: number }) => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n const { formatMessage } = useIntl();\n const options = useFilters('Popover', ({ options }) => options);\n const onChange = useFilters('Popover', ({ onChange }) => onChange);\n const setOpen = useFilters('Popover', ({ setOpen }) => setOpen);\n\n if (options.length === 0) {\n return null;\n }\n\n const handleSubmit = (data: FilterFormData) => {\n const value = FILTERS_WITH_NO_VALUE.includes(data.filter)\n ? 'true'\n : encodeURIComponent(data.value ?? '');\n\n if (!value) {\n return;\n }\n\n if (onChange) {\n onChange(data);\n }\n\n /**\n * There will ALWAYS be an option because we use the options to create the form data.\n */\n const fieldOptions = options.find((filter) => filter.name === data.name)!;\n\n /**\n * If the filter is a relation, we need to nest the filter object,\n * we filter based on the mainField of the relation, if there is no mainField, we use the id.\n * At the end, we pass the operator & value. This value _could_ look like:\n * ```json\n * {\n * \"$eq\": \"1\",\n * }\n * ```\n */\n const operatorValuePairing = {\n [data.filter]: value,\n };\n\n const newFilterQuery = {\n ...query.filters,\n $and: [\n ...(query.filters?.$and ?? []),\n {\n [data.name]:\n fieldOptions.type === 'relation'\n ? {\n [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing,\n }\n : operatorValuePairing,\n },\n ],\n };\n\n setQuery({ filters: newFilterQuery, page: 1 }, 'push', true);\n setOpen(false);\n };\n\n return (\n <Popover.Content style={{ zIndex }}>\n <Box padding={3}>\n <Form\n method=\"POST\"\n initialValues={\n {\n name: options[0]?.name,\n filter: BASE_FILTERS[0].value,\n } satisfies FilterFormData\n }\n onSubmit={handleSubmit}\n >\n {({ values: formValues, modified, isSubmitting }) => {\n const filter = options.find((filter) => filter.name === formValues.name);\n const Input = filter?.input || InputRenderer;\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} style={{ minWidth: 184 }}>\n {[\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n name: 'name',\n options: options.map((filter) => ({\n label: filter.label,\n value: filter.name,\n })),\n placholder: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n type: 'enumeration' as const,\n },\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n name: 'filter',\n options:\n filter?.operators ||\n getFilterList(filter).map((opt) => ({\n label: formatMessage(opt.label),\n value: opt.value,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n type: 'enumeration' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n {filter &&\n formValues.filter &&\n formValues.filter !== '$null' &&\n formValues.filter !== '$notNull' ? (\n <Input\n {...filter}\n label={null}\n aria-label={filter.label}\n name=\"value\"\n // @ts-expect-error – if type is `custom` then `Input` will be a custom component.\n type={filter.mainField?.type ?? filter.type}\n />\n ) : null}\n <Button\n disabled={!modified || isSubmitting}\n size=\"L\"\n variant=\"secondary\"\n startIcon={<Plus />}\n type=\"submit\"\n fullWidth\n >\n {formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Flex>\n );\n }}\n </Form>\n </Box>\n </Popover.Content>\n );\n};\n\n/**\n * Depending on the selected field find the possible filters to apply\n */\nconst getFilterList = (filter?: Filters.Filter): FilterOption[] => {\n if (!filter) {\n return [];\n }\n\n const type = filter.mainField?.type ? filter.mainField.type : filter.type;\n\n switch (type) {\n case 'email':\n case 'text':\n case 'string': {\n return [\n ...BASE_FILTERS,\n ...IS_SENSITIVE_FILTERS,\n ...CONTAINS_FILTERS,\n ...STRING_PARSE_FILTERS,\n ];\n }\n\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n case 'time':\n case 'date': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];\n }\n\n case 'datetime': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n\n case 'enumeration': {\n return BASE_FILTERS;\n }\n\n default:\n return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * List\n * -----------------------------------------------------------------------------------------------*/\n\nconst List = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n\n const options = useFilters('List', ({ options }) => options);\n\n const handleClick = (data: FilterFormData) => {\n /**\n * Check the name, operator and value to see if it already exists in the query\n * if it does, remove it.\n */\n const nextFilters = (query?.filters?.$and ?? []).filter((filter) => {\n const [attributeName] = Object.keys(filter);\n if (attributeName !== data.name) {\n return true;\n }\n\n const { type, mainField } = options.find(({ name }) => name === attributeName)!;\n\n if (type === 'relation') {\n const filterObj = filter[attributeName][mainField?.name ?? 'id'];\n\n if (typeof filterObj === 'object') {\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n return !(operator === data.filter && value === data.value);\n }\n\n return true;\n } else {\n const filterObj = filter[attributeName];\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n return !(operator === data.filter && value === data.value);\n }\n });\n\n setQuery({ filters: { $and: nextFilters }, page: 1 });\n };\n\n if (!query?.filters?.$and?.length) {\n return null;\n }\n\n return (\n <>\n {query?.filters?.$and?.map((queryFilter) => {\n const [attributeName] = Object.keys(queryFilter);\n const filter = options.find(({ name }) => name === attributeName);\n const filterObj = queryFilter[attributeName];\n\n if (!filter || typeof filterObj !== 'object' || filterObj === null) {\n return null;\n }\n\n if (filter.type === 'relation') {\n const modelFilter = filterObj[filter.mainField?.name ?? 'id'];\n\n if (typeof modelFilter === 'object') {\n const [operator] = Object.keys(modelFilter);\n const value = modelFilter[operator];\n return (\n <AttributeTag\n key={`${attributeName}-${operator}-${value}`}\n {...filter}\n onClick={handleClick}\n operator={operator}\n value={value}\n />\n );\n }\n\n return null;\n } else {\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n /**\n * Something has gone wrong here, because the attribute is not a relation\n * but we have a nested filter object.\n */\n if (typeof value === 'object') {\n return null;\n }\n\n return (\n <AttributeTag\n key={`${attributeName}-${operator}-${value}`}\n {...filter}\n onClick={handleClick}\n operator={operator}\n value={value}\n />\n );\n }\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n onClick: (data: FilterFormData) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n input,\n label,\n mainField,\n name,\n onClick,\n operator,\n options,\n value,\n ...filter\n}: AttributeTagProps) => {\n const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();\n\n const handleClick = () => {\n onClick({ name, value, filter: operator });\n };\n\n const type = mainField?.type ? mainField.type : filter.type;\n\n let formattedValue: string = value;\n\n switch (type) {\n case 'date':\n formattedValue = formatDate(value, { dateStyle: 'full' });\n break;\n case 'datetime':\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n break;\n case 'time':\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\n });\n break;\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal':\n formattedValue = formatNumber(Number(value));\n break;\n }\n\n // Handle custom input\n if (input && options) {\n // If the custom input has an options array, find the option with a customValue matching the query value\n const selectedOption = options.find((option) => {\n return (typeof option === 'string' ? option : option.value) === value;\n });\n\n formattedValue = selectedOption\n ? typeof selectedOption === 'string'\n ? selectedOption\n : (selectedOption.label ?? selectedOption.value)\n : value;\n }\n\n const content = `${label} ${formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n })} ${operator !== '$null' && operator !== '$notNull' ? formattedValue : ''}`;\n\n return (\n <Tag padding={1} onClick={handleClick} icon={<Cross />}>\n {content}\n </Tag>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Filters = {\n List,\n Popover: PopoverImpl,\n Root,\n Trigger,\n};\n\ninterface MainField {\n name: string;\n type: Schema.Attribute.Kind | 'custom';\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Filters {\n export interface Filter {\n input?: React.ComponentType<ValueInputProps>;\n label: string;\n /**\n * the name of the attribute we use to display the actual name e.g. relations\n * are just ids, so we use the mainField to display something meaninginful by\n * looking at the target's schema\n */\n mainField?: MainField;\n name: string;\n operators?: Array<{\n label: string;\n value: string;\n }>;\n options?: Array<{ label?: string; value: string }> | string[];\n type: InputProps['type'] | 'relation' | 'custom';\n }\n\n export interface ValueInputProps extends Omit<Filter, 'label'> {\n ['aria-label']: string;\n }\n\n export type Props = RootProps;\n\n export interface TriggerProps {\n label?: string;\n }\n\n export interface Query {\n filters?: {\n /**\n * Typically, a filter will be:\n * ```ts\n * {\n * [attributeName]: {\n * [operator]: value\n * }\n * }\n * ```\n * However, for relation items it becomes more nested.\n * ```ts\n * {\n * [attributeName]: {\n * [relationTargetAttribute]: {\n * [operator]: value\n * }\n * }\n * }\n * ```\n */\n $and?: Array<Record<string, Record<string, string | Record<string, string>>>>;\n };\n page?: number;\n }\n}\n\nexport { Filters };\n"],"names":["FiltersProvider","useFilters","createContext","Root","children","disabled","onChange","options","onOpenChange","open","openProp","defaultOpen","restProps","handleChange","data","setOpen","useControllableState","prop","defaultProp","_jsx","Popover","Trigger","React","forwardRef","label","forwardedRef","formatMessage","useIntl","Button","variant","ref","startIcon","FilterIcon","size","id","defaultMessage","PopoverImpl","zIndex","query","setQuery","useQueryParams","length","handleSubmit","value","FILTERS_WITH_NO_VALUE","includes","filter","encodeURIComponent","fieldOptions","find","name","operatorValuePairing","newFilterQuery","filters","$and","type","mainField","page","Content","style","Box","padding","Form","method","initialValues","BASE_FILTERS","onSubmit","values","formValues","modified","isSubmitting","Input","input","InputRenderer","_jsxs","Flex","direction","alignItems","gap","minWidth","map","placholder","operators","getFilterList","opt","placeholder","field","aria-label","Plus","fullWidth","IS_SENSITIVE_FILTERS","CONTAINS_FILTERS","STRING_PARSE_FILTERS","NUMERIC_FILTERS","List","handleClick","nextFilters","attributeName","Object","keys","filterObj","operator","_Fragment","queryFilter","modelFilter","AttributeTag","onClick","formatDate","formatTime","formatNumber","formattedValue","dateStyle","timeStyle","hour","minute","split","date","Date","setHours","Number","setMinutes","selectedOption","option","content","Tag","icon","Cross","Filters"],"mappings":"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"}
1
+ {"version":3,"file":"Filters.js","sources":["../../../../../admin/src/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Popover, Tag } from '@strapi/design-system';\nimport { Plus, Filter as FilterIcon, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport {\n BASE_FILTERS,\n CONTAINS_FILTERS,\n FilterOption,\n IS_SENSITIVE_FILTERS,\n NUMERIC_FILTERS,\n STRING_PARSE_FILTERS,\n FILTERS_WITH_NO_VALUE,\n} from '../constants/filters';\nimport { useControllableState } from '../hooks/useControllableState';\nimport { useQueryParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\nimport { Form, InputProps } from './Form';\nimport { InputRenderer } from './FormInputs/Renderer';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterFormData {\n name: string;\n filter: string;\n value?: string;\n}\n\ninterface FitlersContextValue {\n disabled: boolean;\n onChange: (data: FilterFormData) => void;\n options: Filters.Filter[];\n setOpen: (open: boolean) => void;\n editingFilter: FilterFormData | null;\n setEditingFilter: (filter: FilterFormData | null) => void;\n}\n\nconst [FiltersProvider, useFilters] = createContext<FitlersContextValue>('Filters');\n\nconst getFilterDetails = (\n filterEntry: Record<string, unknown>,\n options: Filters.Filter[]\n): { name: string; operator: string; value: unknown } | null => {\n const [name] = Object.keys(filterEntry);\n const option = options.find((o) => o.name === name);\n if (!option) {\n return null;\n }\n\n const operatorObj =\n option.type === 'relation'\n ? (filterEntry[name] as Record<string, unknown>)?.[option.mainField?.name ?? 'id']\n : filterEntry[name];\n\n if (typeof operatorObj !== 'object' || operatorObj === null) {\n return null;\n }\n\n const [operator] = Object.keys(operatorObj as Record<string, unknown>);\n if (!operator) {\n return null;\n }\n\n return { name, operator, value: (operatorObj as Record<string, unknown>)[operator] };\n};\n\nconst isFilterMatch = (\n filterEntry: Record<string, unknown>,\n options: Filters.Filter[],\n target: FilterFormData\n): boolean => {\n const details = getFilterDetails(filterEntry, options);\n if (!details || details.name !== target.name || details.operator !== target.filter) {\n return false;\n }\n if (FILTERS_WITH_NO_VALUE.includes(target.filter)) {\n return true;\n }\n\n const decoded =\n typeof details.value === 'string' ? decodeURIComponent(details.value) : details.value;\n return decoded === target.value;\n};\n\ninterface RootProps\n extends Partial<Pick<FitlersContextValue, 'disabled' | 'onChange' | 'options'>>,\n Popover.Props {\n children: React.ReactNode;\n}\n\nconst Root = ({\n children,\n disabled = false,\n onChange,\n options = [],\n onOpenChange,\n open: openProp,\n defaultOpen,\n ...restProps\n}: RootProps) => {\n const [editingFilter, setEditingFilter] = React.useState<FilterFormData | null>(null);\n\n const handleChange = (data: FilterFormData) => {\n if (onChange) {\n onChange(data);\n }\n };\n\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n React.useEffect(() => {\n if (!open) {\n setEditingFilter(null);\n }\n }, [open]);\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen} {...restProps}>\n <FiltersProvider\n setOpen={setOpen}\n disabled={disabled}\n onChange={handleChange}\n options={options}\n editingFilter={editingFilter}\n setEditingFilter={setEditingFilter}\n >\n {children}\n </FiltersProvider>\n </Popover.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst Trigger = React.forwardRef<HTMLButtonElement, Filters.TriggerProps>(\n ({ label }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const disabled = useFilters('Trigger', ({ disabled }) => disabled);\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"tertiary\"\n ref={forwardedRef}\n startIcon={<FilterIcon />}\n size=\"S\"\n disabled={disabled}\n >\n {label || formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n/**\n * The zIndex property is used to override the zIndex of the Portal element of the Popover.\n * This is needed to ensure that the DatePicker is rendered above the Popover when opened.\n * The issue was that both the DatePicker and the Popover are rendered in a Portal and have the same zIndex.\n * On init, since the DatePicker is rendered before the Popover in the DOM,\n * it's causing the issue of appearing behind the Popover.\n */\nconst PopoverImpl = ({ zIndex }: { zIndex?: number }) => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n const { formatMessage } = useIntl();\n const options = useFilters('Popover', ({ options }) => options);\n const onChange = useFilters('Popover', ({ onChange }) => onChange);\n const setOpen = useFilters('Popover', ({ setOpen }) => setOpen);\n const editingFilter = useFilters('Popover', ({ editingFilter }) => editingFilter);\n const setEditingFilter = useFilters('Popover', ({ setEditingFilter }) => setEditingFilter);\n\n const initialValues = React.useMemo(() => {\n return editingFilter ?? { name: options[0]?.name, filter: BASE_FILTERS[0].value };\n }, [editingFilter, options]);\n\n if (options.length === 0) {\n return null;\n }\n\n const handleSubmit = (data: FilterFormData) => {\n const value = FILTERS_WITH_NO_VALUE.includes(data.filter)\n ? 'true'\n : encodeURIComponent(data.value ?? '');\n\n if (!value) {\n return;\n }\n\n if (onChange) {\n onChange(data);\n }\n\n /**\n * There will ALWAYS be an option because we use the options to create the form data.\n */\n const fieldOptions = options.find((filter) => filter.name === data.name)!;\n\n /**\n * If the filter is a relation, we need to nest the filter object,\n * we filter based on the mainField of the relation, if there is no mainField, we use the id.\n * At the end, we pass the operator & value. This value _could_ look like:\n * ```json\n * {\n * \"$eq\": \"1\",\n * }\n * ```\n */\n const operatorValuePairing = {\n [data.filter]: value,\n };\n\n const newFilterEntry = {\n [data.name]:\n fieldOptions.type === 'relation'\n ? {\n [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing,\n }\n : operatorValuePairing,\n };\n\n const existingFilters = query.filters?.$and ?? [];\n\n const newFilterQuery = editingFilter\n ? {\n ...query.filters,\n $and: existingFilters.map((filter) =>\n isFilterMatch(filter, options, editingFilter) ? newFilterEntry : filter\n ),\n }\n : {\n ...query.filters,\n $and: [...existingFilters, newFilterEntry],\n };\n\n setQuery({ filters: newFilterQuery, page: 1 }, 'push', true);\n setOpen(false);\n setEditingFilter(null);\n };\n\n return (\n <Popover.Content style={{ zIndex }}>\n <Box padding={3}>\n <Form\n method=\"POST\"\n initialValues={initialValues}\n onSubmit={handleSubmit}\n key={\n editingFilter\n ? `edit-${editingFilter.name}-${editingFilter.filter}-${editingFilter.value ?? 'empty'}`\n : 'create'\n }\n >\n {({ values: formValues, modified, isSubmitting }) => {\n const filter = options.find((filter) => filter.name === formValues.name);\n const Input = filter?.input || InputRenderer;\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} style={{ minWidth: 184 }}>\n {[\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n name: 'name',\n options: options.map((filter) => ({\n label: filter.label,\n value: filter.name,\n })),\n placholder: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n type: 'enumeration' as const,\n },\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n name: 'filter',\n options:\n filter?.operators ||\n getFilterList(filter).map((opt) => ({\n label: formatMessage(opt.label),\n value: opt.value,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n type: 'enumeration' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n {filter &&\n formValues.filter &&\n !FILTERS_WITH_NO_VALUE.includes(formValues.filter) ? (\n <Input\n {...filter}\n label={null}\n aria-label={filter.label}\n name=\"value\"\n // @ts-expect-error – if type is `custom` then `Input` will be a custom component.\n type={filter.mainField?.type ?? filter.type}\n />\n ) : null}\n <Button\n disabled={!modified || isSubmitting}\n size=\"L\"\n variant=\"secondary\"\n startIcon={<Plus />}\n type=\"submit\"\n fullWidth\n >\n {editingFilter\n ? formatMessage({\n id: 'app.utils.update-filter',\n defaultMessage: 'Update filter',\n })\n : formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Flex>\n );\n }}\n </Form>\n </Box>\n </Popover.Content>\n );\n};\n\n/**\n * Depending on the selected field find the possible filters to apply\n */\nconst getFilterList = (filter?: Filters.Filter): FilterOption[] => {\n if (!filter) {\n return [];\n }\n\n const type = filter.mainField?.type ? filter.mainField.type : filter.type;\n\n switch (type) {\n case 'email':\n case 'text':\n case 'string': {\n return [\n ...BASE_FILTERS,\n ...IS_SENSITIVE_FILTERS,\n ...CONTAINS_FILTERS,\n ...STRING_PARSE_FILTERS,\n ];\n }\n\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n case 'time':\n case 'date': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];\n }\n\n case 'datetime': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n\n case 'enumeration': {\n return BASE_FILTERS;\n }\n\n default:\n return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * List\n * -----------------------------------------------------------------------------------------------*/\n\nconst List = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n\n const options = useFilters('List', ({ options }) => options);\n\n const handleClick = (data: FilterFormData) => {\n /**\n * Check the name, operator and value to see if it already exists in the query\n * if it does, remove it.\n */\n const nextFilters = (query?.filters?.$and ?? []).filter((filter) => {\n const details = getFilterDetails(filter, options);\n if (!details) {\n return true;\n }\n\n return !(\n details.name === data.name &&\n details.operator === data.filter &&\n details.value === data.value\n );\n });\n\n setQuery({ filters: { $and: nextFilters }, page: 1 });\n };\n\n if (!query?.filters?.$and?.length) {\n return null;\n }\n\n return (\n <>\n {query?.filters?.$and?.map((queryFilter) => {\n const details = getFilterDetails(queryFilter, options);\n if (!details || typeof details.value === 'object') {\n return null;\n }\n\n const filter = options.find(({ name }) => name === details.name);\n if (!filter) {\n return null;\n }\n return (\n <AttributeTag\n key={`${details.name}-${details.operator}-${details.value}`}\n {...filter}\n onRemove={handleClick}\n operator={details.operator}\n value={String(details.value)}\n />\n );\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n onRemove: (data: FilterFormData) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n input,\n label,\n mainField,\n name,\n onRemove,\n operator,\n options,\n value,\n ...filter\n}: AttributeTagProps) => {\n const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();\n const setOpen = useFilters('AttributeTag', ({ setOpen }) => setOpen);\n const setEditingFilter = useFilters('AttributeTag', ({ setEditingFilter }) => setEditingFilter);\n\n const handleEdit = () => {\n setEditingFilter({\n name,\n filter: operator,\n value: FILTERS_WITH_NO_VALUE.includes(operator) ? undefined : decodeURIComponent(value),\n });\n setOpen(true);\n };\n\n const handleRemove = () => {\n onRemove({ name, value, filter: operator });\n };\n\n const type = mainField?.type ? mainField.type : filter.type;\n\n let formattedValue: string = value;\n\n switch (type) {\n case 'date':\n formattedValue = formatDate(value, { dateStyle: 'full' });\n break;\n case 'datetime':\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n break;\n case 'time':\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\n });\n break;\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal':\n formattedValue = formatNumber(Number(value));\n break;\n }\n\n // Handle custom input\n if (input && options) {\n // If the custom input has an options array, find the option with a customValue matching the query value\n const selectedOption = options.find((option) => {\n return (typeof option === 'string' ? option : option.value) === value;\n });\n\n formattedValue = selectedOption\n ? typeof selectedOption === 'string'\n ? selectedOption\n : (selectedOption.label ?? selectedOption.value)\n : value;\n }\n\n const operatorLabel = formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n });\n\n const content = FILTERS_WITH_NO_VALUE.includes(operator)\n ? `${label} ${operatorLabel}`\n : `${label} ${operatorLabel} ${formattedValue}`;\n\n return (\n <Tag padding={1} onClick={handleRemove} icon={<Cross />} label={content}>\n <Box tag=\"span\" cursor=\"pointer\" onClick={handleEdit}>\n {content}\n </Box>\n </Tag>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Filters = {\n List,\n Popover: PopoverImpl,\n Root,\n Trigger,\n};\n\ninterface MainField {\n name: string;\n type: Schema.Attribute.Kind | 'custom';\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Filters {\n export interface Filter {\n input?: React.ComponentType<ValueInputProps>;\n label: string;\n /**\n * the name of the attribute we use to display the actual name e.g. relations\n * are just ids, so we use the mainField to display something meaninginful by\n * looking at the target's schema\n */\n mainField?: MainField;\n name: string;\n operators?: Array<{\n label: string;\n value: string;\n }>;\n options?: Array<{ label?: string; value: string }> | string[];\n type: InputProps['type'] | 'relation' | 'custom';\n }\n\n export interface ValueInputProps extends Omit<Filter, 'label'> {\n ['aria-label']: string;\n }\n\n export type Props = RootProps;\n\n export interface TriggerProps {\n label?: string;\n }\n\n export interface Query {\n filters?: {\n /**\n * Typically, a filter will be:\n * ```ts\n * {\n * [attributeName]: {\n * [operator]: value\n * }\n * }\n * ```\n * However, for relation items it becomes more nested.\n * ```ts\n * {\n * [attributeName]: {\n * [relationTargetAttribute]: {\n * [operator]: value\n * }\n * }\n * }\n * ```\n */\n $and?: Array<Record<string, Record<string, string | Record<string, string>>>>;\n };\n page?: number;\n }\n}\n\nexport { Filters };\n"],"names":["FiltersProvider","useFilters","createContext","getFilterDetails","filterEntry","options","name","Object","keys","option","find","o","operatorObj","type","mainField","operator","value","isFilterMatch","target","details","filter","FILTERS_WITH_NO_VALUE","includes","decoded","decodeURIComponent","Root","children","disabled","onChange","onOpenChange","open","openProp","defaultOpen","restProps","editingFilter","setEditingFilter","React","useState","handleChange","data","setOpen","useControllableState","prop","defaultProp","useEffect","_jsx","Popover","Trigger","forwardRef","label","forwardedRef","formatMessage","useIntl","Button","variant","ref","startIcon","FilterIcon","size","id","defaultMessage","PopoverImpl","zIndex","query","setQuery","useQueryParams","initialValues","useMemo","BASE_FILTERS","length","handleSubmit","encodeURIComponent","fieldOptions","operatorValuePairing","newFilterEntry","existingFilters","filters","$and","newFilterQuery","map","page","Content","style","Box","padding","Form","method","onSubmit","values","formValues","modified","isSubmitting","Input","input","InputRenderer","_jsxs","Flex","direction","alignItems","gap","minWidth","placholder","operators","getFilterList","opt","placeholder","field","aria-label","Plus","fullWidth","IS_SENSITIVE_FILTERS","CONTAINS_FILTERS","STRING_PARSE_FILTERS","NUMERIC_FILTERS","List","handleClick","nextFilters","_Fragment","queryFilter","AttributeTag","onRemove","String","formatDate","formatTime","formatNumber","handleEdit","undefined","handleRemove","formattedValue","dateStyle","timeStyle","hour","minute","split","date","Date","setHours","Number","setMinutes","selectedOption","operatorLabel","content","Tag","onClick","icon","Cross","tag","cursor","Filters"],"mappings":"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"}