@strapi/content-manager 0.0.0-experimental.00b482b8dcda6164537baf70d52b4b2535560c36 → 0.0.0-experimental.00fefb05c5c56986f41a4710d5a5e719b5ae58ed

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 (125) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +4 -1
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +5 -2
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/components/ConfigurationForm/Form.js +1 -1
  6. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
  7. package/dist/admin/components/ConfigurationForm/Form.mjs +3 -3
  8. package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -1
  9. package/dist/admin/components/DragPreviews/CardDragPreview.js +3 -1
  10. package/dist/admin/components/DragPreviews/CardDragPreview.js.map +1 -1
  11. package/dist/admin/components/DragPreviews/CardDragPreview.mjs +3 -1
  12. package/dist/admin/components/DragPreviews/CardDragPreview.mjs.map +1 -1
  13. package/dist/admin/components/DragPreviews/ComponentDragPreview.js +3 -1
  14. package/dist/admin/components/DragPreviews/ComponentDragPreview.js.map +1 -1
  15. package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs +3 -1
  16. package/dist/admin/components/DragPreviews/ComponentDragPreview.mjs.map +1 -1
  17. package/dist/admin/components/DragPreviews/RelationDragPreview.js +3 -1
  18. package/dist/admin/components/DragPreviews/RelationDragPreview.js.map +1 -1
  19. package/dist/admin/components/DragPreviews/RelationDragPreview.mjs +3 -1
  20. package/dist/admin/components/DragPreviews/RelationDragPreview.mjs.map +1 -1
  21. package/dist/admin/components/LeftMenu.js +87 -45
  22. package/dist/admin/components/LeftMenu.js.map +1 -1
  23. package/dist/admin/components/LeftMenu.mjs +89 -47
  24. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  25. package/dist/admin/history/components/VersionHeader.js +1 -0
  26. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  27. package/dist/admin/history/components/VersionHeader.mjs +1 -0
  28. package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
  29. package/dist/admin/history/components/VersionsList.js +1 -1
  30. package/dist/admin/history/components/VersionsList.js.map +1 -1
  31. package/dist/admin/history/components/VersionsList.mjs +1 -1
  32. package/dist/admin/history/components/VersionsList.mjs.map +1 -1
  33. package/dist/admin/history/pages/History.js +7 -7
  34. package/dist/admin/history/pages/History.js.map +1 -1
  35. package/dist/admin/history/pages/History.mjs +7 -7
  36. package/dist/admin/history/pages/History.mjs.map +1 -1
  37. package/dist/admin/layout.js +27 -6
  38. package/dist/admin/layout.js.map +1 -1
  39. package/dist/admin/layout.mjs +28 -7
  40. package/dist/admin/layout.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/EditViewPage.js +7 -3
  42. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  43. package/dist/admin/pages/EditView/EditViewPage.mjs +8 -4
  44. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +2 -2
  46. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +2 -2
  48. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +2 -1
  50. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +3 -2
  52. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +1 -2
  54. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +1 -2
  56. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +2 -1
  58. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +3 -2
  60. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +2 -1
  62. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +3 -2
  64. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +2 -2
  66. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +2 -2
  68. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormLayout.js +13 -8
  70. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormLayout.mjs +14 -8
  72. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  73. package/dist/admin/pages/EditView/components/Header.js +22 -7
  74. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/Header.mjs +23 -8
  76. package/dist/admin/pages/EditView/components/Header.mjs.map +1 -1
  77. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +1 -0
  78. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  79. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +1 -0
  80. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
  81. package/dist/admin/preview/components/InputPopover.js +29 -9
  82. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  83. package/dist/admin/preview/components/InputPopover.mjs +31 -11
  84. package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
  85. package/dist/admin/preview/pages/Preview.js +6 -6
  86. package/dist/admin/preview/pages/Preview.js.map +1 -1
  87. package/dist/admin/preview/pages/Preview.mjs +6 -6
  88. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  89. package/dist/admin/preview/utils/constants.js +34 -0
  90. package/dist/admin/preview/utils/constants.js.map +1 -1
  91. package/dist/admin/preview/utils/constants.mjs +34 -1
  92. package/dist/admin/preview/utils/constants.mjs.map +1 -1
  93. package/dist/admin/preview/utils/fieldUtils.js +13 -4
  94. package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
  95. package/dist/admin/preview/utils/fieldUtils.mjs +13 -5
  96. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
  97. package/dist/admin/preview/utils/previewScript.js +120 -44
  98. package/dist/admin/preview/utils/previewScript.js.map +1 -1
  99. package/dist/admin/preview/utils/previewScript.mjs +120 -44
  100. package/dist/admin/preview/utils/previewScript.mjs.map +1 -1
  101. package/dist/admin/src/components/LeftMenu.d.ts +3 -1
  102. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  103. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +0 -3
  104. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  105. package/dist/admin/src/preview/utils/constants.d.ts +35 -0
  106. package/dist/admin/src/preview/utils/fieldUtils.d.ts +6 -0
  107. package/dist/admin/src/preview/utils/previewScript.d.ts +1 -0
  108. package/dist/admin/src/services/api.d.ts +1 -1
  109. package/dist/admin/src/services/components.d.ts +2 -2
  110. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  111. package/dist/admin/src/services/documents.d.ts +16 -16
  112. package/dist/admin/src/services/homepage.d.ts +1 -1
  113. package/dist/admin/src/services/init.d.ts +1 -1
  114. package/dist/admin/src/services/relations.d.ts +2 -2
  115. package/dist/admin/src/services/uid.d.ts +3 -3
  116. package/dist/admin/translations/en.json.js +5 -0
  117. package/dist/admin/translations/en.json.js.map +1 -1
  118. package/dist/admin/translations/en.json.mjs +5 -0
  119. package/dist/admin/translations/en.json.mjs.map +1 -1
  120. package/dist/server/controllers/relations.js +6 -4
  121. package/dist/server/controllers/relations.js.map +1 -1
  122. package/dist/server/controllers/relations.mjs +6 -4
  123. package/dist/server/controllers/relations.mjs.map +1 -1
  124. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  125. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"InputPopover.mjs","sources":["../../../../admin/src/preview/components/InputPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, useNotification } from '@strapi/admin/strapi-admin';\nimport { Box, Popover } from '@strapi/design-system';\n\nimport { type UseDocument } from '../../hooks/useDocument';\nimport { InputRenderer } from '../../pages/EditView/components/InputRenderer';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { parseFieldMetaData, getAttributeSchemaFromPath } from '../utils/fieldUtils';\n\n/* -------------------------------------------------------------------------------------------------\n * Context utils\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * No need for actual data in the context. It's just to let children check if they're rendered\n * inside of a preview InputPopover without relying on prop drilling.\n */\ninterface InputPopoverContextValue {}\n\nconst [InputPopoverProvider, useInputPopoverContext] =\n createContext<InputPopoverContextValue>('InputPopover');\n\nfunction useHasInputPopoverParent() {\n const context = useInputPopoverContext('useHasInputPopoverParent', () => true, false);\n\n // useContext will return undefined if the called is not wrapped in the provider\n return context !== undefined;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * InputPopover\n * -----------------------------------------------------------------------------------------------*/\n\nconst InputPopover = ({ documentResponse }: { documentResponse: ReturnType<UseDocument> }) => {\n const iframeRef = usePreviewContext('InputPopover', (state) => state.iframeRef);\n const popoverField = usePreviewContext('InputPopover', (state) => state.popoverField);\n const setPopoverField = usePreviewContext('InputPopover', (state) => state.setPopoverField);\n const document = usePreviewContext('InputPopover', (state) => state.document);\n const schema = usePreviewContext('InputPopover', (state) => state.schema);\n const components = usePreviewContext('InputPopover', (state) => state.components);\n const { toggleNotification } = useNotification();\n\n React.useEffect(() => {\n /**\n * We receive window events sent from the user's preview via the injected script.\n * We listen to the ones here that target a specific field.\n */\n const handleMessage = (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {\n const fieldMetaData = parseFieldMetaData(event.data.payload.path);\n\n // TODO: check if notification better\n if (!fieldMetaData) {\n toggleNotification({\n type: 'warning',\n message: 'Incomplete strapiSource attribute',\n });\n return;\n }\n\n /**\n * Ignore (for now) content that comes from separate API requests than the one for the\n * current document. This doesn't do anything about fields that may come from relations to\n * the current document however.\n */\n if (fieldMetaData.documentId !== document.documentId) {\n toggleNotification({\n type: 'warning',\n message: 'This field comes from a different document',\n });\n return;\n }\n\n try {\n const attribute = getAttributeSchemaFromPath({\n path: fieldMetaData.path,\n components,\n schema,\n document,\n });\n\n // We're able to handle the field, set it in context so the popover can pick it up\n setPopoverField({ ...fieldMetaData, position: event.data.payload.position, attribute });\n } catch (error) {\n if (error instanceof Error) {\n toggleNotification({ type: 'warning', message: error.message });\n }\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [components, document, iframeRef, schema, setPopoverField, toggleNotification]);\n if (!popoverField || !iframeRef.current) {\n return null;\n }\n\n const iframeRect = iframeRef.current.getBoundingClientRect();\n\n return (\n <>\n {/**\n * Overlay an empty div on top of the iframe while the popover is open so it can\n * intercept clicks. Without it, we wouldn't be able to close the popover by clicking outside,\n * because the click would be detected by the iframe window, not by the admin.\n **/}\n <Box\n position={'fixed'}\n top={iframeRect.top + 'px'}\n left={iframeRect.left + 'px'}\n width={iframeRect.width + 'px'}\n height={iframeRect.height + 'px'}\n zIndex={4}\n />\n <InputPopoverProvider>\n <Popover.Root open={true} onOpenChange={(open) => !open && setPopoverField(null)}>\n <Popover.Trigger>\n <Box\n position=\"fixed\"\n width={popoverField.position.width + 'px'}\n height={popoverField.position.height + 'px'}\n top={0}\n left={0}\n transform={`translate(${iframeRect.left + popoverField.position.left}px, ${iframeRect.top + popoverField.position.top}px)`}\n />\n </Popover.Trigger>\n <Popover.Content sideOffset={4}>\n <Box padding={4} width=\"400px\">\n {/* @ts-expect-error the types of `attribute` clash for some reason */}\n <InputRenderer\n document={documentResponse}\n attribute={popoverField.attribute}\n // TODO: retrieve the proper label from the layout\n label={popoverField.path}\n name={popoverField.path}\n type={popoverField.attribute.type}\n visible={true}\n />\n </Box>\n </Popover.Content>\n </Popover.Root>\n </InputPopoverProvider>\n </>\n );\n};\n\nexport { InputPopover, useHasInputPopoverParent };\n"],"names":["InputPopoverProvider","useInputPopoverContext","createContext","useHasInputPopoverParent","context","undefined","InputPopover","documentResponse","iframeRef","usePreviewContext","state","popoverField","setPopoverField","document","schema","components","toggleNotification","useNotification","React","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS_INTENT","fieldMetaData","parseFieldMetaData","payload","path","message","documentId","attribute","getAttributeSchemaFromPath","position","error","Error","window","addEventListener","removeEventListener","iframeRect","getBoundingClientRect","_jsxs","_Fragment","_jsx","Box","top","left","width","height","zIndex","Popover","Root","open","onOpenChange","Trigger","transform","Content","sideOffset","padding","InputRenderer","label","name","visible"],"mappings":"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"}
