@strapi/content-manager 0.0.0-next.965570e6e12a33ad098ddb3174a9750fddb03be2 → 0.0.0-next.96a532b33a712f19b498ed0a82a84752247cd899

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 (194) hide show
  1. package/dist/admin/components/ConfigurationForm/EditFieldForm.js +1 -1
  2. package/dist/admin/components/ConfigurationForm/EditFieldForm.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/EditFieldForm.mjs +1 -1
  4. package/dist/admin/components/ConfigurationForm/EditFieldForm.mjs.map +1 -1
  5. package/dist/admin/components/ConfigurationForm/Fields.js +4 -1
  6. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  7. package/dist/admin/components/ConfigurationForm/Fields.mjs +5 -2
  8. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  9. package/dist/admin/components/ConfigurationForm/Form.js +1 -1
  10. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
  11. package/dist/admin/components/ConfigurationForm/Form.mjs +3 -3
  12. package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -1
  13. package/dist/admin/components/DragPreviews/CardDragPreview.js +3 -1
  14. package/dist/admin/components/DragPreviews/CardDragPreview.js.map +1 -1
  15. package/dist/admin/components/DragPreviews/CardDragPreview.mjs +3 -1
  16. package/dist/admin/components/DragPreviews/CardDragPreview.mjs.map +1 -1
  17. package/dist/admin/components/DragPreviews/ComponentDragPreview.js +3 -1
  18. package/dist/admin/components/DragPreviews/ComponentDragPreview.js.map +1 -1
  19. package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs +3 -1
  20. package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs.map +1 -1
  21. package/dist/admin/components/DragPreviews/RelationDragPreview.js +3 -1
  22. package/dist/admin/components/DragPreviews/RelationDragPreview.js.map +1 -1
  23. package/dist/admin/components/DragPreviews/RelationDragPreview.mjs +3 -1
  24. package/dist/admin/components/DragPreviews/RelationDragPreview.mjs.map +1 -1
  25. package/dist/admin/components/LeftMenu.js +90 -48
  26. package/dist/admin/components/LeftMenu.js.map +1 -1
  27. package/dist/admin/components/LeftMenu.mjs +92 -50
  28. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  29. package/dist/admin/components/Widgets.js +22 -6
  30. package/dist/admin/components/Widgets.js.map +1 -1
  31. package/dist/admin/components/Widgets.mjs +22 -6
  32. package/dist/admin/components/Widgets.mjs.map +1 -1
  33. package/dist/admin/history/components/VersionHeader.js +1 -0
  34. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  35. package/dist/admin/history/components/VersionHeader.mjs +1 -0
  36. package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
  37. package/dist/admin/history/components/VersionsList.js +1 -1
  38. package/dist/admin/history/components/VersionsList.js.map +1 -1
  39. package/dist/admin/history/components/VersionsList.mjs +1 -1
  40. package/dist/admin/history/components/VersionsList.mjs.map +1 -1
  41. package/dist/admin/history/pages/History.js +7 -7
  42. package/dist/admin/history/pages/History.js.map +1 -1
  43. package/dist/admin/history/pages/History.mjs +7 -7
  44. package/dist/admin/history/pages/History.mjs.map +1 -1
  45. package/dist/admin/layout.js +27 -6
  46. package/dist/admin/layout.js.map +1 -1
  47. package/dist/admin/layout.mjs +28 -7
  48. package/dist/admin/layout.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/EditViewPage.js +7 -3
  50. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  51. package/dist/admin/pages/EditView/EditViewPage.mjs +8 -4
  52. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  53. package/dist/admin/pages/EditView/components/DocumentActions.js +6 -0
  54. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  55. package/dist/admin/pages/EditView/components/DocumentActions.mjs +6 -0
  56. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +66 -2
  58. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs +66 -2
  60. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +2 -2
  62. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +2 -2
  64. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.js +7 -3
  66. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.mjs +7 -3
  68. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/utils/links.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +2 -1
  70. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +3 -2
  72. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +1 -2
  74. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +1 -2
  76. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +4 -3
  78. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +5 -4
  80. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  81. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +2 -1
  82. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +3 -2
  84. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +2 -2
  86. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +2 -2
  88. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormLayout.js +13 -8
  90. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormLayout.mjs +14 -8
  92. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  93. package/dist/admin/pages/EditView/components/Header.js +85 -25
  94. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  95. package/dist/admin/pages/EditView/components/Header.mjs +87 -27
  96. package/dist/admin/pages/EditView/components/Header.mjs.map +1 -1
  97. package/dist/admin/pages/EditView/components/InputRenderer.js +6 -3
  98. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  99. package/dist/admin/pages/EditView/components/InputRenderer.mjs +6 -3
  100. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  101. package/dist/admin/pages/EditView/utils/data.js +1 -1
  102. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  103. package/dist/admin/pages/EditView/utils/data.mjs +1 -1
  104. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  105. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +1 -0
  106. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  107. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +1 -0
  108. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
  109. package/dist/admin/pages/ListView/components/Filters.js +4 -1
  110. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  111. package/dist/admin/pages/ListView/components/Filters.mjs +4 -1
  112. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  113. package/dist/admin/pages/ListView/components/ViewSettingsMenu.js +5 -2
  114. package/dist/admin/pages/ListView/components/ViewSettingsMenu.js.map +1 -1
  115. package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs +5 -2
  116. package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs.map +1 -1
  117. package/dist/admin/preview/components/InputPopover.js +130 -14
  118. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  119. package/dist/admin/preview/components/InputPopover.mjs +112 -15
  120. package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
  121. package/dist/admin/preview/components/PreviewHeader.js +0 -1
  122. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  123. package/dist/admin/preview/components/PreviewHeader.mjs +0 -1
  124. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  125. package/dist/admin/preview/hooks/usePreviewInputManager.js +18 -8
  126. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
  127. package/dist/admin/preview/hooks/usePreviewInputManager.mjs +18 -8
  128. package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -1
  129. package/dist/admin/preview/pages/Preview.js +12 -10
  130. package/dist/admin/preview/pages/Preview.js.map +1 -1
  131. package/dist/admin/preview/pages/Preview.mjs +14 -12
  132. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  133. package/dist/admin/preview/utils/constants.js +34 -0
  134. package/dist/admin/preview/utils/constants.js.map +1 -1
  135. package/dist/admin/preview/utils/constants.mjs +34 -1
  136. package/dist/admin/preview/utils/constants.mjs.map +1 -1
  137. package/dist/admin/preview/utils/fieldUtils.js +107 -0
  138. package/dist/admin/preview/utils/fieldUtils.js.map +1 -0
  139. package/dist/admin/preview/utils/fieldUtils.mjs +102 -0
  140. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -0
  141. package/dist/admin/preview/utils/previewScript.js +134 -50
  142. package/dist/admin/preview/utils/previewScript.js.map +1 -1
  143. package/dist/admin/preview/utils/previewScript.mjs +134 -50
  144. package/dist/admin/preview/utils/previewScript.mjs.map +1 -1
  145. package/dist/admin/services/documents.js +9 -1
  146. package/dist/admin/services/documents.js.map +1 -1
  147. package/dist/admin/services/documents.mjs +9 -1
  148. package/dist/admin/services/documents.mjs.map +1 -1
  149. package/dist/admin/src/components/LeftMenu.d.ts +3 -1
  150. package/dist/admin/src/components/Widgets.d.ts +6 -2
  151. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  152. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/links.d.ts +2 -0
  153. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +0 -3
  154. package/dist/admin/src/pages/EditView/components/Header.d.ts +4 -0
  155. package/dist/admin/src/preview/components/InputPopover.d.ts +1 -1
  156. package/dist/admin/src/preview/hooks/usePreviewInputManager.d.ts +2 -1
  157. package/dist/admin/src/preview/pages/Preview.d.ts +6 -2
  158. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  159. package/dist/admin/src/preview/utils/constants.d.ts +35 -0
  160. package/dist/admin/src/preview/utils/fieldUtils.d.ts +22 -0
  161. package/dist/admin/src/preview/utils/previewScript.d.ts +1 -0
  162. package/dist/admin/src/services/api.d.ts +1 -1
  163. package/dist/admin/src/services/components.d.ts +2 -2
  164. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  165. package/dist/admin/src/services/documents.d.ts +16 -16
  166. package/dist/admin/src/services/homepage.d.ts +1 -1
  167. package/dist/admin/src/services/init.d.ts +1 -1
  168. package/dist/admin/src/services/relations.d.ts +2 -2
  169. package/dist/admin/src/services/uid.d.ts +3 -3
  170. package/dist/admin/translations/en.json.js +5 -0
  171. package/dist/admin/translations/en.json.js.map +1 -1
  172. package/dist/admin/translations/en.json.mjs +5 -0
  173. package/dist/admin/translations/en.json.mjs.map +1 -1
  174. package/dist/server/controllers/collection-types.js +22 -2
  175. package/dist/server/controllers/collection-types.js.map +1 -1
  176. package/dist/server/controllers/collection-types.mjs +22 -2
  177. package/dist/server/controllers/collection-types.mjs.map +1 -1
  178. package/dist/server/controllers/relations.js +6 -4
  179. package/dist/server/controllers/relations.js.map +1 -1
  180. package/dist/server/controllers/relations.mjs +6 -4
  181. package/dist/server/controllers/relations.mjs.map +1 -1
  182. package/dist/server/controllers/single-types.js +9 -0
  183. package/dist/server/controllers/single-types.js.map +1 -1
  184. package/dist/server/controllers/single-types.mjs +9 -0
  185. package/dist/server/controllers/single-types.mjs.map +1 -1
  186. package/dist/server/preview/services/preview-config.js +8 -33
  187. package/dist/server/preview/services/preview-config.js.map +1 -1
  188. package/dist/server/preview/services/preview-config.mjs +9 -34
  189. package/dist/server/preview/services/preview-config.mjs.map +1 -1
  190. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  191. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  192. package/dist/server/src/controllers/single-types.d.ts.map +1 -1
  193. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  194. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"Filters.js","sources":["../../../../../admin/src/pages/ListView/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Filters,\n useField,\n useAuth,\n useTracking,\n useQueryParams,\n useAdminUsers,\n} from '@strapi/admin/strapi-admin';\nimport { Combobox, ComboboxOption, useCollator } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { CREATOR_FIELDS } from '../../../constants/attributes';\nimport { useContentTypeSchema } from '../../../hooks/useContentTypeSchema';\nimport { useDebounce } from '../../../hooks/useDebounce';\nimport { Schema } from '../../../hooks/useDocument';\nimport { useGetContentTypeConfigurationQuery } from '../../../services/contentTypes';\nimport { getMainField } from '../../../utils/attributes';\nimport { getDisplayName } from '../../../utils/users';\n\n/**\n * If new attributes are added, this list needs to be updated.\n */\nconst NOT_ALLOWED_FILTERS = [\n 'json',\n 'component',\n 'media',\n 'richtext',\n 'dynamiczone',\n 'password',\n 'blocks',\n];\nconst DEFAULT_ALLOWED_FILTERS = ['createdAt', 'updatedAt'];\nconst USER_FILTER_ATTRIBUTES = [...CREATOR_FIELDS, 'strapi_assignee'];\n\n/* -------------------------------------------------------------------------------------------------\n * Filters\n * -----------------------------------------------------------------------------------------------*/\ninterface FiltersProps {\n disabled?: boolean;\n schema: Schema;\n}\n\nconst FiltersImpl = ({ disabled, schema }: FiltersProps) => {\n const { attributes, uid: model, options } = schema;\n const { formatMessage, locale } = useIntl();\n const { trackUsage } = useTracking();\n const allPermissions = useAuth('FiltersImpl', (state) => state.permissions);\n const [{ query }] = useQueryParams<Filters.Query>();\n const { schemas } = useContentTypeSchema();\n\n const canReadAdminUsers = React.useMemo(\n () =>\n allPermissions.filter(\n (permission) => permission.action === 'admin::users.read' && permission.subject === null\n ).length > 0,\n [allPermissions]\n );\n\n const selectedUserIds = (query?.filters?.$and ?? []).reduce<string[]>((acc, filter) => {\n const [key, value] = Object.entries(filter)[0];\n if (typeof value.id !== 'object') {\n return acc;\n }\n\n const id = value.id.$eq || value.id.$ne;\n\n if (id && USER_FILTER_ATTRIBUTES.includes(key) && !acc.includes(id)) {\n acc.push(id);\n }\n\n return acc;\n }, []);\n\n const { data: userData, isLoading: isLoadingAdminUsers } = useAdminUsers(\n { filters: { id: { $in: selectedUserIds } } },\n {\n // fetch the list of admin users only if the filter contains users and the\n // current user has permissions to display users\n skip: selectedUserIds.length === 0 || !canReadAdminUsers,\n }\n );\n\n const { users = [] } = userData ?? {};\n\n const { metadata } = useGetContentTypeConfigurationQuery(model, {\n selectFromResult: ({ data }) => ({ metadata: data?.contentType.metadatas ?? {} }),\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const displayedFilters = React.useMemo(() => {\n const [{ properties: { fields = [] } = { fields: [] } }] = allPermissions.filter(\n (permission) =>\n permission.action === 'plugin::content-manager.explorer.read' &&\n permission.subject === model\n );\n\n const allowedFields = fields.filter((field) => {\n const attribute = attributes[field] ?? {};\n\n return attribute.type && !NOT_ALLOWED_FILTERS.includes(attribute.type);\n });\n\n return (\n [\n 'id',\n 'documentId',\n ...allowedFields,\n ...DEFAULT_ALLOWED_FILTERS,\n ...(canReadAdminUsers ? CREATOR_FIELDS : []),\n ]\n .map((name) => {\n const attribute = attributes[name];\n\n if (NOT_ALLOWED_FILTERS.includes(attribute.type)) {\n return null;\n }\n\n const { mainField: mainFieldName = '', label } = metadata[name].list;\n\n let filter: Filters.Filter = {\n name,\n label: label ?? '',\n mainField: getMainField(attribute, mainFieldName, { schemas, components: {} }),\n // @ts-expect-error – TODO: this is filtered out above in the `allowedFields` call but TS complains, is there a better way to solve this?\n type: attribute.type,\n };\n\n if (\n attribute.type === 'relation' &&\n 'target' in attribute &&\n attribute.target === 'admin::user'\n ) {\n filter = {\n ...filter,\n input: AdminUsersFilter,\n options: users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n })),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$ne',\n defaultMessage: 'is not',\n }),\n value: '$ne',\n },\n ],\n mainField: {\n name: 'id',\n type: 'integer',\n },\n };\n }\n\n if (attribute.type === 'enumeration') {\n filter = {\n ...filter,\n options: attribute.enum.map((value) => ({\n label: value,\n value,\n })),\n };\n }\n\n return filter;\n })\n .filter(Boolean) as Filters.Filter[]\n ).toSorted((a, b) => formatter.compare(a.label, b.label));\n }, [\n allPermissions,\n canReadAdminUsers,\n model,\n attributes,\n metadata,\n schemas,\n users,\n formatMessage,\n formatter,\n ]);\n\n const onOpenChange = (isOpen: boolean) => {\n if (isOpen) {\n trackUsage('willFilterEntries');\n }\n };\n\n const handleFilterChange: Filters.Props['onChange'] = (data) => {\n const attribute = attributes[data.name];\n\n if (attribute) {\n trackUsage('didFilterEntries', {\n useRelation: attribute.type === 'relation',\n });\n }\n };\n\n return (\n <Filters.Root\n disabled={disabled}\n options={displayedFilters}\n onOpenChange={onOpenChange}\n onChange={handleFilterChange}\n >\n <Filters.Trigger />\n <Filters.Popover zIndex={499} />\n <Filters.List />\n </Filters.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AdminUsersFilter\n * -----------------------------------------------------------------------------------------------*/\n\nconst AdminUsersFilter = ({ name }: Filters.ValueInputProps) => {\n const [pageSize, setPageSize] = React.useState(10);\n const [search, setSearch] = React.useState('');\n const { formatMessage } = useIntl();\n\n const debouncedSearch = useDebounce(search, 300);\n\n const { data, isLoading } = useAdminUsers({\n pageSize,\n _q: debouncedSearch,\n });\n const field = useField(name);\n\n const handleOpenChange = (isOpen?: boolean) => {\n if (!isOpen) {\n setPageSize(10);\n }\n };\n\n const { users = [], pagination } = data ?? {};\n const { pageCount = 1, page = 1 } = pagination ?? {};\n\n return (\n <Combobox\n value={field.value}\n aria-label={formatMessage({\n id: 'content-manager.components.Filters.usersSelect.label',\n defaultMessage: 'Search and select a user to filter',\n })}\n onOpenChange={handleOpenChange}\n onChange={(value) => field.onChange(name, value)}\n loading={isLoading}\n onLoadMore={() => setPageSize(pageSize + 10)}\n hasMoreItems={page < pageCount}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.currentTarget.value);\n }}\n >\n {users.map((user) => {\n return (\n <ComboboxOption key={user.id} value={user.id.toString()}>\n {getDisplayName(user)}\n </ComboboxOption>\n );\n })}\n </Combobox>\n );\n};\n\nexport { FiltersImpl as Filters };\nexport type { FiltersProps };\n"],"names":["NOT_ALLOWED_FILTERS","DEFAULT_ALLOWED_FILTERS","USER_FILTER_ATTRIBUTES","CREATOR_FIELDS","FiltersImpl","disabled","schema","attributes","uid","model","options","formatMessage","locale","useIntl","trackUsage","useTracking","allPermissions","useAuth","state","permissions","query","useQueryParams","schemas","useContentTypeSchema","canReadAdminUsers","React","useMemo","filter","permission","action","subject","length","selectedUserIds","filters","$and","reduce","acc","key","value","Object","entries","id","$eq","$ne","includes","push","data","userData","isLoading","isLoadingAdminUsers","useAdminUsers","$in","skip","users","metadata","useGetContentTypeConfigurationQuery","selectFromResult","contentType","metadatas","formatter","useCollator","sensitivity","displayedFilters","properties","fields","allowedFields","field","attribute","type","map","name","mainField","mainFieldName","label","list","getMainField","components","target","input","AdminUsersFilter","user","getDisplayName","toString","operators","defaultMessage","enum","Boolean","toSorted","a","b","compare","onOpenChange","isOpen","handleFilterChange","useRelation","_jsxs","Filters","Root","onChange","_jsx","Trigger","Popover","zIndex","List","pageSize","setPageSize","useState","search","setSearch","debouncedSearch","useDebounce","_q","useField","handleOpenChange","pagination","pageCount","page","Combobox","aria-label","loading","onLoadMore","hasMoreItems","onInputChange","e","currentTarget","ComboboxOption"],"mappings":"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"}
