@strapi/content-manager 0.0.0-experimental.cd782e586c4023aa5668811fa661cd4a851b69b3 → 0.0.0-experimental.ce5faa6c7fd5c9ab2a256f4595ef938ce908c95a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/Widgets.js +4 -2
- package/dist/admin/components/Widgets.js.map +1 -1
- package/dist/admin/components/Widgets.mjs +4 -2
- package/dist/admin/components/Widgets.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +6 -3
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +6 -3
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +1 -1
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +108 -23
- package/dist/admin/preview/components/InputPopover.js.map +1 -1
- package/dist/admin/preview/components/InputPopover.mjs +91 -25
- package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
- package/dist/admin/preview/hooks/usePreviewInputManager.js +3 -14
- package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
- package/dist/admin/preview/hooks/usePreviewInputManager.mjs +3 -14
- package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -1
- package/dist/admin/preview/pages/Preview.js +5 -31
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +7 -33
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.js +88 -35
- package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.mjs +87 -35
- package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
- package/dist/admin/preview/utils/previewScript.js +74 -68
- package/dist/admin/preview/utils/previewScript.js.map +1 -1
- package/dist/admin/preview/utils/previewScript.mjs +74 -68
- package/dist/admin/preview/utils/previewScript.mjs.map +1 -1
- package/dist/admin/src/preview/components/InputPopover.d.ts +1 -1
- package/dist/admin/src/preview/hooks/usePreviewInputManager.d.ts +2 -1
- package/dist/admin/src/preview/pages/Preview.d.ts +2 -0
- package/dist/admin/src/preview/utils/fieldUtils.d.ts +13 -5
- package/dist/admin/translations/en.json.js +1 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +1 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +1 -0
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +1 -0
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +1 -0
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +1 -0
- package/dist/admin/translations/fr.json.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 +1 -1
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -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} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { Blocker } from '../../pages/EditView/components/Blocker';\nimport { FormLayout } from '../../pages/EditView/components/FormLayout';\nimport { handleInvisibleAttributes } from '../../pages/EditView/utils/data';\nimport { buildValidParams } from '../../utils/api';\nimport { createYupSchema } from '../../utils/validation';\nimport { InputPopover } from '../components/InputPopover';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { PUBLIC_EVENTS, INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\nimport { previewScript } from '../utils/previewScript';\n\nimport type { Struct, UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEVICES = [\n {\n name: 'desktop',\n label: {\n id: 'content-manager.preview.device.desktop',\n defaultMessage: 'Desktop',\n },\n width: '100%',\n height: '100%',\n },\n {\n name: 'mobile',\n label: {\n id: 'content-manager.preview.device.mobile',\n defaultMessage: 'Mobile',\n },\n width: '375px',\n height: '667px',\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverField extends FieldContentSourceMap {\n position: DOMRect;\n}\n\ninterface PreviewContextValue {\n url: string;\n title: string;\n document: NonNullable<ReturnType<UseDocument>['document']>;\n meta: NonNullable<ReturnType<UseDocument>['meta']>;\n schema: NonNullable<ReturnType<UseDocument>['schema']>;\n components: NonNullable<ReturnType<UseDocument>['components']>;\n layout: EditLayout;\n onPreview: () => void;\n iframeRef: React.RefObject<HTMLIFrameElement>;\n popoverField: PopoverField | null;\n setPopoverField: (value: PopoverField | null) => void;\n}\n\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst AnimatedArrow = styled(ArrowLineLeft)<{ $isSideEditorOpen: boolean }>`\n will-change: transform;\n rotate: ${(props) => (props.$isSideEditorOpen ? '0deg' : '180deg')};\n transition: rotate 0.2s ease-in-out;\n`;\n\n// TODO: move to util file and write unit tests\nfunction parseFieldMetaData(strapiSource: string): FieldContentSourceMap | null {\n const url = new URL(strapiSource);\n const path = url.searchParams.get('path');\n const type = url.searchParams.get('type');\n const documentId = url.searchParams.get('documentId');\n const locale = url.searchParams.get('locale');\n const model = url.searchParams.get('model');\n const kind = url.searchParams.get('kind');\n\n if (!path || !type || !documentId || !model) {\n return null;\n }\n\n return {\n path,\n type: type as Struct.SchemaAttributes[string]['type'],\n documentId,\n locale: locale ?? null,\n model: model as UID.Schema | undefined,\n kind: kind as Struct.ContentTypeKind | undefined,\n };\n}\n\nconst PreviewPage = () => {\n const location = useLocation();\n const { formatMessage } = useIntl();\n\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\n const [popoverField, setPopoverField] = React.useState<PopoverField | null>(null);\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n status?: string;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const [deviceName, setDeviceName] = React.useState<(typeof DEVICES)[number]['name']>(\n DEVICES[0].name\n );\n const device = DEVICES.find((d) => d.name === deviceName) ?? DEVICES[0];\n\n // Listen for ready message from iframe before injecting script\n React.useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === PUBLIC_EVENTS.PREVIEW_READY) {\n const script = `(${previewScript.toString()})()`;\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {\n const fieldMetaData = parseFieldMetaData(event.data.payload.path);\n if (fieldMetaData) {\n setPopoverField({ ...fieldMetaData, position: event.data.payload.position });\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, []);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale,\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n const documentLayoutResponse = useDocumentLayout(model);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading)) {\n return <Page.Loading />;\n }\n\n const initialValues = documentResponse.getInitialFormValues();\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema ||\n !initialValues\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n const validateSync = (values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validateSync(cleanedValues, { abortEarly: false });\n };\n\n const previewUrl = previewUrlResponse.data.data.url;\n\n const onPreview = () => {\n iframeRef?.current?.contentWindow?.postMessage(\n { type: 'strapiUpdate' },\n // The iframe origin is safe to use since it must be provided through the allowedOrigins config\n new URL(iframeRef.current.src).origin\n );\n };\n\n const hasAdvancedPreview = window.strapi.features.isEnabled('cms-advanced-preview');\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrl}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n components={documentResponse.components}\n layout={documentLayoutResponse.edit}\n onPreview={onPreview}\n iframeRef={iframeRef}\n popoverField={popoverField}\n setPopoverField={setPopoverField}\n >\n <FormContext\n method=\"PUT\"\n disabled={\n query.status === 'published' &&\n documentResponse &&\n documentResponse.document.status !== 'draft'\n }\n initialValues={documentResponse.getInitialFormValues()}\n initialErrors={location?.state?.forceValidation ? validateSync(initialValues, {}) : {}}\n height=\"100%\"\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validate(cleanedValues, { abortEarly: false });\n }}\n >\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <Blocker />\n <PreviewHeader />\n <InputPopover documentResponse={documentResponse} />\n <Flex flex={1} overflow=\"auto\" alignItems=\"stretch\">\n {hasAdvancedPreview && (\n <Box\n overflow=\"auto\"\n width={isSideEditorOpen ? '50%' : 0}\n borderWidth=\"0 1px 0 0\"\n borderColor=\"neutral150\"\n paddingTop={6}\n paddingBottom={6}\n // Remove horizontal padding when the editor is closed or it won't fully disappear\n paddingLeft={isSideEditorOpen ? 6 : 0}\n paddingRight={isSideEditorOpen ? 6 : 0}\n transition=\"all 0.2s ease-in-out\"\n >\n <FormLayout\n layout={documentLayoutResponse.edit.layout}\n document={documentResponse}\n hasBackground={false}\n />\n </Box>\n )}\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n flex={1}\n height=\"100%\"\n overflow=\"hidden\"\n >\n <Flex\n direction=\"row\"\n background=\"neutral0\"\n padding={2}\n borderWidth=\"0 0 1px 0\"\n borderColor=\"neutral150\"\n >\n {hasAdvancedPreview && (\n <IconButton\n variant=\"ghost\"\n label={formatMessage(\n isSideEditorOpen\n ? {\n id: 'content-manager.preview.content.close-editor',\n defaultMessage: 'Close editor',\n }\n : {\n id: 'content-manager.preview.content.open-editor',\n defaultMessage: 'Open editor',\n }\n )}\n onClick={() => setIsSideEditorOpen((prev) => !prev)}\n >\n <AnimatedArrow $isSideEditorOpen={isSideEditorOpen} />\n </IconButton>\n )}\n <Flex justifyContent=\"center\" flex={1}>\n <SingleSelect\n value={deviceName}\n onChange={(name) => setDeviceName(name.toString())}\n aria-label={formatMessage({\n id: 'content-manager.preview.device.select',\n defaultMessage: 'Select device type',\n })}\n >\n {DEVICES.map((deviceOption) => (\n <SingleSelectOption key={deviceOption.name} value={deviceOption.name}>\n {formatMessage(deviceOption.label)}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Flex>\n </Flex>\n <Flex direction=\"column\" justifyContent=\"center\" background=\"neutral0\" flex={1}>\n <Box\n data-testid=\"preview-iframe\"\n ref={iframeRef}\n src={previewUrl}\n /**\n * For some reason, changing an iframe's src tag causes the browser to add a new item in the\n * history stack. This is an issue for us as it means clicking the back button will not let us\n * go back to the edit view. To fix it, we need to trick the browser into thinking this is a\n * different iframe when the preview URL changes. So we set a key prop to force React\n * to mount a different node when the src changes.\n */\n key={previewUrl}\n title={formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n })}\n width={device.width}\n height={device.height}\n borderWidth={0}\n tag=\"iframe\"\n />\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </FormContext>\n </PreviewProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedPreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedPreviewPageImpl = () => {\n const { slug: model } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC([\n { action: 'plugin::content-manager.explorer.read', subject: model },\n { action: 'plugin::content-manager.explorer.update', subject: model },\n { action: 'plugin::content-manager.explorer.publish', subject: model },\n ]);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !model) {\n return (\n <Box\n height=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\n background=\"neutral0\"\n >\n <Page.Protect\n permissions={permissions.filter((permission) =>\n permission.action.includes('explorer.read')\n )}\n >\n <DocumentRBAC permissions={permissions}>\n <PreviewPage />\n </DocumentRBAC>\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedPreviewPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedPreviewPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedPreviewPage, usePreviewContext };\nexport type { PreviewContextValue };\n"],"names":["DEVICES","name","label","id","defaultMessage","width","height","PreviewProvider","usePreviewContext","createContext","AnimatedArrow","styled","ArrowLineLeft","props","$isSideEditorOpen","parseFieldMetaData","strapiSource","url","URL","path","searchParams","get","type","documentId","locale","model","kind","PreviewPage","location","useLocation","formatMessage","useIntl","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","slug","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","useEffect","handleMessage","event","current","previewOrigin","src","origin","data","PUBLIC_EVENTS","PREVIEW_READY","script","previewScript","toString","sendMessage","getSendMessage","STRAPI_SCRIPT","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS_INTENT","fieldMetaData","payload","position","window","addEventListener","removeEventListener","Error","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","NoData","documentTitle","getTitle","edit","settings","mainField","validateSync","values","options","cleanedValues","removedAttributes","handleInvisibleAttributes","components","yupSchema","createYupSchema","attributes","abortEarly","previewUrl","onPreview","contentWindow","postMessage","hasAdvancedPreview","strapi","features","isEnabled","_jsxs","_Fragment","Title","title","layout","FormContext","method","disabled","initialErrors","state","forceValidation","validate","Flex","direction","alignItems","Blocker","PreviewHeader","InputPopover","flex","overflow","Box","borderWidth","borderColor","paddingTop","paddingBottom","paddingLeft","paddingRight","transition","FormLayout","hasBackground","background","padding","IconButton","variant","onClick","prev","justifyContent","SingleSelect","value","onChange","aria-label","map","deviceOption","SingleSelectOption","data-testid","ref","tag","ProtectedPreviewPageImpl","permissions","useRBAC","action","subject","top","left","zIndex","Protect","filter","permission","includes","DocumentRBAC","ProtectedPreviewPage","Portal","FocusTrap"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA2CA;;AAEkG,qGAElG,MAAMA,OAAU,GAAA;AACd,IAAA;QACEC,IAAM,EAAA,SAAA;QACNC,KAAO,EAAA;YACLC,EAAI,EAAA,wCAAA;YACJC,cAAgB,EAAA;AAClB,SAAA;QACAC,KAAO,EAAA,MAAA;QACPC,MAAQ,EAAA;AACV,KAAA;AACA,IAAA;QACEL,IAAM,EAAA,QAAA;QACNC,KAAO,EAAA;YACLC,EAAI,EAAA,uCAAA;YACJC,cAAgB,EAAA;AAClB,SAAA;QACAC,KAAO,EAAA,OAAA;QACPC,MAAQ,EAAA;AACV;AACD,CAAA;AAwBD,MAAM,CAACC,eAAAA,EAAiBC,iBAAkB,CAAA,GAAGC,aAAmC,CAAA,aAAA;AAEhF;;AAEkG,qGAElG,MAAMC,aAAAA,GAAgBC,MAAOC,CAAAA,aAAAA,CAA8C;;AAEjE,UAAA,EAAE,CAACC,KAAWA,GAAAA,KAAAA,CAAMC,iBAAiB,GAAG,SAAS,QAAU,CAAA;;AAErE,CAAC;AAED;AACA,SAASC,mBAAmBC,YAAoB,EAAA;IAC9C,MAAMC,GAAAA,GAAM,IAAIC,GAAIF,CAAAA,YAAAA,CAAAA;AACpB,IAAA,MAAMG,IAAOF,GAAAA,GAAAA,CAAIG,YAAY,CAACC,GAAG,CAAC,MAAA,CAAA;AAClC,IAAA,MAAMC,IAAOL,GAAAA,GAAAA,CAAIG,YAAY,CAACC,GAAG,CAAC,MAAA,CAAA;AAClC,IAAA,MAAME,UAAaN,GAAAA,GAAAA,CAAIG,YAAY,CAACC,GAAG,CAAC,YAAA,CAAA;AACxC,IAAA,MAAMG,MAASP,GAAAA,GAAAA,CAAIG,YAAY,CAACC,GAAG,CAAC,QAAA,CAAA;AACpC,IAAA,MAAMI,KAAQR,GAAAA,GAAAA,CAAIG,YAAY,CAACC,GAAG,CAAC,OAAA,CAAA;AACnC,IAAA,MAAMK,IAAOT,GAAAA,GAAAA,CAAIG,YAAY,CAACC,GAAG,CAAC,MAAA,CAAA;AAElC,IAAA,IAAI,CAACF,IAAQ,IAAA,CAACG,QAAQ,CAACC,UAAAA,IAAc,CAACE,KAAO,EAAA;QAC3C,OAAO,IAAA;AACT;IAEA,OAAO;AACLN,QAAAA,IAAAA;QACAG,IAAMA,EAAAA,IAAAA;AACNC,QAAAA,UAAAA;AACAC,QAAAA,MAAAA,EAAQA,MAAU,IAAA,IAAA;QAClBC,KAAOA,EAAAA,KAAAA;QACPC,IAAMA,EAAAA;AACR,KAAA;AACF;AAEA,MAAMC,WAAc,GAAA,IAAA;AAClB,IAAA,MAAMC,QAAWC,GAAAA,WAAAA,EAAAA;IACjB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAE1B,MAAMC,SAAAA,GAAYC,KAAMC,CAAAA,MAAM,CAAoB,IAAA,CAAA;AAClD,IAAA,MAAM,CAACC,gBAAkBC,EAAAA,mBAAAA,CAAoB,GAAGH,KAAAA,CAAMI,QAAQ,CAAC,IAAA,CAAA;AAC/D,IAAA,MAAM,CAACC,YAAcC,EAAAA,eAAAA,CAAgB,GAAGN,KAAAA,CAAMI,QAAQ,CAAsB,IAAA,CAAA;;IAG5E,MAAM,EACJG,MAAMf,KAAK,EACXtB,IAAIoB,UAAU,EACdkB,cAAc,EACf,GAAGC,SAAAA,EAAAA;AAKJ,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,CAAC,GAAGC,cAAAA,EAAAA;AAKpB,IAAA,MAAMC,SAASZ,KAAMa,CAAAA,OAAO,CAAC,IAAMC,iBAAiBJ,KAAQ,CAAA,EAAA;AAACA,QAAAA;AAAM,KAAA,CAAA;IAEnE,MAAM,CAACK,UAAYC,EAAAA,aAAAA,CAAc,GAAGhB,KAAAA,CAAMI,QAAQ,CAChDrC,OAAO,CAAC,CAAE,CAAA,CAACC,IAAI,CAAA;AAEjB,IAAA,MAAMiD,MAASlD,GAAAA,OAAAA,CAAQmD,IAAI,CAAC,CAACC,CAAAA,GAAMA,CAAEnD,CAAAA,IAAI,KAAK+C,UAAAA,CAAAA,IAAehD,OAAO,CAAC,CAAE,CAAA;;AAGvEiC,IAAAA,KAAAA,CAAMoB,SAAS,CAAC,IAAA;AACd,QAAA,MAAMC,gBAAgB,CAACC,KAAAA,GAAAA;;YAErB,IAAIvB,SAAAA,CAAUwB,OAAO,EAAE;AACrB,gBAAA,MAAMC,gBAAgB,IAAIvC,GAAAA,CAAIc,UAAUwB,OAAO,EAAEE,KAAKC,MAAM;gBAC5D,IAAIJ,KAAAA,CAAMI,MAAM,KAAKF,aAAe,EAAA;AAClC,oBAAA;AACF;AACF;AAEA,YAAA,IAAIF,MAAMK,IAAI,EAAEtC,IAASuC,KAAAA,aAAAA,CAAcC,aAAa,EAAE;gBACpD,MAAMC,MAAAA,GAAS,CAAC,CAAC,EAAEC,cAAcC,QAAQ,EAAA,CAAG,GAAG,CAAC;AAChD,gBAAA,MAAMC,cAAcC,cAAenC,CAAAA,SAAAA,CAAAA;gBACnCkC,WAAYL,CAAAA,aAAAA,CAAcO,aAAa,EAAE;AAAEL,oBAAAA;AAAO,iBAAA,CAAA;AACpD;AAEA,YAAA,IAAIR,MAAMK,IAAI,EAAEtC,IAAS+C,KAAAA,eAAAA,CAAgBC,yBAAyB,EAAE;AAClE,gBAAA,MAAMC,gBAAgBxD,kBAAmBwC,CAAAA,KAAAA,CAAMK,IAAI,CAACY,OAAO,CAACrD,IAAI,CAAA;AAChE,gBAAA,IAAIoD,aAAe,EAAA;oBACjBhC,eAAgB,CAAA;AAAE,wBAAA,GAAGgC,aAAa;AAAEE,wBAAAA,QAAAA,EAAUlB,KAAMK,CAAAA,IAAI,CAACY,OAAO,CAACC;AAAS,qBAAA,CAAA;AAC5E;AACF;AACF,SAAA;QAEAC,MAAOC,CAAAA,gBAAgB,CAAC,SAAWrB,EAAAA,aAAAA,CAAAA;QAEnC,OAAO,IAAA;YACLoB,MAAOE,CAAAA,mBAAmB,CAAC,SAAWtB,EAAAA,aAAAA,CAAAA;AACxC,SAAA;AACF,KAAA,EAAG,EAAE,CAAA;AAEL,IAAA,IAAI,CAACb,cAAgB,EAAA;AACnB,QAAA,MAAM,IAAIoC,KAAM,CAAA,6CAAA,CAAA;AAClB;AAEA,IAAA,IAAI,CAACpD,KAAO,EAAA;AACV,QAAA,MAAM,IAAIoD,KAAM,CAAA,oCAAA,CAAA;AAClB;;IAGA,IAAIpC,cAAAA,KAAmBqC,gBAAoB,IAAA,CAACvD,UAAY,EAAA;AACtD,QAAA,MAAM,IAAIsD,KAAM,CAAA,yCAAA,CAAA;AAClB;AAEA,IAAA,MAAME,qBAAqBC,qBAAsB,CAAA;QAC/CnC,MAAQ,EAAA;YACNoC,WAAaxD,EAAAA;AACf,SAAA;QACAkB,KAAO,EAAA;AACLpB,YAAAA,UAAAA;AACAC,YAAAA,MAAAA,EAAQqB,OAAOrB,MAAM;AACrB0D,YAAAA,MAAAA,EAAQrC,OAAOqC;AACjB;AACF,KAAA,CAAA;AACA,IAAA,MAAMC,mBAAmBC,WAAY,CAAA;AACnC3D,QAAAA,KAAAA;AACAgB,QAAAA,cAAAA;AACAlB,QAAAA,UAAAA;AACAsB,QAAAA;AACF,KAAA,CAAA;AACA,IAAA,MAAMwC,yBAAyBC,iBAAkB7D,CAAAA,KAAAA,CAAAA;IAEjD,MAAM8D,SAAAA,GACJR,mBAAmBQ,SAAS,IAAIF,uBAAuBE,SAAS,IAAIJ,iBAAiBI,SAAS;IAChG,IAAIA,SAAAA,KAAc,CAACJ,gBAAiBK,CAAAA,QAAQ,EAAEjE,UAAcwD,IAAAA,kBAAAA,CAAmBQ,SAAQ,CAAI,EAAA;QACzF,qBAAOE,GAAA,CAACC,KAAKC,OAAO,EAAA,EAAA,CAAA;AACtB;IAEA,MAAMC,aAAAA,GAAgBT,iBAAiBU,oBAAoB,EAAA;AAE3D,IAAA,IACEd,mBAAmBe,KAAK,IACxBT,uBAAuBS,KAAK,IAC5B,CAACX,gBAAiBK,CAAAA,QAAQ,IAC1B,CAACL,gBAAAA,CAAiBY,IAAI,IACtB,CAACZ,iBAAiBa,MAAM,IACxB,CAACJ,aACD,EAAA;QACA,qBAAOH,GAAA,CAACC,KAAKb,KAAK,EAAA,EAAA,CAAA;AACpB;AAEA,IAAA,IAAI,CAACE,kBAAAA,CAAmBnB,IAAI,EAAEA,MAAM3C,GAAK,EAAA;QACvC,qBAAOwE,GAAA,CAACC,KAAKO,MAAM,EAAA,EAAA,CAAA;AACrB;IAEA,MAAMC,aAAAA,GAAgBf,iBAAiBgB,QAAQ,CAACd,uBAAuBe,IAAI,CAACC,QAAQ,CAACC,SAAS,CAAA;IAE9F,MAAMC,YAAAA,GAAe,CAACC,MAAiCC,EAAAA,OAAAA,GAAAA;QACrD,MAAM,EAAE7C,MAAM8C,aAAa,EAAEC,iBAAiB,EAAE,GAAGC,0BAA0BJ,MAAQ,EAAA;AACnFR,YAAAA,MAAAA,EAAQb,iBAAiBa,MAAM;AAC/BJ,YAAAA,aAAAA;AACAiB,YAAAA,UAAAA,EAAY1B,iBAAiB0B;AAC/B,SAAA,CAAA;QAEA,MAAMC,SAAAA,GAAYC,gBAChB5B,gBAAiBa,CAAAA,MAAM,EAAEgB,UACzB7B,EAAAA,gBAAAA,CAAiB0B,UAAU,EAC3B;YACE3B,MAAQC,EAAAA,gBAAAA,CAAiBK,QAAQ,EAAEN,MAAAA;AACnCyB,YAAAA,iBAAAA;AACA,YAAA,GAAGF;AACL,SAAA,CAAA;QAGF,OAAOK,SAAAA,CAAUP,YAAY,CAACG,aAAe,EAAA;YAAEO,UAAY,EAAA;AAAM,SAAA,CAAA;AACnE,KAAA;AAEA,IAAA,MAAMC,aAAanC,kBAAmBnB,CAAAA,IAAI,CAACA,IAAI,CAAC3C,GAAG;AAEnD,IAAA,MAAMkG,SAAY,GAAA,IAAA;QAChBnF,SAAWwB,EAAAA,OAAAA,EAAS4D,eAAeC,WACjC,CAAA;YAAE/F,IAAM,EAAA;AAAe,SAAA;AAEvB,QAAA,IAAIJ,IAAIc,SAAUwB,CAAAA,OAAO,CAACE,GAAG,EAAEC,MAAM,CAAA;AAEzC,KAAA;AAEA,IAAA,MAAM2D,qBAAqB5C,MAAO6C,CAAAA,MAAM,CAACC,QAAQ,CAACC,SAAS,CAAC,sBAAA,CAAA;IAE5D,qBACEC,IAAA,CAAAC,QAAA,EAAA;;AACE,0BAAAlC,GAAA,CAACC,KAAKkC,KAAK,EAAA;0BACR9F,aACC,CAAA;oBACE3B,EAAI,EAAA,oCAAA;oBACJC,cAAgB,EAAA;iBAElB,EAAA;oBACE6E,WAAaiB,EAAAA;AACf,iBAAA;;0BAGJT,GAAClF,CAAAA,eAAAA,EAAAA;gBACCU,GAAKiG,EAAAA,UAAAA;AACL1B,gBAAAA,QAAAA,EAAUL,iBAAiBK,QAAQ;gBACnCqC,KAAO3B,EAAAA,aAAAA;AACPH,gBAAAA,IAAAA,EAAMZ,iBAAiBY,IAAI;AAC3BC,gBAAAA,MAAAA,EAAQb,iBAAiBa,MAAM;AAC/Ba,gBAAAA,UAAAA,EAAY1B,iBAAiB0B,UAAU;AACvCiB,gBAAAA,MAAAA,EAAQzC,uBAAuBe,IAAI;gBACnCe,SAAWA,EAAAA,SAAAA;gBACXnF,SAAWA,EAAAA,SAAAA;gBACXM,YAAcA,EAAAA,YAAAA;gBACdC,eAAiBA,EAAAA,eAAAA;AAEjB,gBAAA,QAAA,gBAAAkD,GAACsC,CAAAA,IAAAA,EAAAA;oBACCC,MAAO,EAAA,KAAA;oBACPC,QACEtF,EAAAA,KAAAA,CAAMuC,MAAM,KAAK,WAAA,IACjBC,oBACAA,gBAAiBK,CAAAA,QAAQ,CAACN,MAAM,KAAK,OAAA;AAEvCU,oBAAAA,aAAAA,EAAeT,iBAAiBU,oBAAoB,EAAA;AACpDqC,oBAAAA,aAAAA,EAAetG,UAAUuG,KAAOC,EAAAA,eAAAA,GAAkB7B,aAAaX,aAAe,EAAA,MAAM,EAAC;oBACrFtF,MAAO,EAAA,MAAA;AACP+H,oBAAAA,QAAAA,EAAU,CAAC7B,MAAiCC,EAAAA,OAAAA,GAAAA;wBAC1C,MAAM,EAAE7C,MAAM8C,aAAa,EAAEC,iBAAiB,EAAE,GAAGC,0BAA0BJ,MAAQ,EAAA;AACnFR,4BAAAA,MAAAA,EAAQb,iBAAiBa,MAAM;AAC/BJ,4BAAAA,aAAAA;AACAiB,4BAAAA,UAAAA,EAAY1B,iBAAiB0B;AAC/B,yBAAA,CAAA;wBAEA,MAAMC,SAAAA,GAAYC,gBAChB5B,gBAAiBa,CAAAA,MAAM,EAAEgB,UACzB7B,EAAAA,gBAAAA,CAAiB0B,UAAU,EAC3B;4BACE3B,MAAQC,EAAAA,gBAAAA,CAAiBK,QAAQ,EAAEN,MAAAA;AACnCyB,4BAAAA,iBAAAA;AACA,4BAAA,GAAGF;AACL,yBAAA,CAAA;wBAGF,OAAOK,SAAAA,CAAUuB,QAAQ,CAAC3B,aAAe,EAAA;4BAAEO,UAAY,EAAA;AAAM,yBAAA,CAAA;AAC/D,qBAAA;AAEA,oBAAA,QAAA,gBAAAS,IAACY,CAAAA,IAAAA,EAAAA;wBAAKC,SAAU,EAAA,QAAA;wBAASjI,MAAO,EAAA,MAAA;wBAAOkI,UAAW,EAAA,SAAA;;0CAChD/C,GAACgD,CAAAA,OAAAA,EAAAA,EAAAA,CAAAA;0CACDhD,GAACiD,CAAAA,aAAAA,EAAAA,EAAAA,CAAAA;0CACDjD,GAACkD,CAAAA,YAAAA,EAAAA;gCAAaxD,gBAAkBA,EAAAA;;0CAChCuC,IAACY,CAAAA,IAAAA,EAAAA;gCAAKM,IAAM,EAAA,CAAA;gCAAGC,QAAS,EAAA,MAAA;gCAAOL,UAAW,EAAA,SAAA;;AACvClB,oCAAAA,kBAAAA,kBACC7B,GAACqD,CAAAA,GAAAA,EAAAA;wCACCD,QAAS,EAAA,MAAA;AACTxI,wCAAAA,KAAAA,EAAO8B,mBAAmB,KAAQ,GAAA,CAAA;wCAClC4G,WAAY,EAAA,WAAA;wCACZC,WAAY,EAAA,YAAA;wCACZC,UAAY,EAAA,CAAA;wCACZC,aAAe,EAAA,CAAA;;AAEfC,wCAAAA,WAAAA,EAAahH,mBAAmB,CAAI,GAAA,CAAA;AACpCiH,wCAAAA,YAAAA,EAAcjH,mBAAmB,CAAI,GAAA,CAAA;wCACrCkH,UAAW,EAAA,sBAAA;AAEX,wCAAA,QAAA,gBAAA5D,GAAC6D,CAAAA,UAAAA,EAAAA;4CACCxB,MAAQzC,EAAAA,sBAAAA,CAAuBe,IAAI,CAAC0B,MAAM;4CAC1CtC,QAAUL,EAAAA,gBAAAA;4CACVoE,aAAe,EAAA;;;kDAIrB7B,IAACY,CAAAA,IAAAA,EAAAA;wCACCC,SAAU,EAAA,QAAA;wCACVC,UAAW,EAAA,SAAA;wCACXI,IAAM,EAAA,CAAA;wCACNtI,MAAO,EAAA,MAAA;wCACPuI,QAAS,EAAA,QAAA;;0DAETnB,IAACY,CAAAA,IAAAA,EAAAA;gDACCC,SAAU,EAAA,KAAA;gDACViB,UAAW,EAAA,UAAA;gDACXC,OAAS,EAAA,CAAA;gDACTV,WAAY,EAAA,WAAA;gDACZC,WAAY,EAAA,YAAA;;AAEX1B,oDAAAA,kBAAAA,kBACC7B,GAACiE,CAAAA,UAAAA,EAAAA;wDACCC,OAAQ,EAAA,OAAA;AACRzJ,wDAAAA,KAAAA,EAAO4B,cACLK,gBACI,GAAA;4DACEhC,EAAI,EAAA,8CAAA;4DACJC,cAAgB,EAAA;yDAElB,GAAA;4DACED,EAAI,EAAA,6CAAA;4DACJC,cAAgB,EAAA;AAClB,yDAAA,CAAA;AAENwJ,wDAAAA,OAAAA,EAAS,IAAMxH,mBAAAA,CAAoB,CAACyH,IAAAA,GAAS,CAACA,IAAAA,CAAAA;AAE9C,wDAAA,QAAA,gBAAApE,GAAC/E,CAAAA,aAAAA,EAAAA;4DAAcI,iBAAmBqB,EAAAA;;;kEAGtCsD,GAAC6C,CAAAA,IAAAA,EAAAA;wDAAKwB,cAAe,EAAA,QAAA;wDAASlB,IAAM,EAAA,CAAA;AAClC,wDAAA,QAAA,gBAAAnD,GAACsE,CAAAA,YAAAA,EAAAA;4DACCC,KAAOhH,EAAAA,UAAAA;AACPiH,4DAAAA,QAAAA,EAAU,CAAChK,IAAAA,GAASgD,aAAchD,CAAAA,IAAAA,CAAKgE,QAAQ,EAAA,CAAA;AAC/CiG,4DAAAA,YAAAA,EAAYpI,aAAc,CAAA;gEACxB3B,EAAI,EAAA,uCAAA;gEACJC,cAAgB,EAAA;AAClB,6DAAA,CAAA;AAECJ,4DAAAA,QAAAA,EAAAA,OAAAA,CAAQmK,GAAG,CAAC,CAACC,YAAAA,iBACZ3E,GAAC4E,CAAAA,kBAAAA,EAAAA;AAA2CL,oEAAAA,KAAAA,EAAOI,aAAanK,IAAI;AACjE6B,oEAAAA,QAAAA,EAAAA,aAAAA,CAAcsI,aAAalK,KAAK;AADVkK,iEAAAA,EAAAA,YAAAA,CAAanK,IAAI,CAAA;;;;;0DAOlDwF,GAAC6C,CAAAA,IAAAA,EAAAA;gDAAKC,SAAU,EAAA,QAAA;gDAASuB,cAAe,EAAA,QAAA;gDAASN,UAAW,EAAA,UAAA;gDAAWZ,IAAM,EAAA,CAAA;AAC3E,gDAAA,QAAA,gBAAAnD,GAACqD,CAAAA,GAAAA,EAAAA;oDACCwB,aAAY,EAAA,gBAAA;oDACZC,GAAKvI,EAAAA,SAAAA;oDACL0B,GAAKwD,EAAAA,UAAAA;AASLW,oDAAAA,KAAAA,EAAO/F,aAAc,CAAA;wDACnB3B,EAAI,EAAA,qCAAA;wDACJC,cAAgB,EAAA;AAClB,qDAAA,CAAA;AACAC,oDAAAA,KAAAA,EAAO6C,OAAO7C,KAAK;AACnBC,oDAAAA,MAAAA,EAAQ4C,OAAO5C,MAAM;oDACrByI,WAAa,EAAA,CAAA;oDACbyB,GAAI,EAAA;AARCtD,iDAAAA,EAAAA,UAAAA;;;;;;;;;;;;AAkBzB,CAAA;AAEA;;AAEkG,qGAElG,MAAMuD,wBAA2B,GAAA,IAAA;AAC/B,IAAA,MAAM,EAAEjI,IAAAA,EAAMf,KAAK,EAAE,GAAGiB,SAAAA,EAAAA;IAGxB,MAAM,EACJgI,cAAc,EAAE,EAChBnF,SAAS,EACTO,KAAK,EACN,GAAG6E,OAAQ,CAAA;AACV,QAAA;YAAEC,MAAQ,EAAA,uCAAA;YAAyCC,OAASpJ,EAAAA;AAAM,SAAA;AAClE,QAAA;YAAEmJ,MAAQ,EAAA,yCAAA;YAA2CC,OAASpJ,EAAAA;AAAM,SAAA;AACpE,QAAA;YAAEmJ,MAAQ,EAAA,0CAAA;YAA4CC,OAASpJ,EAAAA;AAAM;AACtE,KAAA,CAAA;AAED,IAAA,IAAI8D,SAAW,EAAA;QACb,qBAAOE,GAAA,CAACC,KAAKC,OAAO,EAAA,EAAA,CAAA;AACtB;IAEA,IAAIG,KAAAA,IAAS,CAACrE,KAAO,EAAA;AACnB,QAAA,qBACEgE,GAACqD,CAAAA,GAAAA,EAAAA;YACCxI,MAAO,EAAA,OAAA;YACPD,KAAM,EAAA,OAAA;YACNoE,QAAS,EAAA,OAAA;YACTqG,GAAK,EAAA,CAAA;YACLC,IAAM,EAAA,CAAA;YACNC,MAAQ,EAAA,CAAA;YACRxB,UAAW,EAAA,UAAA;oCAEX/D,GAAA,CAACC,KAAKb,KAAK,EAAA,EAAA;;AAGjB;AAEA,IAAA,qBACEY,GAACqD,CAAAA,GAAAA,EAAAA;QACCxI,MAAO,EAAA,OAAA;QACPD,KAAM,EAAA,OAAA;QACNoE,QAAS,EAAA,OAAA;QACTqG,GAAK,EAAA,CAAA;QACLC,IAAM,EAAA,CAAA;QACNC,MAAQ,EAAA,CAAA;QACRxB,UAAW,EAAA,UAAA;gCAEX/D,GAAA,CAACC,KAAKuF,OAAO,EAAA;YACXP,WAAaA,EAAAA,WAAAA,CAAYQ,MAAM,CAAC,CAACC,aAC/BA,UAAWP,CAAAA,MAAM,CAACQ,QAAQ,CAAC,eAAA,CAAA,CAAA;AAG7B,YAAA,QAAA,gBAAA3F,GAAC4F,CAAAA,YAAAA,EAAAA;gBAAaX,WAAaA,EAAAA,WAAAA;AACzB,gBAAA,QAAA,gBAAAjF,GAAC9D,CAAAA,WAAAA,EAAAA,EAAAA;;;;AAKX,CAAA;AAEA,MAAM2J,oBAAuB,GAAA,IAAA;AAC3B,IAAA,qBACE7F,GAAC8F,CAAAA,MAAAA,EAAAA;AACC,QAAA,QAAA,gBAAA9F,GAAC+F,CAAAA,SAAAA,EAAAA;AACC,YAAA,QAAA,gBAAA/F,GAACgF,CAAAA,wBAAAA,EAAAA,EAAAA;;;AAIT;;;;"}
|
|
1
|
+
{"version":3,"file":"Preview.mjs","sources":["../../../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n useQueryParams,\n useRBAC,\n createContext,\n Form as FormContext,\n type FieldContentSourceMap,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n FocusTrap,\n IconButton,\n Portal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { ArrowLineLeft } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { Blocker } from '../../pages/EditView/components/Blocker';\nimport { FormLayout } from '../../pages/EditView/components/FormLayout';\nimport { handleInvisibleAttributes } from '../../pages/EditView/utils/data';\nimport { buildValidParams } from '../../utils/api';\nimport { createYupSchema } from '../../utils/validation';\nimport { InputPopover } from '../components/InputPopover';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { PUBLIC_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\nimport { previewScript } from '../utils/previewScript';\n\nimport type { Schema, UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Constants\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEVICES = [\n {\n name: 'desktop',\n label: {\n id: 'content-manager.preview.device.desktop',\n defaultMessage: 'Desktop',\n },\n width: '100%',\n height: '100%',\n },\n {\n name: 'mobile',\n label: {\n id: 'content-manager.preview.device.mobile',\n defaultMessage: 'Mobile',\n },\n width: '375px',\n height: '667px',\n },\n];\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverField extends FieldContentSourceMap {\n position: DOMRect;\n attribute: Schema.Attribute.AnyAttribute;\n}\n\ninterface PreviewContextValue {\n url: string;\n title: string;\n document: NonNullable<ReturnType<UseDocument>['document']>;\n meta: NonNullable<ReturnType<UseDocument>['meta']>;\n schema: NonNullable<ReturnType<UseDocument>['schema']>;\n components: NonNullable<ReturnType<UseDocument>['components']>;\n layout: EditLayout;\n onPreview: () => void;\n iframeRef: React.RefObject<HTMLIFrameElement>;\n popoverField: PopoverField | null;\n setPopoverField: (value: PopoverField | null) => void;\n}\n\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst AnimatedArrow = styled(ArrowLineLeft)<{ $isSideEditorOpen: boolean }>`\n will-change: transform;\n rotate: ${(props) => (props.$isSideEditorOpen ? '0deg' : '180deg')};\n transition: rotate 0.2s ease-in-out;\n`;\n\nconst PreviewPage = () => {\n const location = useLocation();\n const { formatMessage } = useIntl();\n\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const [isSideEditorOpen, setIsSideEditorOpen] = React.useState(true);\n const [popoverField, setPopoverField] = React.useState<PopoverField | null>(null);\n const { toggleNotification } = useNotification();\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n status?: string;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const [deviceName, setDeviceName] = React.useState<(typeof DEVICES)[number]['name']>(\n DEVICES[0].name\n );\n const device = DEVICES.find((d) => d.name === deviceName) ?? DEVICES[0];\n\n // Listen for ready message from iframe before injecting script\n React.useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === PUBLIC_EVENTS.PREVIEW_READY) {\n const script = `(${previewScript.toString()})()`;\n const sendMessage = getSendMessage(iframeRef);\n sendMessage(PUBLIC_EVENTS.STRAPI_SCRIPT, { script });\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [documentId, toggleNotification]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale,\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n const documentLayoutResponse = useDocumentLayout(model);\n\n const isLoading =\n previewUrlResponse.isLoading || documentLayoutResponse.isLoading || documentResponse.isLoading;\n if (isLoading && (!documentResponse.document?.documentId || previewUrlResponse.isLoading)) {\n return <Page.Loading />;\n }\n\n const initialValues = documentResponse.getInitialFormValues();\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema ||\n !initialValues\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n const validateSync = (values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validateSync(cleanedValues, { abortEarly: false });\n };\n\n const previewUrl = previewUrlResponse.data.data.url;\n\n const onPreview = () => {\n iframeRef?.current?.contentWindow?.postMessage(\n { type: 'strapiUpdate' },\n // The iframe origin is safe to use since it must be provided through the allowedOrigins config\n new URL(iframeRef.current.src).origin\n );\n };\n\n const hasAdvancedPreview = window.strapi.features.isEnabled('cms-advanced-preview');\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrl}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n components={documentResponse.components}\n layout={documentLayoutResponse.edit}\n onPreview={onPreview}\n iframeRef={iframeRef}\n popoverField={popoverField}\n setPopoverField={setPopoverField}\n >\n <FormContext\n method=\"PUT\"\n disabled={\n query.status === 'published' &&\n documentResponse &&\n documentResponse.document.status !== 'draft'\n }\n initialValues={documentResponse.getInitialFormValues()}\n initialErrors={location?.state?.forceValidation ? validateSync(initialValues, {}) : {}}\n height=\"100%\"\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const { data: cleanedValues, removedAttributes } = handleInvisibleAttributes(values, {\n schema: documentResponse.schema,\n initialValues,\n components: documentResponse.components,\n });\n\n const yupSchema = createYupSchema(\n documentResponse.schema?.attributes,\n documentResponse.components,\n {\n status: documentResponse.document?.status,\n removedAttributes,\n ...options,\n }\n );\n\n return yupSchema.validate(cleanedValues, { abortEarly: false });\n }}\n >\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <Blocker />\n <PreviewHeader />\n <InputPopover documentResponse={documentResponse} />\n <Flex flex={1} overflow=\"auto\" alignItems=\"stretch\">\n {hasAdvancedPreview && (\n <Box\n overflow=\"auto\"\n width={isSideEditorOpen ? '50%' : 0}\n borderWidth=\"0 1px 0 0\"\n borderColor=\"neutral150\"\n paddingTop={6}\n paddingBottom={6}\n // Remove horizontal padding when the editor is closed or it won't fully disappear\n paddingLeft={isSideEditorOpen ? 6 : 0}\n paddingRight={isSideEditorOpen ? 6 : 0}\n transition=\"all 0.2s ease-in-out\"\n >\n <FormLayout\n layout={documentLayoutResponse.edit.layout}\n document={documentResponse}\n hasBackground={false}\n />\n </Box>\n )}\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n flex={1}\n height=\"100%\"\n overflow=\"hidden\"\n >\n <Flex\n direction=\"row\"\n background=\"neutral0\"\n padding={2}\n borderWidth=\"0 0 1px 0\"\n borderColor=\"neutral150\"\n >\n {hasAdvancedPreview && (\n <IconButton\n variant=\"ghost\"\n label={formatMessage(\n isSideEditorOpen\n ? {\n id: 'content-manager.preview.content.close-editor',\n defaultMessage: 'Close editor',\n }\n : {\n id: 'content-manager.preview.content.open-editor',\n defaultMessage: 'Open editor',\n }\n )}\n onClick={() => setIsSideEditorOpen((prev) => !prev)}\n >\n <AnimatedArrow $isSideEditorOpen={isSideEditorOpen} />\n </IconButton>\n )}\n <Flex justifyContent=\"center\" flex={1}>\n <SingleSelect\n value={deviceName}\n onChange={(name) => setDeviceName(name.toString())}\n aria-label={formatMessage({\n id: 'content-manager.preview.device.select',\n defaultMessage: 'Select device type',\n })}\n >\n {DEVICES.map((deviceOption) => (\n <SingleSelectOption key={deviceOption.name} value={deviceOption.name}>\n {formatMessage(deviceOption.label)}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Flex>\n </Flex>\n <Flex direction=\"column\" justifyContent=\"center\" background=\"neutral0\" flex={1}>\n <Box\n data-testid=\"preview-iframe\"\n ref={iframeRef}\n src={previewUrl}\n /**\n * For some reason, changing an iframe's src tag causes the browser to add a new item in the\n * history stack. This is an issue for us as it means clicking the back button will not let us\n * go back to the edit view. To fix it, we need to trick the browser into thinking this is a\n * different iframe when the preview URL changes. So we set a key prop to force React\n * to mount a different node when the src changes.\n */\n key={previewUrl}\n title={formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n })}\n width={device.width}\n height={device.height}\n borderWidth={0}\n tag=\"iframe\"\n />\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </FormContext>\n </PreviewProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedPreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedPreviewPageImpl = () => {\n const { slug: model } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC([\n { action: 'plugin::content-manager.explorer.read', subject: model },\n { action: 'plugin::content-manager.explorer.update', subject: model },\n { action: 'plugin::content-manager.explorer.publish', subject: model },\n ]);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !model) {\n return (\n <Box\n height=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\n background=\"neutral0\"\n >\n <Page.Protect\n permissions={permissions.filter((permission) =>\n permission.action.includes('explorer.read')\n )}\n >\n <DocumentRBAC permissions={permissions}>\n <PreviewPage />\n </DocumentRBAC>\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedPreviewPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedPreviewPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedPreviewPage, usePreviewContext };\nexport type { PreviewContextValue };\n"],"names":["DEVICES","name","label","id","defaultMessage","width","height","PreviewProvider","usePreviewContext","createContext","AnimatedArrow","styled","ArrowLineLeft","props","$isSideEditorOpen","PreviewPage","location","useLocation","formatMessage","useIntl","iframeRef","React","useRef","isSideEditorOpen","setIsSideEditorOpen","useState","popoverField","setPopoverField","toggleNotification","useNotification","slug","model","documentId","collectionType","useParams","query","useQueryParams","params","useMemo","buildValidParams","deviceName","setDeviceName","device","find","d","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","PUBLIC_EVENTS","PREVIEW_READY","script","previewScript","toString","sendMessage","getSendMessage","STRAPI_SCRIPT","window","addEventListener","removeEventListener","Error","COLLECTION_TYPES","previewUrlResponse","useGetPreviewUrlQuery","contentType","locale","status","documentResponse","useDocument","documentLayoutResponse","useDocumentLayout","isLoading","document","_jsx","Page","Loading","initialValues","getInitialFormValues","error","meta","schema","url","NoData","documentTitle","getTitle","edit","settings","mainField","validateSync","values","options","cleanedValues","removedAttributes","handleInvisibleAttributes","components","yupSchema","createYupSchema","attributes","abortEarly","previewUrl","onPreview","contentWindow","postMessage","hasAdvancedPreview","strapi","features","isEnabled","_jsxs","_Fragment","Title","title","layout","FormContext","method","disabled","initialErrors","state","forceValidation","validate","Flex","direction","alignItems","Blocker","PreviewHeader","InputPopover","flex","overflow","Box","borderWidth","borderColor","paddingTop","paddingBottom","paddingLeft","paddingRight","transition","FormLayout","hasBackground","background","padding","IconButton","variant","onClick","prev","justifyContent","SingleSelect","value","onChange","aria-label","map","deviceOption","SingleSelectOption","data-testid","ref","tag","ProtectedPreviewPageImpl","permissions","useRBAC","action","subject","position","top","left","zIndex","Protect","filter","permission","includes","DocumentRBAC","ProtectedPreviewPage","Portal","FocusTrap"],"mappings":"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"}
|
|
@@ -1,45 +1,98 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var get = require('lodash/get');
|
|
4
|
-
|
|
5
3
|
// Helper function to parse path with array indices and return clean attribute names
|
|
6
4
|
const parsePathWithIndices = (path)=>{
|
|
7
|
-
// Split by dots, then
|
|
8
|
-
//
|
|
9
|
-
|
|
5
|
+
// Split by dots, then parse array indices from each part. For example:
|
|
6
|
+
// input "components.4.field.relations.2.name"
|
|
7
|
+
// output [{name: "components", index: 4}, {name: "field"}, {name: "relations", index: 2}, {name: "name"}]
|
|
8
|
+
return path.split('.').map((part)=>{
|
|
9
|
+
const numericIndex = parseInt(part, 10);
|
|
10
|
+
if (!isNaN(numericIndex) && part === numericIndex.toString()) {
|
|
11
|
+
// This part is a pure numeric index, return it as an index for the previous part
|
|
12
|
+
return {
|
|
13
|
+
name: '',
|
|
14
|
+
index: numericIndex
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
name: part
|
|
19
|
+
};
|
|
20
|
+
}).reduce((acc, part)=>{
|
|
21
|
+
if (part.name === '' && part.index !== undefined) {
|
|
22
|
+
// This is an index, attach it to the previous part
|
|
23
|
+
if (acc.length > 0) {
|
|
24
|
+
acc[acc.length - 1].index = part.index;
|
|
25
|
+
}
|
|
26
|
+
} else {
|
|
27
|
+
acc.push(part);
|
|
28
|
+
}
|
|
29
|
+
return acc;
|
|
30
|
+
}, []);
|
|
10
31
|
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
// Component attribute
|
|
24
|
-
const componentSchema = get(components, currentAttribute.component);
|
|
25
|
-
if (!componentSchema) return null;
|
|
26
|
-
return getAttributeSchema({
|
|
27
|
-
pathParts: remainingParts,
|
|
28
|
-
schema: componentSchema,
|
|
29
|
-
components
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
// TODO: handle dynamic zones
|
|
33
|
-
if ('target' in currentAttribute) {
|
|
34
|
-
// Relation attribute - in this context we might not have access to the target schema
|
|
35
|
-
// For now, we'll return the current attribute as it represents the relation itself
|
|
36
|
-
if (remainingParts.length === 0) {
|
|
37
|
-
return currentAttribute;
|
|
32
|
+
function getAttributeSchemaFromPath({ path, schema, components, document }) {
|
|
33
|
+
/**
|
|
34
|
+
* Create the function that will be recursively called.
|
|
35
|
+
* We don't do recursion on getAttributeSchemaFromPath itself because:
|
|
36
|
+
* - it takes a path string, not the parsed array that's better for recursion
|
|
37
|
+
* - even when several levels deep, we still need access to the root schema and components
|
|
38
|
+
*/ const visitor = (currentPathParts, currentAttributes, currentData)=>{
|
|
39
|
+
const [currentPart, ...remainingParts] = currentPathParts;
|
|
40
|
+
// Get the data and schema for the current path
|
|
41
|
+
const currentAttribute = currentAttributes[currentPart.name];
|
|
42
|
+
if (!currentAttribute) {
|
|
43
|
+
throw new Error('Invalid field path');
|
|
38
44
|
}
|
|
45
|
+
if (currentAttribute.type === 'relation') {
|
|
46
|
+
throw new Error('Relations not handled');
|
|
47
|
+
}
|
|
48
|
+
if (currentAttribute.type === 'component') {
|
|
49
|
+
const componentAttributes = components[currentAttribute.component].attributes;
|
|
50
|
+
if (currentAttribute.repeatable) {
|
|
51
|
+
// We must have the index, otherwise we don't know what data to use
|
|
52
|
+
if (currentPart.index === undefined) {
|
|
53
|
+
throw new Error('Invalid field path');
|
|
54
|
+
}
|
|
55
|
+
return visitor(remainingParts, componentAttributes, currentData[currentPart.name][currentPart.index]);
|
|
56
|
+
}
|
|
57
|
+
// Non repeatable component
|
|
58
|
+
return visitor(remainingParts, componentAttributes, currentData[currentPart.name]);
|
|
59
|
+
}
|
|
60
|
+
if (currentAttribute.type === 'dynamiczone') {
|
|
61
|
+
// We must have the index, otherwise we don't know what component we're dealing with
|
|
62
|
+
if (currentPart.index === undefined) {
|
|
63
|
+
throw new Error('Invalid field path');
|
|
64
|
+
}
|
|
65
|
+
const componentData = currentData[currentPart.name][currentPart.index];
|
|
66
|
+
const componentAttributes = components[componentData.__component].attributes;
|
|
67
|
+
return visitor(remainingParts, componentAttributes, componentData);
|
|
68
|
+
}
|
|
69
|
+
// Plain regular field. It ends the recursion
|
|
70
|
+
return currentAttributes[currentPart.name];
|
|
71
|
+
};
|
|
72
|
+
return visitor(parsePathWithIndices(path), schema.attributes, document);
|
|
73
|
+
}
|
|
74
|
+
function parseFieldMetaData(strapiSource) {
|
|
75
|
+
const searchParams = new URLSearchParams(strapiSource);
|
|
76
|
+
const path = searchParams.get('path');
|
|
77
|
+
const type = searchParams.get('type');
|
|
78
|
+
const documentId = searchParams.get('documentId');
|
|
79
|
+
const locale = searchParams.get('locale');
|
|
80
|
+
const model = searchParams.get('model');
|
|
81
|
+
const kind = searchParams.get('kind');
|
|
82
|
+
if (!path || !type || !documentId || !model) {
|
|
83
|
+
return null;
|
|
39
84
|
}
|
|
40
|
-
return
|
|
41
|
-
|
|
85
|
+
return {
|
|
86
|
+
path,
|
|
87
|
+
type: type,
|
|
88
|
+
documentId,
|
|
89
|
+
locale: locale ?? null,
|
|
90
|
+
model: model,
|
|
91
|
+
kind: kind ? kind : undefined
|
|
92
|
+
};
|
|
93
|
+
}
|
|
42
94
|
|
|
43
|
-
exports.
|
|
95
|
+
exports.getAttributeSchemaFromPath = getAttributeSchemaFromPath;
|
|
96
|
+
exports.parseFieldMetaData = parseFieldMetaData;
|
|
44
97
|
exports.parsePathWithIndices = parsePathWithIndices;
|
|
45
98
|
//# sourceMappingURL=fieldUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fieldUtils.js","sources":["../../../../admin/src/preview/utils/fieldUtils.ts"],"sourcesContent":["import
|
|
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 { PreviewContextValue } from '../pages/Preview';\nimport type { Modules, Schema, Struct, UID } from '@strapi/types';\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: any\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 Error('Invalid field path');\n }\n\n if (currentAttribute.type === 'relation') {\n throw new Error('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 Error('Invalid field path');\n }\n return visitor(\n remainingParts,\n componentAttributes,\n currentData[currentPart.name][currentPart.index]\n );\n }\n\n // Non repeatable component\n return visitor(remainingParts, componentAttributes, currentData[currentPart.name]);\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 Error('Invalid field path');\n }\n\n const componentData = currentData[currentPart.name][currentPart.index];\n const componentAttributes = components[componentData.__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);\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":["parsePathWithIndices","path","split","map","part","numericIndex","parseInt","isNaN","toString","name","index","reduce","acc","undefined","length","push","getAttributeSchemaFromPath","schema","components","document","visitor","currentPathParts","currentAttributes","currentData","currentPart","remainingParts","currentAttribute","Error","type","componentAttributes","component","attributes","repeatable","componentData","__component","parseFieldMetaData","strapiSource","searchParams","URLSearchParams","get","documentId","locale","model","kind"],"mappings":";;AAOA;AACO,MAAMA,uBAAuB,CAACC,IAAAA,GAAAA;;;;AAInC,IAAA,OAAOA,KACJC,KAAK,CAAC,GACNC,CAAAA,CAAAA,GAAG,CAAC,CAACC,IAAAA,GAAAA;QACJ,MAAMC,YAAAA,GAAeC,SAASF,IAAM,EAAA,EAAA,CAAA;AACpC,QAAA,IAAI,CAACG,KAAMF,CAAAA,YAAAA,CAAAA,IAAiBD,IAASC,KAAAA,YAAAA,CAAaG,QAAQ,EAAI,EAAA;;YAE5D,OAAO;gBAAEC,IAAM,EAAA,EAAA;gBAAIC,KAAOL,EAAAA;AAAa,aAAA;AACzC;QACA,OAAO;YAAEI,IAAML,EAAAA;AAAK,SAAA;KAErBO,CAAAA,CAAAA,MAAM,CAAC,CAACC,GAAiBR,EAAAA,IAAAA,GAAAA;AACxB,QAAA,IAAIA,KAAKK,IAAI,KAAK,MAAML,IAAKM,CAAAA,KAAK,KAAKG,SAAW,EAAA;;YAEhD,IAAID,GAAAA,CAAIE,MAAM,GAAG,CAAG,EAAA;gBAClBF,GAAG,CAACA,IAAIE,MAAM,GAAG,EAAE,CAACJ,KAAK,GAAGN,IAAAA,CAAKM,KAAK;AACxC;SACK,MAAA;AACLE,YAAAA,GAAAA,CAAIG,IAAI,CAACX,IAAAA,CAAAA;AACX;QACA,OAAOQ,GAAAA;AACT,KAAA,EAAG,EAAE,CAAA;AACT;AAEO,SAASI,0BAA2B,CAAA,EACzCf,IAAI,EACJgB,MAAM,EACNC,UAAU,EACVC,QAAQ,EAMT,EAAA;AACC;;;;;AAKC,MACD,MAAMC,OAAAA,GAAU,CACdC,gBAAAA,EACAC,iBACAC,EAAAA,WAAAA,GAAAA;AAEA,QAAA,MAAM,CAACC,WAAAA,EAAa,GAAGC,cAAAA,CAAe,GAAGJ,gBAAAA;;AAGzC,QAAA,MAAMK,gBAAmBJ,GAAAA,iBAAiB,CAACE,WAAAA,CAAYf,IAAI,CAAC;AAE5D,QAAA,IAAI,CAACiB,gBAAkB,EAAA;AACrB,YAAA,MAAM,IAAIC,KAAM,CAAA,oBAAA,CAAA;AAClB;QAEA,IAAID,gBAAAA,CAAiBE,IAAI,KAAK,UAAY,EAAA;AACxC,YAAA,MAAM,IAAID,KAAM,CAAA,uBAAA,CAAA;AAClB;QAEA,IAAID,gBAAAA,CAAiBE,IAAI,KAAK,WAAa,EAAA;AACzC,YAAA,MAAMC,sBAAsBX,UAAU,CAACQ,iBAAiBI,SAAS,CAAC,CAACC,UAAU;YAC7E,IAAIL,gBAAAA,CAAiBM,UAAU,EAAE;;gBAE/B,IAAIR,WAAAA,CAAYd,KAAK,KAAKG,SAAW,EAAA;AACnC,oBAAA,MAAM,IAAIc,KAAM,CAAA,oBAAA,CAAA;AAClB;gBACA,OAAOP,OAAAA,CACLK,cACAI,EAAAA,mBAAAA,EACAN,WAAW,CAACC,WAAYf,CAAAA,IAAI,CAAC,CAACe,WAAYd,CAAAA,KAAK,CAAC,CAAA;AAEpD;;AAGA,YAAA,OAAOU,QAAQK,cAAgBI,EAAAA,mBAAAA,EAAqBN,WAAW,CAACC,WAAAA,CAAYf,IAAI,CAAC,CAAA;AACnF;QAEA,IAAIiB,gBAAAA,CAAiBE,IAAI,KAAK,aAAe,EAAA;;YAE3C,IAAIJ,WAAAA,CAAYd,KAAK,KAAKG,SAAW,EAAA;AACnC,gBAAA,MAAM,IAAIc,KAAM,CAAA,oBAAA,CAAA;AAClB;YAEA,MAAMM,aAAAA,GAAgBV,WAAW,CAACC,WAAAA,CAAYf,IAAI,CAAC,CAACe,WAAYd,CAAAA,KAAK,CAAC;AACtE,YAAA,MAAMmB,sBAAsBX,UAAU,CAACe,cAAcC,WAAW,CAAC,CAACH,UAAU;YAC5E,OAAOX,OAAAA,CAAQK,gBAAgBI,mBAAqBI,EAAAA,aAAAA,CAAAA;AACtD;;AAGA,QAAA,OAAOX,iBAAiB,CAACE,WAAYf,CAAAA,IAAI,CAAC;AAC5C,KAAA;AAEA,IAAA,OAAOW,OAAQpB,CAAAA,oBAAAA,CAAqBC,IAAOgB,CAAAA,EAAAA,MAAAA,CAAOc,UAAU,EAAEZ,QAAAA,CAAAA;AAChE;AAEO,SAASgB,mBAAmBC,YAAoB,EAAA;IACrD,MAAMC,YAAAA,GAAe,IAAIC,eAAgBF,CAAAA,YAAAA,CAAAA;IACzC,MAAMnC,IAAAA,GAAOoC,YAAaE,CAAAA,GAAG,CAAC,MAAA,CAAA;IAC9B,MAAMX,IAAAA,GAAOS,YAAaE,CAAAA,GAAG,CAAC,MAAA,CAAA;IAC9B,MAAMC,UAAAA,GAAaH,YAAaE,CAAAA,GAAG,CAAC,YAAA,CAAA;IACpC,MAAME,MAAAA,GAASJ,YAAaE,CAAAA,GAAG,CAAC,QAAA,CAAA;IAChC,MAAMG,KAAAA,GAAQL,YAAaE,CAAAA,GAAG,CAAC,OAAA,CAAA;IAC/B,MAAMI,IAAAA,GAAON,YAAaE,CAAAA,GAAG,CAAC,MAAA,CAAA;AAE9B,IAAA,IAAI,CAACtC,IAAQ,IAAA,CAAC2B,QAAQ,CAACY,UAAAA,IAAc,CAACE,KAAO,EAAA;QAC3C,OAAO,IAAA;AACT;IAEA,OAAO;AACLzC,QAAAA,IAAAA;QACA2B,IAAMA,EAAAA,IAAAA;AACNY,QAAAA,UAAAA;AACAC,QAAAA,MAAAA,EAAQA,MAAU,IAAA,IAAA;QAClBC,KAAOA,EAAAA,KAAAA;AACPC,QAAAA,IAAAA,EAAMA,OAAQA,IAAkC9B,GAAAA;AAClD,KAAA;AACF;;;;;;"}
|
|
@@ -1,42 +1,94 @@
|
|
|
1
|
-
import get from 'lodash/get';
|
|
2
|
-
|
|
3
1
|
// Helper function to parse path with array indices and return clean attribute names
|
|
4
2
|
const parsePathWithIndices = (path)=>{
|
|
5
|
-
// Split by dots, then
|
|
6
|
-
//
|
|
7
|
-
|
|
3
|
+
// Split by dots, then parse array indices from each part. For example:
|
|
4
|
+
// input "components.4.field.relations.2.name"
|
|
5
|
+
// output [{name: "components", index: 4}, {name: "field"}, {name: "relations", index: 2}, {name: "name"}]
|
|
6
|
+
return path.split('.').map((part)=>{
|
|
7
|
+
const numericIndex = parseInt(part, 10);
|
|
8
|
+
if (!isNaN(numericIndex) && part === numericIndex.toString()) {
|
|
9
|
+
// This part is a pure numeric index, return it as an index for the previous part
|
|
10
|
+
return {
|
|
11
|
+
name: '',
|
|
12
|
+
index: numericIndex
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
name: part
|
|
17
|
+
};
|
|
18
|
+
}).reduce((acc, part)=>{
|
|
19
|
+
if (part.name === '' && part.index !== undefined) {
|
|
20
|
+
// This is an index, attach it to the previous part
|
|
21
|
+
if (acc.length > 0) {
|
|
22
|
+
acc[acc.length - 1].index = part.index;
|
|
23
|
+
}
|
|
24
|
+
} else {
|
|
25
|
+
acc.push(part);
|
|
26
|
+
}
|
|
27
|
+
return acc;
|
|
28
|
+
}, []);
|
|
8
29
|
};
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
// Component attribute
|
|
22
|
-
const componentSchema = get(components, currentAttribute.component);
|
|
23
|
-
if (!componentSchema) return null;
|
|
24
|
-
return getAttributeSchema({
|
|
25
|
-
pathParts: remainingParts,
|
|
26
|
-
schema: componentSchema,
|
|
27
|
-
components
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
// TODO: handle dynamic zones
|
|
31
|
-
if ('target' in currentAttribute) {
|
|
32
|
-
// Relation attribute - in this context we might not have access to the target schema
|
|
33
|
-
// For now, we'll return the current attribute as it represents the relation itself
|
|
34
|
-
if (remainingParts.length === 0) {
|
|
35
|
-
return currentAttribute;
|
|
30
|
+
function getAttributeSchemaFromPath({ path, schema, components, document }) {
|
|
31
|
+
/**
|
|
32
|
+
* Create the function that will be recursively called.
|
|
33
|
+
* We don't do recursion on getAttributeSchemaFromPath itself because:
|
|
34
|
+
* - it takes a path string, not the parsed array that's better for recursion
|
|
35
|
+
* - even when several levels deep, we still need access to the root schema and components
|
|
36
|
+
*/ const visitor = (currentPathParts, currentAttributes, currentData)=>{
|
|
37
|
+
const [currentPart, ...remainingParts] = currentPathParts;
|
|
38
|
+
// Get the data and schema for the current path
|
|
39
|
+
const currentAttribute = currentAttributes[currentPart.name];
|
|
40
|
+
if (!currentAttribute) {
|
|
41
|
+
throw new Error('Invalid field path');
|
|
36
42
|
}
|
|
43
|
+
if (currentAttribute.type === 'relation') {
|
|
44
|
+
throw new Error('Relations not handled');
|
|
45
|
+
}
|
|
46
|
+
if (currentAttribute.type === 'component') {
|
|
47
|
+
const componentAttributes = components[currentAttribute.component].attributes;
|
|
48
|
+
if (currentAttribute.repeatable) {
|
|
49
|
+
// We must have the index, otherwise we don't know what data to use
|
|
50
|
+
if (currentPart.index === undefined) {
|
|
51
|
+
throw new Error('Invalid field path');
|
|
52
|
+
}
|
|
53
|
+
return visitor(remainingParts, componentAttributes, currentData[currentPart.name][currentPart.index]);
|
|
54
|
+
}
|
|
55
|
+
// Non repeatable component
|
|
56
|
+
return visitor(remainingParts, componentAttributes, currentData[currentPart.name]);
|
|
57
|
+
}
|
|
58
|
+
if (currentAttribute.type === 'dynamiczone') {
|
|
59
|
+
// We must have the index, otherwise we don't know what component we're dealing with
|
|
60
|
+
if (currentPart.index === undefined) {
|
|
61
|
+
throw new Error('Invalid field path');
|
|
62
|
+
}
|
|
63
|
+
const componentData = currentData[currentPart.name][currentPart.index];
|
|
64
|
+
const componentAttributes = components[componentData.__component].attributes;
|
|
65
|
+
return visitor(remainingParts, componentAttributes, componentData);
|
|
66
|
+
}
|
|
67
|
+
// Plain regular field. It ends the recursion
|
|
68
|
+
return currentAttributes[currentPart.name];
|
|
69
|
+
};
|
|
70
|
+
return visitor(parsePathWithIndices(path), schema.attributes, document);
|
|
71
|
+
}
|
|
72
|
+
function parseFieldMetaData(strapiSource) {
|
|
73
|
+
const searchParams = new URLSearchParams(strapiSource);
|
|
74
|
+
const path = searchParams.get('path');
|
|
75
|
+
const type = searchParams.get('type');
|
|
76
|
+
const documentId = searchParams.get('documentId');
|
|
77
|
+
const locale = searchParams.get('locale');
|
|
78
|
+
const model = searchParams.get('model');
|
|
79
|
+
const kind = searchParams.get('kind');
|
|
80
|
+
if (!path || !type || !documentId || !model) {
|
|
81
|
+
return null;
|
|
37
82
|
}
|
|
38
|
-
return
|
|
39
|
-
|
|
83
|
+
return {
|
|
84
|
+
path,
|
|
85
|
+
type: type,
|
|
86
|
+
documentId,
|
|
87
|
+
locale: locale ?? null,
|
|
88
|
+
model: model,
|
|
89
|
+
kind: kind ? kind : undefined
|
|
90
|
+
};
|
|
91
|
+
}
|
|
40
92
|
|
|
41
|
-
export {
|
|
93
|
+
export { getAttributeSchemaFromPath, parseFieldMetaData, parsePathWithIndices };
|
|
42
94
|
//# sourceMappingURL=fieldUtils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fieldUtils.mjs","sources":["../../../../admin/src/preview/utils/fieldUtils.ts"],"sourcesContent":["import
|
|
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 { PreviewContextValue } from '../pages/Preview';\nimport type { Modules, Schema, Struct, UID } from '@strapi/types';\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: any\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 Error('Invalid field path');\n }\n\n if (currentAttribute.type === 'relation') {\n throw new Error('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 Error('Invalid field path');\n }\n return visitor(\n remainingParts,\n componentAttributes,\n currentData[currentPart.name][currentPart.index]\n );\n }\n\n // Non repeatable component\n return visitor(remainingParts, componentAttributes, currentData[currentPart.name]);\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 Error('Invalid field path');\n }\n\n const componentData = currentData[currentPart.name][currentPart.index];\n const componentAttributes = components[componentData.__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);\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":["parsePathWithIndices","path","split","map","part","numericIndex","parseInt","isNaN","toString","name","index","reduce","acc","undefined","length","push","getAttributeSchemaFromPath","schema","components","document","visitor","currentPathParts","currentAttributes","currentData","currentPart","remainingParts","currentAttribute","Error","type","componentAttributes","component","attributes","repeatable","componentData","__component","parseFieldMetaData","strapiSource","searchParams","URLSearchParams","get","documentId","locale","model","kind"],"mappings":"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"}
|