1
+ {"version":3,"file":"InputPopover.mjs","sources":["../../../../admin/src/preview/components/InputPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, useNotification } from '@strapi/admin/strapi-admin';\nimport { Box, Popover } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { type UseDocument } from '../../hooks/useDocument';\nimport { InputRenderer } from '../../pages/EditView/components/InputRenderer';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS, PREVIEW_ERROR_MESSAGES } from '../utils/constants';\nimport {\n parseFieldMetaData,\n getAttributeSchemaFromPath,\n PreviewFieldError,\n} from '../utils/fieldUtils';\n\n/* -------------------------------------------------------------------------------------------------\n * Context utils\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * No need for actual data in the context. It's just to let children check if they're rendered\n * inside of a preview InputPopover without relying on prop drilling.\n */\ninterface InputPopoverContextValue {}\n\nconst [InputPopoverProvider, useInputPopoverContext] =\n createContext<InputPopoverContextValue>('InputPopover');\n\nfunction useHasInputPopoverParent() {\n const context = useInputPopoverContext('useHasInputPopoverParent', () => true, false);\n\n // useContext will return undefined if the called is not wrapped in the provider\n return context !== undefined;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * InputPopover\n * -----------------------------------------------------------------------------------------------*/\n\nconst InputPopover = ({ documentResponse }: { documentResponse: ReturnType<UseDocument> }) => {\n const iframeRef = usePreviewContext('InputPopover', (state) => state.iframeRef);\n const popoverField = usePreviewContext('InputPopover', (state) => state.popoverField);\n const setPopoverField = usePreviewContext('InputPopover', (state) => state.setPopoverField);\n const document = usePreviewContext('InputPopover', (state) => state.document);\n const schema = usePreviewContext('InputPopover', (state) => state.schema);\n const components = usePreviewContext('InputPopover', (state) => state.components);\n\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n\n React.useEffect(() => {\n /**\n * We receive window events sent from the user's preview via the injected script.\n * We listen to the ones here that target a specific field.\n */\n const handleMessage = (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {\n const fieldMetaData = parseFieldMetaData(event.data.payload.path);\n\n if (!fieldMetaData) {\n const { type, message } = PREVIEW_ERROR_MESSAGES.INCOMPLETE_STRAPI_SOURCE;\n toggleNotification({ type, message: formatMessage(message) });\n return;\n }\n\n /**\n * Ignore (for now) content that comes from separate API requests than the one for the\n * current document. This doesn't do anything about fields that may come from relations to\n * the current document however.\n */\n if (fieldMetaData.documentId !== document.documentId) {\n const { type, message } = PREVIEW_ERROR_MESSAGES.DIFFERENT_DOCUMENT;\n toggleNotification({ type, message: formatMessage(message) });\n return;\n }\n\n try {\n const attribute = getAttributeSchemaFromPath({\n path: fieldMetaData.path,\n components,\n schema,\n document,\n });\n\n // We're able to handle the field, set it in context so the popover can pick it up\n setPopoverField({ ...fieldMetaData, position: event.data.payload.position, attribute });\n } catch (error) {\n if (error instanceof PreviewFieldError) {\n const { type, message } = PREVIEW_ERROR_MESSAGES[error.messageKey];\n toggleNotification({ type, message: formatMessage(message) });\n } else if (error instanceof Error) {\n toggleNotification({ type: 'danger', message: error.message });\n }\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_SINGLE_CLICK_HINT) {\n toggleNotification({\n type: 'info',\n message: formatMessage({\n id: 'content-manager.preview.info.single-click-hint',\n defaultMessage: 'Double click to edit',\n }),\n });\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [components, document, iframeRef, schema, setPopoverField, toggleNotification, formatMessage]);\n if (!popoverField || !iframeRef.current) {\n return null;\n }\n\n const iframeRect = iframeRef.current.getBoundingClientRect();\n\n return (\n <>\n {/**\n * Overlay an empty div on top of the iframe while the popover is open so it can\n * intercept clicks. Without it, we wouldn't be able to close the popover by clicking outside,\n * because the click would be detected by the iframe window, not by the admin.\n **/}\n <Box\n position={'fixed'}\n top={iframeRect.top + 'px'}\n left={iframeRect.left + 'px'}\n width={iframeRect.width + 'px'}\n height={iframeRect.height + 'px'}\n zIndex={4}\n onClick={() => iframeRef.current?.focus()}\n />\n <InputPopoverProvider>\n <Popover.Root open={true} onOpenChange={(open) => !open && setPopoverField(null)}>\n <Popover.Trigger>\n <Box\n position=\"fixed\"\n width={popoverField.position.width + 'px'}\n height={popoverField.position.height + 'px'}\n top={0}\n left={0}\n transform={`translate(${iframeRect.left + popoverField.position.left}px, ${iframeRect.top + popoverField.position.top}px)`}\n />\n </Popover.Trigger>\n <Popover.Content sideOffset={4}>\n <Box padding={4} width=\"400px\">\n {/* @ts-expect-error the types of `attribute` clash for some reason */}\n <InputRenderer\n document={documentResponse}\n attribute={popoverField.attribute}\n // TODO: retrieve the proper label from the layout\n label={popoverField.path}\n name={popoverField.path}\n type={popoverField.attribute.type}\n visible={true}\n />\n </Box>\n </Popover.Content>\n </Popover.Root>\n </InputPopoverProvider>\n </>\n );\n};\n\nexport { InputPopover, useHasInputPopoverParent };\n"],"names":["InputPopoverProvider","useInputPopoverContext","createContext","useHasInputPopoverParent","context","undefined","InputPopover","documentResponse","iframeRef","usePreviewContext","state","popoverField","setPopoverField","document","schema","components","toggleNotification","useNotification","formatMessage","useIntl","React","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS_INTENT","fieldMetaData","parseFieldMetaData","payload","path","message","PREVIEW_ERROR_MESSAGES","INCOMPLETE_STRAPI_SOURCE","documentId","DIFFERENT_DOCUMENT","attribute","getAttributeSchemaFromPath","position","error","PreviewFieldError","messageKey","Error","STRAPI_FIELD_SINGLE_CLICK_HINT","id","defaultMessage","window","addEventListener","removeEventListener","iframeRect","getBoundingClientRect","_jsxs","_Fragment","_jsx","Box","top","left","width","height","zIndex","onClick","focus","Popover","Root","open","onOpenChange","Trigger","transform","Content","sideOffset","padding","InputRenderer","label","name","visible"],"mappings":"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"}
@@ -350,23 +350,23 @@ const PreviewPage = ()=>{
350
350
  }