1
+ {"version":3,"file":"Filters.js","sources":["../../../../../admin/src/pages/ListView/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Filters,\n useField,\n useAuth,\n useTracking,\n useQueryParams,\n useAdminUsers,\n} from '@strapi/admin/strapi-admin';\nimport { Combobox, ComboboxOption, useCollator } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { CREATOR_FIELDS } from '../../../constants/attributes';\nimport { useContentTypeSchema } from '../../../hooks/useContentTypeSchema';\nimport { useDebounce } from '../../../hooks/useDebounce';\nimport { Schema } from '../../../hooks/useDocument';\nimport { useGetContentTypeConfigurationQuery } from '../../../services/contentTypes';\nimport { getMainField } from '../../../utils/attributes';\nimport { getDisplayName } from '../../../utils/users';\n\n/**\n * If new attributes are added, this list needs to be updated.\n */\nconst NOT_ALLOWED_FILTERS = [\n 'json',\n 'component',\n 'media',\n 'richtext',\n 'dynamiczone',\n 'password',\n 'blocks',\n];\nconst DEFAULT_ALLOWED_FILTERS = ['createdAt', 'updatedAt'];\nconst USER_FILTER_ATTRIBUTES = [...CREATOR_FIELDS, 'strapi_assignee'];\n\n/* -------------------------------------------------------------------------------------------------\n * Filters\n * -----------------------------------------------------------------------------------------------*/\ninterface FiltersProps {\n disabled?: boolean;\n schema: Schema;\n}\n\nconst FiltersImpl = ({ disabled, schema }: FiltersProps) => {\n const { attributes, uid: model, options } = schema;\n const { formatMessage, locale } = useIntl();\n const { trackUsage } = useTracking();\n const allPermissions = useAuth('FiltersImpl', (state) => state.permissions);\n const [{ query }] = useQueryParams<Filters.Query>();\n const { schemas } = useContentTypeSchema();\n\n const canReadAdminUsers = React.useMemo(\n () =>\n allPermissions.filter(\n (permission) => permission.action === 'admin::users.read' && permission.subject === null\n ).length > 0,\n [allPermissions]\n );\n\n const selectedUserIds = (query?.filters?.$and ?? []).reduce<string[]>((acc, filter) => {\n const [key, value] = Object.entries(filter)[0];\n if (typeof value.id !== 'object') {\n return acc;\n }\n\n const id = value.id.$eq || value.id.$ne;\n\n // Check if the attribute is a relation to admin::user\n const attribute = attributes[key];\n const isAdminUserRelation =\n attribute?.type === 'relation' && 'target' in attribute && attribute.target === 'admin::user';\n\n if (id && (isAdminUserRelation || USER_FILTER_ATTRIBUTES.includes(key)) && !acc.includes(id)) {\n acc.push(id);\n }\n\n return acc;\n }, []);\n\n const { data: userData, isLoading: isLoadingAdminUsers } = useAdminUsers(\n { filters: { id: { $in: selectedUserIds } } },\n {\n // fetch the list of admin users only if the filter contains users and the\n // current user has permissions to display users\n skip: selectedUserIds.length === 0 || !canReadAdminUsers,\n }\n );\n\n const { users = [] } = userData ?? {};\n\n const { metadata } = useGetContentTypeConfigurationQuery(model, {\n selectFromResult: ({ data }) => ({ metadata: data?.contentType.metadatas ?? {} }),\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const displayedFilters = React.useMemo(() => {\n const [{ properties: { fields = [] } = { fields: [] } }] = allPermissions.filter(\n (permission) =>\n permission.action === 'plugin::content-manager.explorer.read' &&\n permission.subject === model\n );\n\n const allowedFields = fields.filter((field) => {\n const attribute = attributes[field] ?? {};\n\n return attribute.type && !NOT_ALLOWED_FILTERS.includes(attribute.type);\n });\n\n return (\n [\n 'id',\n 'documentId',\n ...allowedFields,\n ...DEFAULT_ALLOWED_FILTERS,\n ...(canReadAdminUsers ? CREATOR_FIELDS : []),\n ]\n .map((name) => {\n const attribute = attributes[name];\n\n if (NOT_ALLOWED_FILTERS.includes(attribute.type)) {\n return null;\n }\n\n const { mainField: mainFieldName = '', label } = metadata[name].list;\n\n let filter: Filters.Filter = {\n name,\n label: label ?? '',\n mainField: getMainField(attribute, mainFieldName, { schemas, components: {} }),\n // @ts-expect-error – TODO: this is filtered out above in the `allowedFields` call but TS complains, is there a better way to solve this?\n type: attribute.type,\n };\n\n if (\n attribute.type === 'relation' &&\n 'target' in attribute &&\n attribute.target === 'admin::user'\n ) {\n filter = {\n ...filter,\n input: AdminUsersFilter,\n options: users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n })),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$ne',\n defaultMessage: 'is not',\n }),\n value: '$ne',\n },\n ],\n mainField: {\n name: 'id',\n type: 'integer',\n },\n };\n }\n\n if (attribute.type === 'enumeration') {\n filter = {\n ...filter,\n options: attribute.enum.map((value) => ({\n label: value,\n value,\n })),\n };\n }\n\n return filter;\n })\n .filter(Boolean) as Filters.Filter[]\n ).toSorted((a, b) => formatter.compare(a.label, b.label));\n }, [\n allPermissions,\n canReadAdminUsers,\n model,\n attributes,\n metadata,\n schemas,\n users,\n formatMessage,\n formatter,\n ]);\n\n const onOpenChange = (isOpen: boolean) => {\n if (isOpen) {\n trackUsage('willFilterEntries');\n }\n };\n\n const handleFilterChange: Filters.Props['onChange'] = (data) => {\n const attribute = attributes[data.name];\n\n if (attribute) {\n trackUsage('didFilterEntries', {\n useRelation: attribute.type === 'relation',\n });\n }\n };\n\n return (\n <Filters.Root\n disabled={disabled}\n options={displayedFilters}\n onOpenChange={onOpenChange}\n onChange={handleFilterChange}\n >\n <Filters.Trigger />\n <Filters.Popover zIndex={499} />\n <Filters.List />\n </Filters.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AdminUsersFilter\n * -----------------------------------------------------------------------------------------------*/\n\nconst AdminUsersFilter = ({ name }: Filters.ValueInputProps) => {\n const [pageSize, setPageSize] = React.useState(10);\n const [search, setSearch] = React.useState('');\n const { formatMessage } = useIntl();\n\n const debouncedSearch = useDebounce(search, 300);\n\n const { data, isLoading } = useAdminUsers({\n pageSize,\n _q: debouncedSearch,\n });\n const field = useField(name);\n\n const handleOpenChange = (isOpen?: boolean) => {\n if (!isOpen) {\n setPageSize(10);\n }\n };\n\n const { users = [], pagination } = data ?? {};\n const { pageCount = 1, page = 1 } = pagination ?? {};\n\n return (\n <Combobox\n value={field.value}\n aria-label={formatMessage({\n id: 'content-manager.components.Filters.usersSelect.label',\n defaultMessage: 'Search and select a user to filter',\n })}\n onOpenChange={handleOpenChange}\n onChange={(value) => field.onChange(name, value)}\n loading={isLoading}\n onLoadMore={() => setPageSize(pageSize + 10)}\n hasMoreItems={page < pageCount}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.currentTarget.value);\n }}\n >\n {users.map((user) => {\n return (\n <ComboboxOption key={user.id} value={user.id.toString()}>\n {getDisplayName(user)}\n </ComboboxOption>\n );\n })}\n </Combobox>\n );\n};\n\nexport { FiltersImpl as Filters };\nexport type { FiltersProps };\n"],"names":["NOT_ALLOWED_FILTERS","DEFAULT_ALLOWED_FILTERS","USER_FILTER_ATTRIBUTES","CREATOR_FIELDS","FiltersImpl","disabled","schema","attributes","uid","model","options","formatMessage","locale","useIntl","trackUsage","useTracking","allPermissions","useAuth","state","permissions","query","useQueryParams","schemas","useContentTypeSchema","canReadAdminUsers","React","useMemo","filter","permission","action","subject","length","selectedUserIds","filters","$and","reduce","acc","key","value","Object","entries","id","$eq","$ne","attribute","isAdminUserRelation","type","target","includes","push","data","userData","isLoading","isLoadingAdminUsers","useAdminUsers","$in","skip","users","metadata","useGetContentTypeConfigurationQuery","selectFromResult","contentType","metadatas","formatter","useCollator","sensitivity","displayedFilters","properties","fields","allowedFields","field","map","name","mainField","mainFieldName","label","list","getMainField","components","input","AdminUsersFilter","user","getDisplayName","toString","operators","defaultMessage","enum","Boolean","toSorted","a","b","compare","onOpenChange","isOpen","handleFilterChange","useRelation","_jsxs","Filters","Root","onChange","_jsx","Trigger","Popover","zIndex","List","pageSize","setPageSize","useState","search","setSearch","debouncedSearch","useDebounce","_q","useField","handleOpenChange","pagination","pageCount","page","Combobox","aria-label","loading","onLoadMore","hasMoreItems","onInputChange","e","currentTarget","ComboboxOption"],"mappings":"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"}
@@ -45,7 +45,10 @@ const FiltersImpl = ({ disabled, schema })=>{
45
45
  return acc;
46
46
  }
