@strapi/content-manager 0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8 → 0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207

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 (185) hide show
  1. package/dist/admin/components/LeftMenu.js +13 -15
  2. package/dist/admin/components/LeftMenu.js.map +1 -1
  3. package/dist/admin/components/LeftMenu.mjs +14 -16
  4. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  5. package/dist/admin/components/Widgets.js +269 -9
  6. package/dist/admin/components/Widgets.js.map +1 -1
  7. package/dist/admin/components/Widgets.mjs +252 -12
  8. package/dist/admin/components/Widgets.mjs.map +1 -1
  9. package/dist/admin/hooks/useDocumentActions.js +0 -3
  10. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  11. package/dist/admin/hooks/useDocumentActions.mjs +1 -4
  12. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  13. package/dist/admin/index.js +47 -8
  14. package/dist/admin/index.js.map +1 -1
  15. package/dist/admin/index.mjs +47 -9
  16. package/dist/admin/index.mjs.map +1 -1
  17. package/dist/admin/layout.js +1 -27
  18. package/dist/admin/layout.js.map +1 -1
  19. package/dist/admin/layout.mjs +2 -9
  20. package/dist/admin/layout.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/EditViewPage.js +14 -16
  22. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  23. package/dist/admin/pages/EditView/EditViewPage.mjs +16 -18
  24. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  25. package/dist/admin/pages/EditView/components/Blocker.js +18 -0
  26. package/dist/admin/pages/EditView/components/Blocker.js.map +1 -0
  27. package/dist/admin/pages/EditView/components/Blocker.mjs +16 -0
  28. package/dist/admin/pages/EditView/components/Blocker.mjs.map +1 -0
  29. package/dist/admin/pages/EditView/components/DocumentActions.js +18 -3
  30. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  31. package/dist/admin/pages/EditView/components/DocumentActions.mjs +19 -4
  32. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +1 -0
  34. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +1 -0
  36. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +4 -1
  38. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +4 -1
  40. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/InputRenderer.js +15 -5
  42. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/InputRenderer.mjs +15 -5
  44. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/utils/data.js +33 -8
  46. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  47. package/dist/admin/pages/EditView/utils/data.mjs +33 -8
  48. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  49. package/dist/admin/pages/ListView/ListViewPage.js +152 -143
  50. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  51. package/dist/admin/pages/ListView/ListViewPage.mjs +153 -144
  52. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  53. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +12 -2
  54. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  55. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +12 -2
  56. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  57. package/dist/admin/pages/ListView/components/Filters.js +3 -1
  58. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  59. package/dist/admin/pages/ListView/components/Filters.mjs +3 -1
  60. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  61. package/dist/admin/preview/components/InputPopover.js +73 -0
  62. package/dist/admin/preview/components/InputPopover.js.map +1 -0
  63. package/dist/admin/preview/components/InputPopover.mjs +70 -0
  64. package/dist/admin/preview/components/InputPopover.mjs.map +1 -0
  65. package/dist/admin/preview/components/PreviewSidePanel.js +31 -4
  66. package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -1
  67. package/dist/admin/preview/components/PreviewSidePanel.mjs +32 -5
  68. package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -1
  69. package/dist/admin/preview/hooks/usePreviewInputManager.js +67 -0
  70. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -0
  71. package/dist/admin/preview/hooks/usePreviewInputManager.mjs +46 -0
  72. package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -0
  73. package/dist/admin/preview/pages/Preview.js +170 -68
  74. package/dist/admin/preview/pages/Preview.js.map +1 -1
  75. package/dist/admin/preview/pages/Preview.mjs +172 -70
  76. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  77. package/dist/admin/preview/utils/constants.js +22 -0
  78. package/dist/admin/preview/utils/constants.js.map +1 -0
  79. package/dist/admin/preview/utils/constants.mjs +19 -0
  80. package/dist/admin/preview/utils/constants.mjs.map +1 -0
  81. package/dist/admin/preview/utils/getSendMessage.js +22 -0
  82. package/dist/admin/preview/utils/getSendMessage.js.map +1 -0
  83. package/dist/admin/preview/utils/getSendMessage.mjs +20 -0
  84. package/dist/admin/preview/utils/getSendMessage.mjs.map +1 -0
  85. package/dist/admin/preview/utils/previewScript.js +450 -0
  86. package/dist/admin/preview/utils/previewScript.js.map +1 -0
  87. package/dist/admin/preview/utils/previewScript.mjs +448 -0
  88. package/dist/admin/preview/utils/previewScript.mjs.map +1 -0
  89. package/dist/admin/services/api.js +3 -1
  90. package/dist/admin/services/api.js.map +1 -1
  91. package/dist/admin/services/api.mjs +3 -1
  92. package/dist/admin/services/api.mjs.map +1 -1
  93. package/dist/admin/services/documents.js +39 -14
  94. package/dist/admin/services/documents.js.map +1 -1
  95. package/dist/admin/services/documents.mjs +39 -14
  96. package/dist/admin/services/documents.mjs.map +1 -1
  97. package/dist/admin/src/components/Widgets.d.ts +2 -1
  98. package/dist/admin/src/exports.d.ts +1 -0
  99. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  100. package/dist/admin/src/pages/EditView/components/Blocker.d.ts +5 -0
  101. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +1 -1
  102. package/dist/admin/src/preview/components/InputPopover.d.ts +6 -0
  103. package/dist/admin/src/preview/hooks/usePreviewInputManager.d.ts +4 -0
  104. package/dist/admin/src/preview/pages/Preview.d.ts +8 -0
  105. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  106. package/dist/admin/src/preview/utils/constants.d.ts +20 -0
  107. package/dist/admin/src/preview/utils/getSendMessage.d.ts +11 -0
  108. package/dist/admin/src/preview/utils/previewScript.d.ts +23 -0
  109. package/dist/admin/src/services/api.d.ts +1 -1
  110. package/dist/admin/src/services/components.d.ts +2 -2
  111. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  112. package/dist/admin/src/services/documents.d.ts +16 -16
  113. package/dist/admin/src/services/homepage.d.ts +1 -1
  114. package/dist/admin/src/services/init.d.ts +1 -1
  115. package/dist/admin/src/services/relations.d.ts +2 -2
  116. package/dist/admin/src/services/uid.d.ts +3 -3
  117. package/dist/admin/src/utils/api.d.ts +1 -1
  118. package/dist/admin/translations/en.json.js +7 -0
  119. package/dist/admin/translations/en.json.js.map +1 -1
  120. package/dist/admin/translations/en.json.mjs +7 -0
  121. package/dist/admin/translations/en.json.mjs.map +1 -1
  122. package/dist/admin/translations/es.json.js +6 -2
  123. package/dist/admin/translations/es.json.js.map +1 -1
  124. package/dist/admin/translations/es.json.mjs +6 -2
  125. package/dist/admin/translations/es.json.mjs.map +1 -1
  126. package/dist/admin/translations/fr.json.js +5 -1
  127. package/dist/admin/translations/fr.json.js.map +1 -1
  128. package/dist/admin/translations/fr.json.mjs +5 -1
  129. package/dist/admin/translations/fr.json.mjs.map +1 -1
  130. package/dist/admin/utils/api.js +1 -1
  131. package/dist/admin/utils/api.js.map +1 -1
  132. package/dist/admin/utils/api.mjs +1 -1
  133. package/dist/admin/utils/api.mjs.map +1 -1
  134. package/dist/admin/utils/validation.js +2 -1
  135. package/dist/admin/utils/validation.js.map +1 -1
  136. package/dist/admin/utils/validation.mjs +2 -1
  137. package/dist/admin/utils/validation.mjs.map +1 -1
  138. package/dist/server/history/services/lifecycles.js +20 -19
  139. package/dist/server/history/services/lifecycles.js.map +1 -1
  140. package/dist/server/history/services/lifecycles.mjs +20 -19
  141. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  142. package/dist/server/homepage/controllers/homepage.js +5 -0
  143. package/dist/server/homepage/controllers/homepage.js.map +1 -1
  144. package/dist/server/homepage/controllers/homepage.mjs +5 -0
  145. package/dist/server/homepage/controllers/homepage.mjs.map +1 -1
  146. package/dist/server/homepage/routes/homepage.js +11 -0
  147. package/dist/server/homepage/routes/homepage.js.map +1 -1
  148. package/dist/server/homepage/routes/homepage.mjs +11 -0
  149. package/dist/server/homepage/routes/homepage.mjs.map +1 -1
  150. package/dist/server/homepage/services/homepage.js +86 -46
  151. package/dist/server/homepage/services/homepage.js.map +1 -1
  152. package/dist/server/homepage/services/homepage.mjs +86 -46
  153. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  154. package/dist/server/preview/services/preview-config.js +5 -1
  155. package/dist/server/preview/services/preview-config.js.map +1 -1
  156. package/dist/server/preview/services/preview-config.mjs +5 -1
  157. package/dist/server/preview/services/preview-config.mjs.map +1 -1
  158. package/dist/server/preview/services/preview.js +4 -0
  159. package/dist/server/preview/services/preview.js.map +1 -1
  160. package/dist/server/preview/services/preview.mjs +4 -0
  161. package/dist/server/preview/services/preview.mjs.map +1 -1
  162. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  163. package/dist/server/src/homepage/controllers/homepage.d.ts +2 -1
  164. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -1
  165. package/dist/server/src/homepage/index.d.ts +7 -0
  166. package/dist/server/src/homepage/index.d.ts.map +1 -1
  167. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -1
  168. package/dist/server/src/homepage/services/homepage.d.ts +4 -1
  169. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  170. package/dist/server/src/homepage/services/index.d.ts +7 -0
  171. package/dist/server/src/homepage/services/index.d.ts.map +1 -1
  172. package/dist/server/src/index.d.ts +7 -0
  173. package/dist/server/src/index.d.ts.map +1 -1
  174. package/dist/server/src/preview/services/index.d.ts +1 -0
  175. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  176. package/dist/server/src/preview/services/preview-config.d.ts +1 -0
  177. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  178. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  179. package/dist/server/src/preview/utils.d.ts +1 -0
  180. package/dist/server/src/preview/utils.d.ts.map +1 -1
  181. package/dist/server/src/services/index.d.ts +7 -0
  182. package/dist/server/src/services/index.d.ts.map +1 -1
  183. package/dist/shared/contracts/homepage.d.ts +13 -0
  184. package/dist/shared/contracts/homepage.d.ts.map +1 -1
  185. package/package.json +7 -8
