@strapi/content-manager 5.45.1 → 5.46.1

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 (145) hide show
  1. package/dist/admin/constants/hooks.js +5 -0
  2. package/dist/admin/constants/hooks.js.map +1 -1
  3. package/dist/admin/constants/hooks.mjs +5 -0
  4. package/dist/admin/constants/hooks.mjs.map +1 -1
  5. package/dist/admin/content-manager.js +26 -2
  6. package/dist/admin/content-manager.js.map +1 -1
  7. package/dist/admin/content-manager.mjs +26 -2
  8. package/dist/admin/content-manager.mjs.map +1 -1
  9. package/dist/admin/history/components/VersionInputRenderer.js +1 -1
  10. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  11. package/dist/admin/history/components/VersionInputRenderer.mjs +1 -1
  12. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
  13. package/dist/admin/hooks/usePersistentQueryParams.js +4 -1
  14. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  15. package/dist/admin/hooks/usePersistentQueryParams.mjs +4 -1
  16. package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
  17. package/dist/admin/pages/ComponentConfigurationPage.js +2 -45
  18. package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
  19. package/dist/admin/pages/ComponentConfigurationPage.mjs +3 -46
  20. package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +21 -4
  22. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs +19 -2
  24. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs +1 -1
  26. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +9 -6
  27. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  28. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +10 -7
  29. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  30. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +1 -34
  31. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  32. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +3 -35
  33. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  34. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +33 -18
  35. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  36. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +34 -19
  37. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  38. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.js +22 -0
  39. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.js.map +1 -0
  40. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.mjs +20 -0
  41. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.mjs.map +1 -0
  42. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +15 -4
  43. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  44. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +16 -5
  45. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  46. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +26 -4
  47. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  48. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +26 -4
  49. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  50. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +31 -0
  51. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  52. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +31 -0
  53. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  54. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +11 -3
  55. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  56. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +11 -3
  57. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
  58. package/dist/admin/pages/ListView/ListViewPage.js +1 -0
  59. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  60. package/dist/admin/pages/ListView/ListViewPage.mjs +1 -0
  61. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  62. package/dist/admin/pages/ListView/components/Filters.js +38 -4
  63. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  64. package/dist/admin/pages/ListView/components/Filters.mjs +39 -5
  65. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  66. package/dist/admin/pages/formatComponentConfigurationEditLayout.js +58 -0
  67. package/dist/admin/pages/formatComponentConfigurationEditLayout.js.map +1 -0
  68. package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs +56 -0
  69. package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs.map +1 -0
  70. package/dist/admin/preview/components/InputPopover.js +3 -0
  71. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  72. package/dist/admin/preview/components/InputPopover.mjs +3 -0
  73. package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
  74. package/dist/admin/preview/hooks/usePreviewInputManager.js +24 -0
  75. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
  76. package/dist/admin/preview/hooks/usePreviewInputManager.mjs +24 -0
  77. package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -1
  78. package/dist/admin/preview/utils/previewScript.js +616 -78
  79. package/dist/admin/preview/utils/previewScript.js.map +1 -1
  80. package/dist/admin/preview/utils/previewScript.mjs +616 -78
  81. package/dist/admin/preview/utils/previewScript.mjs.map +1 -1
  82. package/dist/admin/src/constants/hooks.d.ts +23 -0
  83. package/dist/admin/src/content-manager.d.ts +26 -0
  84. package/dist/admin/src/exports.d.ts +2 -0
  85. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +14 -8
  86. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.d.ts +3 -0
  87. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCard.d.ts +1 -1
  88. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +11 -1
  89. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +9 -5
  90. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +4 -2
  91. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +38 -6
  92. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +27 -5
  93. package/dist/admin/src/pages/ListView/components/Filters.d.ts +3 -4
  94. package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +15 -0
  95. package/dist/admin/translations/cs.json.js +0 -1
  96. package/dist/admin/translations/cs.json.js.map +1 -1
  97. package/dist/admin/translations/cs.json.mjs +0 -1
  98. package/dist/admin/translations/cs.json.mjs.map +1 -1
  99. package/dist/admin/translations/de.json.js +0 -1
  100. package/dist/admin/translations/de.json.js.map +1 -1
  101. package/dist/admin/translations/de.json.mjs +0 -1
  102. package/dist/admin/translations/de.json.mjs.map +1 -1
  103. package/dist/admin/translations/en.json.js +0 -1
  104. package/dist/admin/translations/en.json.js.map +1 -1
  105. package/dist/admin/translations/en.json.mjs +0 -1
  106. package/dist/admin/translations/en.json.mjs.map +1 -1
  107. package/dist/admin/translations/es.json.js +0 -1
  108. package/dist/admin/translations/es.json.js.map +1 -1
  109. package/dist/admin/translations/es.json.mjs +0 -1
  110. package/dist/admin/translations/es.json.mjs.map +1 -1
  111. package/dist/admin/translations/fr.json.js +0 -1
  112. package/dist/admin/translations/fr.json.js.map +1 -1
  113. package/dist/admin/translations/fr.json.mjs +0 -1
  114. package/dist/admin/translations/fr.json.mjs.map +1 -1
  115. package/dist/admin/translations/nl.json.js +0 -1
  116. package/dist/admin/translations/nl.json.js.map +1 -1
  117. package/dist/admin/translations/nl.json.mjs +0 -1
  118. package/dist/admin/translations/nl.json.mjs.map +1 -1
  119. package/dist/admin/translations/pl.json.js +0 -1
  120. package/dist/admin/translations/pl.json.js.map +1 -1
  121. package/dist/admin/translations/pl.json.mjs +0 -1
  122. package/dist/admin/translations/pl.json.mjs.map +1 -1
  123. package/dist/admin/translations/ru.json.js +0 -1
  124. package/dist/admin/translations/ru.json.js.map +1 -1
  125. package/dist/admin/translations/ru.json.mjs +0 -1
  126. package/dist/admin/translations/ru.json.mjs.map +1 -1
  127. package/dist/admin/translations/uk.json.js +0 -1
  128. package/dist/admin/translations/uk.json.js.map +1 -1
  129. package/dist/admin/translations/uk.json.mjs +0 -1
  130. package/dist/admin/translations/uk.json.mjs.map +1 -1
  131. package/dist/admin/translations/zh-Hans.json.js +0 -1
  132. package/dist/admin/translations/zh-Hans.json.js.map +1 -1
  133. package/dist/admin/translations/zh-Hans.json.mjs +0 -1
  134. package/dist/admin/translations/zh-Hans.json.mjs.map +1 -1
  135. package/dist/server/homepage/services/homepage.js +12 -8
  136. package/dist/server/homepage/services/homepage.js.map +1 -1
  137. package/dist/server/homepage/services/homepage.mjs +12 -8
  138. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  139. package/dist/server/services/metrics.js +1 -5
  140. package/dist/server/services/metrics.js.map +1 -1
  141. package/dist/server/services/metrics.mjs +1 -5
  142. package/dist/server/services/metrics.mjs.map +1 -1
  143. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  144. package/dist/server/src/services/metrics.d.ts.map +1 -1
  145. package/package.json +7 -7
