@strapi/content-manager 5.61.1 → 5.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +1 -1
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +3 -3
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/features/I18nSharedFieldsLock.js +54 -0
  6. package/dist/admin/features/I18nSharedFieldsLock.js.map +1 -0
  7. package/dist/admin/features/I18nSharedFieldsLock.mjs +31 -0
  8. package/dist/admin/features/I18nSharedFieldsLock.mjs.map +1 -0
  9. package/dist/admin/history/components/VersionInputRenderer.js +7 -2
  10. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  11. package/dist/admin/history/components/VersionInputRenderer.mjs +7 -3
  12. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
  13. package/dist/admin/hooks/useContentManagerInitData.js +27 -8
  14. package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
  15. package/dist/admin/hooks/useContentManagerInitData.mjs +29 -10
  16. package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocument.js +11 -13
  18. package/dist/admin/hooks/useDocument.js.map +1 -1
  19. package/dist/admin/hooks/useDocument.mjs +11 -13
  20. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  21. package/dist/admin/hooks/useI18nFieldLock.js +169 -0
  22. package/dist/admin/hooks/useI18nFieldLock.js.map +1 -0
  23. package/dist/admin/hooks/useI18nFieldLock.mjs +140 -0
  24. package/dist/admin/hooks/useI18nFieldLock.mjs.map +1 -0
  25. package/dist/admin/hooks/usePersistentQueryParams.js +16 -3
  26. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  27. package/dist/admin/hooks/usePersistentQueryParams.mjs +16 -3
  28. package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
  29. package/dist/admin/index.js +5 -0
  30. package/dist/admin/index.js.map +1 -1
  31. package/dist/admin/index.mjs +2 -0
  32. package/dist/admin/index.mjs.map +1 -1
  33. package/dist/admin/modules/app.js +8 -1
  34. package/dist/admin/modules/app.js.map +1 -1
  35. package/dist/admin/modules/app.mjs +8 -2
  36. package/dist/admin/modules/app.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/EditViewPage.js +129 -127
  38. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  39. package/dist/admin/pages/EditView/EditViewPage.mjs +129 -127
  40. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/DocumentActions.js +11 -4
  42. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/DocumentActions.mjs +12 -5
  44. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +31 -21
  46. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +32 -22
  48. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js +98 -0
  50. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js.map +1 -0
  51. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs +96 -0
  52. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs.map +1 -0
  53. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js +1103 -0
  54. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js.map +1 -0
  55. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs +1077 -0
  56. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs.map +1 -0
  57. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js +211 -0
  58. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js.map +1 -0
  59. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs +183 -0
  60. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs.map +1 -0
  61. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js +84 -41
  62. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs +86 -43
  64. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +86 -20
  66. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +89 -23
  68. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +5 -2
  70. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +5 -2
  72. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +142 -22
  74. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +143 -23
  76. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js +402 -0
  78. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js.map +1 -0
  79. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs +389 -0
  80. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs.map +1 -0
  81. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +84 -33
  82. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +85 -34
  84. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +5 -1
  86. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +5 -1
  88. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +17 -4
  90. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +18 -5
  92. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  93. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +54 -6
  94. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  95. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +54 -6
  96. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  97. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +11 -9
  98. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +12 -10
  100. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +9 -4
  102. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  103. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +9 -4
  104. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  105. package/dist/admin/pages/EditView/components/FormLayout.js +66 -63
  106. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  107. package/dist/admin/pages/EditView/components/FormLayout.mjs +66 -63
  108. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  109. package/dist/admin/pages/EditView/components/InputRenderer.js +7 -1
  110. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  111. package/dist/admin/pages/EditView/components/InputRenderer.mjs +7 -1
  112. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  113. package/dist/admin/pages/EditView/utils/data.js +14 -9
  114. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  115. package/dist/admin/pages/EditView/utils/data.mjs +14 -9
  116. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  117. package/dist/admin/pages/EditView/utils/forms.js +34 -0
  118. package/dist/admin/pages/EditView/utils/forms.js.map +1 -1
  119. package/dist/admin/pages/EditView/utils/forms.mjs +34 -1
  120. package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -1
  121. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +2 -1
  122. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
  123. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +2 -1
  124. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
  125. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +7 -6
  126. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
  127. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +7 -6
  128. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
  129. package/dist/admin/pages/ListView/ListViewPage.js +11 -2
  130. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  131. package/dist/admin/pages/ListView/ListViewPage.mjs +13 -4
  132. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  133. package/dist/admin/pages/ListView/components/Filters.js +15 -5
  134. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  135. package/dist/admin/pages/ListView/components/Filters.mjs +16 -7
  136. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  137. package/dist/admin/preview/components/InputPopover.js +18 -8
  138. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  139. package/dist/admin/preview/components/InputPopover.mjs +19 -9
  140. package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
  141. package/dist/admin/preview/pages/Preview.js +5 -16
  142. package/dist/admin/preview/pages/Preview.js.map +1 -1
  143. package/dist/admin/preview/pages/Preview.mjs +5 -16
  144. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  145. package/dist/admin/preview/utils/fieldUtils.js +2 -0
  146. package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
  147. package/dist/admin/preview/utils/fieldUtils.mjs +2 -1
  148. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
  149. package/dist/admin/services/api.js +2 -1
  150. package/dist/admin/services/api.js.map +1 -1
  151. package/dist/admin/services/api.mjs +2 -1
  152. package/dist/admin/services/api.mjs.map +1 -1
  153. package/dist/admin/services/documents.js +21 -1
  154. package/dist/admin/services/documents.js.map +1 -1
  155. package/dist/admin/services/documents.mjs +21 -2
  156. package/dist/admin/services/documents.mjs.map +1 -1
  157. package/dist/admin/services/relations.js +47 -1
  158. package/dist/admin/services/relations.js.map +1 -1
  159. package/dist/admin/services/relations.mjs +47 -2
  160. package/dist/admin/services/relations.mjs.map +1 -1
  161. package/dist/admin/src/exports.d.ts +2 -0
  162. package/dist/admin/src/features/I18nSharedFieldsLock.d.ts +22 -0
  163. package/dist/admin/src/history/components/VersionInputRenderer.d.ts +7 -1
  164. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  165. package/dist/admin/src/hooks/useI18nFieldLock.d.ts +61 -0
  166. package/dist/admin/src/modules/app.d.ts +4 -1
  167. package/dist/admin/src/pages/EditView/components/FormInputs/Component/AddComponentMenu.d.ts +15 -0
  168. package/dist/admin/src/pages/EditView/components/FormInputs/Component/ComponentCopyModal.d.ts +58 -0
  169. package/dist/admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.d.ts +41 -0
  170. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Initializer.d.ts +7 -3
  171. package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +1 -1
  172. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +2 -2
  173. package/dist/admin/src/pages/EditView/components/FormInputs/Component/utils/componentCopy.d.ts +115 -0
  174. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +6 -3
  175. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +2 -1
  176. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +5 -1
  177. package/dist/admin/src/pages/EditView/utils/forms.d.ts +13 -2
  178. package/dist/admin/src/pages/ListView/components/Filters.d.ts +12 -3
  179. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  180. package/dist/admin/src/preview/utils/fieldUtils.d.ts +1 -0
  181. package/dist/admin/src/services/api.d.ts +1 -1
  182. package/dist/admin/src/services/components.d.ts +2 -2
  183. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  184. package/dist/admin/src/services/documents.d.ts +25 -21
  185. package/dist/admin/src/services/homepage.d.ts +1 -1
  186. package/dist/admin/src/services/init.d.ts +1 -1
  187. package/dist/admin/src/services/relations.d.ts +5 -3
  188. package/dist/admin/src/services/uid.d.ts +3 -3
  189. package/dist/admin/translations/en.json.js +41 -0
  190. package/dist/admin/translations/en.json.js.map +1 -1
  191. package/dist/admin/translations/en.json.mjs +41 -0
  192. package/dist/admin/translations/en.json.mjs.map +1 -1
  193. package/dist/server/controllers/relations.js +4 -2
  194. package/dist/server/controllers/relations.js.map +1 -1
  195. package/dist/server/controllers/relations.mjs +4 -2
  196. package/dist/server/controllers/relations.mjs.map +1 -1
  197. package/dist/server/controllers/utils/metadata.js +3 -1
  198. package/dist/server/controllers/utils/metadata.js.map +1 -1
  199. package/dist/server/controllers/utils/metadata.mjs +3 -1
  200. package/dist/server/controllers/utils/metadata.mjs.map +1 -1
  201. package/dist/server/history/services/utils.js +3 -1
  202. package/dist/server/history/services/utils.js.map +1 -1
  203. package/dist/server/history/services/utils.mjs +3 -1
  204. package/dist/server/history/services/utils.mjs.map +1 -1
  205. package/dist/server/homepage/services/homepage-query-utils.js +14 -0
  206. package/dist/server/homepage/services/homepage-query-utils.js.map +1 -1
  207. package/dist/server/homepage/services/homepage-query-utils.mjs +14 -1
  208. package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -1
  209. package/dist/server/homepage/services/homepage.js +1 -1
  210. package/dist/server/homepage/services/homepage.js.map +1 -1
  211. package/dist/server/homepage/services/homepage.mjs +2 -2
  212. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  213. package/dist/server/mcp/sanitizers/shape-relations.js +1 -3
  214. package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -1
  215. package/dist/server/mcp/sanitizers/shape-relations.mjs +1 -3
  216. package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -1
  217. package/dist/server/mcp/schemas/output-schemas.js +2 -1
  218. package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
  219. package/dist/server/mcp/schemas/output-schemas.mjs +2 -1
  220. package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
  221. package/dist/server/services/document-manager.js +3 -2
  222. package/dist/server/services/document-manager.js.map +1 -1
  223. package/dist/server/services/document-manager.mjs +3 -2
  224. package/dist/server/services/document-manager.mjs.map +1 -1
  225. package/dist/server/services/document-metadata.js +92 -4
  226. package/dist/server/services/document-metadata.js.map +1 -1
  227. package/dist/server/services/document-metadata.mjs +92 -4
  228. package/dist/server/services/document-metadata.mjs.map +1 -1
  229. package/dist/server/services/permission-checker.js +20 -8
  230. package/dist/server/services/permission-checker.js.map +1 -1
  231. package/dist/server/services/permission-checker.mjs +20 -8
  232. package/dist/server/services/permission-checker.mjs.map +1 -1
  233. package/dist/server/services/uid.js +2 -1
  234. package/dist/server/services/uid.js.map +1 -1
  235. package/dist/server/services/uid.mjs +2 -1
  236. package/dist/server/services/uid.mjs.map +1 -1
  237. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  238. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  239. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  240. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  241. package/dist/server/src/homepage/services/homepage-query-utils.d.ts +6 -0
  242. package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
  243. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  244. package/dist/server/src/index.d.ts +21 -7
  245. package/dist/server/src/index.d.ts.map +1 -1
  246. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
  247. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  248. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  249. package/dist/server/src/services/document-metadata.d.ts +5 -1
  250. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  251. package/dist/server/src/services/index.d.ts +21 -7
  252. package/dist/server/src/services/index.d.ts.map +1 -1
  253. package/dist/server/src/services/permission-checker.d.ts +6 -5
  254. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  255. package/dist/server/src/services/uid.d.ts.map +1 -1
  256. package/dist/shared/contracts/collection-types.d.ts +7 -0
  257. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  258. package/dist/shared/contracts/single-types.d.ts +4 -0
  259. package/dist/shared/contracts/single-types.d.ts.map +1 -1
  260. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"Preview.js","sources":["../../../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useQueryParams,\n useRBAC,\n createContext,\n Form as FormContext,\n type FieldContentSourceMap,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled, useTheme } from 'styled-components';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC, useDocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { Blocker } from '../../pages/EditView/components/Blocker';\nimport { FormLayout } from '../../pages/EditView/components/FormLayout';\nimport { handleInvisibleAttributes } from '../../pages/EditView/utils/data';\nimport { buildValidParams } from '../../utils/api';\nimport { createYupSchema } from '../../utils/validation';\nimport { InputPopover } from '../components/InputPopover';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { INTERNAL_EVENTS, PUBLIC_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\nimport type { Schema, UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEVICES = [\n {\n name: 'desktop',\n label: {\n id: 'content-manager.preview.device.desktop',\n defaultMessage: 'Desktop',\n },\n width: '100%',\n height: '100%',\n },\n {\n name: 'mobile',\n label: {\n id: 'content-manager.preview.device.mobile',\n defaultMessage: 'Mobile',\n },\n width: '375px',\n height: '667px',\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverField extends FieldContentSourceMap {\n position: DOMRect;\n attribute: Schema.Attribute.AnyAttribute;\n blockIndex: number | null;\n}\n\ninterface PreviewContextValue {\n url: string;\n title: string;\n document: NonNullable<ReturnType<UseDocument>['document']>;\n meta: NonNullable<ReturnType<UseDocument>['meta']>;\n schema: NonNullable<ReturnType<UseDocument>['schema']>;\n components: NonNullable<ReturnType<UseDocument>['components']>;\n layout: EditLayout;\n onPreview: () => void;\n iframeRef: React.RefObject<HTMLIFrameElement>;\n popoverField: PopoverField | null;\n setPopoverField: (value: PopoverField | null) => void;\n}\n\ntype PreviewHighlightColors = {\n highlightHoverColor: string;\n highlightActiveColor: string;\n};\n\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\n\nconst getPreviewScript = (() => {\n let previewScript = '';\n return async (previewHighlightColors: PreviewHighlightColors) => {\n if (!previewScript) {\n const resp = await fetch(`${window.strapi.backendURL}/content-manager/preview/script`);\n\n if (!resp.ok) {\n throw new Error('Could not retrieve preview script from server.');\n }\n\n previewScript = await resp.text();\n\n if (!previewScript) {\n throw new Error('Could not retrieve preview script from server.');\n }\n }\n\n return `(${previewScript})(${JSON.stringify({\n colors: previewHighlightColors,\n events: INTERNAL_EVENTS,\n parentOrigin: window.location.origin,\n })})`;\n };\n})();\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst AnimatedArrow = styled(ArrowLineLeft)<{ $isSideEditorOpen: boolean }>`\n will-change: transform;\n rotate: ${(props) => (props.$isSideEditorOpen ? '0deg' : '180deg')};\n transition: rotate 0.2s ease-in-out;\n`;\n\nconst PreviewPage = () => {\n const location = useLocation();\n const { formatMessage } = useIntl();\n const theme = useTheme();\n\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\n const [popoverField, setPopoverField] = React.useState<PopoverField | null>(null);\n const prevPopoverFieldRef = React.useRef<PopoverField | null>(null);\n\n // When the popover closes, ask the iframe to rescan its stega element groups.\n // Live-preview sync updates the iframe DOM while editing, which can change the\n // rendered height of the field; groups need to reflect the current DOM so that\n // hover highlights and double-click detection work on the updated content.\n React.useEffect(() => {\n const prev = prevPopoverFieldRef.current;\n prevPopoverFieldRef.current = popoverField;\n\n if (prev !== null && popoverField === null) {\n const iframe = iframeRef.current;\n if (!iframe?.src) return;\n iframe.contentWindow?.postMessage(\n { type: INTERNAL_EVENTS.STRAPI_RESCAN_HIGHLIGHTS },\n new URL(iframe.src).origin\n );\n }\n }, [popoverField, iframeRef]);\n\n const { toggleNotification } = useNotification();\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: { i18n?: { locale?: string } };\n status?: string;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const [deviceName, setDeviceName] = React.useState<(typeof DEVICES)[number]['name']>(\n DEVICES[0].name\n );\n const device = DEVICES.find((d) => d.name === deviceName) ?? DEVICES[0];\n\n const previewHighlightColors: PreviewHighlightColors = {\n highlightHoverColor: theme.colors.primary500,\n highlightActiveColor: theme.colors.primary600,\n };\n\n // Listen for ready message from iframe before injecting script\n React.useEffect(() => {\n const handleMessage = async (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 === PUBLIC_EVENTS.PREVIEW_READY) {\n try {\n const script = await getPreviewScript(previewHighlightColors);\n\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.preview.error.script-failed',\n defaultMessage:\n 'Could not load the live preview script. Visual editing may not be available.',\n }),\n });\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n // Preserve the existing dependency behavior: previewHighlightColors is derived from theme.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentId, toggleNotification, theme, formatMessage]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale as GetPreviewUrl.Request['query']['locale'],\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n const documentLayoutResponse = useDocumentLayout(model);\n const isLoadingActionsRBAC = useDocumentRBAC('PreviewPage', (state) => state.isLoading);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (\n isLoadingActionsRBAC ||\n (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading))\n ) {\n return <Page.Loading />;\n }\n\n const initialValues = documentResponse.getInitialFormValues();\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema ||\n !initialValues\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n const validateSync = (values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validateSync(cleanedValues, { abortEarly: false });\n };\n\n const previewUrl = previewUrlResponse.data.data.url;\n\n const onPreview = () => {\n iframeRef?.current?.contentWindow?.postMessage(\n { type: 'strapiUpdate' },\n // The iframe origin is safe to use since it must be provided through the allowedOrigins config\n new URL(iframeRef.current.src).origin\n );\n };\n\n const hasAdvancedPreview = window.strapi.features.isEnabled('cms-advanced-preview');\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrl}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n components={documentResponse.components}\n layout={documentLayoutResponse.edit}\n onPreview={onPreview}\n iframeRef={iframeRef}\n popoverField={popoverField}\n setPopoverField={setPopoverField}\n >\n <FormContext\n method=\"PUT\"\n disabled={\n query.status === 'published' &&\n documentResponse &&\n documentResponse.document.status !== 'draft'\n }\n initialValues={documentResponse.getInitialFormValues()}\n initialErrors={location?.state?.forceValidation ? validateSync(initialValues, {}) : {}}\n height=\"100%\"\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validate(cleanedValues, { abortEarly: false });\n }}\n >\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <Blocker />\n <PreviewHeader />\n <InputPopover documentResponse={documentResponse} />\n <Flex flex={1} overflow=\"auto\" alignItems=\"stretch\">\n {hasAdvancedPreview && (\n <Box\n overflow=\"auto\"\n width={isSideEditorOpen ? '50%' : 0}\n borderWidth=\"0 1px 0 0\"\n borderColor=\"neutral150\"\n paddingTop={6}\n paddingBottom={6}\n // Remove horizontal padding when the editor is closed or it won't fully disappear\n paddingLeft={isSideEditorOpen ? 6 : 0}\n paddingRight={isSideEditorOpen ? 6 : 0}\n transition=\"all 0.2s ease-in-out\"\n >\n <FormLayout\n layout={documentLayoutResponse.edit.layout}\n document={documentResponse}\n hasBackground={false}\n />\n </Box>\n )}\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n flex={1}\n height=\"100%\"\n overflow=\"hidden\"\n >\n <Flex\n direction=\"row\"\n background=\"neutral0\"\n padding={2}\n borderWidth=\"0 0 1px 0\"\n borderColor=\"neutral150\"\n >\n {hasAdvancedPreview && (\n <IconButton\n variant=\"ghost\"\n label={formatMessage(\n isSideEditorOpen\n ? {\n id: 'content-manager.preview.content.close-editor',\n defaultMessage: 'Close editor',\n }\n : {\n id: 'content-manager.preview.content.open-editor',\n defaultMessage: 'Open editor',\n }\n )}\n onClick={() => setIsSideEditorOpen((prev) => !prev)}\n >\n <AnimatedArrow $isSideEditorOpen={isSideEditorOpen} />\n </IconButton>\n )}\n <Flex justifyContent=\"center\" flex={1}>\n <SingleSelect\n value={deviceName}\n onChange={(name) => setDeviceName(name.toString())}\n aria-label={formatMessage({\n id: 'content-manager.preview.device.select',\n defaultMessage: 'Select device type',\n })}\n >\n {DEVICES.map((deviceOption) => (\n <SingleSelectOption key={deviceOption.name} value={deviceOption.name}>\n {formatMessage(deviceOption.label)}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Flex>\n </Flex>\n <Flex direction=\"column\" justifyContent=\"center\" background=\"neutral0\" flex={1}>\n <Box\n data-testid=\"preview-iframe\"\n ref={iframeRef}\n src={previewUrl}\n /**\n * For some reason, changing an iframe's src tag causes the browser to add a new item in the\n * history stack. This is an issue for us as it means clicking the back button will not let us\n * go back to the edit view. To fix it, we need to trick the browser into thinking this is a\n * different iframe when the preview URL changes. So we set a key prop to force React\n * to mount a different node when the src changes.\n */\n key={previewUrl}\n title={formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n })}\n width={device.width}\n height={device.height}\n borderWidth={0}\n tag=\"iframe\"\n />\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </FormContext>\n </PreviewProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedPreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedPreviewPageImpl = () => {\n const { slug: model } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC([\n { action: 'plugin::content-manager.explorer.read', subject: model },\n { action: 'plugin::content-manager.explorer.update', subject: model },\n { action: 'plugin::content-manager.explorer.publish', subject: model },\n ]);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !model) {\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Protect\n permissions={permissions.filter((permission) =>\n permission.action.includes('explorer.read')\n )}\n >\n <DocumentRBAC permissions={permissions}>\n <PreviewPage />\n </DocumentRBAC>\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedPreviewPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedPreviewPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedPreviewPage, usePreviewContext };\nexport type { PreviewContextValue };\n"],"names":["DEVICES","name","label","id","defaultMessage","width","height","PreviewProvider","usePreviewContext","createContext","getPreviewScript","previewScript","previewHighlightColors","resp","fetch","window","strapi","backendURL","ok","Error","text","JSON","stringify","colors","events","INTERNAL_EVENTS","parentOrigin","location","origin","AnimatedArrow","styled","ArrowLineLeft","props","$isSideEditorOpen","PreviewPage","useLocation","formatMessage","useIntl","theme","useTheme","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","prevPopoverFieldRef","useEffect","prev","current","iframe","src","contentWindow","postMessage","type","STRAPI_RESCAN_HIGHLIGHTS","URL","toggleNotification","useNotification","slug","model","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","highlightHoverColor","primary500","highlightActiveColor","primary600","handleMessage","event","previewOrigin","data","PUBLIC_EVENTS","PREVIEW_READY","script","sendMessage","getSendMessage","STRAPI_SCRIPT","message","addEventListener","removeEventListener","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","locale","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","isLoadingActionsRBAC","useDocumentRBAC","state","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","url","NoData","documentTitle","getTitle","edit","settings","mainField","validateSync","values","options","cleanedValues","removedAttributes","handleInvisibleAttributes","components","yupSchema","createYupSchema","attributes","abortEarly","previewUrl","onPreview","hasAdvancedPreview","features","isEnabled","_jsxs","_Fragment","Title","title","layout","FormContext","method","disabled","initialErrors","forceValidation","validate","Flex","direction","alignItems","Blocker","PreviewHeader","InputPopover","flex","overflow","Box","borderWidth","borderColor","paddingTop","paddingBottom","paddingLeft","paddingRight","transition","FormLayout","hasBackground","background","padding","IconButton","variant","onClick","justifyContent","SingleSelect","value","onChange","toString","aria-label","map","deviceOption","SingleSelectOption","data-testid","ref","tag","ProtectedPreviewPageImpl","permissions","useRBAC","action","subject","position","top","left","zIndex","Protect","filter","permission","includes","DocumentRBAC","ProtectedPreviewPage","Portal","FocusTrap"],"mappings":"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"}
