@strapi/content-manager 5.53.0 → 5.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/dist/admin/components/ActionsDrawer.js +17 -6
  2. package/dist/admin/components/ActionsDrawer.js.map +1 -1
  3. package/dist/admin/components/ActionsDrawer.mjs +19 -8
  4. package/dist/admin/components/ActionsDrawer.mjs.map +1 -1
  5. package/dist/admin/components/LeftMenu.js +131 -52
  6. package/dist/admin/components/LeftMenu.js.map +1 -1
  7. package/dist/admin/components/LeftMenu.mjs +133 -54
  8. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  9. package/dist/admin/history/components/VersionsList.js +37 -43
  10. package/dist/admin/history/components/VersionsList.js.map +1 -1
  11. package/dist/admin/history/components/VersionsList.mjs +37 -43
  12. package/dist/admin/history/components/VersionsList.mjs.map +1 -1
  13. package/dist/admin/hooks/useContentManagerInitData.js +3 -2
  14. package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
  15. package/dist/admin/hooks/useContentManagerInitData.mjs +3 -2
  16. package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocumentActions.js +3 -1
  18. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  19. package/dist/admin/hooks/useDocumentActions.mjs +4 -2
  20. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  21. package/dist/admin/layout.js +2 -4
  22. package/dist/admin/layout.js.map +1 -1
  23. package/dist/admin/layout.mjs +2 -4
  24. package/dist/admin/layout.mjs.map +1 -1
  25. package/dist/admin/modules/app.js +3 -1
  26. package/dist/admin/modules/app.js.map +1 -1
  27. package/dist/admin/modules/app.mjs +3 -1
  28. package/dist/admin/modules/app.mjs.map +1 -1
  29. package/dist/admin/pages/EditView/EditViewPage.js +15 -20
  30. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  31. package/dist/admin/pages/EditView/EditViewPage.mjs +15 -20
  32. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  33. package/dist/admin/pages/EditView/components/DocumentActions.js +2 -0
  34. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  35. package/dist/admin/pages/EditView/components/DocumentActions.mjs +2 -0
  36. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js +74 -7
  38. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js.map +1 -1
  39. package/dist/admin/pages/EditView/components/EditorToolbarObserver.mjs +74 -7
  40. package/dist/admin/pages/EditView/components/EditorToolbarObserver.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +7 -2
  42. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +7 -2
  44. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +59 -2
  46. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +60 -3
  48. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js +4 -1
  50. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.mjs +4 -1
  52. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.mjs.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +4 -1
  54. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +4 -1
  56. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +2 -1
  58. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +2 -1
  60. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +58 -1
  62. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +58 -2
  64. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js +25 -2
  66. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs +5 -2
  68. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/components/InputRenderer.js +5 -1
  70. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/InputRenderer.mjs +6 -2
  72. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  73. package/dist/admin/pages/ListView/ListViewPage.js +1 -0
  74. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  75. package/dist/admin/pages/ListView/ListViewPage.mjs +1 -0
  76. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  77. package/dist/admin/preview/components/InputPopover.js +64 -46
  78. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  79. package/dist/admin/preview/components/InputPopover.mjs +66 -49
  80. package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
  81. package/dist/admin/preview/hooks/usePreviewInputManager.js +23 -7
  82. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
  83. package/dist/admin/preview/hooks/usePreviewInputManager.mjs +25 -9
  84. package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -1
  85. package/dist/admin/preview/pages/Preview.js +19 -0
  86. package/dist/admin/preview/pages/Preview.js.map +1 -1
  87. package/dist/admin/preview/pages/Preview.mjs +20 -1
  88. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  89. package/dist/admin/preview/utils/constants.js +9 -3
  90. package/dist/admin/preview/utils/constants.js.map +1 -1
  91. package/dist/admin/preview/utils/constants.mjs +9 -3
  92. package/dist/admin/preview/utils/constants.mjs.map +1 -1
  93. package/dist/admin/src/components/ActionsDrawer.d.ts +1 -0
  94. package/dist/admin/src/modules/app.d.ts +2 -0
  95. package/dist/admin/src/pages/EditView/components/EditorToolbarObserver.d.ts +2 -1
  96. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.d.ts +5 -1
  97. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +5 -0
  98. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.d.ts +5 -0
  99. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -1
  100. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +14 -1
  101. package/dist/admin/src/preview/components/InputPopover.d.ts +2 -1
  102. package/dist/admin/src/preview/pages/Preview.d.ts +1 -0
  103. package/dist/admin/src/preview/utils/constants.d.ts +8 -1
  104. package/dist/admin/src/services/init.d.ts +1 -0
  105. package/dist/admin/src/utils/contentStructure.d.ts +59 -0
  106. package/dist/admin/utils/contentStructure.js +136 -0
  107. package/dist/admin/utils/contentStructure.js.map +1 -0
  108. package/dist/admin/utils/contentStructure.mjs +130 -0
  109. package/dist/admin/utils/contentStructure.mjs.map +1 -0
  110. package/dist/server/controllers/init.js +7 -2
  111. package/dist/server/controllers/init.js.map +1 -1
  112. package/dist/server/controllers/init.mjs +7 -2
  113. package/dist/server/controllers/init.mjs.map +1 -1
  114. package/dist/server/preview/controllers/previewScript.js +548 -22
  115. package/dist/server/services/content-structure.js +53 -0
  116. package/dist/server/services/content-structure.js.map +1 -0
  117. package/dist/server/services/content-structure.mjs +51 -0
  118. package/dist/server/services/content-structure.mjs.map +1 -0
  119. package/dist/server/services/index.js +2 -0
  120. package/dist/server/services/index.js.map +1 -1
  121. package/dist/server/services/index.mjs +2 -0
  122. package/dist/server/services/index.mjs.map +1 -1
  123. package/dist/server/src/controllers/index.d.ts +1 -1
  124. package/dist/server/src/controllers/init.d.ts +1 -1
  125. package/dist/server/src/controllers/init.d.ts.map +1 -1
  126. package/dist/server/src/index.d.ts +6 -1
  127. package/dist/server/src/index.d.ts.map +1 -1
  128. package/dist/server/src/services/content-structure.d.ts +8 -0
  129. package/dist/server/src/services/content-structure.d.ts.map +1 -0
  130. package/dist/server/src/services/index.d.ts +5 -0
  131. package/dist/server/src/services/index.d.ts.map +1 -1
  132. package/dist/server/src/utils/index.d.ts +2 -0
  133. package/dist/server/src/utils/index.d.ts.map +1 -1
  134. package/dist/server/utils/index.js.map +1 -1
  135. package/dist/server/utils/index.mjs.map +1 -1
  136. package/dist/shared/contracts/init.d.ts +2 -0
  137. package/dist/shared/contracts/init.d.ts.map +1 -1
  138. package/package.json +5 -5