@@ -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 { getTranslation } from '../../../utils/translations';\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 children: React.ReactNode;\n}\n\nconst Root = ({ disabled, schema, children }: 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 ...(options?.draftAndPublish === true ? ['__status'] : []),\n ]\n .map((name) => {\n if (name === '__status') {\n return {\n name: '__status',\n type: 'enumeration',\n label: formatMessage({\n id: getTranslation('containers.list.filters.status'),\n defaultMessage: 'Status',\n }),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n ],\n options: [\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.draft'),\n defaultMessage: 'Draft (never published)',\n }),\n value: 'draft',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.published'),\n defaultMessage: 'Published (all)',\n }),\n value: 'published',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.publishedModified'),\n defaultMessage: 'Published (modified)',\n }),\n value: 'published-modified',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.publishedUnmodified'),\n defaultMessage: 'Published (unmodified)',\n }),\n value: 'published-unmodified',\n },\n ],\n } satisfies Filters.Filter;\n }\n\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 type: attribute.type as Filters.Filter['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 {children}\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\nconst listViewFilters = {\n Root,\n Trigger: Filters.Trigger,\n Popover: Filters.Popover,\n List: Filters.List,\n};\n\nexport { listViewFilters };\nexport type { FiltersProps };\n"],"names":["NOT_ALLOWED_FILTERS","DEFAULT_ALLOWED_FILTERS","USER_FILTER_ATTRIBUTES","CREATOR_FIELDS","Root","disabled","schema","children","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","draftAndPublish","map","name","label","getTranslation","defaultMessage","operators","mainField","mainFieldName","list","getMainField","components","input","AdminUsersFilter","user","getDisplayName","toString","enum","Boolean","toSorted","a","b","compare","onOpenChange","isOpen","handleFilterChange","useRelation","_jsx","Filters","onChange","pageSize","setPageSize","useState","search","setSearch","debouncedSearch","useDebounce","_q","useField","handleOpenChange","pagination","pageCount","page","Combobox","aria-label","loading","onLoadMore","hasMoreItems","onInputChange","e","currentTarget","ComboboxOption","listViewFilters","Trigger","Popover","List"],"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 useStrapiApp,\n} from '@strapi/admin/strapi-admin';\nimport { Combobox, ComboboxOption, useCollator } from '@strapi/design-system';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport { CREATOR_FIELDS } from '../../../constants/attributes';\nimport { HOOKS } from '../../../constants/hooks';\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 { getTranslation } from '../../../utils/translations';\nimport { getDisplayName } from '../../../utils/users';\n\nimport type { InjectableListViewFilter } from '../../../constants/hooks';\nimport type { ListLayout } from '../../../hooks/useDocumentLayout';\n\nconst { INJECT_LIST_VIEW_FILTERS } = HOOKS;\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 layout: ListLayout;\n children: React.ReactNode;\n}\n\nconst Root = ({ disabled, schema, layout, children }: 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 const runHookWaterfall = useStrapiApp('FiltersImpl', ({ runHookWaterfall }) => runHookWaterfall);\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 const baseFilters = [\n 'id',\n 'documentId',\n ...allowedFields,\n ...DEFAULT_ALLOWED_FILTERS,\n ...(canReadAdminUsers ? CREATOR_FIELDS : []),\n ...(options?.draftAndPublish === true ? ['__status'] : []),\n ]\n .map((name) => {\n if (name === '__status') {\n return {\n name: '__status',\n type: 'enumeration',\n label: formatMessage({\n id: getTranslation('containers.list.filters.status'),\n defaultMessage: 'Status',\n }),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n ],\n options: [\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.draft'),\n defaultMessage: 'Draft (never published)',\n }),\n value: 'draft',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.published'),\n defaultMessage: 'Published (all)',\n }),\n value: 'published',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.publishedModified'),\n defaultMessage: 'Published (modified)',\n }),\n value: 'published-modified',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.publishedUnmodified'),\n defaultMessage: 'Published (unmodified)',\n }),\n value: 'published-unmodified',\n },\n ],\n } satisfies Filters.Filter;\n }\n\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 type: attribute.type as Filters.Filter['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\n // Let plugins inject their own filters.\n // `layout.options` is a merge of schema/pluginOptions/contentType options —\n // mirrors the column-injection hook contract.\n const { displayedFilters: extendedFilters } = runHookWaterfall(INJECT_LIST_VIEW_FILTERS, {\n displayedFilters: baseFilters as InjectableListViewFilter[],\n layout,\n });\n\n const resolveLabel = (label: string | MessageDescriptor): string =>\n typeof label === 'string' ? label : formatMessage(label);\n\n const userOptions = users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n }));\n\n const formatted = extendedFilters.map<Filters.Filter>((filter) => {\n const next: Filters.Filter = {\n ...filter,\n label: resolveLabel(filter.label),\n operators: filter.operators?.map((op) => ({ ...op, label: resolveLabel(op.label) })),\n };\n\n // User-typed filters need user options so the chip can render the display name instead of the id.\n if (USER_FILTER_ATTRIBUTES.includes(filter.name) && !next.options?.length) {\n next.options = userOptions;\n }\n\n return next;\n });\n\n return formatted.toSorted((a, b) => formatter.compare(a.label, b.label));\n }, [\n allPermissions,\n canReadAdminUsers,\n model,\n attributes,\n metadata,\n schemas,\n layout,\n users,\n formatMessage,\n formatter,\n options?.draftAndPublish,\n runHookWaterfall,\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 {children}\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\nconst listViewFilters = {\n Root,\n Trigger: Filters.Trigger,\n Popover: Filters.Popover,\n List: Filters.List,\n};\n\nexport { listViewFilters };\nexport type { FiltersProps };\n"],"names":["INJECT_LIST_VIEW_FILTERS","HOOKS","NOT_ALLOWED_FILTERS","DEFAULT_ALLOWED_FILTERS","USER_FILTER_ATTRIBUTES","CREATOR_FIELDS","Root","disabled","schema","layout","children","attributes","uid","model","options","formatMessage","locale","useIntl","trackUsage","useTracking","allPermissions","useAuth","state","permissions","query","useQueryParams","schemas","useContentTypeSchema","runHookWaterfall","useStrapiApp","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","baseFilters","draftAndPublish","map","name","label","getTranslation","defaultMessage","operators","mainField","mainFieldName","list","getMainField","components","input","AdminUsersFilter","user","getDisplayName","toString","enum","Boolean","extendedFilters","resolveLabel","userOptions","formatted","next","op","toSorted","a","b","compare","onOpenChange","isOpen","handleFilterChange","useRelation","_jsx","Filters","onChange","pageSize","setPageSize","useState","search","setSearch","debouncedSearch","useDebounce","_q","useField","handleOpenChange","pagination","pageCount","page","Combobox","aria-label","loading","onLoadMore","hasMoreItems","onInputChange","e","currentTarget","ComboboxOption","listViewFilters","Trigger","Popover","List"],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+
3
+ var useDocumentLayout = require('../hooks/useDocumentLayout.js');
4
+
5
+ /**
6
+ * Formats API configuration + schemas into the shape expected by the component
7
+ * "Configure the view" form. Matches the ListView / content-type path: nested
8
+ * `convertEditLayoutToFieldLayouts` calls must receive component configuration
9
+ * and full component schemas so `getMainField` can resolve fields inside nested
10
+ * component attributes (see #25509).
11
+ */ const formatComponentConfigurationEditLayout = (data, { schema, components })=>{
12
+ const editAttributes = useDocumentLayout.convertEditLayoutToFieldLayouts(data.component.layouts.edit, schema?.attributes, data.component.metadatas, {
13
+ configurations: data.components,
14
+ schemas: components
15
+ });
16
+ const componentEditAttributes = Object.entries(data.components).reduce((acc, [uid, configuration])=>{
17
+ const componentSchema = components[uid];
18
+ if (!componentSchema) {
19
+ return acc;
20
+ }
21
+ acc[uid] = {
22
+ layout: useDocumentLayout.convertEditLayoutToFieldLayouts(configuration.layouts.edit, componentSchema.attributes, configuration.metadatas, {
23
+ configurations: data.components,
24
+ schemas: components
25
+ }),
26
+ settings: {
27
+ ...configuration.settings,
28
+ icon: componentSchema.info.icon,
29
+ displayName: componentSchema.info.displayName
30
+ }
31
+ };
32
+ return acc;
33
+ }, {});
34
+ const editMetadatas = Object.entries(data.component.metadatas).reduce((acc, [attribute, metadata])=>{
35
+ return {
36
+ ...acc,
37
+ [attribute]: metadata.edit
38
+ };
39
+ }, {});
40
+ return {
41
+ layout: [
42
+ editAttributes
43
+ ],
44
+ components: componentEditAttributes,
45
+ metadatas: editMetadatas,
46
+ options: {
47
+ ...schema?.options,
48
+ ...schema?.pluginOptions
49
+ },
50
+ settings: {
51
+ ...data.component.settings,
52
+ displayName: schema?.info.displayName
53
+ }
54
+ };
55
+ };
56
+
57
+ exports.formatComponentConfigurationEditLayout = formatComponentConfigurationEditLayout;
58
+ //# sourceMappingURL=formatComponentConfigurationEditLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatComponentConfigurationEditLayout.js","sources":["../../../admin/src/pages/formatComponentConfigurationEditLayout.ts"],"sourcesContent":["import { ComponentsDictionary } from '../hooks/useContentTypeSchema';\nimport { EditLayout, convertEditLayoutToFieldLayouts } from '../hooks/useDocumentLayout';\n\nimport type { Component, FindComponentConfiguration } from '../../../shared/contracts/components';\n\n/**\n * Formats API configuration + schemas into the shape expected by the component\n * \"Configure the view\" form. Matches the ListView / content-type path: nested\n * `convertEditLayoutToFieldLayouts` calls must receive component configuration\n * and full component schemas so `getMainField` can resolve fields inside nested\n * component attributes (see #25509).\n */\nconst formatComponentConfigurationEditLayout = (\n data: FindComponentConfiguration.Response['data'],\n { schema, components }: { schema?: Component; components: ComponentsDictionary }\n): EditLayout => {\n const editAttributes = convertEditLayoutToFieldLayouts(\n data.component.layouts.edit,\n schema?.attributes,\n data.component.metadatas,\n { configurations: data.components, schemas: components }\n );\n\n const componentEditAttributes = Object.entries(data.components).reduce<EditLayout['components']>(\n (acc, [uid, configuration]) => {\n const componentSchema = components[uid];\n if (!componentSchema) {\n return acc;\n }\n\n acc[uid] = {\n layout: convertEditLayoutToFieldLayouts(\n configuration.layouts.edit,\n componentSchema.attributes,\n configuration.metadatas,\n { configurations: data.components, schemas: components }\n ),\n settings: {\n ...configuration.settings,\n icon: componentSchema.info.icon,\n displayName: componentSchema.info.displayName,\n },\n };\n return acc;\n },\n {}\n );\n\n const editMetadatas = Object.entries(data.component.metadatas).reduce<EditLayout['metadatas']>(\n (acc, [attribute, metadata]) => {\n return {\n ...acc,\n [attribute]: metadata.edit,\n };\n },\n {}\n );\n\n return {\n layout: [editAttributes],\n components: componentEditAttributes,\n metadatas: editMetadatas,\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n },\n settings: {\n ...data.component.settings,\n displayName: schema?.info.displayName,\n },\n };\n};\n\nexport { formatComponentConfigurationEditLayout };\n"],"names":["formatComponentConfigurationEditLayout","data","schema","components","editAttributes","convertEditLayoutToFieldLayouts","component","layouts","edit","attributes","metadatas","configurations","schemas","componentEditAttributes","Object","entries","reduce","acc","uid","configuration","componentSchema","layout","settings","icon","info","displayName","editMetadatas","attribute","metadata","options","pluginOptions"],"mappings":";;;;AAKA;;;;;;IAOA,MAAMA,yCAAyC,CAC7CC,IAAAA,EACA,EAAEC,MAAM,EAAEC,UAAU,EAA4D,GAAA;AAEhF,IAAA,MAAMC,cAAAA,GAAiBC,iDAAAA,CACrBJ,IAAAA,CAAKK,SAAS,CAACC,OAAO,CAACC,IAAI,EAC3BN,QAAQO,UAAAA,EACRR,IAAAA,CAAKK,SAAS,CAACI,SAAS,EACxB;AAAEC,QAAAA,cAAAA,EAAgBV,KAAKE,UAAU;QAAES,OAAAA,EAAST;AAAW,KAAA,CAAA;AAGzD,IAAA,MAAMU,uBAAAA,GAA0BC,MAAAA,CAAOC,OAAO,CAACd,IAAAA,CAAKE,UAAU,CAAA,CAAEa,MAAM,CACpE,CAACC,GAAAA,EAAK,CAACC,KAAKC,aAAAA,CAAc,GAAA;QACxB,MAAMC,eAAAA,GAAkBjB,UAAU,CAACe,GAAAA,CAAI;AACvC,QAAA,IAAI,CAACE,eAAAA,EAAiB;YACpB,OAAOH,GAAAA;AACT,QAAA;QAEAA,GAAG,CAACC,IAAI,GAAG;YACTG,MAAAA,EAAQhB,iDAAAA,CACNc,aAAAA,CAAcZ,OAAO,CAACC,IAAI,EAC1BY,eAAAA,CAAgBX,UAAU,EAC1BU,aAAAA,CAAcT,SAAS,EACvB;AAAEC,gBAAAA,cAAAA,EAAgBV,KAAKE,UAAU;gBAAES,OAAAA,EAAST;AAAW,aAAA,CAAA;YAEzDmB,QAAAA,EAAU;AACR,gBAAA,GAAGH,cAAcG,QAAQ;gBACzBC,IAAAA,EAAMH,eAAAA,CAAgBI,IAAI,CAACD,IAAI;gBAC/BE,WAAAA,EAAaL,eAAAA,CAAgBI,IAAI,CAACC;AACpC;AACF,SAAA;QACA,OAAOR,GAAAA;AACT,IAAA,CAAA,EACA,EAAC,CAAA;AAGH,IAAA,MAAMS,aAAAA,GAAgBZ,MAAAA,CAAOC,OAAO,CAACd,KAAKK,SAAS,CAACI,SAAS,CAAA,CAAEM,MAAM,CACnE,CAACC,GAAAA,EAAK,CAACU,WAAWC,QAAAA,CAAS,GAAA;QACzB,OAAO;AACL,YAAA,GAAGX,GAAG;YACN,CAACU,SAAAA,GAAYC,QAAAA,CAASpB;AACxB,SAAA;AACF,IAAA,CAAA,EACA,EAAC,CAAA;IAGH,OAAO;QACLa,MAAAA,EAAQ;AAACjB,YAAAA;AAAe,SAAA;QACxBD,UAAAA,EAAYU,uBAAAA;QACZH,SAAAA,EAAWgB,aAAAA;QACXG,OAAAA,EAAS;AACP,YAAA,GAAG3B,QAAQ2B,OAAO;AAClB,YAAA,GAAG3B,QAAQ4B;AACb,SAAA;QACAR,QAAAA,EAAU;YACR,GAAGrB,IAAAA,CAAKK,SAAS,CAACgB,QAAQ;AAC1BG,YAAAA,WAAAA,EAAavB,QAAQsB,IAAAA,CAAKC;AAC5B;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,56 @@
1
+ import { convertEditLayoutToFieldLayouts } from '../hooks/useDocumentLayout.mjs';
2
+
3
+ /**
4
+ * Formats API configuration + schemas into the shape expected by the component
5
+ * "Configure the view" form. Matches the ListView / content-type path: nested
6
+ * `convertEditLayoutToFieldLayouts` calls must receive component configuration
7
+ * and full component schemas so `getMainField` can resolve fields inside nested
8
+ * component attributes (see #25509).
9
+ */ const formatComponentConfigurationEditLayout = (data, { schema, components })=>{
10
+ const editAttributes = convertEditLayoutToFieldLayouts(data.component.layouts.edit, schema?.attributes, data.component.metadatas, {
11
+ configurations: data.components,
12
+ schemas: components
13
+ });
14
+ const componentEditAttributes = Object.entries(data.components).reduce((acc, [uid, configuration])=>{
15
+ const componentSchema = components[uid];
16
+ if (!componentSchema) {
17
+ return acc;
18
+ }
19
+ acc[uid] = {
20
+ layout: convertEditLayoutToFieldLayouts(configuration.layouts.edit, componentSchema.attributes, configuration.metadatas, {
21
+ configurations: data.components,
22
+ schemas: components
23
+ }),
24
+ settings: {
25
+ ...configuration.settings,
26
+ icon: componentSchema.info.icon,
27
+ displayName: componentSchema.info.displayName
28
+ }
29
+ };
30
+ return acc;
31
+ }, {});
32
+ const editMetadatas = Object.entries(data.component.metadatas).reduce((acc, [attribute, metadata])=>{
33
+ return {
34
+ ...acc,
35
+ [attribute]: metadata.edit
36
+ };
37
+ }, {});
38
+ return {
39
+ layout: [
40
+ editAttributes
41
+ ],
42
+ components: componentEditAttributes,
43
+ metadatas: editMetadatas,
44
+ options: {
45
+ ...schema?.options,
46
+ ...schema?.pluginOptions
47
+ },
48
+ settings: {
49
+ ...data.component.settings,
50
+ displayName: schema?.info.displayName
51
+ }
52
+ };
53
+ };
54
+
55
+ export { formatComponentConfigurationEditLayout };
56
+ //# sourceMappingURL=formatComponentConfigurationEditLayout.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatComponentConfigurationEditLayout.mjs","sources":["../../../admin/src/pages/formatComponentConfigurationEditLayout.ts"],"sourcesContent":["import { ComponentsDictionary } from '../hooks/useContentTypeSchema';\nimport { EditLayout, convertEditLayoutToFieldLayouts } from '../hooks/useDocumentLayout';\n\nimport type { Component, FindComponentConfiguration } from '../../../shared/contracts/components';\n\n/**\n * Formats API configuration + schemas into the shape expected by the component\n * \"Configure the view\" form. Matches the ListView / content-type path: nested\n * `convertEditLayoutToFieldLayouts` calls must receive component configuration\n * and full component schemas so `getMainField` can resolve fields inside nested\n * component attributes (see #25509).\n */\nconst formatComponentConfigurationEditLayout = (\n data: FindComponentConfiguration.Response['data'],\n { schema, components }: { schema?: Component; components: ComponentsDictionary }\n): EditLayout => {\n const editAttributes = convertEditLayoutToFieldLayouts(\n data.component.layouts.edit,\n schema?.attributes,\n data.component.metadatas,\n { configurations: data.components, schemas: components }\n );\n\n const componentEditAttributes = Object.entries(data.components).reduce<EditLayout['components']>(\n (acc, [uid, configuration]) => {\n const componentSchema = components[uid];\n if (!componentSchema) {\n return acc;\n }\n\n acc[uid] = {\n layout: convertEditLayoutToFieldLayouts(\n configuration.layouts.edit,\n componentSchema.attributes,\n configuration.metadatas,\n { configurations: data.components, schemas: components }\n ),\n settings: {\n ...configuration.settings,\n icon: componentSchema.info.icon,\n displayName: componentSchema.info.displayName,\n },\n };\n return acc;\n },\n {}\n );\n\n const editMetadatas = Object.entries(data.component.metadatas).reduce<EditLayout['metadatas']>(\n (acc, [attribute, metadata]) => {\n return {\n ...acc,\n [attribute]: metadata.edit,\n };\n },\n {}\n );\n\n return {\n layout: [editAttributes],\n components: componentEditAttributes,\n metadatas: editMetadatas,\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n },\n settings: {\n ...data.component.settings,\n displayName: schema?.info.displayName,\n },\n };\n};\n\nexport { formatComponentConfigurationEditLayout };\n"],"names":["formatComponentConfigurationEditLayout","data","schema","components","editAttributes","convertEditLayoutToFieldLayouts","component","layouts","edit","attributes","metadatas","configurations","schemas","componentEditAttributes","Object","entries","reduce","acc","uid","configuration","componentSchema","layout","settings","icon","info","displayName","editMetadatas","attribute","metadata","options","pluginOptions"],"mappings":";;AAKA;;;;;;IAOA,MAAMA,yCAAyC,CAC7CC,IAAAA,EACA,EAAEC,MAAM,EAAEC,UAAU,EAA4D,GAAA;AAEhF,IAAA,MAAMC,cAAAA,GAAiBC,+BAAAA,CACrBJ,IAAAA,CAAKK,SAAS,CAACC,OAAO,CAACC,IAAI,EAC3BN,QAAQO,UAAAA,EACRR,IAAAA,CAAKK,SAAS,CAACI,SAAS,EACxB;AAAEC,QAAAA,cAAAA,EAAgBV,KAAKE,UAAU;QAAES,OAAAA,EAAST;AAAW,KAAA,CAAA;AAGzD,IAAA,MAAMU,uBAAAA,GAA0BC,MAAAA,CAAOC,OAAO,CAACd,IAAAA,CAAKE,UAAU,CAAA,CAAEa,MAAM,CACpE,CAACC,GAAAA,EAAK,CAACC,KAAKC,aAAAA,CAAc,GAAA;QACxB,MAAMC,eAAAA,GAAkBjB,UAAU,CAACe,GAAAA,CAAI;AACvC,QAAA,IAAI,CAACE,eAAAA,EAAiB;YACpB,OAAOH,GAAAA;AACT,QAAA;QAEAA,GAAG,CAACC,IAAI,GAAG;YACTG,MAAAA,EAAQhB,+BAAAA,CACNc,aAAAA,CAAcZ,OAAO,CAACC,IAAI,EAC1BY,eAAAA,CAAgBX,UAAU,EAC1BU,aAAAA,CAAcT,SAAS,EACvB;AAAEC,gBAAAA,cAAAA,EAAgBV,KAAKE,UAAU;gBAAES,OAAAA,EAAST;AAAW,aAAA,CAAA;YAEzDmB,QAAAA,EAAU;AACR,gBAAA,GAAGH,cAAcG,QAAQ;gBACzBC,IAAAA,EAAMH,eAAAA,CAAgBI,IAAI,CAACD,IAAI;gBAC/BE,WAAAA,EAAaL,eAAAA,CAAgBI,IAAI,CAACC;AACpC;AACF,SAAA;QACA,OAAOR,GAAAA;AACT,IAAA,CAAA,EACA,EAAC,CAAA;AAGH,IAAA,MAAMS,aAAAA,GAAgBZ,MAAAA,CAAOC,OAAO,CAACd,KAAKK,SAAS,CAACI,SAAS,CAAA,CAAEM,MAAM,CACnE,CAACC,GAAAA,EAAK,CAACU,WAAWC,QAAAA,CAAS,GAAA;QACzB,OAAO;AACL,YAAA,GAAGX,GAAG;YACN,CAACU,SAAAA,GAAYC,QAAAA,CAASpB;AACxB,SAAA;AACF,IAAA,CAAA,EACA,EAAC,CAAA;IAGH,OAAO;QACLa,MAAAA,EAAQ;AAACjB,YAAAA;AAAe,SAAA;QACxBD,UAAAA,EAAYU,uBAAAA;QACZH,SAAAA,EAAWgB,aAAAA;QACXG,OAAAA,EAAS;AACP,YAAA,GAAG3B,QAAQ2B,OAAO;AAClB,YAAA,GAAG3B,QAAQ4B;AACb,SAAA;QACAR,QAAAA,EAAU;YACR,GAAGrB,IAAAA,CAAKK,SAAS,CAACgB,QAAQ;AAC1BG,YAAAA,WAAAA,EAAavB,QAAQsB,IAAAA,CAAKC;AAC5B;AACF,KAAA;AACF;;;;"}
@@ -163,6 +163,9 @@ function useHasInputPopoverParent() {
163
163
  }),
