@strapi/admin 5.51.1 → 5.52.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.
Files changed (153) hide show
  1. package/dist/admin/admin/src/App.js +1 -1
  2. package/dist/admin/admin/src/App.js.map +1 -1
  3. package/dist/admin/admin/src/App.mjs +1 -1
  4. package/dist/admin/admin/src/App.mjs.map +1 -1
  5. package/dist/admin/admin/src/StrapiApp.js +3 -3
  6. package/dist/admin/admin/src/StrapiApp.js.map +1 -1
  7. package/dist/admin/admin/src/StrapiApp.mjs +3 -3
  8. package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/Filters.js +19 -34
  10. package/dist/admin/admin/src/components/Filters.js.map +1 -1
  11. package/dist/admin/admin/src/components/Filters.mjs +19 -34
  12. package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
  14. package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
  15. package/dist/admin/admin/src/components/NpsSurvey.js +1 -1
  16. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  17. package/dist/admin/admin/src/components/NpsSurvey.mjs +1 -1
  18. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  19. package/dist/admin/admin/src/components/Widgets.js.map +1 -1
  20. package/dist/admin/admin/src/components/Widgets.mjs.map +1 -1
  21. package/dist/admin/admin/src/features/Tracking.js +1 -1
  22. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  23. package/dist/admin/admin/src/features/Tracking.mjs +1 -1
  24. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  25. package/dist/admin/admin/src/hooks/useAPIErrorHandler.js +1 -1
  26. package/dist/admin/admin/src/hooks/useAPIErrorHandler.js.map +1 -1
  27. package/dist/admin/admin/src/hooks/useAPIErrorHandler.mjs +1 -1
  28. package/dist/admin/admin/src/hooks/useAPIErrorHandler.mjs.map +1 -1
  29. package/dist/admin/admin/src/pages/Auth/components/Register.js +35 -26
  30. package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
  31. package/dist/admin/admin/src/pages/Auth/components/Register.mjs +35 -27
  32. package/dist/admin/admin/src/pages/Auth/components/Register.mjs.map +1 -1
  33. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +1 -1
  34. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
  35. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs +1 -1
  36. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs.map +1 -1
  37. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +1 -1
  38. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
  39. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs +1 -1
  40. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs.map +1 -1
  41. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js +1 -1
  42. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js.map +1 -1
  43. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs +1 -1
  44. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs.map +1 -1
  45. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js +1 -3
  46. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
  47. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs +1 -3
  48. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
  49. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js +1 -1
  50. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js.map +1 -1
  51. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs +1 -1
  52. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs.map +1 -1
  53. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js +1 -1
  54. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
  55. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs +1 -1
  56. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs.map +1 -1
  57. package/dist/admin/admin/src/pages/UseCasePage.js +1 -1
  58. package/dist/admin/admin/src/pages/UseCasePage.js.map +1 -1
  59. package/dist/admin/admin/src/pages/UseCasePage.mjs +1 -1
  60. package/dist/admin/admin/src/pages/UseCasePage.mjs.map +1 -1
  61. package/dist/admin/admin/src/translations/id.json.js +105 -1
  62. package/dist/admin/admin/src/translations/id.json.js.map +1 -1
  63. package/dist/admin/admin/src/translations/id.json.mjs +105 -1
  64. package/dist/admin/admin/src/translations/id.json.mjs.map +1 -1
  65. package/dist/admin/admin/src/utils/baseQuery.js +3 -2
  66. package/dist/admin/admin/src/utils/baseQuery.js.map +1 -1
  67. package/dist/admin/admin/src/utils/baseQuery.mjs +3 -2
  68. package/dist/admin/admin/src/utils/baseQuery.mjs.map +1 -1
  69. package/dist/admin/admin/src/utils/users.js +1 -1
  70. package/dist/admin/admin/src/utils/users.js.map +1 -1
  71. package/dist/admin/admin/src/utils/users.mjs +1 -1
  72. package/dist/admin/admin/src/utils/users.mjs.map +1 -1
  73. package/dist/admin/admin/tests/server.js +640 -684
  74. package/dist/admin/admin/tests/server.js.map +1 -1
  75. package/dist/admin/admin/tests/server.mjs +640 -684
  76. package/dist/admin/admin/tests/server.mjs.map +1 -1
  77. package/dist/admin/ee/admin/src/constants.js +22 -26
  78. package/dist/admin/ee/admin/src/constants.js.map +1 -1
  79. package/dist/admin/ee/admin/src/constants.mjs +22 -26
  80. package/dist/admin/ee/admin/src/constants.mjs.map +1 -1
  81. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +1 -1
  82. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
  83. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs +1 -1
  84. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
  85. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/ModalForm.js +16 -20
  86. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/ModalForm.js.map +1 -1
  87. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/ModalForm.mjs +16 -20
  88. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/ModalForm.mjs.map +1 -1
  89. package/dist/admin/src/components/Filters.d.ts +9 -2
  90. package/dist/admin/src/pages/Auth/components/Register.d.ts +10 -0
  91. package/dist/ee/admin/src/pages/SettingsPage/pages/Users/components/ModalForm.d.ts +3 -1
  92. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  93. package/dist/ee/server/src/destroy.d.ts +1 -4
  94. package/dist/ee/server/src/destroy.d.ts.map +1 -1
  95. package/dist/ee/server/src/index.d.ts.map +1 -1
  96. package/dist/server/ee/server/src/audit-logs/services/audit-logs.js +3 -3
  97. package/dist/server/ee/server/src/audit-logs/services/audit-logs.js.map +1 -1
  98. package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs +3 -3
  99. package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs.map +1 -1
  100. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +10 -4
  101. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  102. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +10 -4
  103. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  104. package/dist/server/ee/server/src/controllers/admin.js +1 -1
  105. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  106. package/dist/server/ee/server/src/controllers/admin.mjs +1 -1
  107. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  108. package/dist/server/ee/server/src/destroy.js +1 -1
  109. package/dist/server/ee/server/src/destroy.js.map +1 -1
  110. package/dist/server/ee/server/src/destroy.mjs +1 -1
  111. package/dist/server/ee/server/src/destroy.mjs.map +1 -1
  112. package/dist/server/ee/server/src/index.js +1 -3
  113. package/dist/server/ee/server/src/index.js.map +1 -1
  114. package/dist/server/ee/server/src/index.mjs +1 -3
  115. package/dist/server/ee/server/src/index.mjs.map +1 -1
  116. package/dist/server/ee/server/src/services/index.js.map +1 -1
  117. package/dist/server/ee/server/src/services/index.mjs +2 -2
  118. package/dist/server/ee/server/src/services/index.mjs.map +1 -1
  119. package/dist/server/ee/server/src/services/persist-tables.js +2 -2
  120. package/dist/server/ee/server/src/services/persist-tables.js.map +1 -1
  121. package/dist/server/ee/server/src/services/persist-tables.mjs +4 -4
  122. package/dist/server/ee/server/src/services/persist-tables.mjs.map +1 -1
  123. package/dist/server/server/src/ai/controllers/ai.js +2 -2
  124. package/dist/server/server/src/ai/controllers/ai.js.map +1 -1
  125. package/dist/server/server/src/ai/controllers/ai.mjs +2 -2
  126. package/dist/server/server/src/ai/controllers/ai.mjs.map +1 -1
  127. package/dist/server/server/src/middlewares/rateLimit.js +1 -2
  128. package/dist/server/server/src/middlewares/rateLimit.js.map +1 -1
  129. package/dist/server/server/src/middlewares/rateLimit.mjs +2 -2
  130. package/dist/server/server/src/middlewares/rateLimit.mjs.map +1 -1
  131. package/dist/server/server/src/services/encryption.js +1 -1
  132. package/dist/server/server/src/services/encryption.js.map +1 -1
  133. package/dist/server/server/src/services/encryption.mjs +1 -1
  134. package/dist/server/server/src/services/encryption.mjs.map +1 -1
  135. package/dist/server/server/src/services/permission/engine.js +4 -8
  136. package/dist/server/server/src/services/permission/engine.js.map +1 -1
  137. package/dist/server/server/src/services/permission/engine.mjs +5 -5
  138. package/dist/server/server/src/services/permission/engine.mjs.map +1 -1
  139. package/dist/server/server/src/services/transfer/permission.js +1 -5
  140. package/dist/server/server/src/services/transfer/permission.js.map +1 -1
  141. package/dist/server/server/src/services/transfer/permission.mjs +2 -2
  142. package/dist/server/server/src/services/transfer/permission.mjs.map +1 -1
  143. package/dist/server/server/src/services/user.js +1 -1
  144. package/dist/server/server/src/services/user.js.map +1 -1
  145. package/dist/server/server/src/services/user.mjs +1 -1
  146. package/dist/server/server/src/services/user.mjs.map +1 -1
  147. package/dist/server/src/index.d.ts.map +1 -1
  148. package/dist/server/src/middlewares/index.d.ts.map +1 -1
  149. package/dist/server/src/services/permission/engine.d.ts +1 -1
  150. package/dist/server/src/services/permission/engine.d.ts.map +1 -1
  151. package/dist/server/src/services/transfer/permission.d.ts +2 -2
  152. package/dist/server/src/services/transfer/permission.d.ts.map +1 -1
  153. package/package.json +12 -12
