@strapi/content-manager 5.45.1 → 5.46.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/content-manager.js +26 -2
- package/dist/admin/content-manager.js.map +1 -1
- package/dist/admin/content-manager.mjs +26 -2
- package/dist/admin/content-manager.mjs.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.js +4 -1
- package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.mjs +4 -1
- package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +21 -4
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs +19 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +9 -6
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +10 -7
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +1 -34
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +3 -35
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +33 -18
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +34 -19
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.js +22 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.mjs +20 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +15 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +16 -5
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +26 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +26 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +31 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +31 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +3 -0
- package/dist/admin/preview/components/InputPopover.js.map +1 -1
- package/dist/admin/preview/components/InputPopover.mjs +3 -0
- package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
- package/dist/admin/preview/hooks/usePreviewInputManager.js +24 -0
- package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
- package/dist/admin/preview/hooks/usePreviewInputManager.mjs +24 -0
- package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -1
- package/dist/admin/preview/utils/previewScript.js +616 -78
- package/dist/admin/preview/utils/previewScript.js.map +1 -1
- package/dist/admin/preview/utils/previewScript.mjs +616 -78
- package/dist/admin/preview/utils/previewScript.mjs.map +1 -1
- package/dist/admin/src/content-manager.d.ts +26 -0
- package/dist/admin/src/exports.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +14 -8
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.d.ts +3 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCard.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +11 -1
- package/dist/server/homepage/services/homepage.js +12 -8
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +12 -8
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/services/metrics.js +1 -5
- package/dist/server/services/metrics.js.map +1 -1
- package/dist/server/services/metrics.mjs +1 -5
- package/dist/server/services/metrics.mjs.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/services/metrics.d.ts.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n createContext,\n InputProps,\n useField,\n useForm,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport { Box, Flex, VisuallyHidden } from '@strapi/design-system';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { useDocumentContext } from '../../../../../hooks/useDocumentContext';\nimport { type EditFieldLayout } from '../../../../../hooks/useDocumentLayout';\nimport { getTranslation } from '../../../../../utils/translations';\nimport { transformDocument } from '../../../utils/data';\nimport { createDefaultForm } from '../../../utils/forms';\nimport { ComponentProvider, useComponent } from '../ComponentContext';\n\nimport { AddComponentButton } from './AddComponentButton';\nimport { ComponentPicker } from './ComponentPicker';\nimport { DynamicComponent, DynamicComponentProps } from './DynamicComponent';\nimport { DynamicZoneLabel, DynamicZoneLabelProps } from './DynamicZoneLabel';\n\nimport type { InputRendererProps } from '../../InputRenderer';\nimport type { Schema } from '@strapi/types';\n\ninterface DynamicZoneContextValue {\n isInDynamicZone: boolean;\n}\n\nconst [DynamicZoneProvider, useDynamicZone] = createContext<DynamicZoneContextValue>(\n 'DynamicZone',\n {\n isInDynamicZone: false,\n }\n);\n\ninterface DynamicZoneProps\n extends Omit<Extract<EditFieldLayout, { type: 'dynamiczone' }>, 'size' | 'hint'>,\n Pick<InputProps, 'hint'>,\n Pick<DynamicZoneLabelProps, 'labelAction'> {\n children?: (props: InputRendererProps) => React.ReactNode;\n}\n\nconst DynamicZone = ({\n attribute,\n disabled: disabledProp,\n hint,\n label,\n labelAction,\n name,\n required = false,\n children,\n}: DynamicZoneProps) => {\n // We cannot use the default props here\n const { max = Infinity, min = -Infinity } = attribute ?? {};\n\n const [addComponentIsOpen, setAddComponentIsOpen] = React.useState(false);\n const [liveText, setLiveText] = React.useState('');\n\n const {\n currentDocument: { components, isLoading },\n } = useDocumentContext('DynamicZone');\n\n const disabled = disabledProp || isLoading;\n const addFieldRow = useForm('DynamicZone', (state) => state.addFieldRow);\n const removeFieldRow = useForm('DynamicZone', (state) => state.removeFieldRow);\n const moveFieldRow = useForm('DynamicZone', (state) => state.moveFieldRow);\n\n type DzWithTempKey =\n Schema.Attribute.GetDynamicZoneValue<Schema.Attribute.DynamicZone>[number] & {\n __temp_key__: number;\n };\n\n const { value = [], error } = useField<Array<DzWithTempKey>>(name);\n\n const dynamicComponentsByCategory = React.useMemo(() => {\n return attribute.components.reduce<\n NonNullable<DynamicComponentProps['dynamicComponentsByCategory']>\n >((acc, componentUid) => {\n const { category, info } = components[componentUid] ?? { info: {} };\n\n const component = { uid: componentUid, displayName: info.displayName, icon: info.icon };\n\n if (!acc[category]) {\n acc[category] = [];\n }\n\n acc[category] = [...acc[category], component];\n\n return acc;\n }, {});\n }, [attribute.components, components]);\n\n const { formatMessage } = useIntl();\n\n const { toggleNotification } = useNotification();\n\n const dynamicDisplayedComponentsLength = value.length;\n\n const handleAddComponent = React.useCallback(\n (uid: string, position?: number) => {\n setAddComponentIsOpen(false);\n\n const schema = components[uid];\n const form = createDefaultForm(schema, components);\n const transformations = pipe(transformDocument(schema, components), (data) => ({\n ...data,\n __component: uid,\n }));\n\n const data = transformations(form);\n\n addFieldRow(name, data, position);\n },\n [addFieldRow, components, name]\n );\n\n const handleClickOpenPicker = () => {\n if (dynamicDisplayedComponentsLength < max) {\n setAddComponentIsOpen((prev) => !prev);\n } else {\n toggleNotification({\n type: 'info',\n message: formatMessage({\n id: getTranslation('components.notification.info.maximum-requirement'),\n }),\n });\n }\n };\n\n const handleMoveComponent = React.useCallback(\n (newIndex: number, currentIndex: number) => {\n setLiveText(\n formatMessage(\n {\n id: getTranslation('dnd.reorder'),\n defaultMessage: '{item}, moved. New position in list: {position}.',\n },\n {\n item: `${name}.${currentIndex}`,\n position: `${newIndex + 1} of ${value.length}`,\n }\n )\n );\n\n moveFieldRow(name, currentIndex, newIndex);\n },\n [formatMessage, moveFieldRow, name, value.length]\n );\n\n const handleCancel = React.useCallback(\n (index: number) => {\n setLiveText(\n formatMessage(\n {\n id: getTranslation('dnd.cancel-item'),\n defaultMessage: '{item}, dropped. Re-order cancelled.',\n },\n {\n item: `${name}.${index}`,\n }\n )\n );\n },\n [formatMessage, name]\n );\n\n const handleGrabItem = React.useCallback(\n (index: number) => {\n setLiveText(\n formatMessage(\n {\n id: getTranslation('dnd.grab-item'),\n defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`,\n },\n {\n item: `${name}.${index}`,\n position: `${index + 1} of ${value.length}`,\n }\n )\n );\n },\n [formatMessage, name, value.length]\n );\n\n const handleDropItem = React.useCallback(\n (index: number) => {\n setLiveText(\n formatMessage(\n {\n id: getTranslation('dnd.drop-item'),\n defaultMessage: `{item}, dropped. Final position in list: {position}.`,\n },\n {\n item: `${name}.${index}`,\n position: `${index + 1} of ${value.length}`,\n }\n )\n );\n },\n [formatMessage, name, value.length]\n );\n\n const handleRemoveComponent = React.useCallback(\n (currentIndex: number) => {\n removeFieldRow(name, currentIndex);\n },\n [name, removeFieldRow]\n );\n\n const hasError = error !== undefined;\n\n const renderButtonLabel = () => {\n if (addComponentIsOpen) {\n return formatMessage({ id: 'app.utils.close-label', defaultMessage: 'Close' });\n }\n\n if (hasError && dynamicDisplayedComponentsLength > max) {\n return formatMessage(\n {\n id: getTranslation(`components.DynamicZone.extra-components`),\n defaultMessage:\n 'There {number, plural, =0 {are # extra components} one {is # extra component} other {are # extra components}}',\n },\n {\n number: dynamicDisplayedComponentsLength - max,\n }\n );\n }\n\n if (hasError && dynamicDisplayedComponentsLength < min) {\n return formatMessage(\n {\n id: getTranslation(`components.DynamicZone.missing-components`),\n defaultMessage:\n 'There {number, plural, =0 {are # missing components} one {is # missing component} other {are # missing components}}',\n },\n { number: min - dynamicDisplayedComponentsLength }\n );\n }\n\n return formatMessage(\n {\n id: getTranslation('components.DynamicZone.add-component'),\n defaultMessage: 'Add a component to {componentName}',\n },\n { componentName: label || name }\n );\n };\n\n const level = useComponent('DynamicZone', (state) => state.level);\n\n const ariaDescriptionId = React.useId();\n\n return (\n <DynamicZoneProvider isInDynamicZone>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={{ initial: 4, medium: 6 }}>\n {dynamicDisplayedComponentsLength > 0 && (\n <Box>\n <DynamicZoneLabel\n hint={hint}\n label={label}\n labelAction={labelAction}\n name={name}\n numberOfComponents={dynamicDisplayedComponentsLength}\n required={required}\n />\n <VisuallyHidden id={ariaDescriptionId}>\n {formatMessage({\n id: getTranslation('dnd.instructions'),\n defaultMessage: `Press spacebar to grab and re-order`,\n })}\n </VisuallyHidden>\n <VisuallyHidden aria-live=\"assertive\">{liveText}</VisuallyHidden>\n <ol aria-describedby={ariaDescriptionId}>\n {value.map((field, index) => (\n <ComponentProvider\n key={field.__temp_key__}\n level={level + 1}\n uid={field.__component}\n // id is always a number in a dynamic zone.\n id={field.id as number}\n type=\"dynamiczone\"\n >\n <DynamicComponent\n disabled={disabled}\n name={name}\n index={index}\n componentUid={field.__component}\n onMoveComponent={handleMoveComponent}\n onRemoveComponentClick={handleRemoveComponent}\n onCancel={handleCancel}\n onDropItem={handleDropItem}\n onGrabItem={handleGrabItem}\n onAddComponent={handleAddComponent}\n dynamicComponentsByCategory={dynamicComponentsByCategory}\n totalLength={dynamicDisplayedComponentsLength}\n >\n {children}\n </DynamicComponent>\n </ComponentProvider>\n ))}\n </ol>\n </Box>\n )}\n <Flex justifyContent=\"center\">\n <AddComponentButton\n hasError={hasError}\n isDisabled={disabled}\n isOpen={addComponentIsOpen}\n onClick={handleClickOpenPicker}\n >\n {renderButtonLabel()}\n </AddComponentButton>\n </Flex>\n <ComponentPicker\n dynamicComponentsByCategory={dynamicComponentsByCategory}\n isOpen={addComponentIsOpen}\n onClickAddComponent={handleAddComponent}\n />\n </Flex>\n </DynamicZoneProvider>\n );\n};\n\nexport { DynamicZone, useDynamicZone };\nexport type { DynamicZoneProps };\n"],"names":["DynamicZoneProvider","useDynamicZone","createContext","isInDynamicZone","DynamicZone","attribute","disabled","disabledProp","hint","label","labelAction","name","required","children","max","Infinity","min","addComponentIsOpen","setAddComponentIsOpen","React","useState","liveText","setLiveText","currentDocument","components","isLoading","useDocumentContext","addFieldRow","useForm","state","removeFieldRow","moveFieldRow","value","error","useField","dynamicComponentsByCategory","useMemo","reduce","acc","componentUid","category","info","component","uid","displayName","icon","formatMessage","useIntl","toggleNotification","useNotification","dynamicDisplayedComponentsLength","length","handleAddComponent","useCallback","position","schema","form","createDefaultForm","transformations","pipe","transformDocument","data","__component","handleClickOpenPicker","prev","type","message","id","getTranslation","handleMoveComponent","newIndex","currentIndex","defaultMessage","item","handleCancel","index","handleGrabItem","handleDropItem","handleRemoveComponent","hasError","undefined","renderButtonLabel","number","componentName","level","useComponent","ariaDescriptionId","useId","_jsx","_jsxs","Flex","direction","alignItems","gap","initial","medium","Box","DynamicZoneLabel","numberOfComponents","VisuallyHidden","aria-live","ol","aria-describedby","map","field","ComponentProvider","DynamicComponent","onMoveComponent","onRemoveComponentClick","onCancel","onDropItem","onGrabItem","onAddComponent","totalLength","__temp_key__","justifyContent","AddComponentButton","isDisabled","isOpen","onClick","ComponentPicker","onClickAddComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Field.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n createContext,\n InputProps,\n useField,\n useForm,\n useNotification,\n} from '@strapi/admin/strapi-admin';\nimport { Box, Flex, VisuallyHidden } from '@strapi/design-system';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { useDocumentContext } from '../../../../../hooks/useDocumentContext';\nimport { type EditFieldLayout } from '../../../../../hooks/useDocumentLayout';\nimport { usePrev } from '../../../../../hooks/usePrev';\nimport { getTranslation } from '../../../../../utils/translations';\nimport { transformDocument } from '../../../utils/data';\nimport { createDefaultForm } from '../../../utils/forms';\nimport { ComponentProvider, useComponent } from '../ComponentContext';\n\nimport { AddComponentButton } from './AddComponentButton';\nimport { ComponentPicker } from './ComponentPicker';\nimport { DynamicComponent, DynamicComponentProps } from './DynamicComponent';\nimport { DynamicZoneLabel, DynamicZoneLabelProps } from './DynamicZoneLabel';\n\nimport type { InputRendererProps } from '../../InputRenderer';\nimport type { Schema } from '@strapi/types';\n\ninterface DynamicZoneContextValue {\n isInDynamicZone: boolean;\n}\n\nconst [DynamicZoneProvider, useDynamicZone] = createContext<DynamicZoneContextValue>(\n 'DynamicZone',\n {\n isInDynamicZone: false,\n }\n);\n\ninterface DynamicZoneProps\n extends Omit<Extract<EditFieldLayout, { type: 'dynamiczone' }>, 'size' | 'hint'>,\n Pick<InputProps, 'hint'>,\n Pick<DynamicZoneLabelProps, 'labelAction'> {\n children?: (props: InputRendererProps) => React.ReactNode;\n}\n\nconst DynamicZone = ({\n attribute,\n disabled: disabledProp,\n hint,\n label,\n labelAction,\n name,\n required = false,\n children,\n}: DynamicZoneProps) => {\n // We cannot use the default props here\n const { max = Infinity, min = -Infinity } = attribute ?? {};\n\n const [addComponentIsOpen, setAddComponentIsOpen] = React.useState(false);\n const [liveText, setLiveText] = React.useState('');\n const [openComponentKey, setOpenComponentKey] = React.useState<string | null>(null);\n\n const {\n currentDocument: { components, isLoading },\n } = useDocumentContext('DynamicZone');\n\n const disabled = disabledProp || isLoading;\n const addFieldRow = useForm('DynamicZone', (state) => state.addFieldRow);\n const removeFieldRow = useForm('DynamicZone', (state) => state.removeFieldRow);\n const moveFieldRow = useForm('DynamicZone', (state) => state.moveFieldRow);\n\n type DzWithTempKey =\n Schema.Attribute.GetDynamicZoneValue<Schema.Attribute.DynamicZone>[number] & {\n __temp_key__: string;\n };\n\n const { value = [], error } = useField<Array<DzWithTempKey>>(name);\n\n /**\n * Track the previous value array to detect when a new component is added.\n * When the array grows, we find the newly added item and force its accordion open.\n * This mirrors the same pattern used in RepeatableComponent.\n */\n const prevValue = usePrev(value);\n\n React.useEffect(() => {\n if (prevValue && prevValue.length < value.length) {\n const prevKeys = new Set(prevValue.map((v) => v.__temp_key__));\n const newItem = value.find((v) => !prevKeys.has(v.__temp_key__));\n if (newItem) {\n setOpenComponentKey(newItem.__temp_key__);\n }\n } else if (openComponentKey !== null) {\n // Component was removed before forceOpen was handled — clear stale key\n const currentKeys = new Set(value.map((v) => v.__temp_key__));\n if (!currentKeys.has(openComponentKey)) {\n setOpenComponentKey(null);\n }\n }\n }, [value, prevValue, openComponentKey]);\n\n const handleForceOpenHandled = React.useCallback(() => {\n setOpenComponentKey(null);\n }, []);\n\n const dynamicComponentsByCategory = React.useMemo(() => {\n return attribute.components.reduce<\n NonNullable<DynamicComponentProps['dynamicComponentsByCategory']>\n >((acc, componentUid) => {\n const { category, info } = components[componentUid] ?? { info: {} };\n\n const component = { uid: componentUid, displayName: info.displayName, icon: info.icon };\n\n if (!acc[category]) {\n acc[category] = [];\n }\n\n acc[category] = [...acc[category], component];\n\n return acc;\n }, {});\n }, [attribute.components, components]);\n\n const { formatMessage } = useIntl();\n\n const { toggleNotification } = useNotification();\n\n const dynamicDisplayedComponentsLength = value.length;\n\n const handleAddComponent = React.useCallback(\n (uid: string, position?: number) => {\n setAddComponentIsOpen(false);\n\n const schema = components[uid];\n const form = createDefaultForm(schema, components);\n const transformations = pipe(transformDocument(schema, components), (data) => ({\n ...data,\n __component: uid,\n }));\n\n const data = transformations(form);\n\n addFieldRow(name, data, position);\n },\n [addFieldRow, components, name]\n );\n\n const handleClickOpenPicker = () => {\n if (dynamicDisplayedComponentsLength < max) {\n setAddComponentIsOpen((prev) => !prev);\n } else {\n toggleNotification({\n type: 'info',\n message: formatMessage({\n id: getTranslation('components.notification.info.maximum-requirement'),\n }),\n });\n }\n };\n\n const handleMoveComponent = React.useCallback(\n (newIndex: number, currentIndex: number) => {\n setLiveText(\n formatMessage(\n {\n id: getTranslation('dnd.reorder'),\n defaultMessage: '{item}, moved. New position in list: {position}.',\n },\n {\n item: `${name}.${currentIndex}`,\n position: `${newIndex + 1} of ${value.length}`,\n }\n )\n );\n\n moveFieldRow(name, currentIndex, newIndex);\n },\n [formatMessage, moveFieldRow, name, value.length]\n );\n\n const handleCancel = React.useCallback(\n (index: number) => {\n setLiveText(\n formatMessage(\n {\n id: getTranslation('dnd.cancel-item'),\n defaultMessage: '{item}, dropped. Re-order cancelled.',\n },\n {\n item: `${name}.${index}`,\n }\n )\n );\n },\n [formatMessage, name]\n );\n\n const handleGrabItem = React.useCallback(\n (index: number) => {\n setLiveText(\n formatMessage(\n {\n id: getTranslation('dnd.grab-item'),\n defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`,\n },\n {\n item: `${name}.${index}`,\n position: `${index + 1} of ${value.length}`,\n }\n )\n );\n },\n [formatMessage, name, value.length]\n );\n\n const handleDropItem = React.useCallback(\n (index: number) => {\n setLiveText(\n formatMessage(\n {\n id: getTranslation('dnd.drop-item'),\n defaultMessage: `{item}, dropped. Final position in list: {position}.`,\n },\n {\n item: `${name}.${index}`,\n position: `${index + 1} of ${value.length}`,\n }\n )\n );\n },\n [formatMessage, name, value.length]\n );\n\n const handleRemoveComponent = React.useCallback(\n (currentIndex: number) => {\n removeFieldRow(name, currentIndex);\n },\n [name, removeFieldRow]\n );\n\n const hasError = error !== undefined;\n\n const renderButtonLabel = () => {\n if (addComponentIsOpen) {\n return formatMessage({ id: 'app.utils.close-label', defaultMessage: 'Close' });\n }\n\n if (hasError && dynamicDisplayedComponentsLength > max) {\n return formatMessage(\n {\n id: getTranslation(`components.DynamicZone.extra-components`),\n defaultMessage:\n 'There {number, plural, =0 {are # extra components} one {is # extra component} other {are # extra components}}',\n },\n {\n number: dynamicDisplayedComponentsLength - max,\n }\n );\n }\n\n if (hasError && dynamicDisplayedComponentsLength < min) {\n return formatMessage(\n {\n id: getTranslation(`components.DynamicZone.missing-components`),\n defaultMessage:\n 'There {number, plural, =0 {are # missing components} one {is # missing component} other {are # missing components}}',\n },\n { number: min - dynamicDisplayedComponentsLength }\n );\n }\n\n return formatMessage(\n {\n id: getTranslation('components.DynamicZone.add-component'),\n defaultMessage: 'Add a component to {componentName}',\n },\n { componentName: label || name }\n );\n };\n\n const level = useComponent('DynamicZone', (state) => state.level);\n\n const ariaDescriptionId = React.useId();\n\n return (\n <DynamicZoneProvider isInDynamicZone>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={{ initial: 4, medium: 6 }}>\n {dynamicDisplayedComponentsLength > 0 && (\n <Box>\n <DynamicZoneLabel\n hint={hint}\n label={label}\n labelAction={labelAction}\n name={name}\n numberOfComponents={dynamicDisplayedComponentsLength}\n required={required}\n />\n <VisuallyHidden id={ariaDescriptionId}>\n {formatMessage({\n id: getTranslation('dnd.instructions'),\n defaultMessage: `Press spacebar to grab and re-order`,\n })}\n </VisuallyHidden>\n <VisuallyHidden aria-live=\"assertive\">{liveText}</VisuallyHidden>\n <ol aria-describedby={ariaDescriptionId}>\n {value.map((field, index) => (\n <ComponentProvider\n key={field.__temp_key__}\n level={level + 1}\n uid={field.__component}\n // id is always a number in a dynamic zone.\n id={field.id as number}\n type=\"dynamiczone\"\n >\n <DynamicComponent\n disabled={disabled}\n name={name}\n index={index}\n componentUid={field.__component}\n onMoveComponent={handleMoveComponent}\n onRemoveComponentClick={handleRemoveComponent}\n onCancel={handleCancel}\n onDropItem={handleDropItem}\n onGrabItem={handleGrabItem}\n onAddComponent={handleAddComponent}\n dynamicComponentsByCategory={dynamicComponentsByCategory}\n totalLength={dynamicDisplayedComponentsLength}\n forceOpen={openComponentKey === field.__temp_key__}\n onForceOpenHandled={handleForceOpenHandled}\n >\n {children}\n </DynamicComponent>\n </ComponentProvider>\n ))}\n </ol>\n </Box>\n )}\n <Flex justifyContent=\"center\">\n <AddComponentButton\n hasError={hasError}\n isDisabled={disabled}\n isOpen={addComponentIsOpen}\n onClick={handleClickOpenPicker}\n >\n {renderButtonLabel()}\n </AddComponentButton>\n </Flex>\n <ComponentPicker\n dynamicComponentsByCategory={dynamicComponentsByCategory}\n isOpen={addComponentIsOpen}\n onClickAddComponent={handleAddComponent}\n />\n </Flex>\n </DynamicZoneProvider>\n );\n};\n\nexport { DynamicZone, useDynamicZone };\nexport type { DynamicZoneProps };\n"],"names":["DynamicZoneProvider","useDynamicZone","createContext","isInDynamicZone","DynamicZone","attribute","disabled","disabledProp","hint","label","labelAction","name","required","children","max","Infinity","min","addComponentIsOpen","setAddComponentIsOpen","React","useState","liveText","setLiveText","openComponentKey","setOpenComponentKey","currentDocument","components","isLoading","useDocumentContext","addFieldRow","useForm","state","removeFieldRow","moveFieldRow","value","error","useField","prevValue","usePrev","useEffect","length","prevKeys","Set","map","v","__temp_key__","newItem","find","has","currentKeys","handleForceOpenHandled","useCallback","dynamicComponentsByCategory","useMemo","reduce","acc","componentUid","category","info","component","uid","displayName","icon","formatMessage","useIntl","toggleNotification","useNotification","dynamicDisplayedComponentsLength","handleAddComponent","position","schema","form","createDefaultForm","transformations","pipe","transformDocument","data","__component","handleClickOpenPicker","prev","type","message","id","getTranslation","handleMoveComponent","newIndex","currentIndex","defaultMessage","item","handleCancel","index","handleGrabItem","handleDropItem","handleRemoveComponent","hasError","undefined","renderButtonLabel","number","componentName","level","useComponent","ariaDescriptionId","useId","_jsx","_jsxs","Flex","direction","alignItems","gap","initial","medium","Box","DynamicZoneLabel","numberOfComponents","VisuallyHidden","aria-live","ol","aria-describedby","field","ComponentProvider","DynamicComponent","onMoveComponent","onRemoveComponentClick","onCancel","onDropItem","onGrabItem","onAddComponent","totalLength","forceOpen","onForceOpenHandled","justifyContent","AddComponentButton","isDisabled","isOpen","onClick","ComponentPicker","onClickAddComponent"],"mappings":"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"}
|
|
@@ -163,6 +163,9 @@ function useHasInputPopoverParent() {
|
|
|
163
163
|
}),
|
|
164
164
|
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Content, {
|
|
165
165
|
sideOffset: 4,
|
|
166
|
+
style: {
|
|
167
|
+
zIndex: 5
|
|
168
|
+
},
|
|
166
169
|
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
167
170
|
padding: 4,
|
|
168
171
|
width: "400px",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputPopover.js","sources":["../../../../admin/src/preview/components/InputPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, useNotification } from '@strapi/admin/strapi-admin';\nimport { Box, Popover } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { type UseDocument } from '../../hooks/useDocument';\nimport { InputRenderer } from '../../pages/EditView/components/InputRenderer';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS, PREVIEW_ERROR_MESSAGES } from '../utils/constants';\nimport {\n parseFieldMetaData,\n getAttributeSchemaFromPath,\n PreviewFieldError,\n} from '../utils/fieldUtils';\n\n/* -------------------------------------------------------------------------------------------------\n * Context utils\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * No need for actual data in the context. It's just to let children check if they're rendered\n * inside of a preview InputPopover without relying on prop drilling.\n */\ninterface InputPopoverContextValue {}\n\nconst [InputPopoverProvider, useInputPopoverContext] =\n createContext<InputPopoverContextValue>('InputPopover');\n\nfunction useHasInputPopoverParent() {\n const context = useInputPopoverContext('useHasInputPopoverParent', () => true, false);\n\n // useContext will return undefined if the called is not wrapped in the provider\n return context !== undefined;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * InputPopover\n * -----------------------------------------------------------------------------------------------*/\n\nconst InputPopover = ({ documentResponse }: { documentResponse: ReturnType<UseDocument> }) => {\n const iframeRef = usePreviewContext('InputPopover', (state) => state.iframeRef);\n const popoverField = usePreviewContext('InputPopover', (state) => state.popoverField);\n const setPopoverField = usePreviewContext('InputPopover', (state) => state.setPopoverField);\n const document = usePreviewContext('InputPopover', (state) => state.document);\n const schema = usePreviewContext('InputPopover', (state) => state.schema);\n const components = usePreviewContext('InputPopover', (state) => state.components);\n\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n\n React.useEffect(() => {\n /**\n * We receive window events sent from the user's preview via the injected script.\n * We listen to the ones here that target a specific field.\n */\n const handleMessage = (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {\n const fieldMetaData = parseFieldMetaData(event.data.payload.path);\n\n if (!fieldMetaData) {\n const { type, message } = PREVIEW_ERROR_MESSAGES.INCOMPLETE_STRAPI_SOURCE;\n toggleNotification({ type, message: formatMessage(message) });\n return;\n }\n\n /**\n * Ignore (for now) content that comes from separate API requests than the one for the\n * current document. This doesn't do anything about fields that may come from relations to\n * the current document however.\n */\n if (fieldMetaData.documentId !== document.documentId) {\n const { type, message } = PREVIEW_ERROR_MESSAGES.DIFFERENT_DOCUMENT;\n toggleNotification({ type, message: formatMessage(message) });\n return;\n }\n\n try {\n const attribute = getAttributeSchemaFromPath({\n path: fieldMetaData.path,\n components,\n schema,\n document,\n });\n\n // We're able to handle the field, set it in context so the popover can pick it up\n setPopoverField({ ...fieldMetaData, position: event.data.payload.position, attribute });\n } catch (error) {\n if (error instanceof PreviewFieldError) {\n const { type, message } = PREVIEW_ERROR_MESSAGES[error.messageKey];\n toggleNotification({ type, message: formatMessage(message) });\n } else if (error instanceof Error) {\n toggleNotification({ type: 'danger', message: error.message });\n }\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_SINGLE_CLICK_HINT) {\n toggleNotification({\n type: 'info',\n message: formatMessage({\n id: 'content-manager.preview.info.single-click-hint',\n defaultMessage: 'Double click to edit',\n }),\n });\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [components, document, iframeRef, schema, setPopoverField, toggleNotification, formatMessage]);\n if (!popoverField || !iframeRef.current) {\n return null;\n }\n\n const iframeRect = iframeRef.current.getBoundingClientRect();\n\n return (\n <>\n {/**\n * Overlay an empty div on top of the iframe while the popover is open so it can\n * intercept clicks. Without it, we wouldn't be able to close the popover by clicking outside,\n * because the click would be detected by the iframe window, not by the admin.\n **/}\n <Box\n position={'fixed'}\n top={iframeRect.top + 'px'}\n left={iframeRect.left + 'px'}\n width={iframeRect.width + 'px'}\n height={iframeRect.height + 'px'}\n zIndex={4}\n onClick={() => iframeRef.current?.focus()}\n />\n <InputPopoverProvider>\n <Popover.Root open={true} onOpenChange={(open) => !open && setPopoverField(null)}>\n <Popover.Trigger>\n <Box\n position=\"fixed\"\n width={popoverField.position.width + 'px'}\n height={popoverField.position.height + 'px'}\n top={0}\n left={0}\n transform={`translate(${iframeRect.left + popoverField.position.left}px, ${iframeRect.top + popoverField.position.top}px)`}\n />\n </Popover.Trigger>\n <Popover.Content sideOffset={4}>\n <Box padding={4} width=\"400px\">\n {/* @ts-expect-error the types of `attribute` clash for some reason */}\n <InputRenderer\n document={documentResponse}\n attribute={popoverField.attribute}\n // TODO: retrieve the proper label from the layout\n label={popoverField.path}\n name={popoverField.path}\n type={popoverField.attribute.type}\n visible={true}\n />\n </Box>\n </Popover.Content>\n </Popover.Root>\n </InputPopoverProvider>\n </>\n );\n};\n\nexport { InputPopover, useHasInputPopoverParent };\n"],"names":["InputPopoverProvider","useInputPopoverContext","createContext","useHasInputPopoverParent","context","undefined","InputPopover","documentResponse","iframeRef","usePreviewContext","state","popoverField","setPopoverField","document","schema","components","toggleNotification","useNotification","formatMessage","useIntl","React","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS_INTENT","fieldMetaData","parseFieldMetaData","payload","path","message","PREVIEW_ERROR_MESSAGES","INCOMPLETE_STRAPI_SOURCE","documentId","DIFFERENT_DOCUMENT","attribute","getAttributeSchemaFromPath","position","error","PreviewFieldError","messageKey","Error","STRAPI_FIELD_SINGLE_CLICK_HINT","id","defaultMessage","window","addEventListener","removeEventListener","iframeRect","getBoundingClientRect","_jsxs","_Fragment","_jsx","Box","top","left","width","height","zIndex","onClick","focus","Popover","Root","open","onOpenChange","Trigger","transform","Content","sideOffset","padding","InputRenderer","label","name","visible"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InputPopover.js","sources":["../../../../admin/src/preview/components/InputPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, useNotification } from '@strapi/admin/strapi-admin';\nimport { Box, Popover } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { type UseDocument } from '../../hooks/useDocument';\nimport { InputRenderer } from '../../pages/EditView/components/InputRenderer';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS, PREVIEW_ERROR_MESSAGES } from '../utils/constants';\nimport {\n parseFieldMetaData,\n getAttributeSchemaFromPath,\n PreviewFieldError,\n} from '../utils/fieldUtils';\n\n/* -------------------------------------------------------------------------------------------------\n * Context utils\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * No need for actual data in the context. It's just to let children check if they're rendered\n * inside of a preview InputPopover without relying on prop drilling.\n */\ninterface InputPopoverContextValue {}\n\nconst [InputPopoverProvider, useInputPopoverContext] =\n createContext<InputPopoverContextValue>('InputPopover');\n\nfunction useHasInputPopoverParent() {\n const context = useInputPopoverContext('useHasInputPopoverParent', () => true, false);\n\n // useContext will return undefined if the called is not wrapped in the provider\n return context !== undefined;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * InputPopover\n * -----------------------------------------------------------------------------------------------*/\n\nconst InputPopover = ({ documentResponse }: { documentResponse: ReturnType<UseDocument> }) => {\n const iframeRef = usePreviewContext('InputPopover', (state) => state.iframeRef);\n const popoverField = usePreviewContext('InputPopover', (state) => state.popoverField);\n const setPopoverField = usePreviewContext('InputPopover', (state) => state.setPopoverField);\n const document = usePreviewContext('InputPopover', (state) => state.document);\n const schema = usePreviewContext('InputPopover', (state) => state.schema);\n const components = usePreviewContext('InputPopover', (state) => state.components);\n\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n\n React.useEffect(() => {\n /**\n * We receive window events sent from the user's preview via the injected script.\n * We listen to the ones here that target a specific field.\n */\n const handleMessage = (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {\n const fieldMetaData = parseFieldMetaData(event.data.payload.path);\n\n if (!fieldMetaData) {\n const { type, message } = PREVIEW_ERROR_MESSAGES.INCOMPLETE_STRAPI_SOURCE;\n toggleNotification({ type, message: formatMessage(message) });\n return;\n }\n\n /**\n * Ignore (for now) content that comes from separate API requests than the one for the\n * current document. This doesn't do anything about fields that may come from relations to\n * the current document however.\n */\n if (fieldMetaData.documentId !== document.documentId) {\n const { type, message } = PREVIEW_ERROR_MESSAGES.DIFFERENT_DOCUMENT;\n toggleNotification({ type, message: formatMessage(message) });\n return;\n }\n\n try {\n const attribute = getAttributeSchemaFromPath({\n path: fieldMetaData.path,\n components,\n schema,\n document,\n });\n\n // We're able to handle the field, set it in context so the popover can pick it up\n setPopoverField({ ...fieldMetaData, position: event.data.payload.position, attribute });\n } catch (error) {\n if (error instanceof PreviewFieldError) {\n const { type, message } = PREVIEW_ERROR_MESSAGES[error.messageKey];\n toggleNotification({ type, message: formatMessage(message) });\n } else if (error instanceof Error) {\n toggleNotification({ type: 'danger', message: error.message });\n }\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_SINGLE_CLICK_HINT) {\n toggleNotification({\n type: 'info',\n message: formatMessage({\n id: 'content-manager.preview.info.single-click-hint',\n defaultMessage: 'Double click to edit',\n }),\n });\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [components, document, iframeRef, schema, setPopoverField, toggleNotification, formatMessage]);\n if (!popoverField || !iframeRef.current) {\n return null;\n }\n\n const iframeRect = iframeRef.current.getBoundingClientRect();\n\n return (\n <>\n {/**\n * Overlay an empty div on top of the iframe while the popover is open so it can\n * intercept clicks. Without it, we wouldn't be able to close the popover by clicking outside,\n * because the click would be detected by the iframe window, not by the admin.\n **/}\n <Box\n position={'fixed'}\n top={iframeRect.top + 'px'}\n left={iframeRect.left + 'px'}\n width={iframeRect.width + 'px'}\n height={iframeRect.height + 'px'}\n zIndex={4}\n onClick={() => iframeRef.current?.focus()}\n />\n <InputPopoverProvider>\n <Popover.Root open={true} onOpenChange={(open) => !open && setPopoverField(null)}>\n <Popover.Trigger>\n <Box\n position=\"fixed\"\n width={popoverField.position.width + 'px'}\n height={popoverField.position.height + 'px'}\n top={0}\n left={0}\n transform={`translate(${iframeRect.left + popoverField.position.left}px, ${iframeRect.top + popoverField.position.top}px)`}\n />\n </Popover.Trigger>\n <Popover.Content sideOffset={4} style={{ zIndex: 5 }}>\n <Box padding={4} width=\"400px\">\n {/* @ts-expect-error the types of `attribute` clash for some reason */}\n <InputRenderer\n document={documentResponse}\n attribute={popoverField.attribute}\n // TODO: retrieve the proper label from the layout\n label={popoverField.path}\n name={popoverField.path}\n type={popoverField.attribute.type}\n visible={true}\n />\n </Box>\n </Popover.Content>\n </Popover.Root>\n </InputPopoverProvider>\n </>\n );\n};\n\nexport { InputPopover, useHasInputPopoverParent };\n"],"names":["InputPopoverProvider","useInputPopoverContext","createContext","useHasInputPopoverParent","context","undefined","InputPopover","documentResponse","iframeRef","usePreviewContext","state","popoverField","setPopoverField","document","schema","components","toggleNotification","useNotification","formatMessage","useIntl","React","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS_INTENT","fieldMetaData","parseFieldMetaData","payload","path","message","PREVIEW_ERROR_MESSAGES","INCOMPLETE_STRAPI_SOURCE","documentId","DIFFERENT_DOCUMENT","attribute","getAttributeSchemaFromPath","position","error","PreviewFieldError","messageKey","Error","STRAPI_FIELD_SINGLE_CLICK_HINT","id","defaultMessage","window","addEventListener","removeEventListener","iframeRect","getBoundingClientRect","_jsxs","_Fragment","_jsx","Box","top","left","width","height","zIndex","onClick","focus","Popover","Root","open","onOpenChange","Trigger","transform","Content","sideOffset","style","padding","InputRenderer","label","name","visible"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputPopover.mjs","sources":["../../../../admin/src/preview/components/InputPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, useNotification } from '@strapi/admin/strapi-admin';\nimport { Box, Popover } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { type UseDocument } from '../../hooks/useDocument';\nimport { InputRenderer } from '../../pages/EditView/components/InputRenderer';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS, PREVIEW_ERROR_MESSAGES } from '../utils/constants';\nimport {\n parseFieldMetaData,\n getAttributeSchemaFromPath,\n PreviewFieldError,\n} from '../utils/fieldUtils';\n\n/* -------------------------------------------------------------------------------------------------\n * Context utils\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * No need for actual data in the context. It's just to let children check if they're rendered\n * inside of a preview InputPopover without relying on prop drilling.\n */\ninterface InputPopoverContextValue {}\n\nconst [InputPopoverProvider, useInputPopoverContext] =\n createContext<InputPopoverContextValue>('InputPopover');\n\nfunction useHasInputPopoverParent() {\n const context = useInputPopoverContext('useHasInputPopoverParent', () => true, false);\n\n // useContext will return undefined if the called is not wrapped in the provider\n return context !== undefined;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * InputPopover\n * -----------------------------------------------------------------------------------------------*/\n\nconst InputPopover = ({ documentResponse }: { documentResponse: ReturnType<UseDocument> }) => {\n const iframeRef = usePreviewContext('InputPopover', (state) => state.iframeRef);\n const popoverField = usePreviewContext('InputPopover', (state) => state.popoverField);\n const setPopoverField = usePreviewContext('InputPopover', (state) => state.setPopoverField);\n const document = usePreviewContext('InputPopover', (state) => state.document);\n const schema = usePreviewContext('InputPopover', (state) => state.schema);\n const components = usePreviewContext('InputPopover', (state) => state.components);\n\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n\n React.useEffect(() => {\n /**\n * We receive window events sent from the user's preview via the injected script.\n * We listen to the ones here that target a specific field.\n */\n const handleMessage = (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {\n const fieldMetaData = parseFieldMetaData(event.data.payload.path);\n\n if (!fieldMetaData) {\n const { type, message } = PREVIEW_ERROR_MESSAGES.INCOMPLETE_STRAPI_SOURCE;\n toggleNotification({ type, message: formatMessage(message) });\n return;\n }\n\n /**\n * Ignore (for now) content that comes from separate API requests than the one for the\n * current document. This doesn't do anything about fields that may come from relations to\n * the current document however.\n */\n if (fieldMetaData.documentId !== document.documentId) {\n const { type, message } = PREVIEW_ERROR_MESSAGES.DIFFERENT_DOCUMENT;\n toggleNotification({ type, message: formatMessage(message) });\n return;\n }\n\n try {\n const attribute = getAttributeSchemaFromPath({\n path: fieldMetaData.path,\n components,\n schema,\n document,\n });\n\n // We're able to handle the field, set it in context so the popover can pick it up\n setPopoverField({ ...fieldMetaData, position: event.data.payload.position, attribute });\n } catch (error) {\n if (error instanceof PreviewFieldError) {\n const { type, message } = PREVIEW_ERROR_MESSAGES[error.messageKey];\n toggleNotification({ type, message: formatMessage(message) });\n } else if (error instanceof Error) {\n toggleNotification({ type: 'danger', message: error.message });\n }\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_SINGLE_CLICK_HINT) {\n toggleNotification({\n type: 'info',\n message: formatMessage({\n id: 'content-manager.preview.info.single-click-hint',\n defaultMessage: 'Double click to edit',\n }),\n });\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [components, document, iframeRef, schema, setPopoverField, toggleNotification, formatMessage]);\n if (!popoverField || !iframeRef.current) {\n return null;\n }\n\n const iframeRect = iframeRef.current.getBoundingClientRect();\n\n return (\n <>\n {/**\n * Overlay an empty div on top of the iframe while the popover is open so it can\n * intercept clicks. Without it, we wouldn't be able to close the popover by clicking outside,\n * because the click would be detected by the iframe window, not by the admin.\n **/}\n <Box\n position={'fixed'}\n top={iframeRect.top + 'px'}\n left={iframeRect.left + 'px'}\n width={iframeRect.width + 'px'}\n height={iframeRect.height + 'px'}\n zIndex={4}\n onClick={() => iframeRef.current?.focus()}\n />\n <InputPopoverProvider>\n <Popover.Root open={true} onOpenChange={(open) => !open && setPopoverField(null)}>\n <Popover.Trigger>\n <Box\n position=\"fixed\"\n width={popoverField.position.width + 'px'}\n height={popoverField.position.height + 'px'}\n top={0}\n left={0}\n transform={`translate(${iframeRect.left + popoverField.position.left}px, ${iframeRect.top + popoverField.position.top}px)`}\n />\n </Popover.Trigger>\n <Popover.Content sideOffset={4}>\n <Box padding={4} width=\"400px\">\n {/* @ts-expect-error the types of `attribute` clash for some reason */}\n <InputRenderer\n document={documentResponse}\n attribute={popoverField.attribute}\n // TODO: retrieve the proper label from the layout\n label={popoverField.path}\n name={popoverField.path}\n type={popoverField.attribute.type}\n visible={true}\n />\n </Box>\n </Popover.Content>\n </Popover.Root>\n </InputPopoverProvider>\n </>\n );\n};\n\nexport { InputPopover, useHasInputPopoverParent };\n"],"names":["InputPopoverProvider","useInputPopoverContext","createContext","useHasInputPopoverParent","context","undefined","InputPopover","documentResponse","iframeRef","usePreviewContext","state","popoverField","setPopoverField","document","schema","components","toggleNotification","useNotification","formatMessage","useIntl","React","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS_INTENT","fieldMetaData","parseFieldMetaData","payload","path","message","PREVIEW_ERROR_MESSAGES","INCOMPLETE_STRAPI_SOURCE","documentId","DIFFERENT_DOCUMENT","attribute","getAttributeSchemaFromPath","position","error","PreviewFieldError","messageKey","Error","STRAPI_FIELD_SINGLE_CLICK_HINT","id","defaultMessage","window","addEventListener","removeEventListener","iframeRect","getBoundingClientRect","_jsxs","_Fragment","_jsx","Box","top","left","width","height","zIndex","onClick","focus","Popover","Root","open","onOpenChange","Trigger","transform","Content","sideOffset","padding","InputRenderer","label","name","visible"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InputPopover.mjs","sources":["../../../../admin/src/preview/components/InputPopover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, useNotification } from '@strapi/admin/strapi-admin';\nimport { Box, Popover } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { type UseDocument } from '../../hooks/useDocument';\nimport { InputRenderer } from '../../pages/EditView/components/InputRenderer';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS, PREVIEW_ERROR_MESSAGES } from '../utils/constants';\nimport {\n parseFieldMetaData,\n getAttributeSchemaFromPath,\n PreviewFieldError,\n} from '../utils/fieldUtils';\n\n/* -------------------------------------------------------------------------------------------------\n * Context utils\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * No need for actual data in the context. It's just to let children check if they're rendered\n * inside of a preview InputPopover without relying on prop drilling.\n */\ninterface InputPopoverContextValue {}\n\nconst [InputPopoverProvider, useInputPopoverContext] =\n createContext<InputPopoverContextValue>('InputPopover');\n\nfunction useHasInputPopoverParent() {\n const context = useInputPopoverContext('useHasInputPopoverParent', () => true, false);\n\n // useContext will return undefined if the called is not wrapped in the provider\n return context !== undefined;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * InputPopover\n * -----------------------------------------------------------------------------------------------*/\n\nconst InputPopover = ({ documentResponse }: { documentResponse: ReturnType<UseDocument> }) => {\n const iframeRef = usePreviewContext('InputPopover', (state) => state.iframeRef);\n const popoverField = usePreviewContext('InputPopover', (state) => state.popoverField);\n const setPopoverField = usePreviewContext('InputPopover', (state) => state.setPopoverField);\n const document = usePreviewContext('InputPopover', (state) => state.document);\n const schema = usePreviewContext('InputPopover', (state) => state.schema);\n const components = usePreviewContext('InputPopover', (state) => state.components);\n\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n\n React.useEffect(() => {\n /**\n * We receive window events sent from the user's preview via the injected script.\n * We listen to the ones here that target a specific field.\n */\n const handleMessage = (event: MessageEvent) => {\n // Only listen to events from the preview iframe\n if (iframeRef.current) {\n const previewOrigin = new URL(iframeRef.current?.src).origin;\n if (event.origin !== previewOrigin) {\n return;\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT) {\n const fieldMetaData = parseFieldMetaData(event.data.payload.path);\n\n if (!fieldMetaData) {\n const { type, message } = PREVIEW_ERROR_MESSAGES.INCOMPLETE_STRAPI_SOURCE;\n toggleNotification({ type, message: formatMessage(message) });\n return;\n }\n\n /**\n * Ignore (for now) content that comes from separate API requests than the one for the\n * current document. This doesn't do anything about fields that may come from relations to\n * the current document however.\n */\n if (fieldMetaData.documentId !== document.documentId) {\n const { type, message } = PREVIEW_ERROR_MESSAGES.DIFFERENT_DOCUMENT;\n toggleNotification({ type, message: formatMessage(message) });\n return;\n }\n\n try {\n const attribute = getAttributeSchemaFromPath({\n path: fieldMetaData.path,\n components,\n schema,\n document,\n });\n\n // We're able to handle the field, set it in context so the popover can pick it up\n setPopoverField({ ...fieldMetaData, position: event.data.payload.position, attribute });\n } catch (error) {\n if (error instanceof PreviewFieldError) {\n const { type, message } = PREVIEW_ERROR_MESSAGES[error.messageKey];\n toggleNotification({ type, message: formatMessage(message) });\n } else if (error instanceof Error) {\n toggleNotification({ type: 'danger', message: error.message });\n }\n }\n }\n\n if (event.data?.type === INTERNAL_EVENTS.STRAPI_FIELD_SINGLE_CLICK_HINT) {\n toggleNotification({\n type: 'info',\n message: formatMessage({\n id: 'content-manager.preview.info.single-click-hint',\n defaultMessage: 'Double click to edit',\n }),\n });\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [components, document, iframeRef, schema, setPopoverField, toggleNotification, formatMessage]);\n if (!popoverField || !iframeRef.current) {\n return null;\n }\n\n const iframeRect = iframeRef.current.getBoundingClientRect();\n\n return (\n <>\n {/**\n * Overlay an empty div on top of the iframe while the popover is open so it can\n * intercept clicks. Without it, we wouldn't be able to close the popover by clicking outside,\n * because the click would be detected by the iframe window, not by the admin.\n **/}\n <Box\n position={'fixed'}\n top={iframeRect.top + 'px'}\n left={iframeRect.left + 'px'}\n width={iframeRect.width + 'px'}\n height={iframeRect.height + 'px'}\n zIndex={4}\n onClick={() => iframeRef.current?.focus()}\n />\n <InputPopoverProvider>\n <Popover.Root open={true} onOpenChange={(open) => !open && setPopoverField(null)}>\n <Popover.Trigger>\n <Box\n position=\"fixed\"\n width={popoverField.position.width + 'px'}\n height={popoverField.position.height + 'px'}\n top={0}\n left={0}\n transform={`translate(${iframeRect.left + popoverField.position.left}px, ${iframeRect.top + popoverField.position.top}px)`}\n />\n </Popover.Trigger>\n <Popover.Content sideOffset={4} style={{ zIndex: 5 }}>\n <Box padding={4} width=\"400px\">\n {/* @ts-expect-error the types of `attribute` clash for some reason */}\n <InputRenderer\n document={documentResponse}\n attribute={popoverField.attribute}\n // TODO: retrieve the proper label from the layout\n label={popoverField.path}\n name={popoverField.path}\n type={popoverField.attribute.type}\n visible={true}\n />\n </Box>\n </Popover.Content>\n </Popover.Root>\n </InputPopoverProvider>\n </>\n );\n};\n\nexport { InputPopover, useHasInputPopoverParent };\n"],"names":["InputPopoverProvider","useInputPopoverContext","createContext","useHasInputPopoverParent","context","undefined","InputPopover","documentResponse","iframeRef","usePreviewContext","state","popoverField","setPopoverField","document","schema","components","toggleNotification","useNotification","formatMessage","useIntl","React","useEffect","handleMessage","event","current","previewOrigin","URL","src","origin","data","type","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS_INTENT","fieldMetaData","parseFieldMetaData","payload","path","message","PREVIEW_ERROR_MESSAGES","INCOMPLETE_STRAPI_SOURCE","documentId","DIFFERENT_DOCUMENT","attribute","getAttributeSchemaFromPath","position","error","PreviewFieldError","messageKey","Error","STRAPI_FIELD_SINGLE_CLICK_HINT","id","defaultMessage","window","addEventListener","removeEventListener","iframeRect","getBoundingClientRect","_jsxs","_Fragment","_jsx","Box","top","left","width","height","zIndex","onClick","focus","Popover","Root","open","onOpenChange","Trigger","transform","Content","sideOffset","style","padding","InputRenderer","label","name","visible"],"mappings":"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"}
|
|
@@ -55,6 +55,30 @@ function usePreviewInputManager(name, attribute) {
|
|
|
55
55
|
iframe,
|
|
56
56
|
type
|
|
57
57
|
]);
|
|
58
|
+
// Track previous value to detect media deletion
|
|
59
|
+
const prevValueRef = React__namespace.useRef(value);
|
|
60
|
+
React__namespace.useEffect(()=>{
|
|
61
|
+
// Only run inside popover for media fields
|
|
62
|
+
if (!hasInputPopoverParent || !setPopoverField || type !== 'media') {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const currentValue = value;
|
|
66
|
+
const previousValue = prevValueRef.current;
|
|
67
|
+
// Check if we transitioned from having a value to null/empty
|
|
68
|
+
const hadValue = previousValue != null && (Array.isArray(previousValue) ? previousValue.length > 0 : true);
|
|
69
|
+
const hasNoValue = currentValue == null || (Array.isArray(currentValue) ? currentValue.length === 0 : false);
|
|
70
|
+
if (hadValue && hasNoValue) {
|
|
71
|
+
// Media was deleted, close the popover
|
|
72
|
+
setPopoverField(null);
|
|
73
|
+
}
|
|
74
|
+
// Update ref for next comparison
|
|
75
|
+
prevValueRef.current = currentValue;
|
|
76
|
+
}, [
|
|
77
|
+
value,
|
|
78
|
+
hasInputPopoverParent,
|
|
79
|
+
setPopoverField,
|
|
80
|
+
type
|
|
81
|
+
]);
|
|
58
82
|
const sendMessage = getSendMessage.getSendMessage(iframe);
|
|
59
83
|
return {
|
|
60
84
|
onFocus: ()=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePreviewInputManager.js","sources":["../../../../admin/src/preview/hooks/usePreviewInputManager.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Schema } from '@strapi/types';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\ntype PreviewInputProps = Pick<\n Required<React.InputHTMLAttributes<HTMLInputElement>>,\n 'onFocus' | 'onBlur'\n>;\n\nexport function usePreviewInputManager(\n name: string,\n attribute: Schema.Attribute.AnyAttribute\n): PreviewInputProps {\n const iframe = usePreviewContext('usePreviewInputManager', (state) => state.iframeRef, false);\n const setPopoverField = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.setPopoverField,\n false\n );\n const hasInputPopoverParent = useHasInputPopoverParent();\n const { value } = useField(name);\n const { type } = attribute;\n\n React.useEffect(() => {\n if (!iframe || !type) {\n return;\n }\n\n /**\n * Only send message if the field is not a data structure (component, dynamic zone)\n * because we already send events for their fields\n */\n if (!['component', 'dynamiczone'].includes(type)) {\n const sendMessage = getSendMessage(iframe);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value });\n }\n }, [name, value, iframe, type]);\n\n const sendMessage = getSendMessage(iframe);\n\n return {\n onFocus: () => {\n if (hasInputPopoverParent) return;\n\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS, { field: name });\n },\n onBlur: () => {\n if (hasInputPopoverParent) return;\n\n setPopoverField?.(null);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_BLUR, { field: name });\n },\n };\n}\n"],"names":["usePreviewInputManager","name","attribute","iframe","usePreviewContext","state","iframeRef","setPopoverField","hasInputPopoverParent","useHasInputPopoverParent","value","useField","type","React","useEffect","includes","sendMessage","getSendMessage","INTERNAL_EVENTS","STRAPI_FIELD_CHANGE","field","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,SAASA,sBAAAA,CACdC,IAAY,EACZC,SAAwC,EAAA;AAExC,IAAA,MAAMC,SAASC,yBAAAA,CAAkB,wBAAA,EAA0B,CAACC,KAAAA,GAAUA,KAAAA,CAAMC,SAAS,EAAE,KAAA,CAAA;AACvF,IAAA,MAAMC,kBAAkBH,yBAAAA,CACtB,wBAAA,EACA,CAACC,KAAAA,GAAUA,KAAAA,CAAME,eAAe,EAChC,KAAA,CAAA;AAEF,IAAA,MAAMC,qBAAAA,GAAwBC,qCAAAA,EAAAA;AAC9B,IAAA,MAAM,EAAEC,KAAK,EAAE,GAAGC,oBAAAA,CAASV,IAAAA,CAAAA;IAC3B,MAAM,EAAEW,IAAI,EAAE,GAAGV,SAAAA;AAEjBW,IAAAA,gBAAAA,CAAMC,SAAS,CAAC,IAAA;QACd,IAAI,CAACX,MAAAA,IAAU,CAACS,IAAAA,EAAM;AACpB,YAAA;AACF,QAAA;AAEA;;;AAGC,QACD,IAAI,CAAC;AAAC,YAAA,WAAA;AAAa,YAAA;SAAc,CAACG,QAAQ,CAACH,IAAAA,CAAAA,EAAO;AAChD,YAAA,MAAMI,cAAcC,6BAAAA,CAAed,MAAAA,CAAAA;YACnCa,WAAAA,CAAYE,yBAAAA,CAAgBC,mBAAmB,EAAE;gBAAEC,KAAAA,EAAOnB,IAAAA;AAAMS,gBAAAA;AAAM,aAAA,CAAA;AACxE,QAAA;IACF,CAAA,EAAG;AAACT,QAAAA,IAAAA;AAAMS,QAAAA,KAAAA;AAAOP,QAAAA,MAAAA;AAAQS,QAAAA;AAAK,KAAA,CAAA;
|
|
1
|
+
{"version":3,"file":"usePreviewInputManager.js","sources":["../../../../admin/src/preview/hooks/usePreviewInputManager.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Schema } from '@strapi/types';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\ntype PreviewInputProps = Pick<\n Required<React.InputHTMLAttributes<HTMLInputElement>>,\n 'onFocus' | 'onBlur'\n>;\n\nexport function usePreviewInputManager(\n name: string,\n attribute: Schema.Attribute.AnyAttribute\n): PreviewInputProps {\n const iframe = usePreviewContext('usePreviewInputManager', (state) => state.iframeRef, false);\n const setPopoverField = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.setPopoverField,\n false\n );\n const hasInputPopoverParent = useHasInputPopoverParent();\n const { value } = useField(name);\n const { type } = attribute;\n\n React.useEffect(() => {\n if (!iframe || !type) {\n return;\n }\n\n /**\n * Only send message if the field is not a data structure (component, dynamic zone)\n * because we already send events for their fields\n */\n if (!['component', 'dynamiczone'].includes(type)) {\n const sendMessage = getSendMessage(iframe);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value });\n }\n }, [name, value, iframe, type]);\n\n // Track previous value to detect media deletion\n const prevValueRef = React.useRef(value);\n\n React.useEffect(() => {\n // Only run inside popover for media fields\n if (!hasInputPopoverParent || !setPopoverField || type !== 'media') {\n return;\n }\n\n const currentValue = value;\n const previousValue = prevValueRef.current;\n\n // Check if we transitioned from having a value to null/empty\n const hadValue =\n previousValue != null && (Array.isArray(previousValue) ? previousValue.length > 0 : true);\n const hasNoValue =\n currentValue == null || (Array.isArray(currentValue) ? currentValue.length === 0 : false);\n\n if (hadValue && hasNoValue) {\n // Media was deleted, close the popover\n setPopoverField(null);\n }\n\n // Update ref for next comparison\n prevValueRef.current = currentValue;\n }, [value, hasInputPopoverParent, setPopoverField, type]);\n\n const sendMessage = getSendMessage(iframe);\n\n return {\n onFocus: () => {\n if (hasInputPopoverParent) return;\n\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS, { field: name });\n },\n onBlur: () => {\n if (hasInputPopoverParent) return;\n\n setPopoverField?.(null);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_BLUR, { field: name });\n },\n };\n}\n"],"names":["usePreviewInputManager","name","attribute","iframe","usePreviewContext","state","iframeRef","setPopoverField","hasInputPopoverParent","useHasInputPopoverParent","value","useField","type","React","useEffect","includes","sendMessage","getSendMessage","INTERNAL_EVENTS","STRAPI_FIELD_CHANGE","field","prevValueRef","useRef","currentValue","previousValue","current","hadValue","Array","isArray","length","hasNoValue","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":"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"}
|
|
@@ -34,6 +34,30 @@ function usePreviewInputManager(name, attribute) {
|
|
|
34
34
|
iframe,
|
|
35
35
|
type
|
|
36
36
|
]);
|
|
37
|
+
// Track previous value to detect media deletion
|
|
38
|
+
const prevValueRef = React.useRef(value);
|
|
39
|
+
React.useEffect(()=>{
|
|
40
|
+
// Only run inside popover for media fields
|
|
41
|
+
if (!hasInputPopoverParent || !setPopoverField || type !== 'media') {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const currentValue = value;
|
|
45
|
+
const previousValue = prevValueRef.current;
|
|
46
|
+
// Check if we transitioned from having a value to null/empty
|
|
47
|
+
const hadValue = previousValue != null && (Array.isArray(previousValue) ? previousValue.length > 0 : true);
|
|
48
|
+
const hasNoValue = currentValue == null || (Array.isArray(currentValue) ? currentValue.length === 0 : false);
|
|
49
|
+
if (hadValue && hasNoValue) {
|
|
50
|
+
// Media was deleted, close the popover
|
|
51
|
+
setPopoverField(null);
|
|
52
|
+
}
|
|
53
|
+
// Update ref for next comparison
|
|
54
|
+
prevValueRef.current = currentValue;
|
|
55
|
+
}, [
|
|
56
|
+
value,
|
|
57
|
+
hasInputPopoverParent,
|
|
58
|
+
setPopoverField,
|
|
59
|
+
type
|
|
60
|
+
]);
|
|
37
61
|
const sendMessage = getSendMessage(iframe);
|
|
38
62
|
return {
|
|
39
63
|
onFocus: ()=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePreviewInputManager.mjs","sources":["../../../../admin/src/preview/hooks/usePreviewInputManager.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Schema } from '@strapi/types';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\ntype PreviewInputProps = Pick<\n Required<React.InputHTMLAttributes<HTMLInputElement>>,\n 'onFocus' | 'onBlur'\n>;\n\nexport function usePreviewInputManager(\n name: string,\n attribute: Schema.Attribute.AnyAttribute\n): PreviewInputProps {\n const iframe = usePreviewContext('usePreviewInputManager', (state) => state.iframeRef, false);\n const setPopoverField = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.setPopoverField,\n false\n );\n const hasInputPopoverParent = useHasInputPopoverParent();\n const { value } = useField(name);\n const { type } = attribute;\n\n React.useEffect(() => {\n if (!iframe || !type) {\n return;\n }\n\n /**\n * Only send message if the field is not a data structure (component, dynamic zone)\n * because we already send events for their fields\n */\n if (!['component', 'dynamiczone'].includes(type)) {\n const sendMessage = getSendMessage(iframe);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value });\n }\n }, [name, value, iframe, type]);\n\n const sendMessage = getSendMessage(iframe);\n\n return {\n onFocus: () => {\n if (hasInputPopoverParent) return;\n\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS, { field: name });\n },\n onBlur: () => {\n if (hasInputPopoverParent) return;\n\n setPopoverField?.(null);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_BLUR, { field: name });\n },\n };\n}\n"],"names":["usePreviewInputManager","name","attribute","iframe","usePreviewContext","state","iframeRef","setPopoverField","hasInputPopoverParent","useHasInputPopoverParent","value","useField","type","React","useEffect","includes","sendMessage","getSendMessage","INTERNAL_EVENTS","STRAPI_FIELD_CHANGE","field","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":";;;;;;;AAeO,SAASA,sBAAAA,CACdC,IAAY,EACZC,SAAwC,EAAA;AAExC,IAAA,MAAMC,SAASC,iBAAAA,CAAkB,wBAAA,EAA0B,CAACC,KAAAA,GAAUA,KAAAA,CAAMC,SAAS,EAAE,KAAA,CAAA;AACvF,IAAA,MAAMC,kBAAkBH,iBAAAA,CACtB,wBAAA,EACA,CAACC,KAAAA,GAAUA,KAAAA,CAAME,eAAe,EAChC,KAAA,CAAA;AAEF,IAAA,MAAMC,qBAAAA,GAAwBC,wBAAAA,EAAAA;AAC9B,IAAA,MAAM,EAAEC,KAAK,EAAE,GAAGC,QAAAA,CAASV,IAAAA,CAAAA;IAC3B,MAAM,EAAEW,IAAI,EAAE,GAAGV,SAAAA;AAEjBW,IAAAA,KAAAA,CAAMC,SAAS,CAAC,IAAA;QACd,IAAI,CAACX,MAAAA,IAAU,CAACS,IAAAA,EAAM;AACpB,YAAA;AACF,QAAA;AAEA;;;AAGC,QACD,IAAI,CAAC;AAAC,YAAA,WAAA;AAAa,YAAA;SAAc,CAACG,QAAQ,CAACH,IAAAA,CAAAA,EAAO;AAChD,YAAA,MAAMI,cAAcC,cAAAA,CAAed,MAAAA,CAAAA;YACnCa,WAAAA,CAAYE,eAAAA,CAAgBC,mBAAmB,EAAE;gBAAEC,KAAAA,EAAOnB,IAAAA;AAAMS,gBAAAA;AAAM,aAAA,CAAA;AACxE,QAAA;IACF,CAAA,EAAG;AAACT,QAAAA,IAAAA;AAAMS,QAAAA,KAAAA;AAAOP,QAAAA,MAAAA;AAAQS,QAAAA;AAAK,KAAA,CAAA;
|
|
1
|
+
{"version":3,"file":"usePreviewInputManager.mjs","sources":["../../../../admin/src/preview/hooks/usePreviewInputManager.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Schema } from '@strapi/types';\n\nimport { useHasInputPopoverParent } from '../components/InputPopover';\nimport { usePreviewContext } from '../pages/Preview';\nimport { INTERNAL_EVENTS } from '../utils/constants';\nimport { getSendMessage } from '../utils/getSendMessage';\n\ntype PreviewInputProps = Pick<\n Required<React.InputHTMLAttributes<HTMLInputElement>>,\n 'onFocus' | 'onBlur'\n>;\n\nexport function usePreviewInputManager(\n name: string,\n attribute: Schema.Attribute.AnyAttribute\n): PreviewInputProps {\n const iframe = usePreviewContext('usePreviewInputManager', (state) => state.iframeRef, false);\n const setPopoverField = usePreviewContext(\n 'usePreviewInputManager',\n (state) => state.setPopoverField,\n false\n );\n const hasInputPopoverParent = useHasInputPopoverParent();\n const { value } = useField(name);\n const { type } = attribute;\n\n React.useEffect(() => {\n if (!iframe || !type) {\n return;\n }\n\n /**\n * Only send message if the field is not a data structure (component, dynamic zone)\n * because we already send events for their fields\n */\n if (!['component', 'dynamiczone'].includes(type)) {\n const sendMessage = getSendMessage(iframe);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_CHANGE, { field: name, value });\n }\n }, [name, value, iframe, type]);\n\n // Track previous value to detect media deletion\n const prevValueRef = React.useRef(value);\n\n React.useEffect(() => {\n // Only run inside popover for media fields\n if (!hasInputPopoverParent || !setPopoverField || type !== 'media') {\n return;\n }\n\n const currentValue = value;\n const previousValue = prevValueRef.current;\n\n // Check if we transitioned from having a value to null/empty\n const hadValue =\n previousValue != null && (Array.isArray(previousValue) ? previousValue.length > 0 : true);\n const hasNoValue =\n currentValue == null || (Array.isArray(currentValue) ? currentValue.length === 0 : false);\n\n if (hadValue && hasNoValue) {\n // Media was deleted, close the popover\n setPopoverField(null);\n }\n\n // Update ref for next comparison\n prevValueRef.current = currentValue;\n }, [value, hasInputPopoverParent, setPopoverField, type]);\n\n const sendMessage = getSendMessage(iframe);\n\n return {\n onFocus: () => {\n if (hasInputPopoverParent) return;\n\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS, { field: name });\n },\n onBlur: () => {\n if (hasInputPopoverParent) return;\n\n setPopoverField?.(null);\n sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_BLUR, { field: name });\n },\n };\n}\n"],"names":["usePreviewInputManager","name","attribute","iframe","usePreviewContext","state","iframeRef","setPopoverField","hasInputPopoverParent","useHasInputPopoverParent","value","useField","type","React","useEffect","includes","sendMessage","getSendMessage","INTERNAL_EVENTS","STRAPI_FIELD_CHANGE","field","prevValueRef","useRef","currentValue","previousValue","current","hadValue","Array","isArray","length","hasNoValue","onFocus","STRAPI_FIELD_FOCUS","onBlur","STRAPI_FIELD_BLUR"],"mappings":";;;;;;;AAeO,SAASA,sBAAAA,CACdC,IAAY,EACZC,SAAwC,EAAA;AAExC,IAAA,MAAMC,SAASC,iBAAAA,CAAkB,wBAAA,EAA0B,CAACC,KAAAA,GAAUA,KAAAA,CAAMC,SAAS,EAAE,KAAA,CAAA;AACvF,IAAA,MAAMC,kBAAkBH,iBAAAA,CACtB,wBAAA,EACA,CAACC,KAAAA,GAAUA,KAAAA,CAAME,eAAe,EAChC,KAAA,CAAA;AAEF,IAAA,MAAMC,qBAAAA,GAAwBC,wBAAAA,EAAAA;AAC9B,IAAA,MAAM,EAAEC,KAAK,EAAE,GAAGC,QAAAA,CAASV,IAAAA,CAAAA;IAC3B,MAAM,EAAEW,IAAI,EAAE,GAAGV,SAAAA;AAEjBW,IAAAA,KAAAA,CAAMC,SAAS,CAAC,IAAA;QACd,IAAI,CAACX,MAAAA,IAAU,CAACS,IAAAA,EAAM;AACpB,YAAA;AACF,QAAA;AAEA;;;AAGC,QACD,IAAI,CAAC;AAAC,YAAA,WAAA;AAAa,YAAA;SAAc,CAACG,QAAQ,CAACH,IAAAA,CAAAA,EAAO;AAChD,YAAA,MAAMI,cAAcC,cAAAA,CAAed,MAAAA,CAAAA;YACnCa,WAAAA,CAAYE,eAAAA,CAAgBC,mBAAmB,EAAE;gBAAEC,KAAAA,EAAOnB,IAAAA;AAAMS,gBAAAA;AAAM,aAAA,CAAA;AACxE,QAAA;IACF,CAAA,EAAG;AAACT,QAAAA,IAAAA;AAAMS,QAAAA,KAAAA;AAAOP,QAAAA,MAAAA;AAAQS,QAAAA;AAAK,KAAA,CAAA;;IAG9B,MAAMS,YAAAA,GAAeR,KAAAA,CAAMS,MAAM,CAACZ,KAAAA,CAAAA;AAElCG,IAAAA,KAAAA,CAAMC,SAAS,CAAC,IAAA;;AAEd,QAAA,IAAI,CAACN,qBAAAA,IAAyB,CAACD,eAAAA,IAAmBK,SAAS,OAAA,EAAS;AAClE,YAAA;AACF,QAAA;AAEA,QAAA,MAAMW,YAAAA,GAAeb,KAAAA;QACrB,MAAMc,aAAAA,GAAgBH,aAAaI,OAAO;;AAG1C,QAAA,MAAMC,QAAAA,GACJF,aAAAA,IAAiB,IAAA,KAASG,KAAAA,CAAMC,OAAO,CAACJ,aAAAA,CAAAA,GAAiBA,aAAAA,CAAcK,MAAM,GAAG,CAAA,GAAI,IAAG,CAAA;AACzF,QAAA,MAAMC,UAAAA,GACJP,YAAAA,IAAgB,IAAA,KAASI,KAAAA,CAAMC,OAAO,CAACL,YAAAA,CAAAA,GAAgBA,YAAAA,CAAaM,MAAM,KAAK,CAAA,GAAI,KAAI,CAAA;AAEzF,QAAA,IAAIH,YAAYI,UAAAA,EAAY;;YAE1BvB,eAAAA,CAAgB,IAAA,CAAA;AAClB,QAAA;;AAGAc,QAAAA,YAAAA,CAAaI,OAAO,GAAGF,YAAAA;IACzB,CAAA,EAAG;AAACb,QAAAA,KAAAA;AAAOF,QAAAA,qBAAAA;AAAuBD,QAAAA,eAAAA;AAAiBK,QAAAA;AAAK,KAAA,CAAA;AAExD,IAAA,MAAMI,cAAcC,cAAAA,CAAed,MAAAA,CAAAA;IAEnC,OAAO;QACL4B,OAAAA,EAAS,IAAA;AACP,YAAA,IAAIvB,qBAAAA,EAAuB;YAE3BQ,WAAAA,CAAYE,eAAAA,CAAgBc,kBAAkB,EAAE;gBAAEZ,KAAAA,EAAOnB;AAAK,aAAA,CAAA;AAChE,QAAA,CAAA;QACAgC,MAAAA,EAAQ,IAAA;AACN,YAAA,IAAIzB,qBAAAA,EAAuB;YAE3BD,eAAAA,GAAkB,IAAA,CAAA;YAClBS,WAAAA,CAAYE,eAAAA,CAAgBgB,iBAAiB,EAAE;gBAAEd,KAAAA,EAAOnB;AAAK,aAAA,CAAA;AAC/D,QAAA;AACF,KAAA;AACF;;;;"}
|