164
164
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Content, {
165
165
  sideOffset: 4,
166
+ style: {
167
+ zIndex: 5
168
+ },
166
169
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
167
170
  padding: 4,
168
171
  width: "400px",
@@ -1 +1 @@
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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"}
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} style={{ zIndex: 5 }}>\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","style","padding","InputRenderer","label","name","visible"],"mappings":"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"}
@@ -142,6 +142,9 @@ function useHasInputPopoverParent() {
142
142
  }),
143
143
  /*#__PURE__*/ jsx(Popover.Content, {
144
144
  sideOffset: 4,
145
+ style: {
146
+ zIndex: 5
147
+ },
145
148
  children: /*#__PURE__*/ jsx(Box, {
146
149
  padding: 4,
147
150
  width: "400px",
@@ -1 +1 @@
1
- {"version":3,"file":"InputPopover.mjs","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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"}
1
+ {"version":3,"file":"InputPopover.mjs","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} style={{ zIndex: 5 }}>\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","style","padding","InputRenderer","label","name","visible"],"mappings":"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"}
@@ -55,6 +55,30 @@ function usePreviewInputManager(name, attribute) {
55
55
  iframe,
56
56
  type
57
57
  ]);
58
+ // Track previous value to detect media deletion
59
+ const prevValueRef = React__namespace.useRef(value);
60
+ React__namespace.useEffect(()=>{
61
+ // Only run inside popover for media fields
62
+ if (!hasInputPopoverParent || !setPopoverField || type !== 'media') {
63
+ return;
64
+ }
65
+ const currentValue = value;
66
+ const previousValue = prevValueRef.current;
67
+ // Check if we transitioned from having a value to null/empty
68
+ const hadValue = previousValue != null && (Array.isArray(previousValue) ? previousValue.length > 0 : true);
69
+ const hasNoValue = currentValue == null || (Array.isArray(currentValue) ? currentValue.length === 0 : false);
70
+ if (hadValue && hasNoValue) {
71
+ // Media was deleted, close the popover
72
+ setPopoverField(null);
73
+ }
74
+ // Update ref for next comparison
75
+ prevValueRef.current = currentValue;
76
+ }, [
77
+ value,
78
+ hasInputPopoverParent,
79
+ setPopoverField,
80
+ type
81
+ ]);
58
82
  const sendMessage = getSendMessage.getSendMessage(iframe);
59
83
  return {
60
84
  onFocus: ()=>{
@@ -1 +1 @@
1
- {"version":3,"file":"usePreviewInputManager.js","sources":["../../../../admin/src/preview/hooks/usePreviewInputManager.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Schema } from '@strapi/types';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\ntype PreviewInputProps = Pick<\n Required<React.InputHTMLAttributes<HTMLInputElement>>,\n 'onFocus' | 'onBlur'\n>;\n\nexport function usePreviewInputManager(\n name: string,\n attribute: Schema.Attribute.AnyAttribute\n): PreviewInputProps {\n const iframe = usePreviewContext('usePreviewInputManager', (state) => state.iframeRef, false);\n const setPopoverField = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.setPopoverField,\n false\n );\n const hasInputPopoverParent = useHasInputPopoverParent();\n const { value } = useField(name);\n const { type } = attribute;\n\n React.useEffect(() => {\n if (!iframe || !type) {\n return;\n }\n\n /**\n * Only send message if the field is not a data structure (component, dynamic zone)\n * because we already send events for their fields\n */\n if (!['component', 'dynamiczone'].includes(type)) {\n const sendMessage = getSendMessage(iframe);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value });\n }\n }, [name, value, iframe, type]);\n\n const sendMessage = getSendMessage(iframe);\n\n return {\n onFocus: () => {\n if (hasInputPopoverParent) return;\n\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS, { field: name });\n },\n onBlur: () => {\n if (hasInputPopoverParent) return;\n\n setPopoverField?.(null);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_BLUR, { field: name });\n },\n };\n}\n"],"names":["usePreviewInputManager","name","attribute","iframe","usePreviewContext","state","iframeRef","setPopoverField","hasInputPopoverParent","useHasInputPopoverParent","value","useField","type","React","useEffect","includes","sendMessage","getSendMessage","INTERNAL_EVENTS","STRAPI_FIELD_CHANGE","field","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,SAASA,sBAAAA,CACdC,IAAY,EACZC,SAAwC,EAAA;AAExC,IAAA,MAAMC,SAASC,yBAAAA,CAAkB,wBAAA,EAA0B,CAACC,KAAAA,GAAUA,KAAAA,CAAMC,SAAS,EAAE,KAAA,CAAA;AACvF,IAAA,MAAMC,kBAAkBH,yBAAAA,CACtB,wBAAA,EACA,CAACC,KAAAA,GAAUA,KAAAA,CAAME,eAAe,EAChC,KAAA,CAAA;AAEF,IAAA,MAAMC,qBAAAA,GAAwBC,qCAAAA,EAAAA;AAC9B,IAAA,MAAM,EAAEC,KAAK,EAAE,GAAGC,oBAAAA,CAASV,IAAAA,CAAAA;IAC3B,MAAM,EAAEW,IAAI,EAAE,GAAGV,SAAAA;AAEjBW,IAAAA,gBAAAA,CAAMC,SAAS,CAAC,IAAA;QACd,IAAI,CAACX,MAAAA,IAAU,CAACS,IAAAA,EAAM;AACpB,YAAA;AACF,QAAA;AAEA;;;AAGC,QACD,IAAI,CAAC;AAAC,YAAA,WAAA;AAAa,YAAA;SAAc,CAACG,QAAQ,CAACH,IAAAA,CAAAA,EAAO;AAChD,YAAA,MAAMI,cAAcC,6BAAAA,CAAed,MAAAA,CAAAA;YACnCa,WAAAA,CAAYE,yBAAAA,CAAgBC,mBAAmB,EAAE;gBAAEC,KAAAA,EAAOnB,IAAAA;AAAMS,gBAAAA;AAAM,aAAA,CAAA;AACxE,QAAA;IACF,CAAA,EAAG;AAACT,QAAAA,IAAAA;AAAMS,QAAAA,KAAAA;AAAOP,QAAAA,MAAAA;AAAQS,QAAAA;AAAK,KAAA,CAAA;AAE9B,IAAA,MAAMI,cAAcC,6BAAAA,CAAed,MAAAA,CAAAA;IAEnC,OAAO;QACLkB,OAAAA,EAAS,IAAA;AACP,YAAA,IAAIb,qBAAAA,EAAuB;YAE3BQ,WAAAA,CAAYE,yBAAAA,CAAgBI,kBAAkB,EAAE;gBAAEF,KAAAA,EAAOnB;AAAK,aAAA,CAAA;AAChE,QAAA,CAAA;QACAsB,MAAAA,EAAQ,IAAA;AACN,YAAA,IAAIf,qBAAAA,EAAuB;YAE3BD,eAAAA,GAAkB,IAAA,CAAA;YAClBS,WAAAA,CAAYE,yBAAAA,CAAgBM,iBAAiB,EAAE;gBAAEJ,KAAAA,EAAOnB;AAAK,aAAA,CAAA;AAC/D,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"usePreviewInputManager.js","sources":["../../../../admin/src/preview/hooks/usePreviewInputManager.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Schema } from '@strapi/types';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\ntype PreviewInputProps = Pick<\n Required<React.InputHTMLAttributes<HTMLInputElement>>,\n 'onFocus' | 'onBlur'\n>;\n\nexport function usePreviewInputManager(\n name: string,\n attribute: Schema.Attribute.AnyAttribute\n): PreviewInputProps {\n const iframe = usePreviewContext('usePreviewInputManager', (state) => state.iframeRef, false);\n const setPopoverField = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.setPopoverField,\n false\n );\n const hasInputPopoverParent = useHasInputPopoverParent();\n const { value } = useField(name);\n const { type } = attribute;\n\n React.useEffect(() => {\n if (!iframe || !type) {\n return;\n }\n\n /**\n * Only send message if the field is not a data structure (component, dynamic zone)\n * because we already send events for their fields\n */\n if (!['component', 'dynamiczone'].includes(type)) {\n const sendMessage = getSendMessage(iframe);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value });\n }\n }, [name, value, iframe, type]);\n\n // Track previous value to detect media deletion\n const prevValueRef = React.useRef(value);\n\n React.useEffect(() => {\n // Only run inside popover for media fields\n if (!hasInputPopoverParent || !setPopoverField || type !== 'media') {\n return;\n }\n\n const currentValue = value;\n const previousValue = prevValueRef.current;\n\n // Check if we transitioned from having a value to null/empty\n const hadValue =\n previousValue != null && (Array.isArray(previousValue) ? previousValue.length > 0 : true);\n const hasNoValue =\n currentValue == null || (Array.isArray(currentValue) ? currentValue.length === 0 : false);\n\n if (hadValue && hasNoValue) {\n // Media was deleted, close the popover\n setPopoverField(null);\n }\n\n // Update ref for next comparison\n prevValueRef.current = currentValue;\n }, [value, hasInputPopoverParent, setPopoverField, type]);\n\n const sendMessage = getSendMessage(iframe);\n\n return {\n onFocus: () => {\n if (hasInputPopoverParent) return;\n\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS, { field: name });\n },\n onBlur: () => {\n if (hasInputPopoverParent) return;\n\n setPopoverField?.(null);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_BLUR, { field: name });\n },\n };\n}\n"],"names":["usePreviewInputManager","name","attribute","iframe","usePreviewContext","state","iframeRef","setPopoverField","hasInputPopoverParent","useHasInputPopoverParent","value","useField","type","React","useEffect","includes","sendMessage","getSendMessage","INTERNAL_EVENTS","STRAPI_FIELD_CHANGE","field","prevValueRef","useRef","currentValue","previousValue","current","hadValue","Array","isArray","length","hasNoValue","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":"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"}
@@ -34,6 +34,30 @@ function usePreviewInputManager(name, attribute) {
34
34
  iframe,
35
35
  type
36
36
  ]);
37
+ // Track previous value to detect media deletion
38
+ const prevValueRef = React.useRef(value);
39
+ React.useEffect(()=>{
40
+ // Only run inside popover for media fields
41
+ if (!hasInputPopoverParent || !setPopoverField || type !== 'media') {
42
+ return;
43
+ }
44
+ const currentValue = value;
45
+ const previousValue = prevValueRef.current;
46
+ // Check if we transitioned from having a value to null/empty
47
+ const hadValue = previousValue != null && (Array.isArray(previousValue) ? previousValue.length > 0 : true);
48
+ const hasNoValue = currentValue == null || (Array.isArray(currentValue) ? currentValue.length === 0 : false);
49
+ if (hadValue && hasNoValue) {
50
+ // Media was deleted, close the popover
51
+ setPopoverField(null);
52
+ }
53
+ // Update ref for next comparison
54
+ prevValueRef.current = currentValue;
55
+ }, [
56
+ value,
57
+ hasInputPopoverParent,
58
+ setPopoverField,
59
+ type
60
+ ]);
37
61
  const sendMessage = getSendMessage(iframe);
38
62
  return {
39
63
  onFocus: ()=>{
@@ -1 +1 @@
1
- {"version":3,"file":"usePreviewInputManager.mjs","sources":["../../../../admin/src/preview/hooks/usePreviewInputManager.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Schema } from '@strapi/types';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\ntype PreviewInputProps = Pick<\n Required<React.InputHTMLAttributes<HTMLInputElement>>,\n 'onFocus' | 'onBlur'\n>;\n\nexport function usePreviewInputManager(\n name: string,\n attribute: Schema.Attribute.AnyAttribute\n): PreviewInputProps {\n const iframe = usePreviewContext('usePreviewInputManager', (state) => state.iframeRef, false);\n const setPopoverField = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.setPopoverField,\n false\n );\n const hasInputPopoverParent = useHasInputPopoverParent();\n const { value } = useField(name);\n const { type } = attribute;\n\n React.useEffect(() => {\n if (!iframe || !type) {\n return;\n }\n\n /**\n * Only send message if the field is not a data structure (component, dynamic zone)\n * because we already send events for their fields\n */\n if (!['component', 'dynamiczone'].includes(type)) {\n const sendMessage = getSendMessage(iframe);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value });\n }\n }, [name, value, iframe, type]);\n\n const sendMessage = getSendMessage(iframe);\n\n return {\n onFocus: () => {\n if (hasInputPopoverParent) return;\n\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS, { field: name });\n },\n onBlur: () => {\n if (hasInputPopoverParent) return;\n\n setPopoverField?.(null);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_BLUR, { field: name });\n },\n };\n}\n"],"names":["usePreviewInputManager","name","attribute","iframe","usePreviewContext","state","iframeRef","setPopoverField","hasInputPopoverParent","useHasInputPopoverParent","value","useField","type","React","useEffect","includes","sendMessage","getSendMessage","INTERNAL_EVENTS","STRAPI_FIELD_CHANGE","field","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":";;;;;;;AAeO,SAASA,sBAAAA,CACdC,IAAY,EACZC,SAAwC,EAAA;AAExC,IAAA,MAAMC,SAASC,iBAAAA,CAAkB,wBAAA,EAA0B,CAACC,KAAAA,GAAUA,KAAAA,CAAMC,SAAS,EAAE,KAAA,CAAA;AACvF,IAAA,MAAMC,kBAAkBH,iBAAAA,CACtB,wBAAA,EACA,CAACC,KAAAA,GAAUA,KAAAA,CAAME,eAAe,EAChC,KAAA,CAAA;AAEF,IAAA,MAAMC,qBAAAA,GAAwBC,wBAAAA,EAAAA;AAC9B,IAAA,MAAM,EAAEC,KAAK,EAAE,GAAGC,QAAAA,CAASV,IAAAA,CAAAA;IAC3B,MAAM,EAAEW,IAAI,EAAE,GAAGV,SAAAA;AAEjBW,IAAAA,KAAAA,CAAMC,SAAS,CAAC,IAAA;QACd,IAAI,CAACX,MAAAA,IAAU,CAACS,IAAAA,EAAM;AACpB,YAAA;AACF,QAAA;AAEA;;;AAGC,QACD,IAAI,CAAC;AAAC,YAAA,WAAA;AAAa,YAAA;SAAc,CAACG,QAAQ,CAACH,IAAAA,CAAAA,EAAO;AAChD,YAAA,MAAMI,cAAcC,cAAAA,CAAed,MAAAA,CAAAA;YACnCa,WAAAA,CAAYE,eAAAA,CAAgBC,mBAAmB,EAAE;gBAAEC,KAAAA,EAAOnB,IAAAA;AAAMS,gBAAAA;AAAM,aAAA,CAAA;AACxE,QAAA;IACF,CAAA,EAAG;AAACT,QAAAA,IAAAA;AAAMS,QAAAA,KAAAA;AAAOP,QAAAA,MAAAA;AAAQS,QAAAA;AAAK,KAAA,CAAA;AAE9B,IAAA,MAAMI,cAAcC,cAAAA,CAAed,MAAAA,CAAAA;IAEnC,OAAO;QACLkB,OAAAA,EAAS,IAAA;AACP,YAAA,IAAIb,qBAAAA,EAAuB;YAE3BQ,WAAAA,CAAYE,eAAAA,CAAgBI,kBAAkB,EAAE;gBAAEF,KAAAA,EAAOnB;AAAK,aAAA,CAAA;AAChE,QAAA,CAAA;QACAsB,MAAAA,EAAQ,IAAA;AACN,YAAA,IAAIf,qBAAAA,EAAuB;YAE3BD,eAAAA,GAAkB,IAAA,CAAA;YAClBS,WAAAA,CAAYE,eAAAA,CAAgBM,iBAAiB,EAAE;gBAAEJ,KAAAA,EAAOnB;AAAK,aAAA,CAAA;AAC/D,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"usePreviewInputManager.mjs","sources":["../../../../admin/src/preview/hooks/usePreviewInputManager.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Schema } from '@strapi/types';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\ntype PreviewInputProps = Pick<\n Required<React.InputHTMLAttributes<HTMLInputElement>>,\n 'onFocus' | 'onBlur'\n>;\n\nexport function usePreviewInputManager(\n name: string,\n attribute: Schema.Attribute.AnyAttribute\n): PreviewInputProps {\n const iframe = usePreviewContext('usePreviewInputManager', (state) => state.iframeRef, false);\n const setPopoverField = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.setPopoverField,\n false\n );\n const hasInputPopoverParent = useHasInputPopoverParent();\n const { value } = useField(name);\n const { type } = attribute;\n\n React.useEffect(() => {\n if (!iframe || !type) {\n return;\n }\n\n /**\n * Only send message if the field is not a data structure (component, dynamic zone)\n * because we already send events for their fields\n */\n if (!['component', 'dynamiczone'].includes(type)) {\n const sendMessage = getSendMessage(iframe);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value });\n }\n }, [name, value, iframe, type]);\n\n // Track previous value to detect media deletion\n const prevValueRef = React.useRef(value);\n\n React.useEffect(() => {\n // Only run inside popover for media fields\n if (!hasInputPopoverParent || !setPopoverField || type !== 'media') {\n return;\n }\n\n const currentValue = value;\n const previousValue = prevValueRef.current;\n\n // Check if we transitioned from having a value to null/empty\n const hadValue =\n previousValue != null && (Array.isArray(previousValue) ? previousValue.length > 0 : true);\n const hasNoValue =\n currentValue == null || (Array.isArray(currentValue) ? currentValue.length === 0 : false);\n\n if (hadValue && hasNoValue) {\n // Media was deleted, close the popover\n setPopoverField(null);\n }\n\n // Update ref for next comparison\n prevValueRef.current = currentValue;\n }, [value, hasInputPopoverParent, setPopoverField, type]);\n\n const sendMessage = getSendMessage(iframe);\n\n return {\n onFocus: () => {\n if (hasInputPopoverParent) return;\n\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS, { field: name });\n },\n onBlur: () => {\n if (hasInputPopoverParent) return;\n\n setPopoverField?.(null);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_BLUR, { field: name });\n },\n };\n}\n"],"names":["usePreviewInputManager","name","attribute","iframe","usePreviewContext","state","iframeRef","setPopoverField","hasInputPopoverParent","useHasInputPopoverParent","value","useField","type","React","useEffect","includes","sendMessage","getSendMessage","INTERNAL_EVENTS","STRAPI_FIELD_CHANGE","field","prevValueRef","useRef","currentValue","previousValue","current","hadValue","Array","isArray","length","hasNoValue","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":";;;;;;;AAeO,SAASA,sBAAAA,CACdC,IAAY,EACZC,SAAwC,EAAA;AAExC,IAAA,MAAMC,SAASC,iBAAAA,CAAkB,wBAAA,EAA0B,CAACC,KAAAA,GAAUA,KAAAA,CAAMC,SAAS,EAAE,KAAA,CAAA;AACvF,IAAA,MAAMC,kBAAkBH,iBAAAA,CACtB,wBAAA,EACA,CAACC,KAAAA,GAAUA,KAAAA,CAAME,eAAe,EAChC,KAAA,CAAA;AAEF,IAAA,MAAMC,qBAAAA,GAAwBC,wBAAAA,EAAAA;AAC9B,IAAA,MAAM,EAAEC,KAAK,EAAE,GAAGC,QAAAA,CAASV,IAAAA,CAAAA;IAC3B,MAAM,EAAEW,IAAI,EAAE,GAAGV,SAAAA;AAEjBW,IAAAA,KAAAA,CAAMC,SAAS,CAAC,IAAA;QACd,IAAI,CAACX,MAAAA,IAAU,CAACS,IAAAA,EAAM;AACpB,YAAA;AACF,QAAA;AAEA;;;AAGC,QACD,IAAI,CAAC;AAAC,YAAA,WAAA;AAAa,YAAA;SAAc,CAACG,QAAQ,CAACH,IAAAA,CAAAA,EAAO;AAChD,YAAA,MAAMI,cAAcC,cAAAA,CAAed,MAAAA,CAAAA;YACnCa,WAAAA,CAAYE,eAAAA,CAAgBC,mBAAmB,EAAE;gBAAEC,KAAAA,EAAOnB,IAAAA;AAAMS,gBAAAA;AAAM,aAAA,CAAA;AACxE,QAAA;IACF,CAAA,EAAG;AAACT,QAAAA,IAAAA;AAAMS,QAAAA,KAAAA;AAAOP,QAAAA,MAAAA;AAAQS,QAAAA;AAAK,KAAA,CAAA;;IAG9B,MAAMS,YAAAA,GAAeR,KAAAA,CAAMS,MAAM,CAACZ,KAAAA,CAAAA;AAElCG,IAAAA,KAAAA,CAAMC,SAAS,CAAC,IAAA;;AAEd,QAAA,IAAI,CAACN,qBAAAA,IAAyB,CAACD,eAAAA,IAAmBK,SAAS,OAAA,EAAS;AAClE,YAAA;AACF,QAAA;AAEA,QAAA,MAAMW,YAAAA,GAAeb,KAAAA;QACrB,MAAMc,aAAAA,GAAgBH,aAAaI,OAAO;;AAG1C,QAAA,MAAMC,QAAAA,GACJF,aAAAA,IAAiB,IAAA,KAASG,KAAAA,CAAMC,OAAO,CAACJ,aAAAA,CAAAA,GAAiBA,aAAAA,CAAcK,MAAM,GAAG,CAAA,GAAI,IAAG,CAAA;AACzF,QAAA,MAAMC,UAAAA,GACJP,YAAAA,IAAgB,IAAA,KAASI,KAAAA,CAAMC,OAAO,CAACL,YAAAA,CAAAA,GAAgBA,YAAAA,CAAaM,MAAM,KAAK,CAAA,GAAI,KAAI,CAAA;AAEzF,QAAA,IAAIH,YAAYI,UAAAA,EAAY;;YAE1BvB,eAAAA,CAAgB,IAAA,CAAA;AAClB,QAAA;;AAGAc,QAAAA,YAAAA,CAAaI,OAAO,GAAGF,YAAAA;IACzB,CAAA,EAAG;AAACb,QAAAA,KAAAA;AAAOF,QAAAA,qBAAAA;AAAuBD,QAAAA,eAAAA;AAAiBK,QAAAA;AAAK,KAAA,CAAA;AAExD,IAAA,MAAMI,cAAcC,cAAAA,CAAed,MAAAA,CAAAA;IAEnC,OAAO;QACL4B,OAAAA,EAAS,IAAA;AACP,YAAA,IAAIvB,qBAAAA,EAAuB;YAE3BQ,WAAAA,CAAYE,eAAAA,CAAgBc,kBAAkB,EAAE;gBAAEZ,KAAAA,EAAOnB;AAAK,aAAA,CAAA;AAChE,QAAA,CAAA;QACAgC,MAAAA,EAAQ,IAAA;AACN,YAAA,IAAIzB,qBAAAA,EAAuB;YAE3BD,eAAAA,GAAkB,IAAA,CAAA;YAClBS,WAAAA,CAAYE,eAAAA,CAAgBgB,iBAAiB,EAAE;gBAAEd,KAAAA,EAAOnB;AAAK,aAAA,CAAA;AAC/D,QAAA;AACF,KAAA;AACF;;;;"}