@@ -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 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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"}
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\n/**\n * Carries the position in the `$and` array so we replace that exact entry, not every entry\n * sharing the same `(name, operator, value)`.\n */\ninterface EditingFilter extends FilterFormData {\n index: number;\n}\n\ninterface FitlersContextValue {\n disabled: boolean;\n onChange: (data: FilterFormData) => void;\n options: Filters.Filter[];\n setOpen: (open: boolean) => void;\n editingFilter: EditingFilter | null;\n setEditingFilter: (filter: EditingFilter | 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\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<EditingFilter | 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, i) =>\n i === editingFilter.index ? 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.index}-${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 /**\n * Removed by position: identical filters are a legal query, so matching on\n * `(name, operator, value)` would drop every copy at once.\n */\n const handleRemove = (index: number) => {\n const nextFilters = (query?.filters?.$and ?? []).filter((_, i) => i !== index);\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, index) => {\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 /**\n * `index` is the position in the raw `$and` array — entries skipped above still count.\n * Never cache it: `qs` re-indexes on removal, so dropping entry 0 of [0, 1, 2]\n * leaves [0, 1] and any held index goes stale.\n */\n return (\n <AttributeTag\n key={`${index}-${details.name}-${details.operator}-${details.value}`}\n {...filter}\n index={index}\n onRemove={handleRemove}\n operator={details.operator}\n value={String(details.value)}\n />\n );\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n /**\n * Position in the `$and` array. An explicit prop rather than a closure bound at the call\n * site, so it stays part of the props comparison if this ever gets memoised.\n */\n index: number;\n onRemove: (index: number) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n index,\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 index,\n value: FILTERS_WITH_NO_VALUE.includes(operator) ? undefined : decodeURIComponent(value),\n });\n setOpen(true);\n };\n\n const handleRemove = () => {\n onRemove(index);\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","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","filter","BASE_FILTERS","length","handleSubmit","FILTERS_WITH_NO_VALUE","includes","encodeURIComponent","fieldOptions","operatorValuePairing","newFilterEntry","existingFilters","filters","$and","newFilterQuery","map","i","index","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","handleRemove","nextFilters","_","_Fragment","queryFilter","details","AttributeTag","onRemove","String","formatDate","formatTime","formatNumber","handleEdit","undefined","decodeURIComponent","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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"}
@@ -31,17 +31,6 @@ const getFilterDetails = (filterEntry, options)=>{
31
31
  value: operatorObj[operator]
32
32
  };
33
33
  };
