@strapi/admin 5.18.1 → 5.20.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 (189) hide show
  1. package/dist/admin/admin/src/components/Filters.js +10 -1
  2. package/dist/admin/admin/src/components/Filters.js.map +1 -1
  3. package/dist/admin/admin/src/components/Filters.mjs +10 -1
  4. package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/{UnstableGuidedTour → GuidedTour}/Context.js +22 -17
  6. package/dist/admin/admin/src/components/GuidedTour/Context.js.map +1 -0
  7. package/dist/admin/admin/src/components/{UnstableGuidedTour → GuidedTour}/Context.mjs +21 -16
  8. package/dist/admin/admin/src/components/GuidedTour/Context.mjs.map +1 -0
  9. package/dist/admin/admin/src/components/{UnstableGuidedTour → GuidedTour}/Overview.js +41 -15
  10. package/dist/admin/admin/src/components/GuidedTour/Overview.js.map +1 -0
  11. package/dist/admin/admin/src/components/{UnstableGuidedTour → GuidedTour}/Overview.mjs +42 -16
  12. package/dist/admin/admin/src/components/GuidedTour/Overview.mjs.map +1 -0
  13. package/dist/admin/admin/src/components/{UnstableGuidedTour → GuidedTour}/Step.js +33 -17
  14. package/dist/admin/admin/src/components/GuidedTour/Step.js.map +1 -0
  15. package/dist/admin/admin/src/components/{UnstableGuidedTour → GuidedTour}/Step.mjs +34 -18
  16. package/dist/admin/admin/src/components/GuidedTour/Step.mjs.map +1 -0
  17. package/dist/admin/admin/src/components/{UnstableGuidedTour → GuidedTour}/Tours.js +41 -40
  18. package/dist/admin/admin/src/components/GuidedTour/Tours.js.map +1 -0
  19. package/dist/admin/admin/src/components/{UnstableGuidedTour → GuidedTour}/Tours.mjs +36 -35
  20. package/dist/admin/admin/src/components/GuidedTour/Tours.mjs.map +1 -0
  21. package/dist/admin/admin/src/components/LeftMenu.js +52 -29
  22. package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
  23. package/dist/admin/admin/src/components/LeftMenu.mjs +52 -29
  24. package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/MainNav/NavLink.js +4 -42
  26. package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
  27. package/dist/admin/admin/src/components/MainNav/NavLink.mjs +4 -23
  28. package/dist/admin/admin/src/components/MainNav/NavLink.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/NpsSurvey.js +1 -1
  30. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  31. package/dist/admin/admin/src/components/NpsSurvey.mjs +1 -1
  32. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  33. package/dist/admin/admin/src/components/Providers.js +9 -10
  34. package/dist/admin/admin/src/components/Providers.js.map +1 -1
  35. package/dist/admin/admin/src/components/Providers.mjs +9 -10
  36. package/dist/admin/admin/src/components/Providers.mjs.map +1 -1
  37. package/dist/admin/admin/src/components/SubNav.js +18 -12
  38. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  39. package/dist/admin/admin/src/components/SubNav.mjs +19 -13
  40. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  41. package/dist/admin/admin/src/components/UpsellBanner.js +1 -1
  42. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  43. package/dist/admin/admin/src/components/UpsellBanner.mjs +2 -2
  44. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  45. package/dist/admin/admin/src/core/apis/Widgets.js +34 -16
  46. package/dist/admin/admin/src/core/apis/Widgets.js.map +1 -1
  47. package/dist/admin/admin/src/core/apis/Widgets.mjs +34 -16
  48. package/dist/admin/admin/src/core/apis/Widgets.mjs.map +1 -1
  49. package/dist/admin/admin/src/features/Tracking.js +34 -1
  50. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  51. package/dist/admin/admin/src/features/Tracking.mjs +34 -1
  52. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  53. package/dist/admin/admin/src/hooks/usePersistentState.js +10 -0
  54. package/dist/admin/admin/src/hooks/usePersistentState.js.map +1 -1
  55. package/dist/admin/admin/src/hooks/usePersistentState.mjs +10 -1
  56. package/dist/admin/admin/src/hooks/usePersistentState.mjs.map +1 -1
  57. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +1 -18
  58. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  59. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +1 -18
  60. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  61. package/dist/admin/admin/src/pages/Auth/components/Register.js +0 -11
  62. package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
  63. package/dist/admin/admin/src/pages/Auth/components/Register.mjs +0 -11
  64. package/dist/admin/admin/src/pages/Auth/components/Register.mjs.map +1 -1
  65. package/dist/admin/admin/src/pages/Home/HomePage.js +2 -3
  66. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  67. package/dist/admin/admin/src/pages/Home/HomePage.mjs +2 -3
  68. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  69. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js +2 -2
  70. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js.map +1 -1
  71. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs +3 -3
  72. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs.map +1 -1
  73. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js +1 -1
  74. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js.map +1 -1
  75. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.mjs +2 -2
  76. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.mjs.map +1 -1
  77. package/dist/admin/admin/src/pages/ProfilePage.js +297 -254
  78. package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
  79. package/dist/admin/admin/src/pages/ProfilePage.mjs +297 -254
  80. package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
  81. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +12 -1
  82. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  83. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +12 -1
  84. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  85. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js +6 -6
  86. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js.map +1 -1
  87. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs +6 -6
  88. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs.map +1 -1
  89. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js +1 -7
  90. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
  91. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs +2 -8
  92. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs.map +1 -1
  93. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +1 -8
  94. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
  95. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs +1 -8
  96. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs.map +1 -1
  97. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js +0 -2
  98. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js.map +1 -1
  99. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs +0 -2
  100. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs.map +1 -1
  101. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js +3 -1
  102. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
  103. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs +3 -1
  104. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs.map +1 -1
  105. package/dist/admin/admin/src/pages/UseCasePage.js +1 -1
  106. package/dist/admin/admin/src/pages/UseCasePage.js.map +1 -1
  107. package/dist/admin/admin/src/pages/UseCasePage.mjs +1 -1
  108. package/dist/admin/admin/src/pages/UseCasePage.mjs.map +1 -1
  109. package/dist/admin/admin/src/translations/en.json.js +11 -3
  110. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  111. package/dist/admin/admin/src/translations/en.json.mjs +11 -3
  112. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  113. package/dist/admin/admin/tests/utils.js +25 -28
  114. package/dist/admin/admin/tests/utils.js.map +1 -1
  115. package/dist/admin/admin/tests/utils.mjs +25 -28
  116. package/dist/admin/admin/tests/utils.mjs.map +1 -1
  117. package/dist/admin/ee/admin/src/constants.js +4 -2
  118. package/dist/admin/ee/admin/src/constants.js.map +1 -1
  119. package/dist/admin/ee/admin/src/constants.mjs +4 -2
  120. package/dist/admin/ee/admin/src/constants.mjs.map +1 -1
  121. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js +3 -1
  122. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js.map +1 -1
  123. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs +3 -1
  124. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs.map +1 -1
  125. package/dist/admin/index.js +2 -4
  126. package/dist/admin/index.js.map +1 -1
  127. package/dist/admin/index.mjs +1 -2
  128. package/dist/admin/index.mjs.map +1 -1
  129. package/dist/admin/src/components/Filters.d.ts +3 -1
  130. package/dist/admin/src/components/{UnstableGuidedTour → GuidedTour}/Context.d.ts +5 -3
  131. package/dist/admin/src/components/GuidedTour/Overview.d.ts +1 -0
  132. package/dist/admin/src/components/{UnstableGuidedTour → GuidedTour}/Step.d.ts +1 -1
  133. package/dist/admin/src/components/SubNav.d.ts +2 -1
  134. package/dist/admin/src/core/apis/Widgets.d.ts +8 -5
  135. package/dist/admin/src/features/Tracking.d.ts +22 -3
  136. package/dist/admin/src/hooks/usePersistentState.d.ts +2 -1
  137. package/dist/admin/src/index.d.ts +2 -3
  138. package/dist/admin/src/pages/Settings/components/Tokens/TokenBox.d.ts +1 -1
  139. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  140. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +9 -8
  141. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  142. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +9 -8
  143. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  144. package/dist/server/server/src/domain/user.js +3 -1
  145. package/dist/server/server/src/domain/user.js.map +1 -1
  146. package/dist/server/server/src/domain/user.mjs +3 -1
  147. package/dist/server/server/src/domain/user.mjs.map +1 -1
  148. package/dist/server/src/domain/user.d.ts.map +1 -1
  149. package/package.json +8 -9
  150. package/dist/admin/admin/src/components/GuidedTour/Homepage.js +0 -132
  151. package/dist/admin/admin/src/components/GuidedTour/Homepage.js.map +0 -1
  152. package/dist/admin/admin/src/components/GuidedTour/Homepage.mjs +0 -130
  153. package/dist/admin/admin/src/components/GuidedTour/Homepage.mjs.map +0 -1
  154. package/dist/admin/admin/src/components/GuidedTour/Modal.js +0 -278
  155. package/dist/admin/admin/src/components/GuidedTour/Modal.js.map +0 -1
  156. package/dist/admin/admin/src/components/GuidedTour/Modal.mjs +0 -276
  157. package/dist/admin/admin/src/components/GuidedTour/Modal.mjs.map +0 -1
  158. package/dist/admin/admin/src/components/GuidedTour/Ornaments.js +0 -54
  159. package/dist/admin/admin/src/components/GuidedTour/Ornaments.js.map +0 -1
  160. package/dist/admin/admin/src/components/GuidedTour/Ornaments.mjs +0 -51
  161. package/dist/admin/admin/src/components/GuidedTour/Ornaments.mjs.map +0 -1
  162. package/dist/admin/admin/src/components/GuidedTour/Provider.js +0 -206
  163. package/dist/admin/admin/src/components/GuidedTour/Provider.js.map +0 -1
  164. package/dist/admin/admin/src/components/GuidedTour/Provider.mjs +0 -184
  165. package/dist/admin/admin/src/components/GuidedTour/Provider.mjs.map +0 -1
  166. package/dist/admin/admin/src/components/GuidedTour/constants.js +0 -167
  167. package/dist/admin/admin/src/components/GuidedTour/constants.js.map +0 -1
  168. package/dist/admin/admin/src/components/GuidedTour/constants.mjs +0 -164
  169. package/dist/admin/admin/src/components/GuidedTour/constants.mjs.map +0 -1
  170. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.js.map +0 -1
  171. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.mjs.map +0 -1
  172. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.js.map +0 -1
  173. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.mjs.map +0 -1
  174. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.js.map +0 -1
  175. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.mjs.map +0 -1
  176. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.js.map +0 -1
  177. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.mjs.map +0 -1
  178. package/dist/admin/admin/src/pages/Home/components/GuidedTour.js +0 -19
  179. package/dist/admin/admin/src/pages/Home/components/GuidedTour.js.map +0 -1
  180. package/dist/admin/admin/src/pages/Home/components/GuidedTour.mjs +0 -17
  181. package/dist/admin/admin/src/pages/Home/components/GuidedTour.mjs.map +0 -1
  182. package/dist/admin/src/components/GuidedTour/Homepage.d.ts +0 -2
  183. package/dist/admin/src/components/GuidedTour/Modal.d.ts +0 -2
  184. package/dist/admin/src/components/GuidedTour/Ornaments.d.ts +0 -13
  185. package/dist/admin/src/components/GuidedTour/Provider.d.ts +0 -39
  186. package/dist/admin/src/components/GuidedTour/constants.d.ts +0 -165
  187. package/dist/admin/src/components/UnstableGuidedTour/Overview.d.ts +0 -1
  188. package/dist/admin/src/pages/Home/components/GuidedTour.d.ts +0 -1
  189. /package/dist/admin/src/components/{UnstableGuidedTour → GuidedTour}/Tours.d.ts +0 -0
@@ -77,7 +77,13 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
77
77
  });
