@strapi/content-manager 5.55.1 → 5.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/ConfigurationForm/Form.js +3 -3
- package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Form.mjs +2 -2
- package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -1
- package/dist/admin/components/RelativeTime.js +9 -0
- package/dist/admin/components/RelativeTime.js.map +1 -1
- package/dist/admin/components/RelativeTime.mjs +10 -1
- package/dist/admin/components/RelativeTime.mjs.map +1 -1
- package/dist/admin/features/DocumentRBAC.js +0 -3
- package/dist/admin/features/DocumentRBAC.js.map +1 -1
- package/dist/admin/features/DocumentRBAC.mjs +1 -4
- package/dist/admin/features/DocumentRBAC.mjs.map +1 -1
- package/dist/admin/history/components/VersionContent.js +3 -3
- package/dist/admin/history/components/VersionContent.js.map +1 -1
- package/dist/admin/history/components/VersionContent.mjs +2 -2
- package/dist/admin/history/components/VersionContent.mjs.map +1 -1
- package/dist/admin/history/pages/History.js +2 -1
- package/dist/admin/history/pages/History.js.map +1 -1
- package/dist/admin/history/pages/History.mjs +3 -2
- package/dist/admin/history/pages/History.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +2 -2
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +2 -2
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +170 -131
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +173 -135
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +3 -3
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +143 -30
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +143 -32
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +22 -5
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +22 -5
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +3 -3
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +2 -2
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +4 -3
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +4 -3
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/preview/pages/Preview.js +2 -1
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +3 -2
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/services/documents.js +3 -2
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +2 -2
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +2 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +44 -5
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +4 -4
- package/dist/admin/src/services/documents.d.ts +10 -2
- package/dist/admin/translations/en.json.js +2 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +2 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/validation.js +3 -3
- package/dist/admin/utils/validation.js.map +1 -1
- package/dist/admin/utils/validation.mjs +2 -2
- package/dist/admin/utils/validation.mjs.map +1 -1
- package/dist/server/controllers/collection-types.js +4 -4
- package/dist/server/controllers/collection-types.js.map +1 -1
- package/dist/server/controllers/collection-types.mjs +4 -4
- package/dist/server/controllers/collection-types.mjs.map +1 -1
- package/dist/server/controllers/content-types.js +5 -7
- package/dist/server/controllers/content-types.js.map +1 -1
- package/dist/server/controllers/content-types.mjs +5 -7
- package/dist/server/controllers/content-types.mjs.map +1 -1
- package/dist/server/controllers/relations.js +22 -14
- package/dist/server/controllers/relations.js.map +1 -1
- package/dist/server/controllers/relations.mjs +21 -13
- package/dist/server/controllers/relations.mjs.map +1 -1
- package/dist/server/controllers/utils/clone.js +3 -4
- package/dist/server/controllers/utils/clone.js.map +1 -1
- package/dist/server/controllers/utils/clone.mjs +4 -5
- package/dist/server/controllers/utils/clone.mjs.map +1 -1
- package/dist/server/controllers/validation/index.js +1 -1
- package/dist/server/controllers/validation/index.mjs +1 -1
- package/dist/server/history/controllers/history-version.js +3 -3
- package/dist/server/history/controllers/history-version.js.map +1 -1
- package/dist/server/history/controllers/history-version.mjs +3 -3
- package/dist/server/history/controllers/history-version.mjs.map +1 -1
- package/dist/server/history/services/history.js +4 -4
- package/dist/server/history/services/history.js.map +1 -1
- package/dist/server/history/services/history.mjs +4 -4
- package/dist/server/history/services/history.mjs.map +1 -1
- package/dist/server/history/services/lifecycles.js +8 -8
- package/dist/server/history/services/lifecycles.js.map +1 -1
- package/dist/server/history/services/lifecycles.mjs +3 -3
- package/dist/server/history/services/lifecycles.mjs.map +1 -1
- package/dist/server/history/services/utils.js +7 -10
- package/dist/server/history/services/utils.js.map +1 -1
- package/dist/server/history/services/utils.mjs +5 -8
- package/dist/server/history/services/utils.mjs.map +1 -1
- package/dist/server/mcp/permissions.js +2 -2
- package/dist/server/mcp/permissions.js.map +1 -1
- package/dist/server/mcp/permissions.mjs +2 -2
- package/dist/server/mcp/permissions.mjs.map +1 -1
- package/dist/server/mcp/register-content-manager-mcp-tools.js +7 -5
- package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -1
- package/dist/server/mcp/register-content-manager-mcp-tools.mjs +7 -5
- package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -1
- package/dist/server/preview/controllers/previewScript.js +30 -15
- package/dist/server/preview/controllers/validation/preview.js +3 -3
- package/dist/server/preview/controllers/validation/preview.js.map +1 -1
- package/dist/server/preview/controllers/validation/preview.mjs +3 -3
- package/dist/server/preview/controllers/validation/preview.mjs.map +1 -1
- package/dist/server/services/components.js +3 -3
- package/dist/server/services/components.js.map +1 -1
- package/dist/server/services/components.mjs +3 -3
- package/dist/server/services/components.mjs.map +1 -1
- package/dist/server/services/content-structure.js +2 -2
- package/dist/server/services/content-structure.js.map +1 -1
- package/dist/server/services/content-structure.mjs +2 -2
- package/dist/server/services/content-structure.mjs.map +1 -1
- package/dist/server/services/content-types.js +3 -3
- package/dist/server/services/content-types.js.map +1 -1
- package/dist/server/services/content-types.mjs +3 -3
- package/dist/server/services/content-types.mjs.map +1 -1
- package/dist/server/services/data-mapper.js +3 -3
- package/dist/server/services/data-mapper.js.map +1 -1
- package/dist/server/services/data-mapper.mjs +3 -3
- package/dist/server/services/data-mapper.mjs.map +1 -1
- package/dist/server/services/document-manager.js +6 -6
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +6 -6
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/document-metadata.js +29 -31
- package/dist/server/services/document-metadata.js.map +1 -1
- package/dist/server/services/document-metadata.mjs +29 -31
- package/dist/server/services/document-metadata.mjs.map +1 -1
- package/dist/server/services/metrics.js +3 -3
- package/dist/server/services/metrics.js.map +1 -1
- package/dist/server/services/metrics.mjs +3 -3
- package/dist/server/services/metrics.mjs.map +1 -1
- package/dist/server/services/permission-checker.js +2 -2
- package/dist/server/services/permission-checker.js.map +1 -1
- package/dist/server/services/permission-checker.mjs +1 -1
- package/dist/server/services/permission-checker.mjs.map +1 -1
- package/dist/server/services/permission.js +2 -3
- package/dist/server/services/permission.js.map +1 -1
- package/dist/server/services/permission.mjs +2 -3
- package/dist/server/services/permission.mjs.map +1 -1
- package/dist/server/services/populate-builder.js +4 -4
- package/dist/server/services/populate-builder.js.map +1 -1
- package/dist/server/services/populate-builder.mjs +4 -4
- package/dist/server/services/populate-builder.mjs.map +1 -1
- package/dist/server/services/utils/configuration/attributes.js +1 -2
- package/dist/server/services/utils/configuration/attributes.js.map +1 -1
- package/dist/server/services/utils/configuration/attributes.mjs +2 -3
- package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
- package/dist/server/services/utils/configuration/settings.js +4 -7
- package/dist/server/services/utils/configuration/settings.js.map +1 -1
- package/dist/server/services/utils/configuration/settings.mjs +2 -5
- package/dist/server/services/utils/configuration/settings.mjs.map +1 -1
- package/dist/server/services/utils/draft.js +8 -7
- package/dist/server/services/utils/draft.js.map +1 -1
- package/dist/server/services/utils/draft.mjs +6 -5
- package/dist/server/services/utils/draft.mjs.map +1 -1
- package/dist/server/services/utils/populate.js +10 -11
- package/dist/server/services/utils/populate.js.map +1 -1
- package/dist/server/services/utils/populate.mjs +9 -10
- package/dist/server/services/utils/populate.mjs.map +1 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts +2 -2
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +1 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/permissions.d.ts +1 -1
- package/dist/server/src/mcp/permissions.d.ts.map +1 -1
- package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +3 -1
- package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
- package/dist/server/src/mcp/types.d.ts +2 -2
- package/dist/server/src/services/content-types.d.ts.map +1 -1
- package/dist/server/src/services/data-mapper.d.ts +1 -1
- package/dist/server/src/services/data-mapper.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +1 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/metrics.d.ts.map +1 -1
- package/dist/server/src/services/permission-checker.d.ts.map +1 -1
- package/dist/server/src/services/permission.d.ts.map +1 -1
- package/dist/server/src/services/populate-builder.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/index.d.ts +10 -1
- package/dist/server/src/services/utils/configuration/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/settings.d.ts +10 -1
- package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
- package/dist/server/src/services/utils/draft.d.ts.map +1 -1
- package/dist/server/src/services/utils/populate.d.ts.map +1 -1
- package/package.json +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.js","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: rawValue, error } = useField<Array<DzWithTempKey>>(name);\n // `value` can be `null` (for example after closing a relation modal). Match\n // RepeatableComponent: only accept arrays, otherwise treat as empty. (#26815)\n const value = React.useMemo(() => (Array.isArray(rawValue) ? rawValue : []), [rawValue]);\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 componentSchema = components[componentUid];\n\n if (!componentSchema) {\n return acc;\n }\n\n const { category, info } = componentSchema;\n\n const component = {\n uid: componentUid,\n displayName: info.displayName,\n icon: info.icon,\n preview: info.preview,\n };\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 const schema = components[uid];\n\n if (!schema) {\n return;\n }\n\n setAddComponentIsOpen(false);\n\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","rawValue","error","useField","useMemo","Array","isArray","prevValue","usePrev","useEffect","length","prevKeys","Set","map","v","__temp_key__","newItem","find","has","currentKeys","handleForceOpenHandled","useCallback","dynamicComponentsByCategory","reduce","acc","componentUid","componentSchema","category","info","component","uid","displayName","icon","preview","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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,MAAM,CAACA,mBAAAA,EAAqBC,cAAAA,CAAe,GAAGC,0BAC5C,aAAA,EACA;IACEC,eAAAA,EAAiB;AACnB,CAAA;AAUF,MAAMC,WAAAA,GAAc,CAAC,EACnBC,SAAS,EACTC,QAAAA,EAAUC,YAAY,EACtBC,IAAI,EACJC,KAAK,EACLC,WAAW,EACXC,IAAI,EACJC,WAAW,KAAK,EAChBC,QAAQ,EACS,GAAA;;IAEjB,MAAM,EAAEC,GAAAA,GAAMC,QAAQ,EAAEC,GAAAA,GAAM,CAACD,QAAQ,EAAE,GAAGV,SAAAA,IAAa,EAAC;AAE1D,IAAA,MAAM,CAACY,kBAAAA,EAAoBC,qBAAAA,CAAsB,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;AACnE,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAAA,CAAY,GAAGH,gBAAAA,CAAMC,QAAQ,CAAC,EAAA,CAAA;AAC/C,IAAA,MAAM,CAACG,gBAAAA,EAAkBC,mBAAAA,CAAoB,GAAGL,gBAAAA,CAAMC,QAAQ,CAAgB,IAAA,CAAA;IAE9E,MAAM,EACJK,iBAAiB,EAAEC,UAAU,EAAEC,SAAS,EAAE,EAC3C,GAAGC,qCAAAA,CAAmB,aAAA,CAAA;AAEvB,IAAA,MAAMtB,WAAWC,YAAAA,IAAgBoB,SAAAA;AACjC,IAAA,MAAME,cAAcC,mBAAAA,CAAQ,aAAA,EAAe,CAACC,KAAAA,GAAUA,MAAMF,WAAW,CAAA;AACvE,IAAA,MAAMG,iBAAiBF,mBAAAA,CAAQ,aAAA,EAAe,CAACC,KAAAA,GAAUA,MAAMC,cAAc,CAAA;AAC7E,IAAA,MAAMC,eAAeH,mBAAAA,CAAQ,aAAA,EAAe,CAACC,KAAAA,GAAUA,MAAME,YAAY,CAAA;AAOzE,IAAA,MAAM,EAAEC,KAAAA,EAAOC,QAAQ,EAAEC,KAAK,EAAE,GAAGC,oBAAAA,CAA+B1B,IAAAA,CAAAA;;;IAGlE,MAAMuB,KAAAA,GAAQf,gBAAAA,CAAMmB,OAAO,CAAC,IAAOC,KAAAA,CAAMC,OAAO,CAACL,QAAAA,CAAAA,GAAYA,QAAAA,GAAW,EAAE,EAAG;AAACA,QAAAA;AAAS,KAAA,CAAA;AAEvF;;;;MAKA,MAAMM,YAAYC,eAAAA,CAAQR,KAAAA,CAAAA;AAE1Bf,IAAAA,gBAAAA,CAAMwB,SAAS,CAAC,IAAA;AACd,QAAA,IAAIF,aAAaA,SAAAA,CAAUG,MAAM,GAAGV,KAAAA,CAAMU,MAAM,EAAE;YAChD,MAAMC,QAAAA,GAAW,IAAIC,GAAAA,CAAIL,SAAAA,CAAUM,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEC,YAAY,CAAA,CAAA;YAC5D,MAAMC,OAAAA,GAAUhB,KAAAA,CAAMiB,IAAI,CAAC,CAACH,CAAAA,GAAM,CAACH,QAAAA,CAASO,GAAG,CAACJ,CAAAA,CAAEC,YAAY,CAAA,CAAA;AAC9D,YAAA,IAAIC,OAAAA,EAAS;AACX1B,gBAAAA,mBAAAA,CAAoB0B,QAAQD,YAAY,CAAA;AAC1C,YAAA;QACF,CAAA,MAAO,IAAI1B,qBAAqB,IAAA,EAAM;;YAEpC,MAAM8B,WAAAA,GAAc,IAAIP,GAAAA,CAAIZ,KAAAA,CAAMa,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEC,YAAY,CAAA,CAAA;AAC3D,YAAA,IAAI,CAACI,WAAAA,CAAYD,GAAG,CAAC7B,gBAAAA,CAAAA,EAAmB;gBACtCC,mBAAAA,CAAoB,IAAA,CAAA;AACtB,YAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACU,QAAAA,KAAAA;AAAOO,QAAAA,SAAAA;AAAWlB,QAAAA;AAAiB,KAAA,CAAA;IAEvC,MAAM+B,sBAAAA,GAAyBnC,gBAAAA,CAAMoC,WAAW,CAAC,IAAA;QAC/C/B,mBAAAA,CAAoB,IAAA,CAAA;AACtB,IAAA,CAAA,EAAG,EAAE,CAAA;IAEL,MAAMgC,2BAAAA,GAA8BrC,gBAAAA,CAAMmB,OAAO,CAAC,IAAA;AAChD,QAAA,OAAOjC,UAAUqB,UAAU,CAAC+B,MAAM,CAEhC,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;YACN,MAAMC,eAAAA,GAAkBlC,UAAU,CAACiC,YAAAA,CAAa;AAEhD,YAAA,IAAI,CAACC,eAAAA,EAAiB;gBACpB,OAAOF,GAAAA;AACT,YAAA;AAEA,YAAA,MAAM,EAAEG,QAAQ,EAAEC,IAAI,EAAE,GAAGF,eAAAA;AAE3B,YAAA,MAAMG,SAAAA,GAAY;gBAChBC,GAAAA,EAAKL,YAAAA;AACLM,gBAAAA,WAAAA,EAAaH,KAAKG,WAAW;AAC7BC,gBAAAA,IAAAA,EAAMJ,KAAKI,IAAI;AACfC,gBAAAA,OAAAA,EAASL,KAAKK;AAChB,aAAA;AAEA,YAAA,IAAI,CAACT,GAAG,CAACG,QAAAA,CAAS,EAAE;gBAClBH,GAAG,CAACG,QAAAA,CAAS,GAAG,EAAE;AACpB,YAAA;YAEAH,GAAG,CAACG,SAAS,GAAG;AAAIH,gBAAAA,GAAAA,GAAG,CAACG,QAAAA,CAAS;AAAEE,gBAAAA;AAAU,aAAA;YAE7C,OAAOL,GAAAA;AACT,QAAA,CAAA,EAAG,EAAC,CAAA;IACN,CAAA,EAAG;AAACrD,QAAAA,SAAAA,CAAUqB,UAAU;AAAEA,QAAAA;AAAW,KAAA,CAAA;IAErC,MAAM,EAAE0C,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAE1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;IAE/B,MAAMC,gCAAAA,GAAmCtC,MAAMU,MAAM;AAErD,IAAA,MAAM6B,kBAAAA,GAAqBtD,gBAAAA,CAAMoC,WAAW,CAC1C,CAACS,GAAAA,EAAaU,QAAAA,GAAAA;QACZ,MAAMC,MAAAA,GAASjD,UAAU,CAACsC,GAAAA,CAAI;AAE9B,QAAA,IAAI,CAACW,MAAAA,EAAQ;AACX,YAAA;AACF,QAAA;QAEAzD,qBAAAA,CAAsB,KAAA,CAAA;QAEtB,MAAM0D,IAAAA,GAAOC,wBAAkBF,MAAAA,EAAQjD,UAAAA,CAAAA;AACvC,QAAA,MAAMoD,kBAAkBC,qBAAAA,CAAKC,sBAAAA,CAAkBL,QAAQjD,UAAAA,CAAAA,EAAa,CAACuD,QAAU;AAC7E,gBAAA,GAAGA,IAAI;gBACPC,WAAAA,EAAalB;aACf,CAAA,CAAA;AAEA,QAAA,MAAMiB,SAAOH,eAAAA,CAAgBF,IAAAA,CAAAA;AAE7B/C,QAAAA,WAAAA,CAAYlB,MAAMsE,MAAAA,EAAMP,QAAAA,CAAAA;IAC1B,CAAA,EACA;AAAC7C,QAAAA,WAAAA;AAAaH,QAAAA,UAAAA;AAAYf,QAAAA;AAAK,KAAA,CAAA;AAGjC,IAAA,MAAMwE,qBAAAA,GAAwB,IAAA;AAC5B,QAAA,IAAIX,mCAAmC1D,GAAAA,EAAK;YAC1CI,qBAAAA,CAAsB,CAACkE,OAAS,CAACA,IAAAA,CAAAA;QACnC,CAAA,MAAO;YACLd,kBAAAA,CAAmB;gBACjBe,IAAAA,EAAM,MAAA;AACNC,gBAAAA,OAAAA,EAASlB,aAAAA,CAAc;AACrBmB,oBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,kDAAA;AACrB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMC,mBAAAA,GAAsBtE,gBAAAA,CAAMoC,WAAW,CAC3C,CAACmC,QAAAA,EAAkBC,YAAAA,GAAAA;AACjBrE,QAAAA,WAAAA,CACE8C,aAAAA,CACE;AACEmB,YAAAA,EAAAA,EAAIC,2BAAAA,CAAe,aAAA,CAAA;YACnBI,cAAAA,EAAgB;SAClB,EACA;AACEC,YAAAA,IAAAA,EAAM,CAAA,EAAGlF,IAAAA,CAAK,CAAC,EAAEgF,YAAAA,CAAAA,CAAc;AAC/BjB,YAAAA,QAAAA,EAAU,GAAGgB,QAAAA,GAAW,CAAA,CAAE,IAAI,EAAExD,KAAAA,CAAMU,MAAM,CAAA;AAC9C,SAAA,CAAA,CAAA;AAIJX,QAAAA,YAAAA,CAAatB,MAAMgF,YAAAA,EAAcD,QAAAA,CAAAA;IACnC,CAAA,EACA;AAACtB,QAAAA,aAAAA;AAAenC,QAAAA,YAAAA;AAActB,QAAAA,IAAAA;AAAMuB,QAAAA,KAAAA,CAAMU;AAAO,KAAA,CAAA;AAGnD,IAAA,MAAMkD,YAAAA,GAAe3E,gBAAAA,CAAMoC,WAAW,CACpC,CAACwC,KAAAA,GAAAA;AACCzE,QAAAA,WAAAA,CACE8C,aAAAA,CACE;AACEmB,YAAAA,EAAAA,EAAIC,2BAAAA,CAAe,iBAAA,CAAA;YACnBI,cAAAA,EAAgB;SAClB,EACA;AACEC,YAAAA,IAAAA,EAAM,CAAA,EAAGlF,IAAAA,CAAK,CAAC,EAAEoF,KAAAA,CAAAA;AACnB,SAAA,CAAA,CAAA;IAGN,CAAA,EACA;AAAC3B,QAAAA,aAAAA;AAAezD,QAAAA;AAAK,KAAA,CAAA;AAGvB,IAAA,MAAMqF,cAAAA,GAAiB7E,gBAAAA,CAAMoC,WAAW,CACtC,CAACwC,KAAAA,GAAAA;AACCzE,QAAAA,WAAAA,CACE8C,aAAAA,CACE;AACEmB,YAAAA,EAAAA,EAAIC,2BAAAA,CAAe,eAAA,CAAA;YACnBI,cAAAA,EAAgB,CAAC,sIAAsI;SACzJ,EACA;AACEC,YAAAA,IAAAA,EAAM,CAAA,EAAGlF,IAAAA,CAAK,CAAC,EAAEoF,KAAAA,CAAAA,CAAO;AACxBrB,YAAAA,QAAAA,EAAU,GAAGqB,KAAAA,GAAQ,CAAA,CAAE,IAAI,EAAE7D,KAAAA,CAAMU,MAAM,CAAA;AAC3C,SAAA,CAAA,CAAA;IAGN,CAAA,EACA;AAACwB,QAAAA,aAAAA;AAAezD,QAAAA,IAAAA;AAAMuB,QAAAA,KAAAA,CAAMU;AAAO,KAAA,CAAA;AAGrC,IAAA,MAAMqD,cAAAA,GAAiB9E,gBAAAA,CAAMoC,WAAW,CACtC,CAACwC,KAAAA,GAAAA;AACCzE,QAAAA,WAAAA,CACE8C,aAAAA,CACE;AACEmB,YAAAA,EAAAA,EAAIC,2BAAAA,CAAe,eAAA,CAAA;YACnBI,cAAAA,EAAgB,CAAC,oDAAoD;SACvE,EACA;AACEC,YAAAA,IAAAA,EAAM,CAAA,EAAGlF,IAAAA,CAAK,CAAC,EAAEoF,KAAAA,CAAAA,CAAO;AACxBrB,YAAAA,QAAAA,EAAU,GAAGqB,KAAAA,GAAQ,CAAA,CAAE,IAAI,EAAE7D,KAAAA,CAAMU,MAAM,CAAA;AAC3C,SAAA,CAAA,CAAA;IAGN,CAAA,EACA;AAACwB,QAAAA,aAAAA;AAAezD,QAAAA,IAAAA;AAAMuB,QAAAA,KAAAA,CAAMU;AAAO,KAAA,CAAA;AAGrC,IAAA,MAAMsD,qBAAAA,GAAwB/E,gBAAAA,CAAMoC,WAAW,CAC7C,CAACoC,YAAAA,GAAAA;AACC3D,QAAAA,cAAAA,CAAerB,IAAAA,EAAMgF,YAAAA,CAAAA;IACvB,CAAA,EACA;AAAChF,QAAAA,IAAAA;AAAMqB,QAAAA;AAAe,KAAA,CAAA;AAGxB,IAAA,MAAMmE,WAAW/D,KAAAA,KAAUgE,SAAAA;AAE3B,IAAA,MAAMC,iBAAAA,GAAoB,IAAA;AACxB,QAAA,IAAIpF,kBAAAA,EAAoB;AACtB,YAAA,OAAOmD,aAAAA,CAAc;gBAAEmB,EAAAA,EAAI,uBAAA;gBAAyBK,cAAAA,EAAgB;AAAQ,aAAA,CAAA;AAC9E,QAAA;QAEA,IAAIO,QAAAA,IAAY3B,mCAAmC1D,GAAAA,EAAK;AACtD,YAAA,OAAOsD,aAAAA,CACL;gBACEmB,EAAAA,EAAIC,2BAAAA,CAAe,CAAC,uCAAuC,CAAC,CAAA;gBAC5DI,cAAAA,EACE;aACJ,EACA;AACEU,gBAAAA,MAAAA,EAAQ9B,gCAAAA,GAAmC1D;AAC7C,aAAA,CAAA;AAEJ,QAAA;QAEA,IAAIqF,QAAAA,IAAY3B,mCAAmCxD,GAAAA,EAAK;AACtD,YAAA,OAAOoD,aAAAA,CACL;gBACEmB,EAAAA,EAAIC,2BAAAA,CAAe,CAAC,yCAAyC,CAAC,CAAA;gBAC9DI,cAAAA,EACE;aACJ,EACA;AAAEU,gBAAAA,MAAAA,EAAQtF,GAAAA,GAAMwD;AAAiC,aAAA,CAAA;AAErD,QAAA;AAEA,QAAA,OAAOJ,aAAAA,CACL;AACEmB,YAAAA,EAAAA,EAAIC,2BAAAA,CAAe,sCAAA,CAAA;YACnBI,cAAAA,EAAgB;SAClB,EACA;AAAEW,YAAAA,aAAAA,EAAe9F,KAAAA,IAASE;AAAK,SAAA,CAAA;AAEnC,IAAA,CAAA;AAEA,IAAA,MAAM6F,QAAQC,6BAAAA,CAAa,aAAA,EAAe,CAAC1E,KAAAA,GAAUA,MAAMyE,KAAK,CAAA;IAEhE,MAAME,iBAAAA,GAAoBvF,iBAAMwF,KAAK,EAAA;AAErC,IAAA,qBACEC,cAAA,CAAC5G,mBAAAA,EAAAA;QAAoBG,eAAe,EAAA,IAAA;AAClC,QAAA,QAAA,gBAAA0G,eAAA,CAACC,iBAAAA,EAAAA;YAAKC,SAAAA,EAAU,QAAA;YAASC,UAAAA,EAAW,SAAA;YAAUC,GAAAA,EAAK;gBAAEC,OAAAA,EAAS,CAAA;gBAAGC,MAAAA,EAAQ;AAAE,aAAA;;AACxE3C,gBAAAA,gCAAAA,GAAmC,mBAClCqC,eAAA,CAACO,gBAAAA,EAAAA;;sCACCR,cAAA,CAACS,iCAAAA,EAAAA;4BACC7G,IAAAA,EAAMA,IAAAA;4BACNC,KAAAA,EAAOA,KAAAA;4BACPC,WAAAA,EAAaA,WAAAA;4BACbC,IAAAA,EAAMA,IAAAA;4BACN2G,kBAAAA,EAAoB9C,gCAAAA;4BACpB5D,QAAAA,EAAUA;;sCAEZgG,cAAA,CAACW,2BAAAA,EAAAA;4BAAehC,EAAAA,EAAImB,iBAAAA;sCACjBtC,aAAAA,CAAc;AACbmB,gCAAAA,EAAAA,EAAIC,2BAAAA,CAAe,kBAAA,CAAA;gCACnBI,cAAAA,EAAgB,CAAC,mCAAmC;AACtD,6BAAA;;sCAEFgB,cAAA,CAACW,2BAAAA,EAAAA;4BAAeC,WAAAA,EAAU,WAAA;AAAanG,4BAAAA,QAAAA,EAAAA;;sCACvCuF,cAAA,CAACa,IAAAA,EAAAA;4BAAGC,kBAAAA,EAAkBhB,iBAAAA;AACnBxE,4BAAAA,QAAAA,EAAAA,KAAAA,CAAMa,GAAG,CAAC,CAAC4E,KAAAA,EAAO5B,sBACjBa,cAAA,CAACgB,kCAAAA,EAAAA;AAECpB,oCAAAA,KAAAA,EAAOA,KAAAA,GAAQ,CAAA;AACfxC,oCAAAA,GAAAA,EAAK2D,MAAMzC,WAAW;;AAEtBK,oCAAAA,EAAAA,EAAIoC,MAAMpC,EAAE;oCACZF,IAAAA,EAAK,aAAA;AAEL,oCAAA,QAAA,gBAAAuB,cAAA,CAACiB,iCAAAA,EAAAA;wCACCvH,QAAAA,EAAUA,QAAAA;wCACVK,IAAAA,EAAMA,IAAAA;wCACNoF,KAAAA,EAAOA,KAAAA;AACPpC,wCAAAA,YAAAA,EAAcgE,MAAMzC,WAAW;wCAC/B4C,eAAAA,EAAiBrC,mBAAAA;wCACjBsC,sBAAAA,EAAwB7B,qBAAAA;wCACxB8B,QAAAA,EAAUlC,YAAAA;wCACVmC,UAAAA,EAAYhC,cAAAA;wCACZiC,UAAAA,EAAYlC,cAAAA;wCACZmC,cAAAA,EAAgB1D,kBAAAA;wCAChBjB,2BAAAA,EAA6BA,2BAAAA;wCAC7B4E,WAAAA,EAAa5D,gCAAAA;wCACb6D,SAAAA,EAAW9G,gBAAAA,KAAqBoG,MAAM1E,YAAY;wCAClDqF,kBAAAA,EAAoBhF,sBAAAA;AAEnBzC,wCAAAA,QAAAA,EAAAA;;AAvBE8G,iCAAAA,EAAAA,KAAAA,CAAM1E,YAAY,CAAA;;;;8BA8BjC2D,cAAA,CAACE,iBAAAA,EAAAA;oBAAKyB,cAAAA,EAAe,QAAA;AACnB,oBAAA,QAAA,gBAAA3B,cAAA,CAAC4B,qCAAAA,EAAAA;wBACCrC,QAAAA,EAAUA,QAAAA;wBACVsC,UAAAA,EAAYnI,QAAAA;wBACZoI,MAAAA,EAAQzH,kBAAAA;wBACR0H,OAAAA,EAASxD,qBAAAA;AAERkB,wBAAAA,QAAAA,EAAAA,iBAAAA;;;8BAGLO,cAAA,CAACgC,+BAAAA,EAAAA;oBACCpF,2BAAAA,EAA6BA,2BAAAA;oBAC7BkF,MAAAA,EAAQzH,kBAAAA;oBACR4H,mBAAAA,EAAqBpE;;;;;AAK/B;;;;;"}
|
|
1
|
+
{"version":3,"file":"Field.js","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 flow from 'lodash/flow';\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: rawValue, error } = useField<Array<DzWithTempKey>>(name);\n // `value` can be `null` (for example after closing a relation modal). Match\n // RepeatableComponent: only accept arrays, otherwise treat as empty. (#26815)\n const value = React.useMemo(() => (Array.isArray(rawValue) ? rawValue : []), [rawValue]);\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 componentSchema = components[componentUid];\n\n if (!componentSchema) {\n return acc;\n }\n\n const { category, info } = componentSchema;\n\n const component = {\n uid: componentUid,\n displayName: info.displayName,\n icon: info.icon,\n preview: info.preview,\n };\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 const schema = components[uid];\n\n if (!schema) {\n return;\n }\n\n setAddComponentIsOpen(false);\n\n const form = createDefaultForm(schema, components);\n const transformations = flow(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","rawValue","error","useField","useMemo","Array","isArray","prevValue","usePrev","useEffect","length","prevKeys","Set","map","v","__temp_key__","newItem","find","has","currentKeys","handleForceOpenHandled","useCallback","dynamicComponentsByCategory","reduce","acc","componentUid","componentSchema","category","info","component","uid","displayName","icon","preview","formatMessage","useIntl","toggleNotification","useNotification","dynamicDisplayedComponentsLength","handleAddComponent","position","schema","form","createDefaultForm","transformations","flow","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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"}
|
|
@@ -2,7 +2,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { createContext, useForm, useField, useNotification } from '@strapi/admin/strapi-admin';
|
|
4
4
|
import { Flex, Box, VisuallyHidden } from '@strapi/design-system';
|
|
5
|
-
import
|
|
5
|
+
import flow from 'lodash/flow';
|
|
6
6
|
import { useIntl } from 'react-intl';
|
|
7
7
|
import { useDocumentContext } from '../../../../../hooks/useDocumentContext.mjs';
|
|
8
8
|
import { usePrev } from '../../../../../hooks/usePrev.mjs';
|
|
@@ -98,7 +98,7 @@ const DynamicZone = ({ attribute, disabled: disabledProp, hint, label, labelActi
|
|
|
98
98
|
}
|
|
99
99
|
setAddComponentIsOpen(false);
|
|
100
100
|
const form = createDefaultForm(schema, components);
|
|
101
|
-
const transformations =
|
|
101
|
+
const transformations = flow(transformDocument(schema, components), (data)=>({
|
|
102
102
|
...data,
|
|
103
103
|
__component: uid
|
|
104
104
|
}));
|
|
@@ -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 { 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: rawValue, error } = useField<Array<DzWithTempKey>>(name);\n // `value` can be `null` (for example after closing a relation modal). Match\n // RepeatableComponent: only accept arrays, otherwise treat as empty. (#26815)\n const value = React.useMemo(() => (Array.isArray(rawValue) ? rawValue : []), [rawValue]);\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 componentSchema = components[componentUid];\n\n if (!componentSchema) {\n return acc;\n }\n\n const { category, info } = componentSchema;\n\n const component = {\n uid: componentUid,\n displayName: info.displayName,\n icon: info.icon,\n preview: info.preview,\n };\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 const schema = components[uid];\n\n if (!schema) {\n return;\n }\n\n setAddComponentIsOpen(false);\n\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","rawValue","error","useField","useMemo","Array","isArray","prevValue","usePrev","useEffect","length","prevKeys","Set","map","v","__temp_key__","newItem","find","has","currentKeys","handleForceOpenHandled","useCallback","dynamicComponentsByCategory","reduce","acc","componentUid","componentSchema","category","info","component","uid","displayName","icon","preview","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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"}
|
|
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 flow from 'lodash/flow';\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: rawValue, error } = useField<Array<DzWithTempKey>>(name);\n // `value` can be `null` (for example after closing a relation modal). Match\n // RepeatableComponent: only accept arrays, otherwise treat as empty. (#26815)\n const value = React.useMemo(() => (Array.isArray(rawValue) ? rawValue : []), [rawValue]);\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 componentSchema = components[componentUid];\n\n if (!componentSchema) {\n return acc;\n }\n\n const { category, info } = componentSchema;\n\n const component = {\n uid: componentUid,\n displayName: info.displayName,\n icon: info.icon,\n preview: info.preview,\n };\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 const schema = components[uid];\n\n if (!schema) {\n return;\n }\n\n setAddComponentIsOpen(false);\n\n const form = createDefaultForm(schema, components);\n const transformations = flow(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","rawValue","error","useField","useMemo","Array","isArray","prevValue","usePrev","useEffect","length","prevKeys","Set","map","v","__temp_key__","newItem","find","has","currentKeys","handleForceOpenHandled","useCallback","dynamicComponentsByCategory","reduce","acc","componentUid","componentSchema","category","info","component","uid","displayName","icon","preview","formatMessage","useIntl","toggleNotification","useNotification","dynamicDisplayedComponentsLength","handleAddComponent","position","schema","form","createDefaultForm","transformations","flow","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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"}
|
|
@@ -20,6 +20,7 @@ require('../../../../../preview/pages/Preview.js');
|
|
|
20
20
|
var documents = require('../../../../../services/documents.js');
|
|
21
21
|
var useDocumentLayout = require('../../../../../hooks/useDocumentLayout.js');
|
|
22
22
|
var DocumentRBAC = require('../../../../../features/DocumentRBAC.js');
|
|
23
|
+
var objects = require('../../../../../utils/objects.js');
|
|
23
24
|
var validation = require('../../../../../utils/validation.js');
|
|
24
25
|
var DocumentActions = require('../../DocumentActions.js');
|
|
25
26
|
var FormLayout = require('../../FormLayout.js');
|
|
@@ -61,6 +62,8 @@ const getFullPageUrl = (currentDocumentMeta)=>{
|
|
|
61
62
|
const queryParams = currentDocumentMeta.params?.locale ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}` : '';
|
|
62
63
|
return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}${isSingleType ? '' : '/' + currentDocumentMeta.documentId}${queryParams}`;
|
|
63
64
|
};
|
|
65
|
+
const getDocumentHistoryKey = (meta)=>`${meta.model}::${meta.documentId}`;
|
|
66
|
+
const EMPTY_PENDING_CONNECTS = [];
|
|
64
67
|
function reducer(state, action) {
|
|
65
68
|
switch(action.type){
|
|
66
69
|
case 'GO_TO_RELATION':
|
|
@@ -70,7 +73,8 @@ function reducer(state, action) {
|
|
|
70
73
|
confirmDialogIntent: action.payload.document,
|
|
71
74
|
fieldToConnect: action.payload.fieldToConnect,
|
|
72
75
|
fieldToConnectUID: action.payload.fieldToConnectUID,
|
|
73
|
-
getParentFormValues: action.payload.getParentFormValues
|
|
76
|
+
getParentFormValues: action.payload.getParentFormValues,
|
|
77
|
+
setParentFormValue: action.payload.setParentFormValue
|
|
74
78
|
};
|
|
75
79
|
}
|
|
76
80
|
const lastItemDocumentHistory = state.documentHistory.at(-1);
|
|
@@ -88,7 +92,8 @@ function reducer(state, action) {
|
|
|
88
92
|
isModalOpen: true,
|
|
89
93
|
fieldToConnect: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnect,
|
|
90
94
|
fieldToConnectUID: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnectUID,
|
|
91
|
-
getParentFormValues: hasToResetDocumentHistory ? undefined : action.payload.getParentFormValues
|
|
95
|
+
getParentFormValues: hasToResetDocumentHistory ? undefined : action.payload.getParentFormValues,
|
|
96
|
+
setParentFormValue: hasToResetDocumentHistory ? undefined : action.payload.setParentFormValue
|
|
92
97
|
};
|
|
93
98
|
case 'GO_BACK':
|
|
94
99
|
if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {
|
|
@@ -114,24 +119,40 @@ function reducer(state, action) {
|
|
|
114
119
|
documentHistory: [],
|
|
115
120
|
hasUnsavedChanges: false,
|
|
116
121
|
isModalOpen: false,
|
|
117
|
-
confirmDialogIntent: null
|
|
118
|
-
};
|
|
119
|
-
case 'GO_TO_CREATED_RELATION':
|
|
120
|
-
return {
|
|
121
|
-
...state,
|
|
122
|
-
// Reset document history if the last item has documentId undefined
|
|
123
|
-
documentHistory: state.documentHistory ? [
|
|
124
|
-
...state.documentHistory.slice(0, -1),
|
|
125
|
-
action.payload.document
|
|
126
|
-
] : [
|
|
127
|
-
action.payload.document
|
|
128
|
-
],
|
|
129
122
|
confirmDialogIntent: null,
|
|
130
|
-
|
|
131
|
-
fieldToConnect: undefined,
|
|
132
|
-
fieldToConnectUID: undefined,
|
|
133
|
-
getParentFormValues: undefined
|
|
123
|
+
pendingConnects: {}
|
|
134
124
|
};
|
|
125
|
+
case 'GO_TO_CREATED_RELATION':
|
|
126
|
+
{
|
|
127
|
+
// Anything beyond the second-to-last history entry is a nested parent still open further up
|
|
128
|
+
// the stack — the root document (outside documentHistory entirely) is handled directly via
|
|
129
|
+
// setParentFormValue instead, since its Form never gets replaced by modal navigation.
|
|
130
|
+
const nestedParentMeta = state.documentHistory.length >= 2 ? state.documentHistory.at(-2) : undefined;
|
|
131
|
+
const pendingConnects = nestedParentMeta && action.payload.connectPatch ? {
|
|
132
|
+
...state.pendingConnects,
|
|
133
|
+
[getDocumentHistoryKey(nestedParentMeta)]: [
|
|
134
|
+
...state.pendingConnects[getDocumentHistoryKey(nestedParentMeta)] ?? [],
|
|
135
|
+
action.payload.connectPatch
|
|
136
|
+
]
|
|
137
|
+
} : state.pendingConnects;
|
|
138
|
+
return {
|
|
139
|
+
...state,
|
|
140
|
+
// Reset document history if the last item has documentId undefined
|
|
141
|
+
documentHistory: state.documentHistory ? [
|
|
142
|
+
...state.documentHistory.slice(0, -1),
|
|
143
|
+
action.payload.document
|
|
144
|
+
] : [
|
|
145
|
+
action.payload.document
|
|
146
|
+
],
|
|
147
|
+
confirmDialogIntent: null,
|
|
148
|
+
isModalOpen: true,
|
|
149
|
+
fieldToConnect: undefined,
|
|
150
|
+
fieldToConnectUID: undefined,
|
|
151
|
+
getParentFormValues: undefined,
|
|
152
|
+
setParentFormValue: undefined,
|
|
153
|
+
pendingConnects
|
|
154
|
+
};
|
|
155
|
+
}
|
|
135
156
|
case 'CANCEL_CONFIRM_DIALOG':
|
|
136
157
|
return {
|
|
137
158
|
...state,
|
|
@@ -152,17 +173,44 @@ function reducer(state, action) {
|
|
|
152
173
|
isModalOpen: false,
|
|
153
174
|
fieldToConnect: undefined,
|
|
154
175
|
fieldToConnectUID: undefined,
|
|
155
|
-
getParentFormValues: undefined
|
|
176
|
+
getParentFormValues: undefined,
|
|
177
|
+
setParentFormValue: undefined,
|
|
178
|
+
pendingConnects: {}
|
|
156
179
|
};
|
|
157
180
|
case 'SET_HAS_UNSAVED_CHANGES':
|
|
158
181
|
return {
|
|
159
182
|
...state,
|
|
160
183
|
hasUnsavedChanges: action.payload.hasUnsavedChanges
|
|
161
184
|
};
|
|
185
|
+
case 'CLEAR_PENDING_CONNECTS':
|
|
186
|
+
{
|
|
187
|
+
const key = getDocumentHistoryKey(action.payload.documentMeta);
|
|
188
|
+
if (!(key in state.pendingConnects)) {
|
|
189
|
+
return state;
|
|
190
|
+
}
|
|
191
|
+
const pendingConnects = {
|
|
192
|
+
...state.pendingConnects
|
|
193
|
+
};
|
|
194
|
+
delete pendingConnects[key];
|
|
195
|
+
return {
|
|
196
|
+
...state,
|
|
197
|
+
pendingConnects
|
|
198
|
+
};
|
|
199
|
+
}
|
|
162
200
|
default:
|
|
163
201
|
return state;
|
|
164
202
|
}
|
|
165
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* Whether any relation-on-the-fly modal is currently open, anywhere on the page.
|
|
206
|
+
*
|
|
207
|
+
* The modal's React context (`RelationModalProvider`, below) only reaches the modal's own subtree
|
|
208
|
+
* (the relation field that renders it), so components mounted outside that subtree — like the
|
|
209
|
+
* background entry's save/publish buttons in the side panel — can't read `state.isModalOpen` from
|
|
210
|
+
* context. This module-level counter is the cross-tree signal those components use instead, so
|
|
211
|
+
* they can tell a relation modal is open and suppress their own keyboard shortcuts while it is.
|
|
212
|
+
*/ let openRelationModalCount = 0;
|
|
213
|
+
const isAnyRelationModalOpen = ()=>openRelationModalCount > 0;
|
|
166
214
|
const [RelationModalProvider, useRelationModal] = strapiAdmin.createContext('RelationModal');
|
|
167
215
|
function isRenderProp(children) {
|
|
168
216
|
return typeof children === 'function';
|
|
@@ -174,7 +222,8 @@ const RootRelationRenderer = (props)=>{
|
|
|
174
222
|
confirmDialogIntent: null,
|
|
175
223
|
isModalOpen: false,
|
|
176
224
|
hasUnsavedChanges: false,
|
|
177
|
-
fieldToConnect: undefined
|
|
225
|
+
fieldToConnect: undefined,
|
|
226
|
+
pendingConnects: {}
|
|
178
227
|
});
|
|
179
228
|
const rootDocument = useDocument.useDoc();
|
|
180
229
|
const [{ query }] = strapiAdmin.useQueryParams();
|
|
@@ -195,6 +244,18 @@ const RootRelationRenderer = (props)=>{
|
|
|
195
244
|
// TODO: check if we can remove the single type check
|
|
196
245
|
const isSingleType = currentDocumentMeta.collectionType === collections.SINGLE_TYPES;
|
|
197
246
|
const isCreating = !currentDocumentMeta.documentId && !isSingleType;
|
|
247
|
+
const { isModalOpen } = state;
|
|
248
|
+
React__namespace.useEffect(()=>{
|
|
249
|
+
if (!isModalOpen) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
openRelationModalCount += 1;
|
|
253
|
+
return ()=>{
|
|
254
|
+
openRelationModalCount -= 1;
|
|
255
|
+
};
|
|
256
|
+
}, [
|
|
257
|
+
isModalOpen
|
|
258
|
+
]);
|
|
198
259
|
/**
|
|
199
260
|
* There is no parent relation, so the relation modal doesn't exist. Create it and set up all the
|
|
200
261
|
* pieces that will be used by potential child relations: the context, header, form, and footer.
|
|
@@ -301,13 +362,35 @@ const RelationModal = ({ children })=>{
|
|
|
301
362
|
const parentDocument = useDocument.useDocument(parentDocumentMeta, {
|
|
302
363
|
skip: !isCreating || !state.fieldToConnect
|
|
303
364
|
});
|
|
304
|
-
const
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
365
|
+
const pendingConnectsForCurrent = useRelationModal('RelationModalForm', (state)=>state.state.pendingConnects[getDocumentHistoryKey(currentDocumentMeta)], false) ?? EMPTY_PENDING_CONNECTS;
|
|
366
|
+
// Re-apply any local "connect" edits recorded for this document while a nested child was open,
|
|
367
|
+
// since navigating here just replaced the Form's values with a fresh, patch-less snapshot.
|
|
368
|
+
const initialValues = React__namespace.useMemo(()=>{
|
|
369
|
+
const baseInitialValues = prefillParentRelation({
|
|
370
|
+
initialValues: currentDocument.getInitialFormValues(isCreating),
|
|
371
|
+
fieldToConnect: isCreating ? state.fieldToConnect : undefined,
|
|
372
|
+
childSchema: currentDocument.schema,
|
|
373
|
+
parentDocument: parentDocument.document,
|
|
374
|
+
parentModel: parentDocumentMeta.model
|
|
375
|
+
});
|
|
376
|
+
// The document (and its default values) may still be loading, e.g. right after navigating
|
|
377
|
+
// back to a document that now has a real documentId. Let the loading guard below handle it
|
|
378
|
+
// instead of trying to patch a value that doesn't exist yet.
|
|
379
|
+
if (!baseInitialValues) {
|
|
380
|
+
return baseInitialValues;
|
|
381
|
+
}
|
|
382
|
+
return pendingConnectsForCurrent.reduce((values, patch)=>{
|
|
383
|
+
const withRelation = objects.setIn(values, patch.fieldToConnect, patch.relationValue);
|
|
384
|
+
return patch.componentUIDPath && patch.componentUID !== undefined ? objects.setIn(withRelation, patch.componentUIDPath, patch.componentUID) : withRelation;
|
|
385
|
+
}, baseInitialValues);
|
|
386
|
+
}, [
|
|
387
|
+
currentDocument,
|
|
388
|
+
isCreating,
|
|
389
|
+
state.fieldToConnect,
|
|
390
|
+
parentDocument.document,
|
|
391
|
+
parentDocumentMeta.model,
|
|
392
|
+
pendingConnectsForCurrent
|
|
393
|
+
]);
|
|
311
394
|
/*
|
|
312
395
|
* We must wrap the modal window with Component Provider with reset values
|
|
313
396
|
* to avoid inheriting id and uid from the root document and having weird
|
|
@@ -505,7 +588,8 @@ const RelationModal = ({ children })=>{
|
|
|
505
588
|
shouldBypassConfirmation: true,
|
|
506
589
|
fieldToConnect: state.fieldToConnect,
|
|
507
590
|
fieldToConnectUID: state.fieldToConnectUID,
|
|
508
|
-
getParentFormValues: state.getParentFormValues
|
|
591
|
+
getParentFormValues: state.getParentFormValues,
|
|
592
|
+
setParentFormValue: state.setParentFormValue
|
|
509
593
|
}
|
|
510
594
|
});
|
|
511
595
|
}
|
|
@@ -636,9 +720,36 @@ const StyledRelationLink = styledComponents.styled(reactRouterDom.Link)`
|
|
|
636
720
|
document: currentDocument.document,
|
|
637
721
|
meta: currentDocument.meta
|
|
638
722
|
};
|
|
639
|
-
return /*#__PURE__*/ jsxRuntime.
|
|
723
|
+
return /*#__PURE__*/ jsxRuntime.jsx(DocumentRBAC.DocumentRBAC, {
|
|
640
724
|
permissions: permissions,
|
|
641
725
|
model: currentDocumentMeta.model,
|
|
726
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(RelationModalFormBody, {
|
|
727
|
+
currentDocument: currentDocument,
|
|
728
|
+
documentTitle: documentTitle,
|
|
729
|
+
hasDraftAndPublished: hasDraftAndPublished,
|
|
730
|
+
layout: documentLayoutResponse.edit.layout,
|
|
731
|
+
plugins: plugins,
|
|
732
|
+
props: props
|
|
733
|
+
})
|
|
734
|
+
});
|
|
735
|
+
};
|
|
736
|
+
/**
|
|
737
|
+
* Rendered as the child of `DocumentRBAC` so it can wait on `useDocumentRBAC`'s `isLoading`
|
|
738
|
+
* before showing the document actions and form — otherwise fields briefly render as
|
|
739
|
+
* not-allowed while permissions are still resolving.
|
|
740
|
+
*/ const RelationModalFormBody = ({ currentDocument, documentTitle, hasDraftAndPublished, layout, plugins, props })=>{
|
|
741
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
742
|
+
const isLoadingActionsRBAC = DocumentRBAC.useDocumentRBAC('RelationModalFormBody', (state)=>state.isLoading);
|
|
743
|
+
if (isLoadingActionsRBAC) {
|
|
744
|
+
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Loader, {
|
|
745
|
+
small: true,
|
|
746
|
+
children: formatMessage({
|
|
747
|
+
id: 'content-manager.ListViewTable.relation-loading',
|
|
748
|
+
defaultMessage: 'Relations are loading'
|
|
749
|
+
})
|
|
750
|
+
});
|
|
751
|
+
}
|
|
752
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
642
753
|
children: [
|
|
643
754
|
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
644
755
|
alignItems: "flex-start",
|
|
@@ -709,7 +820,7 @@ const StyledRelationLink = styledComponents.styled(reactRouterDom.Link)`
|
|
|
709
820
|
overflow: "auto",
|
|
710
821
|
flex: 1,
|
|
711
822
|
children: /*#__PURE__*/ jsxRuntime.jsx(FormLayout.FormLayout, {
|
|
712
|
-
layout:
|
|
823
|
+
layout: layout,
|
|
713
824
|
document: currentDocument,
|
|
714
825
|
hasBackground: false
|
|
715
826
|
})
|
|
@@ -719,10 +830,12 @@ const StyledRelationLink = styledComponents.styled(reactRouterDom.Link)`
|
|
|
719
830
|
});
|
|
720
831
|
};
|
|
721
832
|
|
|
833
|
+
exports.RelationModalFormBody = RelationModalFormBody;
|
|
722
834
|
exports.RelationModalRenderer = RelationModalRenderer;
|
|
723
835
|
exports.generateCreateUrl = generateCreateUrl;
|
|
724
836
|
exports.getCollectionType = getCollectionType;
|
|
725
837
|
exports.getFullPageUrl = getFullPageUrl;
|
|
838
|
+
exports.isAnyRelationModalOpen = isAnyRelationModalOpen;
|
|
726
839
|
exports.prefillParentRelation = prefillParentRelation;
|
|
727
840
|
exports.reducer = reducer;
|
|
728
841
|
exports.useRelationModal = useRelationModal;
|