34
- const isFilterMatch = (filterEntry, options, target)=>{
35
- const details = getFilterDetails(filterEntry, options);
36
- if (!details || details.name !== target.name || details.operator !== target.filter) {
37
- return false;
38
- }
39
- if (FILTERS_WITH_NO_VALUE.includes(target.filter)) {
40
- return true;
41
- }
42
- const decoded = typeof details.value === 'string' ? decodeURIComponent(details.value) : details.value;
43
- return decoded === target.value;
44
- };
45
34
  const Root = ({ children, disabled = false, onChange, options = [], onOpenChange, open: openProp, defaultOpen, ...restProps })=>{
46
35
  const [editingFilter, setEditingFilter] = React.useState(null);
47
36
  const handleChange = (data)=>{
@@ -154,7 +143,7 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
154
143
  const existingFilters = query.filters?.$and ?? [];
155
144
  const newFilterQuery = editingFilter ? {
156
145
  ...query.filters,
157
- $and: existingFilters.map((filter)=>isFilterMatch(filter, options, editingFilter) ? newFilterEntry : filter)
146
+ $and: existingFilters.map((filter, i)=>i === editingFilter.index ? newFilterEntry : filter)
158
147
  } : {
159
148
  ...query.filters,
160
149
  $and: [
@@ -252,7 +241,7 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
252
241
  ]
253
242
  });
254
243
  }
255
- }, editingFilter ? `edit-${editingFilter.name}-${editingFilter.filter}-${editingFilter.value ?? 'empty'}` : 'create')
244
+ }, editingFilter ? `edit-${editingFilter.index}-${editingFilter.name}-${editingFilter.filter}-${editingFilter.value ?? 'empty'}` : 'create')
256
245
  })
257
246
  });
258
247
  };