@@ -12,11 +12,17 @@ var collections = require('../../constants/collections.js');
12
12
  var DocumentRBAC = require('../../features/DocumentRBAC.js');
13
13
  var useDocument = require('../../hooks/useDocument.js');
14
14
  var useDocumentLayout = require('../../hooks/useDocumentLayout.js');
15
+ var Blocker = require('../../pages/EditView/components/Blocker.js');
15
16
  var FormLayout = require('../../pages/EditView/components/FormLayout.js');
17
+ var data = require('../../pages/EditView/utils/data.js');
16
18
  var api = require('../../utils/api.js');
17
19
  var validation = require('../../utils/validation.js');
20
+ var InputPopover = require('../components/InputPopover.js');
18
21
  var PreviewHeader = require('../components/PreviewHeader.js');
19
22
  var preview = require('../services/preview.js');
23
+ var constants = require('../utils/constants.js');
24
+ var getSendMessage = require('../utils/getSendMessage.js');
25
+ var previewScript = require('../utils/previewScript.js');
20
26
 
21
27
  function _interopNamespaceDefault(e) {
22
28
  var n = Object.create(null);
@@ -37,12 +43,34 @@ function _interopNamespaceDefault(e) {
37
43
 
38
44
  var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
39
45
 
46
+ /* -------------------------------------------------------------------------------------------------
47
+ * Constants
48
+ * -----------------------------------------------------------------------------------------------*/ const DEVICES = [
49
+ {
50
+ name: 'desktop',
51
+ label: {
52
+ id: 'content-manager.preview.device.desktop',
53
+ defaultMessage: 'Desktop'
54
+ },
55
+ width: '100%',
56
+ height: '100%'
57
+ },
58
+ {
59
+ name: 'mobile',
60
+ label: {
61
+ id: 'content-manager.preview.device.mobile',
62
+ defaultMessage: 'Mobile'
63
+ },
64
+ width: '375px',
65
+ height: '667px'
66
+ }
67
+ ];
40
68
  const [PreviewProvider, usePreviewContext] = strapiAdmin.createContext('PreviewPage');
41
69
  /* -------------------------------------------------------------------------------------------------
42
70
  * PreviewPage
43
71
  * -----------------------------------------------------------------------------------------------*/ const AnimatedArrow = styledComponents.styled(Icons.ArrowLineLeft)`
44
72
  will-change: transform;
45
- rotate: ${(props)=>props.isSideEditorOpen ? '0deg' : '180deg'};
73
+ rotate: ${(props)=>props.$isSideEditorOpen ? '0deg' : '180deg'};
46
74
  transition: rotate 0.2s ease-in-out;
47
75
  `;
48
76
  const PreviewPage = ()=>{
@@ -50,12 +78,41 @@ const PreviewPage = ()=>{
50
78
  const { formatMessage } = reactIntl.useIntl();
51
79
  const iframeRef = React__namespace.useRef(null);
52
80
  const [isSideEditorOpen, setIsSideEditorOpen] = React__namespace.useState(true);
81
+ const [popoverField, setPopoverField] = React__namespace.useState(null);
53
82
  // Read all the necessary data from the URL to find the right preview URL
54
83
  const { slug: model, id: documentId, collectionType } = reactRouterDom.useParams();
55
84
  const [{ query }] = strapiAdmin.useQueryParams();
56
85
  const params = React__namespace.useMemo(()=>api.buildValidParams(query), [
57
86
  query
58
87
  ]);
88
+ const [deviceName, setDeviceName] = React__namespace.useState(DEVICES[0].name);
89
+ const device = DEVICES.find((d)=>d.name === deviceName) ?? DEVICES[0];
90
+ // Listen for ready message from iframe before injecting script
91
+ React__namespace.useEffect(()=>{
92
+ const handleMessage = (event)=>{
93
+ // Only listen to events from the preview iframe
94
+ if (iframeRef.current) {
95
+ const previewOrigin = new URL(iframeRef.current?.src).origin;
96
+ if (event.origin !== previewOrigin) {
97
+ return;
98
+ }
99
+ }
100
+ if (event.data?.type === constants.PUBLIC_EVENTS.PREVIEW_READY) {
101
+ const script = `(${previewScript.previewScript.toString()})()`;
102
+ const sendMessage = getSendMessage.getSendMessage(iframeRef);
103
+ sendMessage(constants.PUBLIC_EVENTS.STRAPI_SCRIPT, {
104
+ script
105
+ });
106
+ }
107
+ if (event.data?.type === constants.INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {
108
+ setPopoverField?.(event.data.payload);
109
+ }
110
+ };
111
+ window.addEventListener('message', handleMessage);
112
+ return ()=>{
113
+ window.removeEventListener('message', handleMessage);
114
+ };
115
+ }, []);
59
116
  if (!collectionType) {
60
117
  throw new Error('Could not find collectionType in url params');
61
118
  }
@@ -84,7 +141,7 @@ const PreviewPage = ()=>{
84
141
  });
85
142
  const documentLayoutResponse = useDocumentLayout.useDocumentLayout(model);
86
143
  const isLoading = previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;
87
- if (isLoading && !documentResponse.document?.documentId) {
144
+ if (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading)) {
88
145
  return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Loading, {});
89
146
  }
90
147
  const initialValues = documentResponse.getInitialFormValues();
@@ -96,11 +153,17 @@ const PreviewPage = ()=>{
96
153
  }
97
154
  const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);
98
155
  const validateSync = (values, options)=>{
156
+ const { data: cleanedValues, removedAttributes } = data.handleInvisibleAttributes(values, {
157
+ schema: documentResponse.schema,
158
+ initialValues,
159
+ components: documentResponse.components
160
+ });
99
161
  const yupSchema = validation.createYupSchema(documentResponse.schema?.attributes, documentResponse.components, {
100
162
  status: documentResponse.document?.status,
163
+ removedAttributes,
101
164
  ...options
102
165
  });
103
- return yupSchema.validateSync(values, {
166
+ return yupSchema.validateSync(cleanedValues, {
104
167
  abortEarly: false
105
168
  });
106
169
  };
@@ -130,6 +193,9 @@ const PreviewPage = ()=>{
130
193
  schema: documentResponse.schema,
131
194
  layout: documentLayoutResponse.edit,
132
195
  onPreview: onPreview,
196
+ iframeRef: iframeRef,
197
+ popoverField: popoverField,
198
+ setPopoverField: setPopoverField,
133
199
  children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Form, {
134
200
  method: "PUT",
135
201
  disabled: query.status === 'published' && documentResponse && documentResponse.document.status !== 'draft',
@@ -137,52 +203,104 @@ const PreviewPage = ()=>{
137
203
  initialErrors: location?.state?.forceValidation ? validateSync(initialValues, {}) : {},
138
204
  height: "100%",
139
205
  validate: (values, options)=>{
206
+ const { data: cleanedValues, removedAttributes } = data.handleInvisibleAttributes(values, {
207
+ schema: documentResponse.schema,
208
+ initialValues,
209
+ components: documentResponse.components
210
+ });
140
211
  const yupSchema = validation.createYupSchema(documentResponse.schema?.attributes, documentResponse.components, {
141
212
  status: documentResponse.document?.status,
213
+ removedAttributes,
142
214
  ...options
143
215
  });
144
- return yupSchema.validate(values, {
216
+ return yupSchema.validate(cleanedValues, {
145
217
  abortEarly: false
146
218
  });
147
219
  },
148
- children: ({ resetForm })=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
149
- direction: "column",
150
- height: "100%",
151
- alignItems: "stretch",
152
- children: [
153
- /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Blocker, {
154
- onProceed: resetForm
155
- }),
156
- /*#__PURE__*/ jsxRuntime.jsx(PreviewHeader.PreviewHeader, {}),
157
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
158
- flex: 1,
159
- overflow: "auto",
160
- alignItems: "stretch",
161
- children: [
162
- hasAdvancedPreview && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
163
- overflow: "auto",
164
- width: isSideEditorOpen ? '50%' : 0,
165
- borderWidth: "0 1px 0 0",
166
- borderColor: "neutral150",
167
- paddingTop: 6,
168
- paddingBottom: 6,
169
- // Remove horizontal padding when the editor is closed or it won't fully disappear
170
- paddingLeft: isSideEditorOpen ? 6 : 0,
171
- paddingRight: isSideEditorOpen ? 6 : 0,
172
- transition: "all 0.2s ease-in-out",
173
- children: /*#__PURE__*/ jsxRuntime.jsx(FormLayout.FormLayout, {
174
- layout: documentLayoutResponse.edit.layout,
175
- document: documentResponse,
176
- hasBackground: false
177
- })
178
- }),
179
- /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
180
- position: "relative",
181
- flex: 1,
182
- height: "100%",
183
- overflow: "hidden",
184
- children: [
185
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
220
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
221
+ direction: "column",
222
+ height: "100%",
223
+ alignItems: "stretch",
224
+ children: [
225
+ /*#__PURE__*/ jsxRuntime.jsx(Blocker.Blocker, {}),
226
+ /*#__PURE__*/ jsxRuntime.jsx(PreviewHeader.PreviewHeader, {}),
227
+ /*#__PURE__*/ jsxRuntime.jsx(InputPopover.InputPopover, {
228
+ documentResponse: documentResponse
229
+ }),
230
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
231
+ flex: 1,
232
+ overflow: "auto",
233
+ alignItems: "stretch",
234
+ children: [
235
+ hasAdvancedPreview && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
236
+ overflow: "auto",
237
+ width: isSideEditorOpen ? '50%' : 0,
238
+ borderWidth: "0 1px 0 0",
239
+ borderColor: "neutral150",
240
+ paddingTop: 6,
241
+ paddingBottom: 6,
242
+ // Remove horizontal padding when the editor is closed or it won't fully disappear
243
+ paddingLeft: isSideEditorOpen ? 6 : 0,
244
+ paddingRight: isSideEditorOpen ? 6 : 0,
245
+ transition: "all 0.2s ease-in-out",
246
+ children: /*#__PURE__*/ jsxRuntime.jsx(FormLayout.FormLayout, {
247
+ layout: documentLayoutResponse.edit.layout,
248
+ document: documentResponse,
249
+ hasBackground: false
250
+ })
251
+ }),
252
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
253
+ direction: "column",
254
+ alignItems: "stretch",
255
+ flex: 1,
256
+ height: "100%",
257
+ overflow: "hidden",
258
+ children: [
259
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
260
+ direction: "row",
261
+ background: "neutral0",
262
+ padding: 2,
263
+ borderWidth: "0 0 1px 0",
264
+ borderColor: "neutral150",
265
+ children: [
266
+ hasAdvancedPreview && /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
267
+ variant: "ghost",
268
+ label: formatMessage(isSideEditorOpen ? {
269
+ id: 'content-manager.preview.content.close-editor',
270
+ defaultMessage: 'Close editor'
271
+ } : {
272
+ id: 'content-manager.preview.content.open-editor',
273
+ defaultMessage: 'Open editor'
274
+ }),
275
+ onClick: ()=>setIsSideEditorOpen((prev)=>!prev),
276
+ children: /*#__PURE__*/ jsxRuntime.jsx(AnimatedArrow, {
277
+ $isSideEditorOpen: isSideEditorOpen
278
+ })
279
+ }),
280
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
281
+ justifyContent: "center",
282
+ flex: 1,
283
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.SingleSelect, {
284
+ value: deviceName,
285
+ onChange: (name)=>setDeviceName(name.toString()),
286
+ "aria-label": formatMessage({
287
+ id: 'content-manager.preview.device.select',
288
+ defaultMessage: 'Select device type'
289
+ }),
290
+ children: DEVICES.map((deviceOption)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.SingleSelectOption, {
291
+ value: deviceOption.name,
292
+ children: formatMessage(deviceOption.label)
293
+ }, deviceOption.name))
294
+ })
295
+ })
296
+ ]
297
+ }),
298
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
299
+ direction: "column",
300
+ justifyContent: "center",
301
+ background: "neutral0",
302
+ flex: 1,
303
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
186
304
  "data-testid": "preview-iframe",
187
305
  ref: iframeRef,
188
306
  src: previewUrl,
@@ -190,34 +308,18 @@ const PreviewPage = ()=>{
190
308
  id: 'content-manager.preview.panel.title',
191
309
  defaultMessage: 'Preview'
192
310
  }),
193
- width: "100%",
194
- height: "100%",
311
+ width: device.width,
312
+ height: device.height,
195
313
  borderWidth: 0,
196
314
  tag: "iframe"
197
- }, previewUrl),
198
- hasAdvancedPreview && /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
199
- variant: "tertiary",
200
- label: formatMessage(isSideEditorOpen ? {
201
- id: 'content-manager.preview.content.close-editor',
202
- defaultMessage: 'Close editor'
203
- } : {
204
- id: 'content-manager.preview.content.open-editor',
205
- defaultMessage: 'Open editor'
206
- }),
207
- onClick: ()=>setIsSideEditorOpen((prev)=>!prev),
208
- position: "absolute",
209
- top: 2,
210
- left: 2,
211
- children: /*#__PURE__*/ jsxRuntime.jsx(AnimatedArrow, {
212
- isSideEditorOpen: isSideEditorOpen
213
- })
214
- })
215
- ]
216
- })
217
- ]
218
- })
219
- ]
220
- })
315
+ }, previewUrl)
316
+ })
317
+ ]
318
+ })
319
+ ]
320
+ })
321
+ ]
322
+ })
221
323
  })
