@strapi/content-manager 5.55.0 → 5.56.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 (21) hide show
  1. package/dist/admin/pages/EditView/components/DocumentActions.js +133 -129
  2. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  3. package/dist/admin/pages/EditView/components/DocumentActions.mjs +137 -133
  4. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  5. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +113 -28
  6. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  7. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +113 -29
  8. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  9. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +8 -3
  10. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  11. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +8 -3
  12. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  13. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +27 -5
  14. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +2 -2
  15. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +4 -4
  16. package/dist/server/controllers/relations.js +4 -0
  17. package/dist/server/controllers/relations.js.map +1 -1
  18. package/dist/server/controllers/relations.mjs +4 -0
  19. package/dist/server/controllers/relations.mjs.map +1 -1
  20. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  21. package/package.json +9 -9
@@ -18,6 +18,7 @@ import '../../../../../preview/pages/Preview.mjs';
18
18
  import { useLazyGetDocumentQuery } from '../../../../../services/documents.mjs';
19
19
  import { useDocumentLayout } from '../../../../../hooks/useDocumentLayout.mjs';
20
20
  import { DocumentRBAC } from '../../../../../features/DocumentRBAC.mjs';
21
+ import { setIn } from '../../../../../utils/objects.mjs';
21
22
  import { createYupSchema } from '../../../../../utils/validation.mjs';
22
23
  import { DocumentActionButton } from '../../DocumentActions.mjs';
23
24
  import { FormLayout } from '../../FormLayout.mjs';
@@ -39,6 +40,8 @@ const getFullPageUrl = (currentDocumentMeta)=>{
39
40
  const queryParams = currentDocumentMeta.params?.locale ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}` : '';
40
41
  return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}${isSingleType ? '' : '/' + currentDocumentMeta.documentId}${queryParams}`;
41
42
  };
