@strapi/content-manager 5.13.0-beta.1 → 5.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/LeftMenu.js +30 -34
- package/dist/admin/components/LeftMenu.js.map +1 -1
- package/dist/admin/components/LeftMenu.mjs +32 -36
- package/dist/admin/components/LeftMenu.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentActions.js +5 -1
- package/dist/admin/hooks/useDocumentActions.js.map +1 -1
- package/dist/admin/hooks/useDocumentActions.mjs +5 -1
- package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentContext.js.map +1 -1
- package/dist/admin/hooks/useDocumentContext.mjs.map +1 -1
- package/dist/admin/index.js +1 -3
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +206 -21
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +208 -23
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +128 -55
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +128 -55
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +89 -50
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +91 -52
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +3 -3
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +3 -3
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +0 -77
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +1 -78
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/src/hooks/useDocumentContext.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +26 -5
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +0 -1
- package/dist/admin/translations/en.json.js +2 -1
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +2 -1
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/ru.json.js +235 -226
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +230 -226
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/server/src/index.d.ts +0 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/data-mapper.d.ts +0 -1
- package/dist/server/src/services/data-mapper.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +0 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/package.json +5 -5
- package/dist/server/src/services/homepage.d.ts +0 -11
- package/dist/server/src/services/homepage.d.ts.map +0 -1
@@ -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
|
-
|
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
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
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
|
-
|
157
|
-
|
158
|
-
|
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
|
-
|
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
|
-
|
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:
|
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:
|
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
|
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
|
-
|
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(
|
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
|
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
|
486
|
+
*/ const RelationModalForm = ()=>{
|
415
487
|
const { formatMessage } = reactIntl.useIntl();
|
416
|
-
const currentDocumentMeta = useRelationModal('
|
417
|
-
const
|
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('
|
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.
|
617
|
+
exports.RelationModalRenderer = RelationModalRenderer;
|
545
618
|
exports.getCollectionType = getCollectionType;
|
546
619
|
exports.reducer = reducer;
|
547
620
|
exports.useRelationModal = useRelationModal;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"RelationModal.js","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 { useIntl } from 'react-intl';\nimport { 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';\n\nimport type { ContentManagerPlugin, DocumentActionProps } from '../../../../../content-manager';\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\n/* -------------------------------------------------------------------------------------------------\n * RelationContextWrapper\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}\n\ntype Action =\n | {\n type: 'GO_TO_RELATION';\n payload: {\n document: DocumentMeta;\n shouldBypassConfirmation: boolean;\n };\n }\n | {\n type: 'GO_BACK';\n payload: { shouldBypassConfirmation: boolean };\n }\n | {\n type: 'GO_FULL_PAGE';\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 { ...state, confirmDialogIntent: action.payload.document };\n }\n\n return {\n ...state,\n documentHistory: [...state.documentHistory, action.payload.document],\n confirmDialogIntent: null,\n isModalOpen: true,\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 '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 };\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}\n\nconst [RelationModalProvider, useRelationModal] =\n createContext<RelationModalContextValue>('RelationModal');\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 * Component responsible of rendering its children wrapped in a modal, form and context if needed\n */\nconst RelationModalRenderer = ({\n children,\n trigger,\n relation,\n}: {\n children: React.ReactNode;\n trigger: React.ReactNode;\n relation: DocumentMeta;\n}) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n\n const [state, dispatch] = React.useReducer(reducer, {\n documentHistory: [],\n confirmDialogIntent: null,\n isModalOpen: false,\n hasUnsavedChanges: false,\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 const currentDocumentMeta = state.documentHistory.at(-1) ?? rootDocumentMeta;\n const currentDocument = useDocument(currentDocumentMeta);\n\n const parentContextValue = useRelationModal('RelationContextWrapper', (state) => state, false);\n\n // A parent relation is already rendering a modal. In this case simply render the trigger\n if (parentContextValue) {\n return trigger;\n }\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 >\n <Modal.Root\n open={state.isModalOpen}\n onOpenChange={(open) => {\n if (open) {\n dispatch({\n type: 'GO_TO_RELATION',\n payload: { document: relation, shouldBypassConfirmation: false },\n });\n } else {\n dispatch({\n type: 'CLOSE_MODAL',\n payload: { shouldBypassConfirmation: false },\n });\n }\n }}\n >\n {trigger}\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 {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 navigate(getFullPageUrl(currentDocumentMeta));\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=\"PUT\"\n initialValues={currentDocument.getInitialFormValues()}\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 {children}\n </FormContext>\n </Modal.Body>\n </StyledModalContent>\n </Modal.Root>\n </RelationModalProvider>\n );\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 RelationModalRenderer.\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\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 navigate(fullPageUrl);\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: { document: state.confirmDialogIntent, shouldBypassConfirmation: true },\n });\n }\n };\n\n return (\n <>\n <RelationEditView />\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 ModalTrigger = ({\n children,\n relation,\n}: {\n children: React.ReactNode;\n relation: DocumentMeta;\n}) => {\n const dispatch = useRelationModal('ModalTrigger', (state) => state.dispatch);\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\ninterface RelationModalProps {\n children: React.ReactNode;\n relation: DocumentMeta;\n}\n\nconst RelationModal = React.memo(({ relation, children }: RelationModalProps) => {\n return (\n <RelationModalRenderer\n relation={relation}\n trigger={<ModalTrigger relation={relation}>{children}</ModalTrigger>}\n >\n <RelationModalBody />\n </RelationModalRenderer>\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\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 RelationEditView = () => {\n const { formatMessage } = useIntl();\n\n const currentDocumentMeta = useRelationModal(\n 'RelationModalBody',\n (state) => state.currentDocumentMeta\n );\n const currentDocument = useRelationModal('RelationModalBody', (state) => state.currentDocument);\n const documentLayoutResponse = useDocumentLayout(currentDocumentMeta.model);\n const plugins = useStrapiApp('RelationModalBody', (state) => state.plugins);\n\n const initialValues = 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 !currentDocument.document ||\n !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 { RelationModal, reducer, useRelationModal };\nexport type { State, Action };\n"],"names":["getCollectionType","url","regex","RegExp","COLLECTION_TYPES","SINGLE_TYPES","match","undefined","StyledModalContent","styled","Modal","Content","reducer","state","action","type","hasUnsavedChanges","payload","shouldBypassConfirmation","confirmDialogIntent","document","documentHistory","isModalOpen","slice","RelationModalProvider","useRelationModal","createContext","getFullPageUrl","currentDocumentMeta","isSingleType","collectionType","queryParams","params","locale","model","documentId","RelationModalRenderer","children","trigger","relation","formatMessage","useIntl","navigate","useNavigate","dispatch","React","useReducer","rootDocument","useDoc","query","useQueryParams","useMemo","buildValidParams","rootDocumentMeta","at","currentDocument","useDocument","parentContextValue","_jsx","_jsxs","Root","open","onOpenChange","Header","gap","Flex","justifyContent","alignItems","width","IconButton","withTooltip","label","id","defaultMessage","variant","disabled","length","onClick","marginRight","ArrowLeft","Typography","tag","fontWeight","ArrowsOut","Body","FormContext","method","initialValues","getInitialFormValues","validate","values","options","yupSchema","createYupSchema","schema","attributes","components","status","abortEarly","RelationModalBody","pathname","search","useLocation","triggerRefetchDocument","useLazyGetDocumentQuery","modified","useForm","isSubmitting","useEffect","handleCloseModal","handleRedirection","editViewUrl","fullPageUrl","isRootDocumentUrl","includes","handleConfirm","_Fragment","RelationEditView","Dialog","ConfirmDialog","onConfirm","onCancel","ModalTrigger","StyledTextButton","RelationModal","memo","TextButton","theme","fontSizes","documentLayoutResponse","useDocumentLayout","plugins","useStrapiApp","permissions","isLoading","isLoadingPermissions","error","useRBAC","PERMISSIONS","map","subject","Loader","small","meta","height","EmptyStateLayout","icon","WarningCircle","content","documentTitle","getTitle","edit","settings","mainField","hasDraftAndPublished","draftAndPublish","props","activeTab","DocumentRBAC","direction","DescriptionComponentRenderer","descriptions","apis","getDocumentActions","actions","filteredActions","filter","position","flat","primaryAction","secondaryAction","DocumentActionButton","Box","DocumentStatus","flex","overflow","paddingTop","FormLayout","layout","hasBackground"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"RelationModal.js","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 { useIntl } from 'react-intl';\nimport { 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 { ContentManagerPlugin, DocumentActionProps } from '../../../../../content-manager';\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}\n\ntype Action =\n | {\n type: 'GO_TO_RELATION';\n payload: {\n document: DocumentMeta;\n shouldBypassConfirmation: boolean;\n fieldToConnect?: string;\n fieldToConnectUID?: string;\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 };\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 };\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 };\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 };\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 };\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}\n\nconst [RelationModalProvider, useRelationModal] =\n createContext<RelationModalContextValue>('RelationModal');\n\nfunction isRenderProp(\n children: RelationModalRendererProps['children']\n): children is (props: { dispatch: (action: Action) => void }) => 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: { dispatch: (action: Action) => void }) => 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 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 >\n <RelationModal>\n {isRenderProp(children)\n ? children({ dispatch })\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\n return isRenderProp(children)\n ? children({ dispatch })\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\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\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={currentDocument.getInitialFormValues(isCreating)}\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: { document: state.confirmDialogIntent, shouldBypassConfirmation: true },\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\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\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 { reducer, RelationModalRenderer, useRelationModal };\nexport type { State, Action };\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","lastItemDocumentHistory","documentHistory","at","hasToResetDocumentHistory","isModalOpen","slice","RelationModalProvider","useRelationModal","createContext","isRenderProp","children","RootRelationRenderer","props","dispatch","React","useReducer","rootDocument","useDoc","query","useQueryParams","useMemo","buildValidParams","rootDocumentMeta","currentDocument","useDocument","isCreating","_jsx","RelationModal","relation","RelationModalTrigger","NestedRelationRenderer","RelationModalRenderer","isNested","generateCreateUrl","formatMessage","useIntl","navigate","useNavigate","ComponentProvider","id","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","initialValues","getInitialFormValues","validate","values","options","yupSchema","createYupSchema","schema","attributes","components","status","abortEarly","RelationModalBody","pathname","search","useLocation","triggerRefetchDocument","useLazyGetDocumentQuery","modified","useForm","isSubmitting","useEffect","handleCloseModal","handleRedirection","editViewUrl","fullPageUrl","isRootDocumentUrl","includes","handleConfirm","_Fragment","RelationModalForm","Dialog","ConfirmDialog","onConfirm","onCancel","StyledTextButton","TextButton","theme","fontSizes","documentLayoutResponse","useDocumentLayout","plugins","useStrapiApp","permissions","isLoading","isLoadingPermissions","error","useRBAC","PERMISSIONS","map","subject","Loader","small","meta","height","EmptyStateLayout","icon","WarningCircle","content","documentTitle","getTitle","edit","settings","mainField","hasDraftAndPublished","draftAndPublish","activeTab","DocumentRBAC","direction","DescriptionComponentRenderer","descriptions","apis","getDocumentActions","actions","filteredActions","filter","position","flat","primaryAction","secondaryAction","DocumentActionButton","Box","DocumentStatus","flex","overflow","paddingTop","FormLayout","layout","hasBackground"],"mappings":"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"}
|