@strapi/content-manager 5.39.0 → 5.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/admin/hooks/useDocument.js +21 -5
  2. package/dist/admin/hooks/useDocument.js.map +1 -1
  3. package/dist/admin/hooks/useDocument.mjs +22 -6
  4. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  5. package/dist/admin/pages/EditView/components/DocumentActions.js +1 -0
  6. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  7. package/dist/admin/pages/EditView/components/DocumentActions.mjs +3 -2
  8. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  9. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +4 -4
  10. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  11. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +71 -44
  12. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  13. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +54 -46
  14. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  15. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +107 -88
  16. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +109 -90
  18. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +91 -106
  20. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +94 -109
  22. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +43 -23
  24. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +45 -25
  26. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +2 -2
  28. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +30 -19
  29. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  30. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +34 -23
  31. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  32. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +1 -1
  34. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.mjs +1 -1
  35. package/dist/admin/pages/EditView/components/FormLayout.js +23 -3
  36. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormLayout.mjs +4 -3
  38. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/Header.js +3 -0
  40. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/Header.mjs +3 -0
  42. package/dist/admin/pages/EditView/components/Header.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/InputRenderer.js +19 -7
  44. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  45. package/dist/admin/pages/EditView/components/InputRenderer.mjs +20 -8
  46. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  47. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +11 -15
  48. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  49. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +11 -16
  50. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  51. package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +3 -2
  52. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +3 -2
  53. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +3 -3
  54. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +1 -1
  55. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +1 -1
  56. package/dist/admin/src/pages/ListView/components/BulkActions/PublishAction.d.ts +3 -0
  57. package/dist/admin/src/pages/ListView/components/Filters.d.ts +3 -0
  58. package/dist/server/services/utils/draft.js +8 -1
  59. package/dist/server/services/utils/draft.js.map +1 -1
  60. package/dist/server/services/utils/draft.mjs +8 -1
  61. package/dist/server/services/utils/draft.mjs.map +1 -1
  62. package/dist/server/services/utils/populate.js +16 -1
  63. package/dist/server/services/utils/populate.js.map +1 -1
  64. package/dist/server/services/utils/populate.mjs +16 -1
  65. package/dist/server/services/utils/populate.mjs.map +1 -1
  66. package/dist/server/src/services/utils/draft.d.ts.map +1 -1
  67. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  68. package/package.json +6 -6