@@ -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';\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 // Track previous value to detect media deletion\n const prevValueRef = React.useRef(value);\n\n React.useEffect(() => {\n // Only run inside popover for media fields\n if (!hasInputPopoverParent || !setPopoverField || type !== 'media') {\n return;\n }\n\n const currentValue = value;\n const previousValue = prevValueRef.current;\n\n // Check if we transitioned from having a value to null/empty\n const hadValue =\n previousValue != null && (Array.isArray(previousValue) ? previousValue.length > 0 : true);\n const hasNoValue =\n currentValue == null || (Array.isArray(currentValue) ? currentValue.length === 0 : false);\n\n if (hadValue && hasNoValue) {\n // Media was deleted, close the popover\n setPopoverField(null);\n }\n\n // Update ref for next comparison\n prevValueRef.current = currentValue;\n }, [value, hasInputPopoverParent, setPopoverField, 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","prevValueRef","useRef","currentValue","previousValue","current","hadValue","Array","isArray","length","hasNoValue","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":";;;;;;;AAeO,SAASA,sBAAAA,CACdC,IAAY,EACZC,SAAwC,EAAA;AAExC,IAAA,MAAMC,SAASC,iBAAAA,CAAkB,wBAAA,EAA0B,CAACC,KAAAA,GAAUA,KAAAA,CAAMC,SAAS,EAAE,KAAA,CAAA;AACvF,IAAA,MAAMC,kBAAkBH,iBAAAA,CACtB,wBAAA,EACA,CAACC,KAAAA,GAAUA,KAAAA,CAAME,eAAe,EAChC,KAAA,CAAA;AAEF,IAAA,MAAMC,qBAAAA,GAAwBC,wBAAAA,EAAAA;AAC9B,IAAA,MAAM,EAAEC,KAAK,EAAE,GAAGC,QAAAA,CAASV,IAAAA,CAAAA;IAC3B,MAAM,EAAEW,IAAI,EAAE,GAAGV,SAAAA;AAEjBW,IAAAA,KAAAA,CAAMC,SAAS,CAAC,IAAA;QACd,IAAI,CAACX,MAAAA,IAAU,CAACS,IAAAA,EAAM;AACpB,YAAA;AACF,QAAA;AAEA;;;AAGC,QACD,IAAI,CAAC;AAAC,YAAA,WAAA;AAAa,YAAA;SAAc,CAACG,QAAQ,CAACH,IAAAA,CAAAA,EAAO;AAChD,YAAA,MAAMI,cAAcC,cAAAA,CAAed,MAAAA,CAAAA;YACnCa,WAAAA,CAAYE,eAAAA,CAAgBC,mBAAmB,EAAE;gBAAEC,KAAAA,EAAOnB,IAAAA;AAAMS,gBAAAA;AAAM,aAAA,CAAA;AACxE,QAAA;IACF,CAAA,EAAG;AAACT,QAAAA,IAAAA;AAAMS,QAAAA,KAAAA;AAAOP,QAAAA,MAAAA;AAAQS,QAAAA;AAAK,KAAA,CAAA;;IAG9B,MAAMS,YAAAA,GAAeR,KAAAA,CAAMS,MAAM,CAACZ,KAAAA,CAAAA;AAElCG,IAAAA,KAAAA,CAAMC,SAAS,CAAC,IAAA;;AAEd,QAAA,IAAI,CAACN,qBAAAA,IAAyB,CAACD,eAAAA,IAAmBK,SAAS,OAAA,EAAS;AAClE,YAAA;AACF,QAAA;AAEA,QAAA,MAAMW,YAAAA,GAAeb,KAAAA;QACrB,MAAMc,aAAAA,GAAgBH,aAAaI,OAAO;;AAG1C,QAAA,MAAMC,QAAAA,GACJF,aAAAA,IAAiB,IAAA,KAASG,KAAAA,CAAMC,OAAO,CAACJ,aAAAA,CAAAA,GAAiBA,aAAAA,CAAcK,MAAM,GAAG,CAAA,GAAI,IAAG,CAAA;AACzF,QAAA,MAAMC,UAAAA,GACJP,YAAAA,IAAgB,IAAA,KAASI,KAAAA,CAAMC,OAAO,CAACL,YAAAA,CAAAA,GAAgBA,YAAAA,CAAaM,MAAM,KAAK,CAAA,GAAI,KAAI,CAAA;AAEzF,QAAA,IAAIH,YAAYI,UAAAA,EAAY;;YAE1BvB,eAAAA,CAAgB,IAAA,CAAA;AAClB,QAAA;;AAGAc,QAAAA,YAAAA,CAAaI,OAAO,GAAGF,YAAAA;IACzB,CAAA,EAAG;AAACb,QAAAA,KAAAA;AAAOF,QAAAA,qBAAAA;AAAuBD,QAAAA,eAAAA;AAAiBK,QAAAA;AAAK,KAAA,CAAA;AAExD,IAAA,MAAMI,cAAcC,cAAAA,CAAed,MAAAA,CAAAA;IAEnC,OAAO;QACL4B,OAAAA,EAAS,IAAA;AACP,YAAA,IAAIvB,qBAAAA,EAAuB;YAE3BQ,WAAAA,CAAYE,eAAAA,CAAgBc,kBAAkB,EAAE;gBAAEZ,KAAAA,EAAOnB;AAAK,aAAA,CAAA;AAChE,QAAA,CAAA;QACAgC,MAAAA,EAAQ,IAAA;AACN,YAAA,IAAIzB,qBAAAA,EAAuB;YAE3BD,eAAAA,GAAkB,IAAA,CAAA;YAClBS,WAAAA,CAAYE,eAAAA,CAAgBgB,iBAAiB,EAAE;gBAAEd,KAAAA,EAAOnB;AAAK,aAAA,CAAA;AAC/D,QAAA;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, useForm } from '@strapi/admin/strapi-admin';\nimport { Schema } from '@strapi/types';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS, PUBLIC_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 const isSubmitting = useForm('usePreviewInputManager', (state) => state.isSubmitting);\n const wasSubmittingRef = React.useRef(isSubmitting);\n\n React.useEffect(() => {\n const justFinishedSubmitting = wasSubmittingRef.current && !isSubmitting;\n wasSubmittingRef.current = isSubmitting;\n\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 return;\n }\n\n if (justFinishedSubmitting) {\n // A save just completed. resetForm() (called on the save-success path) re-syncs\n // every field to the server-confirmed value, which looks like a change here even\n // though nothing the user did changed. The previewed frontend already gets the\n // authoritative, correctly-encoded data via the strapiUpdate + revalidate flow\n // triggered by that same save — broadcasting this stale echo would only race\n // against it, reintroducing pre-save (unencoded) content over the fresh fetch.\n return;\n }\n\n const sendMessage = getSendMessage(iframe);\n sendMessage(PUBLIC_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value, type });\n }, [name, value, iframe, type, isSubmitting]);\n\n // Track previous value to detect media deletion\n const prevValueRef = React.useRef(value);\n\n React.useEffect(() => {\n // Only run inside popover for media fields\n if (!hasInputPopoverParent || !setPopoverField || type !== 'media') {\n return;\n }\n\n const currentValue = value;\n const previousValue = prevValueRef.current;\n\n // Check if we transitioned from having a value to null/empty\n const hadValue =\n previousValue != null && (Array.isArray(previousValue) ? previousValue.length > 0 : true);\n const hasNoValue =\n currentValue == null || (Array.isArray(currentValue) ? currentValue.length === 0 : false);\n\n if (hadValue && hasNoValue) {\n // Media was deleted, close the popover\n setPopoverField(null);\n }\n\n // Update ref for next comparison\n prevValueRef.current = currentValue;\n }, [value, hasInputPopoverParent, setPopoverField, 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","isSubmitting","useForm","wasSubmittingRef","React","useRef","useEffect","justFinishedSubmitting","current","includes","sendMessage","getSendMessage","PUBLIC_EVENTS","STRAPI_FIELD_CHANGE","field","prevValueRef","currentValue","previousValue","hadValue","Array","isArray","length","hasNoValue","onFocus","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":"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"}
@@ -100,6 +100,25 @@ const PreviewPage = ()=>{
100
100
  const iframeRef = React__namespace.useRef(null);
101
101
  const [isSideEditorOpen, setIsSideEditorOpen] = React__namespace.useState(true);
102
102
  const [popoverField, setPopoverField] = React__namespace.useState(null);
103
+ const prevPopoverFieldRef = React__namespace.useRef(null);
104
+ // When the popover closes, ask the iframe to rescan its stega element groups.
105
+ // Live-preview sync updates the iframe DOM while editing, which can change the
106
+ // rendered height of the field; groups need to reflect the current DOM so that
107
+ // hover highlights and double-click detection work on the updated content.
108
+ React__namespace.useEffect(()=>{
109
+ const prev = prevPopoverFieldRef.current;
110
+ prevPopoverFieldRef.current = popoverField;
111
+ if (prev !== null && popoverField === null) {
112
+ const iframe = iframeRef.current;
113
+ if (!iframe?.src) return;
114
+ iframe.contentWindow?.postMessage({
115
+ type: constants.INTERNAL_EVENTS.STRAPI_RESCAN_HIGHLIGHTS
116
+ }, new URL(iframe.src).origin);
117
+ }
118
+ }, [
119
+ popoverField,
120
+ iframeRef
121
+ ]);
103
122
  const { toggleNotification } = strapiAdmin.useNotification();
104
123
  // Read all the necessary data from the URL to find the right preview URL
105
124
  const { slug: model, id: documentId, collectionType } = reactRouterDom.useParams();
@@ -1 +1 @@
1
- {"version":3,"file":"Preview.js","sources":["../../../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useQueryParams,\n useRBAC,\n createContext,\n Form as FormContext,\n type FieldContentSourceMap,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled, useTheme } from 'styled-components';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { Blocker } from '../../pages/EditView/components/Blocker';\nimport { FormLayout } from '../../pages/EditView/components/FormLayout';\nimport { handleInvisibleAttributes } from '../../pages/EditView/utils/data';\nimport { buildValidParams } from '../../utils/api';\nimport { createYupSchema } from '../../utils/validation';\nimport { InputPopover } from '../components/InputPopover';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { INTERNAL_EVENTS, PUBLIC_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\nimport type { Schema, UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEVICES = [\n {\n name: 'desktop',\n label: {\n id: 'content-manager.preview.device.desktop',\n defaultMessage: 'Desktop',\n },\n width: '100%',\n height: '100%',\n },\n {\n name: 'mobile',\n label: {\n id: 'content-manager.preview.device.mobile',\n defaultMessage: 'Mobile',\n },\n width: '375px',\n height: '667px',\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverField extends FieldContentSourceMap {\n position: DOMRect;\n attribute: Schema.Attribute.AnyAttribute;\n}\n\ninterface PreviewContextValue {\n url: string;\n title: string;\n document: NonNullable<ReturnType<UseDocument>['document']>;\n meta: NonNullable<ReturnType<UseDocument>['meta']>;\n schema: NonNullable<ReturnType<UseDocument>['schema']>;\n components: NonNullable<ReturnType<UseDocument>['components']>;\n layout: EditLayout;\n onPreview: () => void;\n iframeRef: React.RefObject<HTMLIFrameElement>;\n popoverField: PopoverField | null;\n setPopoverField: (value: PopoverField | null) => void;\n}\n\ntype PreviewHighlightColors = {\n highlightHoverColor: string;\n highlightActiveColor: string;\n};\n\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\n\nconst getPreviewScript = (() => {\n let previewScript = '';\n return async (previewHighlightColors: PreviewHighlightColors) => {\n if (!previewScript) {\n const resp = await fetch(`${window.strapi.backendURL}/content-manager/preview/script`);\n\n if (!resp.ok) {\n throw new Error('Could not retrieve preview script from server.');\n }\n\n previewScript = await resp.text();\n\n if (!previewScript) {\n throw new Error('Could not retrieve preview script from server.');\n }\n }\n\n return `(${previewScript})(${JSON.stringify({\n colors: previewHighlightColors,\n events: INTERNAL_EVENTS,\n parentOrigin: window.location.origin,\n })})`;\n };\n})();\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst AnimatedArrow = styled(ArrowLineLeft)<{ $isSideEditorOpen: boolean }>`\n will-change: transform;\n rotate: ${(props) => (props.$isSideEditorOpen ? '0deg' : '180deg')};\n transition: rotate 0.2s ease-in-out;\n`;\n\nconst PreviewPage = () => {\n const location = useLocation();\n const { formatMessage } = useIntl();\n const theme = useTheme();\n\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\n const [popoverField, setPopoverField] = React.useState<PopoverField | null>(null);\n const { toggleNotification } = useNotification();\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: { i18n?: { locale?: string } };\n status?: string;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const [deviceName, setDeviceName] = React.useState<(typeof DEVICES)[number]['name']>(\n DEVICES[0].name\n );\n const device = DEVICES.find((d) => d.name === deviceName) ?? DEVICES[0];\n\n const previewHighlightColors: PreviewHighlightColors = {\n highlightHoverColor: theme.colors.primary500,\n highlightActiveColor: theme.colors.primary600,\n };\n\n // Listen for ready message from iframe before injecting script\n React.useEffect(() => {\n const handleMessage = async (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === PUBLIC_EVENTS.PREVIEW_READY) {\n try {\n const script = await getPreviewScript(previewHighlightColors);\n\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.preview.error.script-failed',\n defaultMessage:\n 'Could not load the live preview script. Visual editing may not be available.',\n }),\n });\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n // Preserve the existing dependency behavior: previewHighlightColors is derived from theme.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentId, toggleNotification, theme, formatMessage]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale as GetPreviewUrl.Request['query']['locale'],\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n const documentLayoutResponse = useDocumentLayout(model);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading)) {\n return <Page.Loading />;\n }\n\n const initialValues = documentResponse.getInitialFormValues();\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema ||\n !initialValues\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n const validateSync = (values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validateSync(cleanedValues, { abortEarly: false });\n };\n\n const previewUrl = previewUrlResponse.data.data.url;\n\n const onPreview = () => {\n iframeRef?.current?.contentWindow?.postMessage(\n { type: 'strapiUpdate' },\n // The iframe origin is safe to use since it must be provided through the allowedOrigins config\n new URL(iframeRef.current.src).origin\n );\n };\n\n const hasAdvancedPreview = window.strapi.features.isEnabled('cms-advanced-preview');\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrl}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n components={documentResponse.components}\n layout={documentLayoutResponse.edit}\n onPreview={onPreview}\n iframeRef={iframeRef}\n popoverField={popoverField}\n setPopoverField={setPopoverField}\n >\n <FormContext\n method=\"PUT\"\n disabled={\n query.status === 'published' &&\n documentResponse &&\n documentResponse.document.status !== 'draft'\n }\n initialValues={documentResponse.getInitialFormValues()}\n initialErrors={location?.state?.forceValidation ? validateSync(initialValues, {}) : {}}\n height=\"100%\"\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validate(cleanedValues, { abortEarly: false });\n }}\n >\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <Blocker />\n <PreviewHeader />\n <InputPopover documentResponse={documentResponse} />\n <Flex flex={1} overflow=\"auto\" alignItems=\"stretch\">\n {hasAdvancedPreview && (\n <Box\n overflow=\"auto\"\n width={isSideEditorOpen ? '50%' : 0}\n borderWidth=\"0 1px 0 0\"\n borderColor=\"neutral150\"\n paddingTop={6}\n paddingBottom={6}\n // Remove horizontal padding when the editor is closed or it won't fully disappear\n paddingLeft={isSideEditorOpen ? 6 : 0}\n paddingRight={isSideEditorOpen ? 6 : 0}\n transition=\"all 0.2s ease-in-out\"\n >\n <FormLayout\n layout={documentLayoutResponse.edit.layout}\n document={documentResponse}\n hasBackground={false}\n />\n </Box>\n )}\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n flex={1}\n height=\"100%\"\n overflow=\"hidden\"\n >\n <Flex\n direction=\"row\"\n background=\"neutral0\"\n padding={2}\n borderWidth=\"0 0 1px 0\"\n borderColor=\"neutral150\"\n >\n {hasAdvancedPreview && (\n <IconButton\n variant=\"ghost\"\n label={formatMessage(\n isSideEditorOpen\n ? {\n id: 'content-manager.preview.content.close-editor',\n defaultMessage: 'Close editor',\n }\n : {\n id: 'content-manager.preview.content.open-editor',\n defaultMessage: 'Open editor',\n }\n )}\n onClick={() => setIsSideEditorOpen((prev) => !prev)}\n >\n <AnimatedArrow $isSideEditorOpen={isSideEditorOpen} />\n </IconButton>\n )}\n <Flex justifyContent=\"center\" flex={1}>\n <SingleSelect\n value={deviceName}\n onChange={(name) => setDeviceName(name.toString())}\n aria-label={formatMessage({\n id: 'content-manager.preview.device.select',\n defaultMessage: 'Select device type',\n })}\n >\n {DEVICES.map((deviceOption) => (\n <SingleSelectOption key={deviceOption.name} value={deviceOption.name}>\n {formatMessage(deviceOption.label)}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Flex>\n </Flex>\n <Flex direction=\"column\" justifyContent=\"center\" background=\"neutral0\" flex={1}>\n <Box\n data-testid=\"preview-iframe\"\n ref={iframeRef}\n src={previewUrl}\n /**\n * For some reason, changing an iframe's src tag causes the browser to add a new item in the\n * history stack. This is an issue for us as it means clicking the back button will not let us\n * go back to the edit view. To fix it, we need to trick the browser into thinking this is a\n * different iframe when the preview URL changes. So we set a key prop to force React\n * to mount a different node when the src changes.\n */\n key={previewUrl}\n title={formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n })}\n width={device.width}\n height={device.height}\n borderWidth={0}\n tag=\"iframe\"\n />\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </FormContext>\n </PreviewProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedPreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedPreviewPageImpl = () => {\n const { slug: model } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC([\n { action: 'plugin::content-manager.explorer.read', subject: model },\n { action: 'plugin::content-manager.explorer.update', subject: model },\n { action: 'plugin::content-manager.explorer.publish', subject: model },\n ]);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !model) {\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Protect\n permissions={permissions.filter((permission) =>\n permission.action.includes('explorer.read')\n )}\n >\n <DocumentRBAC permissions={permissions}>\n <PreviewPage />\n </DocumentRBAC>\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedPreviewPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedPreviewPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedPreviewPage, usePreviewContext };\nexport type { PreviewContextValue };\n"],"names":["DEVICES","name","label","id","defaultMessage","width","height","PreviewProvider","usePreviewContext","createContext","getPreviewScript","previewScript","previewHighlightColors","resp","fetch","window","strapi","backendURL","ok","Error","text","JSON","stringify","colors","events","INTERNAL_EVENTS","parentOrigin","location","origin","AnimatedArrow","styled","ArrowLineLeft","props","$isSideEditorOpen","PreviewPage","useLocation","formatMessage","useIntl","theme","useTheme","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","toggleNotification","useNotification","slug","model","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","highlightHoverColor","primary500","highlightActiveColor","primary600","useEffect","handleMessage","event","current","previewOrigin","URL","src","data","type","PUBLIC_EVENTS","PREVIEW_READY","script","sendMessage","getSendMessage","STRAPI_SCRIPT","message","addEventListener","removeEventListener","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","locale","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","url","NoData","documentTitle","getTitle","edit","settings","mainField","validateSync","values","options","cleanedValues","removedAttributes","handleInvisibleAttributes","components","yupSchema","createYupSchema","attributes","abortEarly","previewUrl","onPreview","contentWindow","postMessage","hasAdvancedPreview","features","isEnabled","_jsxs","_Fragment","Title","title","layout","FormContext","method","disabled","initialErrors","state","forceValidation","validate","Flex","direction","alignItems","Blocker","PreviewHeader","InputPopover","flex","overflow","Box","borderWidth","borderColor","paddingTop","paddingBottom","paddingLeft","paddingRight","transition","FormLayout","hasBackground","background","padding","IconButton","variant","onClick","prev","justifyContent","SingleSelect","value","onChange","toString","aria-label","map","deviceOption","SingleSelectOption","data-testid","ref","tag","ProtectedPreviewPageImpl","permissions","useRBAC","action","subject","position","top","left","zIndex","Protect","filter","permission","includes","DocumentRBAC","ProtectedPreviewPage","Portal","FocusTrap"],"mappings":"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"}
1
+ {"version":3,"file":"Preview.js","sources":["../../../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useQueryParams,\n useRBAC,\n createContext,\n Form as FormContext,\n type FieldContentSourceMap,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled, useTheme } from 'styled-components';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { Blocker } from '../../pages/EditView/components/Blocker';\nimport { FormLayout } from '../../pages/EditView/components/FormLayout';\nimport { handleInvisibleAttributes } from '../../pages/EditView/utils/data';\nimport { buildValidParams } from '../../utils/api';\nimport { createYupSchema } from '../../utils/validation';\nimport { InputPopover } from '../components/InputPopover';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { INTERNAL_EVENTS, PUBLIC_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\nimport type { Schema, UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEVICES = [\n {\n name: 'desktop',\n label: {\n id: 'content-manager.preview.device.desktop',\n defaultMessage: 'Desktop',\n },\n width: '100%',\n height: '100%',\n },\n {\n name: 'mobile',\n label: {\n id: 'content-manager.preview.device.mobile',\n defaultMessage: 'Mobile',\n },\n width: '375px',\n height: '667px',\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverField extends FieldContentSourceMap {\n position: DOMRect;\n attribute: Schema.Attribute.AnyAttribute;\n blockIndex: number | null;\n}\n\ninterface PreviewContextValue {\n url: string;\n title: string;\n document: NonNullable<ReturnType<UseDocument>['document']>;\n meta: NonNullable<ReturnType<UseDocument>['meta']>;\n schema: NonNullable<ReturnType<UseDocument>['schema']>;\n components: NonNullable<ReturnType<UseDocument>['components']>;\n layout: EditLayout;\n onPreview: () => void;\n iframeRef: React.RefObject<HTMLIFrameElement>;\n popoverField: PopoverField | null;\n setPopoverField: (value: PopoverField | null) => void;\n}\n\ntype PreviewHighlightColors = {\n highlightHoverColor: string;\n highlightActiveColor: string;\n};\n\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\n\nconst getPreviewScript = (() => {\n let previewScript = '';\n return async (previewHighlightColors: PreviewHighlightColors) => {\n if (!previewScript) {\n const resp = await fetch(`${window.strapi.backendURL}/content-manager/preview/script`);\n\n if (!resp.ok) {\n throw new Error('Could not retrieve preview script from server.');\n }\n\n previewScript = await resp.text();\n\n if (!previewScript) {\n throw new Error('Could not retrieve preview script from server.');\n }\n }\n\n return `(${previewScript})(${JSON.stringify({\n colors: previewHighlightColors,\n events: INTERNAL_EVENTS,\n parentOrigin: window.location.origin,\n })})`;\n };\n})();\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst AnimatedArrow = styled(ArrowLineLeft)<{ $isSideEditorOpen: boolean }>`\n will-change: transform;\n rotate: ${(props) => (props.$isSideEditorOpen ? '0deg' : '180deg')};\n transition: rotate 0.2s ease-in-out;\n`;\n\nconst PreviewPage = () => {\n const location = useLocation();\n const { formatMessage } = useIntl();\n const theme = useTheme();\n\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\n const [popoverField, setPopoverField] = React.useState<PopoverField | null>(null);\n const prevPopoverFieldRef = React.useRef<PopoverField | null>(null);\n\n // When the popover closes, ask the iframe to rescan its stega element groups.\n // Live-preview sync updates the iframe DOM while editing, which can change the\n // rendered height of the field; groups need to reflect the current DOM so that\n // hover highlights and double-click detection work on the updated content.\n React.useEffect(() => {\n const prev = prevPopoverFieldRef.current;\n prevPopoverFieldRef.current = popoverField;\n\n if (prev !== null && popoverField === null) {\n const iframe = iframeRef.current;\n if (!iframe?.src) return;\n iframe.contentWindow?.postMessage(\n { type: INTERNAL_EVENTS.STRAPI_RESCAN_HIGHLIGHTS },\n new URL(iframe.src).origin\n );\n }\n }, [popoverField, iframeRef]);\n\n const { toggleNotification } = useNotification();\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: { i18n?: { locale?: string } };\n status?: string;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const [deviceName, setDeviceName] = React.useState<(typeof DEVICES)[number]['name']>(\n DEVICES[0].name\n );\n const device = DEVICES.find((d) => d.name === deviceName) ?? DEVICES[0];\n\n const previewHighlightColors: PreviewHighlightColors = {\n highlightHoverColor: theme.colors.primary500,\n highlightActiveColor: theme.colors.primary600,\n };\n\n // Listen for ready message from iframe before injecting script\n React.useEffect(() => {\n const handleMessage = async (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === PUBLIC_EVENTS.PREVIEW_READY) {\n try {\n const script = await getPreviewScript(previewHighlightColors);\n\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.preview.error.script-failed',\n defaultMessage:\n 'Could not load the live preview script. Visual editing may not be available.',\n }),\n });\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n // Preserve the existing dependency behavior: previewHighlightColors is derived from theme.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentId, toggleNotification, theme, formatMessage]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale as GetPreviewUrl.Request['query']['locale'],\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n const documentLayoutResponse = useDocumentLayout(model);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading)) {\n return <Page.Loading />;\n }\n\n const initialValues = documentResponse.getInitialFormValues();\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema ||\n !initialValues\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n const validateSync = (values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validateSync(cleanedValues, { abortEarly: false });\n };\n\n const previewUrl = previewUrlResponse.data.data.url;\n\n const onPreview = () => {\n iframeRef?.current?.contentWindow?.postMessage(\n { type: 'strapiUpdate' },\n // The iframe origin is safe to use since it must be provided through the allowedOrigins config\n new URL(iframeRef.current.src).origin\n );\n };\n\n const hasAdvancedPreview = window.strapi.features.isEnabled('cms-advanced-preview');\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrl}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n components={documentResponse.components}\n layout={documentLayoutResponse.edit}\n onPreview={onPreview}\n iframeRef={iframeRef}\n popoverField={popoverField}\n setPopoverField={setPopoverField}\n >\n <FormContext\n method=\"PUT\"\n disabled={\n query.status === 'published' &&\n documentResponse &&\n documentResponse.document.status !== 'draft'\n }\n initialValues={documentResponse.getInitialFormValues()}\n initialErrors={location?.state?.forceValidation ? validateSync(initialValues, {}) : {}}\n height=\"100%\"\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validate(cleanedValues, { abortEarly: false });\n }}\n >\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <Blocker />\n <PreviewHeader />\n <InputPopover documentResponse={documentResponse} />\n <Flex flex={1} overflow=\"auto\" alignItems=\"stretch\">\n {hasAdvancedPreview && (\n <Box\n overflow=\"auto\"\n width={isSideEditorOpen ? '50%' : 0}\n borderWidth=\"0 1px 0 0\"\n borderColor=\"neutral150\"\n paddingTop={6}\n paddingBottom={6}\n // Remove horizontal padding when the editor is closed or it won't fully disappear\n paddingLeft={isSideEditorOpen ? 6 : 0}\n paddingRight={isSideEditorOpen ? 6 : 0}\n transition=\"all 0.2s ease-in-out\"\n >\n <FormLayout\n layout={documentLayoutResponse.edit.layout}\n document={documentResponse}\n hasBackground={false}\n />\n </Box>\n )}\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n flex={1}\n height=\"100%\"\n overflow=\"hidden\"\n >\n <Flex\n direction=\"row\"\n background=\"neutral0\"\n padding={2}\n borderWidth=\"0 0 1px 0\"\n borderColor=\"neutral150\"\n >\n {hasAdvancedPreview && (\n <IconButton\n variant=\"ghost\"\n label={formatMessage(\n isSideEditorOpen\n ? {\n id: 'content-manager.preview.content.close-editor',\n defaultMessage: 'Close editor',\n }\n : {\n id: 'content-manager.preview.content.open-editor',\n defaultMessage: 'Open editor',\n }\n )}\n onClick={() => setIsSideEditorOpen((prev) => !prev)}\n >\n <AnimatedArrow $isSideEditorOpen={isSideEditorOpen} />\n </IconButton>\n )}\n <Flex justifyContent=\"center\" flex={1}>\n <SingleSelect\n value={deviceName}\n onChange={(name) => setDeviceName(name.toString())}\n aria-label={formatMessage({\n id: 'content-manager.preview.device.select',\n defaultMessage: 'Select device type',\n })}\n >\n {DEVICES.map((deviceOption) => (\n <SingleSelectOption key={deviceOption.name} value={deviceOption.name}>\n {formatMessage(deviceOption.label)}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Flex>\n </Flex>\n <Flex direction=\"column\" justifyContent=\"center\" background=\"neutral0\" flex={1}>\n <Box\n data-testid=\"preview-iframe\"\n ref={iframeRef}\n src={previewUrl}\n /**\n * For some reason, changing an iframe's src tag causes the browser to add a new item in the\n * history stack. This is an issue for us as it means clicking the back button will not let us\n * go back to the edit view. To fix it, we need to trick the browser into thinking this is a\n * different iframe when the preview URL changes. So we set a key prop to force React\n * to mount a different node when the src changes.\n */\n key={previewUrl}\n title={formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n })}\n width={device.width}\n height={device.height}\n borderWidth={0}\n tag=\"iframe\"\n />\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </FormContext>\n </PreviewProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedPreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedPreviewPageImpl = () => {\n const { slug: model } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC([\n { action: 'plugin::content-manager.explorer.read', subject: model },\n { action: 'plugin::content-manager.explorer.update', subject: model },\n { action: 'plugin::content-manager.explorer.publish', subject: model },\n ]);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !model) {\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Protect\n permissions={permissions.filter((permission) =>\n permission.action.includes('explorer.read')\n )}\n >\n <DocumentRBAC permissions={permissions}>\n <PreviewPage />\n </DocumentRBAC>\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedPreviewPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedPreviewPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedPreviewPage, usePreviewContext };\nexport type { PreviewContextValue };\n"],"names":["DEVICES","name","label","id","defaultMessage","width","height","PreviewProvider","usePreviewContext","createContext","getPreviewScript","previewScript","previewHighlightColors","resp","fetch","window","strapi","backendURL","ok","Error","text","JSON","stringify","colors","events","INTERNAL_EVENTS","parentOrigin","location","origin","AnimatedArrow","styled","ArrowLineLeft","props","$isSideEditorOpen","PreviewPage","useLocation","formatMessage","useIntl","theme","useTheme","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","prevPopoverFieldRef","useEffect","prev","current","iframe","src","contentWindow","postMessage","type","STRAPI_RESCAN_HIGHLIGHTS","URL","toggleNotification","useNotification","slug","model","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","highlightHoverColor","primary500","highlightActiveColor","primary600","handleMessage","event","previewOrigin","data","PUBLIC_EVENTS","PREVIEW_READY","script","sendMessage","getSendMessage","STRAPI_SCRIPT","message","addEventListener","removeEventListener","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","locale","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","url","NoData","documentTitle","getTitle","edit","settings","mainField","validateSync","values","options","cleanedValues","removedAttributes","handleInvisibleAttributes","components","yupSchema","createYupSchema","attributes","abortEarly","previewUrl","onPreview","hasAdvancedPreview","features","isEnabled","_jsxs","_Fragment","Title","title","layout","FormContext","method","disabled","initialErrors","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","justifyContent","SingleSelect","value","onChange","toString","aria-label","map","deviceOption","SingleSelectOption","data-testid","ref","tag","ProtectedPreviewPageImpl","permissions","useRBAC","action","subject","position","top","left","zIndex","Protect","filter","permission","includes","DocumentRBAC","ProtectedPreviewPage","Portal","FocusTrap"],"mappings":"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"}
@@ -18,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 { INTERNAL_EVENTS, PUBLIC_EVENTS } from '../utils/constants.mjs';
22
22
  import { getSendMessage } from '../utils/getSendMessage.mjs';
23
23
 
24
24
  /* -------------------------------------------------------------------------------------------------
@@ -78,6 +78,25 @@ const PreviewPage = ()=>{
78
78
  const iframeRef = React.useRef(null);
79
79
  const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);
80
80
  const [popoverField, setPopoverField] = React.useState(null);
81
+ const prevPopoverFieldRef = React.useRef(null);
82
+ // When the popover closes, ask the iframe to rescan its stega element groups.
83
+ // Live-preview sync updates the iframe DOM while editing, which can change the
84
+ // rendered height of the field; groups need to reflect the current DOM so that
85
+ // hover highlights and double-click detection work on the updated content.
86
+ React.useEffect(()=>{
87
+ const prev = prevPopoverFieldRef.current;
88
+ prevPopoverFieldRef.current = popoverField;
89
+ if (prev !== null && popoverField === null) {
90
+ const iframe = iframeRef.current;
91
+ if (!iframe?.src) return;
92
+ iframe.contentWindow?.postMessage({
93
+ type: INTERNAL_EVENTS.STRAPI_RESCAN_HIGHLIGHTS
94
+ }, new URL(iframe.src).origin);
95
+ }
96
+ }, [
97
+ popoverField,
98
+ iframeRef
99
+ ]);
81
100
  const { toggleNotification } = useNotification();
82
101
  // Read all the necessary data from the URL to find the right preview URL
83
102
  const { slug: model, id: documentId, collectionType } = useParams();
@@ -1 +1 @@
1
- {"version":3,"file":"Preview.mjs","sources":["../../../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useQueryParams,\n useRBAC,\n createContext,\n Form as FormContext,\n type FieldContentSourceMap,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled, useTheme } from 'styled-components';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { Blocker } from '../../pages/EditView/components/Blocker';\nimport { FormLayout } from '../../pages/EditView/components/FormLayout';\nimport { handleInvisibleAttributes } from '../../pages/EditView/utils/data';\nimport { buildValidParams } from '../../utils/api';\nimport { createYupSchema } from '../../utils/validation';\nimport { InputPopover } from '../components/InputPopover';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { INTERNAL_EVENTS, PUBLIC_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\nimport type { Schema, UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEVICES = [\n {\n name: 'desktop',\n label: {\n id: 'content-manager.preview.device.desktop',\n defaultMessage: 'Desktop',\n },\n width: '100%',\n height: '100%',\n },\n {\n name: 'mobile',\n label: {\n id: 'content-manager.preview.device.mobile',\n defaultMessage: 'Mobile',\n },\n width: '375px',\n height: '667px',\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverField extends FieldContentSourceMap {\n position: DOMRect;\n attribute: Schema.Attribute.AnyAttribute;\n}\n\ninterface PreviewContextValue {\n url: string;\n title: string;\n document: NonNullable<ReturnType<UseDocument>['document']>;\n meta: NonNullable<ReturnType<UseDocument>['meta']>;\n schema: NonNullable<ReturnType<UseDocument>['schema']>;\n components: NonNullable<ReturnType<UseDocument>['components']>;\n layout: EditLayout;\n onPreview: () => void;\n iframeRef: React.RefObject<HTMLIFrameElement>;\n popoverField: PopoverField | null;\n setPopoverField: (value: PopoverField | null) => void;\n}\n\ntype PreviewHighlightColors = {\n highlightHoverColor: string;\n highlightActiveColor: string;\n};\n\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\n\nconst getPreviewScript = (() => {\n let previewScript = '';\n return async (previewHighlightColors: PreviewHighlightColors) => {\n if (!previewScript) {\n const resp = await fetch(`${window.strapi.backendURL}/content-manager/preview/script`);\n\n if (!resp.ok) {\n throw new Error('Could not retrieve preview script from server.');\n }\n\n previewScript = await resp.text();\n\n if (!previewScript) {\n throw new Error('Could not retrieve preview script from server.');\n }\n }\n\n return `(${previewScript})(${JSON.stringify({\n colors: previewHighlightColors,\n events: INTERNAL_EVENTS,\n parentOrigin: window.location.origin,\n })})`;\n };\n})();\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst AnimatedArrow = styled(ArrowLineLeft)<{ $isSideEditorOpen: boolean }>`\n will-change: transform;\n rotate: ${(props) => (props.$isSideEditorOpen ? '0deg' : '180deg')};\n transition: rotate 0.2s ease-in-out;\n`;\n\nconst PreviewPage = () => {\n const location = useLocation();\n const { formatMessage } = useIntl();\n const theme = useTheme();\n\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\n const [popoverField, setPopoverField] = React.useState<PopoverField | null>(null);\n const { toggleNotification } = useNotification();\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: { i18n?: { locale?: string } };\n status?: string;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const [deviceName, setDeviceName] = React.useState<(typeof DEVICES)[number]['name']>(\n DEVICES[0].name\n );\n const device = DEVICES.find((d) => d.name === deviceName) ?? DEVICES[0];\n\n const previewHighlightColors: PreviewHighlightColors = {\n highlightHoverColor: theme.colors.primary500,\n highlightActiveColor: theme.colors.primary600,\n };\n\n // Listen for ready message from iframe before injecting script\n React.useEffect(() => {\n const handleMessage = async (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === PUBLIC_EVENTS.PREVIEW_READY) {\n try {\n const script = await getPreviewScript(previewHighlightColors);\n\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.preview.error.script-failed',\n defaultMessage:\n 'Could not load the live preview script. Visual editing may not be available.',\n }),\n });\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n // Preserve the existing dependency behavior: previewHighlightColors is derived from theme.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentId, toggleNotification, theme, formatMessage]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale as GetPreviewUrl.Request['query']['locale'],\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n const documentLayoutResponse = useDocumentLayout(model);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading)) {\n return <Page.Loading />;\n }\n\n const initialValues = documentResponse.getInitialFormValues();\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema ||\n !initialValues\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n const validateSync = (values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validateSync(cleanedValues, { abortEarly: false });\n };\n\n const previewUrl = previewUrlResponse.data.data.url;\n\n const onPreview = () => {\n iframeRef?.current?.contentWindow?.postMessage(\n { type: 'strapiUpdate' },\n // The iframe origin is safe to use since it must be provided through the allowedOrigins config\n new URL(iframeRef.current.src).origin\n );\n };\n\n const hasAdvancedPreview = window.strapi.features.isEnabled('cms-advanced-preview');\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrl}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n components={documentResponse.components}\n layout={documentLayoutResponse.edit}\n onPreview={onPreview}\n iframeRef={iframeRef}\n popoverField={popoverField}\n setPopoverField={setPopoverField}\n >\n <FormContext\n method=\"PUT\"\n disabled={\n query.status === 'published' &&\n documentResponse &&\n documentResponse.document.status !== 'draft'\n }\n initialValues={documentResponse.getInitialFormValues()}\n initialErrors={location?.state?.forceValidation ? validateSync(initialValues, {}) : {}}\n height=\"100%\"\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validate(cleanedValues, { abortEarly: false });\n }}\n >\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <Blocker />\n <PreviewHeader />\n <InputPopover documentResponse={documentResponse} />\n <Flex flex={1} overflow=\"auto\" alignItems=\"stretch\">\n {hasAdvancedPreview && (\n <Box\n overflow=\"auto\"\n width={isSideEditorOpen ? '50%' : 0}\n borderWidth=\"0 1px 0 0\"\n borderColor=\"neutral150\"\n paddingTop={6}\n paddingBottom={6}\n // Remove horizontal padding when the editor is closed or it won't fully disappear\n paddingLeft={isSideEditorOpen ? 6 : 0}\n paddingRight={isSideEditorOpen ? 6 : 0}\n transition=\"all 0.2s ease-in-out\"\n >\n <FormLayout\n layout={documentLayoutResponse.edit.layout}\n document={documentResponse}\n hasBackground={false}\n />\n </Box>\n )}\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n flex={1}\n height=\"100%\"\n overflow=\"hidden\"\n >\n <Flex\n direction=\"row\"\n background=\"neutral0\"\n padding={2}\n borderWidth=\"0 0 1px 0\"\n borderColor=\"neutral150\"\n >\n {hasAdvancedPreview && (\n <IconButton\n variant=\"ghost\"\n label={formatMessage(\n isSideEditorOpen\n ? {\n id: 'content-manager.preview.content.close-editor',\n defaultMessage: 'Close editor',\n }\n : {\n id: 'content-manager.preview.content.open-editor',\n defaultMessage: 'Open editor',\n }\n )}\n onClick={() => setIsSideEditorOpen((prev) => !prev)}\n >\n <AnimatedArrow $isSideEditorOpen={isSideEditorOpen} />\n </IconButton>\n )}\n <Flex justifyContent=\"center\" flex={1}>\n <SingleSelect\n value={deviceName}\n onChange={(name) => setDeviceName(name.toString())}\n aria-label={formatMessage({\n id: 'content-manager.preview.device.select',\n defaultMessage: 'Select device type',\n })}\n >\n {DEVICES.map((deviceOption) => (\n <SingleSelectOption key={deviceOption.name} value={deviceOption.name}>\n {formatMessage(deviceOption.label)}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Flex>\n </Flex>\n <Flex direction=\"column\" justifyContent=\"center\" background=\"neutral0\" flex={1}>\n <Box\n data-testid=\"preview-iframe\"\n ref={iframeRef}\n src={previewUrl}\n /**\n * For some reason, changing an iframe's src tag causes the browser to add a new item in the\n * history stack. This is an issue for us as it means clicking the back button will not let us\n * go back to the edit view. To fix it, we need to trick the browser into thinking this is a\n * different iframe when the preview URL changes. So we set a key prop to force React\n * to mount a different node when the src changes.\n */\n key={previewUrl}\n title={formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n })}\n width={device.width}\n height={device.height}\n borderWidth={0}\n tag=\"iframe\"\n />\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </FormContext>\n </PreviewProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedPreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedPreviewPageImpl = () => {\n const { slug: model } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC([\n { action: 'plugin::content-manager.explorer.read', subject: model },\n { action: 'plugin::content-manager.explorer.update', subject: model },\n { action: 'plugin::content-manager.explorer.publish', subject: model },\n ]);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !model) {\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Protect\n permissions={permissions.filter((permission) =>\n permission.action.includes('explorer.read')\n )}\n >\n <DocumentRBAC permissions={permissions}>\n <PreviewPage />\n </DocumentRBAC>\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedPreviewPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedPreviewPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedPreviewPage, usePreviewContext };\nexport type { PreviewContextValue };\n"],"names":["DEVICES","name","label","id","defaultMessage","width","height","PreviewProvider","usePreviewContext","createContext","getPreviewScript","previewScript","previewHighlightColors","resp","fetch","window","strapi","backendURL","ok","Error","text","JSON","stringify","colors","events","INTERNAL_EVENTS","parentOrigin","location","origin","AnimatedArrow","styled","ArrowLineLeft","props","$isSideEditorOpen","PreviewPage","useLocation","formatMessage","useIntl","theme","useTheme","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","toggleNotification","useNotification","slug","model","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","highlightHoverColor","primary500","highlightActiveColor","primary600","useEffect","handleMessage","event","current","previewOrigin","URL","src","data","type","PUBLIC_EVENTS","PREVIEW_READY","script","sendMessage","getSendMessage","STRAPI_SCRIPT","message","addEventListener","removeEventListener","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","locale","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","url","NoData","documentTitle","getTitle","edit","settings","mainField","validateSync","values","options","cleanedValues","removedAttributes","handleInvisibleAttributes","components","yupSchema","createYupSchema","attributes","abortEarly","previewUrl","onPreview","contentWindow","postMessage","hasAdvancedPreview","features","isEnabled","_jsxs","_Fragment","Title","title","layout","FormContext","method","disabled","initialErrors","state","forceValidation","validate","Flex","direction","alignItems","Blocker","PreviewHeader","InputPopover","flex","overflow","Box","borderWidth","borderColor","paddingTop","paddingBottom","paddingLeft","paddingRight","transition","FormLayout","hasBackground","background","padding","IconButton","variant","onClick","prev","justifyContent","SingleSelect","value","onChange","toString","aria-label","map","deviceOption","SingleSelectOption","data-testid","ref","tag","ProtectedPreviewPageImpl","permissions","useRBAC","action","subject","position","top","left","zIndex","Protect","filter","permission","includes","DocumentRBAC","ProtectedPreviewPage","Portal","FocusTrap"],"mappings":"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"}
1
+ {"version":3,"file":"Preview.mjs","sources":["../../../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useQueryParams,\n useRBAC,\n createContext,\n Form as FormContext,\n type FieldContentSourceMap,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled, useTheme } from 'styled-components';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { Blocker } from '../../pages/EditView/components/Blocker';\nimport { FormLayout } from '../../pages/EditView/components/FormLayout';\nimport { handleInvisibleAttributes } from '../../pages/EditView/utils/data';\nimport { buildValidParams } from '../../utils/api';\nimport { createYupSchema } from '../../utils/validation';\nimport { InputPopover } from '../components/InputPopover';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { INTERNAL_EVENTS, PUBLIC_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\nimport type { Schema, UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEVICES = [\n {\n name: 'desktop',\n label: {\n id: 'content-manager.preview.device.desktop',\n defaultMessage: 'Desktop',\n },\n width: '100%',\n height: '100%',\n },\n {\n name: 'mobile',\n label: {\n id: 'content-manager.preview.device.mobile',\n defaultMessage: 'Mobile',\n },\n width: '375px',\n height: '667px',\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverField extends FieldContentSourceMap {\n position: DOMRect;\n attribute: Schema.Attribute.AnyAttribute;\n blockIndex: number | null;\n}\n\ninterface PreviewContextValue {\n url: string;\n title: string;\n document: NonNullable<ReturnType<UseDocument>['document']>;\n meta: NonNullable<ReturnType<UseDocument>['meta']>;\n schema: NonNullable<ReturnType<UseDocument>['schema']>;\n components: NonNullable<ReturnType<UseDocument>['components']>;\n layout: EditLayout;\n onPreview: () => void;\n iframeRef: React.RefObject<HTMLIFrameElement>;\n popoverField: PopoverField | null;\n setPopoverField: (value: PopoverField | null) => void;\n}\n\ntype PreviewHighlightColors = {\n highlightHoverColor: string;\n highlightActiveColor: string;\n};\n\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\n\nconst getPreviewScript = (() => {\n let previewScript = '';\n return async (previewHighlightColors: PreviewHighlightColors) => {\n if (!previewScript) {\n const resp = await fetch(`${window.strapi.backendURL}/content-manager/preview/script`);\n\n if (!resp.ok) {\n throw new Error('Could not retrieve preview script from server.');\n }\n\n previewScript = await resp.text();\n\n if (!previewScript) {\n throw new Error('Could not retrieve preview script from server.');\n }\n }\n\n return `(${previewScript})(${JSON.stringify({\n colors: previewHighlightColors,\n events: INTERNAL_EVENTS,\n parentOrigin: window.location.origin,\n })})`;\n };\n})();\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst AnimatedArrow = styled(ArrowLineLeft)<{ $isSideEditorOpen: boolean }>`\n will-change: transform;\n rotate: ${(props) => (props.$isSideEditorOpen ? '0deg' : '180deg')};\n transition: rotate 0.2s ease-in-out;\n`;\n\nconst PreviewPage = () => {\n const location = useLocation();\n const { formatMessage } = useIntl();\n const theme = useTheme();\n\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\n const [popoverField, setPopoverField] = React.useState<PopoverField | null>(null);\n const prevPopoverFieldRef = React.useRef<PopoverField | null>(null);\n\n // When the popover closes, ask the iframe to rescan its stega element groups.\n // Live-preview sync updates the iframe DOM while editing, which can change the\n // rendered height of the field; groups need to reflect the current DOM so that\n // hover highlights and double-click detection work on the updated content.\n React.useEffect(() => {\n const prev = prevPopoverFieldRef.current;\n prevPopoverFieldRef.current = popoverField;\n\n if (prev !== null && popoverField === null) {\n const iframe = iframeRef.current;\n if (!iframe?.src) return;\n iframe.contentWindow?.postMessage(\n { type: INTERNAL_EVENTS.STRAPI_RESCAN_HIGHLIGHTS },\n new URL(iframe.src).origin\n );\n }\n }, [popoverField, iframeRef]);\n\n const { toggleNotification } = useNotification();\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: { i18n?: { locale?: string } };\n status?: string;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const [deviceName, setDeviceName] = React.useState<(typeof DEVICES)[number]['name']>(\n DEVICES[0].name\n );\n const device = DEVICES.find((d) => d.name === deviceName) ?? DEVICES[0];\n\n const previewHighlightColors: PreviewHighlightColors = {\n highlightHoverColor: theme.colors.primary500,\n highlightActiveColor: theme.colors.primary600,\n };\n\n // Listen for ready message from iframe before injecting script\n React.useEffect(() => {\n const handleMessage = async (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === PUBLIC_EVENTS.PREVIEW_READY) {\n try {\n const script = await getPreviewScript(previewHighlightColors);\n\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.preview.error.script-failed',\n defaultMessage:\n 'Could not load the live preview script. Visual editing may not be available.',\n }),\n });\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n // Preserve the existing dependency behavior: previewHighlightColors is derived from theme.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentId, toggleNotification, theme, formatMessage]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale as GetPreviewUrl.Request['query']['locale'],\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n const documentLayoutResponse = useDocumentLayout(model);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading)) {\n return <Page.Loading />;\n }\n\n const initialValues = documentResponse.getInitialFormValues();\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema ||\n !initialValues\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n const validateSync = (values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validateSync(cleanedValues, { abortEarly: false });\n };\n\n const previewUrl = previewUrlResponse.data.data.url;\n\n const onPreview = () => {\n iframeRef?.current?.contentWindow?.postMessage(\n { type: 'strapiUpdate' },\n // The iframe origin is safe to use since it must be provided through the allowedOrigins config\n new URL(iframeRef.current.src).origin\n );\n };\n\n const hasAdvancedPreview = window.strapi.features.isEnabled('cms-advanced-preview');\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrl}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n components={documentResponse.components}\n layout={documentLayoutResponse.edit}\n onPreview={onPreview}\n iframeRef={iframeRef}\n popoverField={popoverField}\n setPopoverField={setPopoverField}\n >\n <FormContext\n method=\"PUT\"\n disabled={\n query.status === 'published' &&\n documentResponse &&\n documentResponse.document.status !== 'draft'\n }\n initialValues={documentResponse.getInitialFormValues()}\n initialErrors={location?.state?.forceValidation ? validateSync(initialValues, {}) : {}}\n height=\"100%\"\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validate(cleanedValues, { abortEarly: false });\n }}\n >\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <Blocker />\n <PreviewHeader />\n <InputPopover documentResponse={documentResponse} />\n <Flex flex={1} overflow=\"auto\" alignItems=\"stretch\">\n {hasAdvancedPreview && (\n <Box\n overflow=\"auto\"\n width={isSideEditorOpen ? '50%' : 0}\n borderWidth=\"0 1px 0 0\"\n borderColor=\"neutral150\"\n paddingTop={6}\n paddingBottom={6}\n // Remove horizontal padding when the editor is closed or it won't fully disappear\n paddingLeft={isSideEditorOpen ? 6 : 0}\n paddingRight={isSideEditorOpen ? 6 : 0}\n transition=\"all 0.2s ease-in-out\"\n >\n <FormLayout\n layout={documentLayoutResponse.edit.layout}\n document={documentResponse}\n hasBackground={false}\n />\n </Box>\n )}\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n flex={1}\n height=\"100%\"\n overflow=\"hidden\"\n >\n <Flex\n direction=\"row\"\n background=\"neutral0\"\n padding={2}\n borderWidth=\"0 0 1px 0\"\n borderColor=\"neutral150\"\n >\n {hasAdvancedPreview && (\n <IconButton\n variant=\"ghost\"\n label={formatMessage(\n isSideEditorOpen\n ? {\n id: 'content-manager.preview.content.close-editor',\n defaultMessage: 'Close editor',\n }\n : {\n id: 'content-manager.preview.content.open-editor',\n defaultMessage: 'Open editor',\n }\n )}\n onClick={() => setIsSideEditorOpen((prev) => !prev)}\n >\n <AnimatedArrow $isSideEditorOpen={isSideEditorOpen} />\n </IconButton>\n )}\n <Flex justifyContent=\"center\" flex={1}>\n <SingleSelect\n value={deviceName}\n onChange={(name) => setDeviceName(name.toString())}\n aria-label={formatMessage({\n id: 'content-manager.preview.device.select',\n defaultMessage: 'Select device type',\n })}\n >\n {DEVICES.map((deviceOption) => (\n <SingleSelectOption key={deviceOption.name} value={deviceOption.name}>\n {formatMessage(deviceOption.label)}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Flex>\n </Flex>\n <Flex direction=\"column\" justifyContent=\"center\" background=\"neutral0\" flex={1}>\n <Box\n data-testid=\"preview-iframe\"\n ref={iframeRef}\n src={previewUrl}\n /**\n * For some reason, changing an iframe's src tag causes the browser to add a new item in the\n * history stack. This is an issue for us as it means clicking the back button will not let us\n * go back to the edit view. To fix it, we need to trick the browser into thinking this is a\n * different iframe when the preview URL changes. So we set a key prop to force React\n * to mount a different node when the src changes.\n */\n key={previewUrl}\n title={formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n })}\n width={device.width}\n height={device.height}\n borderWidth={0}\n tag=\"iframe\"\n />\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </FormContext>\n </PreviewProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedPreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedPreviewPageImpl = () => {\n const { slug: model } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC([\n { action: 'plugin::content-manager.explorer.read', subject: model },\n { action: 'plugin::content-manager.explorer.update', subject: model },\n { action: 'plugin::content-manager.explorer.publish', subject: model },\n ]);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !model) {\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={5}\n background=\"neutral0\"\n >\n <Page.Protect\n permissions={permissions.filter((permission) =>\n permission.action.includes('explorer.read')\n )}\n >\n <DocumentRBAC permissions={permissions}>\n <PreviewPage />\n </DocumentRBAC>\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedPreviewPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedPreviewPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedPreviewPage, usePreviewContext };\nexport type { PreviewContextValue };\n"],"names":["DEVICES","name","label","id","defaultMessage","width","height","PreviewProvider","usePreviewContext","createContext","getPreviewScript","previewScript","previewHighlightColors","resp","fetch","window","strapi","backendURL","ok","Error","text","JSON","stringify","colors","events","INTERNAL_EVENTS","parentOrigin","location","origin","AnimatedArrow","styled","ArrowLineLeft","props","$isSideEditorOpen","PreviewPage","useLocation","formatMessage","useIntl","theme","useTheme","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","prevPopoverFieldRef","useEffect","prev","current","iframe","src","contentWindow","postMessage","type","STRAPI_RESCAN_HIGHLIGHTS","URL","toggleNotification","useNotification","slug","model","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","highlightHoverColor","primary500","highlightActiveColor","primary600","handleMessage","event","previewOrigin","data","PUBLIC_EVENTS","PREVIEW_READY","script","sendMessage","getSendMessage","STRAPI_SCRIPT","message","addEventListener","removeEventListener","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","locale","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","url","NoData","documentTitle","getTitle","edit","settings","mainField","validateSync","values","options","cleanedValues","removedAttributes","handleInvisibleAttributes","components","yupSchema","createYupSchema","attributes","abortEarly","previewUrl","onPreview","hasAdvancedPreview","features","isEnabled","_jsxs","_Fragment","Title","title","layout","FormContext","method","disabled","initialErrors","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","justifyContent","SingleSelect","value","onChange","toString","aria-label","map","deviceOption","SingleSelectOption","data-testid","ref","tag","ProtectedPreviewPageImpl","permissions","useRBAC","action","subject","position","top","left","zIndex","Protect","filter","permission","includes","DocumentRBAC","ProtectedPreviewPage","Portal","FocusTrap"],"mappings":"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"}
@@ -5,9 +5,10 @@
5
5
  */ const INTERNAL_EVENTS = {
6
6
  STRAPI_FIELD_FOCUS: 'strapiFieldFocus',
7
7
  STRAPI_FIELD_BLUR: 'strapiFieldBlur',
8
- STRAPI_FIELD_CHANGE: 'strapiFieldChange',
9
8
  STRAPI_FIELD_FOCUS_INTENT: 'strapiFieldFocusIntent',
10
- STRAPI_FIELD_SINGLE_CLICK_HINT: 'strapiFieldSingleClickHint'
9
+ STRAPI_FIELD_SINGLE_CLICK_HINT: 'strapiFieldSingleClickHint',
10
+ STRAPI_IFRAME_CLICK: 'strapiIframeClick',
11
+ STRAPI_RESCAN_HIGHLIGHTS: 'strapiRescanHighlights'
11
12
  };
