@strapi/content-manager 0.0.0-experimental.8bf99b7c43ed372264c198d347a2ada9dfed174d → 0.0.0-experimental.8c28a74d1219c09f4ee67402fd3a26f182c4990a
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/components/Widgets.js +161 -0
- package/dist/admin/components/Widgets.js.map +1 -0
- package/dist/admin/components/Widgets.mjs +158 -0
- package/dist/admin/components/Widgets.mjs.map +1 -0
- package/dist/admin/content-manager.js.map +1 -1
- package/dist/admin/content-manager.mjs.map +1 -1
- package/dist/admin/history/pages/History.js +1 -9
- package/dist/admin/history/pages/History.js.map +1 -1
- package/dist/admin/history/pages/History.mjs +1 -9
- package/dist/admin/history/pages/History.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentActions.js +13 -2
- package/dist/admin/hooks/useDocumentActions.js.map +1 -1
- package/dist/admin/hooks/useDocumentActions.mjs +13 -2
- package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentContext.js +57 -0
- package/dist/admin/hooks/useDocumentContext.js.map +1 -0
- package/dist/admin/hooks/useDocumentContext.mjs +36 -0
- package/dist/admin/hooks/useDocumentContext.mjs.map +1 -0
- package/dist/admin/index.js +42 -5
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +42 -3
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +85 -93
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +86 -94
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +232 -51
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +238 -57
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +7 -12
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +8 -13
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +46 -95
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +48 -78
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +4 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +4 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +5 -16
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +5 -16
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +2 -3
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +2 -3
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +495 -345
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +495 -347
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +143 -86
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +146 -89
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.js +7 -7
- package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +7 -7
- package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +50 -97
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +51 -79
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +3 -10
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +3 -10
- package/dist/admin/pages/EditView/components/InputRenderer.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/preview/components/PreviewHeader.js +3 -6
- package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.mjs +3 -6
- package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
- package/dist/admin/preview/pages/Preview.js +94 -102
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +94 -102
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/services/homepage.js +30 -0
- package/dist/admin/services/homepage.js.map +1 -0
- package/dist/admin/services/homepage.mjs +28 -0
- package/dist/admin/services/homepage.mjs.map +1 -0
- package/dist/admin/src/components/Widgets.d.ts +3 -0
- package/dist/admin/src/content-manager.d.ts +0 -3
- package/dist/admin/src/features/DocumentRBAC.d.ts +1 -1
- package/dist/admin/src/history/pages/History.d.ts +1 -1
- package/dist/admin/src/hooks/useDocumentContext.d.ts +30 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/ComponentContext.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +73 -7
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +1 -1
- package/dist/admin/src/preview/pages/Preview.d.ts +2 -1
- package/dist/admin/src/services/homepage.d.ts +5 -0
- 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/controllers/index.js +3 -1
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/index.mjs +3 -1
- package/dist/server/controllers/index.mjs.map +1 -1
- package/dist/server/homepage/controllers/homepage.js +57 -0
- package/dist/server/homepage/controllers/homepage.js.map +1 -0
- package/dist/server/homepage/controllers/homepage.mjs +36 -0
- package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
- package/dist/server/homepage/controllers/index.js +10 -0
- package/dist/server/homepage/controllers/index.js.map +1 -0
- package/dist/server/homepage/controllers/index.mjs +8 -0
- package/dist/server/homepage/controllers/index.mjs.map +1 -0
- package/dist/server/homepage/index.js +14 -0
- package/dist/server/homepage/index.js.map +1 -0
- package/dist/server/homepage/index.mjs +12 -0
- package/dist/server/homepage/index.mjs.map +1 -0
- package/dist/server/homepage/routes/homepage.js +25 -0
- package/dist/server/homepage/routes/homepage.js.map +1 -0
- package/dist/server/homepage/routes/homepage.mjs +23 -0
- package/dist/server/homepage/routes/homepage.mjs.map +1 -0
- package/dist/server/homepage/routes/index.js +13 -0
- package/dist/server/homepage/routes/index.js.map +1 -0
- package/dist/server/homepage/routes/index.mjs +11 -0
- package/dist/server/homepage/routes/index.mjs.map +1 -0
- package/dist/server/homepage/services/homepage.js +157 -0
- package/dist/server/homepage/services/homepage.js.map +1 -0
- package/dist/server/homepage/services/homepage.mjs +155 -0
- package/dist/server/homepage/services/homepage.mjs.map +1 -0
- package/dist/server/homepage/services/index.js +10 -0
- package/dist/server/homepage/services/index.js.map +1 -0
- package/dist/server/homepage/services/index.mjs +8 -0
- package/dist/server/homepage/services/index.mjs.map +1 -0
- package/dist/server/preview/services/preview.js +0 -1
- package/dist/server/preview/services/preview.js.map +1 -1
- package/dist/server/preview/services/preview.mjs +0 -1
- package/dist/server/preview/services/preview.mjs.map +1 -1
- package/dist/server/routes/index.js +3 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/index.mjs +3 -1
- package/dist/server/routes/index.mjs.map +1 -1
- package/dist/server/services/index.js +3 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +3 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/homepage/controllers/homepage.d.ts +7 -0
- package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
- package/dist/server/src/homepage/controllers/index.d.ts +2 -0
- package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
- package/dist/server/src/homepage/index.d.ts +16 -0
- package/dist/server/src/homepage/index.d.ts.map +1 -0
- package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
- package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
- package/dist/server/src/homepage/routes/index.d.ts +8 -0
- package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
- package/dist/server/src/homepage/services/homepage.d.ts +11 -0
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
- package/dist/server/src/homepage/services/index.d.ts +9 -0
- package/dist/server/src/homepage/services/index.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +7 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts +1 -0
- package/dist/server/src/routes/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 +6 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/shared/contracts/homepage.d.ts +25 -0
- package/dist/shared/contracts/homepage.d.ts.map +1 -0
- package/package.json +8 -8
- package/dist/admin/features/DocumentContext.js +0 -71
- package/dist/admin/features/DocumentContext.js.map +0 -1
- package/dist/admin/features/DocumentContext.mjs +0 -49
- package/dist/admin/features/DocumentContext.mjs.map +0 -1
- package/dist/admin/src/features/DocumentContext.d.ts +0 -53
@@ -1,20 +1,22 @@
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
2
2
|
import * as React from 'react';
|
3
|
-
import { createContext, Form, ConfirmDialog, useStrapiApp, useRBAC, DescriptionComponentRenderer } from '@strapi/admin/strapi-admin';
|
4
|
-
import { Modal, TextButton,
|
3
|
+
import { createContext, useQueryParams, Form, useForm, ConfirmDialog, useStrapiApp, useRBAC, DescriptionComponentRenderer } from '@strapi/admin/strapi-admin';
|
4
|
+
import { Modal, TextButton, Flex, IconButton, Typography, Dialog, Loader, EmptyStateLayout, Box } from '@strapi/design-system';
|
5
5
|
import { ArrowLeft, ArrowsOut, WarningCircle } from '@strapi/icons';
|
6
6
|
import { useIntl } from 'react-intl';
|
7
7
|
import { useNavigate, useLocation } from 'react-router-dom';
|
8
8
|
import { styled } from 'styled-components';
|
9
9
|
import { COLLECTION_TYPES, SINGLE_TYPES } from '../../../../../constants/collections.mjs';
|
10
10
|
import { PERMISSIONS } from '../../../../../constants/plugin.mjs';
|
11
|
-
import {
|
12
|
-
import {
|
13
|
-
import {
|
11
|
+
import { buildValidParams } from '../../../../../utils/api.mjs';
|
12
|
+
import { DocumentStatus } from '../../DocumentStatus.mjs';
|
13
|
+
import { useDoc, useDocument } from '../../../../../hooks/useDocument.mjs';
|
14
|
+
import '../../../../../preview/pages/Preview.mjs';
|
14
15
|
import { useLazyGetDocumentQuery } from '../../../../../services/documents.mjs';
|
16
|
+
import { useDocumentLayout } from '../../../../../hooks/useDocumentLayout.mjs';
|
17
|
+
import { DocumentRBAC } from '../../../../../features/DocumentRBAC.mjs';
|
15
18
|
import { createYupSchema } from '../../../../../utils/validation.mjs';
|
16
19
|
import { DocumentActionButton } from '../../DocumentActions.mjs';
|
17
|
-
import { DocumentStatus } from '../../DocumentStatus.mjs';
|
18
20
|
import { FormLayout } from '../../FormLayout.mjs';
|
19
21
|
|
20
22
|
function getCollectionType(url) {
|
@@ -22,271 +24,422 @@ function getCollectionType(url) {
|
|
22
24
|
const match = url.match(regex);
|
23
25
|
return match ? match[1] : undefined;
|
24
26
|
}
|
25
|
-
const
|
27
|
+
const StyledModalContent = styled(Modal.Content)`
|
26
28
|
width: 90%;
|
27
29
|
max-width: 100%;
|
28
30
|
height: 90%;
|
29
31
|
max-height: 100%;
|
30
32
|
`;
|
31
|
-
const
|
32
|
-
|
33
|
-
|
34
|
-
}
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
const lastDocument = documentHistory[documentHistory.length - 1];
|
63
|
-
return lastDocument;
|
64
|
-
};
|
65
|
-
const removeLastDocumentFromHistory = ()=>{
|
66
|
-
setDocumentHistory((prev)=>[
|
67
|
-
...prev
|
68
|
-
].slice(0, prev.length - 1));
|
69
|
-
};
|
70
|
-
const handleToggleModal = ()=>{
|
71
|
-
if (isModalOpen) {
|
72
|
-
setIsModalOpen(false);
|
73
|
-
const document = {
|
74
|
-
collectionType: rootDocumentMeta.collectionType,
|
75
|
-
model: rootDocumentMeta.model,
|
76
|
-
documentId: rootDocumentMeta.documentId
|
33
|
+
const getFullPageUrl = (currentDocumentMeta)=>{
|
34
|
+
const isSingleType = currentDocumentMeta.collectionType === SINGLE_TYPES;
|
35
|
+
const queryParams = currentDocumentMeta.params?.locale ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}` : '';
|
36
|
+
return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}${isSingleType ? '' : '/' + currentDocumentMeta.documentId}${queryParams}`;
|
37
|
+
};
|
38
|
+
function reducer(state, action) {
|
39
|
+
switch(action.type){
|
40
|
+
case 'GO_TO_RELATION':
|
41
|
+
if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {
|
42
|
+
return {
|
43
|
+
...state,
|
44
|
+
confirmDialogIntent: action.payload.document,
|
45
|
+
fieldToConnect: action.payload.fieldToConnect,
|
46
|
+
fieldToConnectUID: action.payload.fieldToConnectUID
|
47
|
+
};
|
48
|
+
}
|
49
|
+
const lastItemDocumentHistory = state.documentHistory.at(-1);
|
50
|
+
const hasToResetDocumentHistory = lastItemDocumentHistory && !lastItemDocumentHistory.documentId;
|
51
|
+
return {
|
52
|
+
...state,
|
53
|
+
// Reset document history if the last item has documentId undefined
|
54
|
+
documentHistory: hasToResetDocumentHistory ? [
|
55
|
+
action.payload.document
|
56
|
+
] : [
|
57
|
+
...state.documentHistory,
|
58
|
+
action.payload.document
|
59
|
+
],
|
60
|
+
confirmDialogIntent: null,
|
61
|
+
isModalOpen: true,
|
62
|
+
fieldToConnect: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnect,
|
63
|
+
fieldToConnectUID: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnectUID
|
77
64
|
};
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
// Read from cache or refetch root document
|
85
|
-
triggerRefetchDocument(document, // Favor the cache
|
86
|
-
true);
|
87
|
-
} else {
|
88
|
-
changeDocument(relation);
|
89
|
-
setIsModalOpen(true);
|
90
|
-
}
|
91
|
-
};
|
92
|
-
const getFullPageLink = ()=>{
|
93
|
-
const isSingleType = currentDocumentMeta.collectionType === SINGLE_TYPES;
|
94
|
-
const queryParams = currentDocumentMeta.params?.locale ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}` : '';
|
95
|
-
return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}${isSingleType ? '' : '/' + currentDocumentMeta.documentId}${queryParams}`;
|
96
|
-
};
|
97
|
-
const handleRedirection = ()=>{
|
98
|
-
const editViewUrl = `${pathname}${search}`;
|
99
|
-
const isRootDocumentUrl = editViewUrl.includes(getFullPageLink());
|
100
|
-
if (isRootDocumentUrl) {
|
101
|
-
handleToggleModal();
|
102
|
-
} else {
|
103
|
-
navigate(getFullPageLink());
|
104
|
-
}
|
105
|
-
};
|
106
|
-
const handleConfirm = ()=>{
|
107
|
-
if (actionPosition === 'navigate') {
|
108
|
-
handleRedirection();
|
109
|
-
} else if (actionPosition === 'back') {
|
110
|
-
const previousRelation = getPreviousDocument();
|
111
|
-
if (previousRelation) {
|
112
|
-
removeLastDocumentFromHistory();
|
113
|
-
changeDocument(previousRelation);
|
65
|
+
case 'GO_BACK':
|
66
|
+
if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {
|
67
|
+
return {
|
68
|
+
...state,
|
69
|
+
confirmDialogIntent: 'back'
|
70
|
+
};
|
114
71
|
}
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
72
|
+
return {
|
73
|
+
...state,
|
74
|
+
documentHistory: state.documentHistory.slice(0, -1),
|
75
|
+
confirmDialogIntent: null
|
76
|
+
};
|
77
|
+
case 'GO_FULL_PAGE':
|
78
|
+
if (state.hasUnsavedChanges) {
|
79
|
+
return {
|
80
|
+
...state,
|
81
|
+
confirmDialogIntent: 'navigate'
|
82
|
+
};
|
119
83
|
}
|
120
|
-
|
121
|
-
|
84
|
+
return {
|
85
|
+
...state,
|
86
|
+
documentHistory: [],
|
87
|
+
hasUnsavedChanges: false,
|
88
|
+
isModalOpen: false,
|
89
|
+
confirmDialogIntent: null
|
90
|
+
};
|
91
|
+
case 'GO_TO_CREATED_RELATION':
|
92
|
+
return {
|
93
|
+
...state,
|
94
|
+
// Reset document history if the last item has documentId undefined
|
95
|
+
documentHistory: state.documentHistory ? [
|
96
|
+
...state.documentHistory.slice(0, -1),
|
97
|
+
action.payload.document
|
98
|
+
] : [
|
99
|
+
action.payload.document
|
100
|
+
],
|
101
|
+
confirmDialogIntent: null,
|
102
|
+
isModalOpen: true,
|
103
|
+
fieldToConnect: undefined,
|
104
|
+
fieldToConnectUID: undefined
|
105
|
+
};
|
106
|
+
case 'CANCEL_CONFIRM_DIALOG':
|
107
|
+
return {
|
108
|
+
...state,
|
109
|
+
confirmDialogIntent: null
|
110
|
+
};
|
111
|
+
case 'CLOSE_MODAL':
|
112
|
+
if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {
|
113
|
+
return {
|
114
|
+
...state,
|
115
|
+
confirmDialogIntent: 'close'
|
116
|
+
};
|
117
|
+
}
|
118
|
+
return {
|
119
|
+
...state,
|
120
|
+
documentHistory: [],
|
121
|
+
confirmDialogIntent: null,
|
122
|
+
hasUnsavedChanges: false,
|
123
|
+
isModalOpen: false
|
124
|
+
};
|
125
|
+
case 'SET_HAS_UNSAVED_CHANGES':
|
126
|
+
return {
|
127
|
+
...state,
|
128
|
+
hasUnsavedChanges: action.payload.hasUnsavedChanges
|
129
|
+
};
|
130
|
+
default:
|
131
|
+
return state;
|
132
|
+
}
|
133
|
+
}
|
134
|
+
const [RelationModalProvider, useRelationModal] = createContext('RelationModal');
|
135
|
+
function isRenderProp(children) {
|
136
|
+
return typeof children === 'function';
|
137
|
+
}
|
138
|
+
const RootRelationRenderer = (props)=>{
|
139
|
+
const { children } = props;
|
140
|
+
const [state, dispatch] = React.useReducer(reducer, {
|
141
|
+
documentHistory: [],
|
142
|
+
confirmDialogIntent: null,
|
143
|
+
isModalOpen: false,
|
144
|
+
hasUnsavedChanges: false,
|
145
|
+
fieldToConnect: undefined
|
146
|
+
});
|
147
|
+
const rootDocument = useDoc();
|
148
|
+
const [{ query }] = useQueryParams();
|
149
|
+
const params = React.useMemo(()=>buildValidParams(query ?? {}), [
|
150
|
+
query
|
151
|
+
]);
|
152
|
+
const rootDocumentMeta = {
|
153
|
+
documentId: rootDocument.document?.documentId || '',
|
154
|
+
model: rootDocument.model,
|
155
|
+
collectionType: rootDocument.collectionType,
|
156
|
+
params
|
122
157
|
};
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
158
|
+
const currentDocumentMeta = state.documentHistory.at(-1) ?? rootDocumentMeta;
|
159
|
+
const currentDocument = useDocument(currentDocumentMeta);
|
160
|
+
// TODO: check if we can remove the single type check
|
161
|
+
const isSingleType = currentDocumentMeta.collectionType === SINGLE_TYPES;
|
162
|
+
const isCreating = !currentDocumentMeta.documentId && !isSingleType;
|
163
|
+
/**
|
164
|
+
* There is no parent relation, so the relation modal doesn't exist. Create it and set up all the
|
165
|
+
* pieces that will be used by potential child relations: the context, header, form, and footer.
|
166
|
+
*/ return /*#__PURE__*/ jsx(RelationModalProvider, {
|
167
|
+
state: state,
|
168
|
+
dispatch: dispatch,
|
169
|
+
rootDocumentMeta: rootDocumentMeta,
|
170
|
+
currentDocumentMeta: currentDocumentMeta,
|
171
|
+
currentDocument: currentDocument,
|
172
|
+
isCreating: isCreating,
|
173
|
+
children: /*#__PURE__*/ jsx(RelationModal, {
|
174
|
+
children: isRenderProp(children) ? children({
|
175
|
+
dispatch
|
176
|
+
}) : props.relation && /*#__PURE__*/ jsx(RelationModalTrigger, {
|
177
|
+
relation: props.relation,
|
178
|
+
children: children
|
179
|
+
})
|
180
|
+
})
|
181
|
+
});
|
182
|
+
};
|
183
|
+
const NestedRelationRenderer = (props)=>{
|
184
|
+
const { children } = props;
|
185
|
+
const dispatch = useRelationModal('NestedRelation', (state)=>state.dispatch);
|
186
|
+
return isRenderProp(children) ? children({
|
187
|
+
dispatch
|
188
|
+
}) : props.relation && /*#__PURE__*/ jsx(RelationModalTrigger, {
|
189
|
+
relation: props.relation,
|
190
|
+
children: children
|
191
|
+
}); /* This is the trigger that will be rendered in the parent relation */
|
192
|
+
};
|
193
|
+
/**
|
194
|
+
* Component responsible for rendering its children wrapped in a modal, form and context if needed
|
195
|
+
*/ const RelationModalRenderer = (props)=>{
|
196
|
+
// We're in a nested relation if the relation modal context is not undefined
|
197
|
+
const isNested = useRelationModal('RelationContextWrapper', (state)=>state != undefined, false);
|
198
|
+
return isNested ? /*#__PURE__*/ jsx(NestedRelationRenderer, {
|
199
|
+
...props
|
200
|
+
}) : /*#__PURE__*/ jsx(RootRelationRenderer, {
|
201
|
+
...props
|
202
|
+
});
|
203
|
+
};
|
204
|
+
/* -------------------------------------------------------------------------------------------------
|
205
|
+
* RelationModal
|
206
|
+
* -----------------------------------------------------------------------------------------------*/ const generateCreateUrl = (currentDocumentMeta)=>{
|
207
|
+
return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}/create${currentDocumentMeta.params?.locale ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}` : ''}`;
|
208
|
+
};
|
209
|
+
const RelationModal = ({ children })=>{
|
210
|
+
const { formatMessage } = useIntl();
|
211
|
+
const navigate = useNavigate();
|
212
|
+
const state = useRelationModal('RelationModalForm', (state)=>state.state);
|
213
|
+
const dispatch = useRelationModal('RelationModalForm', (state)=>state.dispatch);
|
214
|
+
const currentDocumentMeta = useRelationModal('RelationModalForm', (state)=>state.currentDocumentMeta);
|
215
|
+
const currentDocument = useRelationModal('RelationModalForm', (state)=>state.currentDocument);
|
216
|
+
const isCreating = useRelationModal('RelationModalForm', (state)=>state.isCreating);
|
217
|
+
return /*#__PURE__*/ jsxs(Modal.Root, {
|
218
|
+
open: state.isModalOpen,
|
219
|
+
onOpenChange: (open)=>{
|
220
|
+
if (!open) {
|
221
|
+
dispatch({
|
222
|
+
type: 'CLOSE_MODAL',
|
223
|
+
payload: {
|
224
|
+
shouldBypassConfirmation: false
|
225
|
+
}
|
226
|
+
});
|
227
|
+
}
|
134
228
|
},
|
135
|
-
children:
|
136
|
-
|
137
|
-
|
138
|
-
return /*#__PURE__*/ jsxs(RelationModalProvider, {
|
139
|
-
parentModified: modified,
|
140
|
-
depth: depth,
|
229
|
+
children: [
|
230
|
+
children,
|
231
|
+
/*#__PURE__*/ jsxs(StyledModalContent, {
|
141
232
|
children: [
|
142
|
-
/*#__PURE__*/
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
/*#__PURE__*/ jsx(Modal.Trigger, {
|
155
|
-
children: /*#__PURE__*/ jsx(Tooltip, {
|
156
|
-
description: triggerButtonLabel,
|
157
|
-
children: /*#__PURE__*/ jsx(CustomTextButton, {
|
158
|
-
onClick: ()=>{
|
159
|
-
// Check if parent modal has unsaved changes
|
160
|
-
if (isNested && parentContext.parentModified) {
|
161
|
-
setIsConfirmationOpen(true);
|
162
|
-
// Return early to avoid opening the modal
|
163
|
-
return;
|
164
|
-
} else {
|
165
|
-
if (modified && !isSubmitting) {
|
166
|
-
setIsConfirmationOpen(true);
|
167
|
-
} else {
|
168
|
-
// Add current relation to history before opening a new one
|
169
|
-
if (currentDocumentMeta && Object.keys(currentDocumentMeta).length > 0) {
|
170
|
-
addDocumentToHistory(currentDocumentMeta);
|
171
|
-
}
|
172
|
-
handleToggleModal();
|
173
|
-
}
|
174
|
-
if (!isModalOpen) {
|
175
|
-
setIsModalOpen(true);
|
176
|
-
}
|
177
|
-
}
|
178
|
-
},
|
179
|
-
width: "100%",
|
180
|
-
children: triggerButtonLabel
|
181
|
-
})
|
182
|
-
})
|
183
|
-
}),
|
184
|
-
/*#__PURE__*/ jsxs(CustomModalContent, {
|
185
|
-
children: [
|
186
|
-
/*#__PURE__*/ jsx(Modal.Header, {
|
187
|
-
gap: 2,
|
188
|
-
children: /*#__PURE__*/ jsx(Flex, {
|
189
|
-
justifyContent: "space-between",
|
190
|
-
alignItems: "center",
|
191
|
-
width: "100%",
|
192
|
-
children: /*#__PURE__*/ jsxs(Flex, {
|
193
|
-
gap: 2,
|
194
|
-
children: [
|
195
|
-
/*#__PURE__*/ jsx(IconButton, {
|
196
|
-
withTooltip: false,
|
197
|
-
label: "Back",
|
198
|
-
variant: "ghost",
|
199
|
-
disabled: !hasHistory,
|
200
|
-
onClick: ()=>{
|
201
|
-
setActionPosition('back');
|
202
|
-
if (modified && !isSubmitting) {
|
203
|
-
setIsConfirmationOpen(true);
|
204
|
-
} else {
|
205
|
-
const previousRelation = getPreviousDocument();
|
206
|
-
if (previousRelation) {
|
207
|
-
removeLastDocumentFromHistory();
|
208
|
-
changeDocument(previousRelation);
|
209
|
-
}
|
210
|
-
}
|
211
|
-
},
|
212
|
-
marginRight: 1,
|
213
|
-
children: /*#__PURE__*/ jsx(ArrowLeft, {})
|
214
|
-
}),
|
215
|
-
/*#__PURE__*/ jsx(Typography, {
|
216
|
-
tag: "span",
|
217
|
-
fontWeight: 600,
|
218
|
-
children: formatMessage({
|
219
|
-
id: 'content-manager.components.RelationInputModal.modal-title',
|
220
|
-
defaultMessage: 'Edit a relation'
|
221
|
-
})
|
222
|
-
})
|
223
|
-
]
|
224
|
-
})
|
225
|
-
})
|
226
|
-
}),
|
227
|
-
/*#__PURE__*/ jsx(RelationModalBody, {
|
228
|
-
children: /*#__PURE__*/ jsx(IconButton, {
|
229
|
-
onClick: ()=>{
|
230
|
-
setActionPosition('navigate');
|
231
|
-
if (modified && !isSubmitting) {
|
232
|
-
setIsConfirmationOpen(true);
|
233
|
-
} else {
|
234
|
-
navigate(getFullPageLink());
|
235
|
-
}
|
236
|
-
},
|
237
|
-
variant: "tertiary",
|
233
|
+
/*#__PURE__*/ jsx(Modal.Header, {
|
234
|
+
gap: 2,
|
235
|
+
children: /*#__PURE__*/ jsxs(Flex, {
|
236
|
+
justifyContent: "space-between",
|
237
|
+
alignItems: "center",
|
238
|
+
width: "100%",
|
239
|
+
children: [
|
240
|
+
/*#__PURE__*/ jsxs(Flex, {
|
241
|
+
gap: 2,
|
242
|
+
children: [
|
243
|
+
/*#__PURE__*/ jsx(IconButton, {
|
244
|
+
withTooltip: false,
|
238
245
|
label: formatMessage({
|
239
|
-
id: '
|
240
|
-
defaultMessage: '
|
246
|
+
id: 'global.back',
|
247
|
+
defaultMessage: 'Back'
|
241
248
|
}),
|
242
|
-
|
243
|
-
|
244
|
-
}),
|
245
|
-
/*#__PURE__*/ jsx(Modal.Footer, {
|
246
|
-
children: /*#__PURE__*/ jsx(Button, {
|
249
|
+
variant: "ghost",
|
250
|
+
disabled: state.documentHistory.length < 2,
|
247
251
|
onClick: ()=>{
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
252
|
+
dispatch({
|
253
|
+
type: 'GO_BACK',
|
254
|
+
payload: {
|
255
|
+
shouldBypassConfirmation: false
|
256
|
+
}
|
257
|
+
});
|
253
258
|
},
|
254
|
-
|
255
|
-
children:
|
256
|
-
|
257
|
-
|
259
|
+
marginRight: 1,
|
260
|
+
children: /*#__PURE__*/ jsx(ArrowLeft, {})
|
261
|
+
}),
|
262
|
+
/*#__PURE__*/ jsx(Typography, {
|
263
|
+
tag: "span",
|
264
|
+
fontWeight: 600,
|
265
|
+
children: isCreating ? formatMessage({
|
266
|
+
id: 'content-manager.relation.create',
|
267
|
+
defaultMessage: 'Create a relation'
|
268
|
+
}) : formatMessage({
|
269
|
+
id: 'content-manager.components.RelationInputModal.modal-title',
|
270
|
+
defaultMessage: 'Edit a relation'
|
258
271
|
})
|
259
272
|
})
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
273
|
+
]
|
274
|
+
}),
|
275
|
+
/*#__PURE__*/ jsx(IconButton, {
|
276
|
+
onClick: ()=>{
|
277
|
+
dispatch({
|
278
|
+
type: 'GO_FULL_PAGE'
|
279
|
+
});
|
280
|
+
if (!state.hasUnsavedChanges) {
|
281
|
+
if (isCreating) {
|
282
|
+
navigate(generateCreateUrl(currentDocumentMeta));
|
283
|
+
} else {
|
284
|
+
navigate(getFullPageUrl(currentDocumentMeta));
|
285
|
+
}
|
286
|
+
}
|
287
|
+
},
|
288
|
+
variant: "tertiary",
|
289
|
+
label: formatMessage({
|
290
|
+
id: 'content-manager.components.RelationInputModal.button-fullpage',
|
291
|
+
defaultMessage: 'Go to entry'
|
292
|
+
}),
|
293
|
+
children: /*#__PURE__*/ jsx(ArrowsOut, {})
|
294
|
+
})
|
295
|
+
]
|
296
|
+
})
|
264
297
|
}),
|
265
|
-
/*#__PURE__*/ jsx(
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
298
|
+
/*#__PURE__*/ jsx(Modal.Body, {
|
299
|
+
children: /*#__PURE__*/ jsx(Form, {
|
300
|
+
method: isCreating ? 'POST' : 'PUT',
|
301
|
+
initialValues: currentDocument.getInitialFormValues(isCreating),
|
302
|
+
validate: (values, options)=>{
|
303
|
+
const yupSchema = createYupSchema(currentDocument.schema?.attributes, currentDocument.components, {
|
304
|
+
status: currentDocument.document?.status,
|
305
|
+
...options
|
306
|
+
});
|
307
|
+
return yupSchema.validate(values, {
|
308
|
+
abortEarly: false
|
309
|
+
});
|
273
310
|
},
|
274
|
-
|
275
|
-
setIsConfirmationOpen(false);
|
276
|
-
},
|
277
|
-
variant: "danger",
|
278
|
-
children: formatMessage({
|
279
|
-
id: 'content-manager.components.RelationInputModal.confirmation-message',
|
280
|
-
defaultMessage: 'Some changes were not saved. Are you sure you want to close this relation? All changes that were not saved will be lost.'
|
281
|
-
})
|
311
|
+
children: /*#__PURE__*/ jsx(RelationModalBody, {})
|
282
312
|
})
|
283
313
|
})
|
284
314
|
]
|
315
|
+
})
|
316
|
+
]
|
317
|
+
});
|
318
|
+
};
|
319
|
+
/**
|
320
|
+
* All the main content (not header and footer) of the relation modal, plus the confirmation dialog.
|
321
|
+
* Will be wrapped in a Modal.Body by the RelationModal component.
|
322
|
+
* Cannot be moved directly inside RelationModal because it needs access to the context via hooks.
|
323
|
+
*/ const RelationModalBody = ()=>{
|
324
|
+
const navigate = useNavigate();
|
325
|
+
const { pathname, search } = useLocation();
|
326
|
+
const { formatMessage } = useIntl();
|
327
|
+
const [triggerRefetchDocument] = useLazyGetDocumentQuery();
|
328
|
+
const state = useRelationModal('RelationModalForm', (state)=>state.state);
|
329
|
+
const dispatch = useRelationModal('RelationModalForm', (state)=>state.dispatch);
|
330
|
+
const rootDocumentMeta = useRelationModal('RelationModalForm', (state)=>state.rootDocumentMeta);
|
331
|
+
const currentDocumentMeta = useRelationModal('RelationModalForm', (state)=>state.currentDocumentMeta);
|
332
|
+
const isCreating = useRelationModal('RelationModalForm', (state)=>state.isCreating);
|
333
|
+
/**
|
334
|
+
* One-way sync the modified state from the form to the modal state.
|
335
|
+
* It is needed because we need to consume state from the form context in order to lift it up
|
336
|
+
* into the modal context. It is not possible otherwise because the modal needs the form state,
|
337
|
+
* but it must be a parent of the form.
|
338
|
+
*/ const modified = useForm('FormWatcher', (state)=>state.modified);
|
339
|
+
const isSubmitting = useForm('FormWatcher', (state)=>state.isSubmitting);
|
340
|
+
const hasUnsavedChanges = modified && !isSubmitting;
|
341
|
+
React.useEffect(()=>{
|
342
|
+
dispatch({
|
343
|
+
type: 'SET_HAS_UNSAVED_CHANGES',
|
344
|
+
payload: {
|
345
|
+
hasUnsavedChanges
|
346
|
+
}
|
347
|
+
});
|
348
|
+
}, [
|
349
|
+
hasUnsavedChanges,
|
350
|
+
dispatch
|
351
|
+
]);
|
352
|
+
const handleCloseModal = (shouldBypassConfirmation)=>{
|
353
|
+
dispatch({
|
354
|
+
type: 'CLOSE_MODAL',
|
355
|
+
payload: {
|
356
|
+
shouldBypassConfirmation
|
357
|
+
}
|
358
|
+
});
|
359
|
+
{
|
360
|
+
// TODO: check if we can avoid this by relying on RTK invalidatesTags.
|
361
|
+
// If so we can delete this function and dispatch the events directly
|
362
|
+
triggerRefetchDocument(// TODO check if params should be removed (as they were before)
|
363
|
+
rootDocumentMeta, // Favor the cache
|
364
|
+
true);
|
365
|
+
}
|
366
|
+
};
|
367
|
+
const handleRedirection = ()=>{
|
368
|
+
const editViewUrl = `${pathname}${search}`;
|
369
|
+
const fullPageUrl = getFullPageUrl(currentDocumentMeta);
|
370
|
+
const isRootDocumentUrl = editViewUrl.includes(fullPageUrl);
|
371
|
+
if (isRootDocumentUrl) {
|
372
|
+
handleCloseModal(true);
|
373
|
+
} else {
|
374
|
+
if (isCreating) {
|
375
|
+
navigate(generateCreateUrl(currentDocumentMeta));
|
376
|
+
} else {
|
377
|
+
navigate(fullPageUrl);
|
378
|
+
}
|
379
|
+
}
|
380
|
+
};
|
381
|
+
const handleConfirm = ()=>{
|
382
|
+
if (state.confirmDialogIntent === null) {
|
383
|
+
return;
|
384
|
+
}
|
385
|
+
if (state.confirmDialogIntent === 'navigate') {
|
386
|
+
handleRedirection();
|
387
|
+
} else if (state.confirmDialogIntent === 'back') {
|
388
|
+
dispatch({
|
389
|
+
type: 'GO_BACK',
|
390
|
+
payload: {
|
391
|
+
shouldBypassConfirmation: true
|
392
|
+
}
|
393
|
+
});
|
394
|
+
} else if (state.confirmDialogIntent === 'close') {
|
395
|
+
handleCloseModal(true);
|
396
|
+
} else if ('documentId' in state.confirmDialogIntent) {
|
397
|
+
dispatch({
|
398
|
+
type: 'GO_TO_RELATION',
|
399
|
+
payload: {
|
400
|
+
document: state.confirmDialogIntent,
|
401
|
+
shouldBypassConfirmation: true
|
402
|
+
}
|
285
403
|
});
|
286
404
|
}
|
405
|
+
};
|
406
|
+
return /*#__PURE__*/ jsxs(Fragment, {
|
407
|
+
children: [
|
408
|
+
/*#__PURE__*/ jsx(RelationModalForm, {}),
|
409
|
+
/*#__PURE__*/ jsx(Dialog.Root, {
|
410
|
+
open: state.confirmDialogIntent != null,
|
411
|
+
children: /*#__PURE__*/ jsx(ConfirmDialog, {
|
412
|
+
onConfirm: ()=>handleConfirm(),
|
413
|
+
onCancel: ()=>dispatch({
|
414
|
+
type: 'CANCEL_CONFIRM_DIALOG'
|
415
|
+
}),
|
416
|
+
variant: "danger",
|
417
|
+
children: formatMessage({
|
418
|
+
id: 'content-manager.components.RelationInputModal.confirmation-message',
|
419
|
+
defaultMessage: 'Some changes were not saved. Are you sure you want to close this relation? All changes that were not saved will be lost.'
|
420
|
+
})
|
421
|
+
})
|
422
|
+
})
|
423
|
+
]
|
424
|
+
});
|
425
|
+
};
|
426
|
+
const RelationModalTrigger = ({ children, relation })=>{
|
427
|
+
const dispatch = useRelationModal('ModalTrigger', (state)=>state.dispatch);
|
428
|
+
return /*#__PURE__*/ jsx(StyledTextButton, {
|
429
|
+
onClick: ()=>{
|
430
|
+
dispatch({
|
431
|
+
type: 'GO_TO_RELATION',
|
432
|
+
payload: {
|
433
|
+
document: relation,
|
434
|
+
shouldBypassConfirmation: false
|
435
|
+
}
|
436
|
+
});
|
437
|
+
},
|
438
|
+
children: children
|
287
439
|
});
|
288
440
|
};
|
289
|
-
const
|
441
|
+
const StyledTextButton = styled(TextButton)`
|
442
|
+
max-width: 100%;
|
290
443
|
& > span {
|
291
444
|
font-size: ${({ theme })=>theme.fontSizes[2]};
|
292
445
|
width: inherit;
|
@@ -295,20 +448,23 @@ const CustomTextButton = styled(TextButton)`
|
|
295
448
|
text-overflow: ellipsis;
|
296
449
|
}
|
297
450
|
`;
|
298
|
-
|
451
|
+
/**
|
452
|
+
* The mini edit view for a relation that is displayed inside a modal.
|
453
|
+
* It's complete with its header, document actions and form layout.
|
454
|
+
*/ const RelationModalForm = ()=>{
|
299
455
|
const { formatMessage } = useIntl();
|
300
|
-
const
|
301
|
-
const
|
302
|
-
const
|
303
|
-
const documentLayoutResponse = useDocumentLayout(
|
304
|
-
const plugins = useStrapiApp('
|
305
|
-
const initialValues =
|
456
|
+
const currentDocumentMeta = useRelationModal('RelationModalForm', (state)=>state.currentDocumentMeta);
|
457
|
+
const isCreating = useRelationModal('RelationModalForm', (state)=>state.isCreating);
|
458
|
+
const currentDocument = useRelationModal('RelationModalForm', (state)=>state.currentDocument);
|
459
|
+
const documentLayoutResponse = useDocumentLayout(currentDocumentMeta.model);
|
460
|
+
const plugins = useStrapiApp('RelationModalForm', (state)=>state.plugins);
|
461
|
+
const initialValues = isCreating ? currentDocument.getInitialFormValues(isCreating) : currentDocument.getInitialFormValues();
|
306
462
|
const { permissions = [], isLoading: isLoadingPermissions, error } = useRBAC(PERMISSIONS.map((action)=>({
|
307
463
|
action,
|
308
|
-
subject:
|
464
|
+
subject: currentDocumentMeta.model
|
309
465
|
})));
|
310
|
-
const isLoading = isLoadingPermissions || documentLayoutResponse.isLoading ||
|
311
|
-
if (isLoading && !
|
466
|
+
const isLoading = isLoadingPermissions || documentLayoutResponse.isLoading || currentDocument.isLoading;
|
467
|
+
if (isLoading && !currentDocument.document?.documentId) {
|
312
468
|
return /*#__PURE__*/ jsx(Loader, {
|
313
469
|
small: true,
|
314
470
|
children: formatMessage({
|
@@ -317,7 +473,7 @@ const RelationModalBody = ({ children })=>{
|
|
317
473
|
})
|
318
474
|
});
|
319
475
|
}
|
320
|
-
if (error || !
|
476
|
+
if (error || !currentDocumentMeta.model || documentLayoutResponse.error || !isCreating && !currentDocument.document || !isCreating && !currentDocument.meta || !currentDocument.schema || !initialValues) {
|
321
477
|
return /*#__PURE__*/ jsx(Flex, {
|
322
478
|
alignItems: "center",
|
323
479
|
height: "100%",
|
@@ -333,106 +489,98 @@ const RelationModalBody = ({ children })=>{
|
|
333
489
|
})
|
334
490
|
});
|
335
491
|
}
|
336
|
-
const documentTitle =
|
337
|
-
const hasDraftAndPublished =
|
492
|
+
const documentTitle = currentDocument.getTitle(documentLayoutResponse.edit.settings.mainField);
|
493
|
+
const hasDraftAndPublished = currentDocument.schema?.options?.draftAndPublish ?? false;
|
338
494
|
const props = {
|
339
495
|
activeTab: 'draft',
|
340
|
-
collectionType:
|
341
|
-
model:
|
342
|
-
documentId:
|
343
|
-
document:
|
344
|
-
meta:
|
345
|
-
onPreview,
|
346
|
-
fromRelationModal: true,
|
347
|
-
fromPreview: onPreview !== undefined
|
496
|
+
collectionType: currentDocumentMeta.collectionType,
|
497
|
+
model: currentDocumentMeta.model,
|
498
|
+
documentId: currentDocumentMeta.documentId,
|
499
|
+
document: currentDocument.document,
|
500
|
+
meta: currentDocument.meta
|
348
501
|
};
|
349
|
-
return /*#__PURE__*/
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
variant: primaryAction.variant || 'secondary'
|
403
|
-
});
|
404
|
-
}
|
405
|
-
})
|
406
|
-
]
|
502
|
+
return /*#__PURE__*/ jsxs(DocumentRBAC, {
|
503
|
+
permissions: permissions,
|
504
|
+
model: currentDocumentMeta.model,
|
505
|
+
children: [
|
506
|
+
/*#__PURE__*/ jsxs(Flex, {
|
507
|
+
alignItems: "flex-start",
|
508
|
+
direction: "column",
|
509
|
+
gap: 2,
|
510
|
+
children: [
|
511
|
+
/*#__PURE__*/ jsxs(Flex, {
|
512
|
+
width: "100%",
|
513
|
+
justifyContent: "space-between",
|
514
|
+
gap: 2,
|
515
|
+
children: [
|
516
|
+
/*#__PURE__*/ jsx(Typography, {
|
517
|
+
tag: "h2",
|
518
|
+
variant: "alpha",
|
519
|
+
children: documentTitle
|
520
|
+
}),
|
521
|
+
/*#__PURE__*/ jsx(Flex, {
|
522
|
+
gap: 2,
|
523
|
+
children: /*#__PURE__*/ jsx(DescriptionComponentRenderer, {
|
524
|
+
props: props,
|
525
|
+
descriptions: plugins['content-manager'].apis.getDocumentActions('relation-modal'),
|
526
|
+
children: (actions)=>{
|
527
|
+
const filteredActions = actions.filter((action)=>{
|
528
|
+
return [
|
529
|
+
action.position
|
530
|
+
].flat().includes('relation-modal');
|
531
|
+
});
|
532
|
+
const [primaryAction, secondaryAction] = filteredActions;
|
533
|
+
if (!primaryAction && !secondaryAction) return null;
|
534
|
+
// Both actions are available when draft and publish enabled
|
535
|
+
if (primaryAction && secondaryAction) {
|
536
|
+
return /*#__PURE__*/ jsxs(Fragment, {
|
537
|
+
children: [
|
538
|
+
/*#__PURE__*/ jsx(DocumentActionButton, {
|
539
|
+
...secondaryAction,
|
540
|
+
variant: secondaryAction.variant || 'secondary'
|
541
|
+
}),
|
542
|
+
/*#__PURE__*/ jsx(DocumentActionButton, {
|
543
|
+
...primaryAction,
|
544
|
+
variant: primaryAction.variant || 'default'
|
545
|
+
})
|
546
|
+
]
|
547
|
+
});
|
548
|
+
}
|
549
|
+
// Otherwise we just have the save action
|
550
|
+
return /*#__PURE__*/ jsx(DocumentActionButton, {
|
551
|
+
...primaryAction,
|
552
|
+
variant: primaryAction.variant || 'secondary'
|
553
|
+
});
|
554
|
+
}
|
407
555
|
})
|
408
|
-
]
|
409
|
-
}),
|
410
|
-
hasDraftAndPublished ? /*#__PURE__*/ jsx(Box, {
|
411
|
-
children: /*#__PURE__*/ jsx(DocumentStatus, {
|
412
|
-
status: documentResponse.document?.status
|
413
556
|
})
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
overflow: "auto",
|
420
|
-
alignItems: "stretch",
|
421
|
-
paddingTop: 7,
|
422
|
-
children: /*#__PURE__*/ jsx(Box, {
|
423
|
-
overflow: "auto",
|
424
|
-
flex: 1,
|
425
|
-
children: /*#__PURE__*/ jsx(FormLayout, {
|
426
|
-
layout: documentLayoutResponse.edit.layout,
|
427
|
-
document: documentResponse,
|
428
|
-
hasBackground: false
|
557
|
+
]
|
558
|
+
}),
|
559
|
+
hasDraftAndPublished ? /*#__PURE__*/ jsx(Box, {
|
560
|
+
children: /*#__PURE__*/ jsx(DocumentStatus, {
|
561
|
+
status: currentDocument.document?.status
|
429
562
|
})
|
563
|
+
}) : null
|
564
|
+
]
|
565
|
+
}),
|
566
|
+
/*#__PURE__*/ jsx(Flex, {
|
567
|
+
flex: 1,
|
568
|
+
overflow: "auto",
|
569
|
+
alignItems: "stretch",
|
570
|
+
paddingTop: 7,
|
571
|
+
children: /*#__PURE__*/ jsx(Box, {
|
572
|
+
overflow: "auto",
|
573
|
+
flex: 1,
|
574
|
+
children: /*#__PURE__*/ jsx(FormLayout, {
|
575
|
+
layout: documentLayoutResponse.edit.layout,
|
576
|
+
document: currentDocument,
|
577
|
+
hasBackground: false
|
430
578
|
})
|
431
579
|
})
|
432
|
-
|
433
|
-
|
580
|
+
})
|
581
|
+
]
|
434
582
|
});
|
435
583
|
};
|
436
584
|
|
437
|
-
export {
|
585
|
+
export { RelationModalRenderer, getCollectionType, reducer, useRelationModal };
|
438
586
|
//# sourceMappingURL=RelationModal.mjs.map
|