@@ -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 { 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, removeFieldRow, moveFieldRow } = useForm(\n 'DynamicZone',\n ({ addFieldRow, removeFieldRow, moveFieldRow }) => ({\n addFieldRow,\n removeFieldRow,\n moveFieldRow,\n })\n );\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 = (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\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 = (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: getItemPos(newIndex),\n }\n )\n );\n\n moveFieldRow(name, currentIndex, newIndex);\n };\n\n const getItemPos = (index: number) => `${index + 1} of ${value.length}`;\n\n const handleCancel = (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\n const handleGrabItem = (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: getItemPos(index),\n }\n )\n );\n };\n\n const handleDropItem = (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: getItemPos(index),\n }\n )\n );\n };\n\n const handleRemoveComponent = (name: string, currentIndex: number) => () => {\n removeFieldRow(name, currentIndex);\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(name, index)}\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","removeFieldRow","moveFieldRow","useForm","value","error","useField","dynamicComponentsByCategory","useMemo","reduce","acc","componentUid","category","info","component","uid","displayName","icon","formatMessage","useIntl","toggleNotification","useNotification","dynamicDisplayedComponentsLength","length","handleAddComponent","position","schema","form","createDefaultForm","transformations","pipe","transformDocument","data","__component","handleClickOpenPicker","prev","type","message","id","getTranslation","handleMoveComponent","newIndex","currentIndex","defaultMessage","item","getItemPos","index","handleCancel","handleGrabItem","handleDropItem","handleRemoveComponent","hasError","undefined","renderButtonLabel","number","componentName","level","useComponent","state","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.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 { 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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"}
@@ -11,7 +11,7 @@ import { createDefaultForm } from '../../../utils/forms.mjs';
11
11
  import { useComponent, ComponentProvider } from '../ComponentContext.mjs';
12
12
  import { AddComponentButton } from './AddComponentButton.mjs';
13
13
  import { ComponentPicker } from './ComponentPicker.mjs';
14
- import { DynamicComponent } from './DynamicComponent.mjs';
14
+ import { DynamicComponent as MemoizedDynamicComponent } from './DynamicComponent.mjs';
15
15
  import { DynamicZoneLabel } from './DynamicZoneLabel.mjs';
16
16
 
17
17
  const [DynamicZoneProvider, useDynamicZone] = createContext('DynamicZone', {
@@ -24,11 +24,9 @@ const DynamicZone = ({ attribute, disabled: disabledProp, hint, label, labelActi
24
24
  const [liveText, setLiveText] = React.useState('');
25
25
  const { currentDocument: { components, isLoading } } = useDocumentContext('DynamicZone');
26
26
  const disabled = disabledProp || isLoading;
27
- const { addFieldRow, removeFieldRow, moveFieldRow } = useForm('DynamicZone', ({ addFieldRow, removeFieldRow, moveFieldRow })=>({
28
- addFieldRow,
29
- removeFieldRow,
30
- moveFieldRow
31
- }));
27
+ const addFieldRow = useForm('DynamicZone', (state)=>state.addFieldRow);
28
+ const removeFieldRow = useForm('DynamicZone', (state)=>state.removeFieldRow);
29
+ const moveFieldRow = useForm('DynamicZone', (state)=>state.moveFieldRow);
32
30
  const { value = [], error } = useField(name);
33
31
  const dynamicComponentsByCategory = React.useMemo(()=>{
34
32
  return attribute.components.reduce((acc, componentUid)=>{
@@ -56,7 +54,7 @@ const DynamicZone = ({ attribute, disabled: disabledProp, hint, label, labelActi
56
54
  const { formatMessage } = useIntl();
57
55
  const { toggleNotification } = useNotification();
58
56
  const dynamicDisplayedComponentsLength = value.length;
59
- const handleAddComponent = (uid, position)=>{
57
+ const handleAddComponent = React.useCallback((uid, position)=>{
60
58
  setAddComponentIsOpen(false);
61
59
  const schema = components[uid];
62
60
  const form = createDefaultForm(schema, components);
@@ -66,7 +64,11 @@ const DynamicZone = ({ attribute, disabled: disabledProp, hint, label, labelActi
66
64
  }));
67
65
  const data = transformations(form);
68
66
  addFieldRow(name, data, position);
69
- };
67
+ }, [
68
+ addFieldRow,
69
+ components,
70
+ name
71
+ ]);
70
72
  const handleClickOpenPicker = ()=>{
71
73
  if (dynamicDisplayedComponentsLength < max) {
72
74
  setAddComponentIsOpen((prev)=>!prev);
@@ -79,46 +81,64 @@ const DynamicZone = ({ attribute, disabled: disabledProp, hint, label, labelActi
79
81
  });
80
82
  }
81
83
  };
82
- const handleMoveComponent = (newIndex, currentIndex)=>{
84
+ const handleMoveComponent = React.useCallback((newIndex, currentIndex)=>{
83
85
  setLiveText(formatMessage({
84
86
  id: getTranslation('dnd.reorder'),
85
87
  defaultMessage: '{item}, moved. New position in list: {position}.'
86
88
  }, {
87
89
  item: `${name}.${currentIndex}`,
88
- position: getItemPos(newIndex)
90
+ position: `${newIndex + 1} of ${value.length}`
89
91
  }));
90
92
  moveFieldRow(name, currentIndex, newIndex);
91
- };
92
- const getItemPos = (index)=>`${index + 1} of ${value.length}`;
93
- const handleCancel = (index)=>{
93
+ }, [
94
+ formatMessage,
95
+ moveFieldRow,
96
+ name,
97
+ value.length
98
+ ]);
99
+ const handleCancel = React.useCallback((index)=>{
94
100
  setLiveText(formatMessage({
95
101
  id: getTranslation('dnd.cancel-item'),
96
102
  defaultMessage: '{item}, dropped. Re-order cancelled.'
97
103
  }, {
98
104
  item: `${name}.${index}`
99
105
  }));
100
- };
101
- const handleGrabItem = (index)=>{
106
+ }, [
107
+ formatMessage,
108
+ name
109
+ ]);
110
+ const handleGrabItem = React.useCallback((index)=>{
102
111
  setLiveText(formatMessage({
103
112
  id: getTranslation('dnd.grab-item'),
104
113
  defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
105
114
  }, {
106
115
  item: `${name}.${index}`,
107
- position: getItemPos(index)
116
+ position: `${index + 1} of ${value.length}`
108
117
  }));
109
- };
110
- const handleDropItem = (index)=>{
118
+ }, [
119
+ formatMessage,
120
+ name,
121
+ value.length
122
+ ]);
123
+ const handleDropItem = React.useCallback((index)=>{
111
124
  setLiveText(formatMessage({
112
125
  id: getTranslation('dnd.drop-item'),
113
126
  defaultMessage: `{item}, dropped. Final position in list: {position}.`
114
127
  }, {
115
128
  item: `${name}.${index}`,
116
- position: getItemPos(index)
129
+ position: `${index + 1} of ${value.length}`
117
130
  }));
118
- };
119
- const handleRemoveComponent = (name, currentIndex)=>()=>{
120
- removeFieldRow(name, currentIndex);
121
- };
131
+ }, [
132
+ formatMessage,
133
+ name,
134
+ value.length
135
+ ]);
136
+ const handleRemoveComponent = React.useCallback((currentIndex)=>{
137
+ removeFieldRow(name, currentIndex);
138
+ }, [
139
+ name,
140
+ removeFieldRow
141
+ ]);
122
142
  const hasError = error !== undefined;
123
143
  const renderButtonLabel = ()=>{
124
144
  if (addComponentIsOpen) {
@@ -191,13 +211,13 @@ const DynamicZone = ({ attribute, disabled: disabledProp, hint, label, labelActi
191
211
  // id is always a number in a dynamic zone.
192
212
  id: field.id,
193
213
  type: "dynamiczone",
194
- children: /*#__PURE__*/ jsx(DynamicComponent, {
214
+ children: /*#__PURE__*/ jsx(MemoizedDynamicComponent, {
195
215
  disabled: disabled,
196
216
  name: name,
197
217
  index: index,
198
218
  componentUid: field.__component,
199
219
  onMoveComponent: handleMoveComponent,
200
- onRemoveComponentClick: handleRemoveComponent(name, index),
220
+ onRemoveComponentClick: handleRemoveComponent,
201
221
  onCancel: handleCancel,
202
222
  onDropItem: handleDropItem,
203
223
  onGrabItem: handleGrabItem,
@@ -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, removeFieldRow, moveFieldRow } = useForm(\n 'DynamicZone',\n ({ addFieldRow, removeFieldRow, moveFieldRow }) => ({\n addFieldRow,\n removeFieldRow,\n moveFieldRow,\n })\n );\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 = (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\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 = (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: getItemPos(newIndex),\n }\n )\n );\n\n moveFieldRow(name, currentIndex, newIndex);\n };\n\n const getItemPos = (index: number) => `${index + 1} of ${value.length}`;\n\n const handleCancel = (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\n const handleGrabItem = (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: getItemPos(index),\n }\n )\n );\n };\n\n const handleDropItem = (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: getItemPos(index),\n }\n )\n );\n };\n\n const handleRemoveComponent = (name: string, currentIndex: number) => () => {\n removeFieldRow(name, currentIndex);\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(name, index)}\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","removeFieldRow","moveFieldRow","useForm","value","error","useField","dynamicComponentsByCategory","useMemo","reduce","acc","componentUid","category","info","component","uid","displayName","icon","formatMessage","useIntl","toggleNotification","useNotification","dynamicDisplayedComponentsLength","length","handleAddComponent","position","schema","form","createDefaultForm","transformations","pipe","transformDocument","data","__component","handleClickOpenPicker","prev","type","message","id","getTranslation","handleMoveComponent","newIndex","currentIndex","defaultMessage","item","getItemPos","index","handleCancel","handleGrabItem","handleDropItem","handleRemoveComponent","hasError","undefined","renderButtonLabel","number","componentName","level","useComponent","state","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 { 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,10 +1,10 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import { createContext, useQueryParams, Form, useForm, ConfirmDialog, useStrapiApp, useRBAC, DescriptionComponentRenderer } from '@strapi/admin/strapi-admin';
4
- import { Modal, TextButton, Flex, IconButton, Typography, Dialog, Loader, EmptyStateLayout, Box } from '@strapi/design-system';
4
+ import { Modal, Flex, IconButton, Typography, TextButton, Dialog, Loader, EmptyStateLayout, Box } from '@strapi/design-system';
5
5
  import { ArrowLeft, ArrowsOut, WarningCircle } from '@strapi/icons';
6
6
  import { useIntl } from 'react-intl';
7
- import { Link, useNavigate, useLocation } from 'react-router-dom';
7
+ import { useNavigate, Link, useLocation } from 'react-router-dom';
8
8
  import { styled } from 'styled-components';
9
9
  import { COLLECTION_TYPES, SINGLE_TYPES } from '../../../../../constants/collections.mjs';
10
10
  import { PERMISSIONS } from '../../../../../constants/plugin.mjs';
@@ -383,11 +383,11 @@ const EMPTY_RELATION_RESULTS = [];
383
383
  currentDocumentMeta.params
384
384
  ]);
385
385
  const hasNextPage = data?.pagination ? data.pagination.page < data.pagination.pageCount : false;
386
- const options = data?.results ?? [];
387
386
  const handleChange = React__namespace.useCallback((relationId)=>{
388
387
  if (!relationId) {
389
388
  return;
390
389
  }
390
+ const options = data?.results ?? [];
391
391
  const relation = options.find((opt)=>opt.id.toString() === relationId);
392
392
  if (!relation) {
393
393
  // This is very unlikely to happen, but it ensures we don't have any data for.
@@ -409,9 +409,9 @@ const EMPTY_RELATION_RESULTS = [];
409
409
  *
410
410
  */ onChange(relation);
411
411
  }, [
412
+ data,
412
413
  formatMessage,
413
414
  onChange,
414
- options,
415
415
  toggleNotification
416
416
  ]);
417
417
  const relation = React__namespace.useMemo(()=>({
@@ -636,6 +636,9 @@ const RelationsList = ({ data, serverData, disabled, name, isLoading, relationTy
636
636
  isLoading,
637
637
  data.length
638
638
  ]);
639
+ const getItemPos = React__namespace.useCallback((index)=>`${index + 1} of ${data.length}`, [
640
+ data.length
641
+ ]);
639
642
  const handleMoveItem = React__namespace.useCallback((newIndex, oldIndex)=>{
640
643
  const item = data[oldIndex];
641
644
  setLiveText(formatMessage({
@@ -643,7 +646,7 @@ const RelationsList = ({ data, serverData, disabled, name, isLoading, relationTy
643
646
  defaultMessage: '{item}, moved. New position in list: {position}.'
644
647
  }, {
645
648
  item: item.label ?? item.documentId,
646
- position: `${newIndex + 1} of ${data.length}`
649
+ position: getItemPos(newIndex)
647
650
  }));
648
651
  /**
649
652
  * Splicing mutates the array, so we need to create a new array
@@ -699,10 +702,11 @@ const RelationsList = ({ data, serverData, disabled, name, isLoading, relationTy
699
702
  field.onChange(`${name}.connect`, connectedRelations);
700
703
  }, [
701
704
  data,
705
+ serverData,
702
706
  field,
703
- formatMessage,
704
707
  name,
705
- serverData
708
+ formatMessage,
709
+ getItemPos
706
710
  ]);
707
711
  const handleGrabItem = React__namespace.useCallback((index)=>{
708
712
  const item = data[index];
@@ -711,11 +715,12 @@ const RelationsList = ({ data, serverData, disabled, name, isLoading, relationTy
711
715
  defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
712
716
  }, {
713
717
  item: item.label ?? item.documentId,
714
- position: `${index + 1} of ${data.length}`
718
+ position: getItemPos(index)
715
719
  }));
716
720
  }, [
717
721
  data,
718
- formatMessage
722
+ formatMessage,
723
+ getItemPos
719
724
  ]);
720
725
  const handleDropItem = React__namespace.useCallback((index)=>{
721
726
  const { href: _href, label, ...item } = data[index];
@@ -724,11 +729,12 @@ const RelationsList = ({ data, serverData, disabled, name, isLoading, relationTy
724
729
  defaultMessage: `{item}, dropped. Final position in list: {position}.`
725
730
  }, {
726
731
  item: label ?? item.documentId,
727
- position: `${index + 1} of ${data.length}`
732
+ position: getItemPos(index)
728
733
  }));
729
734
  }, [
730
735
  data,
731
- formatMessage
736
+ formatMessage,
737
+ getItemPos
732
738
  ]);
733
739
  const handleCancel = React__namespace.useCallback((index)=>{
734
740
  const item = data[index];
@@ -846,7 +852,7 @@ const RelationRow = styledComponents.styled(designSystem.Flex)`
846
852
  padding-bottom: ${({ theme })=>theme.spaces[2]};
847
853
  }
848
854
  `;
849
- const ListItem = ({ data, index, style })=>{
855
+ const ListItem = /*#__PURE__*/ React__namespace.memo(({ data, index, style })=>{
850
856
  const { ariaDescribedBy, canDrag = false, disabled = false, handleCancel, handleDisconnect, handleDropItem, handleGrabItem, handleMoveItem, name, relations, targetModel, documentParams, mainField } = data;
851
857
  const isDesktop = strapiAdmin.useIsDesktop();
852
858
  const { formatMessage } = reactIntl.useIntl();
@@ -890,14 +896,19 @@ const ListItem = ({ data, index, style })=>{
890
896
  ]);
891
897
  const safeDocumentId = documentId ?? apiData?.documentId;
892
898
  const safeLocale = locale ?? apiData?.locale ?? null;
893
- const documentMeta = {
894
- documentId: safeDocumentId,
895
- model: targetModel,
896
- collectionType: RelationModal.getCollectionType(href),
897
- params: {
898
- locale: safeLocale
899
- }
900
- };
899
+ const documentMeta = React__namespace.useMemo(()=>({
900
+ documentId: safeDocumentId,
901
+ model: targetModel,
902
+ collectionType: RelationModal.getCollectionType(href),
903
+ params: {
904
+ locale: safeLocale
905
+ }
906
+ }), [
907
+ safeDocumentId,
908
+ href,
909
+ safeLocale,
910
+ targetModel
911
+ ]);
901
912
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
902
913
  style: style,
903
914
  tag: "li",
@@ -973,7 +984,7 @@ const ListItem = ({ data, index, style })=>{
973
984
  ]
974
985
  })
975
986
  });
976
- };
987
+ });
977
988
  const FlexWrapper = styledComponents.styled(designSystem.Flex)`
978
989
  width: 100%;
979
990
  /* Used to prevent endAction to be pushed out of container */