12
13
  /**
13
14
  * These events are documented to users, and will be hardcoded in their frontends.
@@ -15,7 +16,12 @@
15
16
  */ const PUBLIC_EVENTS = {
16
17
  PREVIEW_READY: 'previewReady',
17
18
  STRAPI_UPDATE: 'strapiUpdate',
18
- STRAPI_SCRIPT: 'strapiScript'
19
+ STRAPI_SCRIPT: 'strapiScript',
20
+ /**
21
+ * Dispatched as a CustomEvent on the iframe window when a blocks field changes.
22
+ * Host apps listen for this event to re-render their BlocksRenderer in real time.
23
+ * Also sent as a postMessage from the admin to the iframe (same event type).
24
+ */ STRAPI_FIELD_CHANGE: 'strapiFieldChange'
19
25
  };
20
26
  /**
21
27
  * Error messages for preview field operations.
@@ -1 +1 @@
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\n/**\n * These events are not part of the public API, changing them is not a breaking change.\n */\nexport const INTERNAL_EVENTS = {\n STRAPI_FIELD_FOCUS: 'strapiFieldFocus',\n STRAPI_FIELD_BLUR: 'strapiFieldBlur',\n STRAPI_FIELD_CHANGE: 'strapiFieldChange',\n STRAPI_FIELD_FOCUS_INTENT: 'strapiFieldFocusIntent',\n STRAPI_FIELD_SINGLE_CLICK_HINT: 'strapiFieldSingleClickHint',\n} as const;\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":["INTERNAL_EVENTS","STRAPI_FIELD_FOCUS","STRAPI_FIELD_BLUR","STRAPI_FIELD_CHANGE","STRAPI_FIELD_FOCUS_INTENT","STRAPI_FIELD_SINGLE_CLICK_HINT","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":";;AAGA;;UAGaA,eAAAA,GAAkB;IAC7BC,kBAAAA,EAAoB,kBAAA;IACpBC,iBAAAA,EAAmB,iBAAA;IACnBC,mBAAAA,EAAqB,mBAAA;IACrBC,yBAAAA,EAA2B,wBAAA;IAC3BC,8BAAAA,EAAgC;AAClC;AAEA;;;UAIaC,aAAAA,GAAgB;IAC3BC,aAAAA,EAAe,cAAA;IACfC,aAAAA,EAAe,cAAA;IACfC,aAAAA,EAAe;AACjB;AAEA;;;UAIaC,sBAAAA,GAAyB;IACpCC,kBAAAA,EAAoB;QAClBC,IAAAA,EAAM,QAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,kDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAC,qBAAAA,EAAuB;QACrBJ,IAAAA,EAAM,MAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,qDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAE,wBAAAA,EAA0B;QACxBL,IAAAA,EAAM,QAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,wDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAG,kBAAAA,EAAoB;QAClBN,IAAAA,EAAM,MAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,kDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF;AACF;;;;;;"}
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\n/**\n * These events are not part of the public API, changing them is not a breaking change.\n */\nexport const INTERNAL_EVENTS = {\n STRAPI_FIELD_FOCUS: 'strapiFieldFocus',\n STRAPI_FIELD_BLUR: 'strapiFieldBlur',\n STRAPI_FIELD_FOCUS_INTENT: 'strapiFieldFocusIntent',\n STRAPI_FIELD_SINGLE_CLICK_HINT: 'strapiFieldSingleClickHint',\n STRAPI_IFRAME_CLICK: 'strapiIframeClick',\n STRAPI_RESCAN_HIGHLIGHTS: 'strapiRescanHighlights',\n} as const;\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 /**\n * Dispatched as a CustomEvent on the iframe window when a blocks field changes.\n * Host apps listen for this event to re-render their BlocksRenderer in real time.\n * Also sent as a postMessage from the admin to the iframe (same event type).\n */\n STRAPI_FIELD_CHANGE: 'strapiFieldChange',\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":["INTERNAL_EVENTS","STRAPI_FIELD_FOCUS","STRAPI_FIELD_BLUR","STRAPI_FIELD_FOCUS_INTENT","STRAPI_FIELD_SINGLE_CLICK_HINT","STRAPI_IFRAME_CLICK","STRAPI_RESCAN_HIGHLIGHTS","PUBLIC_EVENTS","PREVIEW_READY","STRAPI_UPDATE","STRAPI_SCRIPT","STRAPI_FIELD_CHANGE","PREVIEW_ERROR_MESSAGES","INVALID_FIELD_PATH","type","message","id","defaultMessage","RELATIONS_NOT_HANDLED","INCOMPLETE_STRAPI_SOURCE","DIFFERENT_DOCUMENT"],"mappings":";;AAGA;;UAGaA,eAAAA,GAAkB;IAC7BC,kBAAAA,EAAoB,kBAAA;IACpBC,iBAAAA,EAAmB,iBAAA;IACnBC,yBAAAA,EAA2B,wBAAA;IAC3BC,8BAAAA,EAAgC,4BAAA;IAChCC,mBAAAA,EAAqB,mBAAA;IACrBC,wBAAAA,EAA0B;AAC5B;AAEA;;;UAIaC,aAAAA,GAAgB;IAC3BC,aAAAA,EAAe,cAAA;IACfC,aAAAA,EAAe,cAAA;IACfC,aAAAA,EAAe,cAAA;AACf;;;;AAIC,MACDC,mBAAAA,EAAqB;AACvB;AAEA;;;UAIaC,sBAAAA,GAAyB;IACpCC,kBAAAA,EAAoB;QAClBC,IAAAA,EAAM,QAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,kDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAC,qBAAAA,EAAuB;QACrBJ,IAAAA,EAAM,MAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,qDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAE,wBAAAA,EAA0B;QACxBL,IAAAA,EAAM,QAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,wDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAG,kBAAAA,EAAoB;QAClBN,IAAAA,EAAM,MAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,kDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF;AACF;;;;;;"}
@@ -3,9 +3,10 @@
3
3
  */ const INTERNAL_EVENTS = {
4
4
  STRAPI_FIELD_FOCUS: 'strapiFieldFocus',
5
5
  STRAPI_FIELD_BLUR: 'strapiFieldBlur',
6
- STRAPI_FIELD_CHANGE: 'strapiFieldChange',
7
6
  STRAPI_FIELD_FOCUS_INTENT: 'strapiFieldFocusIntent',
8
- STRAPI_FIELD_SINGLE_CLICK_HINT: 'strapiFieldSingleClickHint'
7
+ STRAPI_FIELD_SINGLE_CLICK_HINT: 'strapiFieldSingleClickHint',
8
+ STRAPI_IFRAME_CLICK: 'strapiIframeClick',
9
+ STRAPI_RESCAN_HIGHLIGHTS: 'strapiRescanHighlights'
9
10
  };