1
+ {"version":3,"file":"Preview.js","sources":["../../../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useQueryParams,\n useRBAC,\n createContext,\n Form as FormContext,\n type FieldContentSourceMap,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled, useTheme } from 'styled-components';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC, useDocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { Blocker } from '../../pages/EditView/components/Blocker';\nimport { FormLayout } from '../../pages/EditView/components/FormLayout';\nimport { handleInvisibleAttributes } from '../../pages/EditView/utils/data';\nimport { getPublishValidationErrors } from '../../pages/EditView/utils/forms';\nimport { buildValidParams } from '../../utils/api';\nimport { createYupSchema } from '../../utils/validation';\nimport { InputPopover } from '../components/InputPopover';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { INTERNAL_EVENTS, PUBLIC_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\nimport type { Schema, UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEVICES = [\n {\n name: 'desktop',\n label: {\n id: 'content-manager.preview.device.desktop',\n defaultMessage: 'Desktop',\n },\n width: '100%',\n height: '100%',\n },\n {\n name: 'mobile',\n label: {\n id: 'content-manager.preview.device.mobile',\n defaultMessage: 'Mobile',\n },\n width: '375px',\n height: '667px',\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverField extends FieldContentSourceMap {\n position: DOMRect;\n attribute: Schema.Attribute.AnyAttribute;\n blockIndex: number | null;\n}\n\ninterface PreviewContextValue {\n url: string;\n title: string;\n document: NonNullable<ReturnType<UseDocument>['document']>;\n meta: NonNullable<ReturnType<UseDocument>['meta']>;\n schema: NonNullable<ReturnType<UseDocument>['schema']>;\n components: NonNullable<ReturnType<UseDocument>['components']>;\n layout: EditLayout;\n onPreview: () => void;\n iframeRef: React.RefObject<HTMLIFrameElement>;\n popoverField: PopoverField | null;\n setPopoverField: (value: PopoverField | null) => void;\n}\n\ntype PreviewHighlightColors = {\n highlightHoverColor: string;\n highlightActiveColor: string;\n};\n\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\n\nconst getPreviewScript = (() => {\n let previewScript = '';\n return async (previewHighlightColors: PreviewHighlightColors) => {\n if (!previewScript) {\n const resp = await fetch(`${window.strapi.backendURL}/content-manager/preview/script`);\n\n if (!resp.ok) {\n throw new Error('Could not retrieve preview script from server.');\n }\n\n previewScript = await resp.text();\n\n if (!previewScript) {\n throw new Error('Could not retrieve preview script from server.');\n }\n }\n\n return `(${previewScript})(${JSON.stringify({\n colors: previewHighlightColors,\n events: INTERNAL_EVENTS,\n parentOrigin: window.location.origin,\n })})`;\n };\n})();\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst AnimatedArrow = styled(ArrowLineLeft)<{ $isSideEditorOpen: boolean }>`\n will-change: transform;\n rotate: ${(props) => (props.$isSideEditorOpen ? '0deg' : '180deg')};\n transition: rotate 0.2s ease-in-out;\n`;\n\nconst PreviewPage = () => {\n const location = useLocation();\n const { formatMessage } = useIntl();\n const theme = useTheme();\n\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\n const [popoverField, setPopoverField] = React.useState<PopoverField | null>(null);\n const prevPopoverFieldRef = React.useRef<PopoverField | null>(null);\n\n // When the popover closes, ask the iframe to rescan its stega element groups.\n // Live-preview sync updates the iframe DOM while editing, which can change the\n // rendered height of the field; groups need to reflect the current DOM so that\n // hover highlights and double-click detection work on the updated content.\n React.useEffect(() => {\n const prev = prevPopoverFieldRef.current;\n prevPopoverFieldRef.current = popoverField;\n\n if (prev !== null && popoverField === null) {\n const iframe = iframeRef.current;\n if (!iframe?.src) return;\n iframe.contentWindow?.postMessage(\n { type: INTERNAL_EVENTS.STRAPI_RESCAN_HIGHLIGHTS },\n new URL(iframe.src).origin\n );\n }\n }, [popoverField, iframeRef]);\n\n const { toggleNotification } = useNotification();\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: { i18n?: { locale?: string } };\n status?: string;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const [deviceName, setDeviceName] = React.useState<(typeof DEVICES)[number]['name']>(\n DEVICES[0].name\n );\n const device = DEVICES.find((d) => d.name === deviceName) ?? DEVICES[0];\n\n const previewHighlightColors: PreviewHighlightColors = {\n highlightHoverColor: theme.colors.primary500,\n highlightActiveColor: theme.colors.primary600,\n };\n\n // Listen for ready message from iframe before injecting script\n React.useEffect(() => {\n const handleMessage = async (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 === PUBLIC_EVENTS.PREVIEW_READY) {\n try {\n const script = await getPreviewScript(previewHighlightColors);\n\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.preview.error.script-failed',\n defaultMessage:\n 'Could not load the live preview script. Visual editing may not be available.',\n }),\n });\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n // Preserve the existing dependency behavior: previewHighlightColors is derived from theme.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentId, toggleNotification, theme, formatMessage]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale as GetPreviewUrl.Request['query']['locale'],\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n const documentLayoutResponse = useDocumentLayout(model);\n const isLoadingActionsRBAC = useDocumentRBAC('PreviewPage', (state) => state.isLoading);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (\n isLoadingActionsRBAC ||\n (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading))\n ) {\n return <Page.Loading />;\n }\n\n const initialValues = documentResponse.getInitialFormValues();\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema ||\n !initialValues\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n const previewUrl = previewUrlResponse.data.data.url;\n\n const onPreview = () => {\n iframeRef?.current?.contentWindow?.postMessage(\n { type: 'strapiUpdate' },\n // The iframe origin is safe to use since it must be provided through the allowedOrigins config\n new URL(iframeRef.current.src).origin\n );\n };\n\n const hasAdvancedPreview = window.strapi.features.isEnabled('cms-advanced-preview');\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrl}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n components={documentResponse.components}\n layout={documentLayoutResponse.edit}\n onPreview={onPreview}\n iframeRef={iframeRef}\n popoverField={popoverField}\n setPopoverField={setPopoverField}\n >\n <FormContext\n method=\"PUT\"\n disabled={\n query.status === 'published' &&\n documentResponse &&\n documentResponse.document.status !== 'draft'\n }\n initialValues={documentResponse.getInitialFormValues()}\n initialErrors={\n location?.state?.forceValidation\n ? getPublishValidationErrors(initialValues, {\n schema: documentResponse.schema,\n components: documentResponse.components,\n })\n : {}\n }\n height=\"100%\"\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validate(cleanedValues, { abortEarly: false });\n }}\n >\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <Blocker />\n <PreviewHeader />\n <InputPopover documentResponse={documentResponse} />\n <Flex flex={1} overflow=\"auto\" alignItems=\"stretch\">\n {hasAdvancedPreview && (\n <Box\n overflow=\"auto\"\n width={isSideEditorOpen ? '50%' : 0}\n borderWidth=\"0 1px 0 0\"\n borderColor=\"neutral150\"\n paddingTop={6}\n paddingBottom={6}\n // Remove horizontal padding when the editor is closed or it won't fully disappear\n paddingLeft={isSideEditorOpen ? 6 : 0}\n paddingRight={isSideEditorOpen ? 6 : 0}\n transition=\"all 0.2s ease-in-out\"\n >\n <FormLayout\n layout={documentLayoutResponse.edit.layout}\n document={documentResponse}\n hasBackground={false}\n />\n </Box>\n )}\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n flex={1}\n height=\"100%\"\n overflow=\"hidden\"\n >\n <Flex\n direction=\"row\"\n background=\"neutral0\"\n padding={2}\n borderWidth=\"0 0 1px 0\"\n borderColor=\"neutral150\"\n >\n {hasAdvancedPreview && (\n <IconButton\n variant=\"ghost\"\n label={formatMessage(\n isSideEditorOpen\n ? {\n id: 'content-manager.preview.content.close-editor',\n defaultMessage: 'Close editor',\n }\n : {\n id: 'content-manager.preview.content.open-editor',\n defaultMessage: 'Open editor',\n }\n )}\n onClick={() => setIsSideEditorOpen((prev) => !prev)}\n >\n <AnimatedArrow $isSideEditorOpen={isSideEditorOpen} />\n </IconButton>\n )}\n <Flex justifyContent=\"center\" flex={1}>\n <SingleSelect\n value={deviceName}\n onChange={(name) => setDeviceName(name.toString())}\n aria-label={formatMessage({\n id: 'content-manager.preview.device.select',\n defaultMessage: 'Select device type',\n })}\n >\n {DEVICES.map((deviceOption) => (\n <SingleSelectOption key={deviceOption.name} value={deviceOption.name}>\n {formatMessage(deviceOption.label)}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Flex>\n </Flex>\n <Flex direction=\"column\" justifyContent=\"center\" background=\"neutral0\" flex={1}>\n <Box\n data-testid=\"preview-iframe\"\n ref={iframeRef}\n src={previewUrl}\n /**\n * For some reason, changing an iframe's src tag causes the browser to add a new item in the\n * history stack. This is an issue for us as it means clicking the back button will not let us\n * go back to the edit view. To fix it, we need to trick the browser into thinking this is a\n * different iframe when the preview URL changes. So we set a key prop to force React\n * to mount a different node when the src changes.\n */\n key={previewUrl}\n title={formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n })}\n width={device.width}\n height={device.height}\n borderWidth={0}\n tag=\"iframe\"\n />\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </FormContext>\n </PreviewProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedPreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedPreviewPageImpl = () => {\n const { slug: model } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC([\n { action: 'plugin::content-manager.explorer.read', subject: model },\n { action: 'plugin::content-manager.explorer.update', subject: model },\n { action: 'plugin::content-manager.explorer.publish', subject: model },\n ]);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !model) {\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Protect\n permissions={permissions.filter((permission) =>\n permission.action.includes('explorer.read')\n )}\n >\n <DocumentRBAC permissions={permissions}>\n <PreviewPage />\n </DocumentRBAC>\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedPreviewPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedPreviewPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedPreviewPage, usePreviewContext };\nexport type { PreviewContextValue };\n"],"names":["DEVICES","name","label","id","defaultMessage","width","height","PreviewProvider","usePreviewContext","createContext","getPreviewScript","previewScript","previewHighlightColors","resp","fetch","window","strapi","backendURL","ok","Error","text","JSON","stringify","colors","events","INTERNAL_EVENTS","parentOrigin","location","origin","AnimatedArrow","styled","ArrowLineLeft","props","$isSideEditorOpen","PreviewPage","useLocation","formatMessage","useIntl","theme","useTheme","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","prevPopoverFieldRef","useEffect","prev","current","iframe","src","contentWindow","postMessage","type","STRAPI_RESCAN_HIGHLIGHTS","URL","toggleNotification","useNotification","slug","model","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","highlightHoverColor","primary500","highlightActiveColor","primary600","handleMessage","event","previewOrigin","data","PUBLIC_EVENTS","PREVIEW_READY","script","sendMessage","getSendMessage","STRAPI_SCRIPT","message","addEventListener","removeEventListener","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","locale","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","isLoadingActionsRBAC","useDocumentRBAC","state","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","url","NoData","documentTitle","getTitle","edit","settings","mainField","previewUrl","onPreview","hasAdvancedPreview","features","isEnabled","_jsxs","_Fragment","Title","title","components","layout","FormContext","method","disabled","initialErrors","forceValidation","getPublishValidationErrors","validate","values","options","cleanedValues","removedAttributes","handleInvisibleAttributes","yupSchema","createYupSchema","attributes","abortEarly","Flex","direction","alignItems","Blocker","PreviewHeader","InputPopover","flex","overflow","Box","borderWidth","borderColor","paddingTop","paddingBottom","paddingLeft","paddingRight","transition","FormLayout","hasBackground","background","padding","IconButton","variant","onClick","justifyContent","SingleSelect","value","onChange","toString","aria-label","map","deviceOption","SingleSelectOption","data-testid","ref","tag","ProtectedPreviewPageImpl","permissions","useRBAC","action","subject","position","top","left","zIndex","Protect","filter","permission","includes","DocumentRBAC","ProtectedPreviewPage","Portal","FocusTrap"],"mappings":"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"}
@@ -13,6 +13,7 @@ import { useDocumentLayout } from '../../hooks/useDocumentLayout.mjs';
13
13
  import { Blocker } from '../../pages/EditView/components/Blocker.mjs';
