@strapi/content-manager 0.0.0-experimental.cd782e586c4023aa5668811fa661cd4a851b69b3 → 0.0.0-experimental.ce5faa6c7fd5c9ab2a256f4595ef938ce908c95a

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 (54) hide show
  1. package/dist/admin/components/Widgets.js +4 -2
  2. package/dist/admin/components/Widgets.js.map +1 -1
  3. package/dist/admin/components/Widgets.mjs +4 -2
  4. package/dist/admin/components/Widgets.mjs.map +1 -1
  5. package/dist/admin/pages/EditView/components/InputRenderer.js +6 -3
  6. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  7. package/dist/admin/pages/EditView/components/InputRenderer.mjs +6 -3
  8. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  9. package/dist/admin/pages/EditView/utils/data.js +1 -1
  10. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  11. package/dist/admin/pages/EditView/utils/data.mjs +1 -1
  12. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  13. package/dist/admin/preview/components/InputPopover.js +108 -23
  14. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  15. package/dist/admin/preview/components/InputPopover.mjs +91 -25
  16. package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
  17. package/dist/admin/preview/hooks/usePreviewInputManager.js +3 -14
  18. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
  19. package/dist/admin/preview/hooks/usePreviewInputManager.mjs +3 -14
  20. package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -1
  21. package/dist/admin/preview/pages/Preview.js +5 -31
  22. package/dist/admin/preview/pages/Preview.js.map +1 -1
  23. package/dist/admin/preview/pages/Preview.mjs +7 -33
  24. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  25. package/dist/admin/preview/utils/fieldUtils.js +88 -35
  26. package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
  27. package/dist/admin/preview/utils/fieldUtils.mjs +87 -35
  28. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
  29. package/dist/admin/preview/utils/previewScript.js +74 -68
  30. package/dist/admin/preview/utils/previewScript.js.map +1 -1
  31. package/dist/admin/preview/utils/previewScript.mjs +74 -68
  32. package/dist/admin/preview/utils/previewScript.mjs.map +1 -1
  33. package/dist/admin/src/preview/components/InputPopover.d.ts +1 -1
  34. package/dist/admin/src/preview/hooks/usePreviewInputManager.d.ts +2 -1
  35. package/dist/admin/src/preview/pages/Preview.d.ts +2 -0
  36. package/dist/admin/src/preview/utils/fieldUtils.d.ts +13 -5
  37. package/dist/admin/translations/en.json.js +1 -0
  38. package/dist/admin/translations/en.json.js.map +1 -1
  39. package/dist/admin/translations/en.json.mjs +1 -0
  40. package/dist/admin/translations/en.json.mjs.map +1 -1
  41. package/dist/admin/translations/es.json.js +1 -0
  42. package/dist/admin/translations/es.json.js.map +1 -1
  43. package/dist/admin/translations/es.json.mjs +1 -0
  44. package/dist/admin/translations/es.json.mjs.map +1 -1
  45. package/dist/admin/translations/fr.json.js +1 -0
  46. package/dist/admin/translations/fr.json.js.map +1 -1
  47. package/dist/admin/translations/fr.json.mjs +1 -0
  48. package/dist/admin/translations/fr.json.mjs.map +1 -1
  49. package/dist/server/homepage/services/homepage.js +1 -1
  50. package/dist/server/homepage/services/homepage.js.map +1 -1
  51. package/dist/server/homepage/services/homepage.mjs +1 -1
  52. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  53. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  54. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"InputPopover.mjs","sources":["../../../../admin/src/preview/components/InputPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext } 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 { parsePathWithIndices, getAttributeSchema } from '../utils/fieldUtils';\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\nconst InputPopover = ({ documentResponse }: { documentResponse: ReturnType<UseDocument> }) => {\n const iframeRef = usePreviewContext('VisualEditingPopover', (state) => state.iframeRef);\n const popoverField = usePreviewContext('VisualEditingPopover', (state) => state.popoverField);\n const setPopoverField = usePreviewContext(\n 'VisualEditingPopover',\n (state) => state.setPopoverField\n );\n\n if (!popoverField || !documentResponse.schema || !iframeRef.current) {\n return null;\n }\n\n const iframeRect = iframeRef.current.getBoundingClientRect();\n\n const pathParts = parsePathWithIndices(popoverField.path);\n const attributeSchema = getAttributeSchema({\n pathParts,\n schema: documentResponse.schema,\n components: documentResponse.components,\n });\n\n if (!attributeSchema) {\n return null;\n }\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 \"type\" property clashes for some reason */}\n <InputRenderer\n document={documentResponse}\n attribute={attributeSchema}\n // TODO: retrieve the proper label from the layout\n label={popoverField.path}\n name={popoverField.path.replace('[', '.').replace(']', '')}\n type={attributeSchema.type}\n visible={true}\n />\n </Box>\n </Popover.Content>\n </Popover.Root>\n </InputPopoverProvider>\n </>\n );\n};\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\nexport { InputPopover, useHasInputPopoverParent };\n"],"names":["InputPopoverProvider","useInputPopoverContext","createContext","InputPopover","documentResponse","iframeRef","usePreviewContext","state","popoverField","setPopoverField","schema","current","iframeRect","getBoundingClientRect","pathParts","parsePathWithIndices","path","attributeSchema","getAttributeSchema","components","_jsxs","_Fragment","_jsx","Box","position","top","left","width","height","zIndex","Popover","Root","open","onOpenChange","Trigger","transform","Content","sideOffset","padding","InputRenderer","document","attribute","label","name","replace","type","visible","useHasInputPopoverParent","context","undefined"],"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';\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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"}