10
11
  /**
11
12
  * These events are documented to users, and will be hardcoded in their frontends.
@@ -13,7 +14,12 @@
13
14
  */ const PUBLIC_EVENTS = {
14
15
  PREVIEW_READY: 'previewReady',
15
16
  STRAPI_UPDATE: 'strapiUpdate',
16
- STRAPI_SCRIPT: 'strapiScript'
17
+ STRAPI_SCRIPT: 'strapiScript',
18
+ /**
19
+ * Dispatched as a CustomEvent on the iframe window when a blocks field changes.
20
+ * Host apps listen for this event to re-render their BlocksRenderer in real time.
21
+ * Also sent as a postMessage from the admin to the iframe (same event type).
22
+ */ STRAPI_FIELD_CHANGE: 'strapiFieldChange'
17
23
  };
18
24
  /**
19
25
  * Error messages for preview field operations.
@@ -1 +1 @@
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\n/**\n * These events are not part of the public API, changing them is not a breaking change.\n */\nexport const INTERNAL_EVENTS = {\n STRAPI_FIELD_FOCUS: 'strapiFieldFocus',\n STRAPI_FIELD_BLUR: 'strapiFieldBlur',\n STRAPI_FIELD_CHANGE: 'strapiFieldChange',\n STRAPI_FIELD_FOCUS_INTENT: 'strapiFieldFocusIntent',\n STRAPI_FIELD_SINGLE_CLICK_HINT: 'strapiFieldSingleClickHint',\n} as const;\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":["INTERNAL_EVENTS","STRAPI_FIELD_FOCUS","STRAPI_FIELD_BLUR","STRAPI_FIELD_CHANGE","STRAPI_FIELD_FOCUS_INTENT","STRAPI_FIELD_SINGLE_CLICK_HINT","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":"AAGA;;UAGaA,eAAAA,GAAkB;IAC7BC,kBAAAA,EAAoB,kBAAA;IACpBC,iBAAAA,EAAmB,iBAAA;IACnBC,mBAAAA,EAAqB,mBAAA;IACrBC,yBAAAA,EAA2B,wBAAA;IAC3BC,8BAAAA,EAAgC;AAClC;AAEA;;;UAIaC,aAAAA,GAAgB;IAC3BC,aAAAA,EAAe,cAAA;IACfC,aAAAA,EAAe,cAAA;IACfC,aAAAA,EAAe;AACjB;AAEA;;;UAIaC,sBAAAA,GAAyB;IACpCC,kBAAAA,EAAoB;QAClBC,IAAAA,EAAM,QAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,kDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAC,qBAAAA,EAAuB;QACrBJ,IAAAA,EAAM,MAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,qDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAE,wBAAAA,EAA0B;QACxBL,IAAAA,EAAM,QAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,wDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAG,kBAAAA,EAAoB;QAClBN,IAAAA,EAAM,MAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,kDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF;AACF;;;;"}
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\n/**\n * These events are not part of the public API, changing them is not a breaking change.\n */\nexport const INTERNAL_EVENTS = {\n STRAPI_FIELD_FOCUS: 'strapiFieldFocus',\n STRAPI_FIELD_BLUR: 'strapiFieldBlur',\n STRAPI_FIELD_FOCUS_INTENT: 'strapiFieldFocusIntent',\n STRAPI_FIELD_SINGLE_CLICK_HINT: 'strapiFieldSingleClickHint',\n STRAPI_IFRAME_CLICK: 'strapiIframeClick',\n STRAPI_RESCAN_HIGHLIGHTS: 'strapiRescanHighlights',\n} as const;\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 /**\n * Dispatched as a CustomEvent on the iframe window when a blocks field changes.\n * Host apps listen for this event to re-render their BlocksRenderer in real time.\n * Also sent as a postMessage from the admin to the iframe (same event type).\n */\n STRAPI_FIELD_CHANGE: 'strapiFieldChange',\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":["INTERNAL_EVENTS","STRAPI_FIELD_FOCUS","STRAPI_FIELD_BLUR","STRAPI_FIELD_FOCUS_INTENT","STRAPI_FIELD_SINGLE_CLICK_HINT","STRAPI_IFRAME_CLICK","STRAPI_RESCAN_HIGHLIGHTS","PUBLIC_EVENTS","PREVIEW_READY","STRAPI_UPDATE","STRAPI_SCRIPT","STRAPI_FIELD_CHANGE","PREVIEW_ERROR_MESSAGES","INVALID_FIELD_PATH","type","message","id","defaultMessage","RELATIONS_NOT_HANDLED","INCOMPLETE_STRAPI_SOURCE","DIFFERENT_DOCUMENT"],"mappings":"AAGA;;UAGaA,eAAAA,GAAkB;IAC7BC,kBAAAA,EAAoB,kBAAA;IACpBC,iBAAAA,EAAmB,iBAAA;IACnBC,yBAAAA,EAA2B,wBAAA;IAC3BC,8BAAAA,EAAgC,4BAAA;IAChCC,mBAAAA,EAAqB,mBAAA;IACrBC,wBAAAA,EAA0B;AAC5B;AAEA;;;UAIaC,aAAAA,GAAgB;IAC3BC,aAAAA,EAAe,cAAA;IACfC,aAAAA,EAAe,cAAA;IACfC,aAAAA,EAAe,cAAA;AACf;;;;AAIC,MACDC,mBAAAA,EAAqB;AACvB;AAEA;;;UAIaC,sBAAAA,GAAyB;IACpCC,kBAAAA,EAAoB;QAClBC,IAAAA,EAAM,QAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,kDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAC,qBAAAA,EAAuB;QACrBJ,IAAAA,EAAM,MAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,qDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAE,wBAAAA,EAA0B;QACxBL,IAAAA,EAAM,QAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,wDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAG,kBAAAA,EAAoB;QAClBN,IAAAA,EAAM,MAAA;QACNC,OAAAA,EAAS;YACPC,EAAAA,EAAI,kDAAA;YACJC,cAAAA,EAAgB;AAClB;AACF;AACF;;;;"}
@@ -13,6 +13,7 @@ interface ActionsDrawerContextValue {
13
13
  setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;
14
14
  hasContent: boolean;
15
15
  hasSideNav: boolean;
16
+ headerRef: (element: HTMLDivElement) => void;
16
17
  }