43
+ const getDocumentHistoryKey = (meta)=>`${meta.model}::${meta.documentId}`;
44
+ const EMPTY_PENDING_CONNECTS = [];
42
45
  function reducer(state, action) {
43
46
  switch(action.type){
44
47
  case 'GO_TO_RELATION':
@@ -48,7 +51,8 @@ function reducer(state, action) {
48
51
  confirmDialogIntent: action.payload.document,
49
52
  fieldToConnect: action.payload.fieldToConnect,
50
53
  fieldToConnectUID: action.payload.fieldToConnectUID,
51
- getParentFormValues: action.payload.getParentFormValues
54
+ getParentFormValues: action.payload.getParentFormValues,
55
+ setParentFormValue: action.payload.setParentFormValue
52
56
  };
53
57
  }
54
58
  const lastItemDocumentHistory = state.documentHistory.at(-1);
@@ -66,7 +70,8 @@ function reducer(state, action) {
66
70
  isModalOpen: true,
67
71
  fieldToConnect: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnect,
68
72
  fieldToConnectUID: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnectUID,
69
- getParentFormValues: hasToResetDocumentHistory ? undefined : action.payload.getParentFormValues
73
+ getParentFormValues: hasToResetDocumentHistory ? undefined : action.payload.getParentFormValues,
74
+ setParentFormValue: hasToResetDocumentHistory ? undefined : action.payload.setParentFormValue
70
75
  };
71
76
  case 'GO_BACK':
72
77
  if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {
@@ -92,24 +97,40 @@ function reducer(state, action) {
92
97
  documentHistory: [],
93
98
  hasUnsavedChanges: false,
94
99
  isModalOpen: false,
95
- confirmDialogIntent: null
96
- };
97
- case 'GO_TO_CREATED_RELATION':
98
- return {
99
- ...state,
100
- // Reset document history if the last item has documentId undefined
101
- documentHistory: state.documentHistory ? [
102
- ...state.documentHistory.slice(0, -1),
103
- action.payload.document
104
- ] : [
105
- action.payload.document
106
- ],
107
100
  confirmDialogIntent: null,
108
- isModalOpen: true,
109
- fieldToConnect: undefined,
110
- fieldToConnectUID: undefined,
111
- getParentFormValues: undefined
101
+ pendingConnects: {}
112
102
  };
103
+ case 'GO_TO_CREATED_RELATION':
104
+ {
105
+ // Anything beyond the second-to-last history entry is a nested parent still open further up
106
+ // the stack — the root document (outside documentHistory entirely) is handled directly via
107
+ // setParentFormValue instead, since its Form never gets replaced by modal navigation.
108
+ const nestedParentMeta = state.documentHistory.length >= 2 ? state.documentHistory.at(-2) : undefined;
109
+ const pendingConnects = nestedParentMeta && action.payload.connectPatch ? {
110
+ ...state.pendingConnects,
111
+ [getDocumentHistoryKey(nestedParentMeta)]: [
112
+ ...state.pendingConnects[getDocumentHistoryKey(nestedParentMeta)] ?? [],
113
+ action.payload.connectPatch
114
+ ]
115
+ } : state.pendingConnects;
116
+ return {
117
+ ...state,
118
+ // Reset document history if the last item has documentId undefined
119
+ documentHistory: state.documentHistory ? [
120
+ ...state.documentHistory.slice(0, -1),
121
+ action.payload.document
122
+ ] : [
123
+ action.payload.document
124
+ ],
125
+ confirmDialogIntent: null,
126
+ isModalOpen: true,
127
+ fieldToConnect: undefined,
128
+ fieldToConnectUID: undefined,
129
+ getParentFormValues: undefined,
130
+ setParentFormValue: undefined,
131
+ pendingConnects
132
+ };
133
+ }
113
134
  case 'CANCEL_CONFIRM_DIALOG':
114
135
  return {
115
136
  ...state,
@@ -130,17 +151,44 @@ function reducer(state, action) {
130
151
  isModalOpen: false,
131
152
  fieldToConnect: undefined,
132
153
  fieldToConnectUID: undefined,
133
- getParentFormValues: undefined
154
+ getParentFormValues: undefined,
155
+ setParentFormValue: undefined,
156
+ pendingConnects: {}
134
157
  };
135
158
  case 'SET_HAS_UNSAVED_CHANGES':
136
159
  return {
137
160
  ...state,
138
161
  hasUnsavedChanges: action.payload.hasUnsavedChanges
139
162
  };
163
+ case 'CLEAR_PENDING_CONNECTS':
164
+ {
165
+ const key = getDocumentHistoryKey(action.payload.documentMeta);
166
+ if (!(key in state.pendingConnects)) {
167
+ return state;
168
+ }
169
+ const pendingConnects = {
170
+ ...state.pendingConnects
171
+ };
172
+ delete pendingConnects[key];
173
+ return {
174
+ ...state,
175
+ pendingConnects
176
+ };
177
+ }
140
178
  default:
141
179
  return state;
142
180
  }
143
181
  }
182
+ /**
183
+ * Whether any relation-on-the-fly modal is currently open, anywhere on the page.
184
+ *
185
+ * The modal's React context (`RelationModalProvider`, below) only reaches the modal's own subtree
186
+ * (the relation field that renders it), so components mounted outside that subtree — like the
187
+ * background entry's save/publish buttons in the side panel — can't read `state.isModalOpen` from
188
+ * context. This module-level counter is the cross-tree signal those components use instead, so
189
+ * they can tell a relation modal is open and suppress their own keyboard shortcuts while it is.
190
+ */ let openRelationModalCount = 0;
191
+ const isAnyRelationModalOpen = ()=>openRelationModalCount > 0;
144
192
  const [RelationModalProvider, useRelationModal] = createContext('RelationModal');
145
193
  function isRenderProp(children) {
146
194
  return typeof children === 'function';
@@ -152,7 +200,8 @@ const RootRelationRenderer = (props)=>{
152
200
  confirmDialogIntent: null,
153
201
  isModalOpen: false,
154
202
  hasUnsavedChanges: false,
155
- fieldToConnect: undefined
203
+ fieldToConnect: undefined,
204
+ pendingConnects: {}
156
205
  });
157
206
  const rootDocument = useDoc();
158
207
  const [{ query }] = useQueryParams();
@@ -173,6 +222,18 @@ const RootRelationRenderer = (props)=>{
173
222
  // TODO: check if we can remove the single type check
174
223
  const isSingleType = currentDocumentMeta.collectionType === SINGLE_TYPES;
175
224
  const isCreating = !currentDocumentMeta.documentId && !isSingleType;
225
+ const { isModalOpen } = state;
226
+ React.useEffect(()=>{
227
+ if (!isModalOpen) {
228
+ return;
229
+ }
230
+ openRelationModalCount += 1;
231
+ return ()=>{
232
+ openRelationModalCount -= 1;
233
+ };
234
+ }, [
235
+ isModalOpen
236
+ ]);
176
237
  /**
177
238
  * There is no parent relation, so the relation modal doesn't exist. Create it and set up all the
178
239
  * pieces that will be used by potential child relations: the context, header, form, and footer.
@@ -279,13 +340,35 @@ const RelationModal = ({ children })=>{
279
340
  const parentDocument = useDocument(parentDocumentMeta, {
280
341
  skip: !isCreating || !state.fieldToConnect
281
342
  });
282
- const initialValues = prefillParentRelation({
283
- initialValues: currentDocument.getInitialFormValues(isCreating),
284
- fieldToConnect: isCreating ? state.fieldToConnect : undefined,
285
- childSchema: currentDocument.schema,
286
- parentDocument: parentDocument.document,
287
- parentModel: parentDocumentMeta.model
288
- });
343
+ const pendingConnectsForCurrent = useRelationModal('RelationModalForm', (state)=>state.state.pendingConnects[getDocumentHistoryKey(currentDocumentMeta)], false) ?? EMPTY_PENDING_CONNECTS;
344
+ // Re-apply any local "connect" edits recorded for this document while a nested child was open,
345
+ // since navigating here just replaced the Form's values with a fresh, patch-less snapshot.
346
+ const initialValues = React.useMemo(()=>{
347
+ const baseInitialValues = prefillParentRelation({
348
+ initialValues: currentDocument.getInitialFormValues(isCreating),
349
+ fieldToConnect: isCreating ? state.fieldToConnect : undefined,
350
+ childSchema: currentDocument.schema,
351
+ parentDocument: parentDocument.document,
352
+ parentModel: parentDocumentMeta.model
353
+ });
354
+ // The document (and its default values) may still be loading, e.g. right after navigating
355
+ // back to a document that now has a real documentId. Let the loading guard below handle it
356
+ // instead of trying to patch a value that doesn't exist yet.
357
+ if (!baseInitialValues) {
358
+ return baseInitialValues;
359
+ }
360
+ return pendingConnectsForCurrent.reduce((values, patch)=>{
361
+ const withRelation = setIn(values, patch.fieldToConnect, patch.relationValue);
362
+ return patch.componentUIDPath && patch.componentUID !== undefined ? setIn(withRelation, patch.componentUIDPath, patch.componentUID) : withRelation;
363
+ }, baseInitialValues);
364
+ }, [
365
+ currentDocument,
366
+ isCreating,
367
+ state.fieldToConnect,
368
+ parentDocument.document,
369
+ parentDocumentMeta.model,
370
+ pendingConnectsForCurrent
371
+ ]);
289
372
  /*
290
373
  * We must wrap the modal window with Component Provider with reset values
291
374
  * to avoid inheriting id and uid from the root document and having weird
@@ -483,7 +566,8 @@ const RelationModal = ({ children })=>{
483
566
  shouldBypassConfirmation: true,
484
567
  fieldToConnect: state.fieldToConnect,
485
568
  fieldToConnectUID: state.fieldToConnectUID,
486
- getParentFormValues: state.getParentFormValues
569
+ getParentFormValues: state.getParentFormValues,
570
+ setParentFormValue: state.setParentFormValue
487
571
  }
488
572
  });
489
573
  }
@@ -697,5 +781,5 @@ const StyledRelationLink = styled(Link)`
697
781
  });
698
782
  };
699
783
 
700
- export { RelationModalRenderer, generateCreateUrl, getCollectionType, getFullPageUrl, prefillParentRelation, reducer, useRelationModal };
784
+ export { RelationModalRenderer, generateCreateUrl, getCollectionType, getFullPageUrl, isAnyRelationModalOpen, prefillParentRelation, reducer, useRelationModal };
701
785
  //# sourceMappingURL=RelationModal.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RelationModal.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n ConfirmDialog,\n DescriptionComponentRenderer,\n Form as FormContext,\n useRBAC,\n useStrapiApp,\n createContext,\n useForm,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Dialog,\n EmptyStateLayout,\n Flex,\n IconButton,\n Loader,\n Modal,\n Typography,\n TextButton,\n} from '@strapi/design-system';\nimport { ArrowLeft, ArrowsOut, WarningCircle } from '@strapi/icons';\nimport { generateNKeysBetween } from 'fractional-indexing';\nimport { useIntl } from 'react-intl';\nimport { Link as RouterLink, useLocation, useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../../../../../constants/collections';\nimport { PERMISSIONS } from '../../../../../constants/plugin';\nimport { buildValidParams } from '../../../../../exports';\nimport { DocumentRBAC } from '../../../../../features/DocumentRBAC';\nimport { useDoc, useDocument, type UseDocument } from '../../../../../hooks/useDocument';\nimport { type DocumentMeta } from '../../../../../hooks/useDocumentContext';\nimport { useDocumentLayout } from '../../../../../hooks/useDocumentLayout';\nimport { useLazyGetDocumentQuery } from '../../../../../services/documents';\nimport { createYupSchema } from '../../../../../utils/validation';\nimport { DocumentActionButton } from '../../../components/DocumentActions';\nimport { DocumentStatus } from '../../DocumentStatus';\nimport { FormLayout } from '../../FormLayout';\nimport { ComponentProvider } from '../ComponentContext';\n\nimport type { RelationOpenMode } from '../../../../../../../shared/contracts/content-types';\nimport type { ContentManagerPlugin, DocumentActionProps } from '../../../../../content-manager';\nimport type { AnyData } from '../../../utils/data';\n\nexport function getCollectionType(url: string) {\n const regex = new RegExp(`(${COLLECTION_TYPES}|${SINGLE_TYPES})`);\n const match = url.match(regex);\n return match ? match[1] : undefined;\n}\n\nconst StyledModalContent = styled(Modal.Content)`\n width: 90%;\n max-width: 100%;\n height: 90%;\n max-height: 100%;\n`;\n\nconst getFullPageUrl = (currentDocumentMeta: DocumentMeta): string => {\n const isSingleType = currentDocumentMeta.collectionType === SINGLE_TYPES;\n const queryParams = currentDocumentMeta.params?.locale\n ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}`\n : '';\n\n return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}${isSingleType ? '' : '/' + currentDocumentMeta.documentId}${queryParams}`;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * RelationModalRenderer\n * -----------------------------------------------------------------------------------------------*/\n\ninterface State {\n documentHistory: DocumentMeta[];\n confirmDialogIntent:\n | null // No dialog\n | 'close' // Close the modal\n | 'back' // Go back one document in the modal's history\n | 'navigate' // Open the document in the edit view instead of in the modal\n | DocumentMeta; // Open a specific document in the modal\n isModalOpen: boolean;\n hasUnsavedChanges: boolean;\n fieldToConnect?: string;\n fieldToConnectUID?: string;\n getParentFormValues?: () => AnyData;\n}\n\ntype Action =\n | {\n type: 'GO_TO_RELATION';\n payload: {\n document: DocumentMeta;\n shouldBypassConfirmation: boolean;\n fieldToConnect?: string;\n fieldToConnectUID?: string;\n getParentFormValues?: () => AnyData;\n };\n }\n | {\n type: 'GO_BACK';\n payload: { shouldBypassConfirmation: boolean };\n }\n | {\n type: 'GO_FULL_PAGE';\n }\n | {\n type: 'GO_TO_CREATED_RELATION';\n payload: {\n document: DocumentMeta;\n shouldBypassConfirmation: boolean;\n fieldToConnect?: string;\n fieldToConnectUID?: string;\n getParentFormValues?: () => AnyData;\n };\n }\n | {\n type: 'CANCEL_CONFIRM_DIALOG';\n }\n | {\n type: 'CLOSE_MODAL';\n payload: { shouldBypassConfirmation: boolean };\n }\n | {\n type: 'SET_HAS_UNSAVED_CHANGES';\n payload: { hasUnsavedChanges: boolean };\n };\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'GO_TO_RELATION':\n if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {\n return {\n ...state,\n confirmDialogIntent: action.payload.document,\n fieldToConnect: action.payload.fieldToConnect,\n fieldToConnectUID: action.payload.fieldToConnectUID,\n getParentFormValues: action.payload.getParentFormValues,\n };\n }\n\n const lastItemDocumentHistory = state.documentHistory.at(-1);\n const hasToResetDocumentHistory =\n lastItemDocumentHistory && !lastItemDocumentHistory.documentId;\n return {\n ...state,\n // Reset document history if the last item has documentId undefined\n documentHistory: hasToResetDocumentHistory\n ? [action.payload.document]\n : [...state.documentHistory, action.payload.document],\n confirmDialogIntent: null,\n isModalOpen: true,\n fieldToConnect: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnect,\n fieldToConnectUID: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnectUID,\n getParentFormValues: hasToResetDocumentHistory\n ? undefined\n : action.payload.getParentFormValues,\n };\n case 'GO_BACK':\n if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {\n return { ...state, confirmDialogIntent: 'back' };\n }\n\n return {\n ...state,\n documentHistory: state.documentHistory.slice(0, -1),\n confirmDialogIntent: null,\n };\n case 'GO_FULL_PAGE':\n if (state.hasUnsavedChanges) {\n return { ...state, confirmDialogIntent: 'navigate' };\n }\n\n return {\n ...state,\n documentHistory: [],\n hasUnsavedChanges: false,\n isModalOpen: false,\n confirmDialogIntent: null,\n };\n case 'GO_TO_CREATED_RELATION':\n return {\n ...state,\n // Reset document history if the last item has documentId undefined\n documentHistory: state.documentHistory\n ? [...state.documentHistory.slice(0, -1), action.payload.document]\n : [action.payload.document],\n confirmDialogIntent: null,\n isModalOpen: true,\n fieldToConnect: undefined,\n fieldToConnectUID: undefined,\n getParentFormValues: undefined,\n };\n case 'CANCEL_CONFIRM_DIALOG':\n return {\n ...state,\n confirmDialogIntent: null,\n };\n case 'CLOSE_MODAL':\n if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {\n return { ...state, confirmDialogIntent: 'close' };\n }\n\n return {\n ...state,\n documentHistory: [],\n confirmDialogIntent: null,\n hasUnsavedChanges: false,\n isModalOpen: false,\n fieldToConnect: undefined,\n fieldToConnectUID: undefined,\n getParentFormValues: undefined,\n };\n case 'SET_HAS_UNSAVED_CHANGES':\n return {\n ...state,\n hasUnsavedChanges: action.payload.hasUnsavedChanges,\n };\n default:\n return state;\n }\n}\n\ninterface RelationModalContextValue {\n state: State;\n dispatch: React.Dispatch<Action>;\n rootDocumentMeta: DocumentMeta;\n currentDocumentMeta: DocumentMeta;\n currentDocument: ReturnType<UseDocument>;\n onPreview?: () => void;\n isCreating: boolean;\n relationOpenMode: RelationOpenMode;\n}\n\nconst [RelationModalProvider, useRelationModal] =\n createContext<RelationModalContextValue>('RelationModal');\n\nfunction isRenderProp(\n children: RelationModalRendererProps['children']\n): children is (props: {\n dispatch: (action: Action) => void;\n relationOpenMode: RelationOpenMode;\n}) => React.ReactNode {\n return typeof children === 'function';\n}\n\ntype RelationModalRendererProps =\n // Is editing\n | {\n relation: DocumentMeta;\n children: React.ReactNode;\n }\n // Is creating\n | {\n relation?: never;\n children: (props: {\n dispatch: (action: Action) => void;\n relationOpenMode: RelationOpenMode;\n }) => React.ReactNode;\n };\n\nconst RootRelationRenderer = (props: RelationModalRendererProps) => {\n const { children } = props;\n\n const [state, dispatch] = React.useReducer(reducer, {\n documentHistory: [],\n confirmDialogIntent: null,\n isModalOpen: false,\n hasUnsavedChanges: false,\n fieldToConnect: undefined,\n });\n\n const rootDocument = useDoc();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query ?? {}), [query]);\n\n const rootDocumentMeta: DocumentMeta = {\n documentId: rootDocument.document?.documentId || '',\n model: rootDocument.model,\n collectionType: rootDocument.collectionType,\n params,\n };\n\n // Get the relationOpenMode setting from the current document's layout configuration\n const documentLayoutResponse = useDocumentLayout(rootDocument.model);\n const relationOpenMode: RelationOpenMode =\n documentLayoutResponse.edit?.settings?.relationOpenMode ?? 'modal';\n\n const currentDocumentMeta = state.documentHistory.at(-1) ?? rootDocumentMeta;\n const currentDocument = useDocument(currentDocumentMeta);\n // TODO: check if we can remove the single type check\n const isSingleType = currentDocumentMeta.collectionType === SINGLE_TYPES;\n const isCreating = !currentDocumentMeta.documentId && !isSingleType;\n /**\n * There is no parent relation, so the relation modal doesn't exist. Create it and set up all the\n * pieces that will be used by potential child relations: the context, header, form, and footer.\n */\n return (\n <RelationModalProvider\n state={state}\n dispatch={dispatch}\n rootDocumentMeta={rootDocumentMeta}\n currentDocumentMeta={currentDocumentMeta}\n currentDocument={currentDocument}\n isCreating={isCreating}\n relationOpenMode={relationOpenMode}\n >\n <RelationModal>\n {isRenderProp(children)\n ? children({ dispatch, relationOpenMode })\n : props.relation && (\n <RelationModalTrigger relation={props.relation}>{children}</RelationModalTrigger>\n )}\n </RelationModal>\n </RelationModalProvider>\n );\n};\n\nconst NestedRelationRenderer = (props: RelationModalRendererProps) => {\n const { children } = props;\n const dispatch = useRelationModal('NestedRelation', (state) => state.dispatch);\n const relationOpenMode = useRelationModal('NestedRelation', (state) => state.relationOpenMode);\n\n return isRenderProp(children)\n ? children({ dispatch, relationOpenMode })\n : props.relation && (\n <RelationModalTrigger relation={props.relation}>{children}</RelationModalTrigger>\n ); /* This is the trigger that will be rendered in the parent relation */\n};\n\n/**\n * Component responsible for rendering its children wrapped in a modal, form and context if needed\n */\nconst RelationModalRenderer = (props: RelationModalRendererProps) => {\n // We're in a nested relation if the relation modal context is not undefined\n const isNested = useRelationModal('RelationContextWrapper', (state) => state != undefined, false);\n\n return isNested ? <NestedRelationRenderer {...props} /> : <RootRelationRenderer {...props} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * RelationModal\n * -----------------------------------------------------------------------------------------------*/\nconst generateCreateUrl = (currentDocumentMeta: DocumentMeta) => {\n return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}/create${\n currentDocumentMeta.params?.locale\n ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}`\n : ''\n }`;\n};\n\n/**\n * Pre-fill the inverse relation with the parent that opened create-on-the-fly.\n * One-way relations have no inverse; unsaved parents have no documentId.\n */\nconst prefillParentRelation = ({\n initialValues,\n fieldToConnect,\n childSchema,\n parentDocument,\n parentModel,\n}: {\n initialValues?: AnyData;\n fieldToConnect?: string;\n childSchema?: { attributes?: Record<string, unknown> };\n parentDocument?: Record<string, unknown>;\n parentModel?: string;\n}): AnyData | undefined => {\n const documentId = parentDocument?.documentId;\n // mappedBy/inversedBy names a top-level attribute, not a component path.\n const parentFieldName = fieldToConnect;\n\n if (!initialValues || typeof documentId !== 'string' || !documentId || !parentFieldName) {\n return initialValues;\n }\n\n const inverseField = Object.entries(childSchema?.attributes ?? {}).find(([, attribute]) => {\n const relation = attribute as {\n type?: string;\n target?: string;\n inversedBy?: string;\n mappedBy?: string;\n };\n\n return (\n relation.type === 'relation' &&\n relation.target === parentModel &&\n (relation.inversedBy === parentFieldName || relation.mappedBy === parentFieldName)\n );\n })?.[0];\n\n if (!inverseField) {\n return initialValues;\n }\n\n const id = parentDocument.id ?? documentId;\n\n return {\n ...initialValues,\n [inverseField]: {\n connect: [\n {\n ...Object.fromEntries(\n Object.entries(parentDocument).filter(\n ([, value]) =>\n value === null || ['string', 'number', 'boolean'].includes(typeof value)\n )\n ),\n id,\n documentId,\n apiData: {\n id,\n documentId,\n locale: parentDocument.locale,\n isTemporary: true,\n },\n __temp_key__: generateNKeysBetween(null, null, 1)[0],\n },\n ],\n disconnect: [],\n },\n };\n};\n\nconst RelationModal = ({ children }: { children: React.ReactNode }) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const state = useRelationModal('RelationModalForm', (state) => state.state);\n const dispatch = useRelationModal('RelationModalForm', (state) => state.dispatch);\n const currentDocumentMeta = useRelationModal(\n 'RelationModalForm',\n (state) => state.currentDocumentMeta\n );\n const currentDocument = useRelationModal('RelationModalForm', (state) => state.currentDocument);\n const isCreating = useRelationModal('RelationModalForm', (state) => state.isCreating);\n const rootDocumentMeta = useRelationModal('RelationModalForm', (state) => state.rootDocumentMeta);\n const parentDocumentMeta = state.documentHistory.at(-2) ?? rootDocumentMeta;\n const parentDocument = useDocument(parentDocumentMeta, {\n skip: !isCreating || !state.fieldToConnect,\n });\n const initialValues = prefillParentRelation({\n initialValues: currentDocument.getInitialFormValues(isCreating),\n fieldToConnect: isCreating ? state.fieldToConnect : undefined,\n childSchema: currentDocument.schema,\n parentDocument: parentDocument.document,\n parentModel: parentDocumentMeta.model,\n });\n\n /*\n * We must wrap the modal window with Component Provider with reset values\n * to avoid inheriting id and uid from the root document and having weird\n * behaviors with simple relationships..\n */\n return (\n <ComponentProvider id={undefined} level={-1} uid={undefined} type={undefined}>\n <Modal.Root\n open={state.isModalOpen}\n onOpenChange={(open) => {\n if (!open) {\n dispatch({\n type: 'CLOSE_MODAL',\n payload: { shouldBypassConfirmation: false },\n });\n }\n }}\n >\n {children}\n <StyledModalContent>\n <Modal.Header gap={2}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\">\n <Flex gap={2}>\n <IconButton\n withTooltip={false}\n label={formatMessage({ id: 'global.back', defaultMessage: 'Back' })}\n variant=\"ghost\"\n disabled={state.documentHistory.length < 2}\n onClick={() => {\n dispatch({\n type: 'GO_BACK',\n payload: { shouldBypassConfirmation: false },\n });\n }}\n marginRight={1}\n >\n <ArrowLeft />\n </IconButton>\n <Typography tag=\"span\" fontWeight={600}>\n {isCreating\n ? formatMessage({\n id: 'content-manager.relation.create',\n defaultMessage: 'Create a relation',\n })\n : formatMessage({\n id: 'content-manager.components.RelationInputModal.modal-title',\n defaultMessage: 'Edit a relation',\n })}\n </Typography>\n </Flex>\n <IconButton\n onClick={() => {\n dispatch({\n type: 'GO_FULL_PAGE',\n });\n if (!state.hasUnsavedChanges) {\n if (isCreating) {\n navigate(generateCreateUrl(currentDocumentMeta));\n } else {\n navigate(getFullPageUrl(currentDocumentMeta));\n }\n }\n }}\n variant=\"tertiary\"\n label={formatMessage({\n id: 'content-manager.components.RelationInputModal.button-fullpage',\n defaultMessage: 'Go to entry',\n })}\n >\n <ArrowsOut />\n </IconButton>\n </Flex>\n </Modal.Header>\n <Modal.Body>\n <FormContext\n method={isCreating ? 'POST' : 'PUT'}\n initialValues={initialValues}\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const yupSchema = createYupSchema(\n currentDocument.schema?.attributes,\n currentDocument.components,\n {\n status: currentDocument.document?.status,\n ...options,\n }\n );\n\n return yupSchema.validate(values, { abortEarly: false });\n }}\n >\n <RelationModalBody />\n </FormContext>\n </Modal.Body>\n </StyledModalContent>\n </Modal.Root>\n </ComponentProvider>\n );\n};\n/**\n * All the main content (not header and footer) of the relation modal, plus the confirmation dialog.\n * Will be wrapped in a Modal.Body by the RelationModal component.\n * Cannot be moved directly inside RelationModal because it needs access to the context via hooks.\n */\nconst RelationModalBody = () => {\n const navigate = useNavigate();\n const { pathname, search } = useLocation();\n const { formatMessage } = useIntl();\n\n const [triggerRefetchDocument] = useLazyGetDocumentQuery();\n\n const state = useRelationModal('RelationModalForm', (state) => state.state);\n const dispatch = useRelationModal('RelationModalForm', (state) => state.dispatch);\n const rootDocumentMeta = useRelationModal('RelationModalForm', (state) => state.rootDocumentMeta);\n const currentDocumentMeta = useRelationModal(\n 'RelationModalForm',\n (state) => state.currentDocumentMeta\n );\n const isCreating = useRelationModal('RelationModalForm', (state) => state.isCreating);\n\n /**\n * One-way sync the modified state from the form to the modal state.\n * It is needed because we need to consume state from the form context in order to lift it up\n * into the modal context. It is not possible otherwise because the modal needs the form state,\n * but it must be a parent of the form.\n */\n const modified = useForm('FormWatcher', (state) => state.modified);\n const isSubmitting = useForm('FormWatcher', (state) => state.isSubmitting);\n const hasUnsavedChanges = modified && !isSubmitting;\n React.useEffect(() => {\n dispatch({ type: 'SET_HAS_UNSAVED_CHANGES', payload: { hasUnsavedChanges } });\n }, [hasUnsavedChanges, dispatch]);\n\n const handleCloseModal = (shouldBypassConfirmation: boolean) => {\n dispatch({ type: 'CLOSE_MODAL', payload: { shouldBypassConfirmation } });\n\n if (shouldBypassConfirmation || !state.hasUnsavedChanges) {\n // TODO: check if we can avoid this by relying on RTK invalidatesTags.\n // If so we can delete this function and dispatch the events directly\n triggerRefetchDocument(\n // TODO check if params should be removed (as they were before)\n rootDocumentMeta,\n // Favor the cache\n true\n );\n }\n };\n\n const handleRedirection = () => {\n const editViewUrl = `${pathname}${search}`;\n const fullPageUrl = getFullPageUrl(currentDocumentMeta);\n const isRootDocumentUrl = editViewUrl.includes(fullPageUrl);\n\n if (isRootDocumentUrl) {\n handleCloseModal(true);\n } else {\n if (isCreating) {\n navigate(generateCreateUrl(currentDocumentMeta));\n } else {\n navigate(fullPageUrl);\n }\n }\n };\n\n const handleConfirm = () => {\n if (state.confirmDialogIntent === null) {\n return;\n }\n if (state.confirmDialogIntent === 'navigate') {\n handleRedirection();\n } else if (state.confirmDialogIntent === 'back') {\n dispatch({ type: 'GO_BACK', payload: { shouldBypassConfirmation: true } });\n } else if (state.confirmDialogIntent === 'close') {\n handleCloseModal(true);\n } else if ('documentId' in state.confirmDialogIntent) {\n dispatch({\n type: 'GO_TO_RELATION',\n payload: {\n document: state.confirmDialogIntent,\n shouldBypassConfirmation: true,\n fieldToConnect: state.fieldToConnect,\n fieldToConnectUID: state.fieldToConnectUID,\n getParentFormValues: state.getParentFormValues,\n },\n });\n }\n };\n\n return (\n <>\n <RelationModalForm />\n <Dialog.Root open={state.confirmDialogIntent != null}>\n <ConfirmDialog\n onConfirm={() => handleConfirm()}\n onCancel={() => dispatch({ type: 'CANCEL_CONFIRM_DIALOG' })}\n variant=\"danger\"\n >\n {formatMessage({\n id: 'content-manager.components.RelationInputModal.confirmation-message',\n defaultMessage:\n 'Some changes were not saved. Are you sure you want to close this relation? All changes that were not saved will be lost.',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </>\n );\n};\n\nconst RelationModalTrigger = ({\n children,\n relation,\n}: {\n children: React.ReactNode;\n relation: DocumentMeta;\n}) => {\n const dispatch = useRelationModal('ModalTrigger', (state) => state.dispatch);\n const relationOpenMode = useRelationModal('ModalTrigger', (state) => state.relationOpenMode);\n\n const fullPageUrl = getFullPageUrl(relation);\n\n if (relationOpenMode === 'newTab') {\n return (\n <StyledRelationLink to={fullPageUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </StyledRelationLink>\n );\n }\n\n if (relationOpenMode === 'page') {\n return <StyledRelationLink to={fullPageUrl}>{children}</StyledRelationLink>;\n }\n\n return (\n <StyledTextButton\n onClick={() =>\n dispatch({\n type: 'GO_TO_RELATION',\n payload: { document: relation, shouldBypassConfirmation: false },\n })\n }\n >\n {children}\n </StyledTextButton>\n );\n};\n\nconst StyledTextButton = styled(TextButton)`\n max-width: 100%;\n & > span {\n font-size: ${({ theme }) => theme.fontSizes[2]};\n width: inherit;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n`;\n\nconst StyledRelationLink = styled(RouterLink)`\n max-width: 100%;\n font-size: ${({ theme }) => theme.fontSizes[2]};\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n display: block;\n color: ${({ theme }) => theme.colors.primary600};\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: ${({ theme }) => theme.colors.primary700};\n text-decoration: underline;\n }\n`;\n\n/**\n * The mini edit view for a relation that is displayed inside a modal.\n * It's complete with its header, document actions and form layout.\n */\nconst RelationModalForm = () => {\n const { formatMessage } = useIntl();\n\n const currentDocumentMeta = useRelationModal(\n 'RelationModalForm',\n (state) => state.currentDocumentMeta\n );\n const isCreating = useRelationModal('RelationModalForm', (state) => state.isCreating);\n const currentDocument = useRelationModal('RelationModalForm', (state) => state.currentDocument);\n const documentLayoutResponse = useDocumentLayout(currentDocumentMeta.model);\n const plugins = useStrapiApp('RelationModalForm', (state) => state.plugins);\n\n const initialValues = isCreating\n ? currentDocument.getInitialFormValues(isCreating)\n : currentDocument.getInitialFormValues();\n\n const {\n permissions = [],\n isLoading: isLoadingPermissions,\n error,\n } = useRBAC(\n PERMISSIONS.map((action) => ({\n action,\n subject: currentDocumentMeta.model,\n }))\n );\n\n const isLoading =\n isLoadingPermissions || documentLayoutResponse.isLoading || currentDocument.isLoading;\n\n if (isLoading && !currentDocument.document?.documentId) {\n return (\n <Loader small>\n {formatMessage({\n id: 'content-manager.ListViewTable.relation-loading',\n defaultMessage: 'Relations are loading',\n })}\n </Loader>\n );\n }\n\n if (\n error ||\n !currentDocumentMeta.model ||\n documentLayoutResponse.error ||\n (!isCreating && !currentDocument.document) ||\n (!isCreating && !currentDocument.meta) ||\n !currentDocument.schema ||\n !initialValues\n ) {\n return (\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<WarningCircle width=\"16rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Whoops! Something went wrong. Please, try again.',\n })}\n />\n </Flex>\n );\n }\n\n const documentTitle = currentDocument.getTitle(documentLayoutResponse.edit.settings.mainField);\n const hasDraftAndPublished = currentDocument.schema?.options?.draftAndPublish ?? false;\n\n const props = {\n activeTab: 'draft',\n collectionType: currentDocumentMeta.collectionType,\n model: currentDocumentMeta.model,\n documentId: currentDocumentMeta.documentId,\n document: currentDocument.document,\n meta: currentDocument.meta,\n } satisfies DocumentActionProps;\n\n return (\n <DocumentRBAC permissions={permissions} model={currentDocumentMeta.model}>\n <Flex alignItems=\"flex-start\" direction=\"column\" gap={2}>\n <Flex width=\"100%\" justifyContent=\"space-between\" gap={2}>\n <Typography tag=\"h2\" variant=\"alpha\">\n {documentTitle}\n </Typography>\n <Flex gap={2}>\n <DescriptionComponentRenderer\n props={props}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions('relation-modal')}\n >\n {(actions) => {\n const filteredActions = actions.filter((action) => {\n return [action.position].flat().includes('relation-modal');\n });\n const [primaryAction, secondaryAction] = filteredActions;\n\n if (!primaryAction && !secondaryAction) return null;\n\n // Both actions are available when draft and publish enabled\n if (primaryAction && secondaryAction) {\n return (\n <>\n {/* Save */}\n <DocumentActionButton\n {...secondaryAction}\n variant={secondaryAction.variant || 'secondary'}\n />\n {/* Publish */}\n <DocumentActionButton\n {...primaryAction}\n variant={primaryAction.variant || 'default'}\n />\n </>\n );\n }\n\n // Otherwise we just have the save action\n return (\n <DocumentActionButton\n {...primaryAction}\n variant={primaryAction.variant || 'secondary'}\n />\n );\n }}\n </DescriptionComponentRenderer>\n </Flex>\n </Flex>\n {hasDraftAndPublished ? (\n <Box>\n <DocumentStatus status={currentDocument.document?.status} />\n </Box>\n ) : null}\n </Flex>\n\n <Flex flex={1} overflow=\"auto\" alignItems=\"stretch\" paddingTop={7}>\n <Box overflow=\"auto\" flex={1}>\n <FormLayout\n layout={documentLayoutResponse.edit.layout}\n document={currentDocument}\n hasBackground={false}\n />\n </Box>\n </Flex>\n </DocumentRBAC>\n );\n};\n\nexport {\n reducer,\n RelationModalRenderer,\n useRelationModal,\n getFullPageUrl,\n generateCreateUrl,\n prefillParentRelation,\n};\nexport type { State, Action, RelationOpenMode };\n"],"names":["getCollectionType","url","regex","RegExp","COLLECTION_TYPES","SINGLE_TYPES","match","undefined","StyledModalContent","styled","Modal","Content","getFullPageUrl","currentDocumentMeta","isSingleType","collectionType","queryParams","params","locale","model","documentId","reducer","state","action","type","hasUnsavedChanges","payload","shouldBypassConfirmation","confirmDialogIntent","document","fieldToConnect","fieldToConnectUID","getParentFormValues","lastItemDocumentHistory","documentHistory","at","hasToResetDocumentHistory","isModalOpen","slice","RelationModalProvider","useRelationModal","createContext","isRenderProp","children","RootRelationRenderer","props","dispatch","React","useReducer","rootDocument","useDoc","query","useQueryParams","useMemo","buildValidParams","rootDocumentMeta","documentLayoutResponse","useDocumentLayout","relationOpenMode","edit","settings","currentDocument","useDocument","isCreating","_jsx","RelationModal","relation","RelationModalTrigger","NestedRelationRenderer","RelationModalRenderer","isNested","generateCreateUrl","prefillParentRelation","initialValues","childSchema","parentDocument","parentModel","parentFieldName","inverseField","Object","entries","attributes","find","attribute","target","inversedBy","mappedBy","id","connect","fromEntries","filter","value","includes","apiData","isTemporary","__temp_key__","generateNKeysBetween","disconnect","formatMessage","useIntl","navigate","useNavigate","parentDocumentMeta","skip","getInitialFormValues","schema","ComponentProvider","level","uid","_jsxs","Root","open","onOpenChange","Header","gap","Flex","justifyContent","alignItems","width","IconButton","withTooltip","label","defaultMessage","variant","disabled","length","onClick","marginRight","ArrowLeft","Typography","tag","fontWeight","ArrowsOut","Body","FormContext","method","validate","values","options","yupSchema","createYupSchema","components","status","abortEarly","RelationModalBody","pathname","search","useLocation","triggerRefetchDocument","useLazyGetDocumentQuery","modified","useForm","isSubmitting","useEffect","handleCloseModal","handleRedirection","editViewUrl","fullPageUrl","isRootDocumentUrl","handleConfirm","_Fragment","RelationModalForm","Dialog","ConfirmDialog","onConfirm","onCancel","StyledRelationLink","to","rel","StyledTextButton","TextButton","theme","fontSizes","RouterLink","colors","primary600","primary700","plugins","useStrapiApp","permissions","isLoading","isLoadingPermissions","error","useRBAC","PERMISSIONS","map","subject","Loader","small","meta","height","EmptyStateLayout","icon","WarningCircle","content","documentTitle","getTitle","mainField","hasDraftAndPublished","draftAndPublish","activeTab","DocumentRBAC","direction","DescriptionComponentRenderer","descriptions","apis","getDocumentActions","actions","filteredActions","position","flat","primaryAction","secondaryAction","DocumentActionButton","Box","DocumentStatus","flex","overflow","paddingTop","FormLayout","layout","hasBackground"],"mappings":"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"}
1
+ {"version":3,"file":"RelationModal.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n ConfirmDialog,\n DescriptionComponentRenderer,\n Form as FormContext,\n useRBAC,\n useStrapiApp,\n createContext,\n useForm,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Dialog,\n EmptyStateLayout,\n Flex,\n IconButton,\n Loader,\n Modal,\n Typography,\n TextButton,\n} from '@strapi/design-system';\nimport { ArrowLeft, ArrowsOut, WarningCircle } from '@strapi/icons';\nimport { generateNKeysBetween } from 'fractional-indexing';\nimport { useIntl } from 'react-intl';\nimport { Link as RouterLink, useLocation, useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../../../../../constants/collections';\nimport { PERMISSIONS } from '../../../../../constants/plugin';\nimport { buildValidParams } from '../../../../../exports';\nimport { DocumentRBAC } from '../../../../../features/DocumentRBAC';\nimport { useDoc, useDocument, type UseDocument } from '../../../../../hooks/useDocument';\nimport { type DocumentMeta } from '../../../../../hooks/useDocumentContext';\nimport { useDocumentLayout } from '../../../../../hooks/useDocumentLayout';\nimport { useLazyGetDocumentQuery } from '../../../../../services/documents';\nimport { setIn } from '../../../../../utils/objects';\nimport { createYupSchema } from '../../../../../utils/validation';\nimport { DocumentActionButton } from '../../../components/DocumentActions';\nimport { DocumentStatus } from '../../DocumentStatus';\nimport { FormLayout } from '../../FormLayout';\nimport { ComponentProvider } from '../ComponentContext';\n\nimport type { RelationOpenMode } from '../../../../../../../shared/contracts/content-types';\nimport type { ContentManagerPlugin, DocumentActionProps } from '../../../../../content-manager';\nimport type { AnyData } from '../../../utils/data';\n\nexport function getCollectionType(url: string) {\n const regex = new RegExp(`(${COLLECTION_TYPES}|${SINGLE_TYPES})`);\n const match = url.match(regex);\n return match ? match[1] : undefined;\n}\n\nconst StyledModalContent = styled(Modal.Content)`\n width: 90%;\n max-width: 100%;\n height: 90%;\n max-height: 100%;\n`;\n\nconst getFullPageUrl = (currentDocumentMeta: DocumentMeta): string => {\n const isSingleType = currentDocumentMeta.collectionType === SINGLE_TYPES;\n const queryParams = currentDocumentMeta.params?.locale\n ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}`\n : '';\n\n return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}${isSingleType ? '' : '/' + currentDocumentMeta.documentId}${queryParams}`;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * RelationModalRenderer\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * A local \"connect\" edit waiting to be applied to a document that isn't the modal's current one.\n * Needed because every level of a nested relation-on-the-fly chain (root document aside) shares\n * one Form instance whose values get wholesale-replaced by fresh initialValues on every\n * `documentHistory` navigation — writing the field directly while a different level is current\n * would land on the wrong document and then immediately be discarded. Instead the patch is stashed\n * here, keyed by the target document, and merged back into that document's initialValues once it\n * becomes current again (see `RelationModal`'s `initialValues` below).\n */\ninterface PendingConnectPatch {\n fieldToConnect: string;\n relationValue: AnyData;\n componentUIDPath?: string;\n componentUID?: string;\n}\n\nconst getDocumentHistoryKey = (meta: Pick<DocumentMeta, 'model' | 'documentId'>) =>\n `${meta.model}::${meta.documentId}`;\n\nconst EMPTY_PENDING_CONNECTS: PendingConnectPatch[] = [];\n\ninterface State {\n documentHistory: DocumentMeta[];\n confirmDialogIntent:\n | null // No dialog\n | 'close' // Close the modal\n | 'back' // Go back one document in the modal's history\n | 'navigate' // Open the document in the edit view instead of in the modal\n | DocumentMeta; // Open a specific document in the modal\n isModalOpen: boolean;\n hasUnsavedChanges: boolean;\n fieldToConnect?: string;\n fieldToConnectUID?: string;\n getParentFormValues?: () => AnyData;\n // Sets a field directly on the parent's own (live, unsaved) form state, so connecting a\n // newly-created relation doesn't require persisting the whole parent document to the server.\n setParentFormValue?: (path: string, value: unknown) => void;\n pendingConnects: Record<string, PendingConnectPatch[]>;\n}\n\ntype Action =\n | {\n type: 'GO_TO_RELATION';\n payload: {\n document: DocumentMeta;\n shouldBypassConfirmation: boolean;\n fieldToConnect?: string;\n fieldToConnectUID?: string;\n getParentFormValues?: () => AnyData;\n setParentFormValue?: (path: string, value: unknown) => void;\n };\n }\n | {\n type: 'GO_BACK';\n payload: { shouldBypassConfirmation: boolean };\n }\n | {\n type: 'GO_FULL_PAGE';\n }\n | {\n type: 'GO_TO_CREATED_RELATION';\n payload: {\n document: DocumentMeta;\n shouldBypassConfirmation: boolean;\n // Present when the document being connected belongs to a NESTED parent (one still further\n // up `documentHistory`, not the root document) — see `pendingConnects` on `State`.\n connectPatch?: PendingConnectPatch;\n };\n }\n | {\n type: 'CANCEL_CONFIRM_DIALOG';\n }\n | {\n type: 'CLOSE_MODAL';\n payload: { shouldBypassConfirmation: boolean };\n }\n | {\n type: 'SET_HAS_UNSAVED_CHANGES';\n payload: { hasUnsavedChanges: boolean };\n }\n | {\n type: 'CLEAR_PENDING_CONNECTS';\n payload: { documentMeta: Pick<DocumentMeta, 'model' | 'documentId'> };\n };\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'GO_TO_RELATION':\n if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {\n return {\n ...state,\n confirmDialogIntent: action.payload.document,\n fieldToConnect: action.payload.fieldToConnect,\n fieldToConnectUID: action.payload.fieldToConnectUID,\n getParentFormValues: action.payload.getParentFormValues,\n setParentFormValue: action.payload.setParentFormValue,\n };\n }\n\n const lastItemDocumentHistory = state.documentHistory.at(-1);\n const hasToResetDocumentHistory =\n lastItemDocumentHistory && !lastItemDocumentHistory.documentId;\n return {\n ...state,\n // Reset document history if the last item has documentId undefined\n documentHistory: hasToResetDocumentHistory\n ? [action.payload.document]\n : [...state.documentHistory, action.payload.document],\n confirmDialogIntent: null,\n isModalOpen: true,\n fieldToConnect: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnect,\n fieldToConnectUID: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnectUID,\n getParentFormValues: hasToResetDocumentHistory\n ? undefined\n : action.payload.getParentFormValues,\n setParentFormValue: hasToResetDocumentHistory\n ? undefined\n : action.payload.setParentFormValue,\n };\n case 'GO_BACK':\n if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {\n return { ...state, confirmDialogIntent: 'back' };\n }\n\n return {\n ...state,\n documentHistory: state.documentHistory.slice(0, -1),\n confirmDialogIntent: null,\n };\n case 'GO_FULL_PAGE':\n if (state.hasUnsavedChanges) {\n return { ...state, confirmDialogIntent: 'navigate' };\n }\n\n return {\n ...state,\n documentHistory: [],\n hasUnsavedChanges: false,\n isModalOpen: false,\n confirmDialogIntent: null,\n pendingConnects: {},\n };\n case 'GO_TO_CREATED_RELATION': {\n // Anything beyond the second-to-last history entry is a nested parent still open further up\n // the stack — the root document (outside documentHistory entirely) is handled directly via\n // setParentFormValue instead, since its Form never gets replaced by modal navigation.\n const nestedParentMeta =\n state.documentHistory.length >= 2 ? state.documentHistory.at(-2) : undefined;\n const pendingConnects =\n nestedParentMeta && action.payload.connectPatch\n ? {\n ...state.pendingConnects,\n [getDocumentHistoryKey(nestedParentMeta)]: [\n ...(state.pendingConnects[getDocumentHistoryKey(nestedParentMeta)] ?? []),\n action.payload.connectPatch,\n ],\n }\n : state.pendingConnects;\n\n return {\n ...state,\n // Reset document history if the last item has documentId undefined\n documentHistory: state.documentHistory\n ? [...state.documentHistory.slice(0, -1), action.payload.document]\n : [action.payload.document],\n confirmDialogIntent: null,\n isModalOpen: true,\n fieldToConnect: undefined,\n fieldToConnectUID: undefined,\n getParentFormValues: undefined,\n setParentFormValue: undefined,\n pendingConnects,\n };\n }\n case 'CANCEL_CONFIRM_DIALOG':\n return {\n ...state,\n confirmDialogIntent: null,\n };\n case 'CLOSE_MODAL':\n if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {\n return { ...state, confirmDialogIntent: 'close' };\n }\n\n return {\n ...state,\n documentHistory: [],\n confirmDialogIntent: null,\n hasUnsavedChanges: false,\n isModalOpen: false,\n fieldToConnect: undefined,\n fieldToConnectUID: undefined,\n getParentFormValues: undefined,\n setParentFormValue: undefined,\n pendingConnects: {},\n };\n case 'SET_HAS_UNSAVED_CHANGES':\n return {\n ...state,\n hasUnsavedChanges: action.payload.hasUnsavedChanges,\n };\n case 'CLEAR_PENDING_CONNECTS': {\n const key = getDocumentHistoryKey(action.payload.documentMeta);\n\n if (!(key in state.pendingConnects)) {\n return state;\n }\n\n const pendingConnects = { ...state.pendingConnects };\n delete pendingConnects[key];\n\n return { ...state, pendingConnects };\n }\n default:\n return state;\n }\n}\n\n/**\n * Whether any relation-on-the-fly modal is currently open, anywhere on the page.\n *\n * The modal's React context (`RelationModalProvider`, below) only reaches the modal's own subtree\n * (the relation field that renders it), so components mounted outside that subtree — like the\n * background entry's save/publish buttons in the side panel — can't read `state.isModalOpen` from\n * context. This module-level counter is the cross-tree signal those components use instead, so\n * they can tell a relation modal is open and suppress their own keyboard shortcuts while it is.\n */\nlet openRelationModalCount = 0;\n\nconst isAnyRelationModalOpen = () => openRelationModalCount > 0;\n\ninterface RelationModalContextValue {\n state: State;\n dispatch: React.Dispatch<Action>;\n rootDocumentMeta: DocumentMeta;\n currentDocumentMeta: DocumentMeta;\n currentDocument: ReturnType<UseDocument>;\n onPreview?: () => void;\n isCreating: boolean;\n relationOpenMode: RelationOpenMode;\n}\n\nconst [RelationModalProvider, useRelationModal] =\n createContext<RelationModalContextValue>('RelationModal');\n\nfunction isRenderProp(\n children: RelationModalRendererProps['children']\n): children is (props: {\n dispatch: (action: Action) => void;\n relationOpenMode: RelationOpenMode;\n}) => React.ReactNode {\n return typeof children === 'function';\n}\n\ntype RelationModalRendererProps =\n // Is editing\n | {\n relation: DocumentMeta;\n children: React.ReactNode;\n }\n // Is creating\n | {\n relation?: never;\n children: (props: {\n dispatch: (action: Action) => void;\n relationOpenMode: RelationOpenMode;\n }) => React.ReactNode;\n };\n\nconst RootRelationRenderer = (props: RelationModalRendererProps) => {\n const { children } = props;\n\n const [state, dispatch] = React.useReducer(reducer, {\n documentHistory: [],\n confirmDialogIntent: null,\n isModalOpen: false,\n hasUnsavedChanges: false,\n fieldToConnect: undefined,\n pendingConnects: {},\n });\n\n const rootDocument = useDoc();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query ?? {}), [query]);\n\n const rootDocumentMeta: DocumentMeta = {\n documentId: rootDocument.document?.documentId || '',\n model: rootDocument.model,\n collectionType: rootDocument.collectionType,\n params,\n };\n\n // Get the relationOpenMode setting from the current document's layout configuration\n const documentLayoutResponse = useDocumentLayout(rootDocument.model);\n const relationOpenMode: RelationOpenMode =\n documentLayoutResponse.edit?.settings?.relationOpenMode ?? 'modal';\n\n const currentDocumentMeta = state.documentHistory.at(-1) ?? rootDocumentMeta;\n const currentDocument = useDocument(currentDocumentMeta);\n // TODO: check if we can remove the single type check\n const isSingleType = currentDocumentMeta.collectionType === SINGLE_TYPES;\n const isCreating = !currentDocumentMeta.documentId && !isSingleType;\n\n const { isModalOpen } = state;\n React.useEffect(() => {\n if (!isModalOpen) {\n return;\n }\n\n openRelationModalCount += 1;\n\n return () => {\n openRelationModalCount -= 1;\n };\n }, [isModalOpen]);\n\n /**\n * There is no parent relation, so the relation modal doesn't exist. Create it and set up all the\n * pieces that will be used by potential child relations: the context, header, form, and footer.\n */\n return (\n <RelationModalProvider\n state={state}\n dispatch={dispatch}\n rootDocumentMeta={rootDocumentMeta}\n currentDocumentMeta={currentDocumentMeta}\n currentDocument={currentDocument}\n isCreating={isCreating}\n relationOpenMode={relationOpenMode}\n >\n <RelationModal>\n {isRenderProp(children)\n ? children({ dispatch, relationOpenMode })\n : props.relation && (\n <RelationModalTrigger relation={props.relation}>{children}</RelationModalTrigger>\n )}\n </RelationModal>\n </RelationModalProvider>\n );\n};\n\nconst NestedRelationRenderer = (props: RelationModalRendererProps) => {\n const { children } = props;\n const dispatch = useRelationModal('NestedRelation', (state) => state.dispatch);\n const relationOpenMode = useRelationModal('NestedRelation', (state) => state.relationOpenMode);\n\n return isRenderProp(children)\n ? children({ dispatch, relationOpenMode })\n : props.relation && (\n <RelationModalTrigger relation={props.relation}>{children}</RelationModalTrigger>\n ); /* This is the trigger that will be rendered in the parent relation */\n};\n\n/**\n * Component responsible for rendering its children wrapped in a modal, form and context if needed\n */\nconst RelationModalRenderer = (props: RelationModalRendererProps) => {\n // We're in a nested relation if the relation modal context is not undefined\n const isNested = useRelationModal('RelationContextWrapper', (state) => state != undefined, false);\n\n return isNested ? <NestedRelationRenderer {...props} /> : <RootRelationRenderer {...props} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * RelationModal\n * -----------------------------------------------------------------------------------------------*/\nconst generateCreateUrl = (currentDocumentMeta: DocumentMeta) => {\n return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}/create${\n currentDocumentMeta.params?.locale\n ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}`\n : ''\n }`;\n};\n\n/**\n * Pre-fill the inverse relation with the parent that opened create-on-the-fly.\n * One-way relations have no inverse; unsaved parents have no documentId.\n */\nconst prefillParentRelation = ({\n initialValues,\n fieldToConnect,\n childSchema,\n parentDocument,\n parentModel,\n}: {\n initialValues?: AnyData;\n fieldToConnect?: string;\n childSchema?: { attributes?: Record<string, unknown> };\n parentDocument?: Record<string, unknown>;\n parentModel?: string;\n}): AnyData | undefined => {\n const documentId = parentDocument?.documentId;\n // mappedBy/inversedBy names a top-level attribute, not a component path.\n const parentFieldName = fieldToConnect;\n\n if (!initialValues || typeof documentId !== 'string' || !documentId || !parentFieldName) {\n return initialValues;\n }\n\n const inverseField = Object.entries(childSchema?.attributes ?? {}).find(([, attribute]) => {\n const relation = attribute as {\n type?: string;\n target?: string;\n inversedBy?: string;\n mappedBy?: string;\n };\n\n return (\n relation.type === 'relation' &&\n relation.target === parentModel &&\n (relation.inversedBy === parentFieldName || relation.mappedBy === parentFieldName)\n );\n })?.[0];\n\n if (!inverseField) {\n return initialValues;\n }\n\n const id = parentDocument.id ?? documentId;\n\n return {\n ...initialValues,\n [inverseField]: {\n connect: [\n {\n ...Object.fromEntries(\n Object.entries(parentDocument).filter(\n ([, value]) =>\n value === null || ['string', 'number', 'boolean'].includes(typeof value)\n )\n ),\n id,\n documentId,\n apiData: {\n id,\n documentId,\n locale: parentDocument.locale,\n isTemporary: true,\n },\n __temp_key__: generateNKeysBetween(null, null, 1)[0],\n },\n ],\n disconnect: [],\n },\n };\n};\n\nconst RelationModal = ({ children }: { children: React.ReactNode }) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const state = useRelationModal('RelationModalForm', (state) => state.state);\n const dispatch = useRelationModal('RelationModalForm', (state) => state.dispatch);\n const currentDocumentMeta = useRelationModal(\n 'RelationModalForm',\n (state) => state.currentDocumentMeta\n );\n const currentDocument = useRelationModal('RelationModalForm', (state) => state.currentDocument);\n const isCreating = useRelationModal('RelationModalForm', (state) => state.isCreating);\n const rootDocumentMeta = useRelationModal('RelationModalForm', (state) => state.rootDocumentMeta);\n const parentDocumentMeta = state.documentHistory.at(-2) ?? rootDocumentMeta;\n const parentDocument = useDocument(parentDocumentMeta, {\n skip: !isCreating || !state.fieldToConnect,\n });\n\n const pendingConnectsForCurrent =\n useRelationModal(\n 'RelationModalForm',\n (state) => state.state.pendingConnects[getDocumentHistoryKey(currentDocumentMeta)],\n false\n ) ?? EMPTY_PENDING_CONNECTS;\n\n // Re-apply any local \"connect\" edits recorded for this document while a nested child was open,\n // since navigating here just replaced the Form's values with a fresh, patch-less snapshot.\n const initialValues = React.useMemo(() => {\n const baseInitialValues = prefillParentRelation({\n initialValues: currentDocument.getInitialFormValues(isCreating),\n fieldToConnect: isCreating ? state.fieldToConnect : undefined,\n childSchema: currentDocument.schema,\n parentDocument: parentDocument.document,\n parentModel: parentDocumentMeta.model,\n });\n\n // The document (and its default values) may still be loading, e.g. right after navigating\n // back to a document that now has a real documentId. Let the loading guard below handle it\n // instead of trying to patch a value that doesn't exist yet.\n if (!baseInitialValues) {\n return baseInitialValues;\n }\n\n return pendingConnectsForCurrent.reduce((values, patch) => {\n const withRelation = setIn(values, patch.fieldToConnect, patch.relationValue);\n\n return patch.componentUIDPath && patch.componentUID !== undefined\n ? setIn(withRelation, patch.componentUIDPath, patch.componentUID)\n : withRelation;\n }, baseInitialValues);\n }, [\n currentDocument,\n isCreating,\n state.fieldToConnect,\n parentDocument.document,\n parentDocumentMeta.model,\n pendingConnectsForCurrent,\n ]);\n\n /*\n * We must wrap the modal window with Component Provider with reset values\n * to avoid inheriting id and uid from the root document and having weird\n * behaviors with simple relationships..\n */\n return (\n <ComponentProvider id={undefined} level={-1} uid={undefined} type={undefined}>\n <Modal.Root\n open={state.isModalOpen}\n onOpenChange={(open) => {\n if (!open) {\n dispatch({\n type: 'CLOSE_MODAL',\n payload: { shouldBypassConfirmation: false },\n });\n }\n }}\n >\n {children}\n <StyledModalContent>\n <Modal.Header gap={2}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\">\n <Flex gap={2}>\n <IconButton\n withTooltip={false}\n label={formatMessage({ id: 'global.back', defaultMessage: 'Back' })}\n variant=\"ghost\"\n disabled={state.documentHistory.length < 2}\n onClick={() => {\n dispatch({\n type: 'GO_BACK',\n payload: { shouldBypassConfirmation: false },\n });\n }}\n marginRight={1}\n >\n <ArrowLeft />\n </IconButton>\n <Typography tag=\"span\" fontWeight={600}>\n {isCreating\n ? formatMessage({\n id: 'content-manager.relation.create',\n defaultMessage: 'Create a relation',\n })\n : formatMessage({\n id: 'content-manager.components.RelationInputModal.modal-title',\n defaultMessage: 'Edit a relation',\n })}\n </Typography>\n </Flex>\n <IconButton\n onClick={() => {\n dispatch({\n type: 'GO_FULL_PAGE',\n });\n if (!state.hasUnsavedChanges) {\n if (isCreating) {\n navigate(generateCreateUrl(currentDocumentMeta));\n } else {\n navigate(getFullPageUrl(currentDocumentMeta));\n }\n }\n }}\n variant=\"tertiary\"\n label={formatMessage({\n id: 'content-manager.components.RelationInputModal.button-fullpage',\n defaultMessage: 'Go to entry',\n })}\n >\n <ArrowsOut />\n </IconButton>\n </Flex>\n </Modal.Header>\n <Modal.Body>\n <FormContext\n method={isCreating ? 'POST' : 'PUT'}\n initialValues={initialValues}\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const yupSchema = createYupSchema(\n currentDocument.schema?.attributes,\n currentDocument.components,\n {\n status: currentDocument.document?.status,\n ...options,\n }\n );\n\n return yupSchema.validate(values, { abortEarly: false });\n }}\n >\n <RelationModalBody />\n </FormContext>\n </Modal.Body>\n </StyledModalContent>\n </Modal.Root>\n </ComponentProvider>\n );\n};\n/**\n * All the main content (not header and footer) of the relation modal, plus the confirmation dialog.\n * Will be wrapped in a Modal.Body by the RelationModal component.\n * Cannot be moved directly inside RelationModal because it needs access to the context via hooks.\n */\nconst RelationModalBody = () => {\n const navigate = useNavigate();\n const { pathname, search } = useLocation();\n const { formatMessage } = useIntl();\n\n const [triggerRefetchDocument] = useLazyGetDocumentQuery();\n\n const state = useRelationModal('RelationModalForm', (state) => state.state);\n const dispatch = useRelationModal('RelationModalForm', (state) => state.dispatch);\n const rootDocumentMeta = useRelationModal('RelationModalForm', (state) => state.rootDocumentMeta);\n const currentDocumentMeta = useRelationModal(\n 'RelationModalForm',\n (state) => state.currentDocumentMeta\n );\n const isCreating = useRelationModal('RelationModalForm', (state) => state.isCreating);\n\n /**\n * One-way sync the modified state from the form to the modal state.\n * It is needed because we need to consume state from the form context in order to lift it up\n * into the modal context. It is not possible otherwise because the modal needs the form state,\n * but it must be a parent of the form.\n */\n const modified = useForm('FormWatcher', (state) => state.modified);\n const isSubmitting = useForm('FormWatcher', (state) => state.isSubmitting);\n const hasUnsavedChanges = modified && !isSubmitting;\n React.useEffect(() => {\n dispatch({ type: 'SET_HAS_UNSAVED_CHANGES', payload: { hasUnsavedChanges } });\n }, [hasUnsavedChanges, dispatch]);\n\n const handleCloseModal = (shouldBypassConfirmation: boolean) => {\n dispatch({ type: 'CLOSE_MODAL', payload: { shouldBypassConfirmation } });\n\n if (shouldBypassConfirmation || !state.hasUnsavedChanges) {\n // TODO: check if we can avoid this by relying on RTK invalidatesTags.\n // If so we can delete this function and dispatch the events directly\n triggerRefetchDocument(\n // TODO check if params should be removed (as they were before)\n rootDocumentMeta,\n // Favor the cache\n true\n );\n }\n };\n\n const handleRedirection = () => {\n const editViewUrl = `${pathname}${search}`;\n const fullPageUrl = getFullPageUrl(currentDocumentMeta);\n const isRootDocumentUrl = editViewUrl.includes(fullPageUrl);\n\n if (isRootDocumentUrl) {\n handleCloseModal(true);\n } else {\n if (isCreating) {\n navigate(generateCreateUrl(currentDocumentMeta));\n } else {\n navigate(fullPageUrl);\n }\n }\n };\n\n const handleConfirm = () => {\n if (state.confirmDialogIntent === null) {\n return;\n }\n if (state.confirmDialogIntent === 'navigate') {\n handleRedirection();\n } else if (state.confirmDialogIntent === 'back') {\n dispatch({ type: 'GO_BACK', payload: { shouldBypassConfirmation: true } });\n } else if (state.confirmDialogIntent === 'close') {\n handleCloseModal(true);\n } else if ('documentId' in state.confirmDialogIntent) {\n dispatch({\n type: 'GO_TO_RELATION',\n payload: {\n document: state.confirmDialogIntent,\n shouldBypassConfirmation: true,\n fieldToConnect: state.fieldToConnect,\n fieldToConnectUID: state.fieldToConnectUID,\n getParentFormValues: state.getParentFormValues,\n setParentFormValue: state.setParentFormValue,\n },\n });\n }\n };\n\n return (\n <>\n <RelationModalForm />\n <Dialog.Root open={state.confirmDialogIntent != null}>\n <ConfirmDialog\n onConfirm={() => handleConfirm()}\n onCancel={() => dispatch({ type: 'CANCEL_CONFIRM_DIALOG' })}\n variant=\"danger\"\n >\n {formatMessage({\n id: 'content-manager.components.RelationInputModal.confirmation-message',\n defaultMessage:\n 'Some changes were not saved. Are you sure you want to close this relation? All changes that were not saved will be lost.',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </>\n );\n};\n\nconst RelationModalTrigger = ({\n children,\n relation,\n}: {\n children: React.ReactNode;\n relation: DocumentMeta;\n}) => {\n const dispatch = useRelationModal('ModalTrigger', (state) => state.dispatch);\n const relationOpenMode = useRelationModal('ModalTrigger', (state) => state.relationOpenMode);\n\n const fullPageUrl = getFullPageUrl(relation);\n\n if (relationOpenMode === 'newTab') {\n return (\n <StyledRelationLink to={fullPageUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </StyledRelationLink>\n );\n }\n\n if (relationOpenMode === 'page') {\n return <StyledRelationLink to={fullPageUrl}>{children}</StyledRelationLink>;\n }\n\n return (\n <StyledTextButton\n onClick={() =>\n dispatch({\n type: 'GO_TO_RELATION',\n payload: { document: relation, shouldBypassConfirmation: false },\n })\n }\n >\n {children}\n </StyledTextButton>\n );\n};\n\nconst StyledTextButton = styled(TextButton)`\n max-width: 100%;\n & > span {\n font-size: ${({ theme }) => theme.fontSizes[2]};\n width: inherit;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n`;\n\nconst StyledRelationLink = styled(RouterLink)`\n max-width: 100%;\n font-size: ${({ theme }) => theme.fontSizes[2]};\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n display: block;\n color: ${({ theme }) => theme.colors.primary600};\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: ${({ theme }) => theme.colors.primary700};\n text-decoration: underline;\n }\n`;\n\n/**\n * The mini edit view for a relation that is displayed inside a modal.\n * It's complete with its header, document actions and form layout.\n */\nconst RelationModalForm = () => {\n const { formatMessage } = useIntl();\n\n const currentDocumentMeta = useRelationModal(\n 'RelationModalForm',\n (state) => state.currentDocumentMeta\n );\n const isCreating = useRelationModal('RelationModalForm', (state) => state.isCreating);\n const currentDocument = useRelationModal('RelationModalForm', (state) => state.currentDocument);\n const documentLayoutResponse = useDocumentLayout(currentDocumentMeta.model);\n const plugins = useStrapiApp('RelationModalForm', (state) => state.plugins);\n\n const initialValues = isCreating\n ? currentDocument.getInitialFormValues(isCreating)\n : currentDocument.getInitialFormValues();\n\n const {\n permissions = [],\n isLoading: isLoadingPermissions,\n error,\n } = useRBAC(\n PERMISSIONS.map((action) => ({\n action,\n subject: currentDocumentMeta.model,\n }))\n );\n\n const isLoading =\n isLoadingPermissions || documentLayoutResponse.isLoading || currentDocument.isLoading;\n\n if (isLoading && !currentDocument.document?.documentId) {\n return (\n <Loader small>\n {formatMessage({\n id: 'content-manager.ListViewTable.relation-loading',\n defaultMessage: 'Relations are loading',\n })}\n </Loader>\n );\n }\n\n if (\n error ||\n !currentDocumentMeta.model ||\n documentLayoutResponse.error ||\n (!isCreating && !currentDocument.document) ||\n (!isCreating && !currentDocument.meta) ||\n !currentDocument.schema ||\n !initialValues\n ) {\n return (\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<WarningCircle width=\"16rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Whoops! Something went wrong. Please, try again.',\n })}\n />\n </Flex>\n );\n }\n\n const documentTitle = currentDocument.getTitle(documentLayoutResponse.edit.settings.mainField);\n const hasDraftAndPublished = currentDocument.schema?.options?.draftAndPublish ?? false;\n\n const props = {\n activeTab: 'draft',\n collectionType: currentDocumentMeta.collectionType,\n model: currentDocumentMeta.model,\n documentId: currentDocumentMeta.documentId,\n document: currentDocument.document,\n meta: currentDocument.meta,\n } satisfies DocumentActionProps;\n\n return (\n <DocumentRBAC permissions={permissions} model={currentDocumentMeta.model}>\n <Flex alignItems=\"flex-start\" direction=\"column\" gap={2}>\n <Flex width=\"100%\" justifyContent=\"space-between\" gap={2}>\n <Typography tag=\"h2\" variant=\"alpha\">\n {documentTitle}\n </Typography>\n <Flex gap={2}>\n <DescriptionComponentRenderer\n props={props}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions('relation-modal')}\n >\n {(actions) => {\n const filteredActions = actions.filter((action) => {\n return [action.position].flat().includes('relation-modal');\n });\n const [primaryAction, secondaryAction] = filteredActions;\n\n if (!primaryAction && !secondaryAction) return null;\n\n // Both actions are available when draft and publish enabled\n if (primaryAction && secondaryAction) {\n return (\n <>\n {/* Save */}\n <DocumentActionButton\n {...secondaryAction}\n variant={secondaryAction.variant || 'secondary'}\n />\n {/* Publish */}\n <DocumentActionButton\n {...primaryAction}\n variant={primaryAction.variant || 'default'}\n />\n </>\n );\n }\n\n // Otherwise we just have the save action\n return (\n <DocumentActionButton\n {...primaryAction}\n variant={primaryAction.variant || 'secondary'}\n />\n );\n }}\n </DescriptionComponentRenderer>\n </Flex>\n </Flex>\n {hasDraftAndPublished ? (\n <Box>\n <DocumentStatus status={currentDocument.document?.status} />\n </Box>\n ) : null}\n </Flex>\n\n <Flex flex={1} overflow=\"auto\" alignItems=\"stretch\" paddingTop={7}>\n <Box overflow=\"auto\" flex={1}>\n <FormLayout\n layout={documentLayoutResponse.edit.layout}\n document={currentDocument}\n hasBackground={false}\n />\n </Box>\n </Flex>\n </DocumentRBAC>\n );\n};\n\nexport {\n reducer,\n RelationModalRenderer,\n useRelationModal,\n isAnyRelationModalOpen,\n getFullPageUrl,\n generateCreateUrl,\n prefillParentRelation,\n};\nexport type { State, Action, RelationOpenMode, PendingConnectPatch };\n"],"names":["getCollectionType","url","regex","RegExp","COLLECTION_TYPES","SINGLE_TYPES","match","undefined","StyledModalContent","styled","Modal","Content","getFullPageUrl","currentDocumentMeta","isSingleType","collectionType","queryParams","params","locale","model","documentId","getDocumentHistoryKey","meta","EMPTY_PENDING_CONNECTS","reducer","state","action","type","hasUnsavedChanges","payload","shouldBypassConfirmation","confirmDialogIntent","document","fieldToConnect","fieldToConnectUID","getParentFormValues","setParentFormValue","lastItemDocumentHistory","documentHistory","at","hasToResetDocumentHistory","isModalOpen","slice","pendingConnects","nestedParentMeta","length","connectPatch","key","documentMeta","openRelationModalCount","isAnyRelationModalOpen","RelationModalProvider","useRelationModal","createContext","isRenderProp","children","RootRelationRenderer","props","dispatch","React","useReducer","rootDocument","useDoc","query","useQueryParams","useMemo","buildValidParams","rootDocumentMeta","documentLayoutResponse","useDocumentLayout","relationOpenMode","edit","settings","currentDocument","useDocument","isCreating","useEffect","_jsx","RelationModal","relation","RelationModalTrigger","NestedRelationRenderer","RelationModalRenderer","isNested","generateCreateUrl","prefillParentRelation","initialValues","childSchema","parentDocument","parentModel","parentFieldName","inverseField","Object","entries","attributes","find","attribute","target","inversedBy","mappedBy","id","connect","fromEntries","filter","value","includes","apiData","isTemporary","__temp_key__","generateNKeysBetween","disconnect","formatMessage","useIntl","navigate","useNavigate","parentDocumentMeta","skip","pendingConnectsForCurrent","baseInitialValues","getInitialFormValues","schema","reduce","values","patch","withRelation","setIn","relationValue","componentUIDPath","componentUID","ComponentProvider","level","uid","_jsxs","Root","open","onOpenChange","Header","gap","Flex","justifyContent","alignItems","width","IconButton","withTooltip","label","defaultMessage","variant","disabled","onClick","marginRight","ArrowLeft","Typography","tag","fontWeight","ArrowsOut","Body","FormContext","method","validate","options","yupSchema","createYupSchema","components","status","abortEarly","RelationModalBody","pathname","search","useLocation","triggerRefetchDocument","useLazyGetDocumentQuery","modified","useForm","isSubmitting","handleCloseModal","handleRedirection","editViewUrl","fullPageUrl","isRootDocumentUrl","handleConfirm","_Fragment","RelationModalForm","Dialog","ConfirmDialog","onConfirm","onCancel","StyledRelationLink","to","rel","StyledTextButton","TextButton","theme","fontSizes","RouterLink","colors","primary600","primary700","plugins","useStrapiApp","permissions","isLoading","isLoadingPermissions","error","useRBAC","PERMISSIONS","map","subject","Loader","small","height","EmptyStateLayout","icon","WarningCircle","content","documentTitle","getTitle","mainField","hasDraftAndPublished","draftAndPublish","activeTab","DocumentRBAC","direction","DescriptionComponentRenderer","descriptions","apis","getDocumentActions","actions","filteredActions","position","flat","primaryAction","secondaryAction","DocumentActionButton","Box","DocumentStatus","flex","overflow","paddingTop","FormLayout","layout","hasBackground"],"mappings":"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"}
@@ -14,6 +14,7 @@ var collections = require('../../../../../constants/collections.js');
14
14
  var dragAndDrop = require('../../../../../constants/dragAndDrop.js');
15
15
  var plugin = require('../../../../../constants/plugin.js');
16
16
  var DocumentRBAC = require('../../../../../features/DocumentRBAC.js');
17
+ var useContentTypeSchema = require('../../../../../hooks/useContentTypeSchema.js');
17
18
  var useDebounce = require('../../../../../hooks/useDebounce.js');
18
19
  var useDocument = require('../../../../../hooks/useDocument.js');
19
20
  var useDocumentContext = require('../../../../../hooks/useDocumentContext.js');
@@ -511,12 +512,15 @@ const RelationModalWithContext = ({ relation, name, placeholder, hasNextPage, is
511
512
  defaultMessage: 'Untitled'
512
513
  });
513
514
  const canCreate = DocumentRBAC.useDocumentRBAC('RelationModalWrapper', (state)=>state.canCreate);
515
+ const { schema: targetSchema } = useContentTypeSchema.useContentTypeSchema(relation.model);
516
+ const isTargetSingleType = targetSchema?.kind === 'singleType';
514
517
  const fieldRef = strapiAdmin.useFocusInputField(name);
515
518
  const componentUID = ComponentContext.useComponent('RelationsField', (state)=>state.uid);
516
519
  const getParentFormValues = strapiAdmin.useForm('RelationModalWrapper', (state)=>state.getValues);
517
520
  const getParentFormValuesWithCurrentRelation = ()=>{
518
521
  return objects.setIn(getParentFormValues(), name, fieldValue);
519
522
  };
523
+ const setParentFormValue = strapiAdmin.useForm('RelationModalWrapper', (state)=>state.onChange);
520
524
  const handleLoadMore = ()=>{
521
525
  if (!data || !data.pagination) {
522
526
  return;
@@ -543,14 +547,14 @@ const RelationModalWithContext = ({ relation, name, placeholder, hasNextPage, is
543
547
  return /*#__PURE__*/ jsxRuntime.jsx(RelationModal.RelationModalRenderer, {
544
548
  children: ({ dispatch })=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Combobox, {
545
549
  ref: fieldRef,
546
- creatable: "visible",
550
+ creatable: isTargetSingleType ? false : 'visible',
547
551
  creatableDisabled: !canCreate,
548
552
  createMessage: ()=>formatMessage({
549
553
  id: translations.getTranslation('relation.create'),
550
554
  defaultMessage: 'Create a relation'
551
555
  }),
552
556
  onCreateOption: ()=>{
553
- if (canCreate) {
557
+ if (canCreate && !isTargetSingleType) {
554
558
  dispatch({
555
559
  type: 'GO_TO_RELATION',
556
560
  payload: {
@@ -558,7 +562,8 @@ const RelationModalWithContext = ({ relation, name, placeholder, hasNextPage, is
558
562
  shouldBypassConfirmation: false,
559
563
  fieldToConnect: name,
560
564
  fieldToConnectUID: componentUID,
561
- getParentFormValues: getParentFormValuesWithCurrentRelation
565
+ getParentFormValues: getParentFormValuesWithCurrentRelation,
566
+ setParentFormValue
562
567
  }
563
568
  });
564
569
  }