@strapi/content-manager 5.61.1 → 5.62.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.
- package/dist/admin/components/ConfigurationForm/Fields.js +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +3 -3
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/features/I18nSharedFieldsLock.js +54 -0
- package/dist/admin/features/I18nSharedFieldsLock.js.map +1 -0
- package/dist/admin/features/I18nSharedFieldsLock.mjs +31 -0
- package/dist/admin/features/I18nSharedFieldsLock.mjs.map +1 -0
- package/dist/admin/history/components/VersionInputRenderer.js +7 -2
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs +7 -3
- package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
- package/dist/admin/hooks/useContentManagerInitData.js +27 -8
- package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
- package/dist/admin/hooks/useContentManagerInitData.mjs +29 -10
- package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
- package/dist/admin/hooks/useDocument.js +11 -13
- package/dist/admin/hooks/useDocument.js.map +1 -1
- package/dist/admin/hooks/useDocument.mjs +11 -13
- package/dist/admin/hooks/useDocument.mjs.map +1 -1
- package/dist/admin/hooks/useI18nFieldLock.js +169 -0
- package/dist/admin/hooks/useI18nFieldLock.js.map +1 -0
- package/dist/admin/hooks/useI18nFieldLock.mjs +140 -0
- package/dist/admin/hooks/useI18nFieldLock.mjs.map +1 -0
- package/dist/admin/hooks/usePersistentQueryParams.js +16 -3
- package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.mjs +16 -3
- package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
- package/dist/admin/index.js +5 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +2 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/modules/app.js +8 -1
- package/dist/admin/modules/app.js.map +1 -1
- package/dist/admin/modules/app.mjs +8 -2
- package/dist/admin/modules/app.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +129 -127
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +129 -127
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +11 -4
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +12 -5
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +31 -21
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +32 -22
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js +98 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs +96 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js +1103 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs +1077 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js +211 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs +183 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js +84 -41
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs +86 -43
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +86 -20
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +89 -23
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +142 -22
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +143 -23
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js +402 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs +389 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +84 -33
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +85 -34
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +17 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +18 -5
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +54 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +54 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +11 -9
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +12 -10
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +66 -63
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +66 -63
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +7 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +7 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +14 -9
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +14 -9
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/forms.js +34 -0
- package/dist/admin/pages/EditView/utils/forms.js.map +1 -1
- package/dist/admin/pages/EditView/utils/forms.mjs +34 -1
- package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +2 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +2 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +7 -6
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +7 -6
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +11 -2
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +13 -4
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +15 -5
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +16 -7
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +18 -8
- package/dist/admin/preview/components/InputPopover.js.map +1 -1
- package/dist/admin/preview/components/InputPopover.mjs +19 -9
- package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
- package/dist/admin/preview/pages/Preview.js +5 -16
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +5 -16
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.js +2 -0
- package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.mjs +2 -1
- package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
- package/dist/admin/services/api.js +2 -1
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +2 -1
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/services/documents.js +21 -1
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +21 -2
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/services/relations.js +47 -1
- package/dist/admin/services/relations.js.map +1 -1
- package/dist/admin/services/relations.mjs +47 -2
- package/dist/admin/services/relations.mjs.map +1 -1
- package/dist/admin/src/exports.d.ts +2 -0
- package/dist/admin/src/features/I18nSharedFieldsLock.d.ts +22 -0
- package/dist/admin/src/history/components/VersionInputRenderer.d.ts +7 -1
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useI18nFieldLock.d.ts +61 -0
- package/dist/admin/src/modules/app.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/AddComponentMenu.d.ts +15 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/ComponentCopyModal.d.ts +58 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.d.ts +41 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Initializer.d.ts +7 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/utils/componentCopy.d.ts +115 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +6 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +2 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +5 -1
- package/dist/admin/src/pages/EditView/utils/forms.d.ts +13 -2
- package/dist/admin/src/pages/ListView/components/Filters.d.ts +12 -3
- package/dist/admin/src/preview/services/preview.d.ts +1 -1
- package/dist/admin/src/preview/utils/fieldUtils.d.ts +1 -0
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/components.d.ts +2 -2
- package/dist/admin/src/services/contentTypes.d.ts +3 -3
- package/dist/admin/src/services/documents.d.ts +25 -21
- package/dist/admin/src/services/homepage.d.ts +1 -1
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +5 -3
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/admin/translations/en.json.js +41 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +41 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/controllers/relations.js +4 -2
- package/dist/server/controllers/relations.js.map +1 -1
- package/dist/server/controllers/relations.mjs +4 -2
- package/dist/server/controllers/relations.mjs.map +1 -1
- package/dist/server/controllers/utils/metadata.js +3 -1
- package/dist/server/controllers/utils/metadata.js.map +1 -1
- package/dist/server/controllers/utils/metadata.mjs +3 -1
- package/dist/server/controllers/utils/metadata.mjs.map +1 -1
- package/dist/server/history/services/utils.js +3 -1
- package/dist/server/history/services/utils.js.map +1 -1
- package/dist/server/history/services/utils.mjs +3 -1
- package/dist/server/history/services/utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.js +14 -0
- package/dist/server/homepage/services/homepage-query-utils.js.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.mjs +14 -1
- package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage.js +1 -1
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +2 -2
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.js +1 -3
- package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.mjs +1 -3
- package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.js +2 -1
- package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.mjs +2 -1
- package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
- package/dist/server/services/document-manager.js +3 -2
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +3 -2
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/document-metadata.js +92 -4
- package/dist/server/services/document-metadata.js.map +1 -1
- package/dist/server/services/document-metadata.mjs +92 -4
- package/dist/server/services/document-metadata.mjs.map +1 -1
- package/dist/server/services/permission-checker.js +20 -8
- package/dist/server/services/permission-checker.js.map +1 -1
- package/dist/server/services/permission-checker.mjs +20 -8
- package/dist/server/services/permission-checker.mjs.map +1 -1
- package/dist/server/services/uid.js +2 -1
- package/dist/server/services/uid.js.map +1 -1
- package/dist/server/services/uid.mjs +2 -1
- package/dist/server/services/uid.mjs.map +1 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
- package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts +6 -0
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +21 -7
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
- package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts +5 -1
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +21 -7
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permission-checker.d.ts +6 -5
- package/dist/server/src/services/permission-checker.d.ts.map +1 -1
- package/dist/server/src/services/uid.d.ts.map +1 -1
- package/dist/shared/contracts/collection-types.d.ts +7 -0
- package/dist/shared/contracts/collection-types.d.ts.map +1 -1
- package/dist/shared/contracts/single-types.d.ts +4 -0
- package/dist/shared/contracts/single-types.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -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, useDocumentRBAC } 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 const isLoadingActionsRBAC = useDocumentRBAC('PreviewPage', (state) => state.isLoading);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (\n isLoadingActionsRBAC ||\n (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading))\n ) {\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","isLoadingActionsRBAC","useDocumentRBAC","state","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","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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"}
|
|
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, useDocumentRBAC } 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 { getPublishValidationErrors } from '../../pages/EditView/utils/forms';\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 const isLoadingActionsRBAC = useDocumentRBAC('PreviewPage', (state) => state.isLoading);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (\n isLoadingActionsRBAC ||\n (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading))\n ) {\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 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={\n location?.state?.forceValidation\n ? getPublishValidationErrors(initialValues, {\n schema: documentResponse.schema,\n components: documentResponse.components,\n })\n : {}\n }\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","isLoadingActionsRBAC","useDocumentRBAC","state","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","url","NoData","documentTitle","getTitle","edit","settings","mainField","previewUrl","onPreview","hasAdvancedPreview","features","isEnabled","_jsxs","_Fragment","Title","title","components","layout","FormContext","method","disabled","initialErrors","forceValidation","getPublishValidationErrors","validate","values","options","cleanedValues","removedAttributes","handleInvisibleAttributes","yupSchema","createYupSchema","attributes","abortEarly","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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA;;AAEkG,qGAElG,MAAMA,OAAAA,GAAU;AACd,IAAA;QACEC,IAAAA,EAAM,SAAA;QACNC,KAAAA,EAAO;YACLC,EAAAA,EAAI,wCAAA;YACJC,cAAAA,EAAgB;AAClB,SAAA;QACAC,KAAAA,EAAO,MAAA;QACPC,MAAAA,EAAQ;AACV,KAAA;AACA,IAAA;QACEL,IAAAA,EAAM,QAAA;QACNC,KAAAA,EAAO;YACLC,EAAAA,EAAI,uCAAA;YACJC,cAAAA,EAAgB;AAClB,SAAA;QACAC,KAAAA,EAAO,OAAA;QACPC,MAAAA,EAAQ;AACV;AACD,CAAA;AA+BD,MAAM,CAACC,eAAAA,EAAiBC,iBAAAA,CAAkB,GAAGC,yBAAAA,CAAmC,aAAA;AAEhF,MAAMC,gBAAAA,GAAmB,CAAC,IAAA;AACxB,IAAA,IAAIC,aAAAA,GAAgB,EAAA;AACpB,IAAA,OAAO,OAAOC,sBAAAA,GAAAA;AACZ,QAAA,IAAI,CAACD,aAAAA,EAAe;YAClB,MAAME,IAAAA,GAAO,MAAMC,KAAAA,CAAM,CAAA,EAAGC,MAAAA,CAAOC,MAAM,CAACC,UAAU,CAAC,+BAA+B,CAAC,CAAA;YAErF,IAAI,CAACJ,IAAAA,CAAKK,EAAE,EAAE;AACZ,gBAAA,MAAM,IAAIC,KAAAA,CAAM,gDAAA,CAAA;AAClB,YAAA;YAEAR,aAAAA,GAAgB,MAAME,KAAKO,IAAI,EAAA;AAE/B,YAAA,IAAI,CAACT,aAAAA,EAAe;AAClB,gBAAA,MAAM,IAAIQ,KAAAA,CAAM,gDAAA,CAAA;AAClB,YAAA;AACF,QAAA;QAEA,OAAO,CAAC,CAAC,EAAER,aAAAA,CAAc,EAAE,EAAEU,IAAAA,CAAKC,SAAS,CAAC;YAC1CC,MAAAA,EAAQX,sBAAAA;YACRY,MAAAA,EAAQC,yBAAAA;YACRC,YAAAA,EAAcX,MAAAA,CAAOY,QAAQ,CAACC;AAChC,SAAA,CAAA,CAAG,CAAC,CAAC;AACP,IAAA,CAAA;AACF,CAAA,GAAA;AAEA;;AAEkG,qGAElG,MAAMC,aAAAA,GAAgBC,uBAAAA,CAAOC,mBAAAA,CAA8C;;AAEjE,UAAA,EAAE,CAACC,KAAAA,GAAWA,KAAAA,CAAMC,iBAAiB,GAAG,SAAS,QAAA,CAAU;;AAErE,CAAC;AAED,MAAMC,WAAAA,GAAc,IAAA;AAClB,IAAA,MAAMP,QAAAA,GAAWQ,0BAAAA,EAAAA;IACjB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,KAAAA,GAAQC,yBAAAA,EAAAA;IAEd,MAAMC,SAAAA,GAAYC,gBAAAA,CAAMC,MAAM,CAAoB,IAAA,CAAA;AAClD,IAAA,MAAM,CAACC,gBAAAA,EAAkBC,mBAAAA,CAAoB,GAAGH,gBAAAA,CAAMI,QAAQ,CAAC,IAAA,CAAA;AAC/D,IAAA,MAAM,CAACC,YAAAA,EAAcC,eAAAA,CAAgB,GAAGN,gBAAAA,CAAMI,QAAQ,CAAsB,IAAA,CAAA;IAC5E,MAAMG,mBAAAA,GAAsBP,gBAAAA,CAAMC,MAAM,CAAsB,IAAA,CAAA;;;;;AAM9DD,IAAAA,gBAAAA,CAAMQ,SAAS,CAAC,IAAA;QACd,MAAMC,IAAAA,GAAOF,oBAAoBG,OAAO;AACxCH,QAAAA,mBAAAA,CAAoBG,OAAO,GAAGL,YAAAA;QAE9B,IAAII,IAAAA,KAAS,IAAA,IAAQJ,YAAAA,KAAiB,IAAA,EAAM;YAC1C,MAAMM,MAAAA,GAASZ,UAAUW,OAAO;YAChC,IAAI,CAACC,QAAQC,GAAAA,EAAK;YAClBD,MAAAA,CAAOE,aAAa,EAAEC,WAAAA,CACpB;AAAEC,gBAAAA,IAAAA,EAAM/B,0BAAgBgC;AAAyB,aAAA,EACjD,IAAIC,GAAAA,CAAIN,MAAAA,CAAOC,GAAG,EAAEzB,MAAM,CAAA;AAE9B,QAAA;IACF,CAAA,EAAG;AAACkB,QAAAA,YAAAA;AAAcN,QAAAA;AAAU,KAAA,CAAA;IAE5B,MAAM,EAAEmB,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;;IAG/B,MAAM,EACJC,MAAMC,KAAK,EACX3D,IAAI4D,UAAU,EACdC,cAAc,EACf,GAAGC,wBAAAA,EAAAA;AAKJ,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,CAAC,GAAGC,0BAAAA,EAAAA;AAKpB,IAAA,MAAMC,SAAS3B,gBAAAA,CAAM4B,OAAO,CAAC,IAAMC,qBAAiBJ,KAAAA,CAAAA,EAAQ;AAACA,QAAAA;AAAM,KAAA,CAAA;IAEnE,MAAM,CAACK,UAAAA,EAAYC,aAAAA,CAAc,GAAG/B,gBAAAA,CAAMI,QAAQ,CAChD7C,OAAO,CAAC,CAAA,CAAE,CAACC,IAAI,CAAA;AAEjB,IAAA,MAAMwE,MAAAA,GAASzE,OAAAA,CAAQ0E,IAAI,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAE1E,IAAI,KAAKsE,UAAAA,CAAAA,IAAevE,OAAO,CAAC,CAAA,CAAE;AAEvE,IAAA,MAAMY,sBAAAA,GAAiD;QACrDgE,mBAAAA,EAAqBtC,KAAAA,CAAMf,MAAM,CAACsD,UAAU;QAC5CC,oBAAAA,EAAsBxC,KAAAA,CAAMf,MAAM,CAACwD;AACrC,KAAA;;AAGAtC,IAAAA,gBAAAA,CAAMQ,SAAS,CAAC,IAAA;AACd,QAAA,MAAM+B,gBAAgB,OAAOC,KAAAA,GAAAA;;YAE3B,IAAIzC,SAAAA,CAAUW,OAAO,EAAE;AACrB,gBAAA,MAAM+B,gBAAgB,IAAIxB,GAAAA,CAAIlB,UAAUW,OAAO,EAAEE,KAAKzB,MAAM;gBAC5D,IAAIqD,KAAAA,CAAMrD,MAAM,KAAKsD,aAAAA,EAAe;AAClC,oBAAA;AACF,gBAAA;AACF,YAAA;AAEA,YAAA,IAAID,MAAME,IAAI,EAAE3B,IAAAA,KAAS4B,uBAAAA,CAAcC,aAAa,EAAE;gBACpD,IAAI;oBACF,MAAMC,MAAAA,GAAS,MAAM5E,gBAAAA,CAAiBE,sBAAAA,CAAAA;AAEtC,oBAAA,MAAM2E,cAAcC,6BAAAA,CAAehD,SAAAA,CAAAA;oBACnC+C,WAAAA,CAAYH,uBAAAA,CAAcK,aAAa,EAAE;AAAEH,wBAAAA;AAAO,qBAAA,CAAA;AACpD,gBAAA,CAAA,CAAE,OAAM;oBACN3B,kBAAAA,CAAmB;wBACjBH,IAAAA,EAAM,QAAA;AACNkC,wBAAAA,OAAAA,EAAStD,aAAAA,CAAc;4BACrBjC,EAAAA,EAAI,6CAAA;4BACJC,cAAAA,EACE;AACJ,yBAAA;AACF,qBAAA,CAAA;AACF,gBAAA;AACF,YAAA;AACF,QAAA,CAAA;QAEAW,MAAAA,CAAO4E,gBAAgB,CAAC,SAAA,EAAWX,aAAAA,CAAAA;QAEnC,OAAO,IAAA;YACLjE,MAAAA,CAAO6E,mBAAmB,CAAC,SAAA,EAAWZ,aAAAA,CAAAA;AACxC,QAAA,CAAA;;;IAGF,CAAA,EAAG;AAACjB,QAAAA,UAAAA;AAAYJ,QAAAA,kBAAAA;AAAoBrB,QAAAA,KAAAA;AAAOF,QAAAA;AAAc,KAAA,CAAA;AAEzD,IAAA,IAAI,CAAC4B,cAAAA,EAAgB;AACnB,QAAA,MAAM,IAAI7C,KAAAA,CAAM,6CAAA,CAAA;AAClB,IAAA;AAEA,IAAA,IAAI,CAAC2C,KAAAA,EAAO;AACV,QAAA,MAAM,IAAI3C,KAAAA,CAAM,oCAAA,CAAA;AAClB,IAAA;;IAGA,IAAI6C,cAAAA,KAAmB6B,4BAAAA,IAAoB,CAAC9B,UAAAA,EAAY;AACtD,QAAA,MAAM,IAAI5C,KAAAA,CAAM,yCAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAM2E,qBAAqBC,6BAAAA,CAAsB;QAC/C3B,MAAAA,EAAQ;YACN4B,WAAAA,EAAalC;AACf,SAAA;QACAI,KAAAA,EAAO;AACLH,YAAAA,UAAAA;AACAkC,YAAAA,MAAAA,EAAQ7B,OAAO6B,MAAM;AACrBC,YAAAA,MAAAA,EAAQ9B,OAAO8B;AACjB;AACF,KAAA,CAAA;AACA,IAAA,MAAMC,mBAAmBC,uBAAAA,CAAY;AACnCtC,QAAAA,KAAAA;AACAE,QAAAA,cAAAA;AACAD,QAAAA,UAAAA;AACAK,QAAAA;AACF,KAAA,CAAA;AACA,IAAA,MAAMiC,yBAAyBC,mCAAAA,CAAkBxC,KAAAA,CAAAA;AACjD,IAAA,MAAMyC,uBAAuBC,4BAAAA,CAAgB,aAAA,EAAe,CAACC,KAAAA,GAAUA,MAAMC,SAAS,CAAA;IAEtF,MAAMA,SAAAA,GACJZ,mBAAmBY,SAAS,IAAIL,uBAAuBK,SAAS,IAAIP,iBAAiBO,SAAS;IAChG,IACEH,oBAAAA,IACCG,SAAAA,KAAc,CAACP,gBAAAA,CAAiBQ,QAAQ,EAAE5C,UAAAA,IAAc+B,kBAAAA,CAAmBY,SAAQ,CAAA,EACpF;QACA,qBAAOE,cAAA,CAACC,iBAAKC,OAAO,EAAA,EAAA,CAAA;AACtB,IAAA;IAEA,MAAMC,aAAAA,GAAgBZ,iBAAiBa,oBAAoB,EAAA;AAE3D,IAAA,IACElB,mBAAmBmB,KAAK,IACxBZ,uBAAuBY,KAAK,IAC5B,CAACd,gBAAAA,CAAiBQ,QAAQ,IAC1B,CAACR,gBAAAA,CAAiBe,IAAI,IACtB,CAACf,iBAAiBgB,MAAM,IACxB,CAACJ,aAAAA,EACD;QACA,qBAAOH,cAAA,CAACC,iBAAK1F,KAAK,EAAA,EAAA,CAAA;AACpB,IAAA;AAEA,IAAA,IAAI,CAAC2E,kBAAAA,CAAmBX,IAAI,EAAEA,MAAMiC,GAAAA,EAAK;QACvC,qBAAOR,cAAA,CAACC,iBAAKQ,MAAM,EAAA,EAAA,CAAA;AACrB,IAAA;IAEA,MAAMC,aAAAA,GAAgBnB,iBAAiBoB,QAAQ,CAAClB,uBAAuBmB,IAAI,CAACC,QAAQ,CAACC,SAAS,CAAA;AAE9F,IAAA,MAAMC,aAAa7B,kBAAAA,CAAmBX,IAAI,CAACA,IAAI,CAACiC,GAAG;AAEnD,IAAA,MAAMQ,SAAAA,GAAY,IAAA;QAChBpF,SAAAA,EAAWW,OAAAA,EAASG,eAAeC,WAAAA,CACjC;YAAEC,IAAAA,EAAM;AAAe,SAAA;AAEvB,QAAA,IAAIE,IAAIlB,SAAAA,CAAUW,OAAO,CAACE,GAAG,EAAEzB,MAAM,CAAA;AAEzC,IAAA,CAAA;AAEA,IAAA,MAAMiG,qBAAqB9G,MAAAA,CAAOC,MAAM,CAAC8G,QAAQ,CAACC,SAAS,CAAC,sBAAA,CAAA;IAE5D,qBACEC,eAAA,CAAAC,mBAAA,EAAA;;AACE,0BAAArB,cAAA,CAACC,iBAAKqB,KAAK,EAAA;0BACR9F,aAAAA,CACC;oBACEjC,EAAAA,EAAI,oCAAA;oBACJC,cAAAA,EAAgB;iBAClB,EACA;oBACE4F,WAAAA,EAAasB;AACf,iBAAA;;0BAGJV,cAAA,CAACrG,eAAAA,EAAAA;gBACC6G,GAAAA,EAAKO,UAAAA;AACLhB,gBAAAA,QAAAA,EAAUR,iBAAiBQ,QAAQ;gBACnCwB,KAAAA,EAAOb,aAAAA;AACPJ,gBAAAA,IAAAA,EAAMf,iBAAiBe,IAAI;AAC3BC,gBAAAA,MAAAA,EAAQhB,iBAAiBgB,MAAM;AAC/BiB,gBAAAA,UAAAA,EAAYjC,iBAAiBiC,UAAU;AACvCC,gBAAAA,MAAAA,EAAQhC,uBAAuBmB,IAAI;gBACnCI,SAAAA,EAAWA,SAAAA;gBACXpF,SAAAA,EAAWA,SAAAA;gBACXM,YAAAA,EAAcA,YAAAA;gBACdC,eAAAA,EAAiBA,eAAAA;AAEjB,gBAAA,QAAA,gBAAA6D,cAAA,CAAC0B,gBAAAA,EAAAA;oBACCC,MAAAA,EAAO,KAAA;oBACPC,QAAAA,EACEtE,KAAAA,CAAMgC,MAAM,KAAK,WAAA,IACjBC,oBACAA,gBAAAA,CAAiBQ,QAAQ,CAACT,MAAM,KAAK,OAAA;AAEvCa,oBAAAA,aAAAA,EAAeZ,iBAAiBa,oBAAoB,EAAA;AACpDyB,oBAAAA,aAAAA,EACE9G,QAAAA,EAAU8E,KAAAA,EAAOiC,eAAAA,GACbC,gCAAAA,CAA2B5B,aAAAA,EAAe;AACxCI,wBAAAA,MAAAA,EAAQhB,iBAAiBgB,MAAM;AAC/BiB,wBAAAA,UAAAA,EAAYjC,iBAAiBiC;AAC/B,qBAAA,CAAA,GACA,EAAC;oBAEP9H,MAAAA,EAAO,MAAA;AACPsI,oBAAAA,QAAAA,EAAU,CAACC,MAAAA,EAAiCC,OAAAA,GAAAA;wBAC1C,MAAM,EAAE3D,MAAM4D,aAAa,EAAEC,iBAAiB,EAAE,GAAGC,+BAA0BJ,MAAAA,EAAQ;AACnF1B,4BAAAA,MAAAA,EAAQhB,iBAAiBgB,MAAM;AAC/BJ,4BAAAA,aAAAA;AACAqB,4BAAAA,UAAAA,EAAYjC,iBAAiBiC;AAC/B,yBAAA,CAAA;wBAEA,MAAMc,SAAAA,GAAYC,2BAChBhD,gBAAAA,CAAiBgB,MAAM,EAAEiC,UAAAA,EACzBjD,gBAAAA,CAAiBiC,UAAU,EAC3B;4BACElC,MAAAA,EAAQC,gBAAAA,CAAiBQ,QAAQ,EAAET,MAAAA;AACnC8C,4BAAAA,iBAAAA;AACA,4BAAA,GAAGF;AACL,yBAAA,CAAA;wBAGF,OAAOI,SAAAA,CAAUN,QAAQ,CAACG,aAAAA,EAAe;4BAAEM,UAAAA,EAAY;AAAM,yBAAA,CAAA;AAC/D,oBAAA,CAAA;AAEA,oBAAA,QAAA,gBAAArB,eAAA,CAACsB,iBAAAA,EAAAA;wBAAKC,SAAAA,EAAU,QAAA;wBAASjJ,MAAAA,EAAO,MAAA;wBAAOkJ,UAAAA,EAAW,SAAA;;0CAChD5C,cAAA,CAAC6C,eAAAA,EAAAA,EAAAA,CAAAA;0CACD7C,cAAA,CAAC8C,2BAAAA,EAAAA,EAAAA,CAAAA;0CACD9C,cAAA,CAAC+C,yBAAAA,EAAAA;gCAAaxD,gBAAAA,EAAkBA;;0CAChC6B,eAAA,CAACsB,iBAAAA,EAAAA;gCAAKM,IAAAA,EAAM,CAAA;gCAAGC,QAAAA,EAAS,MAAA;gCAAOL,UAAAA,EAAW,SAAA;;AACvC3B,oCAAAA,kBAAAA,kBACCjB,cAAA,CAACkD,gBAAAA,EAAAA;wCACCD,QAAAA,EAAS,MAAA;AACTxJ,wCAAAA,KAAAA,EAAOsC,mBAAmB,KAAA,GAAQ,CAAA;wCAClCoH,WAAAA,EAAY,WAAA;wCACZC,WAAAA,EAAY,YAAA;wCACZC,UAAAA,EAAY,CAAA;wCACZC,aAAAA,EAAe,CAAA;;AAEfC,wCAAAA,WAAAA,EAAaxH,mBAAmB,CAAA,GAAI,CAAA;AACpCyH,wCAAAA,YAAAA,EAAczH,mBAAmB,CAAA,GAAI,CAAA;wCACrC0H,UAAAA,EAAW,sBAAA;AAEX,wCAAA,QAAA,gBAAAzD,cAAA,CAAC0D,qBAAAA,EAAAA;4CACCjC,MAAAA,EAAQhC,sBAAAA,CAAuBmB,IAAI,CAACa,MAAM;4CAC1C1B,QAAAA,EAAUR,gBAAAA;4CACVoE,aAAAA,EAAe;;;kDAIrBvC,eAAA,CAACsB,iBAAAA,EAAAA;wCACCC,SAAAA,EAAU,QAAA;wCACVC,UAAAA,EAAW,SAAA;wCACXI,IAAAA,EAAM,CAAA;wCACNtJ,MAAAA,EAAO,MAAA;wCACPuJ,QAAAA,EAAS,QAAA;;0DAET7B,eAAA,CAACsB,iBAAAA,EAAAA;gDACCC,SAAAA,EAAU,KAAA;gDACViB,UAAAA,EAAW,UAAA;gDACXC,OAAAA,EAAS,CAAA;gDACTV,WAAAA,EAAY,WAAA;gDACZC,WAAAA,EAAY,YAAA;;AAEXnC,oDAAAA,kBAAAA,kBACCjB,cAAA,CAAC8D,uBAAAA,EAAAA;wDACCC,OAAAA,EAAQ,OAAA;AACRzK,wDAAAA,KAAAA,EAAOkC,cACLO,gBAAAA,GACI;4DACExC,EAAAA,EAAI,8CAAA;4DACJC,cAAAA,EAAgB;yDAClB,GACA;4DACED,EAAAA,EAAI,6CAAA;4DACJC,cAAAA,EAAgB;AAClB,yDAAA,CAAA;AAENwK,wDAAAA,OAAAA,EAAS,IAAMhI,mBAAAA,CAAoB,CAACM,IAAAA,GAAS,CAACA,IAAAA,CAAAA;AAE9C,wDAAA,QAAA,gBAAA0D,cAAA,CAAC/E,aAAAA,EAAAA;4DAAcI,iBAAAA,EAAmBU;;;kEAGtCiE,cAAA,CAAC0C,iBAAAA,EAAAA;wDAAKuB,cAAAA,EAAe,QAAA;wDAASjB,IAAAA,EAAM,CAAA;AAClC,wDAAA,QAAA,gBAAAhD,cAAA,CAACkE,yBAAAA,EAAAA;4DACCC,KAAAA,EAAOxG,UAAAA;AACPyG,4DAAAA,QAAAA,EAAU,CAAC/K,IAAAA,GAASuE,aAAAA,CAAcvE,IAAAA,CAAKgL,QAAQ,EAAA,CAAA;AAC/CC,4DAAAA,YAAAA,EAAY9I,aAAAA,CAAc;gEACxBjC,EAAAA,EAAI,uCAAA;gEACJC,cAAAA,EAAgB;AAClB,6DAAA,CAAA;AAECJ,4DAAAA,QAAAA,EAAAA,OAAAA,CAAQmL,GAAG,CAAC,CAACC,YAAAA,iBACZxE,cAAA,CAACyE,+BAAAA,EAAAA;AAA2CN,oEAAAA,KAAAA,EAAOK,aAAanL,IAAI;AACjEmC,oEAAAA,QAAAA,EAAAA,aAAAA,CAAcgJ,aAAalL,KAAK;AADVkL,iEAAAA,EAAAA,YAAAA,CAAanL,IAAI,CAAA;;;;;0DAOlD2G,cAAA,CAAC0C,iBAAAA,EAAAA;gDAAKC,SAAAA,EAAU,QAAA;gDAASsB,cAAAA,EAAe,QAAA;gDAASL,UAAAA,EAAW,UAAA;gDAAWZ,IAAAA,EAAM,CAAA;AAC3E,gDAAA,QAAA,gBAAAhD,cAAA,CAACkD,gBAAAA,EAAAA;oDACCwB,aAAAA,EAAY,gBAAA;oDACZC,GAAAA,EAAK/I,SAAAA;oDACLa,GAAAA,EAAKsE,UAAAA;AASLQ,oDAAAA,KAAAA,EAAO/F,aAAAA,CAAc;wDACnBjC,EAAAA,EAAI,qCAAA;wDACJC,cAAAA,EAAgB;AAClB,qDAAA,CAAA;AACAC,oDAAAA,KAAAA,EAAOoE,OAAOpE,KAAK;AACnBC,oDAAAA,MAAAA,EAAQmE,OAAOnE,MAAM;oDACrByJ,WAAAA,EAAa,CAAA;oDACbyB,GAAAA,EAAI;AARC7D,iDAAAA,EAAAA,UAAAA;;;;;;;;;;;;AAkBzB,CAAA;AAEA;;AAEkG,qGAElG,MAAM8D,wBAAAA,GAA2B,IAAA;AAC/B,IAAA,MAAM,EAAE5H,IAAAA,EAAMC,KAAK,EAAE,GAAGG,wBAAAA,EAAAA;IAGxB,MAAM,EACJyH,cAAc,EAAE,EAChBhF,SAAS,EACTO,KAAK,EACN,GAAG0E,mBAAAA,CAAQ;AACV,QAAA;YAAEC,MAAAA,EAAQ,uCAAA;YAAyCC,OAAAA,EAAS/H;AAAM,SAAA;AAClE,QAAA;YAAE8H,MAAAA,EAAQ,yCAAA;YAA2CC,OAAAA,EAAS/H;AAAM,SAAA;AACpE,QAAA;YAAE8H,MAAAA,EAAQ,0CAAA;YAA4CC,OAAAA,EAAS/H;AAAM;AACtE,KAAA,CAAA;AAED,IAAA,IAAI4C,SAAAA,EAAW;QACb,qBAAOE,cAAA,CAACC,iBAAKC,OAAO,EAAA,EAAA,CAAA;AACtB,IAAA;IAEA,IAAIG,KAAAA,IAAS,CAACnD,KAAAA,EAAO;AACnB,QAAA,qBACE8C,cAAA,CAACkD,gBAAAA,EAAAA;YACCxJ,MAAAA,EAAO,QAAA;YACPD,KAAAA,EAAM,QAAA;YACNyL,QAAAA,EAAS,OAAA;YACTC,GAAAA,EAAK,CAAA;YACLC,IAAAA,EAAM,CAAA;YACNC,MAAAA,EAAQ,CAAA;YACRzB,UAAAA,EAAW,UAAA;oCAEX5D,cAAA,CAACC,iBAAK1F,KAAK,EAAA,EAAA;;AAGjB,IAAA;AAEA,IAAA,qBACEyF,cAAA,CAACkD,gBAAAA,EAAAA;QACCxJ,MAAAA,EAAO,QAAA;QACPD,KAAAA,EAAM,QAAA;QACNyL,QAAAA,EAAS,OAAA;QACTC,GAAAA,EAAK,CAAA;QACLC,IAAAA,EAAM,CAAA;QACNC,MAAAA,EAAQ,CAAA;QACRzB,UAAAA,EAAW,UAAA;gCAEX5D,cAAA,CAACC,iBAAKqF,OAAO,EAAA;YACXR,WAAAA,EAAaA,WAAAA,CAAYS,MAAM,CAAC,CAACC,aAC/BA,UAAAA,CAAWR,MAAM,CAACS,QAAQ,CAAC,eAAA,CAAA,CAAA;AAG7B,YAAA,QAAA,gBAAAzF,cAAA,CAAC0F,yBAAAA,EAAAA;gBAAaZ,WAAAA,EAAaA,WAAAA;AACzB,gBAAA,QAAA,gBAAA9E,cAAA,CAAC1E,WAAAA,EAAAA,EAAAA;;;;AAKX,CAAA;AAEA,MAAMqK,oBAAAA,GAAuB,IAAA;AAC3B,IAAA,qBACE3F,cAAA,CAAC4F,mBAAAA,EAAAA;AACC,QAAA,QAAA,gBAAA5F,cAAA,CAAC6F,sBAAAA,EAAAA;AACC,YAAA,QAAA,gBAAA7F,cAAA,CAAC6E,wBAAAA,EAAAA,EAAAA;;;AAIT;;;;;"}
|
|
@@ -13,6 +13,7 @@ import { useDocumentLayout } from '../../hooks/useDocumentLayout.mjs';
|
|
|
13
13
|
import { Blocker } from '../../pages/EditView/components/Blocker.mjs';
|
|
14
14
|
import { FormLayout } from '../../pages/EditView/components/FormLayout.mjs';
|
|
15
15
|
import { handleInvisibleAttributes } from '../../pages/EditView/utils/data.mjs';
|
|
16
|
+
import { getPublishValidationErrors } from '../../pages/EditView/utils/forms.mjs';
|
|
16
17
|
import { buildValidParams } from '../../utils/api.mjs';
|
|
17
18
|
import { createYupSchema } from '../../utils/validation.mjs';
|
|
18
19
|
import { InputPopover } from '../components/InputPopover.mjs';
|
|
@@ -190,21 +191,6 @@ const PreviewPage = ()=>{
|
|
|
190
191
|
return /*#__PURE__*/ jsx(Page.NoData, {});
|
|
191
192
|
}
|
|
192
193
|
const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);
|
|
193
|
-
const validateSync = (values, options)=>{
|
|
194
|
-
const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {
|
|
195
|
-
schema: documentResponse.schema,
|
|
196
|
-
initialValues,
|
|
197
|
-
components: documentResponse.components
|
|
198
|
-
});
|
|
199
|
-
const yupSchema = createYupSchema(documentResponse.schema?.attributes, documentResponse.components, {
|
|
200
|
-
status: documentResponse.document?.status,
|
|
201
|
-
removedAttributes,
|
|
202
|
-
...options
|
|
203
|
-
});
|
|
204
|
-
return yupSchema.validateSync(cleanedValues, {
|
|
205
|
-
abortEarly: false
|
|
206
|
-
});
|
|
207
|
-
};
|
|
208
194
|
const previewUrl = previewUrlResponse.data.data.url;
|
|
209
195
|
const onPreview = ()=>{
|
|
210
196
|
iframeRef?.current?.contentWindow?.postMessage({
|
|
@@ -239,7 +225,10 @@ const PreviewPage = ()=>{
|
|
|
239
225
|
method: "PUT",
|
|
240
226
|
disabled: query.status === 'published' && documentResponse && documentResponse.document.status !== 'draft',
|
|
241
227
|
initialValues: documentResponse.getInitialFormValues(),
|
|
242
|
-
initialErrors: location?.state?.forceValidation ?
|
|
228
|
+
initialErrors: location?.state?.forceValidation ? getPublishValidationErrors(initialValues, {
|
|
229
|
+
schema: documentResponse.schema,
|
|
230
|
+
components: documentResponse.components
|
|
231
|
+
}) : {},
|
|
243
232
|
height: "100%",
|
|
244
233
|
validate: (values, options)=>{
|
|
245
234
|
const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {
|
|
@@ -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, useDocumentRBAC } 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 const isLoadingActionsRBAC = useDocumentRBAC('PreviewPage', (state) => state.isLoading);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (\n isLoadingActionsRBAC ||\n (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading))\n ) {\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","isLoadingActionsRBAC","useDocumentRBAC","state","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","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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"}
|
|
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, useDocumentRBAC } 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 { getPublishValidationErrors } from '../../pages/EditView/utils/forms';\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 const isLoadingActionsRBAC = useDocumentRBAC('PreviewPage', (state) => state.isLoading);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (\n isLoadingActionsRBAC ||\n (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading))\n ) {\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 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={\n location?.state?.forceValidation\n ? getPublishValidationErrors(initialValues, {\n schema: documentResponse.schema,\n components: documentResponse.components,\n })\n : {}\n }\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","isLoadingActionsRBAC","useDocumentRBAC","state","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","url","NoData","documentTitle","getTitle","edit","settings","mainField","previewUrl","onPreview","hasAdvancedPreview","features","isEnabled","_jsxs","_Fragment","Title","title","components","layout","FormContext","method","disabled","initialErrors","forceValidation","getPublishValidationErrors","validate","values","options","cleanedValues","removedAttributes","handleInvisibleAttributes","yupSchema","createYupSchema","attributes","abortEarly","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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"}
|
|
@@ -37,6 +37,7 @@ const parsePathWithIndices = (path)=>{
|
|
|
37
37
|
return acc;
|
|
38
38
|
}, []);
|
|
39
39
|
};
|
|
40
|
+
const getComponentLevelFromPath = (path)=>parsePathWithIndices(path).length > 1 ? 0 : -1;
|
|
40
41
|
function getAttributeSchemaFromPath({ path, schema, components, document }) {
|
|
41
42
|
/**
|
|
42
43
|
* Create the function that will be recursively called.
|
|
@@ -102,6 +103,7 @@ function parseFieldMetaData(strapiSource) {
|
|
|
102
103
|
|
|
103
104
|
exports.PreviewFieldError = PreviewFieldError;
|
|
104
105
|
exports.getAttributeSchemaFromPath = getAttributeSchemaFromPath;
|
|
106
|
+
exports.getComponentLevelFromPath = getComponentLevelFromPath;
|
|
105
107
|
exports.parseFieldMetaData = parseFieldMetaData;
|
|
106
108
|
exports.parsePathWithIndices = parsePathWithIndices;
|
|
107
109
|
//# sourceMappingURL=fieldUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fieldUtils.js","sources":["../../../../admin/src/preview/utils/fieldUtils.ts"],"sourcesContent":["import { type FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nimport type { PREVIEW_ERROR_MESSAGES } from './constants';\nimport type { PreviewContextValue } from '../pages/Preview';\nimport type { Modules, Schema, Struct, UID } from '@strapi/types';\n\ntype PreviewErrorMessage = keyof typeof PREVIEW_ERROR_MESSAGES;\ntype FieldData = Record<string, unknown>;\n\n// Generic error class for preview field operations\nexport class PreviewFieldError extends Error {\n public readonly messageKey: PreviewErrorMessage;\n\n constructor(messageKey: PreviewErrorMessage) {\n super(messageKey);\n this.name = 'PreviewFieldError';\n this.messageKey = messageKey;\n }\n}\n\ntype PathPart = { name: string; index?: number };\n\n// Helper function to parse path with array indices and return clean attribute names\nexport const parsePathWithIndices = (path: string): PathPart[] => {\n // Split by dots, then parse array indices from each part. For example:\n // input \"components.4.field.relations.2.name\"\n // output [{name: \"components\", index: 4}, {name: \"field\"}, {name: \"relations\", index: 2}, {name: \"name\"}]\n return path\n .split('.')\n .map((part) => {\n const numericIndex = parseInt(part, 10);\n if (!isNaN(numericIndex) && part === numericIndex.toString()) {\n // This part is a pure numeric index, return it as an index for the previous part\n return { name: '', index: numericIndex };\n }\n return { name: part };\n })\n .reduce((acc: PathPart[], part) => {\n if (part.name === '' && part.index !== undefined) {\n // This is an index, attach it to the previous part\n if (acc.length > 0) {\n acc[acc.length - 1].index = part.index;\n }\n } else {\n acc.push(part);\n }\n return acc;\n }, []);\n};\n\nexport function getAttributeSchemaFromPath({\n path,\n schema,\n components,\n document,\n}: {\n path: string;\n schema: PreviewContextValue['schema'] | PreviewContextValue['components'][string];\n components: PreviewContextValue['components'];\n document: Modules.Documents.AnyDocument;\n}): Schema.Attribute.AnyAttribute {\n /**\n * Create the function that will be recursively called.\n * We don't do recursion on getAttributeSchemaFromPath itself because:\n * - it takes a path string, not the parsed array that's better for recursion\n * - even when several levels deep, we still need access to the root schema and components\n */\n const visitor = (\n currentPathParts: PathPart[],\n currentAttributes: Schema.Attributes,\n currentData: FieldData\n ): Schema.Attribute.AnyAttribute => {\n const [currentPart, ...remainingParts] = currentPathParts;\n\n // Get the data and schema for the current path\n const currentAttribute = currentAttributes[currentPart.name];\n\n if (!currentAttribute) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n if (currentAttribute.type === 'relation') {\n throw new PreviewFieldError('RELATIONS_NOT_HANDLED');\n }\n\n if (currentAttribute.type === 'component') {\n const componentAttributes = components[currentAttribute.component].attributes;\n if (currentAttribute.repeatable) {\n // We must have the index, otherwise we don't know what data to use\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n return visitor(\n remainingParts,\n componentAttributes,\n (currentData[currentPart.name] as FieldData[])[currentPart.index]\n );\n }\n\n // Non repeatable component\n return visitor(\n remainingParts,\n componentAttributes,\n currentData[currentPart.name] as FieldData\n );\n }\n\n if (currentAttribute.type === 'dynamiczone') {\n // We must have the index, otherwise we don't know what component we're dealing with\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n const componentData = (currentData[currentPart.name] as FieldData[])[currentPart.index];\n const componentAttributes = components[componentData.__component as UID.Component].attributes;\n return visitor(remainingParts, componentAttributes, componentData);\n }\n\n // Plain regular field. It ends the recursion\n return currentAttributes[currentPart.name];\n };\n\n return visitor(parsePathWithIndices(path), schema.attributes, document as FieldData);\n}\n\nexport function parseFieldMetaData(strapiSource: string): FieldContentSourceMap | null {\n const searchParams = new URLSearchParams(strapiSource);\n const path = searchParams.get('path');\n const type = searchParams.get('type');\n const documentId = searchParams.get('documentId');\n const locale = searchParams.get('locale');\n const model = searchParams.get('model');\n const kind = searchParams.get('kind');\n\n if (!path || !type || !documentId || !model) {\n return null;\n }\n\n return {\n path,\n type: type as Schema.Attribute.AnyAttribute['type'],\n documentId,\n locale: locale ?? null,\n model: model as UID.Schema | undefined,\n kind: kind ? (kind as Struct.ContentTypeKind) : undefined,\n };\n}\n"],"names":["PreviewFieldError","Error","messageKey","name","parsePathWithIndices","path","split","map","part","numericIndex","parseInt","isNaN","toString","index","reduce","acc","undefined","length","push","getAttributeSchemaFromPath","schema","components","document","visitor","currentPathParts","currentAttributes","currentData","currentPart","remainingParts","currentAttribute","type","componentAttributes","component","attributes","repeatable","componentData","__component","parseFieldMetaData","strapiSource","searchParams","URLSearchParams","get","documentId","locale","model","kind"],"mappings":";;AASA;AACO,MAAMA,iBAAAA,SAA0BC,KAAAA,CAAAA;AAGrC,IAAA,WAAA,CAAYC,UAA+B,CAAE;AAC3C,QAAA,KAAK,CAACA,UAAAA,CAAAA;QACN,IAAI,CAACC,IAAI,GAAG,mBAAA;QACZ,IAAI,CAACD,UAAU,GAAGA,UAAAA;AACpB,IAAA;AACF;AAIA;AACO,MAAME,uBAAuB,CAACC,IAAAA,GAAAA;;;;AAInC,IAAA,OAAOA,KACJC,KAAK,CAAC,GAAA,CAAA,CACNC,GAAG,CAAC,CAACC,IAAAA,GAAAA;QACJ,MAAMC,YAAAA,GAAeC,SAASF,IAAAA,EAAM,EAAA,CAAA;AACpC,QAAA,IAAI,CAACG,KAAAA,CAAMF,YAAAA,CAAAA,IAAiBD,IAAAA,KAASC,YAAAA,CAAaG,QAAQ,EAAA,EAAI;;YAE5D,OAAO;gBAAET,IAAAA,EAAM,EAAA;gBAAIU,KAAAA,EAAOJ;AAAa,aAAA;AACzC,QAAA;QACA,OAAO;YAAEN,IAAAA,EAAMK;AAAK,SAAA;IACtB,CAAA,CAAA,CACCM,MAAM,CAAC,CAACC,GAAAA,EAAiBP,IAAAA,GAAAA;AACxB,QAAA,IAAIA,KAAKL,IAAI,KAAK,MAAMK,IAAAA,CAAKK,KAAK,KAAKG,SAAAA,EAAW;;YAEhD,IAAID,GAAAA,CAAIE,MAAM,GAAG,CAAA,EAAG;gBAClBF,GAAG,CAACA,IAAIE,MAAM,GAAG,EAAE,CAACJ,KAAK,GAAGL,IAAAA,CAAKK,KAAK;AACxC,YAAA;QACF,CAAA,MAAO;AACLE,YAAAA,GAAAA,CAAIG,IAAI,CAACV,IAAAA,CAAAA;AACX,QAAA;QACA,OAAOO,GAAAA;AACT,IAAA,CAAA,EAAG,EAAE,CAAA;AACT;AAEO,
|
|
1
|
+
{"version":3,"file":"fieldUtils.js","sources":["../../../../admin/src/preview/utils/fieldUtils.ts"],"sourcesContent":["import { type FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nimport type { PREVIEW_ERROR_MESSAGES } from './constants';\nimport type { PreviewContextValue } from '../pages/Preview';\nimport type { Modules, Schema, Struct, UID } from '@strapi/types';\n\ntype PreviewErrorMessage = keyof typeof PREVIEW_ERROR_MESSAGES;\ntype FieldData = Record<string, unknown>;\n\n// Generic error class for preview field operations\nexport class PreviewFieldError extends Error {\n public readonly messageKey: PreviewErrorMessage;\n\n constructor(messageKey: PreviewErrorMessage) {\n super(messageKey);\n this.name = 'PreviewFieldError';\n this.messageKey = messageKey;\n }\n}\n\ntype PathPart = { name: string; index?: number };\n\n// Helper function to parse path with array indices and return clean attribute names\nexport const parsePathWithIndices = (path: string): PathPart[] => {\n // Split by dots, then parse array indices from each part. For example:\n // input \"components.4.field.relations.2.name\"\n // output [{name: \"components\", index: 4}, {name: \"field\"}, {name: \"relations\", index: 2}, {name: \"name\"}]\n return path\n .split('.')\n .map((part) => {\n const numericIndex = parseInt(part, 10);\n if (!isNaN(numericIndex) && part === numericIndex.toString()) {\n // This part is a pure numeric index, return it as an index for the previous part\n return { name: '', index: numericIndex };\n }\n return { name: part };\n })\n .reduce((acc: PathPart[], part) => {\n if (part.name === '' && part.index !== undefined) {\n // This is an index, attach it to the previous part\n if (acc.length > 0) {\n acc[acc.length - 1].index = part.index;\n }\n } else {\n acc.push(part);\n }\n return acc;\n }, []);\n};\n\nexport const getComponentLevelFromPath = (path: string) =>\n parsePathWithIndices(path).length > 1 ? 0 : -1;\n\nexport function getAttributeSchemaFromPath({\n path,\n schema,\n components,\n document,\n}: {\n path: string;\n schema: PreviewContextValue['schema'] | PreviewContextValue['components'][string];\n components: PreviewContextValue['components'];\n document: Modules.Documents.AnyDocument;\n}): Schema.Attribute.AnyAttribute {\n /**\n * Create the function that will be recursively called.\n * We don't do recursion on getAttributeSchemaFromPath itself because:\n * - it takes a path string, not the parsed array that's better for recursion\n * - even when several levels deep, we still need access to the root schema and components\n */\n const visitor = (\n currentPathParts: PathPart[],\n currentAttributes: Schema.Attributes,\n currentData: FieldData\n ): Schema.Attribute.AnyAttribute => {\n const [currentPart, ...remainingParts] = currentPathParts;\n\n // Get the data and schema for the current path\n const currentAttribute = currentAttributes[currentPart.name];\n\n if (!currentAttribute) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n if (currentAttribute.type === 'relation') {\n throw new PreviewFieldError('RELATIONS_NOT_HANDLED');\n }\n\n if (currentAttribute.type === 'component') {\n const componentAttributes = components[currentAttribute.component].attributes;\n if (currentAttribute.repeatable) {\n // We must have the index, otherwise we don't know what data to use\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n return visitor(\n remainingParts,\n componentAttributes,\n (currentData[currentPart.name] as FieldData[])[currentPart.index]\n );\n }\n\n // Non repeatable component\n return visitor(\n remainingParts,\n componentAttributes,\n currentData[currentPart.name] as FieldData\n );\n }\n\n if (currentAttribute.type === 'dynamiczone') {\n // We must have the index, otherwise we don't know what component we're dealing with\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n const componentData = (currentData[currentPart.name] as FieldData[])[currentPart.index];\n const componentAttributes = components[componentData.__component as UID.Component].attributes;\n return visitor(remainingParts, componentAttributes, componentData);\n }\n\n // Plain regular field. It ends the recursion\n return currentAttributes[currentPart.name];\n };\n\n return visitor(parsePathWithIndices(path), schema.attributes, document as FieldData);\n}\n\nexport function parseFieldMetaData(strapiSource: string): FieldContentSourceMap | null {\n const searchParams = new URLSearchParams(strapiSource);\n const path = searchParams.get('path');\n const type = searchParams.get('type');\n const documentId = searchParams.get('documentId');\n const locale = searchParams.get('locale');\n const model = searchParams.get('model');\n const kind = searchParams.get('kind');\n\n if (!path || !type || !documentId || !model) {\n return null;\n }\n\n return {\n path,\n type: type as Schema.Attribute.AnyAttribute['type'],\n documentId,\n locale: locale ?? null,\n model: model as UID.Schema | undefined,\n kind: kind ? (kind as Struct.ContentTypeKind) : undefined,\n };\n}\n"],"names":["PreviewFieldError","Error","messageKey","name","parsePathWithIndices","path","split","map","part","numericIndex","parseInt","isNaN","toString","index","reduce","acc","undefined","length","push","getComponentLevelFromPath","getAttributeSchemaFromPath","schema","components","document","visitor","currentPathParts","currentAttributes","currentData","currentPart","remainingParts","currentAttribute","type","componentAttributes","component","attributes","repeatable","componentData","__component","parseFieldMetaData","strapiSource","searchParams","URLSearchParams","get","documentId","locale","model","kind"],"mappings":"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"}
|
|
@@ -35,6 +35,7 @@ const parsePathWithIndices = (path)=>{
|
|
|
35
35
|
return acc;
|
|
36
36
|
}, []);
|
|
37
37
|
};
|
|
38
|
+
const getComponentLevelFromPath = (path)=>parsePathWithIndices(path).length > 1 ? 0 : -1;
|
|
38
39
|
function getAttributeSchemaFromPath({ path, schema, components, document }) {
|
|
39
40
|
/**
|
|
40
41
|
* Create the function that will be recursively called.
|
|
@@ -98,5 +99,5 @@ function parseFieldMetaData(strapiSource) {
|
|
|
98
99
|
};
|
|
99
100
|
}
|
|
100
101
|
|
|
101
|
-
export { PreviewFieldError, getAttributeSchemaFromPath, parseFieldMetaData, parsePathWithIndices };
|
|
102
|
+
export { PreviewFieldError, getAttributeSchemaFromPath, getComponentLevelFromPath, parseFieldMetaData, parsePathWithIndices };
|
|
102
103
|
//# sourceMappingURL=fieldUtils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fieldUtils.mjs","sources":["../../../../admin/src/preview/utils/fieldUtils.ts"],"sourcesContent":["import { type FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nimport type { PREVIEW_ERROR_MESSAGES } from './constants';\nimport type { PreviewContextValue } from '../pages/Preview';\nimport type { Modules, Schema, Struct, UID } from '@strapi/types';\n\ntype PreviewErrorMessage = keyof typeof PREVIEW_ERROR_MESSAGES;\ntype FieldData = Record<string, unknown>;\n\n// Generic error class for preview field operations\nexport class PreviewFieldError extends Error {\n public readonly messageKey: PreviewErrorMessage;\n\n constructor(messageKey: PreviewErrorMessage) {\n super(messageKey);\n this.name = 'PreviewFieldError';\n this.messageKey = messageKey;\n }\n}\n\ntype PathPart = { name: string; index?: number };\n\n// Helper function to parse path with array indices and return clean attribute names\nexport const parsePathWithIndices = (path: string): PathPart[] => {\n // Split by dots, then parse array indices from each part. For example:\n // input \"components.4.field.relations.2.name\"\n // output [{name: \"components\", index: 4}, {name: \"field\"}, {name: \"relations\", index: 2}, {name: \"name\"}]\n return path\n .split('.')\n .map((part) => {\n const numericIndex = parseInt(part, 10);\n if (!isNaN(numericIndex) && part === numericIndex.toString()) {\n // This part is a pure numeric index, return it as an index for the previous part\n return { name: '', index: numericIndex };\n }\n return { name: part };\n })\n .reduce((acc: PathPart[], part) => {\n if (part.name === '' && part.index !== undefined) {\n // This is an index, attach it to the previous part\n if (acc.length > 0) {\n acc[acc.length - 1].index = part.index;\n }\n } else {\n acc.push(part);\n }\n return acc;\n }, []);\n};\n\nexport function getAttributeSchemaFromPath({\n path,\n schema,\n components,\n document,\n}: {\n path: string;\n schema: PreviewContextValue['schema'] | PreviewContextValue['components'][string];\n components: PreviewContextValue['components'];\n document: Modules.Documents.AnyDocument;\n}): Schema.Attribute.AnyAttribute {\n /**\n * Create the function that will be recursively called.\n * We don't do recursion on getAttributeSchemaFromPath itself because:\n * - it takes a path string, not the parsed array that's better for recursion\n * - even when several levels deep, we still need access to the root schema and components\n */\n const visitor = (\n currentPathParts: PathPart[],\n currentAttributes: Schema.Attributes,\n currentData: FieldData\n ): Schema.Attribute.AnyAttribute => {\n const [currentPart, ...remainingParts] = currentPathParts;\n\n // Get the data and schema for the current path\n const currentAttribute = currentAttributes[currentPart.name];\n\n if (!currentAttribute) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n if (currentAttribute.type === 'relation') {\n throw new PreviewFieldError('RELATIONS_NOT_HANDLED');\n }\n\n if (currentAttribute.type === 'component') {\n const componentAttributes = components[currentAttribute.component].attributes;\n if (currentAttribute.repeatable) {\n // We must have the index, otherwise we don't know what data to use\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n return visitor(\n remainingParts,\n componentAttributes,\n (currentData[currentPart.name] as FieldData[])[currentPart.index]\n );\n }\n\n // Non repeatable component\n return visitor(\n remainingParts,\n componentAttributes,\n currentData[currentPart.name] as FieldData\n );\n }\n\n if (currentAttribute.type === 'dynamiczone') {\n // We must have the index, otherwise we don't know what component we're dealing with\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n const componentData = (currentData[currentPart.name] as FieldData[])[currentPart.index];\n const componentAttributes = components[componentData.__component as UID.Component].attributes;\n return visitor(remainingParts, componentAttributes, componentData);\n }\n\n // Plain regular field. It ends the recursion\n return currentAttributes[currentPart.name];\n };\n\n return visitor(parsePathWithIndices(path), schema.attributes, document as FieldData);\n}\n\nexport function parseFieldMetaData(strapiSource: string): FieldContentSourceMap | null {\n const searchParams = new URLSearchParams(strapiSource);\n const path = searchParams.get('path');\n const type = searchParams.get('type');\n const documentId = searchParams.get('documentId');\n const locale = searchParams.get('locale');\n const model = searchParams.get('model');\n const kind = searchParams.get('kind');\n\n if (!path || !type || !documentId || !model) {\n return null;\n }\n\n return {\n path,\n type: type as Schema.Attribute.AnyAttribute['type'],\n documentId,\n locale: locale ?? null,\n model: model as UID.Schema | undefined,\n kind: kind ? (kind as Struct.ContentTypeKind) : undefined,\n };\n}\n"],"names":["PreviewFieldError","Error","messageKey","name","parsePathWithIndices","path","split","map","part","numericIndex","parseInt","isNaN","toString","index","reduce","acc","undefined","length","push","getAttributeSchemaFromPath","schema","components","document","visitor","currentPathParts","currentAttributes","currentData","currentPart","remainingParts","currentAttribute","type","componentAttributes","component","attributes","repeatable","componentData","__component","parseFieldMetaData","strapiSource","searchParams","URLSearchParams","get","documentId","locale","model","kind"],"mappings":"AASA;AACO,MAAMA,iBAAAA,SAA0BC,KAAAA,CAAAA;AAGrC,IAAA,WAAA,CAAYC,UAA+B,CAAE;AAC3C,QAAA,KAAK,CAACA,UAAAA,CAAAA;QACN,IAAI,CAACC,IAAI,GAAG,mBAAA;QACZ,IAAI,CAACD,UAAU,GAAGA,UAAAA;AACpB,IAAA;AACF;AAIA;AACO,MAAME,uBAAuB,CAACC,IAAAA,GAAAA;;;;AAInC,IAAA,OAAOA,KACJC,KAAK,CAAC,GAAA,CAAA,CACNC,GAAG,CAAC,CAACC,IAAAA,GAAAA;QACJ,MAAMC,YAAAA,GAAeC,SAASF,IAAAA,EAAM,EAAA,CAAA;AACpC,QAAA,IAAI,CAACG,KAAAA,CAAMF,YAAAA,CAAAA,IAAiBD,IAAAA,KAASC,YAAAA,CAAaG,QAAQ,EAAA,EAAI;;YAE5D,OAAO;gBAAET,IAAAA,EAAM,EAAA;gBAAIU,KAAAA,EAAOJ;AAAa,aAAA;AACzC,QAAA;QACA,OAAO;YAAEN,IAAAA,EAAMK;AAAK,SAAA;IACtB,CAAA,CAAA,CACCM,MAAM,CAAC,CAACC,GAAAA,EAAiBP,IAAAA,GAAAA;AACxB,QAAA,IAAIA,KAAKL,IAAI,KAAK,MAAMK,IAAAA,CAAKK,KAAK,KAAKG,SAAAA,EAAW;;YAEhD,IAAID,GAAAA,CAAIE,MAAM,GAAG,CAAA,EAAG;gBAClBF,GAAG,CAACA,IAAIE,MAAM,GAAG,EAAE,CAACJ,KAAK,GAAGL,IAAAA,CAAKK,KAAK;AACxC,YAAA;QACF,CAAA,MAAO;AACLE,YAAAA,GAAAA,CAAIG,IAAI,CAACV,IAAAA,CAAAA;AACX,QAAA;QACA,OAAOO,GAAAA;AACT,IAAA,CAAA,EAAG,EAAE,CAAA;AACT;AAEO,
|
|
1
|
+
{"version":3,"file":"fieldUtils.mjs","sources":["../../../../admin/src/preview/utils/fieldUtils.ts"],"sourcesContent":["import { type FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nimport type { PREVIEW_ERROR_MESSAGES } from './constants';\nimport type { PreviewContextValue } from '../pages/Preview';\nimport type { Modules, Schema, Struct, UID } from '@strapi/types';\n\ntype PreviewErrorMessage = keyof typeof PREVIEW_ERROR_MESSAGES;\ntype FieldData = Record<string, unknown>;\n\n// Generic error class for preview field operations\nexport class PreviewFieldError extends Error {\n public readonly messageKey: PreviewErrorMessage;\n\n constructor(messageKey: PreviewErrorMessage) {\n super(messageKey);\n this.name = 'PreviewFieldError';\n this.messageKey = messageKey;\n }\n}\n\ntype PathPart = { name: string; index?: number };\n\n// Helper function to parse path with array indices and return clean attribute names\nexport const parsePathWithIndices = (path: string): PathPart[] => {\n // Split by dots, then parse array indices from each part. For example:\n // input \"components.4.field.relations.2.name\"\n // output [{name: \"components\", index: 4}, {name: \"field\"}, {name: \"relations\", index: 2}, {name: \"name\"}]\n return path\n .split('.')\n .map((part) => {\n const numericIndex = parseInt(part, 10);\n if (!isNaN(numericIndex) && part === numericIndex.toString()) {\n // This part is a pure numeric index, return it as an index for the previous part\n return { name: '', index: numericIndex };\n }\n return { name: part };\n })\n .reduce((acc: PathPart[], part) => {\n if (part.name === '' && part.index !== undefined) {\n // This is an index, attach it to the previous part\n if (acc.length > 0) {\n acc[acc.length - 1].index = part.index;\n }\n } else {\n acc.push(part);\n }\n return acc;\n }, []);\n};\n\nexport const getComponentLevelFromPath = (path: string) =>\n parsePathWithIndices(path).length > 1 ? 0 : -1;\n\nexport function getAttributeSchemaFromPath({\n path,\n schema,\n components,\n document,\n}: {\n path: string;\n schema: PreviewContextValue['schema'] | PreviewContextValue['components'][string];\n components: PreviewContextValue['components'];\n document: Modules.Documents.AnyDocument;\n}): Schema.Attribute.AnyAttribute {\n /**\n * Create the function that will be recursively called.\n * We don't do recursion on getAttributeSchemaFromPath itself because:\n * - it takes a path string, not the parsed array that's better for recursion\n * - even when several levels deep, we still need access to the root schema and components\n */\n const visitor = (\n currentPathParts: PathPart[],\n currentAttributes: Schema.Attributes,\n currentData: FieldData\n ): Schema.Attribute.AnyAttribute => {\n const [currentPart, ...remainingParts] = currentPathParts;\n\n // Get the data and schema for the current path\n const currentAttribute = currentAttributes[currentPart.name];\n\n if (!currentAttribute) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n if (currentAttribute.type === 'relation') {\n throw new PreviewFieldError('RELATIONS_NOT_HANDLED');\n }\n\n if (currentAttribute.type === 'component') {\n const componentAttributes = components[currentAttribute.component].attributes;\n if (currentAttribute.repeatable) {\n // We must have the index, otherwise we don't know what data to use\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n return visitor(\n remainingParts,\n componentAttributes,\n (currentData[currentPart.name] as FieldData[])[currentPart.index]\n );\n }\n\n // Non repeatable component\n return visitor(\n remainingParts,\n componentAttributes,\n currentData[currentPart.name] as FieldData\n );\n }\n\n if (currentAttribute.type === 'dynamiczone') {\n // We must have the index, otherwise we don't know what component we're dealing with\n if (currentPart.index === undefined) {\n throw new PreviewFieldError('INVALID_FIELD_PATH');\n }\n\n const componentData = (currentData[currentPart.name] as FieldData[])[currentPart.index];\n const componentAttributes = components[componentData.__component as UID.Component].attributes;\n return visitor(remainingParts, componentAttributes, componentData);\n }\n\n // Plain regular field. It ends the recursion\n return currentAttributes[currentPart.name];\n };\n\n return visitor(parsePathWithIndices(path), schema.attributes, document as FieldData);\n}\n\nexport function parseFieldMetaData(strapiSource: string): FieldContentSourceMap | null {\n const searchParams = new URLSearchParams(strapiSource);\n const path = searchParams.get('path');\n const type = searchParams.get('type');\n const documentId = searchParams.get('documentId');\n const locale = searchParams.get('locale');\n const model = searchParams.get('model');\n const kind = searchParams.get('kind');\n\n if (!path || !type || !documentId || !model) {\n return null;\n }\n\n return {\n path,\n type: type as Schema.Attribute.AnyAttribute['type'],\n documentId,\n locale: locale ?? null,\n model: model as UID.Schema | undefined,\n kind: kind ? (kind as Struct.ContentTypeKind) : undefined,\n };\n}\n"],"names":["PreviewFieldError","Error","messageKey","name","parsePathWithIndices","path","split","map","part","numericIndex","parseInt","isNaN","toString","index","reduce","acc","undefined","length","push","getComponentLevelFromPath","getAttributeSchemaFromPath","schema","components","document","visitor","currentPathParts","currentAttributes","currentData","currentPart","remainingParts","currentAttribute","type","componentAttributes","component","attributes","repeatable","componentData","__component","parseFieldMetaData","strapiSource","searchParams","URLSearchParams","get","documentId","locale","model","kind"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sources":["../../../admin/src/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nconst contentManagerApi = adminApi.enhanceEndpoints({\n addTagTypes: [\n 'ComponentConfiguration',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'Document',\n 'InitialData',\n 'HistoryVersion',\n 'Relations',\n 'UidAvailability',\n 'RecentDocumentList',\n 'GuidedTourMeta',\n 'CountDocuments',\n 'UpcomingReleasesList',\n 'AILocalizationJobs',\n ],\n});\n\nexport { contentManagerApi };\n"],"names":["contentManagerApi","adminApi","enhanceEndpoints","addTagTypes"],"mappings":";;;;AAEA,MAAMA,iBAAAA,GAAoBC,oBAAAA,CAASC,gBAAgB,CAAC;IAClDC,WAAAA,EAAa;AACX,QAAA,wBAAA;AACA,QAAA,2BAAA;AACA,QAAA,qBAAA;AACA,QAAA,UAAA;AACA,QAAA,aAAA;AACA,QAAA,gBAAA;AACA,QAAA,WAAA;AACA,QAAA,iBAAA;AACA,QAAA,oBAAA;AACA,QAAA,gBAAA;AACA,QAAA,gBAAA;AACA,QAAA,sBAAA;AACA,QAAA;AACD;AACH,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"api.js","sources":["../../../admin/src/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nconst contentManagerApi = adminApi.enhanceEndpoints({\n addTagTypes: [\n 'ComponentConfiguration',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'Document',\n 'InitialData',\n 'HistoryVersion',\n 'Relations',\n 'UidAvailability',\n 'RecentDocumentList',\n 'GuidedTourMeta',\n 'CountDocuments',\n 'UpcomingReleasesList',\n 'AILocalizationJobs',\n 'Locale',\n ],\n});\n\nexport { contentManagerApi };\n"],"names":["contentManagerApi","adminApi","enhanceEndpoints","addTagTypes"],"mappings":";;;;AAEA,MAAMA,iBAAAA,GAAoBC,oBAAAA,CAASC,gBAAgB,CAAC;IAClDC,WAAAA,EAAa;AACX,QAAA,wBAAA;AACA,QAAA,2BAAA;AACA,QAAA,qBAAA;AACA,QAAA,UAAA;AACA,QAAA,aAAA;AACA,QAAA,gBAAA;AACA,QAAA,WAAA;AACA,QAAA,iBAAA;AACA,QAAA,oBAAA;AACA,QAAA,gBAAA;AACA,QAAA,gBAAA;AACA,QAAA,sBAAA;AACA,QAAA,oBAAA;AACA,QAAA;AACD;AACH,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.mjs","sources":["../../../admin/src/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nconst contentManagerApi = adminApi.enhanceEndpoints({\n addTagTypes: [\n 'ComponentConfiguration',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'Document',\n 'InitialData',\n 'HistoryVersion',\n 'Relations',\n 'UidAvailability',\n 'RecentDocumentList',\n 'GuidedTourMeta',\n 'CountDocuments',\n 'UpcomingReleasesList',\n 'AILocalizationJobs',\n ],\n});\n\nexport { contentManagerApi };\n"],"names":["contentManagerApi","adminApi","enhanceEndpoints","addTagTypes"],"mappings":";;AAEA,MAAMA,iBAAAA,GAAoBC,QAAAA,CAASC,gBAAgB,CAAC;IAClDC,WAAAA,EAAa;AACX,QAAA,wBAAA;AACA,QAAA,2BAAA;AACA,QAAA,qBAAA;AACA,QAAA,UAAA;AACA,QAAA,aAAA;AACA,QAAA,gBAAA;AACA,QAAA,WAAA;AACA,QAAA,iBAAA;AACA,QAAA,oBAAA;AACA,QAAA,gBAAA;AACA,QAAA,gBAAA;AACA,QAAA,sBAAA;AACA,QAAA;AACD;AACH,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"api.mjs","sources":["../../../admin/src/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nconst contentManagerApi = adminApi.enhanceEndpoints({\n addTagTypes: [\n 'ComponentConfiguration',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'Document',\n 'InitialData',\n 'HistoryVersion',\n 'Relations',\n 'UidAvailability',\n 'RecentDocumentList',\n 'GuidedTourMeta',\n 'CountDocuments',\n 'UpcomingReleasesList',\n 'AILocalizationJobs',\n 'Locale',\n ],\n});\n\nexport { contentManagerApi };\n"],"names":["contentManagerApi","adminApi","enhanceEndpoints","addTagTypes"],"mappings":";;AAEA,MAAMA,iBAAAA,GAAoBC,QAAAA,CAASC,gBAAgB,CAAC;IAClDC,WAAAA,EAAa;AACX,QAAA,wBAAA;AACA,QAAA,2BAAA;AACA,QAAA,qBAAA;AACA,QAAA,UAAA;AACA,QAAA,aAAA;AACA,QAAA,gBAAA;AACA,QAAA,WAAA;AACA,QAAA,iBAAA;AACA,QAAA,oBAAA;AACA,QAAA,gBAAA;AACA,QAAA,gBAAA;AACA,QAAA,sBAAA;AACA,QAAA,oBAAA;AACA,QAAA;AACD;AACH,CAAA;;;;"}
|