@strapi/content-manager 5.49.0 → 5.50.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 (228) hide show
  1. package/dist/admin/layout.js +3 -1
  2. package/dist/admin/layout.js.map +1 -1
  3. package/dist/admin/layout.mjs +5 -3
  4. package/dist/admin/layout.mjs.map +1 -1
  5. package/dist/admin/pages/EditView/components/DocumentActions.js +161 -72
  6. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  7. package/dist/admin/pages/EditView/components/DocumentActions.mjs +161 -73
  8. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  9. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +6 -1
  10. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  11. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +2 -1
  12. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  13. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +6 -2
  14. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  15. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +3 -2
  16. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +6 -1
  18. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +6 -1
  20. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/utils/draftRelationCounts.js +117 -0
  22. package/dist/admin/pages/EditView/utils/draftRelationCounts.js.map +1 -0
  23. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs +109 -0
  24. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs.map +1 -0
  25. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +1 -1
  26. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  27. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +1 -1
  28. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  29. package/dist/admin/pages/ListView/components/TableCells/CellContent.js +2 -2
  30. package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
  31. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs +2 -2
  32. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs.map +1 -1
  33. package/dist/admin/pages/ListView/components/TableCells/Relations.js +1 -1
  34. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
  35. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs +1 -1
  36. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
  37. package/dist/admin/preview/pages/Preview.js +38 -11
  38. package/dist/admin/preview/pages/Preview.js.map +1 -1
  39. package/dist/admin/preview/pages/Preview.mjs +39 -12
  40. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  41. package/dist/admin/preview/utils/constants.js +9 -15
  42. package/dist/admin/preview/utils/constants.js.map +1 -1
  43. package/dist/admin/preview/utils/constants.mjs +10 -15
  44. package/dist/admin/preview/utils/constants.mjs.map +1 -1
  45. package/dist/admin/src/components/InjectionZone.d.ts +1 -2
  46. package/dist/admin/src/content-manager.d.ts +15 -15
  47. package/dist/admin/src/history/services/historyVersion.d.ts +2 -2
  48. package/dist/admin/src/hooks/useContentTypeSchema.d.ts +1 -1
  49. package/dist/admin/src/hooks/useDocument.d.ts +8 -9
  50. package/dist/admin/src/hooks/useDocumentLayout.d.ts +3 -3
  51. package/dist/admin/src/hooks/useDragAndDrop.d.ts +4 -4
  52. package/dist/admin/src/hooks/useKeyboardDragAndDrop.d.ts +1 -1
  53. package/dist/admin/src/hooks/usePersistentQueryParams.d.ts +0 -1
  54. package/dist/admin/src/modules/app.d.ts +5 -5
  55. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +1 -1
  56. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +12 -1
  57. package/dist/admin/src/pages/EditView/components/EditorToolbarObserver.d.ts +1 -1
  58. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +1 -1
  59. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.d.ts +2 -2
  60. package/dist/admin/src/pages/EditView/components/FormInputs/ComponentContext.d.ts +1 -2
  61. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +4 -4
  62. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  63. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +19 -20
  64. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +12 -12
  65. package/dist/admin/src/pages/EditView/utils/draftRelationCounts.d.ts +26 -0
  66. package/dist/admin/src/pages/ListView/components/BulkActions/PublishAction.d.ts +1 -1
  67. package/dist/admin/src/pages/ListView/components/Filters.d.ts +1 -1
  68. package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +1 -1
  69. package/dist/admin/src/preview/utils/constants.d.ts +1 -7
  70. package/dist/admin/src/preview/utils/getSendMessage.d.ts +0 -1
  71. package/dist/admin/src/services/documents.d.ts +30 -70
  72. package/dist/admin/src/services/relations.d.ts +6 -20
  73. package/dist/admin/src/services/uid.d.ts +5 -5
  74. package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +4 -4
  75. package/dist/admin/src/utils/users.d.ts +1 -1
  76. package/dist/admin/src/utils/validation.d.ts +1 -1
  77. package/dist/admin/translations/en.json.js +5 -2
  78. package/dist/admin/translations/en.json.js.map +1 -1
  79. package/dist/admin/translations/en.json.mjs +5 -2
  80. package/dist/admin/translations/en.json.mjs.map +1 -1
  81. package/dist/admin/translations/ja.json.js +262 -87
  82. package/dist/admin/translations/ja.json.js.map +1 -1
  83. package/dist/admin/translations/ja.json.mjs +262 -87
  84. package/dist/admin/translations/ja.json.mjs.map +1 -1
  85. package/dist/server/controllers/collection-types.js +2 -2
  86. package/dist/server/controllers/collection-types.js.map +1 -1
  87. package/dist/server/controllers/collection-types.mjs +2 -2
  88. package/dist/server/controllers/collection-types.mjs.map +1 -1
  89. package/dist/server/controllers/single-types.js +2 -2
  90. package/dist/server/controllers/single-types.js.map +1 -1
  91. package/dist/server/controllers/single-types.mjs +2 -2
  92. package/dist/server/controllers/single-types.mjs.map +1 -1
  93. package/dist/server/preview/controllers/preview.js +9 -0
  94. package/dist/server/preview/controllers/preview.js.map +1 -1
  95. package/dist/server/preview/controllers/preview.mjs +9 -0
  96. package/dist/server/preview/controllers/preview.mjs.map +1 -1
  97. package/dist/server/preview/controllers/previewScript.js +1450 -0
  98. package/dist/server/preview/routes/preview.js +11 -0
  99. package/dist/server/preview/routes/preview.js.map +1 -1
  100. package/dist/server/preview/routes/preview.mjs +11 -0
  101. package/dist/server/preview/routes/preview.mjs.map +1 -1
  102. package/dist/server/services/document-manager.js +13 -19
  103. package/dist/server/services/document-manager.js.map +1 -1
  104. package/dist/server/services/document-manager.mjs +13 -19
  105. package/dist/server/services/document-manager.mjs.map +1 -1
  106. package/dist/server/services/utils/draft-relations.js +9 -0
  107. package/dist/server/services/utils/draft-relations.js.map +1 -0
  108. package/dist/server/services/utils/draft-relations.mjs +7 -0
  109. package/dist/server/services/utils/draft-relations.mjs.map +1 -0
  110. package/dist/server/services/utils/draft.js +118 -25
  111. package/dist/server/services/utils/draft.js.map +1 -1
  112. package/dist/server/services/utils/draft.mjs +118 -25
  113. package/dist/server/services/utils/draft.mjs.map +1 -1
  114. package/dist/server/services/utils/populate.js +15 -1
  115. package/dist/server/services/utils/populate.js.map +1 -1
  116. package/dist/server/services/utils/populate.mjs +15 -1
  117. package/dist/server/services/utils/populate.mjs.map +1 -1
  118. package/dist/server/src/controllers/index.d.ts +1 -1
  119. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  120. package/dist/server/src/controllers/utils/clone.d.ts.map +1 -1
  121. package/dist/server/src/controllers/utils/document-status.d.ts +1 -1
  122. package/dist/server/src/controllers/utils/document-status.d.ts.map +1 -1
  123. package/dist/server/src/controllers/utils/metadata.d.ts +5 -5
  124. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  125. package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
  126. package/dist/server/src/controllers/validation/index.d.ts +3 -3
  127. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  128. package/dist/server/src/controllers/validation/model-configuration.d.ts.map +1 -1
  129. package/dist/server/src/controllers/validation/relations.d.ts +2 -2
  130. package/dist/server/src/history/controllers/history-version.d.ts +1 -7
  131. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  132. package/dist/server/src/history/controllers/index.d.ts +2 -1
  133. package/dist/server/src/history/controllers/index.d.ts.map +1 -1
  134. package/dist/server/src/history/controllers/validation/history-version.d.ts +1 -1
  135. package/dist/server/src/history/services/history.d.ts +0 -2
  136. package/dist/server/src/history/services/history.d.ts.map +1 -1
  137. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  138. package/dist/server/src/history/services/utils.d.ts +3 -3
  139. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  140. package/dist/server/src/history/utils.d.ts +1 -18
  141. package/dist/server/src/history/utils.d.ts.map +1 -1
  142. package/dist/server/src/homepage/controllers/homepage.d.ts +0 -1
  143. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -1
  144. package/dist/server/src/homepage/controllers/index.d.ts +2 -1
  145. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -1
  146. package/dist/server/src/homepage/index.d.ts +4 -8
  147. package/dist/server/src/homepage/index.d.ts.map +1 -1
  148. package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
  149. package/dist/server/src/homepage/services/homepage.d.ts +3 -4
  150. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  151. package/dist/server/src/homepage/services/index.d.ts +4 -8
  152. package/dist/server/src/homepage/services/index.d.ts.map +1 -1
  153. package/dist/server/src/index.d.ts +79 -85
  154. package/dist/server/src/index.d.ts.map +1 -1
  155. package/dist/server/src/mcp/derive-content-type-mcp-tools.d.ts.map +1 -1
  156. package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -1
  157. package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -1
  158. package/dist/server/src/mcp/permissions.d.ts +1 -1
  159. package/dist/server/src/mcp/permissions.d.ts.map +1 -1
  160. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
  161. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
  162. package/dist/server/src/mcp/schemas/blocks-schema.d.ts.map +1 -1
  163. package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -1
  164. package/dist/server/src/mcp/schemas/filters-schema.d.ts.map +1 -1
  165. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  166. package/dist/server/src/mcp/schemas/sort-schema.d.ts.map +1 -1
  167. package/dist/server/src/mcp/utils.d.ts.map +1 -1
  168. package/dist/server/src/middlewares/routing.d.ts.map +1 -1
  169. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  170. package/dist/server/src/policies/index.d.ts.map +1 -1
  171. package/dist/server/src/preview/controllers/index.d.ts +2 -1
  172. package/dist/server/src/preview/controllers/index.d.ts.map +1 -1
  173. package/dist/server/src/preview/controllers/preview.d.ts +5 -0
  174. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -1
  175. package/dist/server/src/preview/controllers/validation/preview.d.ts +1 -2
  176. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  177. package/dist/server/src/preview/routes/preview.d.ts.map +1 -1
  178. package/dist/server/src/preview/services/index.d.ts +1 -1
  179. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  180. package/dist/server/src/preview/services/preview-config.d.ts +1 -1
  181. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  182. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  183. package/dist/server/src/preview/utils.d.ts +1 -16
  184. package/dist/server/src/preview/utils.d.ts.map +1 -1
  185. package/dist/server/src/services/components.d.ts +2 -2
  186. package/dist/server/src/services/components.d.ts.map +1 -1
  187. package/dist/server/src/services/configuration.d.ts.map +1 -1
  188. package/dist/server/src/services/content-types.d.ts.map +1 -1
  189. package/dist/server/src/services/data-mapper.d.ts +5 -5
  190. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  191. package/dist/server/src/services/document-manager.d.ts +14 -14
  192. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  193. package/dist/server/src/services/document-metadata.d.ts +6 -6
  194. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  195. package/dist/server/src/services/field-sizes.d.ts +2 -2
  196. package/dist/server/src/services/field-sizes.d.ts.map +1 -1
  197. package/dist/server/src/services/index.d.ts +78 -84
  198. package/dist/server/src/services/index.d.ts.map +1 -1
  199. package/dist/server/src/services/metrics.d.ts.map +1 -1
  200. package/dist/server/src/services/permission-checker.d.ts +12 -31
  201. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  202. package/dist/server/src/services/permission.d.ts.map +1 -1
  203. package/dist/server/src/services/populate-builder.d.ts +4 -4
  204. package/dist/server/src/services/populate-builder.d.ts.map +1 -1
  205. package/dist/server/src/services/uid.d.ts.map +1 -1
  206. package/dist/server/src/services/utils/configuration/attributes.d.ts.map +1 -1
  207. package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
  208. package/dist/server/src/services/utils/count.d.ts.map +1 -1
  209. package/dist/server/src/services/utils/draft-relations.d.ts +19 -0
  210. package/dist/server/src/services/utils/draft-relations.d.ts.map +1 -0
  211. package/dist/server/src/services/utils/draft.d.ts +8 -7
  212. package/dist/server/src/services/utils/draft.d.ts.map +1 -1
  213. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  214. package/dist/server/src/services/utils/store.d.ts.map +1 -1
  215. package/dist/server/src/utils/index.d.ts.map +1 -1
  216. package/dist/server/src/validation/policies/hasPermissions.d.ts +1 -1
  217. package/dist/server/src/validation/zod.d.ts +1 -1
  218. package/dist/server/src/validation/zod.d.ts.map +1 -1
  219. package/dist/shared/contracts/collection-types.d.ts +4 -1
  220. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  221. package/dist/shared/contracts/single-types.d.ts +4 -1
  222. package/dist/shared/contracts/single-types.d.ts.map +1 -1
  223. package/package.json +8 -8
  224. package/dist/admin/preview/utils/previewScript.js +0 -1068
  225. package/dist/admin/preview/utils/previewScript.js.map +0 -1
  226. package/dist/admin/preview/utils/previewScript.mjs +0 -1066
  227. package/dist/admin/preview/utils/previewScript.mjs.map +0 -1
  228. package/dist/admin/src/preview/utils/previewScript.d.ts +0 -32