351
351
  if (error || !model) {
352
352
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
353
- height: "100vh",
354
- width: "100vw",
353
+ height: "100dvh",
354
+ width: "100dvw",
355
355
  position: "fixed",
356
356
  top: 0,
357
357
  left: 0,
358
- zIndex: 2,
358
+ zIndex: 5,
359
359
  background: "neutral0",
360
360
  children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Error, {})
361
361
  });
362
362
  }
363
363
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
364
- height: "100vh",
365
- width: "100vw",
364
+ height: "100dvh",
365
+ width: "100dvw",
366
366
  position: "fixed",
367
367
  top: 0,
368
368
  left: 0,
369
- zIndex: 2,
369
+ zIndex: 5,
370
370
  background: "neutral0",
371
371
  children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Protect, {
372
372
  permissions: permissions.filter((permission)=>permission.action.includes('explorer.read')),
@@ -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 } 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\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 // 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\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [documentId, toggleNotification]);\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=\"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 };\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","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","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","PUBLIC_EVENTS","PREVIEW_READY","script","previewScript","toString","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 } 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\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 // 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\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [documentId, toggleNotification]);\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","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","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","PUBLIC_EVENTS","PREVIEW_READY","script","previewScript","toString","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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"}
@@ -329,23 +329,23 @@ const PreviewPage = ()=>{
329
329
  }