17
18
  declare const useActionsDrawer: <Selected, ShouldThrow extends boolean = true>(consumerName: string, selector: (value: ActionsDrawerContextValue | null) => Selected, shouldThrowOnMissingContext?: ShouldThrow | undefined) => ShouldThrow extends true ? Selected : Selected | undefined;
18
19
  interface RootProps {
@@ -3,6 +3,7 @@ import type { ContentManagerLink } from '../hooks/useContentManagerInitData';
3
3
  interface AppState {
4
4
  collectionTypeLinks: ContentManagerLink[];
5
5
  components: GetInitData.Response['data']['components'];
6
+ contentStructure?: GetInitData.Response['data']['contentStructure'];
6
7
  fieldSizes: GetInitData.Response['data']['fieldSizes'];
7
8
  models: GetInitData.Response['data']['contentTypes'];
8
9
  singleTypeLinks: ContentManagerLink[];
@@ -13,6 +14,7 @@ declare const setInitialData: import("@reduxjs/toolkit").ActionCreatorWithPayloa
13
14
  authorizedCollectionTypeLinks: AppState["collectionTypeLinks"];
14
15
  authorizedSingleTypeLinks: AppState["singleTypeLinks"];
15
16
  components: AppState["components"];
17
+ contentStructure?: AppState["contentStructure"];
16
18
  contentTypeSchemas: AppState["models"];
17
19
  fieldSizes: AppState["fieldSizes"];
18
20
  }, "app/setInitialData">;
@@ -5,7 +5,8 @@ export interface ObservedComponent {
5
5
  menu: React.ReactNode;
6
6
  key: string;
7
7
  }
8
- export declare const EditorToolbarObserver: ({ observedComponents, menuTriggerVariant, }: {
8
+ export declare const EditorToolbarObserver: ({ observedComponents, menuTriggerVariant, containerRef, }: {
9
9
  observedComponents: ObservedComponent[];
10
10
  menuTriggerVariant?: Menu.TriggerProps["variant"];
11
+ containerRef: React.RefObject<HTMLElement | null>;
11
12
  }) => import("react/jsx-runtime").JSX.Element[];
@@ -1,6 +1,10 @@
1
+ import * as React from 'react';
1
2
  interface BlocksContentProps {
2
3
  placeholder?: string;
3
4
  ariaLabelId: string;
5
+ autoFocus?: boolean;
6
+ onFocus?: React.FocusEventHandler<HTMLElement>;
7
+ onBlur?: React.FocusEventHandler<HTMLElement>;
4
8
  }
5
- declare const BlocksContent: ({ placeholder, ariaLabelId }: BlocksContentProps) => import("react/jsx-runtime").JSX.Element;
9
+ declare const BlocksContent: ({ placeholder, ariaLabelId, autoFocus, onFocus, onBlur, }: BlocksContentProps) => import("react/jsx-runtime").JSX.Element;
6
10
  export { BlocksContent, BlocksContentProps };