78
78
  /* -------------------------------------------------------------------------------------------------
79
79
  * Popover
80
- * -----------------------------------------------------------------------------------------------*/ const PopoverImpl = ()=>{
80
+ * -----------------------------------------------------------------------------------------------*/ /**
81
+ * The zIndex property is used to override the zIndex of the Portal element of the Popover.
82
+ * This is needed to ensure that the DatePicker is rendered above the Popover when opened.
83
+ * The issue was that both the DatePicker and the Popover are rendered in a Portal and have the same zIndex.
84
+ * On init, since the DatePicker is rendered before the Popover in the DOM,
85
+ * it's causing the issue of appearing behind the Popover.
86
+ */ const PopoverImpl = ({ zIndex })=>{
81
87
  const [{ query }, setQuery] = useQueryParams.useQueryParams();
82
88
  const { formatMessage } = reactIntl.useIntl();
83
89
  const options = useFilters('Popover', ({ options })=>options);
@@ -127,6 +133,9 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
127
133
  setOpen(false);
128
134
  };
129
135
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Content, {
136
+ style: {
137
+ zIndex
138
+ },
130
139
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
131
140
  padding: 3,
132
141
  children: /*#__PURE__*/ jsxRuntime.jsx(Form.Form, {
@@ -1 +1 @@
1
- {"version":3,"file":"Filters.js","sources":["../../../../../admin/src/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Popover, Tag } from '@strapi/design-system';\nimport { Plus, Filter as FilterIcon, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport {\n BASE_FILTERS,\n CONTAINS_FILTERS,\n FilterOption,\n IS_SENSITIVE_FILTERS,\n NUMERIC_FILTERS,\n STRING_PARSE_FILTERS,\n FILTERS_WITH_NO_VALUE,\n} from '../constants/filters';\nimport { useControllableState } from '../hooks/useControllableState';\nimport { useQueryParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\nimport { Form, InputProps } from './Form';\nimport { InputRenderer } from './FormInputs/Renderer';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterFormData {\n name: string;\n filter: string;\n value?: string;\n}\n\ninterface FitlersContextValue {\n disabled: boolean;\n onChange: (data: FilterFormData) => void;\n options: Filters.Filter[];\n setOpen: (open: boolean) => void;\n}\n\nconst [FiltersProvider, useFilters] = createContext<FitlersContextValue>('Filters');\n\ninterface RootProps extends Partial<FitlersContextValue>, Popover.Props {\n children: React.ReactNode;\n}\n\nconst Root = ({\n children,\n disabled = false,\n onChange,\n options = [],\n onOpenChange,\n open: openProp,\n defaultOpen,\n ...restProps\n}: RootProps) => {\n const handleChange = (data: FilterFormData) => {\n if (onChange) {\n onChange(data);\n }\n };\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen} {...restProps}>\n <FiltersProvider\n setOpen={setOpen}\n disabled={disabled}\n onChange={handleChange}\n options={options}\n >\n {children}\n </FiltersProvider>\n </Popover.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst Trigger = React.forwardRef<HTMLButtonElement, Filters.TriggerProps>(\n ({ label }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const disabled = useFilters('Trigger', ({ disabled }) => disabled);\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"tertiary\"\n ref={forwardedRef}\n startIcon={<FilterIcon />}\n size=\"S\"\n disabled={disabled}\n >\n {label || formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n\nconst PopoverImpl = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n const { formatMessage } = useIntl();\n const options = useFilters('Popover', ({ options }) => options);\n const onChange = useFilters('Popover', ({ onChange }) => onChange);\n const setOpen = useFilters('Popover', ({ setOpen }) => setOpen);\n\n if (options.length === 0) {\n return null;\n }\n\n const handleSubmit = (data: FilterFormData) => {\n const value = FILTERS_WITH_NO_VALUE.includes(data.filter)\n ? 'true'\n : encodeURIComponent(data.value ?? '');\n\n if (!value) {\n return;\n }\n\n if (onChange) {\n onChange(data);\n }\n\n /**\n * There will ALWAYS be an option because we use the options to create the form data.\n */\n const fieldOptions = options.find((filter) => filter.name === data.name)!;\n\n /**\n * If the filter is a relation, we need to nest the filter object,\n * we filter based on the mainField of the relation, if there is no mainField, we use the id.\n * At the end, we pass the operator & value. This value _could_ look like:\n * ```json\n * {\n * \"$eq\": \"1\",\n * }\n * ```\n */\n const operatorValuePairing = {\n [data.filter]: value,\n };\n\n const newFilterQuery = {\n ...query.filters,\n $and: [\n ...(query.filters?.$and ?? []),\n {\n [data.name]:\n fieldOptions.type === 'relation'\n ? {\n [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing,\n }\n : operatorValuePairing,\n },\n ],\n };\n\n setQuery({ filters: newFilterQuery, page: 1 });\n setOpen(false);\n };\n\n return (\n <Popover.Content>\n <Box padding={3}>\n <Form\n method=\"POST\"\n initialValues={\n {\n name: options[0]?.name,\n filter: BASE_FILTERS[0].value,\n } satisfies FilterFormData\n }\n onSubmit={handleSubmit}\n >\n {({ values: formValues, modified, isSubmitting }) => {\n const filter = options.find((filter) => filter.name === formValues.name);\n const Input = filter?.input || InputRenderer;\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} style={{ minWidth: 184 }}>\n {[\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n name: 'name',\n options: options.map((filter) => ({\n label: filter.label,\n value: filter.name,\n })),\n placholder: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n type: 'enumeration' as const,\n },\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n name: 'filter',\n options:\n filter?.operators ||\n getFilterList(filter).map((opt) => ({\n label: formatMessage(opt.label),\n value: opt.value,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n type: 'enumeration' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n {filter &&\n formValues.filter &&\n formValues.filter !== '$null' &&\n formValues.filter !== '$notNull' ? (\n <Input\n {...filter}\n label={null}\n aria-label={filter.label}\n name=\"value\"\n // @ts-expect-error – if type is `custom` then `Input` will be a custom component.\n type={filter.mainField?.type ?? filter.type}\n />\n ) : null}\n <Button\n disabled={!modified || isSubmitting}\n size=\"L\"\n variant=\"secondary\"\n startIcon={<Plus />}\n type=\"submit\"\n fullWidth\n >\n {formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Flex>\n );\n }}\n </Form>\n </Box>\n </Popover.Content>\n );\n};\n\n/**\n * Depending on the selected field find the possible filters to apply\n */\nconst getFilterList = (filter?: Filters.Filter): FilterOption[] => {\n if (!filter) {\n return [];\n }\n\n const type = filter.mainField?.type ? filter.mainField.type : filter.type;\n\n switch (type) {\n case 'email':\n case 'text':\n case 'string': {\n return [\n ...BASE_FILTERS,\n ...IS_SENSITIVE_FILTERS,\n ...CONTAINS_FILTERS,\n ...STRING_PARSE_FILTERS,\n ];\n }\n\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n case 'time':\n case 'date': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];\n }\n\n case 'datetime': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n\n case 'enumeration': {\n return BASE_FILTERS;\n }\n\n default:\n return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * List\n * -----------------------------------------------------------------------------------------------*/\n\nconst List = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n\n const options = useFilters('List', ({ options }) => options);\n\n const handleClick = (data: FilterFormData) => {\n /**\n * Check the name, operator and value to see if it already exists in the query\n * if it does, remove it.\n */\n const nextFilters = (query?.filters?.$and ?? []).filter((filter) => {\n const [attributeName] = Object.keys(filter);\n if (attributeName !== data.name) {\n return true;\n }\n\n const { type, mainField } = options.find(({ name }) => name === attributeName)!;\n\n if (type === 'relation') {\n const filterObj = filter[attributeName][mainField?.name ?? 'id'];\n\n if (typeof filterObj === 'object') {\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n return !(operator === data.filter && value === data.value);\n }\n\n return true;\n } else {\n const filterObj = filter[attributeName];\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n return !(operator === data.filter && value === data.value);\n }\n });\n\n setQuery({ filters: { $and: nextFilters }, page: 1 });\n };\n\n if (!query?.filters?.$and?.length) {\n return null;\n }\n\n return (\n <>\n {query?.filters?.$and?.map((queryFilter) => {\n const [attributeName] = Object.keys(queryFilter);\n const filter = options.find(({ name }) => name === attributeName);\n const filterObj = queryFilter[attributeName];\n\n if (!filter || typeof filterObj !== 'object' || filterObj === null) {\n return null;\n }\n\n if (filter.type === 'relation') {\n const modelFilter = filterObj[filter.mainField?.name ?? 'id'];\n\n if (typeof modelFilter === 'object') {\n const [operator] = Object.keys(modelFilter);\n const value = modelFilter[operator];\n return (\n <AttributeTag\n key={`${attributeName}-${operator}-${value}`}\n {...filter}\n onClick={handleClick}\n operator={operator}\n value={value}\n />\n );\n }\n\n return null;\n } else {\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n /**\n * Something has gone wrong here, because the attribute is not a relation\n * but we have a nested filter object.\n */\n if (typeof value === 'object') {\n return null;\n }\n\n return (\n <AttributeTag\n key={`${attributeName}-${operator}-${value}`}\n {...filter}\n onClick={handleClick}\n operator={operator}\n value={value}\n />\n );\n }\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n onClick: (data: FilterFormData) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n input,\n label,\n mainField,\n name,\n onClick,\n operator,\n options,\n value,\n ...filter\n}: AttributeTagProps) => {\n const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();\n\n const handleClick = () => {\n onClick({ name, value, filter: operator });\n };\n\n const type = mainField?.type ? mainField.type : filter.type;\n\n let formattedValue: string = value;\n\n switch (type) {\n case 'date':\n formattedValue = formatDate(value, { dateStyle: 'full' });\n break;\n case 'datetime':\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n break;\n case 'time':\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\n });\n break;\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal':\n formattedValue = formatNumber(Number(value));\n break;\n }\n\n // Handle custom input\n if (input && options) {\n // If the custom input has an options array, find the option with a customValue matching the query value\n const selectedOption = options.find((option) => {\n return (typeof option === 'string' ? option : option.value) === value;\n });\n\n formattedValue = selectedOption\n ? typeof selectedOption === 'string'\n ? selectedOption\n : (selectedOption.label ?? selectedOption.value)\n : value;\n }\n\n const content = `${label} ${formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n })} ${operator !== '$null' && operator !== '$notNull' ? formattedValue : ''}`;\n\n return (\n <Tag padding={1} onClick={handleClick} icon={<Cross />}>\n {content}\n </Tag>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Filters = {\n List,\n Popover: PopoverImpl,\n Root,\n Trigger,\n};\n\ninterface MainField {\n name: string;\n type: Schema.Attribute.Kind | 'custom';\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Filters {\n export interface Filter {\n input?: React.ComponentType<ValueInputProps>;\n label: string;\n /**\n * the name of the attribute we use to display the actual name e.g. relations\n * are just ids, so we use the mainField to display something meaninginful by\n * looking at the target's schema\n */\n mainField?: MainField;\n name: string;\n operators?: Array<{\n label: string;\n value: string;\n }>;\n options?: Array<{ label?: string; value: string }> | string[];\n type: InputProps['type'] | 'relation' | 'custom';\n }\n\n export interface ValueInputProps extends Omit<Filter, 'label'> {\n ['aria-label']: string;\n }\n\n export type Props = RootProps;\n\n export interface TriggerProps {\n label?: string;\n }\n\n export interface Query {\n filters?: {\n /**\n * Typically, a filter will be:\n * ```ts\n * {\n * [attributeName]: {\n * [operator]: value\n * }\n * }\n * ```\n * However, for relation items it becomes more nested.\n * ```ts\n * {\n * [attributeName]: {\n * [relationTargetAttribute]: {\n * [operator]: value\n * }\n * }\n * }\n * ```\n */\n $and?: Array<Record<string, Record<string, string | Record<string, string>>>>;\n };\n page?: number;\n }\n}\n\nexport { Filters };\n"],"names":["FiltersProvider","useFilters","createContext","Root","children","disabled","onChange","options","onOpenChange","open","openProp","defaultOpen","restProps","handleChange","data","setOpen","useControllableState","prop","defaultProp","_jsx","Popover","Trigger","React","forwardRef","label","forwardedRef","formatMessage","useIntl","Button","variant","ref","startIcon","FilterIcon","size","id","defaultMessage","PopoverImpl","query","setQuery","useQueryParams","length","handleSubmit","value","FILTERS_WITH_NO_VALUE","includes","filter","encodeURIComponent","fieldOptions","find","name","operatorValuePairing","newFilterQuery","filters","$and","type","mainField","page","Content","Box","padding","Form","method","initialValues","BASE_FILTERS","onSubmit","values","formValues","modified","isSubmitting","Input","input","InputRenderer","_jsxs","Flex","direction","alignItems","gap","style","minWidth","map","placholder","operators","getFilterList","opt","placeholder","field","aria-label","Plus","fullWidth","IS_SENSITIVE_FILTERS","CONTAINS_FILTERS","STRING_PARSE_FILTERS","NUMERIC_FILTERS","List","handleClick","nextFilters","attributeName","Object","keys","filterObj","operator","_Fragment","queryFilter","modelFilter","AttributeTag","onClick","formatDate","formatTime","formatNumber","formattedValue","dateStyle","timeStyle","hour","minute","split","date","Date","setHours","Number","setMinutes","selectedOption","option","content","Tag","icon","Cross","Filters"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAM,CAACA,eAAAA,EAAiBC,UAAW,CAAA,GAAGC,qBAAmC,CAAA,SAAA,CAAA;AAMzE,MAAMC,IAAAA,GAAO,CAAC,EACZC,QAAQ,EACRC,QAAW,GAAA,KAAK,EAChBC,QAAQ,EACRC,UAAU,EAAE,EACZC,YAAY,EACZC,IAAAA,EAAMC,QAAQ,EACdC,WAAW,EACX,GAAGC,SACO,EAAA,GAAA;AACV,IAAA,MAAMC,eAAe,CAACC,IAAAA,GAAAA;AACpB,QAAA,IAAIR,QAAU,EAAA;YACZA,QAASQ,CAAAA,IAAAA,CAAAA;AACX;AACF,KAAA;AACA,IAAA,MAAM,CAACL,IAAO,GAAA,KAAK,EAAEM,OAAAA,CAAQ,GAAGC,yCAAqB,CAAA;QACnDC,IAAMP,EAAAA,QAAAA;QACNQ,WAAaP,EAAAA,WAAAA;QACbL,QAAUE,EAAAA;AACZ,KAAA,CAAA;IAEA,qBACEW,cAAA,CAACC,qBAAQjB,IAAI,EAAA;QAACM,IAAMA,EAAAA,IAAAA;QAAMD,YAAcO,EAAAA,OAAAA;AAAU,QAAA,GAAGH,SAAS;AAC5D,QAAA,QAAA,gBAAAO,cAACnB,CAAAA,eAAAA,EAAAA;YACCe,OAASA,EAAAA,OAAAA;YACTV,QAAUA,EAAAA,QAAAA;YACVC,QAAUO,EAAAA,YAAAA;YACVN,OAASA,EAAAA,OAAAA;AAERH,YAAAA,QAAAA,EAAAA;;;AAIT,CAAA;AAEA;;qGAIA,MAAMiB,wBAAUC,gBAAMC,CAAAA,UAAU,CAC9B,CAAC,EAAEC,KAAK,EAAE,EAAEC,YAAAA,GAAAA;IACV,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMtB,WAAWJ,UAAW,CAAA,SAAA,EAAW,CAAC,EAAEI,QAAQ,EAAE,GAAKA,QAAAA,CAAAA;IAEzD,qBACEc,cAAA,CAACC,qBAAQC,OAAO,EAAA;AACd,QAAA,QAAA,gBAAAF,cAACS,CAAAA,mBAAAA,EAAAA;YACCC,OAAQ,EAAA,UAAA;YACRC,GAAKL,EAAAA,YAAAA;AACLM,YAAAA,SAAAA,gBAAWZ,cAACa,CAAAA,YAAAA,EAAAA,EAAAA,CAAAA;YACZC,IAAK,EAAA,GAAA;YACL5B,QAAUA,EAAAA,QAAAA;AAETmB,YAAAA,QAAAA,EAAAA,KAAAA,IAASE,aAAc,CAAA;gBAAEQ,EAAI,EAAA,mBAAA;gBAAqBC,cAAgB,EAAA;AAAU,aAAA;;;AAIrF,CAAA,CAAA;AAGF;;AAEkG,qGAElG,MAAMC,WAAc,GAAA,IAAA;AAClB,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,6BAAAA,EAAAA;IAC9B,MAAM,EAAEb,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMpB,UAAUN,UAAW,CAAA,SAAA,EAAW,CAAC,EAAEM,OAAO,EAAE,GAAKA,OAAAA,CAAAA;AACvD,IAAA,MAAMD,WAAWL,UAAW,CAAA,SAAA,EAAW,CAAC,EAAEK,QAAQ,EAAE,GAAKA,QAAAA,CAAAA;AACzD,IAAA,MAAMS,UAAUd,UAAW,CAAA,SAAA,EAAW,CAAC,EAAEc,OAAO,EAAE,GAAKA,OAAAA,CAAAA;IAEvD,IAAIR,OAAAA,CAAQiC,MAAM,KAAK,CAAG,EAAA;QACxB,OAAO,IAAA;AACT;AAEA,IAAA,MAAMC,eAAe,CAAC3B,IAAAA,GAAAA;QACpB,MAAM4B,KAAAA,GAAQC,6BAAsBC,CAAAA,QAAQ,CAAC9B,IAAAA,CAAK+B,MAAM,CAAA,GACpD,MACAC,GAAAA,kBAAAA,CAAmBhC,IAAK4B,CAAAA,KAAK,IAAI,EAAA,CAAA;AAErC,QAAA,IAAI,CAACA,KAAO,EAAA;AACV,YAAA;AACF;AAEA,QAAA,IAAIpC,QAAU,EAAA;YACZA,QAASQ,CAAAA,IAAAA,CAAAA;AACX;AAEA;;QAGA,MAAMiC,YAAexC,GAAAA,OAAAA,CAAQyC,IAAI,CAAC,CAACH,MAAAA,GAAWA,MAAOI,CAAAA,IAAI,KAAKnC,IAAAA,CAAKmC,IAAI,CAAA;AAEvE;;;;;;;;;AASC,QACD,MAAMC,oBAAuB,GAAA;YAC3B,CAACpC,IAAAA,CAAK+B,MAAM,GAAGH;AACjB,SAAA;AAEA,QAAA,MAAMS,cAAiB,GAAA;AACrB,YAAA,GAAGd,MAAMe,OAAO;YAChBC,IAAM,EAAA;mBACAhB,KAAMe,CAAAA,OAAO,EAAEC,IAAAA,IAAQ,EAAE;AAC7B,gBAAA;AACE,oBAAA,CAACvC,KAAKmC,IAAI,GACRF,YAAaO,CAAAA,IAAI,KAAK,UAClB,GAAA;AACE,wBAAA,CAACP,YAAaQ,CAAAA,SAAS,EAAEN,IAAAA,IAAQ,OAAOC;qBAE1CA,GAAAA;AACR;AACD;AACH,SAAA;QAEAZ,QAAS,CAAA;YAAEc,OAASD,EAAAA,cAAAA;YAAgBK,IAAM,EAAA;AAAE,SAAA,CAAA;QAC5CzC,OAAQ,CAAA,KAAA,CAAA;AACV,KAAA;IAEA,qBACEI,cAAA,CAACC,qBAAQqC,OAAO,EAAA;AACd,QAAA,QAAA,gBAAAtC,cAACuC,CAAAA,gBAAAA,EAAAA;YAAIC,OAAS,EAAA,CAAA;AACZ,YAAA,QAAA,gBAAAxC,cAACyC,CAAAA,SAAAA,EAAAA;gBACCC,MAAO,EAAA,MAAA;gBACPC,aACE,EAAA;oBACEb,IAAM1C,EAAAA,OAAO,CAAC,CAAA,CAAE,EAAE0C,IAAAA;AAClBJ,oBAAAA,MAAAA,EAAQkB,oBAAY,CAAC,CAAE,CAAA,CAACrB;AAC1B,iBAAA;gBAEFsB,QAAUvB,EAAAA,YAAAA;AAET,gBAAA,QAAA,EAAA,CAAC,EAAEwB,MAAQC,EAAAA,UAAU,EAAEC,QAAQ,EAAEC,YAAY,EAAE,GAAA;oBAC9C,MAAMvB,MAAAA,GAAStC,OAAQyC,CAAAA,IAAI,CAAC,CAACH,SAAWA,MAAOI,CAAAA,IAAI,KAAKiB,UAAAA,CAAWjB,IAAI,CAAA;oBACvE,MAAMoB,KAAAA,GAAQxB,QAAQyB,KAASC,IAAAA,sBAAAA;AAC/B,oBAAA,qBACEC,eAACC,CAAAA,iBAAAA,EAAAA;wBAAKC,SAAU,EAAA,QAAA;wBAASC,UAAW,EAAA,SAAA;wBAAUC,GAAK,EAAA,CAAA;wBAAGC,KAAO,EAAA;4BAAEC,QAAU,EAAA;AAAI,yBAAA;;AAC1E,4BAAA;AACC,gCAAA;oCACE,CAAC,YAAA,GAAepD,aAAc,CAAA;wCAC5BQ,EAAI,EAAA,wBAAA;wCACJC,cAAgB,EAAA;AAClB,qCAAA,CAAA;oCACAc,IAAM,EAAA,MAAA;AACN1C,oCAAAA,OAAAA,EAASA,OAAQwE,CAAAA,GAAG,CAAC,CAAClC,UAAY;AAChCrB,4CAAAA,KAAAA,EAAOqB,OAAOrB,KAAK;AACnBkB,4CAAAA,KAAAA,EAAOG,OAAOI;yCAChB,CAAA,CAAA;AACA+B,oCAAAA,UAAAA,EAAYtD,aAAc,CAAA;wCACxBQ,EAAI,EAAA,wBAAA;wCACJC,cAAgB,EAAA;AAClB,qCAAA,CAAA;oCACAmB,IAAM,EAAA;AACR,iCAAA;AACA,gCAAA;oCACE,CAAC,YAAA,GAAe5B,aAAc,CAAA;wCAC5BQ,EAAI,EAAA,yBAAA;wCACJC,cAAgB,EAAA;AAClB,qCAAA,CAAA;oCACAc,IAAM,EAAA,QAAA;oCACN1C,OACEsC,EAAAA,MAAAA,EAAQoC,aACRC,aAAcrC,CAAAA,MAAAA,CAAAA,CAAQkC,GAAG,CAAC,CAACI,OAAS;4CAClC3D,KAAOE,EAAAA,aAAAA,CAAcyD,IAAI3D,KAAK,CAAA;AAC9BkB,4CAAAA,KAAAA,EAAOyC,IAAIzC;yCACb,CAAA,CAAA;AACF0C,oCAAAA,WAAAA,EAAa1D,aAAc,CAAA;wCACzBQ,EAAI,EAAA,yBAAA;wCACJC,cAAgB,EAAA;AAClB,qCAAA,CAAA;oCACAmB,IAAM,EAAA;AACR;AACD,6BAAA,CAACyB,GAAG,CAAC,CAACM,KAAAA,iBACLlE,cAACoD,CAAAA,sBAAAA,EAAAA;AAAgC,oCAAA,GAAGc;AAAhBA,iCAAAA,EAAAA,KAAAA,CAAMpC,IAAI,CAAA,CAAA;4BAE/BJ,MACDqB,IAAAA,UAAAA,CAAWrB,MAAM,IACjBqB,UAAWrB,CAAAA,MAAM,KAAK,OAAA,IACtBqB,UAAWrB,CAAAA,MAAM,KAAK,UAAA,iBACpB1B,cAACkD,CAAAA,KAAAA,EAAAA;AACE,gCAAA,GAAGxB,MAAM;gCACVrB,KAAO,EAAA,IAAA;AACP8D,gCAAAA,YAAAA,EAAYzC,OAAOrB,KAAK;gCACxByB,IAAK,EAAA,OAAA;;AAELK,gCAAAA,IAAAA,EAAMT,MAAOU,CAAAA,SAAS,EAAED,IAAAA,IAAQT,OAAOS;AAEvC,6BAAA,CAAA,GAAA,IAAA;0CACJnC,cAACS,CAAAA,mBAAAA,EAAAA;AACCvB,gCAAAA,QAAAA,EAAU,CAAC8D,QAAYC,IAAAA,YAAAA;gCACvBnC,IAAK,EAAA,GAAA;gCACLJ,OAAQ,EAAA,WAAA;AACRE,gCAAAA,SAAAA,gBAAWZ,cAACoE,CAAAA,UAAAA,EAAAA,EAAAA,CAAAA;gCACZjC,IAAK,EAAA,QAAA;gCACLkC,SAAS,EAAA,IAAA;0CAER9D,aAAc,CAAA;oCAAEQ,EAAI,EAAA,sBAAA;oCAAwBC,cAAgB,EAAA;AAAa,iCAAA;;;;AAIlF;;;;AAKV,CAAA;AAEA;;IAGA,MAAM+C,gBAAgB,CAACrC,MAAAA,GAAAA;AACrB,IAAA,IAAI,CAACA,MAAQ,EAAA;AACX,QAAA,OAAO,EAAE;AACX;IAEA,MAAMS,IAAAA,GAAOT,MAAOU,CAAAA,SAAS,EAAED,IAAAA,GAAOT,MAAOU,CAAAA,SAAS,CAACD,IAAI,GAAGT,MAAAA,CAAOS,IAAI;IAEzE,OAAQA,IAAAA;QACN,KAAK,OAAA;QACL,KAAK,MAAA;QACL,KAAK,QAAA;AAAU,YAAA;gBACb,OAAO;AACFS,oBAAAA,GAAAA,oBAAAA;AACA0B,oBAAAA,GAAAA,4BAAAA;AACAC,oBAAAA,GAAAA,wBAAAA;AACAC,oBAAAA,GAAAA;AACJ,iBAAA;AACH;QAEA,KAAK,OAAA;QACL,KAAK,SAAA;QACL,KAAK,YAAA;QACL,KAAK,SAAA;AAAW,YAAA;gBACd,OAAO;AAAI5B,oBAAAA,GAAAA,oBAAAA;AAAiB6B,oBAAAA,GAAAA;AAAgB,iBAAA;AAC9C;QACA,KAAK,MAAA;QACL,KAAK,MAAA;AAAQ,YAAA;gBACX,OAAO;AAAI7B,oBAAAA,GAAAA,oBAAAA;AAAiB6B,oBAAAA,GAAAA,uBAAAA;AAAoBF,oBAAAA,GAAAA;AAAiB,iBAAA;AACnE;QAEA,KAAK,UAAA;AAAY,YAAA;gBACf,OAAO;AAAI3B,oBAAAA,GAAAA,oBAAAA;AAAiB6B,oBAAAA,GAAAA;AAAgB,iBAAA;AAC9C;QAEA,KAAK,aAAA;AAAe,YAAA;gBAClB,OAAO7B,oBAAAA;AACT;AAEA,QAAA;YACE,OAAO;AAAIA,gBAAAA,GAAAA,oBAAAA;AAAiB0B,gBAAAA,GAAAA;AAAqB,aAAA;AACrD;AACF,CAAA;AAEA;;AAEkG,qGAElG,MAAMI,IAAO,GAAA,IAAA;AACX,IAAA,MAAM,CAAC,EAAExD,KAAK,EAAE,EAAEC,SAAS,GAAGC,6BAAAA,EAAAA;AAE9B,IAAA,MAAMhC,UAAUN,UAAW,CAAA,MAAA,EAAQ,CAAC,EAAEM,OAAO,EAAE,GAAKA,OAAAA,CAAAA;AAEpD,IAAA,MAAMuF,cAAc,CAAChF,IAAAA,GAAAA;AACnB;;;AAGC,QACD,MAAMiF,WAAAA,GAAc,CAAC1D,KAAOe,EAAAA,OAAAA,EAASC,IAAQ,IAAA,EAAE,EAAER,MAAM,CAAC,CAACA,MAAAA,GAAAA;AACvD,YAAA,MAAM,CAACmD,aAAAA,CAAc,GAAGC,MAAAA,CAAOC,IAAI,CAACrD,MAAAA,CAAAA;YACpC,IAAImD,aAAAA,KAAkBlF,IAAKmC,CAAAA,IAAI,EAAE;gBAC/B,OAAO,IAAA;AACT;AAEA,YAAA,MAAM,EAAEK,IAAI,EAAEC,SAAS,EAAE,GAAGhD,OAAAA,CAAQyC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA,IAAS+C,KAAAA,aAAAA,CAAAA;AAEhE,YAAA,IAAI1C,SAAS,UAAY,EAAA;AACvB,gBAAA,MAAM6C,YAAYtD,MAAM,CAACmD,cAAc,CAACzC,SAAAA,EAAWN,QAAQ,IAAK,CAAA;gBAEhE,IAAI,OAAOkD,cAAc,QAAU,EAAA;AACjC,oBAAA,MAAM,CAACC,QAAAA,CAAS,GAAGH,MAAAA,CAAOC,IAAI,CAACC,SAAAA,CAAAA;oBAC/B,MAAMzD,KAAAA,GAAQyD,SAAS,CAACC,QAAS,CAAA;oBAEjC,OAAO,EAAEA,QAAatF,KAAAA,IAAAA,CAAK+B,MAAM,IAAIH,KAAAA,KAAU5B,IAAK4B,CAAAA,KAAK,CAAD;AAC1D;gBAEA,OAAO,IAAA;aACF,MAAA;gBACL,MAAMyD,SAAAA,GAAYtD,MAAM,CAACmD,aAAc,CAAA;AACvC,gBAAA,MAAM,CAACI,QAAAA,CAAS,GAAGH,MAAAA,CAAOC,IAAI,CAACC,SAAAA,CAAAA;gBAC/B,MAAMzD,KAAAA,GAAQyD,SAAS,CAACC,QAAS,CAAA;gBAEjC,OAAO,EAAEA,QAAatF,KAAAA,IAAAA,CAAK+B,MAAM,IAAIH,KAAAA,KAAU5B,IAAK4B,CAAAA,KAAK,CAAD;AAC1D;AACF,SAAA,CAAA;QAEAJ,QAAS,CAAA;YAAEc,OAAS,EAAA;gBAAEC,IAAM0C,EAAAA;AAAY,aAAA;YAAGvC,IAAM,EAAA;AAAE,SAAA,CAAA;AACrD,KAAA;AAEA,IAAA,IAAI,CAACnB,KAAAA,EAAOe,OAASC,EAAAA,IAAAA,EAAMb,MAAQ,EAAA;QACjC,OAAO,IAAA;AACT;IAEA,qBACErB,cAAA,CAAAkF,mBAAA,EAAA;kBACGhE,KAAOe,EAAAA,OAAAA,EAASC,IAAM0B,EAAAA,GAAAA,CAAI,CAACuB,WAAAA,GAAAA;AAC1B,YAAA,MAAM,CAACN,aAAAA,CAAc,GAAGC,MAAAA,CAAOC,IAAI,CAACI,WAAAA,CAAAA;YACpC,MAAMzD,MAAAA,GAAStC,QAAQyC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA,IAAS+C,KAAAA,aAAAA,CAAAA;YACnD,MAAMG,SAAAA,GAAYG,WAAW,CAACN,aAAc,CAAA;AAE5C,YAAA,IAAI,CAACnD,MAAU,IAAA,OAAOsD,SAAc,KAAA,QAAA,IAAYA,cAAc,IAAM,EAAA;gBAClE,OAAO,IAAA;AACT;YAEA,IAAItD,MAAAA,CAAOS,IAAI,KAAK,UAAY,EAAA;AAC9B,gBAAA,MAAMiD,cAAcJ,SAAS,CAACtD,OAAOU,SAAS,EAAEN,QAAQ,IAAK,CAAA;gBAE7D,IAAI,OAAOsD,gBAAgB,QAAU,EAAA;AACnC,oBAAA,MAAM,CAACH,QAAAA,CAAS,GAAGH,MAAAA,CAAOC,IAAI,CAACK,WAAAA,CAAAA;oBAC/B,MAAM7D,KAAAA,GAAQ6D,WAAW,CAACH,QAAS,CAAA;AACnC,oBAAA,qBACEjF,cAACqF,CAAAA,YAAAA,EAAAA;AAEE,wBAAA,GAAG3D,MAAM;wBACV4D,OAASX,EAAAA,WAAAA;wBACTM,QAAUA,EAAAA,QAAAA;wBACV1D,KAAOA,EAAAA;uBAJF,CAAC,EAAEsD,cAAc,CAAC,EAAEI,SAAS,CAAC,EAAE1D,MAAM,CAAC,CAAA;AAOlD;gBAEA,OAAO,IAAA;aACF,MAAA;AACL,gBAAA,MAAM,CAAC0D,QAAAA,CAAS,GAAGH,MAAAA,CAAOC,IAAI,CAACC,SAAAA,CAAAA;gBAC/B,MAAMzD,KAAAA,GAAQyD,SAAS,CAACC,QAAS,CAAA;AAEjC;;;cAIA,IAAI,OAAO1D,KAAAA,KAAU,QAAU,EAAA;oBAC7B,OAAO,IAAA;AACT;AAEA,gBAAA,qBACEvB,cAACqF,CAAAA,YAAAA,EAAAA;AAEE,oBAAA,GAAG3D,MAAM;oBACV4D,OAASX,EAAAA,WAAAA;oBACTM,QAAUA,EAAAA,QAAAA;oBACV1D,KAAOA,EAAAA;mBAJF,CAAC,EAAEsD,cAAc,CAAC,EAAEI,SAAS,CAAC,EAAE1D,MAAM,CAAC,CAAA;AAOlD;AACF,SAAA;;AAGN,CAAA;AAQA,MAAM8D,YAAAA,GAAe,CAAC,EACpBlC,KAAK,EACL9C,KAAK,EACL+B,SAAS,EACTN,IAAI,EACJwD,OAAO,EACPL,QAAQ,EACR7F,OAAO,EACPmC,KAAK,EACL,GAAGG,MACe,EAAA,GAAA;IAClB,MAAM,EAAEnB,aAAa,EAAEgF,UAAU,EAAEC,UAAU,EAAEC,YAAY,EAAE,GAAGjF,iBAAAA,EAAAA;AAEhE,IAAA,MAAMmE,WAAc,GAAA,IAAA;QAClBW,OAAQ,CAAA;AAAExD,YAAAA,IAAAA;AAAMP,YAAAA,KAAAA;YAAOG,MAAQuD,EAAAA;AAAS,SAAA,CAAA;AAC1C,KAAA;AAEA,IAAA,MAAM9C,OAAOC,SAAWD,EAAAA,IAAAA,GAAOC,UAAUD,IAAI,GAAGT,OAAOS,IAAI;AAE3D,IAAA,IAAIuD,cAAyBnE,GAAAA,KAAAA;IAE7B,OAAQY,IAAAA;QACN,KAAK,MAAA;AACHuD,YAAAA,cAAAA,GAAiBH,WAAWhE,KAAO,EAAA;gBAAEoE,SAAW,EAAA;AAAO,aAAA,CAAA;AACvD,YAAA;QACF,KAAK,UAAA;AACHD,YAAAA,cAAAA,GAAiBH,WAAWhE,KAAO,EAAA;gBAAEoE,SAAW,EAAA,MAAA;gBAAQC,SAAW,EAAA;AAAQ,aAAA,CAAA;AAC3E,YAAA;QACF,KAAK,MAAA;AACH,YAAA,MAAM,CAACC,IAAMC,EAAAA,MAAAA,CAAO,GAAGvE,KAAAA,CAAMwE,KAAK,CAAC,GAAA,CAAA;AACnC,YAAA,MAAMC,OAAO,IAAIC,IAAAA,EAAAA;YACjBD,IAAKE,CAAAA,QAAQ,CAACC,MAAON,CAAAA,IAAAA,CAAAA,CAAAA;YACrBG,IAAKI,CAAAA,UAAU,CAACD,MAAOL,CAAAA,MAAAA,CAAAA,CAAAA;AAEvBJ,YAAAA,cAAAA,GAAiBF,WAAWQ,IAAM,EAAA;gBAChCH,IAAM,EAAA,SAAA;gBACNC,MAAQ,EAAA;AACV,aAAA,CAAA;AACA,YAAA;QACF,KAAK,OAAA;QACL,KAAK,SAAA;QACL,KAAK,YAAA;QACL,KAAK,SAAA;AACHJ,YAAAA,cAAAA,GAAiBD,aAAaU,MAAO5E,CAAAA,KAAAA,CAAAA,CAAAA;AACrC,YAAA;AACJ;;AAGA,IAAA,IAAI4B,SAAS/D,OAAS,EAAA;;AAEpB,QAAA,MAAMiH,cAAiBjH,GAAAA,OAAAA,CAAQyC,IAAI,CAAC,CAACyE,MAAAA,GAAAA;YACnC,OAAQ,CAAA,OAAOA,MAAAA,KAAW,WAAWA,MAASA,GAAAA,MAAAA,CAAO/E,KAAI,MAAOA,KAAAA;AAClE,SAAA,CAAA;QAEAmE,cAAiBW,GAAAA,cAAAA,GACb,OAAOA,cAAAA,KAAmB,QACxBA,GAAAA,cAAAA,GACCA,eAAehG,KAAK,IAAIgG,cAAe9E,CAAAA,KAAK,GAC/CA,KAAAA;AACN;AAEA,IAAA,MAAMgF,UAAU,CAAC,EAAElG,KAAM,CAAA,CAAC,EAAEE,aAAc,CAAA;AACxCQ,QAAAA,EAAAA,EAAI,CAAC,sCAAsC,EAAEkE,QAAAA,CAAS,CAAC;QACvDjE,cAAgBiE,EAAAA;KACf,CAAA,CAAA,CAAC,EAAEA,QAAa,KAAA,OAAA,IAAWA,aAAa,UAAaS,GAAAA,cAAAA,GAAiB,GAAG,CAAC;AAE7E,IAAA,qBACE1F,cAACwG,CAAAA,gBAAAA,EAAAA;QAAIhE,OAAS,EAAA,CAAA;QAAG8C,OAASX,EAAAA,WAAAA;AAAa8B,QAAAA,IAAAA,gBAAMzG,cAAC0G,CAAAA,WAAAA,EAAAA,EAAAA,CAAAA;AAC3CH,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;AAEA;;AAEkG,2GAE5FI,OAAU,GAAA;AACdjC,IAAAA,IAAAA;IACAzE,OAASgB,EAAAA,WAAAA;AACTjC,IAAAA,IAAAA;AACAkB,IAAAA;AACF;;;;"}
1
+ {"version":3,"file":"Filters.js","sources":["../../../../../admin/src/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Popover, Tag } from '@strapi/design-system';\nimport { Plus, Filter as FilterIcon, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport {\n BASE_FILTERS,\n CONTAINS_FILTERS,\n FilterOption,\n IS_SENSITIVE_FILTERS,\n NUMERIC_FILTERS,\n STRING_PARSE_FILTERS,\n FILTERS_WITH_NO_VALUE,\n} from '../constants/filters';\nimport { useControllableState } from '../hooks/useControllableState';\nimport { useQueryParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\nimport { Form, InputProps } from './Form';\nimport { InputRenderer } from './FormInputs/Renderer';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterFormData {\n name: string;\n filter: string;\n value?: string;\n}\n\ninterface FitlersContextValue {\n disabled: boolean;\n onChange: (data: FilterFormData) => void;\n options: Filters.Filter[];\n setOpen: (open: boolean) => void;\n}\n\nconst [FiltersProvider, useFilters] = createContext<FitlersContextValue>('Filters');\n\ninterface RootProps extends Partial<FitlersContextValue>, Popover.Props {\n children: React.ReactNode;\n}\n\nconst Root = ({\n children,\n disabled = false,\n onChange,\n options = [],\n onOpenChange,\n open: openProp,\n defaultOpen,\n ...restProps\n}: RootProps) => {\n const handleChange = (data: FilterFormData) => {\n if (onChange) {\n onChange(data);\n }\n };\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen} {...restProps}>\n <FiltersProvider\n setOpen={setOpen}\n disabled={disabled}\n onChange={handleChange}\n options={options}\n >\n {children}\n </FiltersProvider>\n </Popover.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst Trigger = React.forwardRef<HTMLButtonElement, Filters.TriggerProps>(\n ({ label }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const disabled = useFilters('Trigger', ({ disabled }) => disabled);\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"tertiary\"\n ref={forwardedRef}\n startIcon={<FilterIcon />}\n size=\"S\"\n disabled={disabled}\n >\n {label || formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n/**\n * The zIndex property is used to override the zIndex of the Portal element of the Popover.\n * This is needed to ensure that the DatePicker is rendered above the Popover when opened.\n * The issue was that both the DatePicker and the Popover are rendered in a Portal and have the same zIndex.\n * On init, since the DatePicker is rendered before the Popover in the DOM,\n * it's causing the issue of appearing behind the Popover.\n */\nconst PopoverImpl = ({ zIndex }: { zIndex?: number }) => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n const { formatMessage } = useIntl();\n const options = useFilters('Popover', ({ options }) => options);\n const onChange = useFilters('Popover', ({ onChange }) => onChange);\n const setOpen = useFilters('Popover', ({ setOpen }) => setOpen);\n\n if (options.length === 0) {\n return null;\n }\n\n const handleSubmit = (data: FilterFormData) => {\n const value = FILTERS_WITH_NO_VALUE.includes(data.filter)\n ? 'true'\n : encodeURIComponent(data.value ?? '');\n\n if (!value) {\n return;\n }\n\n if (onChange) {\n onChange(data);\n }\n\n /**\n * There will ALWAYS be an option because we use the options to create the form data.\n */\n const fieldOptions = options.find((filter) => filter.name === data.name)!;\n\n /**\n * If the filter is a relation, we need to nest the filter object,\n * we filter based on the mainField of the relation, if there is no mainField, we use the id.\n * At the end, we pass the operator & value. This value _could_ look like:\n * ```json\n * {\n * \"$eq\": \"1\",\n * }\n * ```\n */\n const operatorValuePairing = {\n [data.filter]: value,\n };\n\n const newFilterQuery = {\n ...query.filters,\n $and: [\n ...(query.filters?.$and ?? []),\n {\n [data.name]:\n fieldOptions.type === 'relation'\n ? {\n [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing,\n }\n : operatorValuePairing,\n },\n ],\n };\n\n setQuery({ filters: newFilterQuery, page: 1 });\n setOpen(false);\n };\n\n return (\n <Popover.Content style={{ zIndex }}>\n <Box padding={3}>\n <Form\n method=\"POST\"\n initialValues={\n {\n name: options[0]?.name,\n filter: BASE_FILTERS[0].value,\n } satisfies FilterFormData\n }\n onSubmit={handleSubmit}\n >\n {({ values: formValues, modified, isSubmitting }) => {\n const filter = options.find((filter) => filter.name === formValues.name);\n const Input = filter?.input || InputRenderer;\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} style={{ minWidth: 184 }}>\n {[\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n name: 'name',\n options: options.map((filter) => ({\n label: filter.label,\n value: filter.name,\n })),\n placholder: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n type: 'enumeration' as const,\n },\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n name: 'filter',\n options:\n filter?.operators ||\n getFilterList(filter).map((opt) => ({\n label: formatMessage(opt.label),\n value: opt.value,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n type: 'enumeration' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n {filter &&\n formValues.filter &&\n formValues.filter !== '$null' &&\n formValues.filter !== '$notNull' ? (\n <Input\n {...filter}\n label={null}\n aria-label={filter.label}\n name=\"value\"\n // @ts-expect-error – if type is `custom` then `Input` will be a custom component.\n type={filter.mainField?.type ?? filter.type}\n />\n ) : null}\n <Button\n disabled={!modified || isSubmitting}\n size=\"L\"\n variant=\"secondary\"\n startIcon={<Plus />}\n type=\"submit\"\n fullWidth\n >\n {formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Flex>\n );\n }}\n </Form>\n </Box>\n </Popover.Content>\n );\n};\n\n/**\n * Depending on the selected field find the possible filters to apply\n */\nconst getFilterList = (filter?: Filters.Filter): FilterOption[] => {\n if (!filter) {\n return [];\n }\n\n const type = filter.mainField?.type ? filter.mainField.type : filter.type;\n\n switch (type) {\n case 'email':\n case 'text':\n case 'string': {\n return [\n ...BASE_FILTERS,\n ...IS_SENSITIVE_FILTERS,\n ...CONTAINS_FILTERS,\n ...STRING_PARSE_FILTERS,\n ];\n }\n\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n case 'time':\n case 'date': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];\n }\n\n case 'datetime': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n\n case 'enumeration': {\n return BASE_FILTERS;\n }\n\n default:\n return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * List\n * -----------------------------------------------------------------------------------------------*/\n\nconst List = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n\n const options = useFilters('List', ({ options }) => options);\n\n const handleClick = (data: FilterFormData) => {\n /**\n * Check the name, operator and value to see if it already exists in the query\n * if it does, remove it.\n */\n const nextFilters = (query?.filters?.$and ?? []).filter((filter) => {\n const [attributeName] = Object.keys(filter);\n if (attributeName !== data.name) {\n return true;\n }\n\n const { type, mainField } = options.find(({ name }) => name === attributeName)!;\n\n if (type === 'relation') {\n const filterObj = filter[attributeName][mainField?.name ?? 'id'];\n\n if (typeof filterObj === 'object') {\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n return !(operator === data.filter && value === data.value);\n }\n\n return true;\n } else {\n const filterObj = filter[attributeName];\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n return !(operator === data.filter && value === data.value);\n }\n });\n\n setQuery({ filters: { $and: nextFilters }, page: 1 });\n };\n\n if (!query?.filters?.$and?.length) {\n return null;\n }\n\n return (\n <>\n {query?.filters?.$and?.map((queryFilter) => {\n const [attributeName] = Object.keys(queryFilter);\n const filter = options.find(({ name }) => name === attributeName);\n const filterObj = queryFilter[attributeName];\n\n if (!filter || typeof filterObj !== 'object' || filterObj === null) {\n return null;\n }\n\n if (filter.type === 'relation') {\n const modelFilter = filterObj[filter.mainField?.name ?? 'id'];\n\n if (typeof modelFilter === 'object') {\n const [operator] = Object.keys(modelFilter);\n const value = modelFilter[operator];\n return (\n <AttributeTag\n key={`${attributeName}-${operator}-${value}`}\n {...filter}\n onClick={handleClick}\n operator={operator}\n value={value}\n />\n );\n }\n\n return null;\n } else {\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n /**\n * Something has gone wrong here, because the attribute is not a relation\n * but we have a nested filter object.\n */\n if (typeof value === 'object') {\n return null;\n }\n\n return (\n <AttributeTag\n key={`${attributeName}-${operator}-${value}`}\n {...filter}\n onClick={handleClick}\n operator={operator}\n value={value}\n />\n );\n }\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n onClick: (data: FilterFormData) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n input,\n label,\n mainField,\n name,\n onClick,\n operator,\n options,\n value,\n ...filter\n}: AttributeTagProps) => {\n const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();\n\n const handleClick = () => {\n onClick({ name, value, filter: operator });\n };\n\n const type = mainField?.type ? mainField.type : filter.type;\n\n let formattedValue: string = value;\n\n switch (type) {\n case 'date':\n formattedValue = formatDate(value, { dateStyle: 'full' });\n break;\n case 'datetime':\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n break;\n case 'time':\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\n });\n break;\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal':\n formattedValue = formatNumber(Number(value));\n break;\n }\n\n // Handle custom input\n if (input && options) {\n // If the custom input has an options array, find the option with a customValue matching the query value\n const selectedOption = options.find((option) => {\n return (typeof option === 'string' ? option : option.value) === value;\n });\n\n formattedValue = selectedOption\n ? typeof selectedOption === 'string'\n ? selectedOption\n : (selectedOption.label ?? selectedOption.value)\n : value;\n }\n\n const content = `${label} ${formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n })} ${operator !== '$null' && operator !== '$notNull' ? formattedValue : ''}`;\n\n return (\n <Tag padding={1} onClick={handleClick} icon={<Cross />}>\n {content}\n </Tag>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Filters = {\n List,\n Popover: PopoverImpl,\n Root,\n Trigger,\n};\n\ninterface MainField {\n name: string;\n type: Schema.Attribute.Kind | 'custom';\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Filters {\n export interface Filter {\n input?: React.ComponentType<ValueInputProps>;\n label: string;\n /**\n * the name of the attribute we use to display the actual name e.g. relations\n * are just ids, so we use the mainField to display something meaninginful by\n * looking at the target's schema\n */\n mainField?: MainField;\n name: string;\n operators?: Array<{\n label: string;\n value: string;\n }>;\n options?: Array<{ label?: string; value: string }> | string[];\n type: InputProps['type'] | 'relation' | 'custom';\n }\n\n export interface ValueInputProps extends Omit<Filter, 'label'> {\n ['aria-label']: string;\n }\n\n export type Props = RootProps;\n\n export interface TriggerProps {\n label?: string;\n }\n\n export interface Query {\n filters?: {\n /**\n * Typically, a filter will be:\n * ```ts\n * {\n * [attributeName]: {\n * [operator]: value\n * }\n * }\n * ```\n * However, for relation items it becomes more nested.\n * ```ts\n * {\n * [attributeName]: {\n * [relationTargetAttribute]: {\n * [operator]: value\n * }\n * }\n * }\n * ```\n */\n $and?: Array<Record<string, Record<string, string | Record<string, string>>>>;\n };\n page?: number;\n }\n}\n\nexport { Filters };\n"],"names":["FiltersProvider","useFilters","createContext","Root","children","disabled","onChange","options","onOpenChange","open","openProp","defaultOpen","restProps","handleChange","data","setOpen","useControllableState","prop","defaultProp","_jsx","Popover","Trigger","React","forwardRef","label","forwardedRef","formatMessage","useIntl","Button","variant","ref","startIcon","FilterIcon","size","id","defaultMessage","PopoverImpl","zIndex","query","setQuery","useQueryParams","length","handleSubmit","value","FILTERS_WITH_NO_VALUE","includes","filter","encodeURIComponent","fieldOptions","find","name","operatorValuePairing","newFilterQuery","filters","$and","type","mainField","page","Content","style","Box","padding","Form","method","initialValues","BASE_FILTERS","onSubmit","values","formValues","modified","isSubmitting","Input","input","InputRenderer","_jsxs","Flex","direction","alignItems","gap","minWidth","map","placholder","operators","getFilterList","opt","placeholder","field","aria-label","Plus","fullWidth","IS_SENSITIVE_FILTERS","CONTAINS_FILTERS","STRING_PARSE_FILTERS","NUMERIC_FILTERS","List","handleClick","nextFilters","attributeName","Object","keys","filterObj","operator","_Fragment","queryFilter","modelFilter","AttributeTag","onClick","formatDate","formatTime","formatNumber","formattedValue","dateStyle","timeStyle","hour","minute","split","date","Date","setHours","Number","setMinutes","selectedOption","option","content","Tag","icon","Cross","Filters"],"mappings":"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"}
@@ -56,7 +56,13 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
56
56
  });
57
57
  /* -------------------------------------------------------------------------------------------------
58
58
  * Popover
59
- * -----------------------------------------------------------------------------------------------*/ const PopoverImpl = ()=>{
59
+ * -----------------------------------------------------------------------------------------------*/ /**
60
+ * The zIndex property is used to override the zIndex of the Portal element of the Popover.
61
+ * This is needed to ensure that the DatePicker is rendered above the Popover when opened.
62
+ * The issue was that both the DatePicker and the Popover are rendered in a Portal and have the same zIndex.
63
+ * On init, since the DatePicker is rendered before the Popover in the DOM,
64
+ * it's causing the issue of appearing behind the Popover.
65
+ */ const PopoverImpl = ({ zIndex })=>{
60
66
  const [{ query }, setQuery] = useQueryParams();
61
67
  const { formatMessage } = useIntl();
62
68
  const options = useFilters('Popover', ({ options })=>options);
@@ -106,6 +112,9 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
106
112
  setOpen(false);
107
113
  };
108
114
  return /*#__PURE__*/ jsx(Popover.Content, {
115
+ style: {
116
+ zIndex
117
+ },
109
118
  children: /*#__PURE__*/ jsx(Box, {
110
119
  padding: 3,
111
120
  children: /*#__PURE__*/ jsx(Form, {
@@ -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}\n\nconst [FiltersProvider, useFilters] = createContext<FitlersContextValue>('Filters');\n\ninterface RootProps extends Partial<FitlersContextValue>, Popover.Props {\n children: React.ReactNode;\n}\n\nconst Root = ({\n children,\n disabled = false,\n onChange,\n options = [],\n onOpenChange,\n open: openProp,\n defaultOpen,\n ...restProps\n}: RootProps) => {\n const handleChange = (data: FilterFormData) => {\n if (onChange) {\n onChange(data);\n }\n };\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen} {...restProps}>\n <FiltersProvider\n setOpen={setOpen}\n disabled={disabled}\n onChange={handleChange}\n options={options}\n >\n {children}\n </FiltersProvider>\n </Popover.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst Trigger = React.forwardRef<HTMLButtonElement, Filters.TriggerProps>(\n ({ label }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const disabled = useFilters('Trigger', ({ disabled }) => disabled);\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"tertiary\"\n ref={forwardedRef}\n startIcon={<FilterIcon />}\n size=\"S\"\n disabled={disabled}\n >\n {label || formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n\nconst PopoverImpl = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n const { formatMessage } = useIntl();\n const options = useFilters('Popover', ({ options }) => options);\n const onChange = useFilters('Popover', ({ onChange }) => onChange);\n const setOpen = useFilters('Popover', ({ setOpen }) => setOpen);\n\n if (options.length === 0) {\n return null;\n }\n\n const handleSubmit = (data: FilterFormData) => {\n const value = FILTERS_WITH_NO_VALUE.includes(data.filter)\n ? 'true'\n : encodeURIComponent(data.value ?? '');\n\n if (!value) {\n return;\n }\n\n if (onChange) {\n onChange(data);\n }\n\n /**\n * There will ALWAYS be an option because we use the options to create the form data.\n */\n const fieldOptions = options.find((filter) => filter.name === data.name)!;\n\n /**\n * If the filter is a relation, we need to nest the filter object,\n * we filter based on the mainField of the relation, if there is no mainField, we use the id.\n * At the end, we pass the operator & value. This value _could_ look like:\n * ```json\n * {\n * \"$eq\": \"1\",\n * }\n * ```\n */\n const operatorValuePairing = {\n [data.filter]: value,\n };\n\n const newFilterQuery = {\n ...query.filters,\n $and: [\n ...(query.filters?.$and ?? []),\n {\n [data.name]:\n fieldOptions.type === 'relation'\n ? {\n [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing,\n }\n : operatorValuePairing,\n },\n ],\n };\n\n setQuery({ filters: newFilterQuery, page: 1 });\n setOpen(false);\n };\n\n return (\n <Popover.Content>\n <Box padding={3}>\n <Form\n method=\"POST\"\n initialValues={\n {\n name: options[0]?.name,\n filter: BASE_FILTERS[0].value,\n } satisfies FilterFormData\n }\n onSubmit={handleSubmit}\n >\n {({ values: formValues, modified, isSubmitting }) => {\n const filter = options.find((filter) => filter.name === formValues.name);\n const Input = filter?.input || InputRenderer;\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} style={{ minWidth: 184 }}>\n {[\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n name: 'name',\n options: options.map((filter) => ({\n label: filter.label,\n value: filter.name,\n })),\n placholder: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n type: 'enumeration' as const,\n },\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n name: 'filter',\n options:\n filter?.operators ||\n getFilterList(filter).map((opt) => ({\n label: formatMessage(opt.label),\n value: opt.value,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n type: 'enumeration' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n {filter &&\n formValues.filter &&\n formValues.filter !== '$null' &&\n formValues.filter !== '$notNull' ? (\n <Input\n {...filter}\n label={null}\n aria-label={filter.label}\n name=\"value\"\n // @ts-expect-error – if type is `custom` then `Input` will be a custom component.\n type={filter.mainField?.type ?? filter.type}\n />\n ) : null}\n <Button\n disabled={!modified || isSubmitting}\n size=\"L\"\n variant=\"secondary\"\n startIcon={<Plus />}\n type=\"submit\"\n fullWidth\n >\n {formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Flex>\n );\n }}\n </Form>\n </Box>\n </Popover.Content>\n );\n};\n\n/**\n * Depending on the selected field find the possible filters to apply\n */\nconst getFilterList = (filter?: Filters.Filter): FilterOption[] => {\n if (!filter) {\n return [];\n }\n\n const type = filter.mainField?.type ? filter.mainField.type : filter.type;\n\n switch (type) {\n case 'email':\n case 'text':\n case 'string': {\n return [\n ...BASE_FILTERS,\n ...IS_SENSITIVE_FILTERS,\n ...CONTAINS_FILTERS,\n ...STRING_PARSE_FILTERS,\n ];\n }\n\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n case 'time':\n case 'date': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];\n }\n\n case 'datetime': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n\n case 'enumeration': {\n return BASE_FILTERS;\n }\n\n default:\n return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * List\n * -----------------------------------------------------------------------------------------------*/\n\nconst List = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n\n const options = useFilters('List', ({ options }) => options);\n\n const handleClick = (data: FilterFormData) => {\n /**\n * Check the name, operator and value to see if it already exists in the query\n * if it does, remove it.\n */\n const nextFilters = (query?.filters?.$and ?? []).filter((filter) => {\n const [attributeName] = Object.keys(filter);\n if (attributeName !== data.name) {\n return true;\n }\n\n const { type, mainField } = options.find(({ name }) => name === attributeName)!;\n\n if (type === 'relation') {\n const filterObj = filter[attributeName][mainField?.name ?? 'id'];\n\n if (typeof filterObj === 'object') {\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n return !(operator === data.filter && value === data.value);\n }\n\n return true;\n } else {\n const filterObj = filter[attributeName];\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n return !(operator === data.filter && value === data.value);\n }\n });\n\n setQuery({ filters: { $and: nextFilters }, page: 1 });\n };\n\n if (!query?.filters?.$and?.length) {\n return null;\n }\n\n return (\n <>\n {query?.filters?.$and?.map((queryFilter) => {\n const [attributeName] = Object.keys(queryFilter);\n const filter = options.find(({ name }) => name === attributeName);\n const filterObj = queryFilter[attributeName];\n\n if (!filter || typeof filterObj !== 'object' || filterObj === null) {\n return null;\n }\n\n if (filter.type === 'relation') {\n const modelFilter = filterObj[filter.mainField?.name ?? 'id'];\n\n if (typeof modelFilter === 'object') {\n const [operator] = Object.keys(modelFilter);\n const value = modelFilter[operator];\n return (\n <AttributeTag\n key={`${attributeName}-${operator}-${value}`}\n {...filter}\n onClick={handleClick}\n operator={operator}\n value={value}\n />\n );\n }\n\n return null;\n } else {\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n /**\n * Something has gone wrong here, because the attribute is not a relation\n * but we have a nested filter object.\n */\n if (typeof value === 'object') {\n return null;\n }\n\n return (\n <AttributeTag\n key={`${attributeName}-${operator}-${value}`}\n {...filter}\n onClick={handleClick}\n operator={operator}\n value={value}\n />\n );\n }\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n onClick: (data: FilterFormData) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n input,\n label,\n mainField,\n name,\n onClick,\n operator,\n options,\n value,\n ...filter\n}: AttributeTagProps) => {\n const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();\n\n const handleClick = () => {\n onClick({ name, value, filter: operator });\n };\n\n const type = mainField?.type ? mainField.type : filter.type;\n\n let formattedValue: string = value;\n\n switch (type) {\n case 'date':\n formattedValue = formatDate(value, { dateStyle: 'full' });\n break;\n case 'datetime':\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n break;\n case 'time':\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\n });\n break;\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal':\n formattedValue = formatNumber(Number(value));\n break;\n }\n\n // Handle custom input\n if (input && options) {\n // If the custom input has an options array, find the option with a customValue matching the query value\n const selectedOption = options.find((option) => {\n return (typeof option === 'string' ? option : option.value) === value;\n });\n\n formattedValue = selectedOption\n ? typeof selectedOption === 'string'\n ? selectedOption\n : (selectedOption.label ?? selectedOption.value)\n : value;\n }\n\n const content = `${label} ${formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n })} ${operator !== '$null' && operator !== '$notNull' ? formattedValue : ''}`;\n\n return (\n <Tag padding={1} onClick={handleClick} icon={<Cross />}>\n {content}\n </Tag>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Filters = {\n List,\n Popover: PopoverImpl,\n Root,\n Trigger,\n};\n\ninterface MainField {\n name: string;\n type: Schema.Attribute.Kind | 'custom';\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Filters {\n export interface Filter {\n input?: React.ComponentType<ValueInputProps>;\n label: string;\n /**\n * the name of the attribute we use to display the actual name e.g. relations\n * are just ids, so we use the mainField to display something meaninginful by\n * looking at the target's schema\n */\n mainField?: MainField;\n name: string;\n operators?: Array<{\n label: string;\n value: string;\n }>;\n options?: Array<{ label?: string; value: string }> | string[];\n type: InputProps['type'] | 'relation' | 'custom';\n }\n\n export interface ValueInputProps extends Omit<Filter, 'label'> {\n ['aria-label']: string;\n }\n\n export type Props = RootProps;\n\n export interface TriggerProps {\n label?: string;\n }\n\n export interface Query {\n filters?: {\n /**\n * Typically, a filter will be:\n * ```ts\n * {\n * [attributeName]: {\n * [operator]: value\n * }\n * }\n * ```\n * However, for relation items it becomes more nested.\n * ```ts\n * {\n * [attributeName]: {\n * [relationTargetAttribute]: {\n * [operator]: value\n * }\n * }\n * }\n * ```\n */\n $and?: Array<Record<string, Record<string, string | Record<string, string>>>>;\n };\n page?: number;\n }\n}\n\nexport { Filters };\n"],"names":["FiltersProvider","useFilters","createContext","Root","children","disabled","onChange","options","onOpenChange","open","openProp","defaultOpen","restProps","handleChange","data","setOpen","useControllableState","prop","defaultProp","_jsx","Popover","Trigger","React","forwardRef","label","forwardedRef","formatMessage","useIntl","Button","variant","ref","startIcon","FilterIcon","size","id","defaultMessage","PopoverImpl","query","setQuery","useQueryParams","length","handleSubmit","value","FILTERS_WITH_NO_VALUE","includes","filter","encodeURIComponent","fieldOptions","find","name","operatorValuePairing","newFilterQuery","filters","$and","type","mainField","page","Content","Box","padding","Form","method","initialValues","BASE_FILTERS","onSubmit","values","formValues","modified","isSubmitting","Input","input","InputRenderer","_jsxs","Flex","direction","alignItems","gap","style","minWidth","map","placholder","operators","getFilterList","opt","placeholder","field","aria-label","Plus","fullWidth","IS_SENSITIVE_FILTERS","CONTAINS_FILTERS","STRING_PARSE_FILTERS","NUMERIC_FILTERS","List","handleClick","nextFilters","attributeName","Object","keys","filterObj","operator","_Fragment","queryFilter","modelFilter","AttributeTag","onClick","formatDate","formatTime","formatNumber","formattedValue","dateStyle","timeStyle","hour","minute","split","date","Date","setHours","Number","setMinutes","selectedOption","option","content","Tag","icon","Cross","Filters"],"mappings":"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"}
1
+ {"version":3,"file":"Filters.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}\n\nconst [FiltersProvider, useFilters] = createContext<FitlersContextValue>('Filters');\n\ninterface RootProps extends Partial<FitlersContextValue>, Popover.Props {\n children: React.ReactNode;\n}\n\nconst Root = ({\n children,\n disabled = false,\n onChange,\n options = [],\n onOpenChange,\n open: openProp,\n defaultOpen,\n ...restProps\n}: RootProps) => {\n const handleChange = (data: FilterFormData) => {\n if (onChange) {\n onChange(data);\n }\n };\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen} {...restProps}>\n <FiltersProvider\n setOpen={setOpen}\n disabled={disabled}\n onChange={handleChange}\n options={options}\n >\n {children}\n </FiltersProvider>\n </Popover.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst Trigger = React.forwardRef<HTMLButtonElement, Filters.TriggerProps>(\n ({ label }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const disabled = useFilters('Trigger', ({ disabled }) => disabled);\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"tertiary\"\n ref={forwardedRef}\n startIcon={<FilterIcon />}\n size=\"S\"\n disabled={disabled}\n >\n {label || formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n/**\n * The zIndex property is used to override the zIndex of the Portal element of the Popover.\n * This is needed to ensure that the DatePicker is rendered above the Popover when opened.\n * The issue was that both the DatePicker and the Popover are rendered in a Portal and have the same zIndex.\n * On init, since the DatePicker is rendered before the Popover in the DOM,\n * it's causing the issue of appearing behind the Popover.\n */\nconst PopoverImpl = ({ zIndex }: { zIndex?: number }) => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n const { formatMessage } = useIntl();\n const options = useFilters('Popover', ({ options }) => options);\n const onChange = useFilters('Popover', ({ onChange }) => onChange);\n const setOpen = useFilters('Popover', ({ setOpen }) => setOpen);\n\n if (options.length === 0) {\n return null;\n }\n\n const handleSubmit = (data: FilterFormData) => {\n const value = FILTERS_WITH_NO_VALUE.includes(data.filter)\n ? 'true'\n : encodeURIComponent(data.value ?? '');\n\n if (!value) {\n return;\n }\n\n if (onChange) {\n onChange(data);\n }\n\n /**\n * There will ALWAYS be an option because we use the options to create the form data.\n */\n const fieldOptions = options.find((filter) => filter.name === data.name)!;\n\n /**\n * If the filter is a relation, we need to nest the filter object,\n * we filter based on the mainField of the relation, if there is no mainField, we use the id.\n * At the end, we pass the operator & value. This value _could_ look like:\n * ```json\n * {\n * \"$eq\": \"1\",\n * }\n * ```\n */\n const operatorValuePairing = {\n [data.filter]: value,\n };\n\n const newFilterQuery = {\n ...query.filters,\n $and: [\n ...(query.filters?.$and ?? []),\n {\n [data.name]:\n fieldOptions.type === 'relation'\n ? {\n [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing,\n }\n : operatorValuePairing,\n },\n ],\n };\n\n setQuery({ filters: newFilterQuery, page: 1 });\n setOpen(false);\n };\n\n return (\n <Popover.Content style={{ zIndex }}>\n <Box padding={3}>\n <Form\n method=\"POST\"\n initialValues={\n {\n name: options[0]?.name,\n filter: BASE_FILTERS[0].value,\n } satisfies FilterFormData\n }\n onSubmit={handleSubmit}\n >\n {({ values: formValues, modified, isSubmitting }) => {\n const filter = options.find((filter) => filter.name === formValues.name);\n const Input = filter?.input || InputRenderer;\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} style={{ minWidth: 184 }}>\n {[\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n name: 'name',\n options: options.map((filter) => ({\n label: filter.label,\n value: filter.name,\n })),\n placholder: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n type: 'enumeration' as const,\n },\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n name: 'filter',\n options:\n filter?.operators ||\n getFilterList(filter).map((opt) => ({\n label: formatMessage(opt.label),\n value: opt.value,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n type: 'enumeration' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n {filter &&\n formValues.filter &&\n formValues.filter !== '$null' &&\n formValues.filter !== '$notNull' ? (\n <Input\n {...filter}\n label={null}\n aria-label={filter.label}\n name=\"value\"\n // @ts-expect-error – if type is `custom` then `Input` will be a custom component.\n type={filter.mainField?.type ?? filter.type}\n />\n ) : null}\n <Button\n disabled={!modified || isSubmitting}\n size=\"L\"\n variant=\"secondary\"\n startIcon={<Plus />}\n type=\"submit\"\n fullWidth\n >\n {formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Flex>\n );\n }}\n </Form>\n </Box>\n </Popover.Content>\n );\n};\n\n/**\n * Depending on the selected field find the possible filters to apply\n */\nconst getFilterList = (filter?: Filters.Filter): FilterOption[] => {\n if (!filter) {\n return [];\n }\n\n const type = filter.mainField?.type ? filter.mainField.type : filter.type;\n\n switch (type) {\n case 'email':\n case 'text':\n case 'string': {\n return [\n ...BASE_FILTERS,\n ...IS_SENSITIVE_FILTERS,\n ...CONTAINS_FILTERS,\n ...STRING_PARSE_FILTERS,\n ];\n }\n\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n case 'time':\n case 'date': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];\n }\n\n case 'datetime': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n\n case 'enumeration': {\n return BASE_FILTERS;\n }\n\n default:\n return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * List\n * -----------------------------------------------------------------------------------------------*/\n\nconst List = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n\n const options = useFilters('List', ({ options }) => options);\n\n const handleClick = (data: FilterFormData) => {\n /**\n * Check the name, operator and value to see if it already exists in the query\n * if it does, remove it.\n */\n const nextFilters = (query?.filters?.$and ?? []).filter((filter) => {\n const [attributeName] = Object.keys(filter);\n if (attributeName !== data.name) {\n return true;\n }\n\n const { type, mainField } = options.find(({ name }) => name === attributeName)!;\n\n if (type === 'relation') {\n const filterObj = filter[attributeName][mainField?.name ?? 'id'];\n\n if (typeof filterObj === 'object') {\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n return !(operator === data.filter && value === data.value);\n }\n\n return true;\n } else {\n const filterObj = filter[attributeName];\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n return !(operator === data.filter && value === data.value);\n }\n });\n\n setQuery({ filters: { $and: nextFilters }, page: 1 });\n };\n\n if (!query?.filters?.$and?.length) {\n return null;\n }\n\n return (\n <>\n {query?.filters?.$and?.map((queryFilter) => {\n const [attributeName] = Object.keys(queryFilter);\n const filter = options.find(({ name }) => name === attributeName);\n const filterObj = queryFilter[attributeName];\n\n if (!filter || typeof filterObj !== 'object' || filterObj === null) {\n return null;\n }\n\n if (filter.type === 'relation') {\n const modelFilter = filterObj[filter.mainField?.name ?? 'id'];\n\n if (typeof modelFilter === 'object') {\n const [operator] = Object.keys(modelFilter);\n const value = modelFilter[operator];\n return (\n <AttributeTag\n key={`${attributeName}-${operator}-${value}`}\n {...filter}\n onClick={handleClick}\n operator={operator}\n value={value}\n />\n );\n }\n\n return null;\n } else {\n const [operator] = Object.keys(filterObj);\n const value = filterObj[operator];\n\n /**\n * Something has gone wrong here, because the attribute is not a relation\n * but we have a nested filter object.\n */\n if (typeof value === 'object') {\n return null;\n }\n\n return (\n <AttributeTag\n key={`${attributeName}-${operator}-${value}`}\n {...filter}\n onClick={handleClick}\n operator={operator}\n value={value}\n />\n );\n }\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n onClick: (data: FilterFormData) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n input,\n label,\n mainField,\n name,\n onClick,\n operator,\n options,\n value,\n ...filter\n}: AttributeTagProps) => {\n const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();\n\n const handleClick = () => {\n onClick({ name, value, filter: operator });\n };\n\n const type = mainField?.type ? mainField.type : filter.type;\n\n let formattedValue: string = value;\n\n switch (type) {\n case 'date':\n formattedValue = formatDate(value, { dateStyle: 'full' });\n break;\n case 'datetime':\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n break;\n case 'time':\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\n });\n break;\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal':\n formattedValue = formatNumber(Number(value));\n break;\n }\n\n // Handle custom input\n if (input && options) {\n // If the custom input has an options array, find the option with a customValue matching the query value\n const selectedOption = options.find((option) => {\n return (typeof option === 'string' ? option : option.value) === value;\n });\n\n formattedValue = selectedOption\n ? typeof selectedOption === 'string'\n ? selectedOption\n : (selectedOption.label ?? selectedOption.value)\n : value;\n }\n\n const content = `${label} ${formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n })} ${operator !== '$null' && operator !== '$notNull' ? formattedValue : ''}`;\n\n return (\n <Tag padding={1} onClick={handleClick} icon={<Cross />}>\n {content}\n </Tag>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Filters = {\n List,\n Popover: PopoverImpl,\n Root,\n Trigger,\n};\n\ninterface MainField {\n name: string;\n type: Schema.Attribute.Kind | 'custom';\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Filters {\n export interface Filter {\n input?: React.ComponentType<ValueInputProps>;\n label: string;\n /**\n * the name of the attribute we use to display the actual name e.g. relations\n * are just ids, so we use the mainField to display something meaninginful by\n * looking at the target's schema\n */\n mainField?: MainField;\n name: string;\n operators?: Array<{\n label: string;\n value: string;\n }>;\n options?: Array<{ label?: string; value: string }> | string[];\n type: InputProps['type'] | 'relation' | 'custom';\n }\n\n export interface ValueInputProps extends Omit<Filter, 'label'> {\n ['aria-label']: string;\n }\n\n export type Props = RootProps;\n\n export interface TriggerProps {\n label?: string;\n }\n\n export interface Query {\n filters?: {\n /**\n * Typically, a filter will be:\n * ```ts\n * {\n * [attributeName]: {\n * [operator]: value\n * }\n * }\n * ```\n * However, for relation items it becomes more nested.\n * ```ts\n * {\n * [attributeName]: {\n * [relationTargetAttribute]: {\n * [operator]: value\n * }\n * }\n * }\n * ```\n */\n $and?: Array<Record<string, Record<string, string | Record<string, string>>>>;\n };\n page?: number;\n }\n}\n\nexport { Filters };\n"],"names":["FiltersProvider","useFilters","createContext","Root","children","disabled","onChange","options","onOpenChange","open","openProp","defaultOpen","restProps","handleChange","data","setOpen","useControllableState","prop","defaultProp","_jsx","Popover","Trigger","React","forwardRef","label","forwardedRef","formatMessage","useIntl","Button","variant","ref","startIcon","FilterIcon","size","id","defaultMessage","PopoverImpl","zIndex","query","setQuery","useQueryParams","length","handleSubmit","value","FILTERS_WITH_NO_VALUE","includes","filter","encodeURIComponent","fieldOptions","find","name","operatorValuePairing","newFilterQuery","filters","$and","type","mainField","page","Content","style","Box","padding","Form","method","initialValues","BASE_FILTERS","onSubmit","values","formValues","modified","isSubmitting","Input","input","InputRenderer","_jsxs","Flex","direction","alignItems","gap","minWidth","map","placholder","operators","getFilterList","opt","placeholder","field","aria-label","Plus","fullWidth","IS_SENSITIVE_FILTERS","CONTAINS_FILTERS","STRING_PARSE_FILTERS","NUMERIC_FILTERS","List","handleClick","nextFilters","attributeName","Object","keys","filterObj","operator","_Fragment","queryFilter","modelFilter","AttributeTag","onClick","formatDate","formatTime","formatNumber","formattedValue","dateStyle","timeStyle","hour","minute","split","date","Date","setHours","Number","setMinutes","selectedOption","option","content","Tag","icon","Cross","Filters"],"mappings":"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"}
@@ -26,7 +26,18 @@ function _interopNamespaceDefault(e) {
26
26
 
27
27
  var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
28
28
 
29
- const [GuidedTourProviderImpl, unstableUseGuidedTour] = Context.createContext('UnstableGuidedTour');
29
+ const [GuidedTourProviderImpl, useGuidedTour] = Context.createContext('GuidedTour');
30
+ const getInitialTourState = (tours)=>{
31
+ return Object.keys(tours).reduce((acc, tourName)=>{
32
+ const tourLength = Object.keys(tours[tourName]).length;
33
+ acc[tourName] = {
34
+ currentStep: 0,
35
+ length: tourLength,
36
+ isCompleted: false
37
+ };
38
+ return acc;
39
+ }, {});
40
+ };
30
41
  function reducer(state, action) {
31
42
  return immer.produce(state, (draft)=>{
32
43
  if (action.type === 'next_step') {
@@ -48,30 +59,24 @@ function reducer(state, action) {
48
59
  if (action.type === 'skip_all_tours') {
49
60
  draft.enabled = false;
50
61
  }
62
+ if (action.type === 'reset_all_tours') {
63
+ draft.enabled = true;
64
+ draft.tours = getInitialTourState(Tours.tours);
65
+ draft.completedActions = [];
66
+ }
51
67
  });
52
68
  }
53
69
  const STORAGE_KEY = 'STRAPI_GUIDED_TOUR';
54
- const UnstableGuidedTourContext = ({ children, enabled = true })=>{
55
- const initialTourState = Object.keys(Tours.tours).reduce((acc, tourName)=>{
56
- const tourLength = Object.keys(Tours.tours[tourName]).length;
57
- acc[tourName] = {
58
- currentStep: 0,
59
- length: tourLength,
60
- isCompleted: false
61
- };
62
- return acc;
63
- }, {});
70
+ const GuidedTourContext = ({ children, enabled = true })=>{
64
71
  const [tours, setTours] = usePersistentState.usePersistentState(STORAGE_KEY, {
65
- tours: initialTourState,
72
+ tours: getInitialTourState(Tours.tours),
66
73
  enabled,
67
74
  completedActions: []
68
75
  });
69
76
  const [state, dispatch] = React__namespace.useReducer(reducer, tours);
70
77
  // Sync local storage
71
78
  React__namespace.useEffect(()=>{
72
- if (window.strapi.future.isEnabled('unstableGuidedTour')) {
73
- setTours(state);
74
- }
79
+ setTours(state);
75
80
  }, [
76
81
  state,
77
82
  setTours
@@ -83,7 +88,7 @@ const UnstableGuidedTourContext = ({ children, enabled = true })=>{
83
88
  });
84
89
  };
85
90
 
86
- exports.UnstableGuidedTourContext = UnstableGuidedTourContext;
91
+ exports.GuidedTourContext = GuidedTourContext;
87
92
  exports.reducer = reducer;
88
- exports.unstableUseGuidedTour = unstableUseGuidedTour;
93
+ exports.useGuidedTour = useGuidedTour;
89
94
  //# sourceMappingURL=Context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Context.js","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { GetGuidedTourMeta } from '../../../../shared/contracts/admin';\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\nexport type ExtendedCompletedActions = (\n | GetGuidedTourMeta.Response['data']['completedActions'][number]\n | 'didCopyApiToken'\n)[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'set_completed_actions';\n payload: ExtendedCompletedActions;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n };\n\ntype Tour = Record<ValidTourName, { currentStep: number; length: number; isCompleted: boolean }>;\ntype State = {\n tours: Tour;\n enabled: boolean;\n completedActions: ExtendedCompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n const tourLength = Object.keys(tours[tourName as ValidTourName]).length;\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n length: tourLength,\n isCompleted: false,\n };\n\n return acc;\n }, {} as Tour);\n};\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const nextStep = draft.tours[action.payload].currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep === draft.tours[action.payload].length;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const [tours, setTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n completedActions: [],\n });\n const [state, dispatch] = React.useReducer(reducer, tours);\n\n // Sync local storage\n React.useEffect(() => {\n setTours(state);\n }, [state, setTours]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","tourLength","length","currentStep","isCompleted","reducer","state","action","produce","draft","type","nextStep","payload","completedActions","Set","enabled","guidedTours","STORAGE_KEY","GuidedTourContext","children","setTours","usePersistentState","dispatch","React","useReducer","useEffect","_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,MAAM,CAACA,sBAAAA,EAAwBC,aAAc,CAAA,GAAGC,qBAG7C,CAAA,YAAA;AAEH,MAAMC,sBAAsB,CAACC,KAAAA,GAAAA;AAC3B,IAAA,OAAOC,OAAOC,IAAI,CAACF,OAAOG,MAAM,CAAC,CAACC,GAAKC,EAAAA,QAAAA,GAAAA;QACrC,MAAMC,UAAAA,GAAaL,OAAOC,IAAI,CAACF,KAAK,CAACK,QAAAA,CAA0B,EAAEE,MAAM;QACvEH,GAAG,CAACC,SAA0B,GAAG;YAC/BG,WAAa,EAAA,CAAA;YACbD,MAAQD,EAAAA,UAAAA;YACRG,WAAa,EAAA;AACf,SAAA;QAEA,OAAOL,GAAAA;AACT,KAAA,EAAG,EAAC,CAAA;AACN,CAAA;AAEA,SAASM,OAAAA,CAAQC,KAAY,EAAEC,MAAc,EAAA;IAC3C,OAAOC,aAAAA,CAAQF,OAAO,CAACG,KAAAA,GAAAA;QACrB,IAAIF,MAAAA,CAAOG,IAAI,KAAK,WAAa,EAAA;YAC/B,MAAMC,QAAAA,GAAWF,MAAMd,KAAK,CAACY,OAAOK,OAAO,CAAC,CAACT,WAAW,GAAG,CAAA;AAC3DM,YAAAA,KAAAA,CAAMd,KAAK,CAACY,MAAAA,CAAOK,OAAO,CAAC,CAACT,WAAW,GAAGQ,QAAAA;AAC1CF,YAAAA,KAAAA,CAAMd,KAAK,CAACY,MAAAA,CAAOK,OAAO,CAAC,CAACR,WAAW,GAAGO,QAAaF,KAAAA,KAAAA,CAAMd,KAAK,CAACY,MAAAA,CAAOK,OAAO,CAAC,CAACV,MAAM;AAC3F;QAEA,IAAIK,MAAAA,CAAOG,IAAI,KAAK,WAAa,EAAA;AAC/BD,YAAAA,KAAAA,CAAMd,KAAK,CAACY,MAAAA,CAAOK,OAAO,CAAC,CAACR,WAAW,GAAG,IAAA;AAC5C;QAEA,IAAIG,MAAAA,CAAOG,IAAI,KAAK,uBAAyB,EAAA;AAC3CD,YAAAA,KAAAA,CAAMI,gBAAgB,GAAG;AAAI,gBAAA,GAAA,IAAIC,GAAI,CAAA;AAAIL,oBAAAA,GAAAA,KAAAA,CAAMI,gBAAgB;AAAKN,oBAAAA,GAAAA,MAAAA,CAAOK;AAAQ,iBAAA;AAAE,aAAA;AACvF;QAEA,IAAIL,MAAAA,CAAOG,IAAI,KAAK,gBAAkB,EAAA;AACpCD,YAAAA,KAAAA,CAAMM,OAAO,GAAG,KAAA;AAClB;QAEA,IAAIR,MAAAA,CAAOG,IAAI,KAAK,iBAAmB,EAAA;AACrCD,YAAAA,KAAAA,CAAMM,OAAO,GAAG,IAAA;YAChBN,KAAMd,CAAAA,KAAK,GAAGD,mBAAoBsB,CAAAA,WAAAA,CAAAA;YAClCP,KAAMI,CAAAA,gBAAgB,GAAG,EAAE;AAC7B;AACF,KAAA,CAAA;AACF;AAEA,MAAMI,WAAc,GAAA,oBAAA;AACpB,MAAMC,oBAAoB,CAAC,EACzBC,QAAQ,EACRJ,OAAAA,GAAU,IAAI,EAIf,GAAA;AACC,IAAA,MAAM,CAACpB,KAAAA,EAAOyB,QAAS,CAAA,GAAGC,sCAA0BJ,WAAa,EAAA;AAC/DtB,QAAAA,KAAAA,EAAOD,mBAAoBsB,CAAAA,WAAAA,CAAAA;AAC3BD,QAAAA,OAAAA;AACAF,QAAAA,gBAAAA,EAAkB;AACpB,KAAA,CAAA;AACA,IAAA,MAAM,CAACP,KAAOgB,EAAAA,QAAAA,CAAS,GAAGC,gBAAMC,CAAAA,UAAU,CAACnB,OAASV,EAAAA,KAAAA,CAAAA;;AAGpD4B,IAAAA,gBAAAA,CAAME,SAAS,CAAC,IAAA;QACdL,QAASd,CAAAA,KAAAA,CAAAA;KACR,EAAA;AAACA,QAAAA,KAAAA;AAAOc,QAAAA;AAAS,KAAA,CAAA;AAEpB,IAAA,qBACEM,cAACnC,CAAAA,sBAAAA,EAAAA;QAAuBe,KAAOA,EAAAA,KAAAA;QAAOgB,QAAUA,EAAAA,QAAAA;AAC7CH,QAAAA,QAAAA,EAAAA;;AAGP;;;;;;"}
@@ -5,7 +5,18 @@ import { usePersistentState } from '../../hooks/usePersistentState.mjs';
5
5
  import { createContext } from '../Context.mjs';
6
6
  import { tours } from './Tours.mjs';
7
7
 
8
- const [GuidedTourProviderImpl, unstableUseGuidedTour] = createContext('UnstableGuidedTour');
8
+ const [GuidedTourProviderImpl, useGuidedTour] = createContext('GuidedTour');
9
+ const getInitialTourState = (tours)=>{
10
+ return Object.keys(tours).reduce((acc, tourName)=>{
11
+ const tourLength = Object.keys(tours[tourName]).length;
12
+ acc[tourName] = {
13
+ currentStep: 0,
14
+ length: tourLength,
15
+ isCompleted: false
16
+ };
17
+ return acc;
18
+ }, {});
19
+ };
9
20
  function reducer(state, action) {
10
21
  return produce(state, (draft)=>{
11
22
  if (action.type === 'next_step') {
@@ -27,30 +38,24 @@ function reducer(state, action) {
27
38
  if (action.type === 'skip_all_tours') {
28
39
  draft.enabled = false;
29
40
  }
41
+ if (action.type === 'reset_all_tours') {
42
+ draft.enabled = true;
43
+ draft.tours = getInitialTourState(tours);
44
+ draft.completedActions = [];
45
+ }
30
46
  });
31
47
  }
32
48
  const STORAGE_KEY = 'STRAPI_GUIDED_TOUR';
33
- const UnstableGuidedTourContext = ({ children, enabled = true })=>{
34
- const initialTourState = Object.keys(tours).reduce((acc, tourName)=>{
35
- const tourLength = Object.keys(tours[tourName]).length;
36
- acc[tourName] = {
37
- currentStep: 0,
38
- length: tourLength,
39
- isCompleted: false
40
- };
41
- return acc;
42
- }, {});
49
+ const GuidedTourContext = ({ children, enabled = true })=>{
43
50
  const [tours$1, setTours] = usePersistentState(STORAGE_KEY, {
44
- tours: initialTourState,
51
+ tours: getInitialTourState(tours),
45
52
  enabled,
46
53
  completedActions: []
47
54
  });
48
55
  const [state, dispatch] = React.useReducer(reducer, tours$1);
49
56
  // Sync local storage
50
57
  React.useEffect(()=>{
51
- if (window.strapi.future.isEnabled('unstableGuidedTour')) {
52
- setTours(state);
53
- }
58
+ setTours(state);
54
59
  }, [
55
60
  state,
56
61
  setTours
@@ -62,5 +67,5 @@ const UnstableGuidedTourContext = ({ children, enabled = true })=>{
62
67
  });
63
68
  };
64
69
 
65
- export { UnstableGuidedTourContext, reducer, unstableUseGuidedTour };
70
+ export { GuidedTourContext, reducer, useGuidedTour };
66
71
  //# sourceMappingURL=Context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Context.mjs","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { GetGuidedTourMeta } from '../../../../shared/contracts/admin';\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\nexport type ExtendedCompletedActions = (\n | GetGuidedTourMeta.Response['data']['completedActions'][number]\n | 'didCopyApiToken'\n)[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'set_completed_actions';\n payload: ExtendedCompletedActions;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n };\n\ntype Tour = Record<ValidTourName, { currentStep: number; length: number; isCompleted: boolean }>;\ntype State = {\n tours: Tour;\n enabled: boolean;\n completedActions: ExtendedCompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n const tourLength = Object.keys(tours[tourName as ValidTourName]).length;\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n length: tourLength,\n isCompleted: false,\n };\n\n return acc;\n }, {} as Tour);\n};\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const nextStep = draft.tours[action.payload].currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep === draft.tours[action.payload].length;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const [tours, setTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n completedActions: [],\n });\n const [state, dispatch] = React.useReducer(reducer, tours);\n\n // Sync local storage\n React.useEffect(() => {\n setTours(state);\n }, [state, setTours]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","tourLength","length","currentStep","isCompleted","reducer","state","action","produce","draft","type","nextStep","payload","completedActions","Set","enabled","guidedTours","STORAGE_KEY","GuidedTourContext","children","setTours","usePersistentState","dispatch","React","useReducer","useEffect","_jsx"],"mappings":";;;;;;;AAgDA,MAAM,CAACA,sBAAAA,EAAwBC,aAAc,CAAA,GAAGC,aAG7C,CAAA,YAAA;AAEH,MAAMC,sBAAsB,CAACC,KAAAA,GAAAA;AAC3B,IAAA,OAAOC,OAAOC,IAAI,CAACF,OAAOG,MAAM,CAAC,CAACC,GAAKC,EAAAA,QAAAA,GAAAA;QACrC,MAAMC,UAAAA,GAAaL,OAAOC,IAAI,CAACF,KAAK,CAACK,QAAAA,CAA0B,EAAEE,MAAM;QACvEH,GAAG,CAACC,SAA0B,GAAG;YAC/BG,WAAa,EAAA,CAAA;YACbD,MAAQD,EAAAA,UAAAA;YACRG,WAAa,EAAA;AACf,SAAA;QAEA,OAAOL,GAAAA;AACT,KAAA,EAAG,EAAC,CAAA;AACN,CAAA;AAEA,SAASM,OAAAA,CAAQC,KAAY,EAAEC,MAAc,EAAA;IAC3C,OAAOC,OAAAA,CAAQF,OAAO,CAACG,KAAAA,GAAAA;QACrB,IAAIF,MAAAA,CAAOG,IAAI,KAAK,WAAa,EAAA;YAC/B,MAAMC,QAAAA,GAAWF,MAAMd,KAAK,CAACY,OAAOK,OAAO,CAAC,CAACT,WAAW,GAAG,CAAA;AAC3DM,YAAAA,KAAAA,CAAMd,KAAK,CAACY,MAAAA,CAAOK,OAAO,CAAC,CAACT,WAAW,GAAGQ,QAAAA;AAC1CF,YAAAA,KAAAA,CAAMd,KAAK,CAACY,MAAAA,CAAOK,OAAO,CAAC,CAACR,WAAW,GAAGO,QAAaF,KAAAA,KAAAA,CAAMd,KAAK,CAACY,MAAAA,CAAOK,OAAO,CAAC,CAACV,MAAM;AAC3F;QAEA,IAAIK,MAAAA,CAAOG,IAAI,KAAK,WAAa,EAAA;AAC/BD,YAAAA,KAAAA,CAAMd,KAAK,CAACY,MAAAA,CAAOK,OAAO,CAAC,CAACR,WAAW,GAAG,IAAA;AAC5C;QAEA,IAAIG,MAAAA,CAAOG,IAAI,KAAK,uBAAyB,EAAA;AAC3CD,YAAAA,KAAAA,CAAMI,gBAAgB,GAAG;AAAI,gBAAA,GAAA,IAAIC,GAAI,CAAA;AAAIL,oBAAAA,GAAAA,KAAAA,CAAMI,gBAAgB;AAAKN,oBAAAA,GAAAA,MAAAA,CAAOK;AAAQ,iBAAA;AAAE,aAAA;AACvF;QAEA,IAAIL,MAAAA,CAAOG,IAAI,KAAK,gBAAkB,EAAA;AACpCD,YAAAA,KAAAA,CAAMM,OAAO,GAAG,KAAA;AAClB;QAEA,IAAIR,MAAAA,CAAOG,IAAI,KAAK,iBAAmB,EAAA;AACrCD,YAAAA,KAAAA,CAAMM,OAAO,GAAG,IAAA;YAChBN,KAAMd,CAAAA,KAAK,GAAGD,mBAAoBsB,CAAAA,KAAAA,CAAAA;YAClCP,KAAMI,CAAAA,gBAAgB,GAAG,EAAE;AAC7B;AACF,KAAA,CAAA;AACF;AAEA,MAAMI,WAAc,GAAA,oBAAA;AACpB,MAAMC,oBAAoB,CAAC,EACzBC,QAAQ,EACRJ,OAAAA,GAAU,IAAI,EAIf,GAAA;AACC,IAAA,MAAM,CAACpB,OAAAA,EAAOyB,QAAS,CAAA,GAAGC,mBAA0BJ,WAAa,EAAA;AAC/DtB,QAAAA,KAAAA,EAAOD,mBAAoBsB,CAAAA,KAAAA,CAAAA;AAC3BD,QAAAA,OAAAA;AACAF,QAAAA,gBAAAA,EAAkB;AACpB,KAAA,CAAA;AACA,IAAA,MAAM,CAACP,KAAOgB,EAAAA,QAAAA,CAAS,GAAGC,KAAMC,CAAAA,UAAU,CAACnB,OAASV,EAAAA,OAAAA,CAAAA;;AAGpD4B,IAAAA,KAAAA,CAAME,SAAS,CAAC,IAAA;QACdL,QAASd,CAAAA,KAAAA,CAAAA;KACR,EAAA;AAACA,QAAAA,KAAAA;AAAOc,QAAAA;AAAS,KAAA,CAAA;AAEpB,IAAA,qBACEM,GAACnC,CAAAA,sBAAAA,EAAAA;QAAuBe,KAAOA,EAAAA,KAAAA;QAAOgB,QAAUA,EAAAA,QAAAA;AAC7CH,QAAAA,QAAAA,EAAAA;;AAGP;;;;"}