@strapi/content-manager 0.0.0-experimental.7c7ba817d00aeac2e9f750e6693dc8e51a8a2659 → 0.0.0-experimental.7ec9307c395022dd904738ffdb0c9d7c4e5b24d9

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 (111) hide show
  1. package/dist/admin/hooks/useDocumentActions.js +5 -1
  2. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  3. package/dist/admin/hooks/useDocumentActions.mjs +5 -1
  4. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  5. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  6. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -1
  7. package/dist/admin/index.js +1 -3
  8. package/dist/admin/index.js.map +1 -1
  9. package/dist/admin/pages/EditView/components/DocumentActions.js +206 -21
  10. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  11. package/dist/admin/pages/EditView/components/DocumentActions.mjs +208 -23
  12. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  13. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +2 -0
  14. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  15. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +2 -0
  16. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +128 -55
  18. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +128 -55
  20. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +89 -50
  22. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +91 -52
  24. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormLayout.js +3 -3
  26. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormLayout.mjs +3 -3
  28. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  29. package/dist/admin/services/homepage.js +9 -5
  30. package/dist/admin/services/homepage.js.map +1 -1
  31. package/dist/admin/services/homepage.mjs +9 -5
  32. package/dist/admin/services/homepage.mjs.map +1 -1
  33. package/dist/admin/src/hooks/useDocumentContext.d.ts +1 -1
  34. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +26 -5
  35. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +0 -1
  36. package/dist/admin/translations/en.json.js +2 -1
  37. package/dist/admin/translations/en.json.js.map +1 -1
  38. package/dist/admin/translations/en.json.mjs +2 -1
  39. package/dist/admin/translations/en.json.mjs.map +1 -1
  40. package/dist/admin/translations/ru.json.js +235 -226
  41. package/dist/admin/translations/ru.json.js.map +1 -1
  42. package/dist/admin/translations/ru.json.mjs +230 -226
  43. package/dist/admin/translations/ru.json.mjs.map +1 -1
  44. package/dist/server/controllers/index.js +3 -1
  45. package/dist/server/controllers/index.js.map +1 -1
  46. package/dist/server/controllers/index.mjs +3 -1
  47. package/dist/server/controllers/index.mjs.map +1 -1
  48. package/dist/server/homepage/controllers/homepage.js +57 -0
  49. package/dist/server/homepage/controllers/homepage.js.map +1 -0
  50. package/dist/server/homepage/controllers/homepage.mjs +36 -0
  51. package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
  52. package/dist/server/homepage/controllers/index.js +10 -0
  53. package/dist/server/homepage/controllers/index.js.map +1 -0
  54. package/dist/server/homepage/controllers/index.mjs +8 -0
  55. package/dist/server/homepage/controllers/index.mjs.map +1 -0
  56. package/dist/server/homepage/index.js +14 -0
  57. package/dist/server/homepage/index.js.map +1 -0
  58. package/dist/server/homepage/index.mjs +12 -0
  59. package/dist/server/homepage/index.mjs.map +1 -0
  60. package/dist/server/homepage/routes/homepage.js +25 -0
  61. package/dist/server/homepage/routes/homepage.js.map +1 -0
  62. package/dist/server/homepage/routes/homepage.mjs +23 -0
  63. package/dist/server/homepage/routes/homepage.mjs.map +1 -0
  64. package/dist/server/homepage/routes/index.js +13 -0
  65. package/dist/server/homepage/routes/index.js.map +1 -0
  66. package/dist/server/homepage/routes/index.mjs +11 -0
  67. package/dist/server/homepage/routes/index.mjs.map +1 -0
  68. package/dist/server/homepage/services/homepage.js +157 -0
  69. package/dist/server/homepage/services/homepage.js.map +1 -0
  70. package/dist/server/homepage/services/homepage.mjs +155 -0
  71. package/dist/server/homepage/services/homepage.mjs.map +1 -0
  72. package/dist/server/homepage/services/index.js +10 -0
  73. package/dist/server/homepage/services/index.js.map +1 -0
  74. package/dist/server/homepage/services/index.mjs +8 -0
  75. package/dist/server/homepage/services/index.mjs.map +1 -0
  76. package/dist/server/preview/services/preview.js +0 -1
  77. package/dist/server/preview/services/preview.js.map +1 -1
  78. package/dist/server/preview/services/preview.mjs +0 -1
  79. package/dist/server/preview/services/preview.mjs.map +1 -1
  80. package/dist/server/routes/index.js +3 -1
  81. package/dist/server/routes/index.js.map +1 -1
  82. package/dist/server/routes/index.mjs +3 -1
  83. package/dist/server/routes/index.mjs.map +1 -1
  84. package/dist/server/services/index.js +3 -1
  85. package/dist/server/services/index.js.map +1 -1
  86. package/dist/server/services/index.mjs +3 -1
  87. package/dist/server/services/index.mjs.map +1 -1
  88. package/dist/server/src/controllers/index.d.ts.map +1 -1
  89. package/dist/server/src/homepage/controllers/homepage.d.ts +7 -0
  90. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
  91. package/dist/server/src/homepage/controllers/index.d.ts +2 -0
  92. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
  93. package/dist/server/src/homepage/index.d.ts +16 -0
  94. package/dist/server/src/homepage/index.d.ts.map +1 -0
  95. package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
  96. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
  97. package/dist/server/src/homepage/routes/index.d.ts +8 -0
  98. package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
  99. package/dist/server/src/{services → homepage/services}/homepage.d.ts +1 -1
  100. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
  101. package/dist/server/src/homepage/services/index.d.ts +9 -0
  102. package/dist/server/src/homepage/services/index.d.ts.map +1 -0
  103. package/dist/server/src/index.d.ts +7 -0
  104. package/dist/server/src/index.d.ts.map +1 -1
  105. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  106. package/dist/server/src/routes/index.d.ts +1 -0
  107. package/dist/server/src/routes/index.d.ts.map +1 -1
  108. package/dist/server/src/services/index.d.ts +6 -0
  109. package/dist/server/src/services/index.d.ts.map +1 -1
  110. package/package.json +5 -5
  111. package/dist/server/src/services/homepage.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Repeatable.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Repeatable.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useField, useNotification, useForm } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n TextButton,\n VisuallyHidden,\n Accordion,\n IconButton,\n useComposedRefs,\n BoxComponent,\n} from '@strapi/design-system';\nimport { Plus, Drag, Trash } from '@strapi/icons';\nimport { getEmptyImage } from 'react-dnd-html5-backend';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { ItemTypes } from '../../../../../constants/dragAndDrop';\nimport { useDocumentContext } from '../../../../../hooks/useDocumentContext';\nimport { useDragAndDrop, type UseDragAndDropOptions } from '../../../../../hooks/useDragAndDrop';\nimport { usePrev } from '../../../../../hooks/usePrev';\nimport { getIn } from '../../../../../utils/objects';\nimport { getTranslation } from '../../../../../utils/translations';\nimport { transformDocument } from '../../../utils/data';\nimport { createDefaultForm } from '../../../utils/forms';\nimport { ResponsiveGridItem, ResponsiveGridRoot } from '../../FormLayout';\nimport { ComponentProvider, useComponent } from '../ComponentContext';\n\nimport { Initializer } from './Initializer';\n\nimport type { ComponentInputProps } from './Input';\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * RepeatableComponent\n * -----------------------------------------------------------------------------------------------*/\n\ntype RepeatableComponentProps = Omit<ComponentInputProps, 'required' | 'label'>;\n\nconst RepeatableComponent = ({\n attribute,\n disabled,\n name,\n mainField,\n children,\n layout,\n}: RepeatableComponentProps) => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { search: searchString } = useLocation();\n const search = React.useMemo(() => new URLSearchParams(searchString), [searchString]);\n const { currentDocument } = useDocumentContext('RepeatableComponent');\n const components = currentDocument.components;\n\n const {\n value = [],\n error,\n rawError,\n } = useField<Schema.Attribute.ComponentValue<`${string}.${string}`, true>>(name);\n const addFieldRow = useForm('RepeatableComponent', (state) => state.addFieldRow);\n const moveFieldRow = useForm('RepeatableComponent', (state) => state.moveFieldRow);\n const removeFieldRow = useForm('RepeatableComponent', (state) => state.removeFieldRow);\n const { max = Infinity } = attribute;\n\n const [collapseToOpen, setCollapseToOpen] = React.useState<string>('');\n const [liveText, setLiveText] = React.useState('');\n\n React.useEffect(() => {\n const hasNestedErrors = rawError && Array.isArray(rawError) && rawError.length > 0;\n const hasNestedValue = value && Array.isArray(value) && value.length > 0;\n\n if (hasNestedErrors && hasNestedValue) {\n const errorOpenItems = rawError\n .map((_: unknown, idx: number) => {\n return value[idx] ? value[idx].__temp_key__ : null;\n })\n .filter((value) => !!value);\n\n if (errorOpenItems && errorOpenItems.length > 0) {\n setCollapseToOpen((collapseToOpen) => {\n if (!errorOpenItems.includes(collapseToOpen)) {\n return errorOpenItems[0];\n }\n\n return collapseToOpen;\n });\n }\n }\n }, [rawError, value]);\n\n /**\n * Get the temp key of the component that has the field that is currently focussed\n * as defined by the `field` query param. We can then force this specific component\n * to be in its \"open\" state.\n */\n const componentTmpKeyWithFocussedField = React.useMemo(() => {\n if (search.has('field')) {\n const fieldParam = search.get('field');\n\n if (!fieldParam) {\n return undefined;\n }\n\n const [, path] = fieldParam.split(`${name}.`);\n\n if (getIn(value, path, undefined) !== undefined) {\n const [subpath] = path.split('.');\n\n return getIn(value, subpath, undefined)?.__temp_key__;\n }\n }\n\n return undefined;\n }, [search, name, value]);\n\n const prevValue = usePrev(value);\n\n React.useEffect(() => {\n /**\n * When we add a new item to the array, we want to open the collapse.\n */\n if (prevValue && prevValue.length < value.length) {\n setCollapseToOpen(value[value.length - 1].__temp_key__);\n }\n }, [value, prevValue]);\n\n React.useEffect(() => {\n if (typeof componentTmpKeyWithFocussedField === 'string') {\n setCollapseToOpen(componentTmpKeyWithFocussedField);\n }\n }, [componentTmpKeyWithFocussedField]);\n\n const toggleCollapses = () => {\n setCollapseToOpen('');\n };\n\n const handleClick = () => {\n if (value.length < max) {\n const schema = components[attribute.component];\n const form = createDefaultForm(schema, components);\n const data = transformDocument(schema, components)(form);\n\n addFieldRow(name, data);\n // setCollapseToOpen(nextTempKey);\n } else if (value.length >= max) {\n toggleNotification({\n type: 'info',\n message: formatMessage({\n id: getTranslation('components.notification.info.maximum-requirement'),\n }),\n });\n }\n };\n\n const handleMoveComponentField: ComponentProps['onMoveItem'] = (newIndex, currentIndex) => {\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 handleValueChange = (key: string) => {\n setCollapseToOpen(key);\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 ariaDescriptionId = React.useId();\n\n const level = useComponent('RepeatableComponent', (state) => state.level);\n\n if (value.length === 0) {\n return <Initializer disabled={disabled} name={name} onClick={handleClick} />;\n }\n\n return (\n <Box hasRadius>\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 <AccordionRoot\n $error={error}\n value={collapseToOpen}\n onValueChange={handleValueChange}\n aria-describedby={ariaDescriptionId}\n >\n {value.map(({ __temp_key__: key, id }, index) => {\n const nameWithIndex = `${name}.${index}`;\n return (\n <ComponentProvider\n key={key}\n // id is always a number in a component\n id={id as number}\n uid={attribute.component}\n level={level + 1}\n type=\"repeatable\"\n >\n <Component\n disabled={disabled}\n name={nameWithIndex}\n attribute={attribute}\n index={index}\n mainField={mainField}\n onMoveItem={handleMoveComponentField}\n onDeleteComponent={() => {\n removeFieldRow(name, index);\n toggleCollapses();\n }}\n toggleCollapses={toggleCollapses}\n onCancel={handleCancel}\n onDropItem={handleDropItem}\n onGrabItem={handleGrabItem}\n __temp_key__={key}\n >\n {layout.map((row, index) => {\n return (\n <ResponsiveGridRoot gap={4} key={index}>\n {row.map(({ size, ...field }) => {\n /**\n * Layouts are built from schemas so they don't understand the complete\n * schema tree, for components we append the parent name to the field name\n * because this is the structure for the data & permissions also understand\n * the nesting involved.\n */\n const completeFieldName = `${nameWithIndex}.${field.name}`;\n\n const translatedLabel = formatMessage({\n id: `content-manager.components.${attribute.component}.${field.name}`,\n defaultMessage: field.label,\n });\n\n return (\n <ResponsiveGridItem\n col={size}\n key={completeFieldName}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n {children({\n ...field,\n label: translatedLabel,\n name: completeFieldName,\n document: currentDocument,\n })}\n </ResponsiveGridItem>\n );\n })}\n </ResponsiveGridRoot>\n );\n })}\n </Component>\n </ComponentProvider>\n );\n })}\n <TextButtonCustom disabled={disabled} onClick={handleClick} startIcon={<Plus />}>\n {formatMessage({\n id: getTranslation('containers.EditView.add.new-entry'),\n defaultMessage: 'Add an entry',\n })}\n </TextButtonCustom>\n </AccordionRoot>\n </Box>\n );\n};\n\nconst AccordionRoot = styled(Accordion.Root)<{ $error?: string }>`\n border: 1px solid\n ${({ theme, $error }) => ($error ? theme.colors.danger600 : theme.colors.neutral200)};\n`;\n\nconst TextButtonCustom = styled(TextButton)`\n width: 100%;\n display: flex;\n justify-content: center;\n border-top: 1px solid ${({ theme }) => theme.colors.neutral200};\n padding-inline: ${(props) => props.theme.spaces[6]};\n padding-block: ${(props) => props.theme.spaces[3]};\n\n &:not([disabled]) {\n cursor: pointer;\n\n &:hover {\n background-color: ${(props) => props.theme.colors.primary100};\n }\n }\n\n span {\n font-weight: 600;\n font-size: 1.4rem;\n line-height: 2.4rem;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n transition: background-color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Field\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ComponentProps\n extends Pick<UseDragAndDropOptions, 'onGrabItem' | 'onDropItem' | 'onCancel' | 'onMoveItem'>,\n Pick<RepeatableComponentProps, 'mainField'> {\n attribute: Schema.Attribute.Component<`${string}.${string}`, boolean>;\n disabled?: boolean;\n index: number;\n name: string;\n onDeleteComponent?: React.MouseEventHandler<HTMLButtonElement>;\n toggleCollapses: () => void;\n children: React.ReactNode;\n __temp_key__: string;\n}\n\nconst Component = ({\n disabled,\n index,\n name,\n mainField = {\n name: 'id',\n type: 'integer',\n },\n children,\n onDeleteComponent,\n toggleCollapses,\n __temp_key__,\n ...dragProps\n}: ComponentProps) => {\n const { formatMessage } = useIntl();\n\n const displayValue = useForm('RepeatableComponent', (state) => {\n return getIn(state.values, [...name.split('.'), mainField.name]);\n });\n\n const accordionRef = React.useRef<HTMLButtonElement>(null!);\n\n /**\n * The last item in the fieldName array will be the index of this component.\n * Drag and drop should be isolated to the parent component so nested repeatable\n * components are not affected by the drag and drop of the parent component in\n * their own re-ordering context.\n */\n const componentKey = name.split('.').slice(0, -1).join('.');\n\n const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] =\n useDragAndDrop(!disabled, {\n type: `${ItemTypes.COMPONENT}_${componentKey}`,\n index,\n item: {\n index,\n displayedValue: displayValue,\n },\n onStart() {\n // Close all collapses\n toggleCollapses();\n },\n ...dragProps,\n });\n\n React.useEffect(() => {\n dragPreviewRef(getEmptyImage(), { captureDraggingState: false });\n }, [dragPreviewRef, index]);\n\n const composedAccordionRefs = useComposedRefs<HTMLButtonElement>(accordionRef, dragRef);\n const composedBoxRefs = useComposedRefs<HTMLDivElement>(\n boxRef as React.RefObject<HTMLDivElement>,\n dropRef\n );\n\n return (\n <>\n {isDragging ? (\n <Preview />\n ) : (\n <Accordion.Item ref={composedBoxRefs} value={__temp_key__}>\n <Accordion.Header>\n <Accordion.Trigger>{displayValue}</Accordion.Trigger>\n <Accordion.Actions>\n <IconButton\n variant=\"ghost\"\n onClick={onDeleteComponent}\n label={formatMessage({\n id: getTranslation('containers.Edit.delete'),\n defaultMessage: 'Delete',\n })}\n >\n <Trash />\n </IconButton>\n <IconButton\n ref={composedAccordionRefs}\n variant=\"ghost\"\n onClick={(e) => e.stopPropagation()}\n data-handler-id={handlerId}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n onKeyDown={handleKeyDown}\n >\n <Drag />\n </IconButton>\n </Accordion.Actions>\n </Accordion.Header>\n <Accordion.Content>\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n background=\"neutral100\"\n padding={6}\n gap={6}\n >\n {children}\n </Flex>\n </Accordion.Content>\n </Accordion.Item>\n )}\n </>\n );\n};\n\nconst Preview = () => {\n return <StyledSpan tag=\"span\" padding={6} background=\"primary100\" />;\n};\n\nconst StyledSpan = styled<BoxComponent<'span'>>(Box)`\n display: block;\n outline: 1px dashed ${({ theme }) => theme.colors.primary500};\n outline-offset: -1px;\n`;\n\nexport { RepeatableComponent };\nexport type { RepeatableComponentProps };\n"],"names":["RepeatableComponent","attribute","disabled","name","mainField","children","layout","toggleNotification","useNotification","formatMessage","useIntl","search","searchString","useLocation","React","useMemo","URLSearchParams","currentDocument","useDocumentContext","components","value","error","rawError","useField","addFieldRow","useForm","state","moveFieldRow","removeFieldRow","max","Infinity","collapseToOpen","setCollapseToOpen","useState","liveText","setLiveText","useEffect","hasNestedErrors","Array","isArray","length","hasNestedValue","errorOpenItems","map","_","idx","__temp_key__","filter","includes","componentTmpKeyWithFocussedField","has","fieldParam","get","undefined","path","split","getIn","subpath","prevValue","usePrev","toggleCollapses","handleClick","schema","component","form","createDefaultForm","data","transformDocument","type","message","id","getTranslation","handleMoveComponentField","newIndex","currentIndex","defaultMessage","item","position","getItemPos","handleValueChange","key","index","handleCancel","handleGrabItem","handleDropItem","ariaDescriptionId","useId","level","useComponent","_jsx","Initializer","onClick","_jsxs","Box","hasRadius","VisuallyHidden","aria-live","AccordionRoot","$error","onValueChange","aria-describedby","nameWithIndex","ComponentProvider","uid","Component","onMoveItem","onDeleteComponent","onCancel","onDropItem","onGrabItem","row","ResponsiveGridRoot","gap","size","field","completeFieldName","translatedLabel","label","ResponsiveGridItem","col","s","xs","direction","alignItems","document","TextButtonCustom","startIcon","Plus","styled","Accordion","Root","theme","colors","danger600","neutral200","TextButton","props","spaces","primary100","motion","easings","easeOutQuad","dragProps","displayValue","values","accordionRef","useRef","componentKey","slice","join","handlerId","isDragging","handleKeyDown","boxRef","dropRef","dragRef","dragPreviewRef","useDragAndDrop","ItemTypes","COMPONENT","displayedValue","onStart","getEmptyImage","captureDraggingState","composedAccordionRefs","useComposedRefs","composedBoxRefs","_Fragment","Preview","Item","ref","Header","Trigger","Actions","IconButton","variant","Trash","e","stopPropagation","data-handler-id","onKeyDown","Drag","Content","Flex","background","padding","StyledSpan","tag","primary500"],"mappings":"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"}
1
+ {"version":3,"file":"Repeatable.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Repeatable.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useField, useNotification, useForm } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n TextButton,\n VisuallyHidden,\n Accordion,\n IconButton,\n useComposedRefs,\n BoxComponent,\n} from '@strapi/design-system';\nimport { Plus, Drag, Trash } from '@strapi/icons';\nimport { getEmptyImage } from 'react-dnd-html5-backend';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { ItemTypes } from '../../../../../constants/dragAndDrop';\nimport { useDocumentContext } from '../../../../../hooks/useDocumentContext';\nimport { useDragAndDrop, type UseDragAndDropOptions } from '../../../../../hooks/useDragAndDrop';\nimport { usePrev } from '../../../../../hooks/usePrev';\nimport { getIn } from '../../../../../utils/objects';\nimport { getTranslation } from '../../../../../utils/translations';\nimport { transformDocument } from '../../../utils/data';\nimport { createDefaultForm } from '../../../utils/forms';\nimport { ResponsiveGridItem, ResponsiveGridRoot } from '../../FormLayout';\nimport { ComponentProvider, useComponent } from '../ComponentContext';\n\nimport { Initializer } from './Initializer';\n\nimport type { ComponentInputProps } from './Input';\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * RepeatableComponent\n * -----------------------------------------------------------------------------------------------*/\n\ntype RepeatableComponentProps = Omit<ComponentInputProps, 'required' | 'label'>;\n\nconst RepeatableComponent = ({\n attribute,\n disabled,\n name,\n mainField,\n children,\n layout,\n}: RepeatableComponentProps) => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { search: searchString } = useLocation();\n const search = React.useMemo(() => new URLSearchParams(searchString), [searchString]);\n const { currentDocument } = useDocumentContext('RepeatableComponent');\n const components = currentDocument.components;\n\n const {\n value = [],\n error,\n rawError,\n } = useField<Schema.Attribute.ComponentValue<`${string}.${string}`, true>>(name);\n const addFieldRow = useForm('RepeatableComponent', (state) => state.addFieldRow);\n const moveFieldRow = useForm('RepeatableComponent', (state) => state.moveFieldRow);\n const removeFieldRow = useForm('RepeatableComponent', (state) => state.removeFieldRow);\n const { max = Infinity } = attribute;\n\n const [collapseToOpen, setCollapseToOpen] = React.useState<string>('');\n const [liveText, setLiveText] = React.useState('');\n\n React.useEffect(() => {\n const hasNestedErrors = rawError && Array.isArray(rawError) && rawError.length > 0;\n const hasNestedValue = value && Array.isArray(value) && value.length > 0;\n\n if (hasNestedErrors && hasNestedValue) {\n const errorOpenItems = rawError\n .map((_: unknown, idx: number) => {\n return value[idx] ? value[idx].__temp_key__ : null;\n })\n .filter((value) => !!value);\n\n if (errorOpenItems && errorOpenItems.length > 0) {\n setCollapseToOpen((collapseToOpen) => {\n if (!errorOpenItems.includes(collapseToOpen)) {\n return errorOpenItems[0];\n }\n\n return collapseToOpen;\n });\n }\n }\n }, [rawError, value]);\n\n /**\n * Get the temp key of the component that has the field that is currently focussed\n * as defined by the `field` query param. We can then force this specific component\n * to be in its \"open\" state.\n */\n const componentTmpKeyWithFocussedField = React.useMemo(() => {\n if (search.has('field')) {\n const fieldParam = search.get('field');\n\n if (!fieldParam) {\n return undefined;\n }\n\n const [, path] = fieldParam.split(`${name}.`);\n\n if (getIn(value, path, undefined) !== undefined) {\n const [subpath] = path.split('.');\n\n return getIn(value, subpath, undefined)?.__temp_key__;\n }\n }\n\n return undefined;\n }, [search, name, value]);\n\n const prevValue = usePrev(value);\n\n React.useEffect(() => {\n /**\n * When we add a new item to the array, we want to open the collapse.\n */\n if (prevValue && prevValue.length < value.length) {\n setCollapseToOpen(value[value.length - 1].__temp_key__);\n }\n }, [value, prevValue]);\n\n React.useEffect(() => {\n if (typeof componentTmpKeyWithFocussedField === 'string') {\n setCollapseToOpen(componentTmpKeyWithFocussedField);\n }\n }, [componentTmpKeyWithFocussedField]);\n\n const toggleCollapses = () => {\n setCollapseToOpen('');\n };\n\n const handleClick = () => {\n if (value.length < max) {\n const schema = components[attribute.component];\n const form = createDefaultForm(schema, components);\n const data = transformDocument(schema, components)(form);\n\n addFieldRow(name, data);\n // setCollapseToOpen(nextTempKey);\n } else if (value.length >= max) {\n toggleNotification({\n type: 'info',\n message: formatMessage({\n id: getTranslation('components.notification.info.maximum-requirement'),\n }),\n });\n }\n };\n\n const handleMoveComponentField: ComponentProps['onMoveItem'] = (newIndex, currentIndex) => {\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 handleValueChange = (key: string) => {\n setCollapseToOpen(key);\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 ariaDescriptionId = React.useId();\n\n const level = useComponent('RepeatableComponent', (state) => state.level);\n\n if (value.length === 0) {\n return <Initializer disabled={disabled} name={name} onClick={handleClick} />;\n }\n\n return (\n <Box hasRadius>\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 <AccordionRoot\n $error={error}\n value={collapseToOpen}\n onValueChange={handleValueChange}\n aria-describedby={ariaDescriptionId}\n >\n {value.map(({ __temp_key__: key, id }, index) => {\n const nameWithIndex = `${name}.${index}`;\n return (\n <ComponentProvider\n key={key}\n // id is always a number in a component\n id={id as number}\n uid={attribute.component}\n level={level + 1}\n type=\"repeatable\"\n >\n <Component\n disabled={disabled}\n name={nameWithIndex}\n attribute={attribute}\n index={index}\n mainField={mainField}\n onMoveItem={handleMoveComponentField}\n onDeleteComponent={() => {\n removeFieldRow(name, index);\n toggleCollapses();\n }}\n toggleCollapses={toggleCollapses}\n onCancel={handleCancel}\n onDropItem={handleDropItem}\n onGrabItem={handleGrabItem}\n __temp_key__={key}\n >\n {layout.map((row, index) => {\n return (\n <ResponsiveGridRoot gap={4} key={index}>\n {row.map(({ size, ...field }) => {\n /**\n * Layouts are built from schemas so they don't understand the complete\n * schema tree, for components we append the parent name to the field name\n * because this is the structure for the data & permissions also understand\n * the nesting involved.\n */\n const completeFieldName = `${nameWithIndex}.${field.name}`;\n\n const translatedLabel = formatMessage({\n id: `content-manager.components.${attribute.component}.${field.name}`,\n defaultMessage: field.label,\n });\n\n return (\n <ResponsiveGridItem\n col={size}\n key={completeFieldName}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n {children({\n ...field,\n label: translatedLabel,\n name: completeFieldName,\n document: currentDocument,\n })}\n </ResponsiveGridItem>\n );\n })}\n </ResponsiveGridRoot>\n );\n })}\n </Component>\n </ComponentProvider>\n );\n })}\n <TextButtonCustom disabled={disabled} onClick={handleClick} startIcon={<Plus />}>\n {formatMessage({\n id: getTranslation('containers.EditView.add.new-entry'),\n defaultMessage: 'Add an entry',\n })}\n </TextButtonCustom>\n </AccordionRoot>\n </Box>\n );\n};\n\nconst AccordionRoot = styled(Accordion.Root)<{ $error?: string }>`\n border: 1px solid\n ${({ theme, $error }) => ($error ? theme.colors.danger600 : theme.colors.neutral200)};\n`;\n\nconst TextButtonCustom = styled(TextButton)`\n width: 100%;\n display: flex;\n justify-content: center;\n border-top: 1px solid ${({ theme }) => theme.colors.neutral200};\n padding-inline: ${(props) => props.theme.spaces[6]};\n padding-block: ${(props) => props.theme.spaces[3]};\n\n &:not([disabled]) {\n cursor: pointer;\n\n &:hover {\n background-color: ${(props) => props.theme.colors.primary100};\n }\n }\n\n span {\n font-weight: 600;\n font-size: 1.4rem;\n line-height: 2.4rem;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n transition: background-color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Field\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ComponentProps\n extends Pick<UseDragAndDropOptions, 'onGrabItem' | 'onDropItem' | 'onCancel' | 'onMoveItem'>,\n Pick<RepeatableComponentProps, 'mainField'> {\n attribute: Schema.Attribute.Component<`${string}.${string}`, boolean>;\n disabled?: boolean;\n index: number;\n name: string;\n onDeleteComponent?: React.MouseEventHandler<HTMLButtonElement>;\n toggleCollapses: () => void;\n children: React.ReactNode;\n __temp_key__: string;\n}\n\nconst Component = ({\n disabled,\n index,\n name,\n mainField = {\n name: 'id',\n type: 'integer',\n },\n children,\n onDeleteComponent,\n toggleCollapses,\n __temp_key__,\n ...dragProps\n}: ComponentProps) => {\n const { formatMessage } = useIntl();\n\n const displayValue = useForm('RepeatableComponent', (state) => {\n return getIn(state.values, [...name.split('.'), mainField.name]);\n });\n\n const accordionRef = React.useRef<HTMLButtonElement>(null!);\n\n /**\n * The last item in the fieldName array will be the index of this component.\n * Drag and drop should be isolated to the parent component so nested repeatable\n * components are not affected by the drag and drop of the parent component in\n * their own re-ordering context.\n */\n const componentKey = name.split('.').slice(0, -1).join('.');\n\n const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] =\n useDragAndDrop(!disabled, {\n type: `${ItemTypes.COMPONENT}_${componentKey}`,\n index,\n item: {\n index,\n displayedValue: displayValue,\n },\n onStart() {\n // Close all collapses\n toggleCollapses();\n },\n ...dragProps,\n });\n\n React.useEffect(() => {\n dragPreviewRef(getEmptyImage(), { captureDraggingState: false });\n }, [dragPreviewRef, index]);\n\n const composedAccordionRefs = useComposedRefs<HTMLButtonElement>(accordionRef, dragRef);\n const composedBoxRefs = useComposedRefs<HTMLDivElement>(\n boxRef as React.RefObject<HTMLDivElement>,\n dropRef\n );\n\n return (\n <>\n {isDragging ? (\n <Preview />\n ) : (\n <Accordion.Item ref={composedBoxRefs} value={__temp_key__}>\n <Accordion.Header>\n <Accordion.Trigger>{displayValue}</Accordion.Trigger>\n <Accordion.Actions>\n <IconButton\n disabled={disabled}\n variant=\"ghost\"\n onClick={onDeleteComponent}\n label={formatMessage({\n id: getTranslation('containers.Edit.delete'),\n defaultMessage: 'Delete',\n })}\n >\n <Trash />\n </IconButton>\n <IconButton\n disabled={disabled}\n ref={composedAccordionRefs}\n variant=\"ghost\"\n onClick={(e) => e.stopPropagation()}\n data-handler-id={handlerId}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n onKeyDown={handleKeyDown}\n >\n <Drag />\n </IconButton>\n </Accordion.Actions>\n </Accordion.Header>\n <Accordion.Content>\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n background=\"neutral100\"\n padding={6}\n gap={6}\n >\n {children}\n </Flex>\n </Accordion.Content>\n </Accordion.Item>\n )}\n </>\n );\n};\n\nconst Preview = () => {\n return <StyledSpan tag=\"span\" padding={6} background=\"primary100\" />;\n};\n\nconst StyledSpan = styled<BoxComponent<'span'>>(Box)`\n display: block;\n outline: 1px dashed ${({ theme }) => theme.colors.primary500};\n outline-offset: -1px;\n`;\n\nexport { RepeatableComponent };\nexport type { RepeatableComponentProps };\n"],"names":["RepeatableComponent","attribute","disabled","name","mainField","children","layout","toggleNotification","useNotification","formatMessage","useIntl","search","searchString","useLocation","React","useMemo","URLSearchParams","currentDocument","useDocumentContext","components","value","error","rawError","useField","addFieldRow","useForm","state","moveFieldRow","removeFieldRow","max","Infinity","collapseToOpen","setCollapseToOpen","useState","liveText","setLiveText","useEffect","hasNestedErrors","Array","isArray","length","hasNestedValue","errorOpenItems","map","_","idx","__temp_key__","filter","includes","componentTmpKeyWithFocussedField","has","fieldParam","get","undefined","path","split","getIn","subpath","prevValue","usePrev","toggleCollapses","handleClick","schema","component","form","createDefaultForm","data","transformDocument","type","message","id","getTranslation","handleMoveComponentField","newIndex","currentIndex","defaultMessage","item","position","getItemPos","handleValueChange","key","index","handleCancel","handleGrabItem","handleDropItem","ariaDescriptionId","useId","level","useComponent","_jsx","Initializer","onClick","_jsxs","Box","hasRadius","VisuallyHidden","aria-live","AccordionRoot","$error","onValueChange","aria-describedby","nameWithIndex","ComponentProvider","uid","Component","onMoveItem","onDeleteComponent","onCancel","onDropItem","onGrabItem","row","ResponsiveGridRoot","gap","size","field","completeFieldName","translatedLabel","label","ResponsiveGridItem","col","s","xs","direction","alignItems","document","TextButtonCustom","startIcon","Plus","styled","Accordion","Root","theme","colors","danger600","neutral200","TextButton","props","spaces","primary100","motion","easings","easeOutQuad","dragProps","displayValue","values","accordionRef","useRef","componentKey","slice","join","handlerId","isDragging","handleKeyDown","boxRef","dropRef","dragRef","dragPreviewRef","useDragAndDrop","ItemTypes","COMPONENT","displayedValue","onStart","getEmptyImage","captureDraggingState","composedAccordionRefs","useComposedRefs","composedBoxRefs","_Fragment","Preview","Item","ref","Header","Trigger","Actions","IconButton","variant","Trash","e","stopPropagation","data-handler-id","onKeyDown","Drag","Content","Flex","background","padding","StyledSpan","tag","primary500"],"mappings":"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"}
@@ -20,6 +20,7 @@ var DocumentRBAC = require('../../../../../features/DocumentRBAC.js');
20
20
  var validation = require('../../../../../utils/validation.js');
21
21
  var DocumentActions = require('../../DocumentActions.js');
22
22
  var FormLayout = require('../../FormLayout.js');
23
+ var ComponentContext = require('../ComponentContext.js');
23
24
 
24
25
  function _interopNamespaceDefault(e) {
25
26
  var n = Object.create(null);
@@ -51,23 +52,37 @@ const StyledModalContent = styledComponents.styled(designSystem.Modal.Content)`
51
52
  height: 90%;
52
53
  max-height: 100%;
53
54
  `;
55
+ const getFullPageUrl = (currentDocumentMeta)=>{
56
+ const isSingleType = currentDocumentMeta.collectionType === collections.SINGLE_TYPES;
57
+ const queryParams = currentDocumentMeta.params?.locale ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}` : '';
58
+ return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}${isSingleType ? '' : '/' + currentDocumentMeta.documentId}${queryParams}`;
59
+ };
54
60
  function reducer(state, action) {
55
61
  switch(action.type){
56
62
  case 'GO_TO_RELATION':
57
63
  if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {
58
64
  return {
59
65
  ...state,
60
- confirmDialogIntent: action.payload.document
66
+ confirmDialogIntent: action.payload.document,
67
+ fieldToConnect: action.payload.fieldToConnect,
68
+ fieldToConnectUID: action.payload.fieldToConnectUID
61
69
  };
62
70
  }
71
+ const lastItemDocumentHistory = state.documentHistory.at(-1);
72
+ const hasToResetDocumentHistory = lastItemDocumentHistory && !lastItemDocumentHistory.documentId;
63
73
  return {
64
74
  ...state,
65
- documentHistory: [
75
+ // Reset document history if the last item has documentId undefined
76
+ documentHistory: hasToResetDocumentHistory ? [
77
+ action.payload.document
78
+ ] : [
66
79
  ...state.documentHistory,
67
80
  action.payload.document
68
81
  ],
69
82
  confirmDialogIntent: null,
70
- isModalOpen: true
83
+ isModalOpen: true,
84
+ fieldToConnect: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnect,
85
+ fieldToConnectUID: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnectUID
71
86
  };
72
87
  case 'GO_BACK':
73
88
  if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {
@@ -95,6 +110,21 @@ function reducer(state, action) {
95
110
  isModalOpen: false,
96
111
  confirmDialogIntent: null
97
112
  };
113
+ case 'GO_TO_CREATED_RELATION':
114
+ return {
115
+ ...state,
116
+ // Reset document history if the last item has documentId undefined
117
+ documentHistory: state.documentHistory ? [
118
+ ...state.documentHistory.slice(0, -1),
119
+ action.payload.document
120
+ ] : [
121
+ action.payload.document
122
+ ],
123
+ confirmDialogIntent: null,
124
+ isModalOpen: true,
125
+ fieldToConnect: undefined,
126
+ fieldToConnectUID: undefined
127
+ };
98
128
  case 'CANCEL_CONFIRM_DIALOG':
99
129
  return {
100
130
  ...state,
@@ -124,21 +154,17 @@ function reducer(state, action) {
124
154
  }
125
155
  }
126
156
  const [RelationModalProvider, useRelationModal] = strapiAdmin.createContext('RelationModal');
127
- const getFullPageUrl = (currentDocumentMeta)=>{
128
- const isSingleType = currentDocumentMeta.collectionType === collections.SINGLE_TYPES;
129
- const queryParams = currentDocumentMeta.params?.locale ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}` : '';
130
- return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}${isSingleType ? '' : '/' + currentDocumentMeta.documentId}${queryParams}`;
131
- };
132
- /**
133
- * Component responsible of rendering its children wrapped in a modal, form and context if needed
134
- */ const RelationModalRenderer = ({ children, trigger, relation })=>{
135
- const { formatMessage } = reactIntl.useIntl();
136
- const navigate = reactRouterDom.useNavigate();
157
+ function isRenderProp(children) {
158
+ return typeof children === 'function';
159
+ }
160
+ const RootRelationRenderer = (props)=>{
161
+ const { children } = props;
137
162
  const [state, dispatch] = React__namespace.useReducer(reducer, {
138
163
  documentHistory: [],
139
164
  confirmDialogIntent: null,
140
165
  isModalOpen: false,
141
- hasUnsavedChanges: false
166
+ hasUnsavedChanges: false,
167
+ fieldToConnect: undefined
142
168
  });
143
169
  const rootDocument = useDocument.useDoc();
144
170
  const [{ query }] = strapiAdmin.useQueryParams();
@@ -153,11 +179,9 @@ const getFullPageUrl = (currentDocumentMeta)=>{
153
179
  };
154
180
  const currentDocumentMeta = state.documentHistory.at(-1) ?? rootDocumentMeta;
155
181
  const currentDocument = useDocument.useDocument(currentDocumentMeta);
156
- const parentContextValue = useRelationModal('RelationContextWrapper', (state)=>state, false);
157
- // A parent relation is already rendering a modal. In this case simply render the trigger
158
- if (parentContextValue) {
159
- return trigger;
160
- }
182
+ // TODO: check if we can remove the single type check
183
+ const isSingleType = currentDocumentMeta.collectionType === collections.SINGLE_TYPES;
184
+ const isCreating = !currentDocumentMeta.documentId && !isSingleType;
161
185
  /**
162
186
  * There is no parent relation, so the relation modal doesn't exist. Create it and set up all the
163
187
  * pieces that will be used by potential child relations: the context, header, form, and footer.
@@ -167,18 +191,64 @@ const getFullPageUrl = (currentDocumentMeta)=>{
167
191
  rootDocumentMeta: rootDocumentMeta,
168
192
  currentDocumentMeta: currentDocumentMeta,
169
193
  currentDocument: currentDocument,
194
+ isCreating: isCreating,
195
+ children: /*#__PURE__*/ jsxRuntime.jsx(RelationModal, {
196
+ children: isRenderProp(children) ? children({
197
+ dispatch
198
+ }) : props.relation && /*#__PURE__*/ jsxRuntime.jsx(RelationModalTrigger, {
199
+ relation: props.relation,
200
+ children: children
201
+ })
202
+ })
203
+ });
204
+ };
205
+ const NestedRelationRenderer = (props)=>{
206
+ const { children } = props;
207
+ const dispatch = useRelationModal('NestedRelation', (state)=>state.dispatch);
208
+ return isRenderProp(children) ? children({
209
+ dispatch
210
+ }) : props.relation && /*#__PURE__*/ jsxRuntime.jsx(RelationModalTrigger, {
211
+ relation: props.relation,
212
+ children: children
213
+ }); /* This is the trigger that will be rendered in the parent relation */
214
+ };
215
+ /**
216
+ * Component responsible for rendering its children wrapped in a modal, form and context if needed
217
+ */ const RelationModalRenderer = (props)=>{
218
+ // We're in a nested relation if the relation modal context is not undefined
219
+ const isNested = useRelationModal('RelationContextWrapper', (state)=>state != undefined, false);
220
+ return isNested ? /*#__PURE__*/ jsxRuntime.jsx(NestedRelationRenderer, {
221
+ ...props
222
+ }) : /*#__PURE__*/ jsxRuntime.jsx(RootRelationRenderer, {
223
+ ...props
224
+ });
225
+ };
226
+ /* -------------------------------------------------------------------------------------------------
227
+ * RelationModal
228
+ * -----------------------------------------------------------------------------------------------*/ const generateCreateUrl = (currentDocumentMeta)=>{
229
+ return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}/create${currentDocumentMeta.params?.locale ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}` : ''}`;
230
+ };
231
+ const RelationModal = ({ children })=>{
232
+ const { formatMessage } = reactIntl.useIntl();
233
+ const navigate = reactRouterDom.useNavigate();
234
+ const state = useRelationModal('RelationModalForm', (state)=>state.state);
235
+ const dispatch = useRelationModal('RelationModalForm', (state)=>state.dispatch);
236
+ const currentDocumentMeta = useRelationModal('RelationModalForm', (state)=>state.currentDocumentMeta);
237
+ const currentDocument = useRelationModal('RelationModalForm', (state)=>state.currentDocument);
238
+ const isCreating = useRelationModal('RelationModalForm', (state)=>state.isCreating);
239
+ /*
240
+ * We must wrap the modal window with Component Provider with reset values
241
+ * to avoid inheriting id and uid from the root document and having weird
242
+ * behaviors with simple relationships..
243
+ */ return /*#__PURE__*/ jsxRuntime.jsx(ComponentContext.ComponentProvider, {
244
+ id: undefined,
245
+ level: -1,
246
+ uid: undefined,
247
+ type: undefined,
170
248
  children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Modal.Root, {
171
249
  open: state.isModalOpen,
172
250
  onOpenChange: (open)=>{
173
- if (open) {
174
- dispatch({
175
- type: 'GO_TO_RELATION',
176
- payload: {
177
- document: relation,
178
- shouldBypassConfirmation: false
179
- }
180
- });
181
- } else {
251
+ if (!open) {
182
252
  dispatch({
183
253
  type: 'CLOSE_MODAL',
184
254
  payload: {
@@ -188,7 +258,7 @@ const getFullPageUrl = (currentDocumentMeta)=>{
188
258
  }
189
259
  },
190
260
  children: [
191
- trigger,
261
+ children,
192
262
  /*#__PURE__*/ jsxRuntime.jsxs(StyledModalContent, {
193
263
  children: [
194
264
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Modal.Header, {
@@ -223,7 +293,10 @@ const getFullPageUrl = (currentDocumentMeta)=>{
223
293
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
224
294
  tag: "span",
225
295
  fontWeight: 600,
226
- children: formatMessage({
296
+ children: isCreating ? formatMessage({
297
+ id: 'content-manager.relation.create',
298
+ defaultMessage: 'Create a relation'
299
+ }) : formatMessage({
227
300
  id: 'content-manager.components.RelationInputModal.modal-title',
228
301
  defaultMessage: 'Edit a relation'
229
302
  })
@@ -236,7 +309,11 @@ const getFullPageUrl = (currentDocumentMeta)=>{
236
309
  type: 'GO_FULL_PAGE'
237
310
  });
238
311
  if (!state.hasUnsavedChanges) {
239
- navigate(getFullPageUrl(currentDocumentMeta));
312
+ if (isCreating) {
313
+ navigate(generateCreateUrl(currentDocumentMeta));
314
+ } else {
315
+ navigate(getFullPageUrl(currentDocumentMeta));
316
+ }
240
317
  }
241
318
  },
242
319
  variant: "tertiary",
@@ -251,8 +328,8 @@ const getFullPageUrl = (currentDocumentMeta)=>{
251
328
  }),
252
329
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Modal.Body, {
253
330
  children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Form, {
254
- method: "PUT",
255
- initialValues: currentDocument.getInitialFormValues(),
331
+ method: isCreating ? 'POST' : 'PUT',
332
+ initialValues: currentDocument.getInitialFormValues(isCreating),
256
333
  validate: (values, options)=>{
257
334
  const yupSchema = validation.createYupSchema(currentDocument.schema?.attributes, currentDocument.components, {
258
335
  status: currentDocument.document?.status,
@@ -262,7 +339,7 @@ const getFullPageUrl = (currentDocumentMeta)=>{
262
339
  abortEarly: false
263
340
  });
264
341
  },
265
- children: children
342
+ children: /*#__PURE__*/ jsxRuntime.jsx(RelationModalBody, {})
266
343
  })
267
344
  })
268
345
  ]
@@ -273,7 +350,7 @@ const getFullPageUrl = (currentDocumentMeta)=>{
273
350
  };
274
351
  /**
275
352
  * All the main content (not header and footer) of the relation modal, plus the confirmation dialog.
276
- * Will be wrapped in a Modal.Body by the RelationModalRenderer.
353
+ * Will be wrapped in a Modal.Body by the RelationModal component.
277
354
  * Cannot be moved directly inside RelationModal because it needs access to the context via hooks.
278
355
  */ const RelationModalBody = ()=>{
279
356
  const navigate = reactRouterDom.useNavigate();
@@ -284,6 +361,7 @@ const getFullPageUrl = (currentDocumentMeta)=>{
284
361
  const dispatch = useRelationModal('RelationModalForm', (state)=>state.dispatch);
285
362
  const rootDocumentMeta = useRelationModal('RelationModalForm', (state)=>state.rootDocumentMeta);
286
363
  const currentDocumentMeta = useRelationModal('RelationModalForm', (state)=>state.currentDocumentMeta);
364
+ const isCreating = useRelationModal('RelationModalForm', (state)=>state.isCreating);
287
365
  /**
288
366
  * One-way sync the modified state from the form to the modal state.
289
367
  * It is needed because we need to consume state from the form context in order to lift it up
@@ -325,7 +403,11 @@ const getFullPageUrl = (currentDocumentMeta)=>{
325
403
  if (isRootDocumentUrl) {
326
404
  handleCloseModal(true);
327
405
  } else {
328
- navigate(fullPageUrl);
406
+ if (isCreating) {
407
+ navigate(generateCreateUrl(currentDocumentMeta));
408
+ } else {
409
+ navigate(fullPageUrl);
410
+ }
329
411
  }
330
412
  };
331
413
  const handleConfirm = ()=>{
@@ -355,7 +437,7 @@ const getFullPageUrl = (currentDocumentMeta)=>{
355
437
  };
356
438
  return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
357
439
  children: [
358
- /*#__PURE__*/ jsxRuntime.jsx(RelationEditView, {}),
440
+ /*#__PURE__*/ jsxRuntime.jsx(RelationModalForm, {}),
359
441
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Root, {
360
442
  open: state.confirmDialogIntent != null,
361
443
  children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.ConfirmDialog, {
@@ -373,7 +455,7 @@ const getFullPageUrl = (currentDocumentMeta)=>{
373
455
  ]
374
456
  });
375
457
  };
376
- const ModalTrigger = ({ children, relation })=>{
458
+ const RelationModalTrigger = ({ children, relation })=>{
377
459
  const dispatch = useRelationModal('ModalTrigger', (state)=>state.dispatch);
378
460
  return /*#__PURE__*/ jsxRuntime.jsx(StyledTextButton, {
379
461
  onClick: ()=>{
@@ -388,16 +470,6 @@ const ModalTrigger = ({ children, relation })=>{
388
470
  children: children
389
471
  });
390
472
  };
391
- const RelationModal = /*#__PURE__*/ React__namespace.memo(({ relation, children })=>{
392
- return /*#__PURE__*/ jsxRuntime.jsx(RelationModalRenderer, {
393
- relation: relation,
394
- trigger: /*#__PURE__*/ jsxRuntime.jsx(ModalTrigger, {
395
- relation: relation,
396
- children: children
397
- }),
398
- children: /*#__PURE__*/ jsxRuntime.jsx(RelationModalBody, {})
399
- });
400
- });
401
473
  const StyledTextButton = styledComponents.styled(designSystem.TextButton)`
402
474
  max-width: 100%;
403
475
  & > span {
@@ -411,13 +483,14 @@ const StyledTextButton = styledComponents.styled(designSystem.TextButton)`
411
483
  /**
412
484
  * The mini edit view for a relation that is displayed inside a modal.
413
485
  * It's complete with its header, document actions and form layout.
414
- */ const RelationEditView = ()=>{
486
+ */ const RelationModalForm = ()=>{
415
487
  const { formatMessage } = reactIntl.useIntl();
416
- const currentDocumentMeta = useRelationModal('RelationModalBody', (state)=>state.currentDocumentMeta);
417
- const currentDocument = useRelationModal('RelationModalBody', (state)=>state.currentDocument);
488
+ const currentDocumentMeta = useRelationModal('RelationModalForm', (state)=>state.currentDocumentMeta);
489
+ const isCreating = useRelationModal('RelationModalForm', (state)=>state.isCreating);
490
+ const currentDocument = useRelationModal('RelationModalForm', (state)=>state.currentDocument);
418
491
  const documentLayoutResponse = useDocumentLayout.useDocumentLayout(currentDocumentMeta.model);
419
- const plugins = strapiAdmin.useStrapiApp('RelationModalBody', (state)=>state.plugins);
420
- const initialValues = currentDocument.getInitialFormValues();
492
+ const plugins = strapiAdmin.useStrapiApp('RelationModalForm', (state)=>state.plugins);
493
+ const initialValues = isCreating ? currentDocument.getInitialFormValues(isCreating) : currentDocument.getInitialFormValues();
421
494
  const { permissions = [], isLoading: isLoadingPermissions, error } = strapiAdmin.useRBAC(plugin.PERMISSIONS.map((action)=>({
422
495
  action,
423
496
  subject: currentDocumentMeta.model
@@ -432,7 +505,7 @@ const StyledTextButton = styledComponents.styled(designSystem.TextButton)`
432
505
  })
433
506
  });
434
507
  }
435
- if (error || !currentDocumentMeta.model || documentLayoutResponse.error || !currentDocument.document || !currentDocument.meta || !currentDocument.schema || !initialValues) {
508
+ if (error || !currentDocumentMeta.model || documentLayoutResponse.error || !isCreating && !currentDocument.document || !isCreating && !currentDocument.meta || !currentDocument.schema || !initialValues) {
436
509
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
437
510
  alignItems: "center",
438
511
  height: "100%",
@@ -541,7 +614,7 @@ const StyledTextButton = styledComponents.styled(designSystem.TextButton)`
541
614
  });
542
615
  };
543
616
 
544
- exports.RelationModal = RelationModal;
617
+ exports.RelationModalRenderer = RelationModalRenderer;
545
618
  exports.getCollectionType = getCollectionType;
546
619
  exports.reducer = reducer;
547
620
  exports.useRelationModal = useRelationModal;