222
324
  })
223
325
  ]
@@ -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 Blocker,\n} from '@strapi/admin/strapi-admin';\nimport { Box, Flex, FocusTrap, IconButton, Portal } from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled } 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 { FormLayout } from '../../pages/EditView/components/FormLayout';\nimport { buildValidParams } from '../../utils/api';\nimport { createYupSchema } from '../../utils/validation';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\n\nimport type { UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\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 layout: EditLayout;\n onPreview: () => 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\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\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 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) {\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 yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n ...options,\n }\n );\n\n return yupSchema.validateSync(values, { 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 layout={documentLayoutResponse.edit}\n onPreview={onPreview}\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 yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n ...options,\n }\n );\n\n return yupSchema.validate(values, { abortEarly: false });\n }}\n >\n {({ resetForm }) => (\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <Blocker onProceed={resetForm} />\n <PreviewHeader />\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\n <Box position=\"relative\" flex={1} height=\"100%\" overflow=\"hidden\">\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=\"100%\"\n height=\"100%\"\n borderWidth={0}\n tag=\"iframe\"\n />\n {hasAdvancedPreview && (\n <IconButton\n variant=\"tertiary\"\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 position=\"absolute\"\n top={2}\n left={2}\n >\n <AnimatedArrow isSideEditorOpen={isSideEditorOpen} />\n </IconButton>\n )}\n </Box>\n </Flex>\n </Flex>\n )}\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=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\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 };\n"],"names":["PreviewProvider","usePreviewContext","createContext","AnimatedArrow","styled","ArrowLineLeft","props","isSideEditorOpen","PreviewPage","location","useLocation","formatMessage","useIntl","iframeRef","React","useRef","setIsSideEditorOpen","useState","slug","model","id","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","Error","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","locale","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","data","url","NoData","documentTitle","getTitle","edit","settings","mainField","validateSync","values","options","yupSchema","createYupSchema","attributes","components","abortEarly","previewUrl","onPreview","current","contentWindow","postMessage","type","URL","src","origin","hasAdvancedPreview","window","strapi","features","isEnabled","_jsxs","_Fragment","Title","defaultMessage","title","layout","FormContext","method","disabled","initialErrors","state","forceValidation","height","validate","resetForm","Flex","direction","alignItems","Blocker","onProceed","PreviewHeader","flex","overflow","Box","width","borderWidth","borderColor","paddingTop","paddingBottom","paddingLeft","paddingRight","transition","FormLayout","hasBackground","position","data-testid","ref","tag","IconButton","variant","label","onClick","prev","top","left","ProtectedPreviewPageImpl","permissions","useRBAC","action","subject","zIndex","background","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} 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 } 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, INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\nimport { previewScript } from '../utils/previewScript';\n\nimport type { 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 {\n path: string;\n position: DOMRect;\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 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\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\n const [popoverField, setPopoverField] = React.useState<PopoverField | null>(null);\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 // 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()})()`;\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {\n setPopoverField?.(event.data.payload);\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, []);\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 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=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\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 };\n"],"names":["DEVICES","name","label","id","defaultMessage","width","height","PreviewProvider","usePreviewContext","createContext","AnimatedArrow","styled","ArrowLineLeft","props","$isSideEditorOpen","PreviewPage","location","useLocation","formatMessage","useIntl","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","slug","model","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","PUBLIC_EVENTS","PREVIEW_READY","script","previewScript","toString","sendMessage","getSendMessage","STRAPI_SCRIPT","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS_INTENT","payload","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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"}