@@ -317,17 +306,11 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
317
306
  * -----------------------------------------------------------------------------------------------*/ const List = ()=>{
318
307
  const [{ query }, setQuery] = useQueryParams();
319
308
  const options = useFilters('List', ({ options })=>options);
320
- const handleClick = (data)=>{
321
- /**
322
- * Check the name, operator and value to see if it already exists in the query
323
- * if it does, remove it.
324
- */ const nextFilters = (query?.filters?.$and ?? []).filter((filter)=>{
325
- const details = getFilterDetails(filter, options);
326
- if (!details) {
327
- return true;
328
- }
329
- return !(details.name === data.name && details.operator === data.filter && details.value === data.value);
330
- });
309
+ /**
310
+ * Removed by position: identical filters are a legal query, so matching on
311
+ * `(name, operator, value)` would drop every copy at once.
312
+ */ const handleRemove = (index)=>{
313
+ const nextFilters = (query?.filters?.$and ?? []).filter((_, i)=>i !== index);
331
314
  setQuery({
332
315
  filters: {
333
316
  $and: nextFilters
@@ -339,7 +322,7 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
339
322
  return null;
340
323
  }
341
324
  return /*#__PURE__*/ jsx(Fragment, {
342
- children: query?.filters?.$and?.map((queryFilter)=>{
325
+ children: query?.filters?.$and?.map((queryFilter, index)=>{
343
326
  const details = getFilterDetails(queryFilter, options);
344
327
  if (!details || typeof details.value === 'object') {
345
328
  return null;
@@ -348,16 +331,21 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
348
331
  if (!filter) {
349
332
  return null;
350
333
  }
351
- return /*#__PURE__*/ jsx(AttributeTag, {
334
+ /**
335
+ * `index` is the position in the raw `$and` array — entries skipped above still count.
336
+ * Never cache it: `qs` re-indexes on removal, so dropping entry 0 of [0, 1, 2]
337
+ * leaves [0, 1] and any held index goes stale.
338
+ */ return /*#__PURE__*/ jsx(AttributeTag, {
352
339
  ...filter,
353
- onRemove: handleClick,
340
+ index: index,
341
+ onRemove: handleRemove,
354
342
  operator: details.operator,
355
343
  value: String(details.value)
356
- }, `${details.name}-${details.operator}-${details.value}`);
344
+ }, `${index}-${details.name}-${details.operator}-${details.value}`);
357
345
  })
358
346
  });
359
347
  };
360
- const AttributeTag = ({ input, label, mainField, name, onRemove, operator, options, value, ...filter })=>{
348
+ const AttributeTag = ({ index, input, label, mainField, name, onRemove, operator, options, value, ...filter })=>{
361
349
  const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();
362
350
  const setOpen = useFilters('AttributeTag', ({ setOpen })=>setOpen);
363
351
  const setEditingFilter = useFilters('AttributeTag', ({ setEditingFilter })=>setEditingFilter);
@@ -365,16 +353,13 @@ const AttributeTag = ({ input, label, mainField, name, onRemove, operator, optio
365
353
  setEditingFilter({
366
354
  name,
367
355
  filter: operator,
356
+ index,
368
357
  value: FILTERS_WITH_NO_VALUE.includes(operator) ? undefined : decodeURIComponent(value)
369
358
  });
370
359
  setOpen(true);
371
360
  };
372
361
  const handleRemove = ()=>{
373
- onRemove({
374
- name,
375
- value,
376
- filter: operator
377
- });
362
+ onRemove(index);
378
363
  };
379
364
  const type = mainField?.type ? mainField.type : filter.type;
380
365
  let formattedValue = value;
@@ -1 +1 @@
1
- {"version":3,"file":"Filters.mjs","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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"}
1
+ {"version":3,"file":"Filters.mjs","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\n/**\n * Carries the position in the `$and` array so we replace that exact entry, not every entry\n * sharing the same `(name, operator, value)`.\n */\ninterface EditingFilter extends FilterFormData {\n index: number;\n}\n\ninterface FitlersContextValue {\n disabled: boolean;\n onChange: (data: FilterFormData) => void;\n options: Filters.Filter[];\n setOpen: (open: boolean) => void;\n editingFilter: EditingFilter | null;\n setEditingFilter: (filter: EditingFilter | 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\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<EditingFilter | 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, i) =>\n i === editingFilter.index ? 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.index}-${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 /**\n * Removed by position: identical filters are a legal query, so matching on\n * `(name, operator, value)` would drop every copy at once.\n */\n const handleRemove = (index: number) => {\n const nextFilters = (query?.filters?.$and ?? []).filter((_, i) => i !== index);\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, index) => {\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 /**\n * `index` is the position in the raw `$and` array — entries skipped above still count.\n * Never cache it: `qs` re-indexes on removal, so dropping entry 0 of [0, 1, 2]\n * leaves [0, 1] and any held index goes stale.\n */\n return (\n <AttributeTag\n key={`${index}-${details.name}-${details.operator}-${details.value}`}\n {...filter}\n index={index}\n onRemove={handleRemove}\n operator={details.operator}\n value={String(details.value)}\n />\n );\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n /**\n * Position in the `$and` array. An explicit prop rather than a closure bound at the call\n * site, so it stays part of the props comparison if this ever gets memoised.\n */\n index: number;\n onRemove: (index: number) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n index,\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 index,\n value: FILTERS_WITH_NO_VALUE.includes(operator) ? undefined : decodeURIComponent(value),\n });\n setOpen(true);\n };\n\n const handleRemove = () => {\n onRemove(index);\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","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","filter","BASE_FILTERS","length","handleSubmit","FILTERS_WITH_NO_VALUE","includes","encodeURIComponent","fieldOptions","operatorValuePairing","newFilterEntry","existingFilters","filters","$and","newFilterQuery","map","i","index","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","handleRemove","nextFilters","_","_Fragment","queryFilter","details","AttributeTag","onRemove","String","formatDate","formatTime","formatNumber","handleEdit","undefined","decodeURIComponent","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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavUser.js","sources":["../../../../../../admin/src/components/MainNav/NavUser.tsx"],"sourcesContent":["import { Flex, Menu, VisuallyHidden, Avatar, Typography, Badge } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useAuth } from '../../features/Auth';\nimport { getInitials, getDisplayName } from '../../utils/users';\n\nconst MenuTrigger = styled(Menu.Trigger)`\n padding: 0;\n\n ${({ theme }) => theme.breakpoints.large} {\n width: 4rem;\n height: 4rem;\n justify-content: center;\n }\n`;\n\nconst MenuIcon = styled(Flex)`\n height: ${({ theme }) => theme.spaces[7]};\n width: ${({ theme }) => theme.spaces[7]};\n border: none;\n border-radius: 50%;\n padding: 0;\n overflow: hidden;\n`;\n\nconst MenuContent = styled(Menu.Content)`\n max-height: fit-content;\n width: 200px;\n`;\n\nconst UserInfo = styled(Flex)`\n && {\n padding: ${({ theme }) => theme.spaces[3]};\n }\n align-items: flex-start;\n`;\n\nconst BadgeWrapper = styled(Flex)`\n display: flex;\n flex-wrap: wrap;\n gap: ${({ theme }) => theme.spaces[1]};\n\n width: 100%;\n`;\nconst StyledTypography = styled(Typography)`\n word-break: break-word;\n margin-bottom: ${({ theme }) => theme.spaces[3]};\n`;\n\nexport interface NavUserProps {\n initials?: string;\n children?: React.ReactNode;\n showDisplayName?: boolean;\n}\n\nexport const NavUser = ({\n initials,\n showDisplayName = false,\n children,\n ...props\n}: NavUserProps) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const user = useAuth('User', (state) => state.user);\n const logout = useAuth('Logout', (state) => state.logout);\n const userDisplayName = getDisplayName(user);\n\n const handleProfile = () => {\n const redirection = '/me';\n navigate(redirection);\n };\n\n const handleSessions = () => {\n navigate('/me/sessions');\n };\n\n const handleLogout = () => {\n const redirection = '/auth/login';\n logout();\n navigate(redirection);\n };\n\n return (\n <Flex {...props}>\n <Menu.Root>\n <MenuTrigger endIcon={null} fullWidth justifyContent=\"flex-start\">\n <Flex alignItems=\"center\" gap={3}>\n <MenuIcon justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials || getInitials(user)} />\n </MenuIcon>\n {showDisplayName ? (\n <Typography variant=\"omega\">{children || userDisplayName}</Typography>\n ) : (\n <VisuallyHidden tag=\"span\">{children || userDisplayName}</VisuallyHidden>\n )}\n </Flex>\n </MenuTrigger>\n\n <MenuContent popoverPlacement=\"top-start\" zIndex={3}>\n <UserInfo direction=\"column\" gap={0} alignItems=\"flex-start\">\n <Typography variant=\"omega\" fontWeight=\"bold\" textTransform=\"none\">\n {children || userDisplayName}\n </Typography>\n <StyledTypography variant=\"pi\" textColor=\"neutral600\">\n {user?.email}\n </StyledTypography>\n <BadgeWrapper>\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </BadgeWrapper>\n </UserInfo>\n\n <Menu.Separator />\n\n <Menu.Item onSelect={handleProfile}>\n {formatMessage({\n id: 'global.profile.settings',\n defaultMessage: 'Profile settings',\n })}\n </Menu.Item>\n\n <Menu.Item onSelect={handleSessions}>\n {formatMessage({\n id: 'global.sessions.active-devices',\n defaultMessage: 'Active devices',\n })}\n </Menu.Item>\n\n <Menu.Item variant=\"danger\" onSelect={handleLogout} color=\"danger600\">\n {formatMessage({\n id: 'app.components.LeftMenu.logout',\n defaultMessage: 'Log out',\n })}\n </Menu.Item>\n </MenuContent>\n </Menu.Root>\n </Flex>\n );\n};\n"],"names":["MenuTrigger","styled","Menu","Trigger","theme","breakpoints","large","MenuIcon","Flex","spaces","MenuContent","Content","UserInfo","BadgeWrapper","StyledTypography","Typography","NavUser","initials","showDisplayName","children","props","formatMessage","useIntl","navigate","useNavigate","user","useAuth","state","logout","userDisplayName","getDisplayName","handleProfile","redirection","handleSessions","handleLogout","_jsx","_jsxs","Root","endIcon","fullWidth","justifyContent","alignItems","gap","Avatar","Item","delayMs","fallback","getInitials","variant","VisuallyHidden","tag","popoverPlacement","zIndex","direction","fontWeight","textTransform","textColor","email","roles","map","role","Badge","name","id","Separator","onSelect","defaultMessage","color"],"mappings":"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"}
1
+ {"version":3,"file":"NavUser.js","sources":["../../../../../../admin/src/components/MainNav/NavUser.tsx"],"sourcesContent":["import { Flex, Menu, VisuallyHidden, Avatar, Typography, Badge } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useAuth } from '../../features/Auth';\nimport { getInitials, getDisplayName } from '../../utils/users';\n\nconst MenuTrigger = styled(Menu.Trigger)`\n padding: 0;\n\n ${({ theme }) => theme.breakpoints.large} {\n width: 4rem;\n height: 4rem;\n justify-content: center;\n }\n`;\n\nconst MenuIcon = styled(Flex)`\n height: ${({ theme }) => theme.spaces[7]};\n width: ${({ theme }) => theme.spaces[7]};\n border: none;\n border-radius: 50%;\n padding: 0;\n overflow: hidden;\n`;\n\nconst MenuContent = styled(Menu.Content)`\n max-height: fit-content;\n width: 200px;\n`;\n\nconst UserInfo = styled(Flex)`\n && {\n padding: ${({ theme }) => theme.spaces[3]};\n }\n align-items: flex-start;\n`;\n\nconst BadgeWrapper = styled(Flex)`\n display: flex;\n flex-wrap: wrap;\n gap: ${({ theme }) => theme.spaces[1]};\n\n width: 100%;\n`;\nconst StyledTypography = styled(Typography)`\n word-break: break-word;\n margin-bottom: ${({ theme }) => theme.spaces[3]};\n`;\n\nexport interface NavUserProps {\n initials?: string;\n children?: React.ReactNode;\n showDisplayName?: boolean;\n}\n\nexport const NavUser = ({\n initials,\n showDisplayName = false,\n children,\n ...props\n}: NavUserProps) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const user = useAuth('User', (state) => state.user);\n const logout = useAuth('Logout', (state) => state.logout);\n const userDisplayName = getDisplayName(user);\n\n const handleProfile = () => {\n const redirection = '/me';\n navigate(redirection);\n };\n\n const handleSessions = () => {\n navigate('/me/sessions');\n };\n\n const handleLogout = () => {\n const redirection = '/auth/login';\n logout();\n navigate(redirection);\n };\n\n return (\n <Flex {...props}>\n <Menu.Root>\n <MenuTrigger endIcon={null} fullWidth justifyContent=\"flex-start\">\n <Flex alignItems=\"center\" gap={3}>\n <MenuIcon justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials || getInitials(user)} />\n </MenuIcon>\n {showDisplayName ? (\n <Typography variant=\"omega\">{children || userDisplayName}</Typography>\n ) : (\n <VisuallyHidden tag=\"span\">{children || userDisplayName}</VisuallyHidden>\n )}\n </Flex>\n </MenuTrigger>\n\n <MenuContent popoverPlacement=\"top-start\" zIndex={3}>\n <UserInfo direction=\"column\" gap={0} alignItems=\"flex-start\">\n <Typography variant=\"omega\" fontWeight=\"bold\" textTransform=\"none\">\n {children || userDisplayName}\n </Typography>\n <StyledTypography variant=\"pi\" textColor=\"neutral600\">\n {user?.email}\n </StyledTypography>\n <BadgeWrapper>\n {user?.roles?.map((role) => (\n <Badge key={role.id}>{role.name}</Badge>\n ))}\n </BadgeWrapper>\n </UserInfo>\n\n <Menu.Separator />\n\n <Menu.Item onSelect={handleProfile}>\n {formatMessage({\n id: 'global.profile.settings',\n defaultMessage: 'Profile settings',\n })}\n </Menu.Item>\n\n <Menu.Item onSelect={handleSessions}>\n {formatMessage({\n id: 'global.sessions.active-devices',\n defaultMessage: 'Active devices',\n })}\n </Menu.Item>\n\n <Menu.Item variant=\"danger\" onSelect={handleLogout} color=\"danger600\">\n {formatMessage({\n id: 'app.components.LeftMenu.logout',\n defaultMessage: 'Log out',\n })}\n </Menu.Item>\n </MenuContent>\n </Menu.Root>\n </Flex>\n );\n};\n"],"names":["MenuTrigger","styled","Menu","Trigger","theme","breakpoints","large","MenuIcon","Flex","spaces","MenuContent","Content","UserInfo","BadgeWrapper","StyledTypography","Typography","NavUser","initials","showDisplayName","children","props","formatMessage","useIntl","navigate","useNavigate","user","useAuth","state","logout","userDisplayName","getDisplayName","handleProfile","redirection","handleSessions","handleLogout","_jsx","_jsxs","Root","endIcon","fullWidth","justifyContent","alignItems","gap","Avatar","Item","delayMs","fallback","getInitials","variant","VisuallyHidden","tag","popoverPlacement","zIndex","direction","fontWeight","textTransform","textColor","email","roles","map","role","Badge","name","id","Separator","onSelect","defaultMessage","color"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavUser.mjs","sources":["../../../../../../admin/src/components/MainNav/NavUser.tsx"],"sourcesContent":["import { Flex, Menu, VisuallyHidden, Avatar, Typography, Badge } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useAuth } from '../../features/Auth';\nimport { getInitials, getDisplayName } from '../../utils/users';\n\nconst MenuTrigger = styled(Menu.Trigger)`\n padding: 0;\n\n ${({ theme }) => theme.breakpoints.large} {\n width: 4rem;\n height: 4rem;\n justify-content: center;\n }\n`;\n\nconst MenuIcon = styled(Flex)`\n height: ${({ theme }) => theme.spaces[7]};\n width: ${({ theme }) => theme.spaces[7]};\n border: none;\n border-radius: 50%;\n padding: 0;\n overflow: hidden;\n`;\n\nconst MenuContent = styled(Menu.Content)`\n max-height: fit-content;\n width: 200px;\n`;\n\nconst UserInfo = styled(Flex)`\n && {\n padding: ${({ theme }) => theme.spaces[3]};\n }\n align-items: flex-start;\n`;\n\nconst BadgeWrapper = styled(Flex)`\n display: flex;\n flex-wrap: wrap;\n gap: ${({ theme }) => theme.spaces[1]};\n\n width: 100%;\n`;\nconst StyledTypography = styled(Typography)`\n word-break: break-word;\n margin-bottom: ${({ theme }) => theme.spaces[3]};\n`;\n\nexport interface NavUserProps {\n initials?: string;\n children?: React.ReactNode;\n showDisplayName?: boolean;\n}\n\nexport const NavUser = ({\n initials,\n showDisplayName = false,\n children,\n ...props\n}: NavUserProps) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const user = useAuth('User', (state) => state.user);\n const logout = useAuth('Logout', (state) => state.logout);\n const userDisplayName = getDisplayName(user);\n\n const handleProfile = () => {\n const redirection = '/me';\n navigate(redirection);\n };\n\n const handleSessions = () => {\n navigate('/me/sessions');\n };\n\n const handleLogout = () => {\n const redirection = '/auth/login';\n logout();\n navigate(redirection);\n };\n\n return (\n <Flex {...props}>\n <Menu.Root>\n <MenuTrigger endIcon={null} fullWidth justifyContent=\"flex-start\">\n <Flex alignItems=\"center\" gap={3}>\n <MenuIcon justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials || getInitials(user)} />\n </MenuIcon>\n {showDisplayName ? (\n <Typography variant=\"omega\">{children || userDisplayName}</Typography>\n ) : (\n <VisuallyHidden tag=\"span\">{children || userDisplayName}</VisuallyHidden>\n )}\n </Flex>\n </MenuTrigger>\n\n <MenuContent popoverPlacement=\"top-start\" zIndex={3}>\n <UserInfo direction=\"column\" gap={0} alignItems=\"flex-start\">\n <Typography variant=\"omega\" fontWeight=\"bold\" textTransform=\"none\">\n {children || userDisplayName}\n </Typography>\n <StyledTypography variant=\"pi\" textColor=\"neutral600\">\n {user?.email}\n </StyledTypography>\n <BadgeWrapper>\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </BadgeWrapper>\n </UserInfo>\n\n <Menu.Separator />\n\n <Menu.Item onSelect={handleProfile}>\n {formatMessage({\n id: 'global.profile.settings',\n defaultMessage: 'Profile settings',\n })}\n </Menu.Item>\n\n <Menu.Item onSelect={handleSessions}>\n {formatMessage({\n id: 'global.sessions.active-devices',\n defaultMessage: 'Active devices',\n })}\n </Menu.Item>\n\n <Menu.Item variant=\"danger\" onSelect={handleLogout} color=\"danger600\">\n {formatMessage({\n id: 'app.components.LeftMenu.logout',\n defaultMessage: 'Log out',\n })}\n </Menu.Item>\n </MenuContent>\n </Menu.Root>\n </Flex>\n );\n};\n"],"names":["MenuTrigger","styled","Menu","Trigger","theme","breakpoints","large","MenuIcon","Flex","spaces","MenuContent","Content","UserInfo","BadgeWrapper","StyledTypography","Typography","NavUser","initials","showDisplayName","children","props","formatMessage","useIntl","navigate","useNavigate","user","useAuth","state","logout","userDisplayName","getDisplayName","handleProfile","redirection","handleSessions","handleLogout","_jsx","_jsxs","Root","endIcon","fullWidth","justifyContent","alignItems","gap","Avatar","Item","delayMs","fallback","getInitials","variant","VisuallyHidden","tag","popoverPlacement","zIndex","direction","fontWeight","textTransform","textColor","email","roles","map","role","Badge","name","id","Separator","onSelect","defaultMessage","color"],"mappings":"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"}
1
+ {"version":3,"file":"NavUser.mjs","sources":["../../../../../../admin/src/components/MainNav/NavUser.tsx"],"sourcesContent":["import { Flex, Menu, VisuallyHidden, Avatar, Typography, Badge } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useAuth } from '../../features/Auth';\nimport { getInitials, getDisplayName } from '../../utils/users';\n\nconst MenuTrigger = styled(Menu.Trigger)`\n padding: 0;\n\n ${({ theme }) => theme.breakpoints.large} {\n width: 4rem;\n height: 4rem;\n justify-content: center;\n }\n`;\n\nconst MenuIcon = styled(Flex)`\n height: ${({ theme }) => theme.spaces[7]};\n width: ${({ theme }) => theme.spaces[7]};\n border: none;\n border-radius: 50%;\n padding: 0;\n overflow: hidden;\n`;\n\nconst MenuContent = styled(Menu.Content)`\n max-height: fit-content;\n width: 200px;\n`;\n\nconst UserInfo = styled(Flex)`\n && {\n padding: ${({ theme }) => theme.spaces[3]};\n }\n align-items: flex-start;\n`;\n\nconst BadgeWrapper = styled(Flex)`\n display: flex;\n flex-wrap: wrap;\n gap: ${({ theme }) => theme.spaces[1]};\n\n width: 100%;\n`;\nconst StyledTypography = styled(Typography)`\n word-break: break-word;\n margin-bottom: ${({ theme }) => theme.spaces[3]};\n`;\n\nexport interface NavUserProps {\n initials?: string;\n children?: React.ReactNode;\n showDisplayName?: boolean;\n}\n\nexport const NavUser = ({\n initials,\n showDisplayName = false,\n children,\n ...props\n}: NavUserProps) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const user = useAuth('User', (state) => state.user);\n const logout = useAuth('Logout', (state) => state.logout);\n const userDisplayName = getDisplayName(user);\n\n const handleProfile = () => {\n const redirection = '/me';\n navigate(redirection);\n };\n\n const handleSessions = () => {\n navigate('/me/sessions');\n };\n\n const handleLogout = () => {\n const redirection = '/auth/login';\n logout();\n navigate(redirection);\n };\n\n return (\n <Flex {...props}>\n <Menu.Root>\n <MenuTrigger endIcon={null} fullWidth justifyContent=\"flex-start\">\n <Flex alignItems=\"center\" gap={3}>\n <MenuIcon justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials || getInitials(user)} />\n </MenuIcon>\n {showDisplayName ? (\n <Typography variant=\"omega\">{children || userDisplayName}</Typography>\n ) : (\n <VisuallyHidden tag=\"span\">{children || userDisplayName}</VisuallyHidden>\n )}\n </Flex>\n </MenuTrigger>\n\n <MenuContent popoverPlacement=\"top-start\" zIndex={3}>\n <UserInfo direction=\"column\" gap={0} alignItems=\"flex-start\">\n <Typography variant=\"omega\" fontWeight=\"bold\" textTransform=\"none\">\n {children || userDisplayName}\n </Typography>\n <StyledTypography variant=\"pi\" textColor=\"neutral600\">\n {user?.email}\n </StyledTypography>\n <BadgeWrapper>\n {user?.roles?.map((role) => (\n <Badge key={role.id}>{role.name}</Badge>\n ))}\n </BadgeWrapper>\n </UserInfo>\n\n <Menu.Separator />\n\n <Menu.Item onSelect={handleProfile}>\n {formatMessage({\n id: 'global.profile.settings',\n defaultMessage: 'Profile settings',\n })}\n </Menu.Item>\n\n <Menu.Item onSelect={handleSessions}>\n {formatMessage({\n id: 'global.sessions.active-devices',\n defaultMessage: 'Active devices',\n })}\n </Menu.Item>\n\n <Menu.Item variant=\"danger\" onSelect={handleLogout} color=\"danger600\">\n {formatMessage({\n id: 'app.components.LeftMenu.logout',\n defaultMessage: 'Log out',\n })}\n </Menu.Item>\n </MenuContent>\n </Menu.Root>\n </Flex>\n );\n};\n"],"names":["MenuTrigger","styled","Menu","Trigger","theme","breakpoints","large","MenuIcon","Flex","spaces","MenuContent","Content","UserInfo","BadgeWrapper","StyledTypography","Typography","NavUser","initials","showDisplayName","children","props","formatMessage","useIntl","navigate","useNavigate","user","useAuth","state","logout","userDisplayName","getDisplayName","handleProfile","redirection","handleSessions","handleLogout","_jsx","_jsxs","Root","endIcon","fullWidth","justifyContent","alignItems","gap","Avatar","Item","delayMs","fallback","getInitials","variant","VisuallyHidden","tag","popoverPlacement","zIndex","direction","fontWeight","textTransform","textColor","email","roles","map","role","Badge","name","id","Separator","onSelect","defaultMessage","color"],"mappings":"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"}
@@ -187,7 +187,7 @@ const NpsSurvey = ()=>{
187
187
  setTimeout(()=>{
188
188
  setSurveyIsShown(false);
189
189
  }, 3000);
190
- } catch (err) {
190
+ } catch {
191
191
  toggleNotification({
192
192
  type: 'danger',
193
193
  message: formatMessage({