47
47
  const id = value.id.$eq || value.id.$ne;
48
- if (id && USER_FILTER_ATTRIBUTES.includes(key) && !acc.includes(id)) {
48
+ // Check if the attribute is a relation to admin::user
49
+ const attribute = attributes[key];
50
+ const isAdminUserRelation = attribute?.type === 'relation' && 'target' in attribute && attribute.target === 'admin::user';
51
+ if (id && (isAdminUserRelation || USER_FILTER_ATTRIBUTES.includes(key)) && !acc.includes(id)) {
49
52
  acc.push(id);
50
53
  }
51
54
  return acc;
@@ -1 +1 @@
1
- {"version":3,"file":"Filters.mjs","sources":["../../../../../admin/src/pages/ListView/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Filters,\n useField,\n useAuth,\n useTracking,\n useQueryParams,\n useAdminUsers,\n} from '@strapi/admin/strapi-admin';\nimport { Combobox, ComboboxOption, useCollator } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { CREATOR_FIELDS } from '../../../constants/attributes';\nimport { useContentTypeSchema } from '../../../hooks/useContentTypeSchema';\nimport { useDebounce } from '../../../hooks/useDebounce';\nimport { Schema } from '../../../hooks/useDocument';\nimport { useGetContentTypeConfigurationQuery } from '../../../services/contentTypes';\nimport { getMainField } from '../../../utils/attributes';\nimport { getDisplayName } from '../../../utils/users';\n\n/**\n * If new attributes are added, this list needs to be updated.\n */\nconst NOT_ALLOWED_FILTERS = [\n 'json',\n 'component',\n 'media',\n 'richtext',\n 'dynamiczone',\n 'password',\n 'blocks',\n];\nconst DEFAULT_ALLOWED_FILTERS = ['createdAt', 'updatedAt'];\nconst USER_FILTER_ATTRIBUTES = [...CREATOR_FIELDS, 'strapi_assignee'];\n\n/* -------------------------------------------------------------------------------------------------\n * Filters\n * -----------------------------------------------------------------------------------------------*/\ninterface FiltersProps {\n disabled?: boolean;\n schema: Schema;\n}\n\nconst FiltersImpl = ({ disabled, schema }: FiltersProps) => {\n const { attributes, uid: model, options } = schema;\n const { formatMessage, locale } = useIntl();\n const { trackUsage } = useTracking();\n const allPermissions = useAuth('FiltersImpl', (state) => state.permissions);\n const [{ query }] = useQueryParams<Filters.Query>();\n const { schemas } = useContentTypeSchema();\n\n const canReadAdminUsers = React.useMemo(\n () =>\n allPermissions.filter(\n (permission) => permission.action === 'admin::users.read' && permission.subject === null\n ).length > 0,\n [allPermissions]\n );\n\n const selectedUserIds = (query?.filters?.$and ?? []).reduce<string[]>((acc, filter) => {\n const [key, value] = Object.entries(filter)[0];\n if (typeof value.id !== 'object') {\n return acc;\n }\n\n const id = value.id.$eq || value.id.$ne;\n\n if (id && USER_FILTER_ATTRIBUTES.includes(key) && !acc.includes(id)) {\n acc.push(id);\n }\n\n return acc;\n }, []);\n\n const { data: userData, isLoading: isLoadingAdminUsers } = useAdminUsers(\n { filters: { id: { $in: selectedUserIds } } },\n {\n // fetch the list of admin users only if the filter contains users and the\n // current user has permissions to display users\n skip: selectedUserIds.length === 0 || !canReadAdminUsers,\n }\n );\n\n const { users = [] } = userData ?? {};\n\n const { metadata } = useGetContentTypeConfigurationQuery(model, {\n selectFromResult: ({ data }) => ({ metadata: data?.contentType.metadatas ?? {} }),\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const displayedFilters = React.useMemo(() => {\n const [{ properties: { fields = [] } = { fields: [] } }] = allPermissions.filter(\n (permission) =>\n permission.action === 'plugin::content-manager.explorer.read' &&\n permission.subject === model\n );\n\n const allowedFields = fields.filter((field) => {\n const attribute = attributes[field] ?? {};\n\n return attribute.type && !NOT_ALLOWED_FILTERS.includes(attribute.type);\n });\n\n return (\n [\n 'id',\n 'documentId',\n ...allowedFields,\n ...DEFAULT_ALLOWED_FILTERS,\n ...(canReadAdminUsers ? CREATOR_FIELDS : []),\n ]\n .map((name) => {\n const attribute = attributes[name];\n\n if (NOT_ALLOWED_FILTERS.includes(attribute.type)) {\n return null;\n }\n\n const { mainField: mainFieldName = '', label } = metadata[name].list;\n\n let filter: Filters.Filter = {\n name,\n label: label ?? '',\n mainField: getMainField(attribute, mainFieldName, { schemas, components: {} }),\n // @ts-expect-error – TODO: this is filtered out above in the `allowedFields` call but TS complains, is there a better way to solve this?\n type: attribute.type,\n };\n\n if (\n attribute.type === 'relation' &&\n 'target' in attribute &&\n attribute.target === 'admin::user'\n ) {\n filter = {\n ...filter,\n input: AdminUsersFilter,\n options: users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n })),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$ne',\n defaultMessage: 'is not',\n }),\n value: '$ne',\n },\n ],\n mainField: {\n name: 'id',\n type: 'integer',\n },\n };\n }\n\n if (attribute.type === 'enumeration') {\n filter = {\n ...filter,\n options: attribute.enum.map((value) => ({\n label: value,\n value,\n })),\n };\n }\n\n return filter;\n })\n .filter(Boolean) as Filters.Filter[]\n ).toSorted((a, b) => formatter.compare(a.label, b.label));\n }, [\n allPermissions,\n canReadAdminUsers,\n model,\n attributes,\n metadata,\n schemas,\n users,\n formatMessage,\n formatter,\n ]);\n\n const onOpenChange = (isOpen: boolean) => {\n if (isOpen) {\n trackUsage('willFilterEntries');\n }\n };\n\n const handleFilterChange: Filters.Props['onChange'] = (data) => {\n const attribute = attributes[data.name];\n\n if (attribute) {\n trackUsage('didFilterEntries', {\n useRelation: attribute.type === 'relation',\n });\n }\n };\n\n return (\n <Filters.Root\n disabled={disabled}\n options={displayedFilters}\n onOpenChange={onOpenChange}\n onChange={handleFilterChange}\n >\n <Filters.Trigger />\n <Filters.Popover zIndex={499} />\n <Filters.List />\n </Filters.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AdminUsersFilter\n * -----------------------------------------------------------------------------------------------*/\n\nconst AdminUsersFilter = ({ name }: Filters.ValueInputProps) => {\n const [pageSize, setPageSize] = React.useState(10);\n const [search, setSearch] = React.useState('');\n const { formatMessage } = useIntl();\n\n const debouncedSearch = useDebounce(search, 300);\n\n const { data, isLoading } = useAdminUsers({\n pageSize,\n _q: debouncedSearch,\n });\n const field = useField(name);\n\n const handleOpenChange = (isOpen?: boolean) => {\n if (!isOpen) {\n setPageSize(10);\n }\n };\n\n const { users = [], pagination } = data ?? {};\n const { pageCount = 1, page = 1 } = pagination ?? {};\n\n return (\n <Combobox\n value={field.value}\n aria-label={formatMessage({\n id: 'content-manager.components.Filters.usersSelect.label',\n defaultMessage: 'Search and select a user to filter',\n })}\n onOpenChange={handleOpenChange}\n onChange={(value) => field.onChange(name, value)}\n loading={isLoading}\n onLoadMore={() => setPageSize(pageSize + 10)}\n hasMoreItems={page < pageCount}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.currentTarget.value);\n }}\n >\n {users.map((user) => {\n return (\n <ComboboxOption key={user.id} value={user.id.toString()}>\n {getDisplayName(user)}\n </ComboboxOption>\n );\n })}\n </Combobox>\n );\n};\n\nexport { FiltersImpl as Filters };\nexport type { FiltersProps };\n"],"names":["NOT_ALLOWED_FILTERS","DEFAULT_ALLOWED_FILTERS","USER_FILTER_ATTRIBUTES","CREATOR_FIELDS","FiltersImpl","disabled","schema","attributes","uid","model","options","formatMessage","locale","useIntl","trackUsage","useTracking","allPermissions","useAuth","state","permissions","query","useQueryParams","schemas","useContentTypeSchema","canReadAdminUsers","React","useMemo","filter","permission","action","subject","length","selectedUserIds","filters","$and","reduce","acc","key","value","Object","entries","id","$eq","$ne","includes","push","data","userData","isLoading","isLoadingAdminUsers","useAdminUsers","$in","skip","users","metadata","useGetContentTypeConfigurationQuery","selectFromResult","contentType","metadatas","formatter","useCollator","sensitivity","displayedFilters","properties","fields","allowedFields","field","attribute","type","map","name","mainField","mainFieldName","label","list","getMainField","components","target","input","AdminUsersFilter","user","getDisplayName","toString","operators","defaultMessage","enum","Boolean","toSorted","a","b","compare","onOpenChange","isOpen","handleFilterChange","useRelation","_jsxs","Filters","Root","onChange","_jsx","Trigger","Popover","zIndex","List","pageSize","setPageSize","useState","search","setSearch","debouncedSearch","useDebounce","_q","useField","handleOpenChange","pagination","pageCount","page","Combobox","aria-label","loading","onLoadMore","hasMoreItems","onInputChange","e","currentTarget","ComboboxOption"],"mappings":"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"}
1
+ {"version":3,"file":"Filters.mjs","sources":["../../../../../admin/src/pages/ListView/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Filters,\n useField,\n useAuth,\n useTracking,\n useQueryParams,\n useAdminUsers,\n} from '@strapi/admin/strapi-admin';\nimport { Combobox, ComboboxOption, useCollator } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { CREATOR_FIELDS } from '../../../constants/attributes';\nimport { useContentTypeSchema } from '../../../hooks/useContentTypeSchema';\nimport { useDebounce } from '../../../hooks/useDebounce';\nimport { Schema } from '../../../hooks/useDocument';\nimport { useGetContentTypeConfigurationQuery } from '../../../services/contentTypes';\nimport { getMainField } from '../../../utils/attributes';\nimport { getDisplayName } from '../../../utils/users';\n\n/**\n * If new attributes are added, this list needs to be updated.\n */\nconst NOT_ALLOWED_FILTERS = [\n 'json',\n 'component',\n 'media',\n 'richtext',\n 'dynamiczone',\n 'password',\n 'blocks',\n];\nconst DEFAULT_ALLOWED_FILTERS = ['createdAt', 'updatedAt'];\nconst USER_FILTER_ATTRIBUTES = [...CREATOR_FIELDS, 'strapi_assignee'];\n\n/* -------------------------------------------------------------------------------------------------\n * Filters\n * -----------------------------------------------------------------------------------------------*/\ninterface FiltersProps {\n disabled?: boolean;\n schema: Schema;\n}\n\nconst FiltersImpl = ({ disabled, schema }: FiltersProps) => {\n const { attributes, uid: model, options } = schema;\n const { formatMessage, locale } = useIntl();\n const { trackUsage } = useTracking();\n const allPermissions = useAuth('FiltersImpl', (state) => state.permissions);\n const [{ query }] = useQueryParams<Filters.Query>();\n const { schemas } = useContentTypeSchema();\n\n const canReadAdminUsers = React.useMemo(\n () =>\n allPermissions.filter(\n (permission) => permission.action === 'admin::users.read' && permission.subject === null\n ).length > 0,\n [allPermissions]\n );\n\n const selectedUserIds = (query?.filters?.$and ?? []).reduce<string[]>((acc, filter) => {\n const [key, value] = Object.entries(filter)[0];\n if (typeof value.id !== 'object') {\n return acc;\n }\n\n const id = value.id.$eq || value.id.$ne;\n\n // Check if the attribute is a relation to admin::user\n const attribute = attributes[key];\n const isAdminUserRelation =\n attribute?.type === 'relation' && 'target' in attribute && attribute.target === 'admin::user';\n\n if (id && (isAdminUserRelation || USER_FILTER_ATTRIBUTES.includes(key)) && !acc.includes(id)) {\n acc.push(id);\n }\n\n return acc;\n }, []);\n\n const { data: userData, isLoading: isLoadingAdminUsers } = useAdminUsers(\n { filters: { id: { $in: selectedUserIds } } },\n {\n // fetch the list of admin users only if the filter contains users and the\n // current user has permissions to display users\n skip: selectedUserIds.length === 0 || !canReadAdminUsers,\n }\n );\n\n const { users = [] } = userData ?? {};\n\n const { metadata } = useGetContentTypeConfigurationQuery(model, {\n selectFromResult: ({ data }) => ({ metadata: data?.contentType.metadatas ?? {} }),\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const displayedFilters = React.useMemo(() => {\n const [{ properties: { fields = [] } = { fields: [] } }] = allPermissions.filter(\n (permission) =>\n permission.action === 'plugin::content-manager.explorer.read' &&\n permission.subject === model\n );\n\n const allowedFields = fields.filter((field) => {\n const attribute = attributes[field] ?? {};\n\n return attribute.type && !NOT_ALLOWED_FILTERS.includes(attribute.type);\n });\n\n return (\n [\n 'id',\n 'documentId',\n ...allowedFields,\n ...DEFAULT_ALLOWED_FILTERS,\n ...(canReadAdminUsers ? CREATOR_FIELDS : []),\n ]\n .map((name) => {\n const attribute = attributes[name];\n\n if (NOT_ALLOWED_FILTERS.includes(attribute.type)) {\n return null;\n }\n\n const { mainField: mainFieldName = '', label } = metadata[name].list;\n\n let filter: Filters.Filter = {\n name,\n label: label ?? '',\n mainField: getMainField(attribute, mainFieldName, { schemas, components: {} }),\n // @ts-expect-error – TODO: this is filtered out above in the `allowedFields` call but TS complains, is there a better way to solve this?\n type: attribute.type,\n };\n\n if (\n attribute.type === 'relation' &&\n 'target' in attribute &&\n attribute.target === 'admin::user'\n ) {\n filter = {\n ...filter,\n input: AdminUsersFilter,\n options: users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n })),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$ne',\n defaultMessage: 'is not',\n }),\n value: '$ne',\n },\n ],\n mainField: {\n name: 'id',\n type: 'integer',\n },\n };\n }\n\n if (attribute.type === 'enumeration') {\n filter = {\n ...filter,\n options: attribute.enum.map((value) => ({\n label: value,\n value,\n })),\n };\n }\n\n return filter;\n })\n .filter(Boolean) as Filters.Filter[]\n ).toSorted((a, b) => formatter.compare(a.label, b.label));\n }, [\n allPermissions,\n canReadAdminUsers,\n model,\n attributes,\n metadata,\n schemas,\n users,\n formatMessage,\n formatter,\n ]);\n\n const onOpenChange = (isOpen: boolean) => {\n if (isOpen) {\n trackUsage('willFilterEntries');\n }\n };\n\n const handleFilterChange: Filters.Props['onChange'] = (data) => {\n const attribute = attributes[data.name];\n\n if (attribute) {\n trackUsage('didFilterEntries', {\n useRelation: attribute.type === 'relation',\n });\n }\n };\n\n return (\n <Filters.Root\n disabled={disabled}\n options={displayedFilters}\n onOpenChange={onOpenChange}\n onChange={handleFilterChange}\n >\n <Filters.Trigger />\n <Filters.Popover zIndex={499} />\n <Filters.List />\n </Filters.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AdminUsersFilter\n * -----------------------------------------------------------------------------------------------*/\n\nconst AdminUsersFilter = ({ name }: Filters.ValueInputProps) => {\n const [pageSize, setPageSize] = React.useState(10);\n const [search, setSearch] = React.useState('');\n const { formatMessage } = useIntl();\n\n const debouncedSearch = useDebounce(search, 300);\n\n const { data, isLoading } = useAdminUsers({\n pageSize,\n _q: debouncedSearch,\n });\n const field = useField(name);\n\n const handleOpenChange = (isOpen?: boolean) => {\n if (!isOpen) {\n setPageSize(10);\n }\n };\n\n const { users = [], pagination } = data ?? {};\n const { pageCount = 1, page = 1 } = pagination ?? {};\n\n return (\n <Combobox\n value={field.value}\n aria-label={formatMessage({\n id: 'content-manager.components.Filters.usersSelect.label',\n defaultMessage: 'Search and select a user to filter',\n })}\n onOpenChange={handleOpenChange}\n onChange={(value) => field.onChange(name, value)}\n loading={isLoading}\n onLoadMore={() => setPageSize(pageSize + 10)}\n hasMoreItems={page < pageCount}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.currentTarget.value);\n }}\n >\n {users.map((user) => {\n return (\n <ComboboxOption key={user.id} value={user.id.toString()}>\n {getDisplayName(user)}\n </ComboboxOption>\n );\n })}\n </Combobox>\n );\n};\n\nexport { FiltersImpl as Filters };\nexport type { FiltersProps };\n"],"names":["NOT_ALLOWED_FILTERS","DEFAULT_ALLOWED_FILTERS","USER_FILTER_ATTRIBUTES","CREATOR_FIELDS","FiltersImpl","disabled","schema","attributes","uid","model","options","formatMessage","locale","useIntl","trackUsage","useTracking","allPermissions","useAuth","state","permissions","query","useQueryParams","schemas","useContentTypeSchema","canReadAdminUsers","React","useMemo","filter","permission","action","subject","length","selectedUserIds","filters","$and","reduce","acc","key","value","Object","entries","id","$eq","$ne","attribute","isAdminUserRelation","type","target","includes","push","data","userData","isLoading","isLoadingAdminUsers","useAdminUsers","$in","skip","users","metadata","useGetContentTypeConfigurationQuery","selectFromResult","contentType","metadatas","formatter","useCollator","sensitivity","displayedFilters","properties","fields","allowedFields","field","map","name","mainField","mainFieldName","label","list","getMainField","components","input","AdminUsersFilter","user","getDisplayName","toString","operators","defaultMessage","enum","Boolean","toSorted","a","b","compare","onOpenChange","isOpen","handleFilterChange","useRelation","_jsxs","Filters","Root","onChange","_jsx","Trigger","Popover","zIndex","List","pageSize","setPageSize","useState","search","setSearch","debouncedSearch","useDebounce","_q","useField","handleOpenChange","pagination","pageCount","page","Combobox","aria-label","loading","onLoadMore","hasMoreItems","onInputChange","e","currentTarget","ComboboxOption"],"mappings":"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"}
@@ -97,13 +97,15 @@ const FieldPicker = ({ headers = [], resetHeaders, setHeaders })=>{
97
97
  tag: "fieldset",
98
98
  direction: "column",
99
99
  alignItems: "stretch",
100
- gap: 3,
100
+ gap: 1,
101
101
  borderWidth: 0,
102
102
  maxHeight: '240px',
103
- overflow: 'scroll',
103
+ padding: 1,
104
+ overflow: 'auto',
104
105
  children: [
105
106
  /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
106
107
  justifyContent: "space-between",
108
+ gap: 2,
107
109
  children: [
108
110
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
109
111
  tag: "legend",
@@ -134,6 +136,7 @@ const FieldPicker = ({ headers = [], resetHeaders, setHeaders })=>{
134
136
  background: isActive ? 'primary100' : 'transparent',
135
137
  hasRadius: true,
136
138
  padding: 2,
139
+ marginBottom: 1,
137
140
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Checkbox, {
138
141
  onCheckedChange: ()=>handleChange(header.name),
139
142
  checked: isActive,
@@ -1 +1 @@
1
- {"version":3,"file":"ViewSettingsMenu.js","sources":["../../../../../admin/src/pages/ListView/components/ViewSettingsMenu.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useTracking, useRBAC, useQueryParams } from '@strapi/admin/strapi-admin';\nimport {\n Flex,\n IconButton,\n Popover,\n Checkbox,\n TextButton,\n Typography,\n useCollator,\n LinkButton,\n} from '@strapi/design-system';\nimport { Cog, ListPlus } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { useDocumentLayout } from '../../../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../../../modules/hooks';\nimport { checkIfAttributeIsDisplayable } from '../../../utils/attributes';\n\ninterface ViewSettingsMenuProps extends FieldPickerProps {}\n\nconst ViewSettingsMenu = (props: ViewSettingsMenuProps) => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.collectionTypesConfigurations ?? []\n );\n const [{ query }] = useQueryParams<{ plugins?: Record<string, unknown> }>();\n const { formatMessage } = useIntl();\n const {\n allowedActions: { canConfigureView },\n } = useRBAC(permissions);\n\n return (\n <Popover.Root>\n <Popover.Trigger>\n <IconButton\n label={formatMessage({\n id: 'components.ViewSettings.tooltip',\n defaultMessage: 'View Settings',\n })}\n >\n <Cog />\n </IconButton>\n </Popover.Trigger>\n <Popover.Content side=\"bottom\" align=\"end\" sideOffset={4}>\n <Flex alignItems=\"stretch\" direction=\"column\" padding={3} gap={3}>\n {canConfigureView ? (\n <LinkButton\n size=\"S\"\n startIcon={<ListPlus />}\n variant=\"secondary\"\n tag={NavLink}\n to={{\n pathname: 'configurations/list',\n search: query.plugins\n ? stringify({ plugins: query.plugins }, { encode: false })\n : '',\n }}\n >\n {formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n })}\n </LinkButton>\n ) : null}\n <FieldPicker {...props} />\n </Flex>\n </Popover.Content>\n </Popover.Root>\n );\n};\n\ninterface FieldPickerProps {\n headers?: string[];\n setHeaders: (headers: string[]) => void;\n resetHeaders: () => void;\n}\n\nconst FieldPicker = ({ headers = [], resetHeaders, setHeaders }: FieldPickerProps) => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n\n const { schema, model } = useDoc();\n const { list } = useDocumentLayout(model);\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const attributes = schema?.attributes ?? {};\n\n const columns = Object.keys(attributes)\n .filter((name) => checkIfAttributeIsDisplayable(attributes[name]))\n .map((name) => ({\n name,\n label: list.metadatas[name]?.label ?? '',\n }))\n .sort((a, b) => formatter.compare(a.label, b.label));\n\n const handleChange = (name: string) => {\n trackUsage('didChangeDisplayedFields');\n\n /**\n * create an array of the new headers, if the new name exists it should be removed,\n * otherwise it should be added\n */\n const newHeaders = headers.includes(name)\n ? headers.filter((header) => header !== name)\n : [...headers, name];\n\n setHeaders(newHeaders);\n };\n\n const handleReset = () => {\n resetHeaders();\n };\n\n return (\n <Flex\n tag=\"fieldset\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={3}\n borderWidth={0}\n maxHeight={'240px'}\n overflow={'scroll'}\n >\n <Flex justifyContent=\"space-between\">\n <Typography tag=\"legend\" variant=\"pi\" fontWeight=\"bold\">\n {formatMessage({\n id: 'containers.list.displayedFields',\n defaultMessage: 'Displayed fields',\n })}\n </Typography>\n\n <TextButton onClick={handleReset}>\n {formatMessage({\n id: 'app.components.Button.reset',\n defaultMessage: 'Reset',\n })}\n </TextButton>\n </Flex>\n\n <Flex direction=\"column\" alignItems=\"stretch\">\n {columns.map((header) => {\n const isActive = headers.includes(header.name);\n\n return (\n <Flex\n wrap=\"wrap\"\n gap={2}\n background={isActive ? 'primary100' : 'transparent'}\n hasRadius\n padding={2}\n key={header.name}\n >\n <Checkbox\n onCheckedChange={() => handleChange(header.name)}\n checked={isActive}\n name={header.name}\n >\n <Typography fontSize={1}>{header.label}</Typography>\n </Checkbox>\n </Flex>\n );\n })}\n </Flex>\n </Flex>\n );\n};\n\nexport { ViewSettingsMenu };\nexport type { ViewSettingsMenuProps, FieldPickerProps };\n"],"names":["ViewSettingsMenu","props","permissions","useTypedSelector","state","admin_app","contentManager","collectionTypesConfigurations","query","useQueryParams","formatMessage","useIntl","allowedActions","canConfigureView","useRBAC","_jsxs","Popover","Root","_jsx","Trigger","IconButton","label","id","defaultMessage","Cog","Content","side","align","sideOffset","Flex","alignItems","direction","padding","gap","LinkButton","size","startIcon","ListPlus","variant","tag","NavLink","to","pathname","search","plugins","stringify","encode","FieldPicker","headers","resetHeaders","setHeaders","trackUsage","useTracking","locale","schema","model","useDoc","list","useDocumentLayout","formatter","useCollator","sensitivity","attributes","columns","Object","keys","filter","name","checkIfAttributeIsDisplayable","map","metadatas","sort","a","b","compare","handleChange","newHeaders","includes","header","handleReset","borderWidth","maxHeight","overflow","justifyContent","Typography","fontWeight","TextButton","onClick","isActive","wrap","background","hasRadius","Checkbox","onCheckedChange","checked","fontSize"],"mappings":"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"}
1
+ {"version":3,"file":"ViewSettingsMenu.js","sources":["../../../../../admin/src/pages/ListView/components/ViewSettingsMenu.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useTracking, useRBAC, useQueryParams } from '@strapi/admin/strapi-admin';\nimport {\n Flex,\n IconButton,\n Popover,\n Checkbox,\n TextButton,\n Typography,\n useCollator,\n LinkButton,\n} from '@strapi/design-system';\nimport { Cog, ListPlus } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { useDocumentLayout } from '../../../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../../../modules/hooks';\nimport { checkIfAttributeIsDisplayable } from '../../../utils/attributes';\n\ninterface ViewSettingsMenuProps extends FieldPickerProps {}\n\nconst ViewSettingsMenu = (props: ViewSettingsMenuProps) => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.collectionTypesConfigurations ?? []\n );\n const [{ query }] = useQueryParams<{ plugins?: Record<string, unknown> }>();\n const { formatMessage } = useIntl();\n const {\n allowedActions: { canConfigureView },\n } = useRBAC(permissions);\n\n return (\n <Popover.Root>\n <Popover.Trigger>\n <IconButton\n label={formatMessage({\n id: 'components.ViewSettings.tooltip',\n defaultMessage: 'View Settings',\n })}\n >\n <Cog />\n </IconButton>\n </Popover.Trigger>\n <Popover.Content side=\"bottom\" align=\"end\" sideOffset={4}>\n <Flex alignItems=\"stretch\" direction=\"column\" padding={3} gap={3}>\n {canConfigureView ? (\n <LinkButton\n size=\"S\"\n startIcon={<ListPlus />}\n variant=\"secondary\"\n tag={NavLink}\n to={{\n pathname: 'configurations/list',\n search: query.plugins\n ? stringify({ plugins: query.plugins }, { encode: false })\n : '',\n }}\n >\n {formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n })}\n </LinkButton>\n ) : null}\n <FieldPicker {...props} />\n </Flex>\n </Popover.Content>\n </Popover.Root>\n );\n};\n\ninterface FieldPickerProps {\n headers?: string[];\n setHeaders: (headers: string[]) => void;\n resetHeaders: () => void;\n}\n\nconst FieldPicker = ({ headers = [], resetHeaders, setHeaders }: FieldPickerProps) => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n\n const { schema, model } = useDoc();\n const { list } = useDocumentLayout(model);\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const attributes = schema?.attributes ?? {};\n\n const columns = Object.keys(attributes)\n .filter((name) => checkIfAttributeIsDisplayable(attributes[name]))\n .map((name) => ({\n name,\n label: list.metadatas[name]?.label ?? '',\n }))\n .sort((a, b) => formatter.compare(a.label, b.label));\n\n const handleChange = (name: string) => {\n trackUsage('didChangeDisplayedFields');\n\n /**\n * create an array of the new headers, if the new name exists it should be removed,\n * otherwise it should be added\n */\n const newHeaders = headers.includes(name)\n ? headers.filter((header) => header !== name)\n : [...headers, name];\n\n setHeaders(newHeaders);\n };\n\n const handleReset = () => {\n resetHeaders();\n };\n\n return (\n <Flex\n tag=\"fieldset\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={1}\n borderWidth={0}\n maxHeight={'240px'}\n padding={1}\n overflow={'auto'}\n >\n <Flex justifyContent=\"space-between\" gap={2}>\n <Typography tag=\"legend\" variant=\"pi\" fontWeight=\"bold\">\n {formatMessage({\n id: 'containers.list.displayedFields',\n defaultMessage: 'Displayed fields',\n })}\n </Typography>\n\n <TextButton onClick={handleReset}>\n {formatMessage({\n id: 'app.components.Button.reset',\n defaultMessage: 'Reset',\n })}\n </TextButton>\n </Flex>\n\n <Flex direction=\"column\" alignItems=\"stretch\">\n {columns.map((header) => {\n const isActive = headers.includes(header.name);\n\n return (\n <Flex\n wrap=\"wrap\"\n gap={2}\n background={isActive ? 'primary100' : 'transparent'}\n hasRadius\n padding={2}\n marginBottom={1}\n key={header.name}\n >\n <Checkbox\n onCheckedChange={() => handleChange(header.name)}\n checked={isActive}\n name={header.name}\n >\n <Typography fontSize={1}>{header.label}</Typography>\n </Checkbox>\n </Flex>\n );\n })}\n </Flex>\n </Flex>\n );\n};\n\nexport { ViewSettingsMenu };\nexport type { ViewSettingsMenuProps, FieldPickerProps };\n"],"names":["ViewSettingsMenu","props","permissions","useTypedSelector","state","admin_app","contentManager","collectionTypesConfigurations","query","useQueryParams","formatMessage","useIntl","allowedActions","canConfigureView","useRBAC","_jsxs","Popover","Root","_jsx","Trigger","IconButton","label","id","defaultMessage","Cog","Content","side","align","sideOffset","Flex","alignItems","direction","padding","gap","LinkButton","size","startIcon","ListPlus","variant","tag","NavLink","to","pathname","search","plugins","stringify","encode","FieldPicker","headers","resetHeaders","setHeaders","trackUsage","useTracking","locale","schema","model","useDoc","list","useDocumentLayout","formatter","useCollator","sensitivity","attributes","columns","Object","keys","filter","name","checkIfAttributeIsDisplayable","map","metadatas","sort","a","b","compare","handleChange","newHeaders","includes","header","handleReset","borderWidth","maxHeight","overflow","justifyContent","Typography","fontWeight","TextButton","onClick","isActive","wrap","background","hasRadius","marginBottom","Checkbox","onCheckedChange","checked","fontSize"],"mappings":"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"}
@@ -95,13 +95,15 @@ const FieldPicker = ({ headers = [], resetHeaders, setHeaders })=>{
95
95
  tag: "fieldset",
96
96
  direction: "column",
97
97
  alignItems: "stretch",
98
- gap: 3,
98
+ gap: 1,
99
99
  borderWidth: 0,
100
100
  maxHeight: '240px',
101
- overflow: 'scroll',
101
+ padding: 1,
102
+ overflow: 'auto',
102
103
  children: [
103
104
  /*#__PURE__*/ jsxs(Flex, {
104
105
  justifyContent: "space-between",
106
+ gap: 2,
105
107
  children: [
106
108
  /*#__PURE__*/ jsx(Typography, {
107
109
  tag: "legend",
@@ -132,6 +134,7 @@ const FieldPicker = ({ headers = [], resetHeaders, setHeaders })=>{
132
134
  background: isActive ? 'primary100' : 'transparent',
133
135
  hasRadius: true,
134
136
  padding: 2,
137
+ marginBottom: 1,
135
138
  children: /*#__PURE__*/ jsx(Checkbox, {
136
139
  onCheckedChange: ()=>handleChange(header.name),
137
140
  checked: isActive,
@@ -1 +1 @@
1
- {"version":3,"file":"ViewSettingsMenu.mjs","sources":["../../../../../admin/src/pages/ListView/components/ViewSettingsMenu.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useTracking, useRBAC, useQueryParams } from '@strapi/admin/strapi-admin';\nimport {\n Flex,\n IconButton,\n Popover,\n Checkbox,\n TextButton,\n Typography,\n useCollator,\n LinkButton,\n} from '@strapi/design-system';\nimport { Cog, ListPlus } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { useDocumentLayout } from '../../../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../../../modules/hooks';\nimport { checkIfAttributeIsDisplayable } from '../../../utils/attributes';\n\ninterface ViewSettingsMenuProps extends FieldPickerProps {}\n\nconst ViewSettingsMenu = (props: ViewSettingsMenuProps) => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.collectionTypesConfigurations ?? []\n );\n const [{ query }] = useQueryParams<{ plugins?: Record<string, unknown> }>();\n const { formatMessage } = useIntl();\n const {\n allowedActions: { canConfigureView },\n } = useRBAC(permissions);\n\n return (\n <Popover.Root>\n <Popover.Trigger>\n <IconButton\n label={formatMessage({\n id: 'components.ViewSettings.tooltip',\n defaultMessage: 'View Settings',\n })}\n >\n <Cog />\n </IconButton>\n </Popover.Trigger>\n <Popover.Content side=\"bottom\" align=\"end\" sideOffset={4}>\n <Flex alignItems=\"stretch\" direction=\"column\" padding={3} gap={3}>\n {canConfigureView ? (\n <LinkButton\n size=\"S\"\n startIcon={<ListPlus />}\n variant=\"secondary\"\n tag={NavLink}\n to={{\n pathname: 'configurations/list',\n search: query.plugins\n ? stringify({ plugins: query.plugins }, { encode: false })\n : '',\n }}\n >\n {formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n })}\n </LinkButton>\n ) : null}\n <FieldPicker {...props} />\n </Flex>\n </Popover.Content>\n </Popover.Root>\n );\n};\n\ninterface FieldPickerProps {\n headers?: string[];\n setHeaders: (headers: string[]) => void;\n resetHeaders: () => void;\n}\n\nconst FieldPicker = ({ headers = [], resetHeaders, setHeaders }: FieldPickerProps) => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n\n const { schema, model } = useDoc();\n const { list } = useDocumentLayout(model);\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const attributes = schema?.attributes ?? {};\n\n const columns = Object.keys(attributes)\n .filter((name) => checkIfAttributeIsDisplayable(attributes[name]))\n .map((name) => ({\n name,\n label: list.metadatas[name]?.label ?? '',\n }))\n .sort((a, b) => formatter.compare(a.label, b.label));\n\n const handleChange = (name: string) => {\n trackUsage('didChangeDisplayedFields');\n\n /**\n * create an array of the new headers, if the new name exists it should be removed,\n * otherwise it should be added\n */\n const newHeaders = headers.includes(name)\n ? headers.filter((header) => header !== name)\n : [...headers, name];\n\n setHeaders(newHeaders);\n };\n\n const handleReset = () => {\n resetHeaders();\n };\n\n return (\n <Flex\n tag=\"fieldset\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={3}\n borderWidth={0}\n maxHeight={'240px'}\n overflow={'scroll'}\n >\n <Flex justifyContent=\"space-between\">\n <Typography tag=\"legend\" variant=\"pi\" fontWeight=\"bold\">\n {formatMessage({\n id: 'containers.list.displayedFields',\n defaultMessage: 'Displayed fields',\n })}\n </Typography>\n\n <TextButton onClick={handleReset}>\n {formatMessage({\n id: 'app.components.Button.reset',\n defaultMessage: 'Reset',\n })}\n </TextButton>\n </Flex>\n\n <Flex direction=\"column\" alignItems=\"stretch\">\n {columns.map((header) => {\n const isActive = headers.includes(header.name);\n\n return (\n <Flex\n wrap=\"wrap\"\n gap={2}\n background={isActive ? 'primary100' : 'transparent'}\n hasRadius\n padding={2}\n key={header.name}\n >\n <Checkbox\n onCheckedChange={() => handleChange(header.name)}\n checked={isActive}\n name={header.name}\n >\n <Typography fontSize={1}>{header.label}</Typography>\n </Checkbox>\n </Flex>\n );\n })}\n </Flex>\n </Flex>\n );\n};\n\nexport { ViewSettingsMenu };\nexport type { ViewSettingsMenuProps, FieldPickerProps };\n"],"names":["ViewSettingsMenu","props","permissions","useTypedSelector","state","admin_app","contentManager","collectionTypesConfigurations","query","useQueryParams","formatMessage","useIntl","allowedActions","canConfigureView","useRBAC","_jsxs","Popover","Root","_jsx","Trigger","IconButton","label","id","defaultMessage","Cog","Content","side","align","sideOffset","Flex","alignItems","direction","padding","gap","LinkButton","size","startIcon","ListPlus","variant","tag","NavLink","to","pathname","search","plugins","stringify","encode","FieldPicker","headers","resetHeaders","setHeaders","trackUsage","useTracking","locale","schema","model","useDoc","list","useDocumentLayout","formatter","useCollator","sensitivity","attributes","columns","Object","keys","filter","name","checkIfAttributeIsDisplayable","map","metadatas","sort","a","b","compare","handleChange","newHeaders","includes","header","handleReset","borderWidth","maxHeight","overflow","justifyContent","Typography","fontWeight","TextButton","onClick","isActive","wrap","background","hasRadius","Checkbox","onCheckedChange","checked","fontSize"],"mappings":"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"}
1
+ {"version":3,"file":"ViewSettingsMenu.mjs","sources":["../../../../../admin/src/pages/ListView/components/ViewSettingsMenu.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useTracking, useRBAC, useQueryParams } from '@strapi/admin/strapi-admin';\nimport {\n Flex,\n IconButton,\n Popover,\n Checkbox,\n TextButton,\n Typography,\n useCollator,\n LinkButton,\n} from '@strapi/design-system';\nimport { Cog, ListPlus } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { useDocumentLayout } from '../../../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../../../modules/hooks';\nimport { checkIfAttributeIsDisplayable } from '../../../utils/attributes';\n\ninterface ViewSettingsMenuProps extends FieldPickerProps {}\n\nconst ViewSettingsMenu = (props: ViewSettingsMenuProps) => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.collectionTypesConfigurations ?? []\n );\n const [{ query }] = useQueryParams<{ plugins?: Record<string, unknown> }>();\n const { formatMessage } = useIntl();\n const {\n allowedActions: { canConfigureView },\n } = useRBAC(permissions);\n\n return (\n <Popover.Root>\n <Popover.Trigger>\n <IconButton\n label={formatMessage({\n id: 'components.ViewSettings.tooltip',\n defaultMessage: 'View Settings',\n })}\n >\n <Cog />\n </IconButton>\n </Popover.Trigger>\n <Popover.Content side=\"bottom\" align=\"end\" sideOffset={4}>\n <Flex alignItems=\"stretch\" direction=\"column\" padding={3} gap={3}>\n {canConfigureView ? (\n <LinkButton\n size=\"S\"\n startIcon={<ListPlus />}\n variant=\"secondary\"\n tag={NavLink}\n to={{\n pathname: 'configurations/list',\n search: query.plugins\n ? stringify({ plugins: query.plugins }, { encode: false })\n : '',\n }}\n >\n {formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n })}\n </LinkButton>\n ) : null}\n <FieldPicker {...props} />\n </Flex>\n </Popover.Content>\n </Popover.Root>\n );\n};\n\ninterface FieldPickerProps {\n headers?: string[];\n setHeaders: (headers: string[]) => void;\n resetHeaders: () => void;\n}\n\nconst FieldPicker = ({ headers = [], resetHeaders, setHeaders }: FieldPickerProps) => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n\n const { schema, model } = useDoc();\n const { list } = useDocumentLayout(model);\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const attributes = schema?.attributes ?? {};\n\n const columns = Object.keys(attributes)\n .filter((name) => checkIfAttributeIsDisplayable(attributes[name]))\n .map((name) => ({\n name,\n label: list.metadatas[name]?.label ?? '',\n }))\n .sort((a, b) => formatter.compare(a.label, b.label));\n\n const handleChange = (name: string) => {\n trackUsage('didChangeDisplayedFields');\n\n /**\n * create an array of the new headers, if the new name exists it should be removed,\n * otherwise it should be added\n */\n const newHeaders = headers.includes(name)\n ? headers.filter((header) => header !== name)\n : [...headers, name];\n\n setHeaders(newHeaders);\n };\n\n const handleReset = () => {\n resetHeaders();\n };\n\n return (\n <Flex\n tag=\"fieldset\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={1}\n borderWidth={0}\n maxHeight={'240px'}\n padding={1}\n overflow={'auto'}\n >\n <Flex justifyContent=\"space-between\" gap={2}>\n <Typography tag=\"legend\" variant=\"pi\" fontWeight=\"bold\">\n {formatMessage({\n id: 'containers.list.displayedFields',\n defaultMessage: 'Displayed fields',\n })}\n </Typography>\n\n <TextButton onClick={handleReset}>\n {formatMessage({\n id: 'app.components.Button.reset',\n defaultMessage: 'Reset',\n })}\n </TextButton>\n </Flex>\n\n <Flex direction=\"column\" alignItems=\"stretch\">\n {columns.map((header) => {\n const isActive = headers.includes(header.name);\n\n return (\n <Flex\n wrap=\"wrap\"\n gap={2}\n background={isActive ? 'primary100' : 'transparent'}\n hasRadius\n padding={2}\n marginBottom={1}\n key={header.name}\n >\n <Checkbox\n onCheckedChange={() => handleChange(header.name)}\n checked={isActive}\n name={header.name}\n >\n <Typography fontSize={1}>{header.label}</Typography>\n </Checkbox>\n </Flex>\n );\n })}\n </Flex>\n </Flex>\n );\n};\n\nexport { ViewSettingsMenu };\nexport type { ViewSettingsMenuProps, FieldPickerProps };\n"],"names":["ViewSettingsMenu","props","permissions","useTypedSelector","state","admin_app","contentManager","collectionTypesConfigurations","query","useQueryParams","formatMessage","useIntl","allowedActions","canConfigureView","useRBAC","_jsxs","Popover","Root","_jsx","Trigger","IconButton","label","id","defaultMessage","Cog","Content","side","align","sideOffset","Flex","alignItems","direction","padding","gap","LinkButton","size","startIcon","ListPlus","variant","tag","NavLink","to","pathname","search","plugins","stringify","encode","FieldPicker","headers","resetHeaders","setHeaders","trackUsage","useTracking","locale","schema","model","useDoc","list","useDocumentLayout","formatter","useCollator","sensitivity","attributes","columns","Object","keys","filter","name","checkIfAttributeIsDisplayable","map","metadatas","sort","a","b","compare","handleChange","newHeaders","includes","header","handleReset","borderWidth","maxHeight","overflow","justifyContent","Typography","fontWeight","TextButton","onClick","isActive","wrap","background","hasRadius","marginBottom","Checkbox","onCheckedChange","checked","fontSize"],"mappings":"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"}
@@ -1,18 +1,137 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
- require('react');
4
+ var React = require('react');
5
5
  var strapiAdmin = require('@strapi/admin/strapi-admin');
6
6
  var designSystem = require('@strapi/design-system');
7
+ var reactIntl = require('react-intl');
7
8
  var InputRenderer = require('../../pages/EditView/components/InputRenderer.js');
8
9
  var Preview = require('../pages/Preview.js');
10
+ var constants = require('../utils/constants.js');
11
+ var fieldUtils = require('../utils/fieldUtils.js');
12
+
13
+ function _interopNamespaceDefault(e) {
14
+ var n = Object.create(null);
15
+ if (e) {
16
+ Object.keys(e).forEach(function (k) {
17
+ if (k !== 'default') {
18
+ var d = Object.getOwnPropertyDescriptor(e, k);
19
+ Object.defineProperty(n, k, d.get ? d : {
20
+ enumerable: true,
21
+ get: function () { return e[k]; }
22
+ });
23
+ }
24
+ });
25
+ }
26
+ n.default = e;
27
+ return Object.freeze(n);
28
+ }
29
+
30
+ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
9
31
 
10
32
  const [InputPopoverProvider, useInputPopoverContext] = strapiAdmin.createContext('InputPopover');
11
- const InputPopover = ({ documentResponse })=>{
12
- const iframeRef = Preview.usePreviewContext('VisualEditingPopover', (state)=>state.iframeRef);
13
- const popoverField = Preview.usePreviewContext('VisualEditingPopover', (state)=>state.popoverField);
14
- const setPopoverField = Preview.usePreviewContext('VisualEditingPopover', (state)=>state.setPopoverField);
15
- if (!popoverField || !documentResponse.schema || !iframeRef.current) {
33
+ function useHasInputPopoverParent() {
34
+ const context = useInputPopoverContext('useHasInputPopoverParent', ()=>true, false);
35
+ // useContext will return undefined if the called is not wrapped in the provider
36
+ return context !== undefined;
37
+ }
38
+ /* -------------------------------------------------------------------------------------------------
39
+ * InputPopover
40
+ * -----------------------------------------------------------------------------------------------*/ const InputPopover = ({ documentResponse })=>{
41
+ const iframeRef = Preview.usePreviewContext('InputPopover', (state)=>state.iframeRef);
42
+ const popoverField = Preview.usePreviewContext('InputPopover', (state)=>state.popoverField);
43
+ const setPopoverField = Preview.usePreviewContext('InputPopover', (state)=>state.setPopoverField);
44
+ const document = Preview.usePreviewContext('InputPopover', (state)=>state.document);
45
+ const schema = Preview.usePreviewContext('InputPopover', (state)=>state.schema);
46
+ const components = Preview.usePreviewContext('InputPopover', (state)=>state.components);
47
+ const { toggleNotification } = strapiAdmin.useNotification();
48
+ const { formatMessage } = reactIntl.useIntl();
49
+ React__namespace.useEffect(()=>{
50
+ /**
51
+ * We receive window events sent from the user's preview via the injected script.
52
+ * We listen to the ones here that target a specific field.
53
+ */ const handleMessage = (event)=>{
54
+ // Only listen to events from the preview iframe
55
+ if (iframeRef.current) {
56
+ const previewOrigin = new URL(iframeRef.current?.src).origin;
57
+ if (event.origin !== previewOrigin) {
58
+ return;
59
+ }
60
+ }
61
+ if (event.data?.type === constants.INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {
62
+ const fieldMetaData = fieldUtils.parseFieldMetaData(event.data.payload.path);
63
+ if (!fieldMetaData) {
64
+ const { type, message } = constants.PREVIEW_ERROR_MESSAGES.INCOMPLETE_STRAPI_SOURCE;
65
+ toggleNotification({
66
+ type,
67
+ message: formatMessage(message)
68
+ });
69
+ return;
70
+ }
71
+ /**
72
+ * Ignore (for now) content that comes from separate API requests than the one for the
73
+ * current document. This doesn't do anything about fields that may come from relations to
74
+ * the current document however.
75
+ */ if (fieldMetaData.documentId !== document.documentId) {
76
+ const { type, message } = constants.PREVIEW_ERROR_MESSAGES.DIFFERENT_DOCUMENT;
77
+ toggleNotification({
78
+ type,
79
+ message: formatMessage(message)
80
+ });
81
+ return;
82
+ }
83
+ try {
84
+ const attribute = fieldUtils.getAttributeSchemaFromPath({
85
+ path: fieldMetaData.path,
86
+ components,
87
+ schema,
88
+ document
89
+ });
90
+ // We're able to handle the field, set it in context so the popover can pick it up
91
+ setPopoverField({
92
+ ...fieldMetaData,
93
+ position: event.data.payload.position,
94
+ attribute
95
+ });
96
+ } catch (error) {
97
+ if (error instanceof fieldUtils.PreviewFieldError) {
98
+ const { type, message } = constants.PREVIEW_ERROR_MESSAGES[error.messageKey];
99
+ toggleNotification({
100
+ type,
101
+ message: formatMessage(message)
102
+ });
103
+ } else if (error instanceof Error) {
104
+ toggleNotification({
105
+ type: 'danger',
106
+ message: error.message
107
+ });
108
+ }
109
+ }
110
+ }
111
+ if (event.data?.type === constants.INTERNAL_EVENTS.STRAPI_FIELD_SINGLE_CLICK_HINT) {
112
+ toggleNotification({
113
+ type: 'info',
114
+ message: formatMessage({
115
+ id: 'content-manager.preview.info.single-click-hint',
116
+ defaultMessage: 'Double click to edit'
117
+ })
118
+ });
119
+ }
120
+ };
121
+ window.addEventListener('message', handleMessage);
122
+ return ()=>{
123
+ window.removeEventListener('message', handleMessage);
124
+ };
125
+ }, [
126
+ components,
127
+ document,
128
+ iframeRef,
129
+ schema,
130
+ setPopoverField,
131
+ toggleNotification,
132
+ formatMessage
133
+ ]);
134
+ if (!popoverField || !iframeRef.current) {
16
135
  return null;
17
136
  }
18
137
  const iframeRect = iframeRef.current.getBoundingClientRect();
@@ -24,7 +143,8 @@ const InputPopover = ({ documentResponse })=>{
24
143
  left: iframeRect.left + 'px',
25
144
  width: iframeRect.width + 'px',
26
145
  height: iframeRect.height + 'px',
27
- zIndex: 4
146
+ zIndex: 4,
147
+ onClick: ()=>iframeRef.current?.focus()
28
148
  }),
29
149
  /*#__PURE__*/ jsxRuntime.jsx(InputPopoverProvider, {
30
150
  children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Popover.Root, {
@@ -48,10 +168,11 @@ const InputPopover = ({ documentResponse })=>{
48
168
  width: "400px",
49
169
  children: /*#__PURE__*/ jsxRuntime.jsx(InputRenderer.InputRenderer, {
50
170
  document: documentResponse,
51
- attribute: documentResponse.schema.attributes[popoverField.path],
171
+ attribute: popoverField.attribute,
172
+ // TODO: retrieve the proper label from the layout
52
173
  label: popoverField.path,
53
174
  name: popoverField.path,
54
- type: documentResponse.schema.attributes[popoverField.path].type,
175
+ type: popoverField.attribute.type,
55
176
  visible: true
56
177
  })
57
178
  })
@@ -62,11 +183,6 @@ const InputPopover = ({ documentResponse })=>{
62
183
  ]
63
184
  });
64
185
  };
65
- function useHasInputPopoverParent() {
66
- const context = useInputPopoverContext('useHasInputPopoverParent', ()=>true, false);
67
- // useContext will return undefined if the called is not wrapped in the provider
68
- return context !== undefined;
69
- }
70
186
 
71
187
  exports.InputPopover = InputPopover;
72
188
  exports.useHasInputPopoverParent = useHasInputPopoverParent;
@@ -1 +1 @@
1
- {"version":3,"file":"InputPopover.js","sources":["../../../../admin/src/preview/components/InputPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext } from '@strapi/admin/strapi-admin';\nimport { Box, Popover } from '@strapi/design-system';\n\nimport { type UseDocument } from '../../hooks/useDocument';\nimport { InputRenderer } from '../../pages/EditView/components/InputRenderer';\nimport { usePreviewContext } from '../pages/Preview';\n\n/**\n * No need for actual data in the context. It's just to let children check if they're rendered\n * inside of a preview InputPopover without relying on prop drilling.\n */\ninterface InputPopoverContextValue {}\n\nconst [InputPopoverProvider, useInputPopoverContext] =\n createContext<InputPopoverContextValue>('InputPopover');\n\nconst InputPopover = ({ documentResponse }: { documentResponse: ReturnType<UseDocument> }) => {\n const iframeRef = usePreviewContext('VisualEditingPopover', (state) => state.iframeRef);\n const popoverField = usePreviewContext('VisualEditingPopover', (state) => state.popoverField);\n const setPopoverField = usePreviewContext(\n 'VisualEditingPopover',\n (state) => state.setPopoverField\n );\n\n if (!popoverField || !documentResponse.schema || !iframeRef.current) {\n return null;\n }\n\n const iframeRect = iframeRef.current.getBoundingClientRect();\n\n return (\n <>\n {/**\n * Overlay an empty div on top of the iframe while the popover is open so it can\n * intercept clicks. Without it, we wouldn't be able to close the popover by clicking outside,\n * because the click would be detected by the iframe window, not by the admin.\n **/}\n <Box\n position={'fixed'}\n top={iframeRect.top + 'px'}\n left={iframeRect.left + 'px'}\n width={iframeRect.width + 'px'}\n height={iframeRect.height + 'px'}\n zIndex={4}\n />\n <InputPopoverProvider>\n <Popover.Root open={true} onOpenChange={(open) => !open && setPopoverField(null)}>\n <Popover.Trigger>\n <Box\n position=\"fixed\"\n width={popoverField.position.width + 'px'}\n height={popoverField.position.height + 'px'}\n top={0}\n left={0}\n transform={`translate(${iframeRect.left + popoverField.position.left}px, ${iframeRect.top + popoverField.position.top}px)`}\n />\n </Popover.Trigger>\n <Popover.Content sideOffset={4}>\n <Box padding={4} width=\"400px\">\n <InputRenderer\n document={documentResponse}\n attribute={documentResponse.schema.attributes[popoverField.path] as any}\n label={popoverField.path}\n name={popoverField.path}\n type={documentResponse.schema.attributes[popoverField.path].type}\n visible={true}\n />\n </Box>\n </Popover.Content>\n </Popover.Root>\n </InputPopoverProvider>\n </>\n );\n};\n\nfunction useHasInputPopoverParent() {\n const context = useInputPopoverContext('useHasInputPopoverParent', () => true, false);\n\n // useContext will return undefined if the called is not wrapped in the provider\n return context !== undefined;\n}\n\nexport { InputPopover, useHasInputPopoverParent };\n"],"names":["InputPopoverProvider","useInputPopoverContext","createContext","InputPopover","documentResponse","iframeRef","usePreviewContext","state","popoverField","setPopoverField","schema","current","iframeRect","getBoundingClientRect","_jsxs","_Fragment","_jsx","Box","position","top","left","width","height","zIndex","Popover","Root","open","onOpenChange","Trigger","transform","Content","sideOffset","padding","InputRenderer","document","attribute","attributes","path","label","name","type","visible","useHasInputPopoverParent","context","undefined"],"mappings":"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"}
1
+ {"version":3,"file":"InputPopover.js","sources":["../../../../admin/src/preview/components/InputPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, useNotification } from '@strapi/admin/strapi-admin';\nimport { Box, Popover } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { type UseDocument } from '../../hooks/useDocument';\nimport { InputRenderer } from '../../pages/EditView/components/InputRenderer';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS, PREVIEW_ERROR_MESSAGES } from '../utils/constants';\nimport {\n parseFieldMetaData,\n getAttributeSchemaFromPath,\n PreviewFieldError,\n} from '../utils/fieldUtils';\n\n/* -------------------------------------------------------------------------------------------------\n * Context utils\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * No need for actual data in the context. It's just to let children check if they're rendered\n * inside of a preview InputPopover without relying on prop drilling.\n */\ninterface InputPopoverContextValue {}\n\nconst [InputPopoverProvider, useInputPopoverContext] =\n createContext<InputPopoverContextValue>('InputPopover');\n\nfunction useHasInputPopoverParent() {\n const context = useInputPopoverContext('useHasInputPopoverParent', () => true, false);\n\n // useContext will return undefined if the called is not wrapped in the provider\n return context !== undefined;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * InputPopover\n * -----------------------------------------------------------------------------------------------*/\n\nconst InputPopover = ({ documentResponse }: { documentResponse: ReturnType<UseDocument> }) => {\n const iframeRef = usePreviewContext('InputPopover', (state) => state.iframeRef);\n const popoverField = usePreviewContext('InputPopover', (state) => state.popoverField);\n const setPopoverField = usePreviewContext('InputPopover', (state) => state.setPopoverField);\n const document = usePreviewContext('InputPopover', (state) => state.document);\n const schema = usePreviewContext('InputPopover', (state) => state.schema);\n const components = usePreviewContext('InputPopover', (state) => state.components);\n\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n\n React.useEffect(() => {\n /**\n * We receive window events sent from the user's preview via the injected script.\n * We listen to the ones here that target a specific field.\n */\n const handleMessage = (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {\n const fieldMetaData = parseFieldMetaData(event.data.payload.path);\n\n if (!fieldMetaData) {\n const { type, message } = PREVIEW_ERROR_MESSAGES.INCOMPLETE_STRAPI_SOURCE;\n toggleNotification({ type, message: formatMessage(message) });\n return;\n }\n\n /**\n * Ignore (for now) content that comes from separate API requests than the one for the\n * current document. This doesn't do anything about fields that may come from relations to\n * the current document however.\n */\n if (fieldMetaData.documentId !== document.documentId) {\n const { type, message } = PREVIEW_ERROR_MESSAGES.DIFFERENT_DOCUMENT;\n toggleNotification({ type, message: formatMessage(message) });\n return;\n }\n\n try {\n const attribute = getAttributeSchemaFromPath({\n path: fieldMetaData.path,\n components,\n schema,\n document,\n });\n\n // We're able to handle the field, set it in context so the popover can pick it up\n setPopoverField({ ...fieldMetaData, position: event.data.payload.position, attribute });\n } catch (error) {\n if (error instanceof PreviewFieldError) {\n const { type, message } = PREVIEW_ERROR_MESSAGES[error.messageKey];\n toggleNotification({ type, message: formatMessage(message) });\n } else if (error instanceof Error) {\n toggleNotification({ type: 'danger', message: error.message });\n }\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_SINGLE_CLICK_HINT) {\n toggleNotification({\n type: 'info',\n message: formatMessage({\n id: 'content-manager.preview.info.single-click-hint',\n defaultMessage: 'Double click to edit',\n }),\n });\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [components, document, iframeRef, schema, setPopoverField, toggleNotification, formatMessage]);\n if (!popoverField || !iframeRef.current) {\n return null;\n }\n\n const iframeRect = iframeRef.current.getBoundingClientRect();\n\n return (\n <>\n {/**\n * Overlay an empty div on top of the iframe while the popover is open so it can\n * intercept clicks. Without it, we wouldn't be able to close the popover by clicking outside,\n * because the click would be detected by the iframe window, not by the admin.\n **/}\n <Box\n position={'fixed'}\n top={iframeRect.top + 'px'}\n left={iframeRect.left + 'px'}\n width={iframeRect.width + 'px'}\n height={iframeRect.height + 'px'}\n zIndex={4}\n onClick={() => iframeRef.current?.focus()}\n />\n <InputPopoverProvider>\n <Popover.Root open={true} onOpenChange={(open) => !open && setPopoverField(null)}>\n <Popover.Trigger>\n <Box\n position=\"fixed\"\n width={popoverField.position.width + 'px'}\n height={popoverField.position.height + 'px'}\n top={0}\n left={0}\n transform={`translate(${iframeRect.left + popoverField.position.left}px, ${iframeRect.top + popoverField.position.top}px)`}\n />\n </Popover.Trigger>\n <Popover.Content sideOffset={4}>\n <Box padding={4} width=\"400px\">\n {/* @ts-expect-error the types of `attribute` clash for some reason */}\n <InputRenderer\n document={documentResponse}\n attribute={popoverField.attribute}\n // TODO: retrieve the proper label from the layout\n label={popoverField.path}\n name={popoverField.path}\n type={popoverField.attribute.type}\n visible={true}\n />\n </Box>\n </Popover.Content>\n </Popover.Root>\n </InputPopoverProvider>\n </>\n );\n};\n\nexport { InputPopover, useHasInputPopoverParent };\n"],"names":["InputPopoverProvider","useInputPopoverContext","createContext","useHasInputPopoverParent","context","undefined","InputPopover","documentResponse","iframeRef","usePreviewContext","state","popoverField","setPopoverField","document","schema","components","toggleNotification","useNotification","formatMessage","useIntl","React","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS_INTENT","fieldMetaData","parseFieldMetaData","payload","path","message","PREVIEW_ERROR_MESSAGES","INCOMPLETE_STRAPI_SOURCE","documentId","DIFFERENT_DOCUMENT","attribute","getAttributeSchemaFromPath","position","error","PreviewFieldError","messageKey","Error","STRAPI_FIELD_SINGLE_CLICK_HINT","id","defaultMessage","window","addEventListener","removeEventListener","iframeRect","getBoundingClientRect","_jsxs","_Fragment","_jsx","Box","top","left","width","height","zIndex","onClick","focus","Popover","Root","open","onOpenChange","Trigger","transform","Content","sideOffset","padding","InputRenderer","label","name","visible"],"mappings":"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"}