@@ -5,7 +5,6 @@ var strapiAdmin = require('@strapi/admin/strapi-admin');
5
5
  var InputPopover = require('../components/InputPopover.js');
6
6
  var Preview = require('../pages/Preview.js');
7
7
  var constants = require('../utils/constants.js');
8
- var fieldUtils = require('../utils/fieldUtils.js');
9
8
  var getSendMessage = require('../utils/getSendMessage.js');
10
9
 
11
10
  function _interopNamespaceDefault(e) {
@@ -27,21 +26,12 @@ function _interopNamespaceDefault(e) {
27
26
 
28
27
  var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
29
28
 
30
- function usePreviewInputManager(name) {
29
+ function usePreviewInputManager(name, attribute) {
31
30
  const iframe = Preview.usePreviewContext('usePreviewInputManager', (state)=>state.iframeRef, false);
32
31
  const setPopoverField = Preview.usePreviewContext('usePreviewInputManager', (state)=>state.setPopoverField, false);
33
- const schema = Preview.usePreviewContext('usePreviewInputManager', (state)=>state.schema, false);
34
- const components = Preview.usePreviewContext('usePreviewInputManager', (state)=>state.components, false);
35
32
  const hasInputPopoverParent = InputPopover.useHasInputPopoverParent();
36
33
  const { value } = strapiAdmin.useField(name);
37
- // Parse the field path and resolve the attribute to check if it's a component structure
38
- const pathParts = fieldUtils.parsePathWithIndices(name);
39
- const attributeSchema = schema && components ? fieldUtils.getAttributeSchema({
40
- pathParts,
41
- schema,
42
- components
43
- }) : null;
44
- const type = attributeSchema?.type;
34
+ const { type } = attribute;
45
35
  React__namespace.useEffect(()=>{
46
36
  if (!iframe || !type) {
47
37
  return;
@@ -49,8 +39,7 @@ function usePreviewInputManager(name) {
49
39
  /**
50
40
  * Only send message if the field is not a data structure (component, dynamic zone)
51
41
  * because we already send events for their fields
52
- */ // TODO: add relations
53
- if (![
42
+ */ if (![
54
43
  'component',
55
44
  'dynamiczone'
56
45
  ].includes(type)) {
@@ -1 +1 @@
1
- {"version":3,"file":"usePreviewInputManager.js","sources":["../../../../admin/src/preview/hooks/usePreviewInputManager.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { parsePathWithIndices, getAttributeSchema } from '../utils/fieldUtils';\nimport { getSendMessage } from '../utils/getSendMessage';\n\ntype PreviewInputProps = Pick<\n Required<React.InputHTMLAttributes<HTMLInputElement>>,\n 'onFocus' | 'onBlur'\n>;\n\nexport function usePreviewInputManager(name: string): PreviewInputProps {\n const iframe = usePreviewContext('usePreviewInputManager', (state) => state.iframeRef, false);\n const setPopoverField = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.setPopoverField,\n false\n );\n const schema = usePreviewContext('usePreviewInputManager', (state) => state.schema, false);\n const components = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.components,\n false\n );\n const hasInputPopoverParent = useHasInputPopoverParent();\n const { value } = useField(name);\n\n // Parse the field path and resolve the attribute to check if it's a component structure\n const pathParts = parsePathWithIndices(name);\n\n const attributeSchema =\n schema && components ? getAttributeSchema({ pathParts, schema, components }) : null;\n const type = attributeSchema?.type;\n\n React.useEffect(() => {\n if (!iframe || !type) {\n return;\n }\n\n /**\n * Only send message if the field is not a data structure (component, dynamic zone)\n * because we already send events for their fields\n */\n // TODO: add relations\n if (!['component', 'dynamiczone'].includes(type)) {\n const sendMessage = getSendMessage(iframe);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value });\n }\n }, [name, value, iframe, type]);\n\n const sendMessage = getSendMessage(iframe);\n\n return {\n onFocus: () => {\n if (hasInputPopoverParent) return;\n\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS, { field: name });\n },\n onBlur: () => {\n if (hasInputPopoverParent) return;\n\n setPopoverField?.(null);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_BLUR, { field: name });\n },\n };\n}\n"],"names":["usePreviewInputManager","name","iframe","usePreviewContext","state","iframeRef","setPopoverField","schema","components","hasInputPopoverParent","useHasInputPopoverParent","value","useField","pathParts","parsePathWithIndices","attributeSchema","getAttributeSchema","type","React","useEffect","includes","sendMessage","getSendMessage","INTERNAL_EVENTS","STRAPI_FIELD_CHANGE","field","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,SAASA,uBAAuBC,IAAY,EAAA;AACjD,IAAA,MAAMC,SAASC,yBAAkB,CAAA,wBAAA,EAA0B,CAACC,KAAUA,GAAAA,KAAAA,CAAMC,SAAS,EAAE,KAAA,CAAA;AACvF,IAAA,MAAMC,kBAAkBH,yBACtB,CAAA,wBAAA,EACA,CAACC,KAAUA,GAAAA,KAAAA,CAAME,eAAe,EAChC,KAAA,CAAA;AAEF,IAAA,MAAMC,SAASJ,yBAAkB,CAAA,wBAAA,EAA0B,CAACC,KAAUA,GAAAA,KAAAA,CAAMG,MAAM,EAAE,KAAA,CAAA;AACpF,IAAA,MAAMC,aAAaL,yBACjB,CAAA,wBAAA,EACA,CAACC,KAAUA,GAAAA,KAAAA,CAAMI,UAAU,EAC3B,KAAA,CAAA;AAEF,IAAA,MAAMC,qBAAwBC,GAAAA,qCAAAA,EAAAA;AAC9B,IAAA,MAAM,EAAEC,KAAK,EAAE,GAAGC,oBAASX,CAAAA,IAAAA,CAAAA;;AAG3B,IAAA,MAAMY,YAAYC,+BAAqBb,CAAAA,IAAAA,CAAAA;IAEvC,MAAMc,eAAAA,GACJR,MAAUC,IAAAA,UAAAA,GAAaQ,6BAAmB,CAAA;AAAEH,QAAAA,SAAAA;AAAWN,QAAAA,MAAAA;AAAQC,QAAAA;KAAgB,CAAA,GAAA,IAAA;AACjF,IAAA,MAAMS,OAAOF,eAAiBE,EAAAA,IAAAA;AAE9BC,IAAAA,gBAAAA,CAAMC,SAAS,CAAC,IAAA;QACd,IAAI,CAACjB,MAAU,IAAA,CAACe,IAAM,EAAA;AACpB,YAAA;AACF;AAEA;;;AAGC;AAED,QAAA,IAAI,CAAC;AAAC,YAAA,WAAA;AAAa,YAAA;SAAc,CAACG,QAAQ,CAACH,IAAO,CAAA,EAAA;AAChD,YAAA,MAAMI,cAAcC,6BAAepB,CAAAA,MAAAA,CAAAA;YACnCmB,WAAYE,CAAAA,yBAAAA,CAAgBC,mBAAmB,EAAE;gBAAEC,KAAOxB,EAAAA,IAAAA;AAAMU,gBAAAA;AAAM,aAAA,CAAA;AACxE;KACC,EAAA;AAACV,QAAAA,IAAAA;AAAMU,QAAAA,KAAAA;AAAOT,QAAAA,MAAAA;AAAQe,QAAAA;AAAK,KAAA,CAAA;AAE9B,IAAA,MAAMI,cAAcC,6BAAepB,CAAAA,MAAAA,CAAAA;IAEnC,OAAO;QACLwB,OAAS,EAAA,IAAA;AACP,YAAA,IAAIjB,qBAAuB,EAAA;YAE3BY,WAAYE,CAAAA,yBAAAA,CAAgBI,kBAAkB,EAAE;gBAAEF,KAAOxB,EAAAA;AAAK,aAAA,CAAA;AAChE,SAAA;QACA2B,MAAQ,EAAA,IAAA;AACN,YAAA,IAAInB,qBAAuB,EAAA;YAE3BH,eAAkB,GAAA,IAAA,CAAA;YAClBe,WAAYE,CAAAA,yBAAAA,CAAgBM,iBAAiB,EAAE;gBAAEJ,KAAOxB,EAAAA;AAAK,aAAA,CAAA;AAC/D;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"usePreviewInputManager.js","sources":["../../../../admin/src/preview/hooks/usePreviewInputManager.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Schema } from '@strapi/types';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\ntype PreviewInputProps = Pick<\n Required<React.InputHTMLAttributes<HTMLInputElement>>,\n 'onFocus' | 'onBlur'\n>;\n\nexport function usePreviewInputManager(\n name: string,\n attribute: Schema.Attribute.AnyAttribute\n): PreviewInputProps {\n const iframe = usePreviewContext('usePreviewInputManager', (state) => state.iframeRef, false);\n const setPopoverField = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.setPopoverField,\n false\n );\n const hasInputPopoverParent = useHasInputPopoverParent();\n const { value } = useField(name);\n const { type } = attribute;\n\n React.useEffect(() => {\n if (!iframe || !type) {\n return;\n }\n\n /**\n * Only send message if the field is not a data structure (component, dynamic zone)\n * because we already send events for their fields\n */\n if (!['component', 'dynamiczone'].includes(type)) {\n const sendMessage = getSendMessage(iframe);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value });\n }\n }, [name, value, iframe, type]);\n\n const sendMessage = getSendMessage(iframe);\n\n return {\n onFocus: () => {\n if (hasInputPopoverParent) return;\n\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS, { field: name });\n },\n onBlur: () => {\n if (hasInputPopoverParent) return;\n\n setPopoverField?.(null);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_BLUR, { field: name });\n },\n };\n}\n"],"names":["usePreviewInputManager","name","attribute","iframe","usePreviewContext","state","iframeRef","setPopoverField","hasInputPopoverParent","useHasInputPopoverParent","value","useField","type","React","useEffect","includes","sendMessage","getSendMessage","INTERNAL_EVENTS","STRAPI_FIELD_CHANGE","field","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,SAASA,sBAAAA,CACdC,IAAY,EACZC,SAAwC,EAAA;AAExC,IAAA,MAAMC,SAASC,yBAAkB,CAAA,wBAAA,EAA0B,CAACC,KAAUA,GAAAA,KAAAA,CAAMC,SAAS,EAAE,KAAA,CAAA;AACvF,IAAA,MAAMC,kBAAkBH,yBACtB,CAAA,wBAAA,EACA,CAACC,KAAUA,GAAAA,KAAAA,CAAME,eAAe,EAChC,KAAA,CAAA;AAEF,IAAA,MAAMC,qBAAwBC,GAAAA,qCAAAA,EAAAA;AAC9B,IAAA,MAAM,EAAEC,KAAK,EAAE,GAAGC,oBAASV,CAAAA,IAAAA,CAAAA;IAC3B,MAAM,EAAEW,IAAI,EAAE,GAAGV,SAAAA;AAEjBW,IAAAA,gBAAAA,CAAMC,SAAS,CAAC,IAAA;QACd,IAAI,CAACX,MAAU,IAAA,CAACS,IAAM,EAAA;AACpB,YAAA;AACF;AAEA;;;AAGC,QACD,IAAI,CAAC;AAAC,YAAA,WAAA;AAAa,YAAA;SAAc,CAACG,QAAQ,CAACH,IAAO,CAAA,EAAA;AAChD,YAAA,MAAMI,cAAcC,6BAAed,CAAAA,MAAAA,CAAAA;YACnCa,WAAYE,CAAAA,yBAAAA,CAAgBC,mBAAmB,EAAE;gBAAEC,KAAOnB,EAAAA,IAAAA;AAAMS,gBAAAA;AAAM,aAAA,CAAA;AACxE;KACC,EAAA;AAACT,QAAAA,IAAAA;AAAMS,QAAAA,KAAAA;AAAOP,QAAAA,MAAAA;AAAQS,QAAAA;AAAK,KAAA,CAAA;AAE9B,IAAA,MAAMI,cAAcC,6BAAed,CAAAA,MAAAA,CAAAA;IAEnC,OAAO;QACLkB,OAAS,EAAA,IAAA;AACP,YAAA,IAAIb,qBAAuB,EAAA;YAE3BQ,WAAYE,CAAAA,yBAAAA,CAAgBI,kBAAkB,EAAE;gBAAEF,KAAOnB,EAAAA;AAAK,aAAA,CAAA;AAChE,SAAA;QACAsB,MAAQ,EAAA,IAAA;AACN,YAAA,IAAIf,qBAAuB,EAAA;YAE3BD,eAAkB,GAAA,IAAA,CAAA;YAClBS,WAAYE,CAAAA,yBAAAA,CAAgBM,iBAAiB,EAAE;gBAAEJ,KAAOnB,EAAAA;AAAK,aAAA,CAAA;AAC/D;AACF,KAAA;AACF;;;;"}
@@ -3,24 +3,14 @@ import { useField } from '@strapi/admin/strapi-admin';
3
3
  import { useHasInputPopoverParent } from '../components/InputPopover.mjs';
4
4
  import { usePreviewContext } from '../pages/Preview.mjs';
5
5
  import { INTERNAL_EVENTS } from '../utils/constants.mjs';
6
- import { parsePathWithIndices, getAttributeSchema } from '../utils/fieldUtils.mjs';
7
6
  import { getSendMessage } from '../utils/getSendMessage.mjs';
8
7
 
9
- function usePreviewInputManager(name) {
8
+ function usePreviewInputManager(name, attribute) {
10
9
  const iframe = usePreviewContext('usePreviewInputManager', (state)=>state.iframeRef, false);
11
10
  const setPopoverField = usePreviewContext('usePreviewInputManager', (state)=>state.setPopoverField, false);
12
- const schema = usePreviewContext('usePreviewInputManager', (state)=>state.schema, false);
13
- const components = usePreviewContext('usePreviewInputManager', (state)=>state.components, false);
14
11
  const hasInputPopoverParent = useHasInputPopoverParent();
15
12
  const { value } = useField(name);
16
- // Parse the field path and resolve the attribute to check if it's a component structure
17
- const pathParts = parsePathWithIndices(name);
18
- const attributeSchema = schema && components ? getAttributeSchema({
19
- pathParts,
20
- schema,
21
- components
22
- }) : null;
23
- const type = attributeSchema?.type;
13
+ const { type } = attribute;
24
14
  React.useEffect(()=>{
25
15
  if (!iframe || !type) {
26
16
  return;
@@ -28,8 +18,7 @@ function usePreviewInputManager(name) {
28
18
  /**
29
19
  * Only send message if the field is not a data structure (component, dynamic zone)
30
20
  * because we already send events for their fields
31
- */ // TODO: add relations
32
- if (![
21
+ */ if (![
33
22
  'component',
34
23
  'dynamiczone'
35
24
  ].includes(type)) {
@@ -1 +1 @@
1
- {"version":3,"file":"usePreviewInputManager.mjs","sources":["../../../../admin/src/preview/hooks/usePreviewInputManager.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { parsePathWithIndices, getAttributeSchema } from '../utils/fieldUtils';\nimport { getSendMessage } from '../utils/getSendMessage';\n\ntype PreviewInputProps = Pick<\n Required<React.InputHTMLAttributes<HTMLInputElement>>,\n 'onFocus' | 'onBlur'\n>;\n\nexport function usePreviewInputManager(name: string): PreviewInputProps {\n const iframe = usePreviewContext('usePreviewInputManager', (state) => state.iframeRef, false);\n const setPopoverField = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.setPopoverField,\n false\n );\n const schema = usePreviewContext('usePreviewInputManager', (state) => state.schema, false);\n const components = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.components,\n false\n );\n const hasInputPopoverParent = useHasInputPopoverParent();\n const { value } = useField(name);\n\n // Parse the field path and resolve the attribute to check if it's a component structure\n const pathParts = parsePathWithIndices(name);\n\n const attributeSchema =\n schema && components ? getAttributeSchema({ pathParts, schema, components }) : null;\n const type = attributeSchema?.type;\n\n React.useEffect(() => {\n if (!iframe || !type) {\n return;\n }\n\n /**\n * Only send message if the field is not a data structure (component, dynamic zone)\n * because we already send events for their fields\n */\n // TODO: add relations\n if (!['component', 'dynamiczone'].includes(type)) {\n const sendMessage = getSendMessage(iframe);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value });\n }\n }, [name, value, iframe, type]);\n\n const sendMessage = getSendMessage(iframe);\n\n return {\n onFocus: () => {\n if (hasInputPopoverParent) return;\n\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS, { field: name });\n },\n onBlur: () => {\n if (hasInputPopoverParent) return;\n\n setPopoverField?.(null);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_BLUR, { field: name });\n },\n };\n}\n"],"names":["usePreviewInputManager","name","iframe","usePreviewContext","state","iframeRef","setPopoverField","schema","components","hasInputPopoverParent","useHasInputPopoverParent","value","useField","pathParts","parsePathWithIndices","attributeSchema","getAttributeSchema","type","React","useEffect","includes","sendMessage","getSendMessage","INTERNAL_EVENTS","STRAPI_FIELD_CHANGE","field","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":";;;;;;;;AAeO,SAASA,uBAAuBC,IAAY,EAAA;AACjD,IAAA,MAAMC,SAASC,iBAAkB,CAAA,wBAAA,EAA0B,CAACC,KAAUA,GAAAA,KAAAA,CAAMC,SAAS,EAAE,KAAA,CAAA;AACvF,IAAA,MAAMC,kBAAkBH,iBACtB,CAAA,wBAAA,EACA,CAACC,KAAUA,GAAAA,KAAAA,CAAME,eAAe,EAChC,KAAA,CAAA;AAEF,IAAA,MAAMC,SAASJ,iBAAkB,CAAA,wBAAA,EAA0B,CAACC,KAAUA,GAAAA,KAAAA,CAAMG,MAAM,EAAE,KAAA,CAAA;AACpF,IAAA,MAAMC,aAAaL,iBACjB,CAAA,wBAAA,EACA,CAACC,KAAUA,GAAAA,KAAAA,CAAMI,UAAU,EAC3B,KAAA,CAAA;AAEF,IAAA,MAAMC,qBAAwBC,GAAAA,wBAAAA,EAAAA;AAC9B,IAAA,MAAM,EAAEC,KAAK,EAAE,GAAGC,QAASX,CAAAA,IAAAA,CAAAA;;AAG3B,IAAA,MAAMY,YAAYC,oBAAqBb,CAAAA,IAAAA,CAAAA;IAEvC,MAAMc,eAAAA,GACJR,MAAUC,IAAAA,UAAAA,GAAaQ,kBAAmB,CAAA;AAAEH,QAAAA,SAAAA;AAAWN,QAAAA,MAAAA;AAAQC,QAAAA;KAAgB,CAAA,GAAA,IAAA;AACjF,IAAA,MAAMS,OAAOF,eAAiBE,EAAAA,IAAAA;AAE9BC,IAAAA,KAAAA,CAAMC,SAAS,CAAC,IAAA;QACd,IAAI,CAACjB,MAAU,IAAA,CAACe,IAAM,EAAA;AACpB,YAAA;AACF;AAEA;;;AAGC;AAED,QAAA,IAAI,CAAC;AAAC,YAAA,WAAA;AAAa,YAAA;SAAc,CAACG,QAAQ,CAACH,IAAO,CAAA,EAAA;AAChD,YAAA,MAAMI,cAAcC,cAAepB,CAAAA,MAAAA,CAAAA;YACnCmB,WAAYE,CAAAA,eAAAA,CAAgBC,mBAAmB,EAAE;gBAAEC,KAAOxB,EAAAA,IAAAA;AAAMU,gBAAAA;AAAM,aAAA,CAAA;AACxE;KACC,EAAA;AAACV,QAAAA,IAAAA;AAAMU,QAAAA,KAAAA;AAAOT,QAAAA,MAAAA;AAAQe,QAAAA;AAAK,KAAA,CAAA;AAE9B,IAAA,MAAMI,cAAcC,cAAepB,CAAAA,MAAAA,CAAAA;IAEnC,OAAO;QACLwB,OAAS,EAAA,IAAA;AACP,YAAA,IAAIjB,qBAAuB,EAAA;YAE3BY,WAAYE,CAAAA,eAAAA,CAAgBI,kBAAkB,EAAE;gBAAEF,KAAOxB,EAAAA;AAAK,aAAA,CAAA;AAChE,SAAA;QACA2B,MAAQ,EAAA,IAAA;AACN,YAAA,IAAInB,qBAAuB,EAAA;YAE3BH,eAAkB,GAAA,IAAA,CAAA;YAClBe,WAAYE,CAAAA,eAAAA,CAAgBM,iBAAiB,EAAE;gBAAEJ,KAAOxB,EAAAA;AAAK,aAAA,CAAA;AAC/D;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"usePreviewInputManager.mjs","sources":["../../../../admin/src/preview/hooks/usePreviewInputManager.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Schema } from '@strapi/types';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\ntype PreviewInputProps = Pick<\n Required<React.InputHTMLAttributes<HTMLInputElement>>,\n 'onFocus' | 'onBlur'\n>;\n\nexport function usePreviewInputManager(\n name: string,\n attribute: Schema.Attribute.AnyAttribute\n): PreviewInputProps {\n const iframe = usePreviewContext('usePreviewInputManager', (state) => state.iframeRef, false);\n const setPopoverField = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.setPopoverField,\n false\n );\n const hasInputPopoverParent = useHasInputPopoverParent();\n const { value } = useField(name);\n const { type } = attribute;\n\n React.useEffect(() => {\n if (!iframe || !type) {\n return;\n }\n\n /**\n * Only send message if the field is not a data structure (component, dynamic zone)\n * because we already send events for their fields\n */\n if (!['component', 'dynamiczone'].includes(type)) {\n const sendMessage = getSendMessage(iframe);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value });\n }\n }, [name, value, iframe, type]);\n\n const sendMessage = getSendMessage(iframe);\n\n return {\n onFocus: () => {\n if (hasInputPopoverParent) return;\n\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS, { field: name });\n },\n onBlur: () => {\n if (hasInputPopoverParent) return;\n\n setPopoverField?.(null);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_BLUR, { field: name });\n },\n };\n}\n"],"names":["usePreviewInputManager","name","attribute","iframe","usePreviewContext","state","iframeRef","setPopoverField","hasInputPopoverParent","useHasInputPopoverParent","value","useField","type","React","useEffect","includes","sendMessage","getSendMessage","INTERNAL_EVENTS","STRAPI_FIELD_CHANGE","field","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":";;;;;;;AAeO,SAASA,sBAAAA,CACdC,IAAY,EACZC,SAAwC,EAAA;AAExC,IAAA,MAAMC,SAASC,iBAAkB,CAAA,wBAAA,EAA0B,CAACC,KAAUA,GAAAA,KAAAA,CAAMC,SAAS,EAAE,KAAA,CAAA;AACvF,IAAA,MAAMC,kBAAkBH,iBACtB,CAAA,wBAAA,EACA,CAACC,KAAUA,GAAAA,KAAAA,CAAME,eAAe,EAChC,KAAA,CAAA;AAEF,IAAA,MAAMC,qBAAwBC,GAAAA,wBAAAA,EAAAA;AAC9B,IAAA,MAAM,EAAEC,KAAK,EAAE,GAAGC,QAASV,CAAAA,IAAAA,CAAAA;IAC3B,MAAM,EAAEW,IAAI,EAAE,GAAGV,SAAAA;AAEjBW,IAAAA,KAAAA,CAAMC,SAAS,CAAC,IAAA;QACd,IAAI,CAACX,MAAU,IAAA,CAACS,IAAM,EAAA;AACpB,YAAA;AACF;AAEA;;;AAGC,QACD,IAAI,CAAC;AAAC,YAAA,WAAA;AAAa,YAAA;SAAc,CAACG,QAAQ,CAACH,IAAO,CAAA,EAAA;AAChD,YAAA,MAAMI,cAAcC,cAAed,CAAAA,MAAAA,CAAAA;YACnCa,WAAYE,CAAAA,eAAAA,CAAgBC,mBAAmB,EAAE;gBAAEC,KAAOnB,EAAAA,IAAAA;AAAMS,gBAAAA;AAAM,aAAA,CAAA;AACxE;KACC,EAAA;AAACT,QAAAA,IAAAA;AAAMS,QAAAA,KAAAA;AAAOP,QAAAA,MAAAA;AAAQS,QAAAA;AAAK,KAAA,CAAA;AAE9B,IAAA,MAAMI,cAAcC,cAAed,CAAAA,MAAAA,CAAAA;IAEnC,OAAO;QACLkB,OAAS,EAAA,IAAA;AACP,YAAA,IAAIb,qBAAuB,EAAA;YAE3BQ,WAAYE,CAAAA,eAAAA,CAAgBI,kBAAkB,EAAE;gBAAEF,KAAOnB,EAAAA;AAAK,aAAA,CAAA;AAChE,SAAA;QACAsB,MAAQ,EAAA,IAAA;AACN,YAAA,IAAIf,qBAAuB,EAAA;YAE3BD,eAAkB,GAAA,IAAA,CAAA;YAClBS,WAAYE,CAAAA,eAAAA,CAAgBM,iBAAiB,EAAE;gBAAEJ,KAAOnB,EAAAA;AAAK,aAAA,CAAA;AAC/D;AACF,KAAA;AACF;;;;"}
@@ -73,33 +73,13 @@ const [PreviewProvider, usePreviewContext] = strapiAdmin.createContext('PreviewP
73
73
  rotate: ${(props)=>props.$isSideEditorOpen ? '0deg' : '180deg'};
74
74
  transition: rotate 0.2s ease-in-out;
75
75
  `;
76
- // TODO: move to util file and write unit tests
77
- function parseFieldMetaData(strapiSource) {
78
- const url = new URL(strapiSource);
79
- const path = url.searchParams.get('path');
80
- const type = url.searchParams.get('type');
81
- const documentId = url.searchParams.get('documentId');
82
- const locale = url.searchParams.get('locale');
83
- const model = url.searchParams.get('model');
84
- const kind = url.searchParams.get('kind');
85
- if (!path || !type || !documentId || !model) {
86
- return null;
87
- }
88
- return {
89
- path,
90
- type: type,
91
- documentId,
92
- locale: locale ?? null,
93
- model: model,
94
- kind: kind
95
- };
96
- }
97
76
  const PreviewPage = ()=>{
98
77
  const location = reactRouterDom.useLocation();
99
78
  const { formatMessage } = reactIntl.useIntl();
100
79
  const iframeRef = React__namespace.useRef(null);
101
80
  const [isSideEditorOpen, setIsSideEditorOpen] = React__namespace.useState(true);
102
81
  const [popoverField, setPopoverField] = React__namespace.useState(null);
82
+ const { toggleNotification } = strapiAdmin.useNotification();
103
83
  // Read all the necessary data from the URL to find the right preview URL
104
84
  const { slug: model, id: documentId, collectionType } = reactRouterDom.useParams();
105
85
  const [{ query }] = strapiAdmin.useQueryParams();
@@ -125,21 +105,15 @@ const PreviewPage = ()=>{
125
105
  script
126
106
  });
127
107
  }
128
- if (event.data?.type === constants.INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {
129
- const fieldMetaData = parseFieldMetaData(event.data.payload.path);
130
- if (fieldMetaData) {
131
- setPopoverField({
132
- ...fieldMetaData,
133
- position: event.data.payload.position
134
- });
135
- }
136
- }
137
108
  };
138
109
  window.addEventListener('message', handleMessage);
139
110
  return ()=>{
140
111
  window.removeEventListener('message', handleMessage);
141
112
  };
142
- }, []);
113
+ }, [
114
+ documentId,
115
+ toggleNotification
116
+ ]);
143
117
  if (!collectionType) {
144
118
  throw new Error('Could not find collectionType in url params');
145
119
  }
@@ -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} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { Blocker } from '../../pages/EditView/components/Blocker';\nimport { FormLayout } from '../../pages/EditView/components/FormLayout';\nimport { handleInvisibleAttributes } from '../../pages/EditView/utils/data';\nimport { buildValidParams } from '../../utils/api';\nimport { createYupSchema } from '../../utils/validation';\nimport { InputPopover } from '../components/InputPopover';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { PUBLIC_EVENTS, INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\nimport { previewScript } from '../utils/previewScript';\n\nimport type { Struct, 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}\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\n// TODO: move to util file and write unit tests\nfunction parseFieldMetaData(strapiSource: string): FieldContentSourceMap | null {\n const url = new URL(strapiSource);\n const path = url.searchParams.get('path');\n const type = url.searchParams.get('type');\n const documentId = url.searchParams.get('documentId');\n const locale = url.searchParams.get('locale');\n const model = url.searchParams.get('model');\n const kind = url.searchParams.get('kind');\n\n if (!path || !type || !documentId || !model) {\n return null;\n }\n\n return {\n path,\n type: type as Struct.SchemaAttributes[string]['type'],\n documentId,\n locale: locale ?? null,\n model: model as UID.Schema | undefined,\n kind: kind as Struct.ContentTypeKind | undefined,\n };\n}\n\nconst PreviewPage = () => {\n const location = useLocation();\n const { formatMessage } = useIntl();\n\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\n const [popoverField, setPopoverField] = React.useState<PopoverField | null>(null);\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n status?: string;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const [deviceName, setDeviceName] = React.useState<(typeof DEVICES)[number]['name']>(\n DEVICES[0].name\n );\n const device = DEVICES.find((d) => d.name === deviceName) ?? DEVICES[0];\n\n // Listen for ready message from iframe before injecting script\n React.useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === PUBLIC_EVENTS.PREVIEW_READY) {\n const script = `(${previewScript.toString()})()`;\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {\n const fieldMetaData = parseFieldMetaData(event.data.payload.path);\n if (fieldMetaData) {\n setPopoverField({ ...fieldMetaData, position: event.data.payload.position });\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, []);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale,\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n const documentLayoutResponse = useDocumentLayout(model);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading)) {\n return <Page.Loading />;\n }\n\n const initialValues = documentResponse.getInitialFormValues();\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema ||\n !initialValues\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n const validateSync = (values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validateSync(cleanedValues, { abortEarly: false });\n };\n\n const previewUrl = previewUrlResponse.data.data.url;\n\n const onPreview = () => {\n iframeRef?.current?.contentWindow?.postMessage(\n { type: 'strapiUpdate' },\n // The iframe origin is safe to use since it must be provided through the allowedOrigins config\n new URL(iframeRef.current.src).origin\n );\n };\n\n const hasAdvancedPreview = window.strapi.features.isEnabled('cms-advanced-preview');\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrl}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n 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","parseFieldMetaData","strapiSource","url","URL","path","searchParams","get","type","documentId","locale","model","kind","PreviewPage","location","useLocation","formatMessage","useIntl","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","slug","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","useEffect","handleMessage","event","current","previewOrigin","src","origin","data","PUBLIC_EVENTS","PREVIEW_READY","script","previewScript","toString","sendMessage","getSendMessage","STRAPI_SCRIPT","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS_INTENT","fieldMetaData","payload","position","window","addEventListener","removeEventListener","Error","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","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","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=\"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,6 +1,6 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { createContext, useRBAC, Page, useQueryParams, Form } from '@strapi/admin/strapi-admin';
3
+ import { createContext, useRBAC, Page, useNotification, useQueryParams, Form } from '@strapi/admin/strapi-admin';
4
4
  import { Portal, FocusTrap, Box, Flex, IconButton, SingleSelect, SingleSelectOption } from '@strapi/design-system';
5
5
  import { ArrowLineLeft } from '@strapi/icons';
6
6
  import { useIntl } from 'react-intl';
@@ -18,7 +18,7 @@ import { createYupSchema } from '../../utils/validation.mjs';
18
18
  import { InputPopover } from '../components/InputPopover.mjs';
19
19
  import { PreviewHeader } from '../components/PreviewHeader.mjs';
20
20
  import { useGetPreviewUrlQuery } from '../services/preview.mjs';
21
- import { PUBLIC_EVENTS, INTERNAL_EVENTS } from '../utils/constants.mjs';
21
+ import { PUBLIC_EVENTS } from '../utils/constants.mjs';
22
22
  import { getSendMessage } from '../utils/getSendMessage.mjs';
23
23
  import { previewScript } from '../utils/previewScript.mjs';
24
24
 
@@ -52,33 +52,13 @@ const [PreviewProvider, usePreviewContext] = createContext('PreviewPage');
52
52
  rotate: ${(props)=>props.$isSideEditorOpen ? '0deg' : '180deg'};
53
53
  transition: rotate 0.2s ease-in-out;
54
54
  `;
55
- // TODO: move to util file and write unit tests
56
- function parseFieldMetaData(strapiSource) {
57
- const url = new URL(strapiSource);
58
- const path = url.searchParams.get('path');
59
- const type = url.searchParams.get('type');
60
- const documentId = url.searchParams.get('documentId');
61
- const locale = url.searchParams.get('locale');
62
- const model = url.searchParams.get('model');
63
- const kind = url.searchParams.get('kind');
64
- if (!path || !type || !documentId || !model) {
65
- return null;
66
- }
67
- return {
68
- path,
69
- type: type,
70
- documentId,
71
- locale: locale ?? null,
72
- model: model,
73
- kind: kind
74
- };
75
- }
76
55
  const PreviewPage = ()=>{
77
56
  const location = useLocation();
78
57
  const { formatMessage } = useIntl();
79
58
  const iframeRef = React.useRef(null);
80
59
  const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);
81
60
  const [popoverField, setPopoverField] = React.useState(null);
61
+ const { toggleNotification } = useNotification();
82
62
  // Read all the necessary data from the URL to find the right preview URL
83
63
  const { slug: model, id: documentId, collectionType } = useParams();
84
64
  const [{ query }] = useQueryParams();
@@ -104,21 +84,15 @@ const PreviewPage = ()=>{
104
84
  script
105
85
  });
106
86
  }
107
- if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {
108
- const fieldMetaData = parseFieldMetaData(event.data.payload.path);
109
- if (fieldMetaData) {
110
- setPopoverField({
111
- ...fieldMetaData,
112
- position: event.data.payload.position
113
- });
114
- }
115
- }
116
87
  };
117
88
  window.addEventListener('message', handleMessage);
118
89
  return ()=>{
119
90
  window.removeEventListener('message', handleMessage);
120
91
  };
121
- }, []);
92
+ }, [
93
+ documentId,
94
+ toggleNotification
95
+ ]);
122
96
  if (!collectionType) {
123
97
  throw new Error('Could not find collectionType in url params');
124
98
  }