14
14
  import { FormLayout } from '../../pages/EditView/components/FormLayout.mjs';
15
15
  import { handleInvisibleAttributes } from '../../pages/EditView/utils/data.mjs';
16
+ import { getPublishValidationErrors } from '../../pages/EditView/utils/forms.mjs';
16
17
  import { buildValidParams } from '../../utils/api.mjs';
17
18
  import { createYupSchema } from '../../utils/validation.mjs';
18
19
  import { InputPopover } from '../components/InputPopover.mjs';
@@ -190,21 +191,6 @@ const PreviewPage = ()=>{
190
191
  return /*#__PURE__*/ jsx(Page.NoData, {});
191
192
  }
192
193
  const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);
193
- const validateSync = (values, options)=>{
194
- const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {
195
- schema: documentResponse.schema,
196
- initialValues,
197
- components: documentResponse.components
198
- });
199
- const yupSchema = createYupSchema(documentResponse.schema?.attributes, documentResponse.components, {
200
- status: documentResponse.document?.status,
201
- removedAttributes,
202
- ...options
203
- });
204
- return yupSchema.validateSync(cleanedValues, {
205
- abortEarly: false
206
- });
207
- };
208
194
  const previewUrl = previewUrlResponse.data.data.url;
209
195
  const onPreview = ()=>{
210
196
  iframeRef?.current?.contentWindow?.postMessage({
@@ -239,7 +225,10 @@ const PreviewPage = ()=>{
239
225
  method: "PUT",
240
226
  disabled: query.status === 'published' && documentResponse && documentResponse.document.status !== 'draft',
241
227
  initialValues: documentResponse.getInitialFormValues(),
242
- initialErrors: location?.state?.forceValidation ? validateSync(initialValues, {}) : {},
228
+ initialErrors: location?.state?.forceValidation ? getPublishValidationErrors(initialValues, {
229
+ schema: documentResponse.schema,
230
+ components: documentResponse.components
231
+ }) : {},
243
232
  height: "100%",
244
233
  validate: (values, options)=>{
245
234
  const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {
@@ -1 +1 @@
1
- {"version":3,"file":"Preview.mjs","sources":["../../../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useQueryParams,\n useRBAC,\n createContext,\n Form as FormContext,\n type FieldContentSourceMap,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled, useTheme } from 'styled-components';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC, useDocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { Blocker } from '../../pages/EditView/components/Blocker';\nimport { FormLayout } from '../../pages/EditView/components/FormLayout';\nimport { handleInvisibleAttributes } from '../../pages/EditView/utils/data';\nimport { buildValidParams } from '../../utils/api';\nimport { createYupSchema } from '../../utils/validation';\nimport { InputPopover } from '../components/InputPopover';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { INTERNAL_EVENTS, PUBLIC_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\nimport type { Schema, UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEVICES = [\n {\n name: 'desktop',\n label: {\n id: 'content-manager.preview.device.desktop',\n defaultMessage: 'Desktop',\n },\n width: '100%',\n height: '100%',\n },\n {\n name: 'mobile',\n label: {\n id: 'content-manager.preview.device.mobile',\n defaultMessage: 'Mobile',\n },\n width: '375px',\n height: '667px',\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverField extends FieldContentSourceMap {\n position: DOMRect;\n attribute: Schema.Attribute.AnyAttribute;\n blockIndex: number | null;\n}\n\ninterface PreviewContextValue {\n url: string;\n title: string;\n document: NonNullable<ReturnType<UseDocument>['document']>;\n meta: NonNullable<ReturnType<UseDocument>['meta']>;\n schema: NonNullable<ReturnType<UseDocument>['schema']>;\n components: NonNullable<ReturnType<UseDocument>['components']>;\n layout: EditLayout;\n onPreview: () => void;\n iframeRef: React.RefObject<HTMLIFrameElement>;\n popoverField: PopoverField | null;\n setPopoverField: (value: PopoverField | null) => void;\n}\n\ntype PreviewHighlightColors = {\n highlightHoverColor: string;\n highlightActiveColor: string;\n};\n\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\n\nconst getPreviewScript = (() => {\n let previewScript = '';\n return async (previewHighlightColors: PreviewHighlightColors) => {\n if (!previewScript) {\n const resp = await fetch(`${window.strapi.backendURL}/content-manager/preview/script`);\n\n if (!resp.ok) {\n throw new Error('Could not retrieve preview script from server.');\n }\n\n previewScript = await resp.text();\n\n if (!previewScript) {\n throw new Error('Could not retrieve preview script from server.');\n }\n }\n\n return `(${previewScript})(${JSON.stringify({\n colors: previewHighlightColors,\n events: INTERNAL_EVENTS,\n parentOrigin: window.location.origin,\n })})`;\n };\n})();\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst AnimatedArrow = styled(ArrowLineLeft)<{ $isSideEditorOpen: boolean }>`\n will-change: transform;\n rotate: ${(props) => (props.$isSideEditorOpen ? '0deg' : '180deg')};\n transition: rotate 0.2s ease-in-out;\n`;\n\nconst PreviewPage = () => {\n const location = useLocation();\n const { formatMessage } = useIntl();\n const theme = useTheme();\n\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\n const [popoverField, setPopoverField] = React.useState<PopoverField | null>(null);\n const prevPopoverFieldRef = React.useRef<PopoverField | null>(null);\n\n // When the popover closes, ask the iframe to rescan its stega element groups.\n // Live-preview sync updates the iframe DOM while editing, which can change the\n // rendered height of the field; groups need to reflect the current DOM so that\n // hover highlights and double-click detection work on the updated content.\n React.useEffect(() => {\n const prev = prevPopoverFieldRef.current;\n prevPopoverFieldRef.current = popoverField;\n\n if (prev !== null && popoverField === null) {\n const iframe = iframeRef.current;\n if (!iframe?.src) return;\n iframe.contentWindow?.postMessage(\n { type: INTERNAL_EVENTS.STRAPI_RESCAN_HIGHLIGHTS },\n new URL(iframe.src).origin\n );\n }\n }, [popoverField, iframeRef]);\n\n const { toggleNotification } = useNotification();\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: { i18n?: { locale?: string } };\n status?: string;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const [deviceName, setDeviceName] = React.useState<(typeof DEVICES)[number]['name']>(\n DEVICES[0].name\n );\n const device = DEVICES.find((d) => d.name === deviceName) ?? DEVICES[0];\n\n const previewHighlightColors: PreviewHighlightColors = {\n highlightHoverColor: theme.colors.primary500,\n highlightActiveColor: theme.colors.primary600,\n };\n\n // Listen for ready message from iframe before injecting script\n React.useEffect(() => {\n const handleMessage = async (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 === PUBLIC_EVENTS.PREVIEW_READY) {\n try {\n const script = await getPreviewScript(previewHighlightColors);\n\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.preview.error.script-failed',\n defaultMessage:\n 'Could not load the live preview script. Visual editing may not be available.',\n }),\n });\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n // Preserve the existing dependency behavior: previewHighlightColors is derived from theme.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentId, toggleNotification, theme, formatMessage]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale as GetPreviewUrl.Request['query']['locale'],\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n const documentLayoutResponse = useDocumentLayout(model);\n const isLoadingActionsRBAC = useDocumentRBAC('PreviewPage', (state) => state.isLoading);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (\n isLoadingActionsRBAC ||\n (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading))\n ) {\n return <Page.Loading />;\n }\n\n const initialValues = documentResponse.getInitialFormValues();\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema ||\n !initialValues\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n const validateSync = (values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validateSync(cleanedValues, { abortEarly: false });\n };\n\n const previewUrl = previewUrlResponse.data.data.url;\n\n const onPreview = () => {\n iframeRef?.current?.contentWindow?.postMessage(\n { type: 'strapiUpdate' },\n // The iframe origin is safe to use since it must be provided through the allowedOrigins config\n new URL(iframeRef.current.src).origin\n );\n };\n\n const hasAdvancedPreview = window.strapi.features.isEnabled('cms-advanced-preview');\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrl}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n components={documentResponse.components}\n layout={documentLayoutResponse.edit}\n onPreview={onPreview}\n iframeRef={iframeRef}\n popoverField={popoverField}\n setPopoverField={setPopoverField}\n >\n <FormContext\n method=\"PUT\"\n disabled={\n query.status === 'published' &&\n documentResponse &&\n documentResponse.document.status !== 'draft'\n }\n initialValues={documentResponse.getInitialFormValues()}\n initialErrors={location?.state?.forceValidation ? validateSync(initialValues, {}) : {}}\n height=\"100%\"\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validate(cleanedValues, { abortEarly: false });\n }}\n >\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <Blocker />\n <PreviewHeader />\n <InputPopover documentResponse={documentResponse} />\n <Flex flex={1} overflow=\"auto\" alignItems=\"stretch\">\n {hasAdvancedPreview && (\n <Box\n overflow=\"auto\"\n width={isSideEditorOpen ? '50%' : 0}\n borderWidth=\"0 1px 0 0\"\n borderColor=\"neutral150\"\n paddingTop={6}\n paddingBottom={6}\n // Remove horizontal padding when the editor is closed or it won't fully disappear\n paddingLeft={isSideEditorOpen ? 6 : 0}\n paddingRight={isSideEditorOpen ? 6 : 0}\n transition=\"all 0.2s ease-in-out\"\n >\n <FormLayout\n layout={documentLayoutResponse.edit.layout}\n document={documentResponse}\n hasBackground={false}\n />\n </Box>\n )}\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n flex={1}\n height=\"100%\"\n overflow=\"hidden\"\n >\n <Flex\n direction=\"row\"\n background=\"neutral0\"\n padding={2}\n borderWidth=\"0 0 1px 0\"\n borderColor=\"neutral150\"\n >\n {hasAdvancedPreview && (\n <IconButton\n variant=\"ghost\"\n label={formatMessage(\n isSideEditorOpen\n ? {\n id: 'content-manager.preview.content.close-editor',\n defaultMessage: 'Close editor',\n }\n : {\n id: 'content-manager.preview.content.open-editor',\n defaultMessage: 'Open editor',\n }\n )}\n onClick={() => setIsSideEditorOpen((prev) => !prev)}\n >\n <AnimatedArrow $isSideEditorOpen={isSideEditorOpen} />\n </IconButton>\n )}\n <Flex justifyContent=\"center\" flex={1}>\n <SingleSelect\n value={deviceName}\n onChange={(name) => setDeviceName(name.toString())}\n aria-label={formatMessage({\n id: 'content-manager.preview.device.select',\n defaultMessage: 'Select device type',\n })}\n >\n {DEVICES.map((deviceOption) => (\n <SingleSelectOption key={deviceOption.name} value={deviceOption.name}>\n {formatMessage(deviceOption.label)}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Flex>\n </Flex>\n <Flex direction=\"column\" justifyContent=\"center\" background=\"neutral0\" flex={1}>\n <Box\n data-testid=\"preview-iframe\"\n ref={iframeRef}\n src={previewUrl}\n /**\n * For some reason, changing an iframe's src tag causes the browser to add a new item in the\n * history stack. This is an issue for us as it means clicking the back button will not let us\n * go back to the edit view. To fix it, we need to trick the browser into thinking this is a\n * different iframe when the preview URL changes. So we set a key prop to force React\n * to mount a different node when the src changes.\n */\n key={previewUrl}\n title={formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n })}\n width={device.width}\n height={device.height}\n borderWidth={0}\n tag=\"iframe\"\n />\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </FormContext>\n </PreviewProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedPreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedPreviewPageImpl = () => {\n const { slug: model } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC([\n { action: 'plugin::content-manager.explorer.read', subject: model },\n { action: 'plugin::content-manager.explorer.update', subject: model },\n { action: 'plugin::content-manager.explorer.publish', subject: model },\n ]);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !model) {\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Protect\n permissions={permissions.filter((permission) =>\n permission.action.includes('explorer.read')\n )}\n >\n <DocumentRBAC permissions={permissions}>\n <PreviewPage />\n </DocumentRBAC>\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedPreviewPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedPreviewPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedPreviewPage, usePreviewContext };\nexport type { PreviewContextValue };\n"],"names":["DEVICES","name","label","id","defaultMessage","width","height","PreviewProvider","usePreviewContext","createContext","getPreviewScript","previewScript","previewHighlightColors","resp","fetch","window","strapi","backendURL","ok","Error","text","JSON","stringify","colors","events","INTERNAL_EVENTS","parentOrigin","location","origin","AnimatedArrow","styled","ArrowLineLeft","props","$isSideEditorOpen","PreviewPage","useLocation","formatMessage","useIntl","theme","useTheme","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","prevPopoverFieldRef","useEffect","prev","current","iframe","src","contentWindow","postMessage","type","STRAPI_RESCAN_HIGHLIGHTS","URL","toggleNotification","useNotification","slug","model","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","highlightHoverColor","primary500","highlightActiveColor","primary600","handleMessage","event","previewOrigin","data","PUBLIC_EVENTS","PREVIEW_READY","script","sendMessage","getSendMessage","STRAPI_SCRIPT","message","addEventListener","removeEventListener","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","locale","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","isLoadingActionsRBAC","useDocumentRBAC","state","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","url","NoData","documentTitle","getTitle","edit","settings","mainField","validateSync","values","options","cleanedValues","removedAttributes","handleInvisibleAttributes","components","yupSchema","createYupSchema","attributes","abortEarly","previewUrl","onPreview","hasAdvancedPreview","features","isEnabled","_jsxs","_Fragment","Title","title","layout","FormContext","method","disabled","initialErrors","forceValidation","validate","Flex","direction","alignItems","Blocker","PreviewHeader","InputPopover","flex","overflow","Box","borderWidth","borderColor","paddingTop","paddingBottom","paddingLeft","paddingRight","transition","FormLayout","hasBackground","background","padding","IconButton","variant","onClick","justifyContent","SingleSelect","value","onChange","toString","aria-label","map","deviceOption","SingleSelectOption","data-testid","ref","tag","ProtectedPreviewPageImpl","permissions","useRBAC","action","subject","position","top","left","zIndex","Protect","filter","permission","includes","DocumentRBAC","ProtectedPreviewPage","Portal","FocusTrap"],"mappings":"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"}
1
+ {"version":3,"file":"Preview.mjs","sources":["../../../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useQueryParams,\n useRBAC,\n createContext,\n Form as FormContext,\n type FieldContentSourceMap,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled, useTheme } from 'styled-components';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC, useDocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { Blocker } from '../../pages/EditView/components/Blocker';\nimport { FormLayout } from '../../pages/EditView/components/FormLayout';\nimport { handleInvisibleAttributes } from '../../pages/EditView/utils/data';\nimport { getPublishValidationErrors } from '../../pages/EditView/utils/forms';\nimport { buildValidParams } from '../../utils/api';\nimport { createYupSchema } from '../../utils/validation';\nimport { InputPopover } from '../components/InputPopover';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { INTERNAL_EVENTS, PUBLIC_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\nimport type { Schema, UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEVICES = [\n {\n name: 'desktop',\n label: {\n id: 'content-manager.preview.device.desktop',\n defaultMessage: 'Desktop',\n },\n width: '100%',\n height: '100%',\n },\n {\n name: 'mobile',\n label: {\n id: 'content-manager.preview.device.mobile',\n defaultMessage: 'Mobile',\n },\n width: '375px',\n height: '667px',\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverField extends FieldContentSourceMap {\n position: DOMRect;\n attribute: Schema.Attribute.AnyAttribute;\n blockIndex: number | null;\n}\n\ninterface PreviewContextValue {\n url: string;\n title: string;\n document: NonNullable<ReturnType<UseDocument>['document']>;\n meta: NonNullable<ReturnType<UseDocument>['meta']>;\n schema: NonNullable<ReturnType<UseDocument>['schema']>;\n components: NonNullable<ReturnType<UseDocument>['components']>;\n layout: EditLayout;\n onPreview: () => void;\n iframeRef: React.RefObject<HTMLIFrameElement>;\n popoverField: PopoverField | null;\n setPopoverField: (value: PopoverField | null) => void;\n}\n\ntype PreviewHighlightColors = {\n highlightHoverColor: string;\n highlightActiveColor: string;\n};\n\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\n\nconst getPreviewScript = (() => {\n let previewScript = '';\n return async (previewHighlightColors: PreviewHighlightColors) => {\n if (!previewScript) {\n const resp = await fetch(`${window.strapi.backendURL}/content-manager/preview/script`);\n\n if (!resp.ok) {\n throw new Error('Could not retrieve preview script from server.');\n }\n\n previewScript = await resp.text();\n\n if (!previewScript) {\n throw new Error('Could not retrieve preview script from server.');\n }\n }\n\n return `(${previewScript})(${JSON.stringify({\n colors: previewHighlightColors,\n events: INTERNAL_EVENTS,\n parentOrigin: window.location.origin,\n })})`;\n };\n})();\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst AnimatedArrow = styled(ArrowLineLeft)<{ $isSideEditorOpen: boolean }>`\n will-change: transform;\n rotate: ${(props) => (props.$isSideEditorOpen ? '0deg' : '180deg')};\n transition: rotate 0.2s ease-in-out;\n`;\n\nconst PreviewPage = () => {\n const location = useLocation();\n const { formatMessage } = useIntl();\n const theme = useTheme();\n\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\n const [popoverField, setPopoverField] = React.useState<PopoverField | null>(null);\n const prevPopoverFieldRef = React.useRef<PopoverField | null>(null);\n\n // When the popover closes, ask the iframe to rescan its stega element groups.\n // Live-preview sync updates the iframe DOM while editing, which can change the\n // rendered height of the field; groups need to reflect the current DOM so that\n // hover highlights and double-click detection work on the updated content.\n React.useEffect(() => {\n const prev = prevPopoverFieldRef.current;\n prevPopoverFieldRef.current = popoverField;\n\n if (prev !== null && popoverField === null) {\n const iframe = iframeRef.current;\n if (!iframe?.src) return;\n iframe.contentWindow?.postMessage(\n { type: INTERNAL_EVENTS.STRAPI_RESCAN_HIGHLIGHTS },\n new URL(iframe.src).origin\n );\n }\n }, [popoverField, iframeRef]);\n\n const { toggleNotification } = useNotification();\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: { i18n?: { locale?: string } };\n status?: string;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const [deviceName, setDeviceName] = React.useState<(typeof DEVICES)[number]['name']>(\n DEVICES[0].name\n );\n const device = DEVICES.find((d) => d.name === deviceName) ?? DEVICES[0];\n\n const previewHighlightColors: PreviewHighlightColors = {\n highlightHoverColor: theme.colors.primary500,\n highlightActiveColor: theme.colors.primary600,\n };\n\n // Listen for ready message from iframe before injecting script\n React.useEffect(() => {\n const handleMessage = async (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 === PUBLIC_EVENTS.PREVIEW_READY) {\n try {\n const script = await getPreviewScript(previewHighlightColors);\n\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.preview.error.script-failed',\n defaultMessage:\n 'Could not load the live preview script. Visual editing may not be available.',\n }),\n });\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n // Preserve the existing dependency behavior: previewHighlightColors is derived from theme.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentId, toggleNotification, theme, formatMessage]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale as GetPreviewUrl.Request['query']['locale'],\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n const documentLayoutResponse = useDocumentLayout(model);\n const isLoadingActionsRBAC = useDocumentRBAC('PreviewPage', (state) => state.isLoading);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (\n isLoadingActionsRBAC ||\n (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading))\n ) {\n return <Page.Loading />;\n }\n\n const initialValues = documentResponse.getInitialFormValues();\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema ||\n !initialValues\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n const previewUrl = previewUrlResponse.data.data.url;\n\n const onPreview = () => {\n iframeRef?.current?.contentWindow?.postMessage(\n { type: 'strapiUpdate' },\n // The iframe origin is safe to use since it must be provided through the allowedOrigins config\n new URL(iframeRef.current.src).origin\n );\n };\n\n const hasAdvancedPreview = window.strapi.features.isEnabled('cms-advanced-preview');\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrl}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n components={documentResponse.components}\n layout={documentLayoutResponse.edit}\n onPreview={onPreview}\n iframeRef={iframeRef}\n popoverField={popoverField}\n setPopoverField={setPopoverField}\n >\n <FormContext\n method=\"PUT\"\n disabled={\n query.status === 'published' &&\n documentResponse &&\n documentResponse.document.status !== 'draft'\n }\n initialValues={documentResponse.getInitialFormValues()}\n initialErrors={\n location?.state?.forceValidation\n ? getPublishValidationErrors(initialValues, {\n schema: documentResponse.schema,\n components: documentResponse.components,\n })\n : {}\n }\n height=\"100%\"\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validate(cleanedValues, { abortEarly: false });\n }}\n >\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <Blocker />\n <PreviewHeader />\n <InputPopover documentResponse={documentResponse} />\n <Flex flex={1} overflow=\"auto\" alignItems=\"stretch\">\n {hasAdvancedPreview && (\n <Box\n overflow=\"auto\"\n width={isSideEditorOpen ? '50%' : 0}\n borderWidth=\"0 1px 0 0\"\n borderColor=\"neutral150\"\n paddingTop={6}\n paddingBottom={6}\n // Remove horizontal padding when the editor is closed or it won't fully disappear\n paddingLeft={isSideEditorOpen ? 6 : 0}\n paddingRight={isSideEditorOpen ? 6 : 0}\n transition=\"all 0.2s ease-in-out\"\n >\n <FormLayout\n layout={documentLayoutResponse.edit.layout}\n document={documentResponse}\n hasBackground={false}\n />\n </Box>\n )}\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n flex={1}\n height=\"100%\"\n overflow=\"hidden\"\n >\n <Flex\n direction=\"row\"\n background=\"neutral0\"\n padding={2}\n borderWidth=\"0 0 1px 0\"\n borderColor=\"neutral150\"\n >\n {hasAdvancedPreview && (\n <IconButton\n variant=\"ghost\"\n label={formatMessage(\n isSideEditorOpen\n ? {\n id: 'content-manager.preview.content.close-editor',\n defaultMessage: 'Close editor',\n }\n : {\n id: 'content-manager.preview.content.open-editor',\n defaultMessage: 'Open editor',\n }\n )}\n onClick={() => setIsSideEditorOpen((prev) => !prev)}\n >\n <AnimatedArrow $isSideEditorOpen={isSideEditorOpen} />\n </IconButton>\n )}\n <Flex justifyContent=\"center\" flex={1}>\n <SingleSelect\n value={deviceName}\n onChange={(name) => setDeviceName(name.toString())}\n aria-label={formatMessage({\n id: 'content-manager.preview.device.select',\n defaultMessage: 'Select device type',\n })}\n >\n {DEVICES.map((deviceOption) => (\n <SingleSelectOption key={deviceOption.name} value={deviceOption.name}>\n {formatMessage(deviceOption.label)}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Flex>\n </Flex>\n <Flex direction=\"column\" justifyContent=\"center\" background=\"neutral0\" flex={1}>\n <Box\n data-testid=\"preview-iframe\"\n ref={iframeRef}\n src={previewUrl}\n /**\n * For some reason, changing an iframe's src tag causes the browser to add a new item in the\n * history stack. This is an issue for us as it means clicking the back button will not let us\n * go back to the edit view. To fix it, we need to trick the browser into thinking this is a\n * different iframe when the preview URL changes. So we set a key prop to force React\n * to mount a different node when the src changes.\n */\n key={previewUrl}\n title={formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n })}\n width={device.width}\n height={device.height}\n borderWidth={0}\n tag=\"iframe\"\n />\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </FormContext>\n </PreviewProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedPreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedPreviewPageImpl = () => {\n const { slug: model } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC([\n { action: 'plugin::content-manager.explorer.read', subject: model },\n { action: 'plugin::content-manager.explorer.update', subject: model },\n { action: 'plugin::content-manager.explorer.publish', subject: model },\n ]);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !model) {\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Protect\n permissions={permissions.filter((permission) =>\n permission.action.includes('explorer.read')\n )}\n >\n <DocumentRBAC permissions={permissions}>\n <PreviewPage />\n </DocumentRBAC>\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedPreviewPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedPreviewPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedPreviewPage, usePreviewContext };\nexport type { PreviewContextValue };\n"],"names":["DEVICES","name","label","id","defaultMessage","width","height","PreviewProvider","usePreviewContext","createContext","getPreviewScript","previewScript","previewHighlightColors","resp","fetch","window","strapi","backendURL","ok","Error","text","JSON","stringify","colors","events","INTERNAL_EVENTS","parentOrigin","location","origin","AnimatedArrow","styled","ArrowLineLeft","props","$isSideEditorOpen","PreviewPage","useLocation","formatMessage","useIntl","theme","useTheme","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","prevPopoverFieldRef","useEffect","prev","current","iframe","src","contentWindow","postMessage","type","STRAPI_RESCAN_HIGHLIGHTS","URL","toggleNotification","useNotification","slug","model","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","highlightHoverColor","primary500","highlightActiveColor","primary600","handleMessage","event","previewOrigin","data","PUBLIC_EVENTS","PREVIEW_READY","script","sendMessage","getSendMessage","STRAPI_SCRIPT","message","addEventListener","removeEventListener","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","locale","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","isLoadingActionsRBAC","useDocumentRBAC","state","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","url","NoData","documentTitle","getTitle","edit","settings","mainField","previewUrl","onPreview","hasAdvancedPreview","features","isEnabled","_jsxs","_Fragment","Title","title","components","layout","FormContext","method","disabled","initialErrors","forceValidation","getPublishValidationErrors","validate","values","options","cleanedValues","removedAttributes","handleInvisibleAttributes","yupSchema","createYupSchema","attributes","abortEarly","Flex","direction","alignItems","Blocker","PreviewHeader","InputPopover","flex","overflow","Box","borderWidth","borderColor","paddingTop","paddingBottom","paddingLeft","paddingRight","transition","FormLayout","hasBackground","background","padding","IconButton","variant","onClick","justifyContent","SingleSelect","value","onChange","toString","aria-label","map","deviceOption","SingleSelectOption","data-testid","ref","tag","ProtectedPreviewPageImpl","permissions","useRBAC","action","subject","position","top","left","zIndex","Protect","filter","permission","includes","DocumentRBAC","ProtectedPreviewPage","Portal","FocusTrap"],"mappings":"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"}
@@ -37,6 +37,7 @@ const parsePathWithIndices = (path)=>{
37
37
  return acc;
38
38
  }, []);
39
39
  };
40
+ const getComponentLevelFromPath = (path)=>parsePathWithIndices(path).length > 1 ? 0 : -1;
40
41
  function getAttributeSchemaFromPath({ path, schema, components, document }) {
41
42
  /**
42
43
  * Create the function that will be recursively called.
@@ -102,6 +103,7 @@ function parseFieldMetaData(strapiSource) {
102
103
 
103
104
  exports.PreviewFieldError = PreviewFieldError;
104
105
  exports.getAttributeSchemaFromPath = getAttributeSchemaFromPath;
106
+ exports.getComponentLevelFromPath = getComponentLevelFromPath;
105
107
  exports.parseFieldMetaData = parseFieldMetaData;
106
108
  exports.parsePathWithIndices = parsePathWithIndices;
107
109
  //# sourceMappingURL=fieldUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fieldUtils.js","sources":["../../../../admin/src/preview/utils/fieldUtils.ts"],"sourcesContent":["import { type FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nimport type { PREVIEW_ERROR_MESSAGES } from './constants';\nimport type { PreviewContextValue } from '../pages/Preview';\nimport type { Modules, Schema, Struct, UID } from '@strapi/types';\n\ntype PreviewErrorMessage = keyof typeof PREVIEW_ERROR_MESSAGES;\ntype FieldData = Record<string, unknown>;\n\n// Generic error class for preview field operations\nexport class PreviewFieldError extends Error {\n public readonly messageKey: PreviewErrorMessage;\n\n constructor(messageKey: PreviewErrorMessage) {\n super(messageKey);\n this.name = 'PreviewFieldError';\n this.messageKey = messageKey;\n }\n}\n\ntype PathPart = { name: string; index?: number };\n\n// Helper function to parse path with array indices and return clean attribute names\nexport const parsePathWithIndices = (path: string): PathPart[] => {\n // Split by dots, then parse array indices from each part. For example:\n // input \"components.4.field.relations.2.name\"\n // output [{name: \"components\", index: 4}, {name: \"field\"}, {name: \"relations\", index: 2}, {name: \"name\"}]\n return path\n .split('.')\n .map((part) => {\n const numericIndex = parseInt(part, 10);\n if (!isNaN(numericIndex) && part === numericIndex.toString()) {\n // This part is a pure numeric index, return it as an index for the previous part\n return { name: '', index: numericIndex };\n }\n return { name: part };\n })\n .reduce((acc: PathPart[], part) => {\n if (part.name === '' && part.index !== undefined) {\n // This is an index, attach it to the previous part\n if (acc.length > 0) {\n acc[acc.length - 1].index = part.index;\n }\n } else {\n acc.push(part);\n }\n return acc;\n }, []);\n};\n\nexport function getAttributeSchemaFromPath({\n path,\n schema,\n components,\n document,\n}: {\n path: string;\n schema: PreviewContextValue['schema'] | PreviewContextValue['components'][string];\n components: PreviewContextValue['components'];\n document: Modules.Documents.AnyDocument;\n}): Schema.Attribute.AnyAttribute {\n /**\n * Create the function that will be recursively called.\n * We don't do recursion on getAttributeSchemaFromPath itself because:\n * - it takes a path string, not the parsed array that's better for recursion\n * - even when several levels deep, we still need access to the root schema and components\n */\n const visitor = (\n currentPathParts: PathPart[],\n currentAttributes: Schema.Attributes,\n currentData: FieldData\n ): Schema.Attribute.AnyAttribute => {\n const [currentPart, ...remainingParts] = currentPathParts;\n\n // Get the data and schema for the current path\n const currentAttribute = currentAttributes[currentPart.name];\n\n if (!currentAttribute) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n if (currentAttribute.type === 'relation') {\n throw new PreviewFieldError('RELATIONS_NOT_HANDLED');\n }\n\n if (currentAttribute.type === 'component') {\n const componentAttributes = components[currentAttribute.component].attributes;\n if (currentAttribute.repeatable) {\n // We must have the index, otherwise we don't know what data to use\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n return visitor(\n remainingParts,\n componentAttributes,\n (currentData[currentPart.name] as FieldData[])[currentPart.index]\n );\n }\n\n // Non repeatable component\n return visitor(\n remainingParts,\n componentAttributes,\n currentData[currentPart.name] as FieldData\n );\n }\n\n if (currentAttribute.type === 'dynamiczone') {\n // We must have the index, otherwise we don't know what component we're dealing with\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n const componentData = (currentData[currentPart.name] as FieldData[])[currentPart.index];\n const componentAttributes = components[componentData.__component as UID.Component].attributes;\n return visitor(remainingParts, componentAttributes, componentData);\n }\n\n // Plain regular field. It ends the recursion\n return currentAttributes[currentPart.name];\n };\n\n return visitor(parsePathWithIndices(path), schema.attributes, document as FieldData);\n}\n\nexport function parseFieldMetaData(strapiSource: string): FieldContentSourceMap | null {\n const searchParams = new URLSearchParams(strapiSource);\n const path = searchParams.get('path');\n const type = searchParams.get('type');\n const documentId = searchParams.get('documentId');\n const locale = searchParams.get('locale');\n const model = searchParams.get('model');\n const kind = searchParams.get('kind');\n\n if (!path || !type || !documentId || !model) {\n return null;\n }\n\n return {\n path,\n type: type as Schema.Attribute.AnyAttribute['type'],\n documentId,\n locale: locale ?? null,\n model: model as UID.Schema | undefined,\n kind: kind ? (kind as Struct.ContentTypeKind) : undefined,\n };\n}\n"],"names":["PreviewFieldError","Error","messageKey","name","parsePathWithIndices","path","split","map","part","numericIndex","parseInt","isNaN","toString","index","reduce","acc","undefined","length","push","getAttributeSchemaFromPath","schema","components","document","visitor","currentPathParts","currentAttributes","currentData","currentPart","remainingParts","currentAttribute","type","componentAttributes","component","attributes","repeatable","componentData","__component","parseFieldMetaData","strapiSource","searchParams","URLSearchParams","get","documentId","locale","model","kind"],"mappings":"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"}
1
+ {"version":3,"file":"fieldUtils.js","sources":["../../../../admin/src/preview/utils/fieldUtils.ts"],"sourcesContent":["import { type FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nimport type { PREVIEW_ERROR_MESSAGES } from './constants';\nimport type { PreviewContextValue } from '../pages/Preview';\nimport type { Modules, Schema, Struct, UID } from '@strapi/types';\n\ntype PreviewErrorMessage = keyof typeof PREVIEW_ERROR_MESSAGES;\ntype FieldData = Record<string, unknown>;\n\n// Generic error class for preview field operations\nexport class PreviewFieldError extends Error {\n public readonly messageKey: PreviewErrorMessage;\n\n constructor(messageKey: PreviewErrorMessage) {\n super(messageKey);\n this.name = 'PreviewFieldError';\n this.messageKey = messageKey;\n }\n}\n\ntype PathPart = { name: string; index?: number };\n\n// Helper function to parse path with array indices and return clean attribute names\nexport const parsePathWithIndices = (path: string): PathPart[] => {\n // Split by dots, then parse array indices from each part. For example:\n // input \"components.4.field.relations.2.name\"\n // output [{name: \"components\", index: 4}, {name: \"field\"}, {name: \"relations\", index: 2}, {name: \"name\"}]\n return path\n .split('.')\n .map((part) => {\n const numericIndex = parseInt(part, 10);\n if (!isNaN(numericIndex) && part === numericIndex.toString()) {\n // This part is a pure numeric index, return it as an index for the previous part\n return { name: '', index: numericIndex };\n }\n return { name: part };\n })\n .reduce((acc: PathPart[], part) => {\n if (part.name === '' && part.index !== undefined) {\n // This is an index, attach it to the previous part\n if (acc.length > 0) {\n acc[acc.length - 1].index = part.index;\n }\n } else {\n acc.push(part);\n }\n return acc;\n }, []);\n};\n\nexport const getComponentLevelFromPath = (path: string) =>\n parsePathWithIndices(path).length > 1 ? 0 : -1;\n\nexport function getAttributeSchemaFromPath({\n path,\n schema,\n components,\n document,\n}: {\n path: string;\n schema: PreviewContextValue['schema'] | PreviewContextValue['components'][string];\n components: PreviewContextValue['components'];\n document: Modules.Documents.AnyDocument;\n}): Schema.Attribute.AnyAttribute {\n /**\n * Create the function that will be recursively called.\n * We don't do recursion on getAttributeSchemaFromPath itself because:\n * - it takes a path string, not the parsed array that's better for recursion\n * - even when several levels deep, we still need access to the root schema and components\n */\n const visitor = (\n currentPathParts: PathPart[],\n currentAttributes: Schema.Attributes,\n currentData: FieldData\n ): Schema.Attribute.AnyAttribute => {\n const [currentPart, ...remainingParts] = currentPathParts;\n\n // Get the data and schema for the current path\n const currentAttribute = currentAttributes[currentPart.name];\n\n if (!currentAttribute) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n if (currentAttribute.type === 'relation') {\n throw new PreviewFieldError('RELATIONS_NOT_HANDLED');\n }\n\n if (currentAttribute.type === 'component') {\n const componentAttributes = components[currentAttribute.component].attributes;\n if (currentAttribute.repeatable) {\n // We must have the index, otherwise we don't know what data to use\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n return visitor(\n remainingParts,\n componentAttributes,\n (currentData[currentPart.name] as FieldData[])[currentPart.index]\n );\n }\n\n // Non repeatable component\n return visitor(\n remainingParts,\n componentAttributes,\n currentData[currentPart.name] as FieldData\n );\n }\n\n if (currentAttribute.type === 'dynamiczone') {\n // We must have the index, otherwise we don't know what component we're dealing with\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n const componentData = (currentData[currentPart.name] as FieldData[])[currentPart.index];\n const componentAttributes = components[componentData.__component as UID.Component].attributes;\n return visitor(remainingParts, componentAttributes, componentData);\n }\n\n // Plain regular field. It ends the recursion\n return currentAttributes[currentPart.name];\n };\n\n return visitor(parsePathWithIndices(path), schema.attributes, document as FieldData);\n}\n\nexport function parseFieldMetaData(strapiSource: string): FieldContentSourceMap | null {\n const searchParams = new URLSearchParams(strapiSource);\n const path = searchParams.get('path');\n const type = searchParams.get('type');\n const documentId = searchParams.get('documentId');\n const locale = searchParams.get('locale');\n const model = searchParams.get('model');\n const kind = searchParams.get('kind');\n\n if (!path || !type || !documentId || !model) {\n return null;\n }\n\n return {\n path,\n type: type as Schema.Attribute.AnyAttribute['type'],\n documentId,\n locale: locale ?? null,\n model: model as UID.Schema | undefined,\n kind: kind ? (kind as Struct.ContentTypeKind) : undefined,\n };\n}\n"],"names":["PreviewFieldError","Error","messageKey","name","parsePathWithIndices","path","split","map","part","numericIndex","parseInt","isNaN","toString","index","reduce","acc","undefined","length","push","getComponentLevelFromPath","getAttributeSchemaFromPath","schema","components","document","visitor","currentPathParts","currentAttributes","currentData","currentPart","remainingParts","currentAttribute","type","componentAttributes","component","attributes","repeatable","componentData","__component","parseFieldMetaData","strapiSource","searchParams","URLSearchParams","get","documentId","locale","model","kind"],"mappings":"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"}
@@ -35,6 +35,7 @@ const parsePathWithIndices = (path)=>{
35
35
  return acc;
36
36
  }, []);
37
37
  };
38
+ const getComponentLevelFromPath = (path)=>parsePathWithIndices(path).length > 1 ? 0 : -1;
38
39
  function getAttributeSchemaFromPath({ path, schema, components, document }) {
39
40
  /**
40
41
  * Create the function that will be recursively called.
@@ -98,5 +99,5 @@ function parseFieldMetaData(strapiSource) {
98
99
  };
99
100
  }
100
101
 
101
- export { PreviewFieldError, getAttributeSchemaFromPath, parseFieldMetaData, parsePathWithIndices };
102
+ export { PreviewFieldError, getAttributeSchemaFromPath, getComponentLevelFromPath, parseFieldMetaData, parsePathWithIndices };
102
103
  //# sourceMappingURL=fieldUtils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fieldUtils.mjs","sources":["../../../../admin/src/preview/utils/fieldUtils.ts"],"sourcesContent":["import { type FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nimport type { PREVIEW_ERROR_MESSAGES } from './constants';\nimport type { PreviewContextValue } from '../pages/Preview';\nimport type { Modules, Schema, Struct, UID } from '@strapi/types';\n\ntype PreviewErrorMessage = keyof typeof PREVIEW_ERROR_MESSAGES;\ntype FieldData = Record<string, unknown>;\n\n// Generic error class for preview field operations\nexport class PreviewFieldError extends Error {\n public readonly messageKey: PreviewErrorMessage;\n\n constructor(messageKey: PreviewErrorMessage) {\n super(messageKey);\n this.name = 'PreviewFieldError';\n this.messageKey = messageKey;\n }\n}\n\ntype PathPart = { name: string; index?: number };\n\n// Helper function to parse path with array indices and return clean attribute names\nexport const parsePathWithIndices = (path: string): PathPart[] => {\n // Split by dots, then parse array indices from each part. For example:\n // input \"components.4.field.relations.2.name\"\n // output [{name: \"components\", index: 4}, {name: \"field\"}, {name: \"relations\", index: 2}, {name: \"name\"}]\n return path\n .split('.')\n .map((part) => {\n const numericIndex = parseInt(part, 10);\n if (!isNaN(numericIndex) && part === numericIndex.toString()) {\n // This part is a pure numeric index, return it as an index for the previous part\n return { name: '', index: numericIndex };\n }\n return { name: part };\n })\n .reduce((acc: PathPart[], part) => {\n if (part.name === '' && part.index !== undefined) {\n // This is an index, attach it to the previous part\n if (acc.length > 0) {\n acc[acc.length - 1].index = part.index;\n }\n } else {\n acc.push(part);\n }\n return acc;\n }, []);\n};\n\nexport function getAttributeSchemaFromPath({\n path,\n schema,\n components,\n document,\n}: {\n path: string;\n schema: PreviewContextValue['schema'] | PreviewContextValue['components'][string];\n components: PreviewContextValue['components'];\n document: Modules.Documents.AnyDocument;\n}): Schema.Attribute.AnyAttribute {\n /**\n * Create the function that will be recursively called.\n * We don't do recursion on getAttributeSchemaFromPath itself because:\n * - it takes a path string, not the parsed array that's better for recursion\n * - even when several levels deep, we still need access to the root schema and components\n */\n const visitor = (\n currentPathParts: PathPart[],\n currentAttributes: Schema.Attributes,\n currentData: FieldData\n ): Schema.Attribute.AnyAttribute => {\n const [currentPart, ...remainingParts] = currentPathParts;\n\n // Get the data and schema for the current path\n const currentAttribute = currentAttributes[currentPart.name];\n\n if (!currentAttribute) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n if (currentAttribute.type === 'relation') {\n throw new PreviewFieldError('RELATIONS_NOT_HANDLED');\n }\n\n if (currentAttribute.type === 'component') {\n const componentAttributes = components[currentAttribute.component].attributes;\n if (currentAttribute.repeatable) {\n // We must have the index, otherwise we don't know what data to use\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n return visitor(\n remainingParts,\n componentAttributes,\n (currentData[currentPart.name] as FieldData[])[currentPart.index]\n );\n }\n\n // Non repeatable component\n return visitor(\n remainingParts,\n componentAttributes,\n currentData[currentPart.name] as FieldData\n );\n }\n\n if (currentAttribute.type === 'dynamiczone') {\n // We must have the index, otherwise we don't know what component we're dealing with\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n const componentData = (currentData[currentPart.name] as FieldData[])[currentPart.index];\n const componentAttributes = components[componentData.__component as UID.Component].attributes;\n return visitor(remainingParts, componentAttributes, componentData);\n }\n\n // Plain regular field. It ends the recursion\n return currentAttributes[currentPart.name];\n };\n\n return visitor(parsePathWithIndices(path), schema.attributes, document as FieldData);\n}\n\nexport function parseFieldMetaData(strapiSource: string): FieldContentSourceMap | null {\n const searchParams = new URLSearchParams(strapiSource);\n const path = searchParams.get('path');\n const type = searchParams.get('type');\n const documentId = searchParams.get('documentId');\n const locale = searchParams.get('locale');\n const model = searchParams.get('model');\n const kind = searchParams.get('kind');\n\n if (!path || !type || !documentId || !model) {\n return null;\n }\n\n return {\n path,\n type: type as Schema.Attribute.AnyAttribute['type'],\n documentId,\n locale: locale ?? null,\n model: model as UID.Schema | undefined,\n kind: kind ? (kind as Struct.ContentTypeKind) : undefined,\n };\n}\n"],"names":["PreviewFieldError","Error","messageKey","name","parsePathWithIndices","path","split","map","part","numericIndex","parseInt","isNaN","toString","index","reduce","acc","undefined","length","push","getAttributeSchemaFromPath","schema","components","document","visitor","currentPathParts","currentAttributes","currentData","currentPart","remainingParts","currentAttribute","type","componentAttributes","component","attributes","repeatable","componentData","__component","parseFieldMetaData","strapiSource","searchParams","URLSearchParams","get","documentId","locale","model","kind"],"mappings":"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"}
1
+ {"version":3,"file":"fieldUtils.mjs","sources":["../../../../admin/src/preview/utils/fieldUtils.ts"],"sourcesContent":["import { type FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nimport type { PREVIEW_ERROR_MESSAGES } from './constants';\nimport type { PreviewContextValue } from '../pages/Preview';\nimport type { Modules, Schema, Struct, UID } from '@strapi/types';\n\ntype PreviewErrorMessage = keyof typeof PREVIEW_ERROR_MESSAGES;\ntype FieldData = Record<string, unknown>;\n\n// Generic error class for preview field operations\nexport class PreviewFieldError extends Error {\n public readonly messageKey: PreviewErrorMessage;\n\n constructor(messageKey: PreviewErrorMessage) {\n super(messageKey);\n this.name = 'PreviewFieldError';\n this.messageKey = messageKey;\n }\n}\n\ntype PathPart = { name: string; index?: number };\n\n// Helper function to parse path with array indices and return clean attribute names\nexport const parsePathWithIndices = (path: string): PathPart[] => {\n // Split by dots, then parse array indices from each part. For example:\n // input \"components.4.field.relations.2.name\"\n // output [{name: \"components\", index: 4}, {name: \"field\"}, {name: \"relations\", index: 2}, {name: \"name\"}]\n return path\n .split('.')\n .map((part) => {\n const numericIndex = parseInt(part, 10);\n if (!isNaN(numericIndex) && part === numericIndex.toString()) {\n // This part is a pure numeric index, return it as an index for the previous part\n return { name: '', index: numericIndex };\n }\n return { name: part };\n })\n .reduce((acc: PathPart[], part) => {\n if (part.name === '' && part.index !== undefined) {\n // This is an index, attach it to the previous part\n if (acc.length > 0) {\n acc[acc.length - 1].index = part.index;\n }\n } else {\n acc.push(part);\n }\n return acc;\n }, []);\n};\n\nexport const getComponentLevelFromPath = (path: string) =>\n parsePathWithIndices(path).length > 1 ? 0 : -1;\n\nexport function getAttributeSchemaFromPath({\n path,\n schema,\n components,\n document,\n}: {\n path: string;\n schema: PreviewContextValue['schema'] | PreviewContextValue['components'][string];\n components: PreviewContextValue['components'];\n document: Modules.Documents.AnyDocument;\n}): Schema.Attribute.AnyAttribute {\n /**\n * Create the function that will be recursively called.\n * We don't do recursion on getAttributeSchemaFromPath itself because:\n * - it takes a path string, not the parsed array that's better for recursion\n * - even when several levels deep, we still need access to the root schema and components\n */\n const visitor = (\n currentPathParts: PathPart[],\n currentAttributes: Schema.Attributes,\n currentData: FieldData\n ): Schema.Attribute.AnyAttribute => {\n const [currentPart, ...remainingParts] = currentPathParts;\n\n // Get the data and schema for the current path\n const currentAttribute = currentAttributes[currentPart.name];\n\n if (!currentAttribute) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n if (currentAttribute.type === 'relation') {\n throw new PreviewFieldError('RELATIONS_NOT_HANDLED');\n }\n\n if (currentAttribute.type === 'component') {\n const componentAttributes = components[currentAttribute.component].attributes;\n if (currentAttribute.repeatable) {\n // We must have the index, otherwise we don't know what data to use\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n return visitor(\n remainingParts,\n componentAttributes,\n (currentData[currentPart.name] as FieldData[])[currentPart.index]\n );\n }\n\n // Non repeatable component\n return visitor(\n remainingParts,\n componentAttributes,\n currentData[currentPart.name] as FieldData\n );\n }\n\n if (currentAttribute.type === 'dynamiczone') {\n // We must have the index, otherwise we don't know what component we're dealing with\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n const componentData = (currentData[currentPart.name] as FieldData[])[currentPart.index];\n const componentAttributes = components[componentData.__component as UID.Component].attributes;\n return visitor(remainingParts, componentAttributes, componentData);\n }\n\n // Plain regular field. It ends the recursion\n return currentAttributes[currentPart.name];\n };\n\n return visitor(parsePathWithIndices(path), schema.attributes, document as FieldData);\n}\n\nexport function parseFieldMetaData(strapiSource: string): FieldContentSourceMap | null {\n const searchParams = new URLSearchParams(strapiSource);\n const path = searchParams.get('path');\n const type = searchParams.get('type');\n const documentId = searchParams.get('documentId');\n const locale = searchParams.get('locale');\n const model = searchParams.get('model');\n const kind = searchParams.get('kind');\n\n if (!path || !type || !documentId || !model) {\n return null;\n }\n\n return {\n path,\n type: type as Schema.Attribute.AnyAttribute['type'],\n documentId,\n locale: locale ?? null,\n model: model as UID.Schema | undefined,\n kind: kind ? (kind as Struct.ContentTypeKind) : undefined,\n };\n}\n"],"names":["PreviewFieldError","Error","messageKey","name","parsePathWithIndices","path","split","map","part","numericIndex","parseInt","isNaN","toString","index","reduce","acc","undefined","length","push","getComponentLevelFromPath","getAttributeSchemaFromPath","schema","components","document","visitor","currentPathParts","currentAttributes","currentData","currentPart","remainingParts","currentAttribute","type","componentAttributes","component","attributes","repeatable","componentData","__component","parseFieldMetaData","strapiSource","searchParams","URLSearchParams","get","documentId","locale","model","kind"],"mappings":"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"}
@@ -16,7 +16,8 @@ const contentManagerApi = strapiAdmin.adminApi.enhanceEndpoints({
16
16
  'GuidedTourMeta',
17
17
  'CountDocuments',
18
18
  'UpcomingReleasesList',
19
- 'AILocalizationJobs'
19
+ 'AILocalizationJobs',
20
+ 'Locale'
20
21
  ]
21
22
  });
22
23
 
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sources":["../../../admin/src/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nconst contentManagerApi = adminApi.enhanceEndpoints({\n addTagTypes: [\n 'ComponentConfiguration',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'Document',\n 'InitialData',\n 'HistoryVersion',\n 'Relations',\n 'UidAvailability',\n 'RecentDocumentList',\n 'GuidedTourMeta',\n 'CountDocuments',\n 'UpcomingReleasesList',\n 'AILocalizationJobs',\n ],\n});\n\nexport { contentManagerApi };\n"],"names":["contentManagerApi","adminApi","enhanceEndpoints","addTagTypes"],"mappings":";;;;AAEA,MAAMA,iBAAAA,GAAoBC,oBAAAA,CAASC,gBAAgB,CAAC;IAClDC,WAAAA,EAAa;AACX,QAAA,wBAAA;AACA,QAAA,2BAAA;AACA,QAAA,qBAAA;AACA,QAAA,UAAA;AACA,QAAA,aAAA;AACA,QAAA,gBAAA;AACA,QAAA,WAAA;AACA,QAAA,iBAAA;AACA,QAAA,oBAAA;AACA,QAAA,gBAAA;AACA,QAAA,gBAAA;AACA,QAAA,sBAAA;AACA,QAAA;AACD;AACH,CAAA;;;;"}
1
+ {"version":3,"file":"api.js","sources":["../../../admin/src/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nconst contentManagerApi = adminApi.enhanceEndpoints({\n addTagTypes: [\n 'ComponentConfiguration',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'Document',\n 'InitialData',\n 'HistoryVersion',\n 'Relations',\n 'UidAvailability',\n 'RecentDocumentList',\n 'GuidedTourMeta',\n 'CountDocuments',\n 'UpcomingReleasesList',\n 'AILocalizationJobs',\n 'Locale',\n ],\n});\n\nexport { contentManagerApi };\n"],"names":["contentManagerApi","adminApi","enhanceEndpoints","addTagTypes"],"mappings":";;;;AAEA,MAAMA,iBAAAA,GAAoBC,oBAAAA,CAASC,gBAAgB,CAAC;IAClDC,WAAAA,EAAa;AACX,QAAA,wBAAA;AACA,QAAA,2BAAA;AACA,QAAA,qBAAA;AACA,QAAA,UAAA;AACA,QAAA,aAAA;AACA,QAAA,gBAAA;AACA,QAAA,WAAA;AACA,QAAA,iBAAA;AACA,QAAA,oBAAA;AACA,QAAA,gBAAA;AACA,QAAA,gBAAA;AACA,QAAA,sBAAA;AACA,QAAA,oBAAA;AACA,QAAA;AACD;AACH,CAAA;;;;"}
@@ -14,7 +14,8 @@ const contentManagerApi = adminApi.enhanceEndpoints({
14
14
  'GuidedTourMeta',
15
15
  'CountDocuments',
16
16
  'UpcomingReleasesList',
17
- 'AILocalizationJobs'
17
+ 'AILocalizationJobs',
18
+ 'Locale'
18
19
  ]
19
20
  });
20
21
 
@@ -1 +1 @@
1
- {"version":3,"file":"api.mjs","sources":["../../../admin/src/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nconst contentManagerApi = adminApi.enhanceEndpoints({\n addTagTypes: [\n 'ComponentConfiguration',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'Document',\n 'InitialData',\n 'HistoryVersion',\n 'Relations',\n 'UidAvailability',\n 'RecentDocumentList',\n 'GuidedTourMeta',\n 'CountDocuments',\n 'UpcomingReleasesList',\n 'AILocalizationJobs',\n ],\n});\n\nexport { contentManagerApi };\n"],"names":["contentManagerApi","adminApi","enhanceEndpoints","addTagTypes"],"mappings":";;AAEA,MAAMA,iBAAAA,GAAoBC,QAAAA,CAASC,gBAAgB,CAAC;IAClDC,WAAAA,EAAa;AACX,QAAA,wBAAA;AACA,QAAA,2BAAA;AACA,QAAA,qBAAA;AACA,QAAA,UAAA;AACA,QAAA,aAAA;AACA,QAAA,gBAAA;AACA,QAAA,WAAA;AACA,QAAA,iBAAA;AACA,QAAA,oBAAA;AACA,QAAA,gBAAA;AACA,QAAA,gBAAA;AACA,QAAA,sBAAA;AACA,QAAA;AACD;AACH,CAAA;;;;"}
1
+ {"version":3,"file":"api.mjs","sources":["../../../admin/src/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nconst contentManagerApi = adminApi.enhanceEndpoints({\n addTagTypes: [\n 'ComponentConfiguration',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'Document',\n 'InitialData',\n 'HistoryVersion',\n 'Relations',\n 'UidAvailability',\n 'RecentDocumentList',\n 'GuidedTourMeta',\n 'CountDocuments',\n 'UpcomingReleasesList',\n 'AILocalizationJobs',\n 'Locale',\n ],\n});\n\nexport { contentManagerApi };\n"],"names":["contentManagerApi","adminApi","enhanceEndpoints","addTagTypes"],"mappings":";;AAEA,MAAMA,iBAAAA,GAAoBC,QAAAA,CAASC,gBAAgB,CAAC;IAClDC,WAAAA,EAAa;AACX,QAAA,wBAAA;AACA,QAAA,2BAAA;AACA,QAAA,qBAAA;AACA,QAAA,UAAA;AACA,QAAA,aAAA;AACA,QAAA,gBAAA;AACA,QAAA,WAAA;AACA,QAAA,iBAAA;AACA,QAAA,oBAAA;AACA,QAAA,gBAAA;AACA,QAAA,gBAAA;AACA,QAAA,sBAAA;AACA,QAAA,oBAAA;AACA,QAAA;AACD;AACH,CAAA;;;;"}