@@ -1 +1 @@
1
- {"version":3,"file":"CellContent.mjs","sources":["../../../../../../admin/src/pages/ListView/components/TableCells/CellContent.tsx"],"sourcesContent":["import { Tooltip, Typography } from '@strapi/design-system';\nimport isEmpty from 'lodash/isEmpty';\n\nimport { CellValue } from './CellValue';\nimport { SingleComponent, RepeatableComponent } from './Components';\nimport { MediaSingle, MediaMultiple } from './Media';\nimport { RelationMultiple, RelationSingle } from './Relations';\n\nimport type { ListFieldLayout } from '../../../../hooks/useDocumentLayout';\nimport type { Schema, Data } from '@strapi/types';\n\ninterface CellContentProps extends Omit<ListFieldLayout, 'cellFormatter'> {\n content: Schema.Attribute.Value<Schema.Attribute.AnyAttribute>;\n rowId: Data.ID;\n}\n\nconst CellContent = ({ content, mainField, attribute, rowId, name }: CellContentProps) => {\n const isIdColumn = name === 'id';\n\n if (!hasContent(content, mainField, attribute)) {\n return (\n <Typography\n textColor=\"neutral800\"\n paddingLeft={attribute.type === ('relation' || 'component') ? '1.6rem' : 0}\n paddingRight={attribute.type === ('relation' || 'component') ? '1.6rem' : 0}\n >\n -\n </Typography>\n );\n }\n\n switch (attribute.type) {\n case 'media':\n if (!attribute.multiple) {\n return <MediaSingle {...content} />;\n }\n\n return <MediaMultiple content={content} />;\n\n case 'relation': {\n if (isSingleRelation(attribute.relation)) {\n return <RelationSingle mainField={mainField} content={content} />;\n }\n\n return <RelationMultiple rowId={rowId} mainField={mainField} content={content} name={name} />;\n }\n\n case 'component':\n if (attribute.repeatable) {\n return <RepeatableComponent mainField={mainField} content={content} />;\n }\n\n return <SingleComponent mainField={mainField} content={content} />;\n\n case 'string':\n return (\n <Tooltip label={content}>\n <Typography maxWidth=\"30rem\" ellipsis textColor=\"neutral800\">\n <CellValue isIdColumn={isIdColumn} type={attribute.type} value={content} />\n </Typography>\n </Tooltip>\n );\n\n default:\n return (\n <Typography maxWidth=\"30rem\" ellipsis textColor=\"neutral800\">\n <CellValue isIdColumn={isIdColumn} type={attribute.type} value={content} />\n </Typography>\n );\n }\n};\n\nconst hasContent = (\n content: CellContentProps['content'],\n mainField: CellContentProps['mainField'],\n attribute: CellContentProps['attribute']\n) => {\n if (attribute.type === 'component') {\n // Repeatable fields show the ID as fallback, in case the mainField\n // doesn't have any content\n if (attribute.repeatable || !mainField) {\n return content?.length > 0;\n }\n\n const value = content?.[mainField.name];\n\n // relations, media ... show the id as fallback\n if (mainField.name === 'id' && ![undefined, null].includes(value)) {\n return true;\n }\n\n return !isEmpty(value);\n }\n\n if (attribute.type === 'relation') {\n if (isSingleRelation(attribute.relation)) {\n return !isEmpty(content);\n }\n\n if (Array.isArray(content)) {\n return content.length > 0;\n }\n\n return content?.count > 0;\n }\n\n /*\n Biginteger fields need to be treated as strings, as `isNumber`\n doesn't deal with them.\n */\n if (['integer', 'decimal', 'float', 'number'].includes(attribute.type)) {\n return typeof content === 'number';\n }\n\n if (attribute.type === 'boolean') {\n return content !== null;\n }\n\n return !isEmpty(content);\n};\n\nconst isSingleRelation = (\n type: Extract<CellContentProps['attribute'], { type: 'relation' }>['relation']\n) => ['oneToOne', 'manyToOne', 'oneToOneMorph'].includes(type);\n\nexport { CellContent };\nexport type { CellContentProps };\n"],"names":["CellContent","content","mainField","attribute","rowId","name","isIdColumn","hasContent","_jsx","Typography","textColor","paddingLeft","type","paddingRight","multiple","MediaSingle","MediaMultiple","isSingleRelation","relation","RelationSingle","RelationMultiple","repeatable","RepeatableComponent","SingleComponent","Tooltip","label","maxWidth","ellipsis","CellValue","value","length","undefined","includes","isEmpty","Array","isArray","count"],"mappings":"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"}
1
+ {"version":3,"file":"CellContent.mjs","sources":["../../../../../../admin/src/pages/ListView/components/TableCells/CellContent.tsx"],"sourcesContent":["import { Tooltip, Typography } from '@strapi/design-system';\nimport isEmpty from 'lodash/isEmpty';\n\nimport { CellValue } from './CellValue';\nimport { SingleComponent, RepeatableComponent } from './Components';\nimport { MediaSingle, MediaMultiple } from './Media';\nimport { RelationMultiple, RelationSingle } from './Relations';\n\nimport type { ListFieldLayout } from '../../../../hooks/useDocumentLayout';\nimport type { Schema, Data } from '@strapi/types';\n\ninterface CellContentProps extends Omit<ListFieldLayout, 'cellFormatter'> {\n content: Schema.Attribute.Value<Schema.Attribute.AnyAttribute>;\n rowId: Data.ID;\n}\n\nconst CellContent = ({ content, mainField, attribute, rowId, name }: CellContentProps) => {\n const isIdColumn = name === 'id';\n\n if (!hasContent(content, mainField, attribute)) {\n return (\n <Typography\n textColor=\"neutral800\"\n paddingLeft={attribute.type === 'relation' || attribute.type === 'component' ? '1.6rem' : 0}\n paddingRight={\n attribute.type === 'relation' || attribute.type === 'component' ? '1.6rem' : 0\n }\n >\n -\n </Typography>\n );\n }\n\n switch (attribute.type) {\n case 'media':\n if (!attribute.multiple) {\n return <MediaSingle {...content} />;\n }\n\n return <MediaMultiple content={content} />;\n\n case 'relation': {\n if (isSingleRelation(attribute.relation)) {\n return <RelationSingle mainField={mainField} content={content} />;\n }\n\n return <RelationMultiple rowId={rowId} mainField={mainField} content={content} name={name} />;\n }\n\n case 'component':\n if (attribute.repeatable) {\n return <RepeatableComponent mainField={mainField} content={content} />;\n }\n\n return <SingleComponent mainField={mainField} content={content} />;\n\n case 'string':\n return (\n <Tooltip label={content}>\n <Typography maxWidth=\"30rem\" ellipsis textColor=\"neutral800\">\n <CellValue isIdColumn={isIdColumn} type={attribute.type} value={content} />\n </Typography>\n </Tooltip>\n );\n\n default:\n return (\n <Typography maxWidth=\"30rem\" ellipsis textColor=\"neutral800\">\n <CellValue isIdColumn={isIdColumn} type={attribute.type} value={content} />\n </Typography>\n );\n }\n};\n\nconst hasContent = (\n content: CellContentProps['content'],\n mainField: CellContentProps['mainField'],\n attribute: CellContentProps['attribute']\n) => {\n if (attribute.type === 'component') {\n // Repeatable fields show the ID as fallback, in case the mainField\n // doesn't have any content\n if (attribute.repeatable || !mainField) {\n return content?.length > 0;\n }\n\n const value = content?.[mainField.name];\n\n // relations, media ... show the id as fallback\n if (mainField.name === 'id' && ![undefined, null].includes(value)) {\n return true;\n }\n\n return !isEmpty(value);\n }\n\n if (attribute.type === 'relation') {\n if (isSingleRelation(attribute.relation)) {\n return !isEmpty(content);\n }\n\n if (Array.isArray(content)) {\n return content.length > 0;\n }\n\n return content?.count > 0;\n }\n\n /*\n Biginteger fields need to be treated as strings, as `isNumber`\n doesn't deal with them.\n */\n if (['integer', 'decimal', 'float', 'number'].includes(attribute.type)) {\n return typeof content === 'number';\n }\n\n if (attribute.type === 'boolean') {\n return content !== null;\n }\n\n return !isEmpty(content);\n};\n\nconst isSingleRelation = (\n type: Extract<CellContentProps['attribute'], { type: 'relation' }>['relation']\n) => ['oneToOne', 'manyToOne', 'oneToOneMorph'].includes(type);\n\nexport { CellContent };\nexport type { CellContentProps };\n"],"names":["CellContent","content","mainField","attribute","rowId","name","isIdColumn","hasContent","_jsx","Typography","textColor","paddingLeft","type","paddingRight","multiple","MediaSingle","MediaMultiple","isSingleRelation","relation","RelationSingle","RelationMultiple","repeatable","RepeatableComponent","SingleComponent","Tooltip","label","maxWidth","ellipsis","CellValue","value","length","undefined","includes","isEmpty","Array","isArray","count"],"mappings":"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"}
@@ -61,7 +61,7 @@ const RelationMultiple = ({ mainField, content, rowId, name })=>{
61
61
  React__namespace.useEffect(()=>{
62
62
  if (data) {
63
63
  notifyStatus(formatMessage({
64
- id: translations.getTranslation('DynamicTable.relation-loaded'),
64
+ id: translations.getTranslation('ListViewTable.relation-loaded'),
65
65
  defaultMessage: 'Relations have been loaded'
66
66
  }));
67
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Relations.js","sources":["../../../../../../admin/src/pages/ListView/components/TableCells/Relations.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Typography, Loader, useNotifyAT, Menu } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../../hooks/useDocument';\nimport { useGetRelationsQuery } from '../../../../services/relations';\nimport { getRelationLabel } from '../../../../utils/relations';\nimport { getTranslation } from '../../../../utils/translations';\n\nimport type { CellContentProps } from './CellContent';\n\n/* -------------------------------------------------------------------------------------------------\n * RelationSingle\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RelationSingleProps extends Pick<CellContentProps, 'mainField' | 'content'> {}\n\nconst RelationSingle = ({ mainField, content }: RelationSingleProps) => {\n return (\n <Typography maxWidth=\"50rem\" textColor=\"neutral800\" ellipsis>\n {getRelationLabel(content, mainField)}\n </Typography>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * RelationMultiple\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RelationMultipleProps\n extends Pick<CellContentProps, 'mainField' | 'content' | 'name' | 'rowId'> {}\n\nconst RelationMultiple = ({ mainField, content, rowId, name }: RelationMultipleProps) => {\n const { model } = useDoc();\n const { formatMessage } = useIntl();\n const { notifyStatus } = useNotifyAT();\n const [isOpen, setIsOpen] = React.useState(false);\n const [{ query }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n const locale = query.plugins?.i18n?.locale;\n\n const [targetField] = name.split('.');\n\n const { data, isLoading } = useGetRelationsQuery(\n {\n model,\n id: rowId,\n targetField,\n params: { locale },\n },\n {\n skip: !isOpen,\n refetchOnMountOrArgChange: true,\n }\n );\n\n const contentCount = Array.isArray(content) ? content.length : content.count;\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('DynamicTable.relation-loaded'),\n defaultMessage: 'Relations have been loaded',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n return (\n <Menu.Root onOpenChange={(isOpen) => setIsOpen(isOpen)}>\n <Menu.Trigger onClick={(e) => e.stopPropagation()}>\n <Typography style={{ cursor: 'pointer' }} textColor=\"neutral800\" fontWeight=\"regular\">\n {contentCount > 0\n ? formatMessage(\n {\n id: 'content-manager.containers.list.items',\n defaultMessage: '{number} {number, plural, =0 {items} one {item} other {items}}',\n },\n { number: contentCount }\n )\n : '-'}\n </Typography>\n </Menu.Trigger>\n <Menu.Content>\n {isLoading && (\n <Menu.Item disabled>\n <Loader small>\n {formatMessage({\n id: getTranslation('ListViewTable.relation-loading'),\n defaultMessage: 'Relations are loading',\n })}\n </Loader>\n </Menu.Item>\n )}\n {data?.results && (\n <>\n {data.results.map((entry) => (\n <Menu.Item key={entry.documentId}>\n <Typography maxWidth=\"50rem\" ellipsis>\n {getRelationLabel(entry, mainField)}\n </Typography>\n </Menu.Item>\n ))}\n\n {data?.pagination && data?.pagination.total > 10 && (\n <Menu.Item\n aria-disabled\n aria-label={formatMessage({\n id: getTranslation('ListViewTable.relation-more'),\n defaultMessage: 'This relation contains more entities than displayed',\n })}\n >\n <Typography>…</Typography>\n </Menu.Item>\n )}\n </>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n\nexport { RelationSingle, RelationMultiple };\nexport type { RelationSingleProps, RelationMultipleProps };\n"],"names":["RelationSingle","mainField","content","_jsx","Typography","maxWidth","textColor","ellipsis","getRelationLabel","RelationMultiple","rowId","name","model","useDoc","formatMessage","useIntl","notifyStatus","useNotifyAT","isOpen","setIsOpen","React","useState","query","useQueryParams","locale","plugins","i18n","targetField","split","data","isLoading","useGetRelationsQuery","id","params","skip","refetchOnMountOrArgChange","contentCount","Array","isArray","length","count","useEffect","getTranslation","defaultMessage","_jsxs","Menu","Root","onOpenChange","Trigger","onClick","e","stopPropagation","style","cursor","fontWeight","number","Content","Item","disabled","Loader","small","results","_Fragment","map","entry","documentId","pagination","total","aria-disabled","aria-label"],"mappings":"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"}
1
+ {"version":3,"file":"Relations.js","sources":["../../../../../../admin/src/pages/ListView/components/TableCells/Relations.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Typography, Loader, useNotifyAT, Menu } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../../hooks/useDocument';\nimport { useGetRelationsQuery } from '../../../../services/relations';\nimport { getRelationLabel } from '../../../../utils/relations';\nimport { getTranslation } from '../../../../utils/translations';\n\nimport type { CellContentProps } from './CellContent';\n\n/* -------------------------------------------------------------------------------------------------\n * RelationSingle\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RelationSingleProps extends Pick<CellContentProps, 'mainField' | 'content'> {}\n\nconst RelationSingle = ({ mainField, content }: RelationSingleProps) => {\n return (\n <Typography maxWidth=\"50rem\" textColor=\"neutral800\" ellipsis>\n {getRelationLabel(content, mainField)}\n </Typography>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * RelationMultiple\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RelationMultipleProps\n extends Pick<CellContentProps, 'mainField' | 'content' | 'name' | 'rowId'> {}\n\nconst RelationMultiple = ({ mainField, content, rowId, name }: RelationMultipleProps) => {\n const { model } = useDoc();\n const { formatMessage } = useIntl();\n const { notifyStatus } = useNotifyAT();\n const [isOpen, setIsOpen] = React.useState(false);\n const [{ query }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n const locale = query.plugins?.i18n?.locale;\n\n const [targetField] = name.split('.');\n\n const { data, isLoading } = useGetRelationsQuery(\n {\n model,\n id: rowId,\n targetField,\n params: { locale },\n },\n {\n skip: !isOpen,\n refetchOnMountOrArgChange: true,\n }\n );\n\n const contentCount = Array.isArray(content) ? content.length : content.count;\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('ListViewTable.relation-loaded'),\n defaultMessage: 'Relations have been loaded',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n return (\n <Menu.Root onOpenChange={(isOpen) => setIsOpen(isOpen)}>\n <Menu.Trigger onClick={(e) => e.stopPropagation()}>\n <Typography style={{ cursor: 'pointer' }} textColor=\"neutral800\" fontWeight=\"regular\">\n {contentCount > 0\n ? formatMessage(\n {\n id: 'content-manager.containers.list.items',\n defaultMessage: '{number} {number, plural, =0 {items} one {item} other {items}}',\n },\n { number: contentCount }\n )\n : '-'}\n </Typography>\n </Menu.Trigger>\n <Menu.Content>\n {isLoading && (\n <Menu.Item disabled>\n <Loader small>\n {formatMessage({\n id: getTranslation('ListViewTable.relation-loading'),\n defaultMessage: 'Relations are loading',\n })}\n </Loader>\n </Menu.Item>\n )}\n {data?.results && (\n <>\n {data.results.map((entry) => (\n <Menu.Item key={entry.documentId}>\n <Typography maxWidth=\"50rem\" ellipsis>\n {getRelationLabel(entry, mainField)}\n </Typography>\n </Menu.Item>\n ))}\n\n {data?.pagination && data?.pagination.total > 10 && (\n <Menu.Item\n aria-disabled\n aria-label={formatMessage({\n id: getTranslation('ListViewTable.relation-more'),\n defaultMessage: 'This relation contains more entities than displayed',\n })}\n >\n <Typography>…</Typography>\n </Menu.Item>\n )}\n </>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n\nexport { RelationSingle, RelationMultiple };\nexport type { RelationSingleProps, RelationMultipleProps };\n"],"names":["RelationSingle","mainField","content","_jsx","Typography","maxWidth","textColor","ellipsis","getRelationLabel","RelationMultiple","rowId","name","model","useDoc","formatMessage","useIntl","notifyStatus","useNotifyAT","isOpen","setIsOpen","React","useState","query","useQueryParams","locale","plugins","i18n","targetField","split","data","isLoading","useGetRelationsQuery","id","params","skip","refetchOnMountOrArgChange","contentCount","Array","isArray","length","count","useEffect","getTranslation","defaultMessage","_jsxs","Menu","Root","onOpenChange","Trigger","onClick","e","stopPropagation","style","cursor","fontWeight","number","Content","Item","disabled","Loader","small","results","_Fragment","map","entry","documentId","pagination","total","aria-disabled","aria-label"],"mappings":"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"}
@@ -39,7 +39,7 @@ const RelationMultiple = ({ mainField, content, rowId, name })=>{
39
39
  React.useEffect(()=>{
40
40
  if (data) {
41
41
  notifyStatus(formatMessage({
42
- id: getTranslation('DynamicTable.relation-loaded'),
42
+ id: getTranslation('ListViewTable.relation-loaded'),
43
43
  defaultMessage: 'Relations have been loaded'
44
44
  }));
45
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Relations.mjs","sources":["../../../../../../admin/src/pages/ListView/components/TableCells/Relations.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Typography, Loader, useNotifyAT, Menu } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../../hooks/useDocument';\nimport { useGetRelationsQuery } from '../../../../services/relations';\nimport { getRelationLabel } from '../../../../utils/relations';\nimport { getTranslation } from '../../../../utils/translations';\n\nimport type { CellContentProps } from './CellContent';\n\n/* -------------------------------------------------------------------------------------------------\n * RelationSingle\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RelationSingleProps extends Pick<CellContentProps, 'mainField' | 'content'> {}\n\nconst RelationSingle = ({ mainField, content }: RelationSingleProps) => {\n return (\n <Typography maxWidth=\"50rem\" textColor=\"neutral800\" ellipsis>\n {getRelationLabel(content, mainField)}\n </Typography>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * RelationMultiple\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RelationMultipleProps\n extends Pick<CellContentProps, 'mainField' | 'content' | 'name' | 'rowId'> {}\n\nconst RelationMultiple = ({ mainField, content, rowId, name }: RelationMultipleProps) => {\n const { model } = useDoc();\n const { formatMessage } = useIntl();\n const { notifyStatus } = useNotifyAT();\n const [isOpen, setIsOpen] = React.useState(false);\n const [{ query }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n const locale = query.plugins?.i18n?.locale;\n\n const [targetField] = name.split('.');\n\n const { data, isLoading } = useGetRelationsQuery(\n {\n model,\n id: rowId,\n targetField,\n params: { locale },\n },\n {\n skip: !isOpen,\n refetchOnMountOrArgChange: true,\n }\n );\n\n const contentCount = Array.isArray(content) ? content.length : content.count;\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('DynamicTable.relation-loaded'),\n defaultMessage: 'Relations have been loaded',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n return (\n <Menu.Root onOpenChange={(isOpen) => setIsOpen(isOpen)}>\n <Menu.Trigger onClick={(e) => e.stopPropagation()}>\n <Typography style={{ cursor: 'pointer' }} textColor=\"neutral800\" fontWeight=\"regular\">\n {contentCount > 0\n ? formatMessage(\n {\n id: 'content-manager.containers.list.items',\n defaultMessage: '{number} {number, plural, =0 {items} one {item} other {items}}',\n },\n { number: contentCount }\n )\n : '-'}\n </Typography>\n </Menu.Trigger>\n <Menu.Content>\n {isLoading && (\n <Menu.Item disabled>\n <Loader small>\n {formatMessage({\n id: getTranslation('ListViewTable.relation-loading'),\n defaultMessage: 'Relations are loading',\n })}\n </Loader>\n </Menu.Item>\n )}\n {data?.results && (\n <>\n {data.results.map((entry) => (\n <Menu.Item key={entry.documentId}>\n <Typography maxWidth=\"50rem\" ellipsis>\n {getRelationLabel(entry, mainField)}\n </Typography>\n </Menu.Item>\n ))}\n\n {data?.pagination && data?.pagination.total > 10 && (\n <Menu.Item\n aria-disabled\n aria-label={formatMessage({\n id: getTranslation('ListViewTable.relation-more'),\n defaultMessage: 'This relation contains more entities than displayed',\n })}\n >\n <Typography>…</Typography>\n </Menu.Item>\n )}\n </>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n\nexport { RelationSingle, RelationMultiple };\nexport type { RelationSingleProps, RelationMultipleProps };\n"],"names":["RelationSingle","mainField","content","_jsx","Typography","maxWidth","textColor","ellipsis","getRelationLabel","RelationMultiple","rowId","name","model","useDoc","formatMessage","useIntl","notifyStatus","useNotifyAT","isOpen","setIsOpen","React","useState","query","useQueryParams","locale","plugins","i18n","targetField","split","data","isLoading","useGetRelationsQuery","id","params","skip","refetchOnMountOrArgChange","contentCount","Array","isArray","length","count","useEffect","getTranslation","defaultMessage","_jsxs","Menu","Root","onOpenChange","Trigger","onClick","e","stopPropagation","style","cursor","fontWeight","number","Content","Item","disabled","Loader","small","results","_Fragment","map","entry","documentId","pagination","total","aria-disabled","aria-label"],"mappings":"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"}
1
+ {"version":3,"file":"Relations.mjs","sources":["../../../../../../admin/src/pages/ListView/components/TableCells/Relations.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Typography, Loader, useNotifyAT, Menu } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../../hooks/useDocument';\nimport { useGetRelationsQuery } from '../../../../services/relations';\nimport { getRelationLabel } from '../../../../utils/relations';\nimport { getTranslation } from '../../../../utils/translations';\n\nimport type { CellContentProps } from './CellContent';\n\n/* -------------------------------------------------------------------------------------------------\n * RelationSingle\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RelationSingleProps extends Pick<CellContentProps, 'mainField' | 'content'> {}\n\nconst RelationSingle = ({ mainField, content }: RelationSingleProps) => {\n return (\n <Typography maxWidth=\"50rem\" textColor=\"neutral800\" ellipsis>\n {getRelationLabel(content, mainField)}\n </Typography>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * RelationMultiple\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RelationMultipleProps\n extends Pick<CellContentProps, 'mainField' | 'content' | 'name' | 'rowId'> {}\n\nconst RelationMultiple = ({ mainField, content, rowId, name }: RelationMultipleProps) => {\n const { model } = useDoc();\n const { formatMessage } = useIntl();\n const { notifyStatus } = useNotifyAT();\n const [isOpen, setIsOpen] = React.useState(false);\n const [{ query }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n const locale = query.plugins?.i18n?.locale;\n\n const [targetField] = name.split('.');\n\n const { data, isLoading } = useGetRelationsQuery(\n {\n model,\n id: rowId,\n targetField,\n params: { locale },\n },\n {\n skip: !isOpen,\n refetchOnMountOrArgChange: true,\n }\n );\n\n const contentCount = Array.isArray(content) ? content.length : content.count;\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('ListViewTable.relation-loaded'),\n defaultMessage: 'Relations have been loaded',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n return (\n <Menu.Root onOpenChange={(isOpen) => setIsOpen(isOpen)}>\n <Menu.Trigger onClick={(e) => e.stopPropagation()}>\n <Typography style={{ cursor: 'pointer' }} textColor=\"neutral800\" fontWeight=\"regular\">\n {contentCount > 0\n ? formatMessage(\n {\n id: 'content-manager.containers.list.items',\n defaultMessage: '{number} {number, plural, =0 {items} one {item} other {items}}',\n },\n { number: contentCount }\n )\n : '-'}\n </Typography>\n </Menu.Trigger>\n <Menu.Content>\n {isLoading && (\n <Menu.Item disabled>\n <Loader small>\n {formatMessage({\n id: getTranslation('ListViewTable.relation-loading'),\n defaultMessage: 'Relations are loading',\n })}\n </Loader>\n </Menu.Item>\n )}\n {data?.results && (\n <>\n {data.results.map((entry) => (\n <Menu.Item key={entry.documentId}>\n <Typography maxWidth=\"50rem\" ellipsis>\n {getRelationLabel(entry, mainField)}\n </Typography>\n </Menu.Item>\n ))}\n\n {data?.pagination && data?.pagination.total > 10 && (\n <Menu.Item\n aria-disabled\n aria-label={formatMessage({\n id: getTranslation('ListViewTable.relation-more'),\n defaultMessage: 'This relation contains more entities than displayed',\n })}\n >\n <Typography>…</Typography>\n </Menu.Item>\n )}\n </>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n\nexport { RelationSingle, RelationMultiple };\nexport type { RelationSingleProps, RelationMultipleProps };\n"],"names":["RelationSingle","mainField","content","_jsx","Typography","maxWidth","textColor","ellipsis","getRelationLabel","RelationMultiple","rowId","name","model","useDoc","formatMessage","useIntl","notifyStatus","useNotifyAT","isOpen","setIsOpen","React","useState","query","useQueryParams","locale","plugins","i18n","targetField","split","data","isLoading","useGetRelationsQuery","id","params","skip","refetchOnMountOrArgChange","contentCount","Array","isArray","length","count","useEffect","getTranslation","defaultMessage","_jsxs","Menu","Root","onOpenChange","Trigger","onClick","e","stopPropagation","style","cursor","fontWeight","number","Content","Item","disabled","Loader","small","results","_Fragment","map","entry","documentId","pagination","total","aria-disabled","aria-label"],"mappings":"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"}
@@ -22,7 +22,6 @@ var PreviewHeader = require('../components/PreviewHeader.js');
22
22
  var preview = require('../services/preview.js');
23
23
  var constants = require('../utils/constants.js');
24
24
  var getSendMessage = require('../utils/getSendMessage.js');
25
- var previewScript = require('../utils/previewScript.js');
26
25
 
27
26
  function _interopNamespace(e) {
28
27
  if (e && e.__esModule) return e;
@@ -67,6 +66,26 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
67
66
  }
68
67
  ];
69
68
  const [PreviewProvider, usePreviewContext] = strapiAdmin.createContext('PreviewPage');
69
+ const getPreviewScript = (()=>{
70
+ let previewScript = '';
71
+ return async (previewHighlightColors)=>{
72
+ if (!previewScript) {
73
+ const resp = await fetch(`${window.strapi.backendURL}/content-manager/preview/script`);
74
+ if (!resp.ok) {
75
+ throw new Error('Could not retrieve preview script from server.');
76
+ }
77
+ previewScript = await resp.text();
78
+ if (!previewScript) {
79
+ throw new Error('Could not retrieve preview script from server.');
80
+ }
81
+ }
82
+ return `(${previewScript})(${JSON.stringify({
83
+ colors: previewHighlightColors,
84
+ events: constants.INTERNAL_EVENTS,
85
+ parentOrigin: window.location.origin
86
+ })})`;
87
+ };
88
+ })();
70
89
  /* -------------------------------------------------------------------------------------------------
71
90
  * PreviewPage
72
91
  * -----------------------------------------------------------------------------------------------*/ const AnimatedArrow = styledComponents.styled(Icons.ArrowLineLeft)`
@@ -96,7 +115,7 @@ const PreviewPage = ()=>{
96
115
  };
97
116
  // Listen for ready message from iframe before injecting script
98
117
  React__namespace.useEffect(()=>{
99
- const handleMessage = (event)=>{
118
+ const handleMessage = async (event)=>{
100
119
  // Only listen to events from the preview iframe
101
120
  if (iframeRef.current) {
102
121
  const previewOrigin = new URL(iframeRef.current?.src).origin;
@@ -105,14 +124,21 @@ const PreviewPage = ()=>{
105
124
  }
106
125
  }
107
126
  if (event.data?.type === constants.PUBLIC_EVENTS.PREVIEW_READY) {
108
- const script = `(${previewScript.previewScript.toString()})(${JSON.stringify({
109
- shouldRun: true,
110
- colors: previewHighlightColors
111
- })})`;
112
- const sendMessage = getSendMessage.getSendMessage(iframeRef);
113
- sendMessage(constants.PUBLIC_EVENTS.STRAPI_SCRIPT, {
114
- script
115
- });
127
+ try {
128
+ const script = await getPreviewScript(previewHighlightColors);
129
+ const sendMessage = getSendMessage.getSendMessage(iframeRef);
130
+ sendMessage(constants.PUBLIC_EVENTS.STRAPI_SCRIPT, {
131
+ script
132
+ });
133
+ } catch {
134
+ toggleNotification({
135
+ type: 'danger',
136
+ message: formatMessage({
137
+ id: 'content-manager.preview.error.script-failed',
138
+ defaultMessage: 'Could not load the live preview script. Visual editing may not be available.'
139
+ })
140
+ });
141
+ }
116
142
  }
117
143
  };
118
144
  window.addEventListener('message', handleMessage);
@@ -122,7 +148,8 @@ const PreviewPage = ()=>{
122
148
  }, [
123
149
  documentId,
124
150
  toggleNotification,
125
- theme
151
+ theme,
152
+ formatMessage
126
153
  ]);
127
154
  if (!collectionType) {
128
155
  throw new Error('Could not find collectionType in url params');
@@ -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 } 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 { PUBLIC_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\nimport { previewScript } from '../utils/previewScript';\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}\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\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\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 { 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?: Record<string, unknown>;\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 = {\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 = (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 const script = `(${previewScript.toString()})(${JSON.stringify({\n shouldRun: true,\n colors: previewHighlightColors,\n })})`;\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [documentId, toggleNotification, theme]);\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,\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\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading)) {\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","AnimatedArrow","styled","ArrowLineLeft","props","$isSideEditorOpen","PreviewPage","location","useLocation","formatMessage","useIntl","theme","useTheme","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","toggleNotification","useNotification","slug","model","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","previewHighlightColors","highlightHoverColor","colors","primary500","highlightActiveColor","primary600","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","PUBLIC_EVENTS","PREVIEW_READY","script","previewScript","toString","JSON","stringify","shouldRun","sendMessage","getSendMessage","STRAPI_SCRIPT","window","addEventListener","removeEventListener","Error","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","locale","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","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","contentWindow","postMessage","hasAdvancedPreview","strapi","features","isEnabled","_jsxs","_Fragment","Title","title","layout","FormContext","method","disabled","initialErrors","state","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","prev","justifyContent","SingleSelect","value","onChange","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 } 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}\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 { 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?: Record<string, unknown>;\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 }, [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,\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\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading)) {\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","toggleNotification","useNotification","slug","model","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","highlightHoverColor","primary500","highlightActiveColor","primary600","useEffect","handleMessage","event","current","previewOrigin","URL","src","data","type","PUBLIC_EVENTS","PREVIEW_READY","script","sendMessage","getSendMessage","STRAPI_SCRIPT","message","addEventListener","removeEventListener","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","locale","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","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","contentWindow","postMessage","hasAdvancedPreview","features","isEnabled","_jsxs","_Fragment","Title","title","layout","FormContext","method","disabled","initialErrors","state","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","prev","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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"}
@@ -18,9 +18,8 @@ import { createYupSchema } from '../../utils/validation.mjs';
18
18
  import { InputPopover } from '../components/InputPopover.mjs';
19
19
  import { PreviewHeader } from '../components/PreviewHeader.mjs';
20
20
  import { useGetPreviewUrlQuery } from '../services/preview.mjs';
21
- import { PUBLIC_EVENTS } from '../utils/constants.mjs';
21
+ import { PUBLIC_EVENTS, INTERNAL_EVENTS } from '../utils/constants.mjs';
22
22
  import { getSendMessage } from '../utils/getSendMessage.mjs';
23
- import { previewScript } from '../utils/previewScript.mjs';
24
23
 
25
24
  /* -------------------------------------------------------------------------------------------------
26
25
  * Constants
@@ -45,6 +44,26 @@ import { previewScript } from '../utils/previewScript.mjs';
45
44
  }
46
45
  ];
47
46
  const [PreviewProvider, usePreviewContext] = createContext('PreviewPage');
47
+ const getPreviewScript = (()=>{
48
+ let previewScript = '';
49
+ return async (previewHighlightColors)=>{
50
+ if (!previewScript) {
51
+ const resp = await fetch(`${window.strapi.backendURL}/content-manager/preview/script`);
52
+ if (!resp.ok) {
53
+ throw new Error('Could not retrieve preview script from server.');
54
+ }
55
+ previewScript = await resp.text();
56
+ if (!previewScript) {
57
+ throw new Error('Could not retrieve preview script from server.');
58
+ }
59
+ }
60
+ return `(${previewScript})(${JSON.stringify({
61
+ colors: previewHighlightColors,
62
+ events: INTERNAL_EVENTS,
63
+ parentOrigin: window.location.origin
64
+ })})`;
65
+ };
66
+ })();
48
67
  /* -------------------------------------------------------------------------------------------------
49
68
  * PreviewPage
50
69
  * -----------------------------------------------------------------------------------------------*/ const AnimatedArrow = styled(ArrowLineLeft)`
@@ -74,7 +93,7 @@ const PreviewPage = ()=>{
74
93
  };
75
94
  // Listen for ready message from iframe before injecting script
76
95
  React.useEffect(()=>{
77
- const handleMessage = (event)=>{
96
+ const handleMessage = async (event)=>{
78
97
  // Only listen to events from the preview iframe
79
98
  if (iframeRef.current) {
80
99
  const previewOrigin = new URL(iframeRef.current?.src).origin;
@@ -83,14 +102,21 @@ const PreviewPage = ()=>{
83
102
  }
84
103
  }
85
104
  if (event.data?.type === PUBLIC_EVENTS.PREVIEW_READY) {
86
- const script = `(${previewScript.toString()})(${JSON.stringify({
87
- shouldRun: true,
88
- colors: previewHighlightColors
89
- })})`;
90
- const sendMessage = getSendMessage(iframeRef);
91
- sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, {
92
- script
93
- });
105
+ try {
106
+ const script = await getPreviewScript(previewHighlightColors);
107
+ const sendMessage = getSendMessage(iframeRef);
108
+ sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, {
109
+ script
110
+ });
111
+ } catch {
112
+ toggleNotification({
113
+ type: 'danger',
114
+ message: formatMessage({
115
+ id: 'content-manager.preview.error.script-failed',
116
+ defaultMessage: 'Could not load the live preview script. Visual editing may not be available.'
117
+ })
118
+ });
119
+ }
94
120
  }
95
121
  };
96
122
  window.addEventListener('message', handleMessage);
@@ -100,7 +126,8 @@ const PreviewPage = ()=>{
100
126
  }, [
101
127
  documentId,
102
128
  toggleNotification,
103
- theme
129
+ theme,
130
+ formatMessage
104
131
  ]);
105
132
  if (!collectionType) {
106
133
  throw new Error('Could not find collectionType in url params');