330
330
  if (error || !model) {
331
331
  return /*#__PURE__*/ jsx(Box, {
332
- height: "100vh",
333
- width: "100vw",
332
+ height: "100dvh",
333
+ width: "100dvw",
334
334
  position: "fixed",
335
335
  top: 0,
336
336
  left: 0,
337
- zIndex: 2,
337
+ zIndex: 5,
338
338
  background: "neutral0",
339
339
  children: /*#__PURE__*/ jsx(Page.Error, {})
340
340
  });
341
341
  }
342
342
  return /*#__PURE__*/ jsx(Box, {
343
- height: "100vh",
344
- width: "100vw",
343
+ height: "100dvh",
344
+ width: "100dvw",
345
345
  position: "fixed",
346
346
  top: 0,
347
347
  left: 0,
348
- zIndex: 2,
348
+ zIndex: 5,
349
349
  background: "neutral0",
350
350
  children: /*#__PURE__*/ jsx(Page.Protect, {
351
351
  permissions: permissions.filter((permission)=>permission.action.includes('explorer.read')),
@@ -1 +1 @@
1
- {"version":3,"file":"Preview.mjs","sources":["../../../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useQueryParams,\n useRBAC,\n createContext,\n Form as FormContext,\n type FieldContentSourceMap,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled } 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\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 // 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\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [documentId, toggleNotification]);\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=\"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 };\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","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","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","PUBLIC_EVENTS","PREVIEW_READY","script","previewScript","toString","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.mjs","sources":["../../../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useQueryParams,\n useRBAC,\n createContext,\n Form as FormContext,\n type FieldContentSourceMap,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled } 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\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 // 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\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [documentId, toggleNotification]);\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","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","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","PUBLIC_EVENTS","PREVIEW_READY","script","previewScript","toString","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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"}
@@ -16,7 +16,41 @@ const scriptResponse = previewScript.previewScript(false);
16
16
  STRAPI_UPDATE: 'strapiUpdate',
17
17
  STRAPI_SCRIPT: 'strapiScript'
18
18
  };
19
+ /**
20
+ * Error messages for preview field operations.
21
+ * This information is used to trigger notifications.
22
+ */ const PREVIEW_ERROR_MESSAGES = {
23
+ INVALID_FIELD_PATH: {
24
+ type: 'danger',
25
+ message: {
26
+ id: 'content-manager.preview.error.invalid-field-path',
27
+ defaultMessage: 'Could not locate this field in the current document'
28
+ }
29
+ },
30
+ RELATIONS_NOT_HANDLED: {
31
+ type: 'info',
32
+ message: {
33
+ id: 'content-manager.preview.error.relations-not-handled',
34
+ defaultMessage: 'Inline editing for relations is not currently supported.'
35
+ }
36
+ },
37
+ INCOMPLETE_STRAPI_SOURCE: {
38
+ type: 'danger',
39
+ message: {
40
+ id: 'content-manager.preview.error.incomplete-strapi-source',
41
+ defaultMessage: 'This field is missing some required preview information'
42
+ }
43
+ },
44
+ DIFFERENT_DOCUMENT: {
45
+ type: 'info',
46
+ message: {
47
+ id: 'content-manager.preview.error.different-document',
48
+ defaultMessage: 'This field comes from a different document'
49
+ }
50
+ }
51
+ };
19
52
 
20
53
  exports.INTERNAL_EVENTS = INTERNAL_EVENTS;
54
+ exports.PREVIEW_ERROR_MESSAGES = PREVIEW_ERROR_MESSAGES;
21
55
  exports.PUBLIC_EVENTS = PUBLIC_EVENTS;
22
56
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../../../admin/src/preview/utils/constants.ts"],"sourcesContent":["import { previewScript } from './previewScript';\n\nconst scriptResponse = previewScript(false);\n\n/**\n * These events can be changed safely. They're used by the content manager admin on one side, and by\n * the preview script on the other. We own both ends, and they're not documented to users, so we can\n * do what we want with them.\n */\nexport const INTERNAL_EVENTS = scriptResponse!.INTERNAL_EVENTS;\n\n/**\n * These events are documented to users, and will be hardcoded in their frontends.\n * Changing any of these would be a breaking change.\n */\nexport const PUBLIC_EVENTS = {\n PREVIEW_READY: 'previewReady',\n STRAPI_UPDATE: 'strapiUpdate',\n STRAPI_SCRIPT: 'strapiScript',\n} as const;\n"],"names":["scriptResponse","previewScript","INTERNAL_EVENTS","PUBLIC_EVENTS","PREVIEW_READY","STRAPI_UPDATE","STRAPI_SCRIPT"],"mappings":";;;;AAEA,MAAMA,iBAAiBC,2BAAc,CAAA,KAAA,CAAA;AAErC;;;;AAIC,IACM,MAAMC,eAAkBF,GAAAA,cAAAA,CAAgBE;AAE/C;;;UAIaC,aAAgB,GAAA;IAC3BC,aAAe,EAAA,cAAA;IACfC,aAAe,EAAA,cAAA;IACfC,aAAe,EAAA;AACjB;;;;;"}
1
+ {"version":3,"file":"constants.js","sources":["../../../../admin/src/preview/utils/constants.ts"],"sourcesContent":["import { NotificationConfig } from '@strapi/admin/strapi-admin';\nimport { MessageDescriptor } from 'react-intl';\n\nimport { previewScript } from './previewScript';\n\nconst scriptResponse = previewScript(false);\n\n/**\n * These events can be changed safely. They're used by the content manager admin on one side, and by\n * the preview script on the other. We own both ends, and they're not documented to users, so we can\n * do what we want with them.\n */\nexport const INTERNAL_EVENTS = scriptResponse!.INTERNAL_EVENTS;\n\n/**\n * These events are documented to users, and will be hardcoded in their frontends.\n * Changing any of these would be a breaking change.\n */\nexport const PUBLIC_EVENTS = {\n PREVIEW_READY: 'previewReady',\n STRAPI_UPDATE: 'strapiUpdate',\n STRAPI_SCRIPT: 'strapiScript',\n} as const;\n\n/**\n * Error messages for preview field operations.\n * This information is used to trigger notifications.\n */\nexport const PREVIEW_ERROR_MESSAGES = {\n INVALID_FIELD_PATH: {\n type: 'danger',\n message: {\n id: 'content-manager.preview.error.invalid-field-path',\n defaultMessage: 'Could not locate this field in the current document',\n },\n },\n RELATIONS_NOT_HANDLED: {\n type: 'info',\n message: {\n id: 'content-manager.preview.error.relations-not-handled',\n defaultMessage: 'Inline editing for relations is not currently supported.',\n },\n },\n INCOMPLETE_STRAPI_SOURCE: {\n type: 'danger',\n message: {\n id: 'content-manager.preview.error.incomplete-strapi-source',\n defaultMessage: 'This field is missing some required preview information',\n },\n },\n DIFFERENT_DOCUMENT: {\n type: 'info',\n message: {\n id: 'content-manager.preview.error.different-document',\n defaultMessage: 'This field comes from a different document',\n },\n },\n} as const satisfies Record<\n string,\n { message: MessageDescriptor; type: NonNullable<NotificationConfig['type']> }\n>;\n"],"names":["scriptResponse","previewScript","INTERNAL_EVENTS","PUBLIC_EVENTS","PREVIEW_READY","STRAPI_UPDATE","STRAPI_SCRIPT","PREVIEW_ERROR_MESSAGES","INVALID_FIELD_PATH","type","message","id","defaultMessage","RELATIONS_NOT_HANDLED","INCOMPLETE_STRAPI_SOURCE","DIFFERENT_DOCUMENT"],"mappings":";;;;AAKA,MAAMA,iBAAiBC,2BAAc,CAAA,KAAA,CAAA;AAErC;;;;AAIC,IACM,MAAMC,eAAkBF,GAAAA,cAAAA,CAAgBE;AAE/C;;;UAIaC,aAAgB,GAAA;IAC3BC,aAAe,EAAA,cAAA;IACfC,aAAe,EAAA,cAAA;IACfC,aAAe,EAAA;AACjB;AAEA;;;UAIaC,sBAAyB,GAAA;IACpCC,kBAAoB,EAAA;QAClBC,IAAM,EAAA,QAAA;QACNC,OAAS,EAAA;YACPC,EAAI,EAAA,kDAAA;YACJC,cAAgB,EAAA;AAClB;AACF,KAAA;IACAC,qBAAuB,EAAA;QACrBJ,IAAM,EAAA,MAAA;QACNC,OAAS,EAAA;YACPC,EAAI,EAAA,qDAAA;YACJC,cAAgB,EAAA;AAClB;AACF,KAAA;IACAE,wBAA0B,EAAA;QACxBL,IAAM,EAAA,QAAA;QACNC,OAAS,EAAA;YACPC,EAAI,EAAA,wDAAA;YACJC,cAAgB,EAAA;AAClB;AACF,KAAA;IACAG,kBAAoB,EAAA;QAClBN,IAAM,EAAA,MAAA;QACNC,OAAS,EAAA;YACPC,EAAI,EAAA,kDAAA;YACJC,cAAgB,EAAA;AAClB;AACF;AACF;;;;;;"}
@@ -14,6 +14,39 @@ const scriptResponse = previewScript(false);
14
14
  STRAPI_UPDATE: 'strapiUpdate',
15
15
  STRAPI_SCRIPT: 'strapiScript'
16
16
  };
17
+ /**
18
+ * Error messages for preview field operations.
19
+ * This information is used to trigger notifications.
20
+ */ const PREVIEW_ERROR_MESSAGES = {
21
+ INVALID_FIELD_PATH: {
22
+ type: 'danger',
23
+ message: {
24
+ id: 'content-manager.preview.error.invalid-field-path',
25
+ defaultMessage: 'Could not locate this field in the current document'
26
+ }
27
+ },
28
+ RELATIONS_NOT_HANDLED: {
29
+ type: 'info',
30
+ message: {
31
+ id: 'content-manager.preview.error.relations-not-handled',
32
+ defaultMessage: 'Inline editing for relations is not currently supported.'
33
+ }
34
+ },
35
+ INCOMPLETE_STRAPI_SOURCE: {
36
+ type: 'danger',
37
+ message: {
38
+ id: 'content-manager.preview.error.incomplete-strapi-source',
39
+ defaultMessage: 'This field is missing some required preview information'
40
+ }
41
+ },
42
+ DIFFERENT_DOCUMENT: {
43
+ type: 'info',
44
+ message: {
45
+ id: 'content-manager.preview.error.different-document',
46
+ defaultMessage: 'This field comes from a different document'
47
+ }
48
+ }
49
+ };
17
50
 
18
- export { INTERNAL_EVENTS, PUBLIC_EVENTS };
51
+ export { INTERNAL_EVENTS, PREVIEW_ERROR_MESSAGES, PUBLIC_EVENTS };
19
52
  //# sourceMappingURL=constants.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.mjs","sources":["../../../../admin/src/preview/utils/constants.ts"],"sourcesContent":["import { previewScript } from './previewScript';\n\nconst scriptResponse = previewScript(false);\n\n/**\n * These events can be changed safely. They're used by the content manager admin on one side, and by\n * the preview script on the other. We own both ends, and they're not documented to users, so we can\n * do what we want with them.\n */\nexport const INTERNAL_EVENTS = scriptResponse!.INTERNAL_EVENTS;\n\n/**\n * These events are documented to users, and will be hardcoded in their frontends.\n * Changing any of these would be a breaking change.\n */\nexport const PUBLIC_EVENTS = {\n PREVIEW_READY: 'previewReady',\n STRAPI_UPDATE: 'strapiUpdate',\n STRAPI_SCRIPT: 'strapiScript',\n} as const;\n"],"names":["scriptResponse","previewScript","INTERNAL_EVENTS","PUBLIC_EVENTS","PREVIEW_READY","STRAPI_UPDATE","STRAPI_SCRIPT"],"mappings":";;AAEA,MAAMA,iBAAiBC,aAAc,CAAA,KAAA,CAAA;AAErC;;;;AAIC,IACM,MAAMC,eAAkBF,GAAAA,cAAAA,CAAgBE;AAE/C;;;UAIaC,aAAgB,GAAA;IAC3BC,aAAe,EAAA,cAAA;IACfC,aAAe,EAAA,cAAA;IACfC,aAAe,EAAA;AACjB;;;;"}
1
+ {"version":3,"file":"constants.mjs","sources":["../../../../admin/src/preview/utils/constants.ts"],"sourcesContent":["import { NotificationConfig } from '@strapi/admin/strapi-admin';\nimport { MessageDescriptor } from 'react-intl';\n\nimport { previewScript } from './previewScript';\n\nconst scriptResponse = previewScript(false);\n\n/**\n * These events can be changed safely. They're used by the content manager admin on one side, and by\n * the preview script on the other. We own both ends, and they're not documented to users, so we can\n * do what we want with them.\n */\nexport const INTERNAL_EVENTS = scriptResponse!.INTERNAL_EVENTS;\n\n/**\n * These events are documented to users, and will be hardcoded in their frontends.\n * Changing any of these would be a breaking change.\n */\nexport const PUBLIC_EVENTS = {\n PREVIEW_READY: 'previewReady',\n STRAPI_UPDATE: 'strapiUpdate',\n STRAPI_SCRIPT: 'strapiScript',\n} as const;\n\n/**\n * Error messages for preview field operations.\n * This information is used to trigger notifications.\n */\nexport const PREVIEW_ERROR_MESSAGES = {\n INVALID_FIELD_PATH: {\n type: 'danger',\n message: {\n id: 'content-manager.preview.error.invalid-field-path',\n defaultMessage: 'Could not locate this field in the current document',\n },\n },\n RELATIONS_NOT_HANDLED: {\n type: 'info',\n message: {\n id: 'content-manager.preview.error.relations-not-handled',\n defaultMessage: 'Inline editing for relations is not currently supported.',\n },\n },\n INCOMPLETE_STRAPI_SOURCE: {\n type: 'danger',\n message: {\n id: 'content-manager.preview.error.incomplete-strapi-source',\n defaultMessage: 'This field is missing some required preview information',\n },\n },\n DIFFERENT_DOCUMENT: {\n type: 'info',\n message: {\n id: 'content-manager.preview.error.different-document',\n defaultMessage: 'This field comes from a different document',\n },\n },\n} as const satisfies Record<\n string,\n { message: MessageDescriptor; type: NonNullable<NotificationConfig['type']> }\n>;\n"],"names":["scriptResponse","previewScript","INTERNAL_EVENTS","PUBLIC_EVENTS","PREVIEW_READY","STRAPI_UPDATE","STRAPI_SCRIPT","PREVIEW_ERROR_MESSAGES","INVALID_FIELD_PATH","type","message","id","defaultMessage","RELATIONS_NOT_HANDLED","INCOMPLETE_STRAPI_SOURCE","DIFFERENT_DOCUMENT"],"mappings":";;AAKA,MAAMA,iBAAiBC,aAAc,CAAA,KAAA,CAAA;AAErC;;;;AAIC,IACM,MAAMC,eAAkBF,GAAAA,cAAAA,CAAgBE;AAE/C;;;UAIaC,aAAgB,GAAA;IAC3BC,aAAe,EAAA,cAAA;IACfC,aAAe,EAAA,cAAA;IACfC,aAAe,EAAA;AACjB;AAEA;;;UAIaC,sBAAyB,GAAA;IACpCC,kBAAoB,EAAA;QAClBC,IAAM,EAAA,QAAA;QACNC,OAAS,EAAA;YACPC,EAAI,EAAA,kDAAA;YACJC,cAAgB,EAAA;AAClB;AACF,KAAA;IACAC,qBAAuB,EAAA;QACrBJ,IAAM,EAAA,MAAA;QACNC,OAAS,EAAA;YACPC,EAAI,EAAA,qDAAA;YACJC,cAAgB,EAAA;AAClB;AACF,KAAA;IACAE,wBAA0B,EAAA;QACxBL,IAAM,EAAA,QAAA;QACNC,OAAS,EAAA;YACPC,EAAI,EAAA,wDAAA;YACJC,cAAgB,EAAA;AAClB;AACF,KAAA;IACAG,kBAAoB,EAAA;QAClBN,IAAM,EAAA,MAAA;QACNC,OAAS,EAAA;YACPC,EAAI,EAAA,kDAAA;YACJC,cAAgB,EAAA;AAClB;AACF;AACF;;;;"}
@@ -1,5 +1,13 @@
1
1
  'use strict';
2
2
 
3
+ // Generic error class for preview field operations
4
+ class PreviewFieldError extends Error {
5
+ constructor(messageKey){
6
+ super(messageKey);
7
+ this.name = 'PreviewFieldError';
8
+ this.messageKey = messageKey;
9
+ }
10
+ }
3
11
  // Helper function to parse path with array indices and return clean attribute names
4
12
  const parsePathWithIndices = (path)=>{
5
13
  // Split by dots, then parse array indices from each part. For example:
@@ -40,17 +48,17 @@ function getAttributeSchemaFromPath({ path, schema, components, document }) {
40
48
  // Get the data and schema for the current path
41
49
  const currentAttribute = currentAttributes[currentPart.name];
42
50
  if (!currentAttribute) {
43
- throw new Error('Invalid field path');
51
+ throw new PreviewFieldError('INVALID_FIELD_PATH');
44
52
  }
45
53
  if (currentAttribute.type === 'relation') {
46
- throw new Error('Relations not handled');
54
+ throw new PreviewFieldError('RELATIONS_NOT_HANDLED');
47
55
  }
48
56
  if (currentAttribute.type === 'component') {
49
57
  const componentAttributes = components[currentAttribute.component].attributes;
50
58
  if (currentAttribute.repeatable) {
51
59
  // We must have the index, otherwise we don't know what data to use
52
60
  if (currentPart.index === undefined) {
53
- throw new Error('Invalid field path');
61
+ throw new PreviewFieldError('INVALID_FIELD_PATH');
54
62
  }
55
63
  return visitor(remainingParts, componentAttributes, currentData[currentPart.name][currentPart.index]);
56
64
  }
@@ -60,7 +68,7 @@ function getAttributeSchemaFromPath({ path, schema, components, document }) {
60
68
  if (currentAttribute.type === 'dynamiczone') {
61
69
  // We must have the index, otherwise we don't know what component we're dealing with
62
70
  if (currentPart.index === undefined) {
63
- throw new Error('Invalid field path');
71
+ throw new PreviewFieldError('INVALID_FIELD_PATH');
64
72
  }
65
73
  const componentData = currentData[currentPart.name][currentPart.index];
66
74
  const componentAttributes = components[componentData.__component].attributes;
@@ -92,6 +100,7 @@ function parseFieldMetaData(strapiSource) {
92
100
  };
93
101
  }
94
102
 
103
+ exports.PreviewFieldError = PreviewFieldError;
95
104
  exports.getAttributeSchemaFromPath = getAttributeSchemaFromPath;
96
105
  exports.parseFieldMetaData = parseFieldMetaData;
97
106
  exports.parsePathWithIndices = parsePathWithIndices;