@strapi/content-manager 5.61.0 → 5.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/ConfigurationForm/Fields.js +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +3 -3
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/features/I18nSharedFieldsLock.js +54 -0
- package/dist/admin/features/I18nSharedFieldsLock.js.map +1 -0
- package/dist/admin/features/I18nSharedFieldsLock.mjs +31 -0
- package/dist/admin/features/I18nSharedFieldsLock.mjs.map +1 -0
- package/dist/admin/history/components/VersionInputRenderer.js +7 -2
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs +7 -3
- package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
- package/dist/admin/hooks/useContentManagerInitData.js +27 -8
- package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
- package/dist/admin/hooks/useContentManagerInitData.mjs +29 -10
- package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
- package/dist/admin/hooks/useDocument.js +11 -13
- package/dist/admin/hooks/useDocument.js.map +1 -1
- package/dist/admin/hooks/useDocument.mjs +11 -13
- package/dist/admin/hooks/useDocument.mjs.map +1 -1
- package/dist/admin/hooks/useI18nFieldLock.js +169 -0
- package/dist/admin/hooks/useI18nFieldLock.js.map +1 -0
- package/dist/admin/hooks/useI18nFieldLock.mjs +140 -0
- package/dist/admin/hooks/useI18nFieldLock.mjs.map +1 -0
- package/dist/admin/hooks/usePersistentQueryParams.js +16 -3
- package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.mjs +16 -3
- package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
- package/dist/admin/index.js +5 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +2 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/modules/app.js +8 -1
- package/dist/admin/modules/app.js.map +1 -1
- package/dist/admin/modules/app.mjs +8 -2
- package/dist/admin/modules/app.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +129 -127
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +129 -127
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +11 -4
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +12 -5
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +31 -21
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +32 -22
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js +98 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs +96 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js +1103 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs +1077 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js +211 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs +183 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js +84 -41
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs +86 -43
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +86 -20
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +89 -23
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +142 -22
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +143 -23
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js +402 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs +389 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +84 -33
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +85 -34
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +17 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +18 -5
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +54 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +54 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +11 -9
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +12 -10
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +66 -63
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +66 -63
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +7 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +7 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +14 -9
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +14 -9
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/forms.js +34 -0
- package/dist/admin/pages/EditView/utils/forms.js.map +1 -1
- package/dist/admin/pages/EditView/utils/forms.mjs +34 -1
- package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +2 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +2 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +7 -6
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +7 -6
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +11 -2
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +13 -4
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +15 -5
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +16 -7
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +18 -8
- package/dist/admin/preview/components/InputPopover.js.map +1 -1
- package/dist/admin/preview/components/InputPopover.mjs +19 -9
- package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
- package/dist/admin/preview/pages/Preview.js +5 -16
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +5 -16
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.js +2 -0
- package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.mjs +2 -1
- package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
- package/dist/admin/services/api.js +2 -1
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +2 -1
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/services/documents.js +21 -1
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +21 -2
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/services/relations.js +47 -1
- package/dist/admin/services/relations.js.map +1 -1
- package/dist/admin/services/relations.mjs +47 -2
- package/dist/admin/services/relations.mjs.map +1 -1
- package/dist/admin/src/exports.d.ts +2 -0
- package/dist/admin/src/features/I18nSharedFieldsLock.d.ts +22 -0
- package/dist/admin/src/history/components/VersionInputRenderer.d.ts +7 -1
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useI18nFieldLock.d.ts +61 -0
- package/dist/admin/src/modules/app.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/AddComponentMenu.d.ts +15 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/ComponentCopyModal.d.ts +58 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.d.ts +41 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Initializer.d.ts +7 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/utils/componentCopy.d.ts +115 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +6 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +2 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +5 -1
- package/dist/admin/src/pages/EditView/utils/forms.d.ts +13 -2
- package/dist/admin/src/pages/ListView/components/Filters.d.ts +12 -3
- package/dist/admin/src/preview/services/preview.d.ts +1 -1
- package/dist/admin/src/preview/utils/fieldUtils.d.ts +1 -0
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/components.d.ts +2 -2
- package/dist/admin/src/services/contentTypes.d.ts +3 -3
- package/dist/admin/src/services/documents.d.ts +25 -21
- package/dist/admin/src/services/homepage.d.ts +1 -1
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +5 -3
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/admin/translations/en.json.js +41 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +41 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/controllers/relations.js +4 -2
- package/dist/server/controllers/relations.js.map +1 -1
- package/dist/server/controllers/relations.mjs +4 -2
- package/dist/server/controllers/relations.mjs.map +1 -1
- package/dist/server/controllers/utils/metadata.js +3 -1
- package/dist/server/controllers/utils/metadata.js.map +1 -1
- package/dist/server/controllers/utils/metadata.mjs +3 -1
- package/dist/server/controllers/utils/metadata.mjs.map +1 -1
- package/dist/server/history/services/utils.js +3 -1
- package/dist/server/history/services/utils.js.map +1 -1
- package/dist/server/history/services/utils.mjs +3 -1
- package/dist/server/history/services/utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.js +14 -0
- package/dist/server/homepage/services/homepage-query-utils.js.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.mjs +14 -1
- package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage.js +1 -1
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +2 -2
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.js +1 -3
- package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.mjs +1 -3
- package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.js +2 -1
- package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.mjs +2 -1
- package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
- package/dist/server/services/document-manager.js +3 -2
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +3 -2
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/document-metadata.js +92 -4
- package/dist/server/services/document-metadata.js.map +1 -1
- package/dist/server/services/document-metadata.mjs +92 -4
- package/dist/server/services/document-metadata.mjs.map +1 -1
- package/dist/server/services/permission-checker.js +20 -8
- package/dist/server/services/permission-checker.js.map +1 -1
- package/dist/server/services/permission-checker.mjs +20 -8
- package/dist/server/services/permission-checker.mjs.map +1 -1
- package/dist/server/services/uid.js +2 -1
- package/dist/server/services/uid.js.map +1 -1
- package/dist/server/services/uid.mjs +2 -1
- package/dist/server/services/uid.mjs.map +1 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
- package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts +6 -0
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +21 -7
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
- package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts +5 -1
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +21 -7
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permission-checker.d.ts +6 -5
- package/dist/server/src/services/permission-checker.d.ts.map +1 -1
- package/dist/server/src/services/uid.d.ts.map +1 -1
- package/dist/shared/contracts/collection-types.d.ts +7 -0
- package/dist/shared/contracts/collection-types.d.ts.map +1 -1
- package/dist/shared/contracts/single-types.d.ts +4 -0
- package/dist/shared/contracts/single-types.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -28,6 +28,8 @@ const useContentManagerInitData = ()=>{
|
|
|
28
28
|
const { formatMessage } = reactIntl.useIntl();
|
|
29
29
|
const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler(translations.getTranslation);
|
|
30
30
|
const checkUserHasPermissions = strapiAdmin.useAuth('useContentManagerInitData', (state)=>state.checkUserHasPermissions);
|
|
31
|
+
const isLoadingAuth = strapiAdmin.useAuth('useContentManagerInitData', (state)=>state.isLoading);
|
|
32
|
+
const adminUserId = strapiAdmin.useAuth('useContentManagerInitData', (state)=>strapiAdmin.getAdminUserId(state.user));
|
|
31
33
|
const state = hooks.useTypedSelector((state)=>state['content-manager'].app);
|
|
32
34
|
const initialDataQuery = init.useGetInitialDataQuery(undefined, {
|
|
33
35
|
/**
|
|
@@ -103,35 +105,52 @@ const useContentManagerInitData = ()=>{
|
|
|
103
105
|
stLinks: authorizedSingleTypeLinks,
|
|
104
106
|
models: contentTypes
|
|
105
107
|
});
|
|
106
|
-
|
|
108
|
+
return {
|
|
109
|
+
adminUserId,
|
|
107
110
|
authorizedCollectionTypeLinks: ctLinks,
|
|
108
111
|
authorizedSingleTypeLinks: stLinks,
|
|
109
112
|
components,
|
|
110
113
|
contentStructure,
|
|
111
114
|
contentTypeSchemas: contentTypes,
|
|
112
115
|
fieldSizes
|
|
113
|
-
}
|
|
116
|
+
};
|
|
114
117
|
}, [
|
|
118
|
+
adminUserId,
|
|
115
119
|
checkUserHasPermissions,
|
|
116
|
-
dispatch,
|
|
117
120
|
runHookWaterfall
|
|
118
121
|
]);
|
|
119
122
|
React.useEffect(()=>{
|
|
123
|
+
let cancelled = false;
|
|
120
124
|
if (initialDataQuery.data && contentTypeSettingsQuery.data) {
|
|
121
|
-
formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data, initialDataQuery.data.contentStructure).
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
125
|
+
formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data, initialDataQuery.data.contentStructure).then((data)=>{
|
|
126
|
+
if (!cancelled) {
|
|
127
|
+
dispatch(app.setInitialData(data));
|
|
128
|
+
}
|
|
129
|
+
}).catch((error)=>{
|
|
130
|
+
if (!cancelled) {
|
|
131
|
+
toggleNotification({
|
|
132
|
+
type: 'danger',
|
|
133
|
+
message: formatAPIError(error)
|
|
134
|
+
});
|
|
135
|
+
}
|
|
126
136
|
});
|
|
127
137
|
}
|
|
138
|
+
return ()=>{
|
|
139
|
+
cancelled = true;
|
|
140
|
+
};
|
|
128
141
|
}, [
|
|
142
|
+
dispatch,
|
|
129
143
|
formatAPIError,
|
|
130
144
|
formatData,
|
|
131
145
|
initialDataQuery.data,
|
|
132
146
|
contentTypeSettingsQuery.data,
|
|
133
147
|
toggleNotification
|
|
134
148
|
]);
|
|
149
|
+
if (isLoadingAuth || state.adminUserId !== adminUserId) {
|
|
150
|
+
return {
|
|
151
|
+
...app.initialState
|
|
152
|
+
};
|
|
153
|
+
}
|
|
135
154
|
return {
|
|
136
155
|
...state
|
|
137
156
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContentManagerInitData.js","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport {\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst getPermissionKey = (permission: Pick<Permission, 'action' | 'subject'>) =>\n `${permission.action}::${permission.subject ?? ''}`;\n\nconst authorizeLinks = async (\n links: ContentManagerLink[],\n checkUserHasPermissions: (\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>\n ) => Promise<Permission[]>\n) => {\n const authorizedPermissions = await checkUserHasPermissions(\n links.flatMap(({ permissions }) => permissions)\n );\n\n const authorizedPermissionKeys = new Set(authorizedPermissions.map(getPermissionKey));\n\n return links.filter(({ permissions }) =>\n permissions.some((permission) => authorizedPermissionKeys.has(getPermissionKey(permission)))\n );\n};\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = useCallback(\n async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data'],\n contentStructure: GetInitData.Response['data']['contentStructure']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n const authorizedLinks = await authorizeLinks(\n [...collectionTypeSectionLinks, ...singleTypeSectionLinks],\n checkUserHasPermissions\n );\n const authorizedCollectionTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'collectionType'\n );\n const authorizedSingleTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'singleType'\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n dispatch(\n setInitialData({\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentStructure,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n })\n );\n },\n [checkUserHasPermissions, dispatch, runHookWaterfall]\n );\n\n useEffect(() => {\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data,\n initialDataQuery.data.contentStructure\n ).catch((error) => {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n });\n }\n }, [\n formatAPIError,\n formatData,\n initialDataQuery.data,\n contentTypeSettingsQuery.data,\n toggleNotification,\n ]);\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","getPermissionKey","permission","action","subject","authorizeLinks","links","checkUserHasPermissions","authorizedPermissions","flatMap","permissions","authorizedPermissionKeys","Set","map","filter","some","has","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","useAuth","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","useCallback","components","contentTypes","fieldSizes","contentTypeConfigurations","contentStructure","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","authorizedLinks","authorizedCollectionTypeLinks","link","authorizedSingleTypeLinks","ctLinks","models","stLinks","setInitialData","contentTypeSchemas","catch","configurations","isDisplayed","collectionTypesPermissions","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useContentManagerInitData.js","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport {\n getAdminUserId,\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, initialState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst getPermissionKey = (permission: Pick<Permission, 'action' | 'subject'>) =>\n `${permission.action}::${permission.subject ?? ''}`;\n\nconst authorizeLinks = async (\n links: ContentManagerLink[],\n checkUserHasPermissions: (\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>\n ) => Promise<Permission[]>\n) => {\n const authorizedPermissions = await checkUserHasPermissions(\n links.flatMap(({ permissions }) => permissions)\n );\n\n const authorizedPermissionKeys = new Set(authorizedPermissions.map(getPermissionKey));\n\n return links.filter(({ permissions }) =>\n permissions.some((permission) => authorizedPermissionKeys.has(getPermissionKey(permission)))\n );\n};\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n const isLoadingAuth = useAuth('useContentManagerInitData', (state) => state.isLoading);\n const adminUserId = useAuth('useContentManagerInitData', (state) => getAdminUserId(state.user));\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = useCallback(\n async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data'],\n contentStructure: GetInitData.Response['data']['contentStructure']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n const authorizedLinks = await authorizeLinks(\n [...collectionTypeSectionLinks, ...singleTypeSectionLinks],\n checkUserHasPermissions\n );\n const authorizedCollectionTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'collectionType'\n );\n const authorizedSingleTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'singleType'\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n return {\n adminUserId,\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentStructure,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n };\n },\n [adminUserId, checkUserHasPermissions, runHookWaterfall]\n );\n\n useEffect(() => {\n let cancelled = false;\n\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data,\n initialDataQuery.data.contentStructure\n )\n .then((data) => {\n if (!cancelled) {\n dispatch(setInitialData(data));\n }\n })\n .catch((error) => {\n if (!cancelled) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [\n dispatch,\n formatAPIError,\n formatData,\n initialDataQuery.data,\n contentTypeSettingsQuery.data,\n toggleNotification,\n ]);\n\n if (isLoadingAuth || state.adminUserId !== adminUserId) {\n return { ...initialState };\n }\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","getPermissionKey","permission","action","subject","authorizeLinks","links","checkUserHasPermissions","authorizedPermissions","flatMap","permissions","authorizedPermissionKeys","Set","map","filter","some","has","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","useAuth","isLoadingAuth","isLoading","adminUserId","getAdminUserId","user","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","useCallback","components","contentTypes","fieldSizes","contentTypeConfigurations","contentStructure","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","authorizedLinks","authorizedCollectionTypeLinks","link","authorizedSingleTypeLinks","ctLinks","models","stLinks","contentTypeSchemas","cancelled","then","setInitialData","catch","initialState","configurations","isDisplayed","collectionTypesPermissions","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { useEffect, useCallback } from 'react';
|
|
2
|
-
import { useNotification, useStrapiApp, useAPIErrorHandler, useAuth } from '@strapi/admin/strapi-admin';
|
|
2
|
+
import { useNotification, useStrapiApp, useAPIErrorHandler, useAuth, getAdminUserId } from '@strapi/admin/strapi-admin';
|
|
3
3
|
import { useNotifyAT } from '@strapi/design-system';
|
|
4
4
|
import { stringify } from 'qs';
|
|
5
5
|
import { useIntl } from 'react-intl';
|
|
6
6
|
import { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections.mjs';
|
|
7
7
|
import { HOOKS } from '../constants/hooks.mjs';
|
|
8
|
-
import { setInitialData } from '../modules/app.mjs';
|
|
8
|
+
import { setInitialData, initialState } from '../modules/app.mjs';
|
|
9
9
|
import { useTypedDispatch, useTypedSelector } from '../modules/hooks.mjs';
|
|
10
10
|
import { useGetAllContentTypeSettingsQuery } from '../services/contentTypes.mjs';
|
|
11
11
|
import { useGetInitialDataQuery } from '../services/init.mjs';
|
|
@@ -26,6 +26,8 @@ const useContentManagerInitData = ()=>{
|
|
|
26
26
|
const { formatMessage } = useIntl();
|
|
27
27
|
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);
|
|
28
28
|
const checkUserHasPermissions = useAuth('useContentManagerInitData', (state)=>state.checkUserHasPermissions);
|
|
29
|
+
const isLoadingAuth = useAuth('useContentManagerInitData', (state)=>state.isLoading);
|
|
30
|
+
const adminUserId = useAuth('useContentManagerInitData', (state)=>getAdminUserId(state.user));
|
|
29
31
|
const state = useTypedSelector((state)=>state['content-manager'].app);
|
|
30
32
|
const initialDataQuery = useGetInitialDataQuery(undefined, {
|
|
31
33
|
/**
|
|
@@ -101,35 +103,52 @@ const useContentManagerInitData = ()=>{
|
|
|
101
103
|
stLinks: authorizedSingleTypeLinks,
|
|
102
104
|
models: contentTypes
|
|
103
105
|
});
|
|
104
|
-
|
|
106
|
+
return {
|
|
107
|
+
adminUserId,
|
|
105
108
|
authorizedCollectionTypeLinks: ctLinks,
|
|
106
109
|
authorizedSingleTypeLinks: stLinks,
|
|
107
110
|
components,
|
|
108
111
|
contentStructure,
|
|
109
112
|
contentTypeSchemas: contentTypes,
|
|
110
113
|
fieldSizes
|
|
111
|
-
}
|
|
114
|
+
};
|
|
112
115
|
}, [
|
|
116
|
+
adminUserId,
|
|
113
117
|
checkUserHasPermissions,
|
|
114
|
-
dispatch,
|
|
115
118
|
runHookWaterfall
|
|
116
119
|
]);
|
|
117
120
|
useEffect(()=>{
|
|
121
|
+
let cancelled = false;
|
|
118
122
|
if (initialDataQuery.data && contentTypeSettingsQuery.data) {
|
|
119
|
-
formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data, initialDataQuery.data.contentStructure).
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
123
|
+
formatData(initialDataQuery.data.components, initialDataQuery.data.contentTypes, initialDataQuery.data.fieldSizes, contentTypeSettingsQuery.data, initialDataQuery.data.contentStructure).then((data)=>{
|
|
124
|
+
if (!cancelled) {
|
|
125
|
+
dispatch(setInitialData(data));
|
|
126
|
+
}
|
|
127
|
+
}).catch((error)=>{
|
|
128
|
+
if (!cancelled) {
|
|
129
|
+
toggleNotification({
|
|
130
|
+
type: 'danger',
|
|
131
|
+
message: formatAPIError(error)
|
|
132
|
+
});
|
|
133
|
+
}
|
|
124
134
|
});
|
|
125
135
|
}
|
|
136
|
+
return ()=>{
|
|
137
|
+
cancelled = true;
|
|
138
|
+
};
|
|
126
139
|
}, [
|
|
140
|
+
dispatch,
|
|
127
141
|
formatAPIError,
|
|
128
142
|
formatData,
|
|
129
143
|
initialDataQuery.data,
|
|
130
144
|
contentTypeSettingsQuery.data,
|
|
131
145
|
toggleNotification
|
|
132
146
|
]);
|
|
147
|
+
if (isLoadingAuth || state.adminUserId !== adminUserId) {
|
|
148
|
+
return {
|
|
149
|
+
...initialState
|
|
150
|
+
};
|
|
151
|
+
}
|
|
133
152
|
return {
|
|
134
153
|
...state
|
|
135
154
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContentManagerInitData.mjs","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport {\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst getPermissionKey = (permission: Pick<Permission, 'action' | 'subject'>) =>\n `${permission.action}::${permission.subject ?? ''}`;\n\nconst authorizeLinks = async (\n links: ContentManagerLink[],\n checkUserHasPermissions: (\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>\n ) => Promise<Permission[]>\n) => {\n const authorizedPermissions = await checkUserHasPermissions(\n links.flatMap(({ permissions }) => permissions)\n );\n\n const authorizedPermissionKeys = new Set(authorizedPermissions.map(getPermissionKey));\n\n return links.filter(({ permissions }) =>\n permissions.some((permission) => authorizedPermissionKeys.has(getPermissionKey(permission)))\n );\n};\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = useCallback(\n async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data'],\n contentStructure: GetInitData.Response['data']['contentStructure']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n const authorizedLinks = await authorizeLinks(\n [...collectionTypeSectionLinks, ...singleTypeSectionLinks],\n checkUserHasPermissions\n );\n const authorizedCollectionTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'collectionType'\n );\n const authorizedSingleTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'singleType'\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n dispatch(\n setInitialData({\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentStructure,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n })\n );\n },\n [checkUserHasPermissions, dispatch, runHookWaterfall]\n );\n\n useEffect(() => {\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data,\n initialDataQuery.data.contentStructure\n ).catch((error) => {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n });\n }\n }, [\n formatAPIError,\n formatData,\n initialDataQuery.data,\n contentTypeSettingsQuery.data,\n toggleNotification,\n ]);\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","getPermissionKey","permission","action","subject","authorizeLinks","links","checkUserHasPermissions","authorizedPermissions","flatMap","permissions","authorizedPermissionKeys","Set","map","filter","some","has","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","useAuth","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","useCallback","components","contentTypes","fieldSizes","contentTypeConfigurations","contentStructure","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","authorizedLinks","authorizedCollectionTypeLinks","link","authorizedSingleTypeLinks","ctLinks","models","stLinks","setInitialData","contentTypeSchemas","catch","configurations","isDisplayed","collectionTypesPermissions","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useContentManagerInitData.mjs","sources":["../../../admin/src/hooks/useContentManagerInitData.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport {\n getAdminUserId,\n useAuth,\n type Permission,\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n} from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { HOOKS } from '../constants/hooks';\nimport { AppState, initialState, setInitialData } from '../modules/app';\nimport { useTypedDispatch, useTypedSelector } from '../modules/hooks';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type {\n ContentType,\n FindContentTypesSettings,\n} from '../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../shared/contracts/init';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst getPermissionKey = (permission: Pick<Permission, 'action' | 'subject'>) =>\n `${permission.action}::${permission.subject ?? ''}`;\n\nconst authorizeLinks = async (\n links: ContentManagerLink[],\n checkUserHasPermissions: (\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>\n ) => Promise<Permission[]>\n) => {\n const authorizedPermissions = await checkUserHasPermissions(\n links.flatMap(({ permissions }) => permissions)\n );\n\n const authorizedPermissionKeys = new Set(authorizedPermissions.map(getPermissionKey));\n\n return links.filter(({ permissions }) =>\n permissions.some((permission) => authorizedPermissionKeys.has(getPermissionKey(permission)))\n );\n};\n\nconst useContentManagerInitData = (): AppState => {\n const { toggleNotification } = useNotification();\n const dispatch = useTypedDispatch();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const checkUserHasPermissions = useAuth(\n 'useContentManagerInitData',\n (state) => state.checkUserHasPermissions\n );\n const isLoadingAuth = useAuth('useContentManagerInitData', (state) => state.isLoading);\n const adminUserId = useAuth('useContentManagerInitData', (state) => getAdminUserId(state.user));\n\n const state = useTypedSelector((state) => state['content-manager'].app);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = useCallback(\n async (\n components: Component[],\n contentTypes: ContentType[],\n fieldSizes: GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: FindContentTypesSettings.Response['data'],\n contentStructure: GetInitData.Response['data']['contentStructure']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: ContentType[];\n singleType: ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n const authorizedLinks = await authorizeLinks(\n [...collectionTypeSectionLinks, ...singleTypeSectionLinks],\n checkUserHasPermissions\n );\n const authorizedCollectionTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'collectionType'\n );\n const authorizedSingleTypeLinks = authorizedLinks.filter(\n (link) => link.kind === 'singleType'\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n return {\n adminUserId,\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n components,\n contentStructure,\n contentTypeSchemas: contentTypes,\n fieldSizes,\n };\n },\n [adminUserId, checkUserHasPermissions, runHookWaterfall]\n );\n\n useEffect(() => {\n let cancelled = false;\n\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data,\n initialDataQuery.data.contentStructure\n )\n .then((data) => {\n if (!cancelled) {\n dispatch(setInitialData(data));\n }\n })\n .catch((error) => {\n if (!cancelled) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [\n dispatch,\n formatAPIError,\n formatData,\n initialDataQuery.data,\n contentTypeSettingsQuery.data,\n toggleNotification,\n ]);\n\n if (isLoadingAuth || state.adminUserId !== adminUserId) {\n return { ...initialState };\n }\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n"],"names":["MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","HOOKS","getPermissionKey","permission","action","subject","authorizeLinks","links","checkUserHasPermissions","authorizedPermissions","flatMap","permissions","authorizedPermissionKeys","Set","map","filter","some","has","useContentManagerInitData","toggleNotification","useNotification","dispatch","useTypedDispatch","runHookWaterfall","useStrapiApp","state","notifyStatus","useNotifyAT","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","useAuth","isLoadingAuth","isLoading","adminUserId","getAdminUserId","user","useTypedSelector","app","initialDataQuery","useGetInitialDataQuery","undefined","refetchOnMountOrArgChange","useEffect","data","id","defaultMessage","error","type","message","contentTypeSettingsQuery","useGetAllContentTypeSettingsQuery","formatData","useCallback","components","contentTypes","fieldSizes","contentTypeConfigurations","contentStructure","collectionType","collectionTypeLinks","singleType","singleTypeLinks","reduce","acc","model","kind","push","collectionTypeSectionLinks","generateLinks","singleTypeSectionLinks","authorizedLinks","authorizedCollectionTypeLinks","link","authorizedSingleTypeLinks","ctLinks","models","stLinks","contentTypeSchemas","cancelled","then","setInitialData","catch","initialState","configurations","isDisplayed","collectionTypesPermissions","uid","singleTypesPermissions","currentContentTypeConfig","find","search","searchParams","page","pageSize","settings","sort","defaultSortBy","defaultSortOrder","stringify","encode","title","info","displayName","to","COLLECTION_TYPES","SINGLE_TYPES","name"],"mappings":"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"}
|
|
@@ -170,10 +170,9 @@ const getValidationSchema = (schema, components)=>{
|
|
|
170
170
|
* `pluginOptions.i18n.localized` is `undefined` count as non-localized
|
|
171
171
|
* (an attribute created without the i18n plugin has no i18n options at
|
|
172
172
|
* all but is still inherited at save by `copyNonLocalizedFields`).
|
|
173
|
-
* - scalar
|
|
174
|
-
* because the server doesn't populate them in `availableLocales` either
|
|
175
|
-
|
|
176
|
-
*/ const nonLocalizedScalarAndMediaFields = React__namespace.useMemo(()=>{
|
|
173
|
+
* - scalar, media, component, or dynamic zone — relations are excluded
|
|
174
|
+
* because the server doesn't populate them in `availableLocales` either.
|
|
175
|
+
*/ const nonLocalizedFieldsToInherit = React__namespace.useMemo(()=>{
|
|
177
176
|
if (!schema?.attributes) {
|
|
178
177
|
return [];
|
|
179
178
|
}
|
|
@@ -182,7 +181,7 @@ const getValidationSchema = (schema, components)=>{
|
|
|
182
181
|
if (isLocalizedAttribute(attribute)) {
|
|
183
182
|
return false;
|
|
184
183
|
}
|
|
185
|
-
return attribute.type !== '
|
|
184
|
+
return attribute.type !== 'relation';
|
|
186
185
|
});
|
|
187
186
|
}, [
|
|
188
187
|
schema
|
|
@@ -195,12 +194,11 @@ const getValidationSchema = (schema, components)=>{
|
|
|
195
194
|
*
|
|
196
195
|
* We also prepare the form for new documents, so we need to:
|
|
197
196
|
* - set default values on fields
|
|
198
|
-
* - inherit non-localized scalar/media values from a sibling locale.
|
|
199
|
-
* Scope
|
|
200
|
-
* what the server populates into `meta.availableLocales` (see
|
|
197
|
+
* - inherit non-localized scalar/media/component/dynamic-zone values from a sibling locale.
|
|
198
|
+
* Scope matches what the server populates into `meta.availableLocales` (see
|
|
201
199
|
* `packages/core/content-manager/server/src/services/document-metadata.ts`).
|
|
202
|
-
*
|
|
203
|
-
*
|
|
200
|
+
* Relations are not in that payload; the server fills them at save time via
|
|
201
|
+
* `copyNonLocalizedFields` (in
|
|
204
202
|
* `packages/core/core/src/services/document-service/internationalization.ts`)
|
|
205
203
|
* when the new locale row is first created.
|
|
206
204
|
* Baking the inheritance into `initialValues` here is what lets it survive
|
|
@@ -229,8 +227,8 @@ const getValidationSchema = (schema, components)=>{
|
|
|
229
227
|
// - Avoids coupling this hook to `useGetLocalesQuery` just to find the
|
|
230
228
|
// default locale.
|
|
231
229
|
const sibling = meta?.availableLocales?.[0];
|
|
232
|
-
if (sibling &&
|
|
233
|
-
const inherited =
|
|
230
|
+
if (sibling && nonLocalizedFieldsToInherit.length > 0) {
|
|
231
|
+
const inherited = nonLocalizedFieldsToInherit.reduce((acc, name)=>{
|
|
234
232
|
if (name in sibling) {
|
|
235
233
|
acc[name] = sibling[name];
|
|
236
234
|
}
|
|
@@ -248,7 +246,7 @@ const getValidationSchema = (schema, components)=>{
|
|
|
248
246
|
schema,
|
|
249
247
|
components,
|
|
250
248
|
meta?.availableLocales,
|
|
251
|
-
|
|
249
|
+
nonLocalizedFieldsToInherit
|
|
252
250
|
]);
|
|
253
251
|
const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;
|
|
254
252
|
const hasError = !!error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDocument.js","sources":["../../../admin/src/hooks/useDocument.ts"],"sourcesContent":["/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n *\n * The network is deduplicated, but the work done inside the hook is not: it can be mounted\n * by hundreds of fields at once, so anything expensive it derives must be cached outside of\n * the hook instance (see `getValidationSchema`).\n */\n\nimport * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n FormErrors,\n getYupValidationErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { type AnyData, transformDocument } from '../pages/EditView/utils/data';\nimport { createDefaultForm } from '../pages/EditView/utils/forms';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\nimport { useDocumentLayout } from './useDocumentLayout';\n\nimport type { FindOne } from '../../../shared/contracts/collection-types';\nimport type { ContentType } from '../../../shared/contracts/content-types';\nimport type { Modules } from '@strapi/types';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = FindOne.Response['data'];\n\ntype Schema = ContentType;\n\ntype ValidationSchema = ReturnType<typeof createYupSchema>;\n\n// Building the yup schema of a model clones a schema for every nested component and dynamic\n// zone: on large models it takes seconds and gigabytes. `schema` and `components` identities\n// are shared across hook instances (see `useContentTypeSchema`), so build it once per pair,\n// and only when something actually validates.\nconst validationSchemaCache = new WeakMap<\n Schema,\n WeakMap<ComponentsDictionary, ValidationSchema>\n>();\n\nconst getValidationSchema = (schema: Schema, components: ComponentsDictionary) => {\n let byComponents = validationSchemaCache.get(schema);\n\n if (!byComponents) {\n byComponents = new WeakMap();\n validationSchemaCache.set(schema, byComponents);\n }\n\n let validationSchema = byComponents.get(components);\n\n if (!validationSchema) {\n validationSchema = createYupSchema(schema.attributes, components);\n byComponents.set(components, validationSchema);\n }\n\n return validationSchema;\n};\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n schemas?: Schema[];\n hasError?: boolean;\n refetch: () => void;\n validate: (document: Document) => null | FormErrors;\n /**\n * Get the document's title\n */\n getTitle: (mainField: string) => string;\n /**\n * Get the initial form values for the document\n */\n getInitialFormValues: (isCreatingDocument?: boolean) => AnyData | undefined;\n};\n\n/**\n * Mirrors the server's `isLocalizedAttribute` in\n * `packages/plugins/i18n/server/src/services/content-types.ts`: an attribute\n * counts as localized only when `pluginOptions.i18n.localized` is explicitly\n * `true`. Both `false` and `undefined` mean \"non-localized\" — important here\n * because attributes created without the i18n plugin omit the field entirely,\n * and we still want them inherited when creating a new locale draft.\n */\nconst isLocalizedAttribute = (attribute: { pluginOptions?: object }): boolean => {\n // `pluginOptions` on the base attribute is typed as `object`, so we have to\n // narrow it to the i18n-specific shape here.\n const i18nOptions = attribute.pluginOptions as { i18n?: { localized?: boolean } } | undefined;\n return i18nOptions?.i18n?.localized === true;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n refetch,\n } = useGetDocumentQuery(args, {\n ...opts,\n skip: (!args.documentId && args.collectionType !== SINGLE_TYPES) || opts?.skip,\n });\n const document = data?.data;\n const meta = data?.meta;\n\n const {\n components,\n schema,\n schemas,\n isLoading: isLoadingSchema,\n } = useContentTypeSchema(args.model);\n const isSingleType = schema?.kind === 'singleType';\n\n const getTitle = React.useCallback(\n (mainField: string) => {\n // Always use mainField if it's not an id\n if (mainField !== 'id' && document?.[mainField]) {\n return document[mainField];\n }\n\n // When it's a singleType without a mainField, use the contentType displayName\n if (schema?.kind === 'singleType' && schema.info.displayName) {\n return formatMessage({\n id: schema.info.displayName,\n defaultMessage: schema.info.displayName,\n });\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n },\n [document, formatMessage, schema]\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [toggleNotification, error, formatAPIError, args.collectionType]);\n\n const validate = React.useCallback(\n (document: Modules.Documents.AnyDocument): FormErrors | null => {\n if (!schema) {\n throw new Error(\n 'There is no validation schema generated, this is likely due to the schema not being loaded yet.'\n );\n }\n\n const validationSchema = getValidationSchema(schema, components);\n\n try {\n validationSchema.validateSync(document, { abortEarly: false, strict: true });\n return null;\n } catch (error) {\n if (error instanceof ValidationError) {\n return getYupValidationErrors(error);\n }\n\n throw error;\n }\n },\n [schema, components]\n );\n\n /**\n * Schema attributes that should be inherited from a sibling locale when\n * creating a new locale draft.\n *\n * Scope intentionally matches what the server populates into\n * `meta.availableLocales` (see `packages/core/content-manager/server/src/services/document-metadata.ts`):\n * - non-localized — `isLocalizedAttribute` semantics, so attributes whose\n * `pluginOptions.i18n.localized` is `undefined` count as non-localized\n * (an attribute created without the i18n plugin has no i18n options at\n * all but is still inherited at save by `copyNonLocalizedFields`).\n * - scalar or media — `component` / `dynamiczone` / `relation` are excluded\n * because the server doesn't populate them in `availableLocales` either,\n * so there'd be nothing to copy from.\n */\n const nonLocalizedScalarAndMediaFields = React.useMemo(() => {\n if (!schema?.attributes) {\n return [];\n }\n\n return Object.keys(schema.attributes).filter((name) => {\n const attribute = schema.attributes[name];\n\n if (isLocalizedAttribute(attribute)) {\n return false;\n }\n\n return (\n attribute.type !== 'component' &&\n attribute.type !== 'dynamiczone' &&\n attribute.type !== 'relation'\n );\n });\n }, [schema]);\n\n /**\n * Here we prepare the form for editing, we need to:\n * - remove prohibited fields from the document (passwords | ADD YOURS WHEN THERES A NEW ONE)\n * - swap out count objects on relations for empty arrays\n * - set __temp_key__ on array objects for drag & drop\n *\n * We also prepare the form for new documents, so we need to:\n * - set default values on fields\n * - inherit non-localized scalar/media values from a sibling locale.\n * Scope is intentionally limited to scalars and media — that is exactly\n * what the server populates into `meta.availableLocales` (see\n * `packages/core/content-manager/server/src/services/document-metadata.ts`).\n * Components, dynamic zones, and relations are not in that payload; the\n * server fills them at save time via `copyNonLocalizedFields` (in\n * `packages/core/core/src/services/document-service/internationalization.ts`)\n * when the new locale row is first created.\n * Baking the inheritance into `initialValues` here is what lets it survive\n * `<Form>` re-inits: the `SET_INITIAL_VALUES` effect in\n * `packages/core/admin/admin/src/components/Form.tsx` re-applies these\n * values whenever `initialValues` changes (e.g. after a locale switch),\n * which the previous side-effect-based prefill in `LocalePickerAction`\n * could not survive on revisits.\n */\n const getInitialFormValues = React.useCallback(\n (isCreatingDocument: boolean = false) => {\n if ((!document && !isCreatingDocument && !isSingleType) || !schema) {\n return undefined;\n }\n\n /**\n * Check that we have an ID so we know the\n * document has been created in some way.\n */\n if (document?.id) {\n return transformDocument(schema, components)(document);\n }\n\n let form: AnyData = createDefaultForm(schema, components);\n\n // Intentionally use `availableLocales[0]`:\n // - The server sorts `getAvailableLocales` with the default locale first\n // (see `document-metadata.ts`), so index 0 is the canonical inheritance\n // source. Sibling locales can drift on non-localized fields because the\n // server only syncs them at locale-creation time, not on subsequent\n // updates — preferring the default keeps the surfaced values stable.\n // - Avoids coupling this hook to `useGetLocalesQuery` just to find the\n // default locale.\n const sibling = meta?.availableLocales?.[0] as Record<string, unknown> | undefined;\n if (sibling && nonLocalizedScalarAndMediaFields.length > 0) {\n const inherited = nonLocalizedScalarAndMediaFields.reduce<AnyData>((acc, name) => {\n if (name in sibling) {\n acc[name] = sibling[name];\n }\n return acc;\n }, {});\n\n form = { ...form, ...inherited };\n }\n\n return transformDocument(schema, components)(form);\n },\n [\n document,\n isSingleType,\n schema,\n components,\n meta?.availableLocales,\n nonLocalizedScalarAndMediaFields,\n ]\n );\n\n const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;\n const hasError = !!error;\n\n return React.useMemo(\n () =>\n ({\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n }) satisfies ReturnType<UseDocument>,\n [\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n ]\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDoc\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the router to extract the model, collection type & id from the url.\n * therefore, it shouldn't be used outside of the content-manager because it won't work as intended.\n */\nconst useDoc = (opts?: UseDocumentOpts) => {\n const { id, slug, collectionType, origin } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!slug) {\n throw new Error('Could not find model in url params');\n }\n\n const document = useDocument(\n { documentId: origin || id, model: slug, collectionType, params },\n {\n ...opts,\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES) || opts?.skip,\n }\n );\n\n const returnId = origin || (id === 'create' ? undefined : id);\n\n return {\n collectionType,\n model: slug,\n id: returnId,\n ...document,\n };\n};\n\n/**\n * @public\n * @experimental\n * Content manager context hooks for plugin development.\n * Make sure to use this hook inside the content manager.\n */\nconst useContentManagerContext = () => {\n const {\n collectionType,\n model,\n id,\n components,\n isLoading: isLoadingDoc,\n schema,\n schemas,\n } = useDoc();\n\n const layout = useDocumentLayout(model);\n\n const form = useForm<unknown>('useContentManagerContext', (state) => state);\n\n const isSingleType = collectionType === SINGLE_TYPES;\n const slug = model;\n const isCreatingEntry = id === 'create';\n\n useContentTypeSchema();\n\n const isLoading = isLoadingDoc || layout.isLoading;\n const error = layout.error;\n\n return {\n error,\n isLoading,\n\n // Base metadata\n model,\n collectionType,\n id,\n slug,\n isCreatingEntry,\n isSingleType,\n hasDraftAndPublish: schema?.options?.draftAndPublish ?? false,\n\n // All schema infos\n components,\n contentType: schema,\n contentTypes: schemas,\n\n // Form state\n form,\n\n // layout infos\n layout,\n };\n};\n\nexport { useDocument, useDoc, useContentManagerContext };\nexport type { UseDocument, UseDocumentArgs, Document, Schema, ComponentsDictionary };\n"],"names":["validationSchemaCache","WeakMap","getValidationSchema","schema","components","byComponents","get","set","validationSchema","createYupSchema","attributes","isLocalizedAttribute","attribute","i18nOptions","pluginOptions","i18n","localized","useDocument","args","opts","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","formatMessage","useIntl","currentData","data","isLoading","isLoadingDocument","isFetching","isFetchingDocument","error","refetch","useGetDocumentQuery","skip","documentId","collectionType","SINGLE_TYPES","document","meta","schemas","isLoadingSchema","useContentTypeSchema","model","isSingleType","kind","getTitle","React","useCallback","mainField","info","displayName","id","defaultMessage","useEffect","type","message","validate","Error","validateSync","abortEarly","strict","ValidationError","getYupValidationErrors","nonLocalizedScalarAndMediaFields","useMemo","Object","keys","filter","name","getInitialFormValues","isCreatingDocument","undefined","transformDocument","form","createDefaultForm","sibling","availableLocales","length","inherited","reduce","acc","hasError","useDoc","slug","origin","useParams","query","useQueryParams","params","buildValidParams","returnId","useContentManagerContext","isLoadingDoc","layout","useDocumentLayout","useForm","state","isCreatingEntry","hasDraftAndPublish","options","draftAndPublish","contentType","contentTypes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDA;AACA;AACA;AACA;AACA,MAAMA,wBAAwB,IAAIC,OAAAA,EAAAA;AAKlC,MAAMC,mBAAAA,GAAsB,CAACC,MAAAA,EAAgBC,UAAAA,GAAAA;IAC3C,IAAIC,YAAAA,GAAeL,qBAAAA,CAAsBM,GAAG,CAACH,MAAAA,CAAAA;AAE7C,IAAA,IAAI,CAACE,YAAAA,EAAc;AACjBA,QAAAA,YAAAA,GAAe,IAAIJ,OAAAA,EAAAA;QACnBD,qBAAAA,CAAsBO,GAAG,CAACJ,MAAAA,EAAQE,YAAAA,CAAAA;AACpC,IAAA;IAEA,IAAIG,gBAAAA,GAAmBH,YAAAA,CAAaC,GAAG,CAACF,UAAAA,CAAAA;AAExC,IAAA,IAAI,CAACI,gBAAAA,EAAkB;QACrBA,gBAAAA,GAAmBC,0BAAAA,CAAgBN,MAAAA,CAAOO,UAAU,EAAEN,UAAAA,CAAAA;QACtDC,YAAAA,CAAaE,GAAG,CAACH,UAAAA,EAAYI,gBAAAA,CAAAA;AAC/B,IAAA;IAEA,OAAOA,gBAAAA;AACT,CAAA;AAgCA;;;;;;;IAQA,MAAMG,uBAAuB,CAACC,SAAAA,GAAAA;;;IAG5B,MAAMC,WAAAA,GAAcD,UAAUE,aAAa;IAC3C,OAAOD,WAAAA,EAAaE,MAAMC,SAAAA,KAAc,IAAA;AAC1C,CAAA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8BA,MAAMC,WAAAA,GAA2B,CAACC,IAAAA,EAAMC,IAAAA,GAAAA;IACtC,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;AAC/B,IAAA,MAAM,EAAEC,uBAAAA,EAAyBC,cAAc,EAAE,GAAGC,8BAAAA,EAAAA;IACpD,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAE1B,IAAA,MAAM,EACJC,WAAAA,EAAaC,MAAI,EACjBC,SAAAA,EAAWC,iBAAiB,EAC5BC,UAAAA,EAAYC,kBAAkB,EAC9BC,KAAK,EACLC,OAAO,EACR,GAAGC,8BAAoBjB,IAAAA,EAAM;AAC5B,QAAA,GAAGC,IAAI;QACPiB,IAAAA,EAAO,CAAClB,IAAAA,CAAKmB,UAAU,IAAInB,IAAAA,CAAKoB,cAAc,KAAKC,wBAAAA,IAAiBpB,IAAAA,EAAMiB;AAC5E,KAAA,CAAA;AACA,IAAA,MAAMI,WAAWZ,MAAAA,EAAMA,IAAAA;AACvB,IAAA,MAAMa,OAAOb,MAAAA,EAAMa,IAAAA;AAEnB,IAAA,MAAM,EACJrC,UAAU,EACVD,MAAM,EACNuC,OAAO,EACPb,SAAAA,EAAWc,eAAe,EAC3B,GAAGC,yCAAAA,CAAqB1B,KAAK2B,KAAK,CAAA;IACnC,MAAMC,YAAAA,GAAe3C,QAAQ4C,IAAAA,KAAS,YAAA;AAEtC,IAAA,MAAMC,QAAAA,GAAWC,gBAAAA,CAAMC,WAAW,CAChC,CAACC,SAAAA,GAAAA;;AAEC,QAAA,IAAIA,SAAAA,KAAc,IAAA,IAAQX,QAAAA,GAAWW,UAAU,EAAE;YAC/C,OAAOX,QAAQ,CAACW,SAAAA,CAAU;AAC5B,QAAA;;AAGA,QAAA,IAAIhD,QAAQ4C,IAAAA,KAAS,YAAA,IAAgB5C,OAAOiD,IAAI,CAACC,WAAW,EAAE;AAC5D,YAAA,OAAO5B,aAAAA,CAAc;gBACnB6B,EAAAA,EAAInD,MAAAA,CAAOiD,IAAI,CAACC,WAAW;gBAC3BE,cAAAA,EAAgBpD,MAAAA,CAAOiD,IAAI,CAACC;AAC9B,aAAA,CAAA;AACF,QAAA;;AAGA,QAAA,OAAO5B,aAAAA,CAAc;YACnB6B,EAAAA,EAAI,qCAAA;YACJC,cAAAA,EAAgB;AAClB,SAAA,CAAA;IACF,CAAA,EACA;AAACf,QAAAA,QAAAA;AAAUf,QAAAA,aAAAA;AAAetB,QAAAA;AAAO,KAAA,CAAA;AAGnC8C,IAAAA,gBAAAA,CAAMO,SAAS,CAAC,IAAA;AACd,QAAA,IAAIvB,KAAAA,EAAO;YACTb,kBAAAA,CAAmB;gBACjBqC,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAASnC,cAAAA,CAAeU,KAAAA;AAC1B,aAAA,CAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACb,QAAAA,kBAAAA;AAAoBa,QAAAA,KAAAA;AAAOV,QAAAA,cAAAA;AAAgBL,QAAAA,IAAAA,CAAKoB;AAAe,KAAA,CAAA;AAEnE,IAAA,MAAMqB,QAAAA,GAAWV,gBAAAA,CAAMC,WAAW,CAChC,CAACV,QAAAA,GAAAA;AACC,QAAA,IAAI,CAACrC,MAAAA,EAAQ;AACX,YAAA,MAAM,IAAIyD,KAAAA,CACR,iGAAA,CAAA;AAEJ,QAAA;QAEA,MAAMpD,gBAAAA,GAAmBN,oBAAoBC,MAAAA,EAAQC,UAAAA,CAAAA;QAErD,IAAI;YACFI,gBAAAA,CAAiBqD,YAAY,CAACrB,QAAAA,EAAU;gBAAEsB,UAAAA,EAAY,KAAA;gBAAOC,MAAAA,EAAQ;AAAK,aAAA,CAAA;YAC1E,OAAO,IAAA;AACT,QAAA,CAAA,CAAE,OAAO9B,KAAAA,EAAO;AACd,YAAA,IAAIA,iBAAiB+B,mBAAAA,EAAiB;AACpC,gBAAA,OAAOC,kCAAAA,CAAuBhC,KAAAA,CAAAA;AAChC,YAAA;YAEA,MAAMA,KAAAA;AACR,QAAA;IACF,CAAA,EACA;AAAC9B,QAAAA,MAAAA;AAAQC,QAAAA;AAAW,KAAA,CAAA;AAGtB;;;;;;;;;;;;;AAaC,MACD,MAAM8D,gCAAAA,GAAmCjB,gBAAAA,CAAMkB,OAAO,CAAC,IAAA;QACrD,IAAI,CAAChE,QAAQO,UAAAA,EAAY;AACvB,YAAA,OAAO,EAAE;AACX,QAAA;QAEA,OAAO0D,MAAAA,CAAOC,IAAI,CAAClE,MAAAA,CAAOO,UAAU,CAAA,CAAE4D,MAAM,CAAC,CAACC,IAAAA,GAAAA;AAC5C,YAAA,MAAM3D,SAAAA,GAAYT,MAAAA,CAAOO,UAAU,CAAC6D,IAAAA,CAAK;AAEzC,YAAA,IAAI5D,qBAAqBC,SAAAA,CAAAA,EAAY;gBACnC,OAAO,KAAA;AACT,YAAA;YAEA,OACEA,SAAAA,CAAU6C,IAAI,KAAK,WAAA,IACnB7C,SAAAA,CAAU6C,IAAI,KAAK,aAAA,IACnB7C,SAAAA,CAAU6C,IAAI,KAAK,UAAA;AAEvB,QAAA,CAAA,CAAA;IACF,CAAA,EAAG;AAACtD,QAAAA;AAAO,KAAA,CAAA;AAEX;;;;;;;;;;;;;;;;;;;;;;AAsBC,MACD,MAAMqE,oBAAAA,GAAuBvB,gBAAAA,CAAMC,WAAW,CAC5C,CAACuB,qBAA8B,KAAK,GAAA;QAClC,IAAK,CAACjC,QAAAA,IAAY,CAACiC,sBAAsB,CAAC3B,YAAAA,IAAiB,CAAC3C,MAAAA,EAAQ;YAClE,OAAOuE,SAAAA;AACT,QAAA;AAEA;;;UAIA,IAAIlC,UAAUc,EAAAA,EAAI;YAChB,OAAOqB,sBAAAA,CAAkBxE,QAAQC,UAAAA,CAAAA,CAAYoC,QAAAA,CAAAA;AAC/C,QAAA;QAEA,IAAIoC,IAAAA,GAAgBC,wBAAkB1E,MAAAA,EAAQC,UAAAA,CAAAA;;;;;;;;;AAU9C,QAAA,MAAM0E,OAAAA,GAAUrC,IAAAA,EAAMsC,gBAAAA,GAAmB,CAAA,CAAE;AAC3C,QAAA,IAAID,OAAAA,IAAWZ,gCAAAA,CAAiCc,MAAM,GAAG,CAAA,EAAG;AAC1D,YAAA,MAAMC,SAAAA,GAAYf,gCAAAA,CAAiCgB,MAAM,CAAU,CAACC,GAAAA,EAAKZ,IAAAA,GAAAA;AACvE,gBAAA,IAAIA,QAAQO,OAAAA,EAAS;AACnBK,oBAAAA,GAAG,CAACZ,IAAAA,CAAK,GAAGO,OAAO,CAACP,IAAAA,CAAK;AAC3B,gBAAA;gBACA,OAAOY,GAAAA;AACT,YAAA,CAAA,EAAG,EAAC,CAAA;YAEJP,IAAAA,GAAO;AAAE,gBAAA,GAAGA,IAAI;AAAE,gBAAA,GAAGK;AAAU,aAAA;AACjC,QAAA;QAEA,OAAON,sBAAAA,CAAkBxE,QAAQC,UAAAA,CAAAA,CAAYwE,IAAAA,CAAAA;IAC/C,CAAA,EACA;AACEpC,QAAAA,QAAAA;AACAM,QAAAA,YAAAA;AACA3C,QAAAA,MAAAA;AACAC,QAAAA,UAAAA;QACAqC,IAAAA,EAAMsC,gBAAAA;AACNb,QAAAA;AACD,KAAA,CAAA;IAGH,MAAMrC,SAAAA,GAAYC,qBAAqBE,kBAAAA,IAAsBW,eAAAA;IAC7D,MAAMyC,QAAAA,GAAW,CAAC,CAACnD,KAAAA;AAEnB,IAAA,OAAOgB,gBAAAA,CAAMkB,OAAO,CAClB,KACG;AACC/D,YAAAA,UAAAA;AACAoC,YAAAA,QAAAA;AACAC,YAAAA,IAAAA;AACAZ,YAAAA,SAAAA;AACAuD,YAAAA,QAAAA;AACAjF,YAAAA,MAAAA;AACAuC,YAAAA,OAAAA;AACAiB,YAAAA,QAAAA;AACAX,YAAAA,QAAAA;AACAwB,YAAAA,oBAAAA;AACAtC,YAAAA;AACF,SAAA,CAAA,EACF;AACE9B,QAAAA,UAAAA;AACAoC,QAAAA,QAAAA;AACAC,QAAAA,IAAAA;AACAZ,QAAAA,SAAAA;AACAuD,QAAAA,QAAAA;AACAjF,QAAAA,MAAAA;AACAuC,QAAAA,OAAAA;AACAiB,QAAAA,QAAAA;AACAX,QAAAA,QAAAA;AACAwB,QAAAA,oBAAAA;AACAtC,QAAAA;AACD,KAAA,CAAA;AAEL;AAEA;;;;;IAQA,MAAMmD,SAAS,CAAClE,IAAAA,GAAAA;IACd,MAAM,EAAEmC,EAAE,EAAEgC,IAAI,EAAEhD,cAAc,EAAEiD,MAAM,EAAE,GAAGC,wBAAAA,EAAAA;AAM7C,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,CAAC,GAAGC,0BAAAA,EAAAA;AACpB,IAAA,MAAMC,SAAS1C,gBAAAA,CAAMkB,OAAO,CAAC,IAAMyB,qBAAiBH,KAAAA,CAAAA,EAAQ;AAACA,QAAAA;AAAM,KAAA,CAAA;AAEnE,IAAA,IAAI,CAACnD,cAAAA,EAAgB;AACnB,QAAA,MAAM,IAAIsB,KAAAA,CAAM,6CAAA,CAAA;AAClB,IAAA;AAEA,IAAA,IAAI,CAAC0B,IAAAA,EAAM;AACT,QAAA,MAAM,IAAI1B,KAAAA,CAAM,oCAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAMpB,WAAWvB,WAAAA,CACf;AAAEoB,QAAAA,UAAAA,EAAYkD,MAAAA,IAAUjC,EAAAA;QAAIT,KAAAA,EAAOyC,IAAAA;AAAMhD,QAAAA,cAAAA;AAAgBqD,QAAAA;KAAO,EAChE;AACE,QAAA,GAAGxE,IAAI;QACPiB,IAAAA,EAAMkB,EAAAA,KAAO,YAAa,CAACiC,MAAAA,IAAU,CAACjC,EAAAA,IAAMhB,cAAAA,KAAmBC,4BAAiBpB,IAAAA,EAAMiB;AACxF,KAAA,CAAA;AAGF,IAAA,MAAMyD,WAAWN,MAAAA,KAAWjC,EAAAA,KAAO,QAAA,GAAWoB,YAAYpB,EAAC,CAAA;IAE3D,OAAO;AACLhB,QAAAA,cAAAA;QACAO,KAAAA,EAAOyC,IAAAA;QACPhC,EAAAA,EAAIuC,QAAAA;AACJ,QAAA,GAAGrD;AACL,KAAA;AACF;AAEA;;;;;AAKC,UACKsD,wBAAAA,GAA2B,IAAA;AAC/B,IAAA,MAAM,EACJxD,cAAc,EACdO,KAAK,EACLS,EAAE,EACFlD,UAAU,EACVyB,SAAAA,EAAWkE,YAAY,EACvB5F,MAAM,EACNuC,OAAO,EACR,GAAG2C,MAAAA,EAAAA;AAEJ,IAAA,MAAMW,SAASC,mCAAAA,CAAkBpD,KAAAA,CAAAA;AAEjC,IAAA,MAAM+B,IAAAA,GAAOsB,mBAAAA,CAAiB,0BAAA,EAA4B,CAACC,KAAAA,GAAUA,KAAAA,CAAAA;AAErE,IAAA,MAAMrD,eAAeR,cAAAA,KAAmBC,wBAAAA;AACxC,IAAA,MAAM+C,IAAAA,GAAOzC,KAAAA;AACb,IAAA,MAAMuD,kBAAkB9C,EAAAA,KAAO,QAAA;AAE/BV,IAAAA,yCAAAA,EAAAA;IAEA,MAAMf,SAAAA,GAAYkE,YAAAA,IAAgBC,MAAAA,CAAOnE,SAAS;IAClD,MAAMI,KAAAA,GAAQ+D,OAAO/D,KAAK;IAE1B,OAAO;AACLA,QAAAA,KAAAA;AACAJ,QAAAA,SAAAA;;AAGAgB,QAAAA,KAAAA;AACAP,QAAAA,cAAAA;AACAgB,QAAAA,EAAAA;AACAgC,QAAAA,IAAAA;AACAc,QAAAA,eAAAA;AACAtD,QAAAA,YAAAA;QACAuD,kBAAAA,EAAoBlG,MAAAA,EAAQmG,SAASC,eAAAA,IAAmB,KAAA;;AAGxDnG,QAAAA,UAAAA;QACAoG,WAAAA,EAAarG,MAAAA;QACbsG,YAAAA,EAAc/D,OAAAA;;AAGdkC,QAAAA,IAAAA;;AAGAoB,QAAAA;AACF,KAAA;AACF;;;;;;"}
|
|
1
|
+
{"version":3,"file":"useDocument.js","sources":["../../../admin/src/hooks/useDocument.ts"],"sourcesContent":["/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n *\n * The network is deduplicated, but the work done inside the hook is not: it can be mounted\n * by hundreds of fields at once, so anything expensive it derives must be cached outside of\n * the hook instance (see `getValidationSchema`).\n */\n\nimport * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n FormErrors,\n getYupValidationErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { type AnyData, transformDocument } from '../pages/EditView/utils/data';\nimport { createDefaultForm } from '../pages/EditView/utils/forms';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\nimport { useDocumentLayout } from './useDocumentLayout';\n\nimport type { FindOne } from '../../../shared/contracts/collection-types';\nimport type { ContentType } from '../../../shared/contracts/content-types';\nimport type { Modules } from '@strapi/types';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = FindOne.Response['data'];\n\ntype Schema = ContentType;\n\ntype ValidationSchema = ReturnType<typeof createYupSchema>;\n\n// Building the yup schema of a model clones a schema for every nested component and dynamic\n// zone: on large models it takes seconds and gigabytes. `schema` and `components` identities\n// are shared across hook instances (see `useContentTypeSchema`), so build it once per pair,\n// and only when something actually validates.\nconst validationSchemaCache = new WeakMap<\n Schema,\n WeakMap<ComponentsDictionary, ValidationSchema>\n>();\n\nconst getValidationSchema = (schema: Schema, components: ComponentsDictionary) => {\n let byComponents = validationSchemaCache.get(schema);\n\n if (!byComponents) {\n byComponents = new WeakMap();\n validationSchemaCache.set(schema, byComponents);\n }\n\n let validationSchema = byComponents.get(components);\n\n if (!validationSchema) {\n validationSchema = createYupSchema(schema.attributes, components);\n byComponents.set(components, validationSchema);\n }\n\n return validationSchema;\n};\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n schemas?: Schema[];\n hasError?: boolean;\n refetch: () => void;\n validate: (document: Document) => null | FormErrors;\n /**\n * Get the document's title\n */\n getTitle: (mainField: string) => string;\n /**\n * Get the initial form values for the document\n */\n getInitialFormValues: (isCreatingDocument?: boolean) => AnyData | undefined;\n};\n\n/**\n * Mirrors the server's `isLocalizedAttribute` in\n * `packages/plugins/i18n/server/src/services/content-types.ts`: an attribute\n * counts as localized only when `pluginOptions.i18n.localized` is explicitly\n * `true`. Both `false` and `undefined` mean \"non-localized\" — important here\n * because attributes created without the i18n plugin omit the field entirely,\n * and we still want them inherited when creating a new locale draft.\n */\nconst isLocalizedAttribute = (attribute: { pluginOptions?: object }): boolean => {\n // `pluginOptions` on the base attribute is typed as `object`, so we have to\n // narrow it to the i18n-specific shape here.\n const i18nOptions = attribute.pluginOptions as { i18n?: { localized?: boolean } } | undefined;\n return i18nOptions?.i18n?.localized === true;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n refetch,\n } = useGetDocumentQuery(args, {\n ...opts,\n skip: (!args.documentId && args.collectionType !== SINGLE_TYPES) || opts?.skip,\n });\n const document = data?.data;\n const meta = data?.meta;\n\n const {\n components,\n schema,\n schemas,\n isLoading: isLoadingSchema,\n } = useContentTypeSchema(args.model);\n const isSingleType = schema?.kind === 'singleType';\n\n const getTitle = React.useCallback(\n (mainField: string) => {\n // Always use mainField if it's not an id\n if (mainField !== 'id' && document?.[mainField]) {\n return document[mainField];\n }\n\n // When it's a singleType without a mainField, use the contentType displayName\n if (schema?.kind === 'singleType' && schema.info.displayName) {\n return formatMessage({\n id: schema.info.displayName,\n defaultMessage: schema.info.displayName,\n });\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n },\n [document, formatMessage, schema]\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [toggleNotification, error, formatAPIError, args.collectionType]);\n\n const validate = React.useCallback(\n (document: Modules.Documents.AnyDocument): FormErrors | null => {\n if (!schema) {\n throw new Error(\n 'There is no validation schema generated, this is likely due to the schema not being loaded yet.'\n );\n }\n\n const validationSchema = getValidationSchema(schema, components);\n\n try {\n validationSchema.validateSync(document, { abortEarly: false, strict: true });\n return null;\n } catch (error) {\n if (error instanceof ValidationError) {\n return getYupValidationErrors(error);\n }\n\n throw error;\n }\n },\n [schema, components]\n );\n\n /**\n * Schema attributes that should be inherited from a sibling locale when\n * creating a new locale draft.\n *\n * Scope intentionally matches what the server populates into\n * `meta.availableLocales` (see `packages/core/content-manager/server/src/services/document-metadata.ts`):\n * - non-localized — `isLocalizedAttribute` semantics, so attributes whose\n * `pluginOptions.i18n.localized` is `undefined` count as non-localized\n * (an attribute created without the i18n plugin has no i18n options at\n * all but is still inherited at save by `copyNonLocalizedFields`).\n * - scalar, media, component, or dynamic zone — relations are excluded\n * because the server doesn't populate them in `availableLocales` either.\n */\n const nonLocalizedFieldsToInherit = React.useMemo(() => {\n if (!schema?.attributes) {\n return [];\n }\n\n return Object.keys(schema.attributes).filter((name) => {\n const attribute = schema.attributes[name];\n\n if (isLocalizedAttribute(attribute)) {\n return false;\n }\n\n return attribute.type !== 'relation';\n });\n }, [schema]);\n\n /**\n * Here we prepare the form for editing, we need to:\n * - remove prohibited fields from the document (passwords | ADD YOURS WHEN THERES A NEW ONE)\n * - swap out count objects on relations for empty arrays\n * - set __temp_key__ on array objects for drag & drop\n *\n * We also prepare the form for new documents, so we need to:\n * - set default values on fields\n * - inherit non-localized scalar/media/component/dynamic-zone values from a sibling locale.\n * Scope matches what the server populates into `meta.availableLocales` (see\n * `packages/core/content-manager/server/src/services/document-metadata.ts`).\n * Relations are not in that payload; the server fills them at save time via\n * `copyNonLocalizedFields` (in\n * `packages/core/core/src/services/document-service/internationalization.ts`)\n * when the new locale row is first created.\n * Baking the inheritance into `initialValues` here is what lets it survive\n * `<Form>` re-inits: the `SET_INITIAL_VALUES` effect in\n * `packages/core/admin/admin/src/components/Form.tsx` re-applies these\n * values whenever `initialValues` changes (e.g. after a locale switch),\n * which the previous side-effect-based prefill in `LocalePickerAction`\n * could not survive on revisits.\n */\n const getInitialFormValues = React.useCallback(\n (isCreatingDocument: boolean = false) => {\n if ((!document && !isCreatingDocument && !isSingleType) || !schema) {\n return undefined;\n }\n\n /**\n * Check that we have an ID so we know the\n * document has been created in some way.\n */\n if (document?.id) {\n return transformDocument(schema, components)(document);\n }\n\n let form: AnyData = createDefaultForm(schema, components);\n\n // Intentionally use `availableLocales[0]`:\n // - The server sorts `getAvailableLocales` with the default locale first\n // (see `document-metadata.ts`), so index 0 is the canonical inheritance\n // source. Sibling locales can drift on non-localized fields because the\n // server only syncs them at locale-creation time, not on subsequent\n // updates — preferring the default keeps the surfaced values stable.\n // - Avoids coupling this hook to `useGetLocalesQuery` just to find the\n // default locale.\n const sibling = meta?.availableLocales?.[0] as Record<string, unknown> | undefined;\n if (sibling && nonLocalizedFieldsToInherit.length > 0) {\n const inherited = nonLocalizedFieldsToInherit.reduce<AnyData>((acc, name) => {\n if (name in sibling) {\n acc[name] = sibling[name];\n }\n return acc;\n }, {});\n\n form = { ...form, ...inherited };\n }\n\n return transformDocument(schema, components)(form);\n },\n [\n document,\n isSingleType,\n schema,\n components,\n meta?.availableLocales,\n nonLocalizedFieldsToInherit,\n ]\n );\n\n const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;\n const hasError = !!error;\n\n return React.useMemo(\n () =>\n ({\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n }) satisfies ReturnType<UseDocument>,\n [\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n ]\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDoc\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the router to extract the model, collection type & id from the url.\n * therefore, it shouldn't be used outside of the content-manager because it won't work as intended.\n */\nconst useDoc = (opts?: UseDocumentOpts) => {\n const { id, slug, collectionType, origin } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!slug) {\n throw new Error('Could not find model in url params');\n }\n\n const document = useDocument(\n { documentId: origin || id, model: slug, collectionType, params },\n {\n ...opts,\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES) || opts?.skip,\n }\n );\n\n const returnId = origin || (id === 'create' ? undefined : id);\n\n return {\n collectionType,\n model: slug,\n id: returnId,\n ...document,\n };\n};\n\n/**\n * @public\n * @experimental\n * Content manager context hooks for plugin development.\n * Make sure to use this hook inside the content manager.\n */\nconst useContentManagerContext = () => {\n const {\n collectionType,\n model,\n id,\n components,\n isLoading: isLoadingDoc,\n schema,\n schemas,\n } = useDoc();\n\n const layout = useDocumentLayout(model);\n\n const form = useForm<unknown>('useContentManagerContext', (state) => state);\n\n const isSingleType = collectionType === SINGLE_TYPES;\n const slug = model;\n const isCreatingEntry = id === 'create';\n\n useContentTypeSchema();\n\n const isLoading = isLoadingDoc || layout.isLoading;\n const error = layout.error;\n\n return {\n error,\n isLoading,\n\n // Base metadata\n model,\n collectionType,\n id,\n slug,\n isCreatingEntry,\n isSingleType,\n hasDraftAndPublish: schema?.options?.draftAndPublish ?? false,\n\n // All schema infos\n components,\n contentType: schema,\n contentTypes: schemas,\n\n // Form state\n form,\n\n // layout infos\n layout,\n };\n};\n\nexport { useDocument, useDoc, useContentManagerContext };\nexport type { UseDocument, UseDocumentArgs, Document, Schema, ComponentsDictionary };\n"],"names":["validationSchemaCache","WeakMap","getValidationSchema","schema","components","byComponents","get","set","validationSchema","createYupSchema","attributes","isLocalizedAttribute","attribute","i18nOptions","pluginOptions","i18n","localized","useDocument","args","opts","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","formatMessage","useIntl","currentData","data","isLoading","isLoadingDocument","isFetching","isFetchingDocument","error","refetch","useGetDocumentQuery","skip","documentId","collectionType","SINGLE_TYPES","document","meta","schemas","isLoadingSchema","useContentTypeSchema","model","isSingleType","kind","getTitle","React","useCallback","mainField","info","displayName","id","defaultMessage","useEffect","type","message","validate","Error","validateSync","abortEarly","strict","ValidationError","getYupValidationErrors","nonLocalizedFieldsToInherit","useMemo","Object","keys","filter","name","getInitialFormValues","isCreatingDocument","undefined","transformDocument","form","createDefaultForm","sibling","availableLocales","length","inherited","reduce","acc","hasError","useDoc","slug","origin","useParams","query","useQueryParams","params","buildValidParams","returnId","useContentManagerContext","isLoadingDoc","layout","useDocumentLayout","useForm","state","isCreatingEntry","hasDraftAndPublish","options","draftAndPublish","contentType","contentTypes"],"mappings":"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"}
|
|
@@ -148,10 +148,9 @@ const getValidationSchema = (schema, components)=>{
|
|
|
148
148
|
* `pluginOptions.i18n.localized` is `undefined` count as non-localized
|
|
149
149
|
* (an attribute created without the i18n plugin has no i18n options at
|
|
150
150
|
* all but is still inherited at save by `copyNonLocalizedFields`).
|
|
151
|
-
* - scalar
|
|
152
|
-
* because the server doesn't populate them in `availableLocales` either
|
|
153
|
-
|
|
154
|
-
*/ const nonLocalizedScalarAndMediaFields = React.useMemo(()=>{
|
|
151
|
+
* - scalar, media, component, or dynamic zone — relations are excluded
|
|
152
|
+
* because the server doesn't populate them in `availableLocales` either.
|
|
153
|
+
*/ const nonLocalizedFieldsToInherit = React.useMemo(()=>{
|
|
155
154
|
if (!schema?.attributes) {
|
|
156
155
|
return [];
|
|
157
156
|
}
|
|
@@ -160,7 +159,7 @@ const getValidationSchema = (schema, components)=>{
|
|
|
160
159
|
if (isLocalizedAttribute(attribute)) {
|
|
161
160
|
return false;
|
|
162
161
|
}
|
|
163
|
-
return attribute.type !== '
|
|
162
|
+
return attribute.type !== 'relation';
|
|
164
163
|
});
|
|
165
164
|
}, [
|
|
166
165
|
schema
|
|
@@ -173,12 +172,11 @@ const getValidationSchema = (schema, components)=>{
|
|
|
173
172
|
*
|
|
174
173
|
* We also prepare the form for new documents, so we need to:
|
|
175
174
|
* - set default values on fields
|
|
176
|
-
* - inherit non-localized scalar/media values from a sibling locale.
|
|
177
|
-
* Scope
|
|
178
|
-
* what the server populates into `meta.availableLocales` (see
|
|
175
|
+
* - inherit non-localized scalar/media/component/dynamic-zone values from a sibling locale.
|
|
176
|
+
* Scope matches what the server populates into `meta.availableLocales` (see
|
|
179
177
|
* `packages/core/content-manager/server/src/services/document-metadata.ts`).
|
|
180
|
-
*
|
|
181
|
-
*
|
|
178
|
+
* Relations are not in that payload; the server fills them at save time via
|
|
179
|
+
* `copyNonLocalizedFields` (in
|
|
182
180
|
* `packages/core/core/src/services/document-service/internationalization.ts`)
|
|
183
181
|
* when the new locale row is first created.
|
|
184
182
|
* Baking the inheritance into `initialValues` here is what lets it survive
|
|
@@ -207,8 +205,8 @@ const getValidationSchema = (schema, components)=>{
|
|
|
207
205
|
// - Avoids coupling this hook to `useGetLocalesQuery` just to find the
|
|
208
206
|
// default locale.
|
|
209
207
|
const sibling = meta?.availableLocales?.[0];
|
|
210
|
-
if (sibling &&
|
|
211
|
-
const inherited =
|
|
208
|
+
if (sibling && nonLocalizedFieldsToInherit.length > 0) {
|
|
209
|
+
const inherited = nonLocalizedFieldsToInherit.reduce((acc, name)=>{
|
|
212
210
|
if (name in sibling) {
|
|
213
211
|
acc[name] = sibling[name];
|
|
214
212
|
}
|
|
@@ -226,7 +224,7 @@ const getValidationSchema = (schema, components)=>{
|
|
|
226
224
|
schema,
|
|
227
225
|
components,
|
|
228
226
|
meta?.availableLocales,
|
|
229
|
-
|
|
227
|
+
nonLocalizedFieldsToInherit
|
|
230
228
|
]);
|
|
231
229
|
const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;
|
|
232
230
|
const hasError = !!error;
|