@strapi/content-manager 0.0.0-experimental.2a7cb5ff33df35e8ccde5ef918f9f9a4a3ee9a08 → 0.0.0-experimental.312e2942332daff7ae98a4f357d1913a4ae5e1ef
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/LICENSE +18 -3
- package/dist/_chunks/{ComponentConfigurationPage-BvHtG7uH.js → ComponentConfigurationPage-BfOUhLa9.js} +3 -3
- package/dist/_chunks/{ComponentConfigurationPage-BvHtG7uH.js.map → ComponentConfigurationPage-BfOUhLa9.js.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-DHNM3YBz.mjs → ComponentConfigurationPage-DgDrdk-k.mjs} +3 -3
- package/dist/_chunks/{ComponentConfigurationPage-DHNM3YBz.mjs.map → ComponentConfigurationPage-DgDrdk-k.mjs.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-DOmfCEMo.js → EditConfigurationPage-BcXQLYY9.js} +3 -3
- package/dist/_chunks/{EditConfigurationPage-DOmfCEMo.js.map → EditConfigurationPage-BcXQLYY9.js.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-Cp6HAEzN.mjs → EditConfigurationPage-CjV1kPAw.mjs} +3 -3
- package/dist/_chunks/{EditConfigurationPage-Cp6HAEzN.mjs.map → EditConfigurationPage-CjV1kPAw.mjs.map} +1 -1
- package/dist/_chunks/{EditViewPage-BqNpC6hO.js → EditViewPage-BOeuvemd.js} +19 -8
- package/dist/_chunks/EditViewPage-BOeuvemd.js.map +1 -0
- package/dist/_chunks/{EditViewPage-BtkEx339.mjs → EditViewPage-s_bjnR0M.mjs} +19 -8
- package/dist/_chunks/EditViewPage-s_bjnR0M.mjs.map +1 -0
- package/dist/_chunks/{Field-lsPFnAmH.js → Field-CvfOxLel.js} +196 -143
- package/dist/_chunks/Field-CvfOxLel.js.map +1 -0
- package/dist/_chunks/{Field-R5NbffTB.mjs → Field-D9nHkdjy.mjs} +194 -141
- package/dist/_chunks/Field-D9nHkdjy.mjs.map +1 -0
- package/dist/_chunks/{Form-CcGboku8.js → Form-BKnDhP2B.js} +35 -16
- package/dist/_chunks/Form-BKnDhP2B.js.map +1 -0
- package/dist/_chunks/{Form-BHmXSfyy.mjs → Form-G4C35wJ4.mjs} +35 -16
- package/dist/_chunks/Form-G4C35wJ4.mjs.map +1 -0
- package/dist/_chunks/{History-Bsud8jwh.js → History-BIYOzHws.js} +28 -18
- package/dist/_chunks/History-BIYOzHws.js.map +1 -0
- package/dist/_chunks/{History-ByUPL3T3.mjs → History-FWwaCNUD.mjs} +28 -18
- package/dist/_chunks/History-FWwaCNUD.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-Bm5HACXf.mjs → ListConfigurationPage-BbOp66T2.mjs} +20 -8
- package/dist/_chunks/ListConfigurationPage-BbOp66T2.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-DiT463qx.js → ListConfigurationPage-N7prXhOp.js} +20 -8
- package/dist/_chunks/ListConfigurationPage-N7prXhOp.js.map +1 -0
- package/dist/_chunks/{ListViewPage-JSyNAAYu.mjs → ListViewPage-DTSW3r3X.mjs} +46 -37
- package/dist/_chunks/ListViewPage-DTSW3r3X.mjs.map +1 -0
- package/dist/_chunks/{ListViewPage-CsrC9L_d.js → ListViewPage-Djc5M_c0.js} +48 -39
- package/dist/_chunks/ListViewPage-Djc5M_c0.js.map +1 -0
- package/dist/_chunks/{NoContentTypePage-CsrQUpBE.mjs → NoContentTypePage-A-6Pk0le.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-CsrQUpBE.mjs.map → NoContentTypePage-A-6Pk0le.mjs.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-Bsvng4II.js → NoContentTypePage-DCX-hEMB.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-Bsvng4II.js.map → NoContentTypePage-DCX-hEMB.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-DNmf_pj0.mjs → NoPermissionsPage-B0vWytDx.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-DNmf_pj0.mjs.map → NoPermissionsPage-B0vWytDx.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-CdHNJtEf.js → NoPermissionsPage-PfJfspJV.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-CdHNJtEf.js.map → NoPermissionsPage-PfJfspJV.js.map} +1 -1
- package/dist/_chunks/{Relations-CghaPv2D.js → Relations--9jwQ8HV.js} +4 -4
- package/dist/_chunks/Relations--9jwQ8HV.js.map +1 -0
- package/dist/_chunks/{Relations-u8-37jK0.mjs → Relations-Ccdfw1dU.mjs} +4 -4
- package/dist/_chunks/Relations-Ccdfw1dU.mjs.map +1 -0
- package/dist/_chunks/{en-fbKQxLGn.js → en-BVzUkPxZ.js} +10 -8
- package/dist/_chunks/{en-fbKQxLGn.js.map → en-BVzUkPxZ.js.map} +1 -1
- package/dist/_chunks/{en-Ux26r5pl.mjs → en-CPTj6CjC.mjs} +10 -8
- package/dist/_chunks/{en-Ux26r5pl.mjs.map → en-CPTj6CjC.mjs.map} +1 -1
- package/dist/_chunks/{index-CaE6NG4a.mjs → index-BwqXeHiv.mjs} +439 -205
- package/dist/_chunks/index-BwqXeHiv.mjs.map +1 -0
- package/dist/_chunks/{index-BOZx6IMg.js → index-jun-ZqyN.js} +420 -186
- package/dist/_chunks/index-jun-ZqyN.js.map +1 -0
- package/dist/_chunks/{layout-Bx7svTbY.mjs → layout-BV5oiZQ9.mjs} +23 -10
- package/dist/_chunks/layout-BV5oiZQ9.mjs.map +1 -0
- package/dist/_chunks/{layout-Ciz224q5.js → layout-T2xBqmuZ.js} +22 -9
- package/dist/_chunks/layout-T2xBqmuZ.js.map +1 -0
- package/dist/_chunks/{relations-CP8sB2YZ.js → relations-D8jegO_8.js} +2 -2
- package/dist/_chunks/{relations-CP8sB2YZ.js.map → relations-D8jegO_8.js.map} +1 -1
- package/dist/_chunks/{relations-Cxc1cEv3.mjs → relations-wAeF76DP.mjs} +2 -2
- package/dist/_chunks/{relations-Cxc1cEv3.mjs.map → relations-wAeF76DP.mjs.map} +1 -1
- package/dist/_chunks/{usePrev-B9w_-eYc.js → useDebounce-CtcjDB3L.js} +14 -1
- package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -0
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs +29 -0
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +4 -4
- package/dist/admin/src/history/index.d.ts +3 -0
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/index.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations.d.ts +20 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +4 -48
- package/dist/admin/src/pages/EditView/components/Header.d.ts +10 -11
- 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 +19 -17
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +2 -2
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/admin/src/utils/validation.d.ts +4 -1
- package/dist/server/index.js +177 -107
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +178 -108
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/uid.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/dimensions.d.ts +4 -2
- package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
- package/dist/server/src/history/services/history.d.ts.map +1 -1
- package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts +2 -1
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/policies/hasPermissions.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.map +1 -1
- package/dist/server/src/services/permission-checker.d.ts.map +1 -1
- package/dist/server/src/services/utils/populate.d.ts.map +1 -1
- package/dist/shared/contracts/collection-types.d.ts +3 -1
- package/dist/shared/contracts/collection-types.d.ts.map +1 -1
- package/package.json +9 -9
- package/dist/_chunks/EditViewPage-BqNpC6hO.js.map +0 -1
- package/dist/_chunks/EditViewPage-BtkEx339.mjs.map +0 -1
- package/dist/_chunks/Field-R5NbffTB.mjs.map +0 -1
- package/dist/_chunks/Field-lsPFnAmH.js.map +0 -1
- package/dist/_chunks/Form-BHmXSfyy.mjs.map +0 -1
- package/dist/_chunks/Form-CcGboku8.js.map +0 -1
- package/dist/_chunks/History-Bsud8jwh.js.map +0 -1
- package/dist/_chunks/History-ByUPL3T3.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-Bm5HACXf.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-DiT463qx.js.map +0 -1
- package/dist/_chunks/ListViewPage-CsrC9L_d.js.map +0 -1
- package/dist/_chunks/ListViewPage-JSyNAAYu.mjs.map +0 -1
- package/dist/_chunks/Relations-CghaPv2D.js.map +0 -1
- package/dist/_chunks/Relations-u8-37jK0.mjs.map +0 -1
- package/dist/_chunks/index-BOZx6IMg.js.map +0 -1
- package/dist/_chunks/index-CaE6NG4a.mjs.map +0 -1
- package/dist/_chunks/layout-Bx7svTbY.mjs.map +0 -1
- package/dist/_chunks/layout-Ciz224q5.js.map +0 -1
- package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
- package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
- package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
@@ -2,15 +2,15 @@
|
|
2
2
|
const Icons = require("@strapi/icons");
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
4
4
|
const strapiAdmin = require("@strapi/admin/strapi-admin");
|
5
|
-
const qs = require("qs");
|
6
|
-
const reactIntl = require("react-intl");
|
7
|
-
const reactRouterDom = require("react-router-dom");
|
8
5
|
const React = require("react");
|
9
6
|
const designSystem = require("@strapi/design-system");
|
10
|
-
const
|
7
|
+
const reactIntl = require("react-intl");
|
8
|
+
const reactRouterDom = require("react-router-dom");
|
11
9
|
const yup = require("yup");
|
12
10
|
const pipe = require("lodash/fp/pipe");
|
13
11
|
const dateFns = require("date-fns");
|
12
|
+
const styledComponents = require("styled-components");
|
13
|
+
const qs = require("qs");
|
14
14
|
const toolkit = require("@reduxjs/toolkit");
|
15
15
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
16
16
|
function _interopNamespace(e) {
|
@@ -70,42 +70,6 @@ const useInjectionZone = (area) => {
|
|
70
70
|
const [page, position] = area.split(".");
|
71
71
|
return contentManagerPlugin.getInjectedComponents(page, position);
|
72
72
|
};
|
73
|
-
const HistoryAction = ({ model, document }) => {
|
74
|
-
const { formatMessage } = reactIntl.useIntl();
|
75
|
-
const [{ query }] = strapiAdmin.useQueryParams();
|
76
|
-
const navigate = reactRouterDom.useNavigate();
|
77
|
-
const pluginsQueryParams = qs.stringify({ plugins: query.plugins }, { encode: false });
|
78
|
-
if (!window.strapi.features.isEnabled("cms-content-history")) {
|
79
|
-
return null;
|
80
|
-
}
|
81
|
-
return {
|
82
|
-
icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.ClockCounterClockwise, {}),
|
83
|
-
label: formatMessage({
|
84
|
-
id: "content-manager.history.document-action",
|
85
|
-
defaultMessage: "Content History"
|
86
|
-
}),
|
87
|
-
onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
|
88
|
-
disabled: (
|
89
|
-
/**
|
90
|
-
* The user is creating a new document.
|
91
|
-
* It hasn't been saved yet, so there's no history to go to
|
92
|
-
*/
|
93
|
-
!document || /**
|
94
|
-
* The document has been created but the current dimension has never been saved.
|
95
|
-
* For example, the user is creating a new locale in an existing document,
|
96
|
-
* so there's no history for the document in that locale
|
97
|
-
*/
|
98
|
-
!document.id || /**
|
99
|
-
* History is only available for content types created by the user.
|
100
|
-
* These have the `api::` prefix, as opposed to the ones created by Strapi or plugins,
|
101
|
-
* which start with `admin::` or `plugin::`
|
102
|
-
*/
|
103
|
-
!model.startsWith("api::")
|
104
|
-
),
|
105
|
-
position: "header"
|
106
|
-
};
|
107
|
-
};
|
108
|
-
HistoryAction.type = "history";
|
109
73
|
const ID = "id";
|
110
74
|
const CREATED_BY_ATTRIBUTE_NAME = "createdBy";
|
111
75
|
const UPDATED_BY_ATTRIBUTE_NAME = "updatedBy";
|
@@ -215,7 +179,8 @@ const contentManagerApi = strapiAdmin.adminApi.enhanceEndpoints({
|
|
215
179
|
"Document",
|
216
180
|
"InitialData",
|
217
181
|
"HistoryVersion",
|
218
|
-
"Relations"
|
182
|
+
"Relations",
|
183
|
+
"UidAvailability"
|
219
184
|
]
|
220
185
|
});
|
221
186
|
const documentApi = contentManagerApi.injectEndpoints({
|
@@ -229,7 +194,12 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
229
194
|
params: query
|
230
195
|
}
|
231
196
|
}),
|
232
|
-
invalidatesTags: (_result,
|
197
|
+
invalidatesTags: (_result, error, { model }) => {
|
198
|
+
if (error) {
|
199
|
+
return [];
|
200
|
+
}
|
201
|
+
return [{ type: "Document", id: `${model}_LIST` }];
|
202
|
+
}
|
233
203
|
}),
|
234
204
|
cloneDocument: builder.mutation({
|
235
205
|
query: ({ model, sourceId, data, params }) => ({
|
@@ -240,7 +210,10 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
240
210
|
params
|
241
211
|
}
|
242
212
|
}),
|
243
|
-
invalidatesTags: (_result, _error, { model }) => [
|
213
|
+
invalidatesTags: (_result, _error, { model }) => [
|
214
|
+
{ type: "Document", id: `${model}_LIST` },
|
215
|
+
{ type: "UidAvailability", id: model }
|
216
|
+
]
|
244
217
|
}),
|
245
218
|
/**
|
246
219
|
* Creates a new collection-type document. This should ONLY be used for collection-types.
|
@@ -257,7 +230,8 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
257
230
|
}),
|
258
231
|
invalidatesTags: (result, _error, { model }) => [
|
259
232
|
{ type: "Document", id: `${model}_LIST` },
|
260
|
-
"Relations"
|
233
|
+
"Relations",
|
234
|
+
{ type: "UidAvailability", id: model }
|
261
235
|
]
|
262
236
|
}),
|
263
237
|
deleteDocument: builder.mutation({
|
@@ -298,7 +272,8 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
298
272
|
id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
|
299
273
|
},
|
300
274
|
{ type: "Document", id: `${model}_LIST` },
|
301
|
-
"Relations"
|
275
|
+
"Relations",
|
276
|
+
{ type: "UidAvailability", id: model }
|
302
277
|
];
|
303
278
|
}
|
304
279
|
}),
|
@@ -316,6 +291,7 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
316
291
|
}),
|
317
292
|
providesTags: (result, _error, arg) => {
|
318
293
|
return [
|
294
|
+
{ type: "Document", id: `ALL_LIST` },
|
319
295
|
{ type: "Document", id: `${arg.model}_LIST` },
|
320
296
|
...result?.results.map(({ documentId }) => ({
|
321
297
|
type: "Document",
|
@@ -354,6 +330,11 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
354
330
|
{
|
355
331
|
type: "Document",
|
356
332
|
id: collectionType !== SINGLE_TYPES ? `${model}_${result && "documentId" in result ? result.documentId : documentId}` : model
|
333
|
+
},
|
334
|
+
// Make it easy to invalidate all individual documents queries for a model
|
335
|
+
{
|
336
|
+
type: "Document",
|
337
|
+
id: `${model}_ALL_ITEMS`
|
357
338
|
}
|
358
339
|
];
|
359
340
|
}
|
@@ -417,8 +398,21 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
417
398
|
type: "Document",
|
418
399
|
id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
|
419
400
|
},
|
420
|
-
"Relations"
|
401
|
+
"Relations",
|
402
|
+
{ type: "UidAvailability", id: model }
|
421
403
|
];
|
404
|
+
},
|
405
|
+
async onQueryStarted({ data, ...patch }, { dispatch, queryFulfilled }) {
|
406
|
+
const patchResult = dispatch(
|
407
|
+
documentApi.util.updateQueryData("getDocument", patch, (draft) => {
|
408
|
+
Object.assign(draft.data, data);
|
409
|
+
})
|
410
|
+
);
|
411
|
+
try {
|
412
|
+
await queryFulfilled;
|
413
|
+
} catch {
|
414
|
+
patchResult.undo();
|
415
|
+
}
|
422
416
|
}
|
423
417
|
}),
|
424
418
|
unpublishDocument: builder.mutation({
|
@@ -488,7 +482,7 @@ const buildValidParams = (query) => {
|
|
488
482
|
const isBaseQueryError = (error) => {
|
489
483
|
return error.name !== void 0;
|
490
484
|
};
|
491
|
-
const createYupSchema = (attributes = {}, components = {}) => {
|
485
|
+
const createYupSchema = (attributes = {}, components = {}, options = { status: null }) => {
|
492
486
|
const createModelSchema = (attributes2) => yup__namespace.object().shape(
|
493
487
|
Object.entries(attributes2).reduce((acc, [name, attribute]) => {
|
494
488
|
if (DOCUMENT_META_FIELDS.includes(name)) {
|
@@ -501,7 +495,7 @@ const createYupSchema = (attributes = {}, components = {}) => {
|
|
501
495
|
addMinValidation,
|
502
496
|
addMaxValidation,
|
503
497
|
addRegexValidation
|
504
|
-
].map((fn) => fn(attribute));
|
498
|
+
].map((fn) => fn(attribute, options));
|
505
499
|
const transformSchema = pipe__default.default(...validations);
|
506
500
|
switch (attribute.type) {
|
507
501
|
case "component": {
|
@@ -602,6 +596,14 @@ const createAttributeSchema = (attribute) => {
|
|
602
596
|
if (!value || typeof value === "string" && value.length === 0) {
|
603
597
|
return true;
|
604
598
|
}
|
599
|
+
if (typeof value === "object") {
|
600
|
+
try {
|
601
|
+
JSON.stringify(value);
|
602
|
+
return true;
|
603
|
+
} catch (err) {
|
604
|
+
return false;
|
605
|
+
}
|
606
|
+
}
|
605
607
|
try {
|
606
608
|
JSON.parse(value);
|
607
609
|
return true;
|
@@ -620,13 +622,7 @@ const createAttributeSchema = (attribute) => {
|
|
620
622
|
return yup__namespace.mixed();
|
621
623
|
}
|
622
624
|
};
|
623
|
-
const
|
624
|
-
if (attribute.required && attribute.type !== "relation") {
|
625
|
-
return schema.required({
|
626
|
-
id: strapiAdmin.translatedErrors.required.id,
|
627
|
-
defaultMessage: "This field is required."
|
628
|
-
});
|
629
|
-
}
|
625
|
+
const nullableSchema = (schema) => {
|
630
626
|
return schema?.nullable ? schema.nullable() : (
|
631
627
|
// In some cases '.nullable' will not be available on the schema.
|
632
628
|
// e.g. when the schema has been built using yup.lazy (e.g. for relations).
|
@@ -634,7 +630,22 @@ const addRequiredValidation = (attribute) => (schema) => {
|
|
634
630
|
schema
|
635
631
|
);
|
636
632
|
};
|
637
|
-
const
|
633
|
+
const addRequiredValidation = (attribute, options) => (schema) => {
|
634
|
+
if (options.status === "draft") {
|
635
|
+
return nullableSchema(schema);
|
636
|
+
}
|
637
|
+
if ((attribute.type === "component" && attribute.repeatable || attribute.type === "dynamiczone") && attribute.required && "min" in schema) {
|
638
|
+
return schema.min(1, strapiAdmin.translatedErrors.required);
|
639
|
+
}
|
640
|
+
if (attribute.required && attribute.type !== "relation") {
|
641
|
+
return schema.required(strapiAdmin.translatedErrors.required);
|
642
|
+
}
|
643
|
+
return nullableSchema(schema);
|
644
|
+
};
|
645
|
+
const addMinLengthValidation = (attribute, options) => (schema) => {
|
646
|
+
if (options.status === "draft") {
|
647
|
+
return schema;
|
648
|
+
}
|
638
649
|
if ("minLength" in attribute && attribute.minLength && Number.isInteger(attribute.minLength) && "min" in schema) {
|
639
650
|
return schema.min(attribute.minLength, {
|
640
651
|
...strapiAdmin.translatedErrors.minLength,
|
@@ -656,9 +667,31 @@ const addMaxLengthValidation = (attribute) => (schema) => {
|
|
656
667
|
}
|
657
668
|
return schema;
|
658
669
|
};
|
659
|
-
const addMinValidation = (attribute) => (schema) => {
|
670
|
+
const addMinValidation = (attribute, options) => (schema) => {
|
660
671
|
if ("min" in attribute) {
|
661
672
|
const min = toInteger(attribute.min);
|
673
|
+
if (attribute.type === "component" && attribute.repeatable || attribute.type === "dynamiczone") {
|
674
|
+
if (options.status !== "draft" && !attribute.required && "test" in schema && min) {
|
675
|
+
return schema.test(
|
676
|
+
"custom-min",
|
677
|
+
{
|
678
|
+
...strapiAdmin.translatedErrors.min,
|
679
|
+
values: {
|
680
|
+
min: attribute.min
|
681
|
+
}
|
682
|
+
},
|
683
|
+
(value) => {
|
684
|
+
if (!value) {
|
685
|
+
return true;
|
686
|
+
}
|
687
|
+
if (Array.isArray(value) && value.length === 0) {
|
688
|
+
return true;
|
689
|
+
}
|
690
|
+
return value.length >= min;
|
691
|
+
}
|
692
|
+
);
|
693
|
+
}
|
694
|
+
}
|
662
695
|
if ("min" in schema && min) {
|
663
696
|
return schema.min(min, {
|
664
697
|
...strapiAdmin.translatedErrors.min,
|
@@ -874,6 +907,8 @@ const useDocumentActions = () => {
|
|
874
907
|
const { formatMessage } = reactIntl.useIntl();
|
875
908
|
const { trackUsage } = strapiAdmin.useTracking();
|
876
909
|
const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
|
910
|
+
const navigate = reactRouterDom.useNavigate();
|
911
|
+
const setCurrentStep = strapiAdmin.useGuidedTour("useDocumentActions", (state) => state.setCurrentStep);
|
877
912
|
const [deleteDocument] = useDeleteDocumentMutation();
|
878
913
|
const _delete = React__namespace.useCallback(
|
879
914
|
async ({ collectionType, model, documentId, params }, trackerProperty) => {
|
@@ -1188,6 +1223,7 @@ const useDocumentActions = () => {
|
|
1188
1223
|
defaultMessage: "Saved document"
|
1189
1224
|
})
|
1190
1225
|
});
|
1226
|
+
setCurrentStep("contentManager.success");
|
1191
1227
|
return res.data;
|
1192
1228
|
} catch (err) {
|
1193
1229
|
toggleNotification({
|
@@ -1209,7 +1245,6 @@ const useDocumentActions = () => {
|
|
1209
1245
|
sourceId
|
1210
1246
|
});
|
1211
1247
|
if ("error" in res) {
|
1212
|
-
toggleNotification({ type: "danger", message: formatAPIError(res.error) });
|
1213
1248
|
return { error: res.error };
|
1214
1249
|
}
|
1215
1250
|
toggleNotification({
|
@@ -1228,7 +1263,7 @@ const useDocumentActions = () => {
|
|
1228
1263
|
throw err;
|
1229
1264
|
}
|
1230
1265
|
},
|
1231
|
-
[autoCloneDocument,
|
1266
|
+
[autoCloneDocument, formatMessage, toggleNotification]
|
1232
1267
|
);
|
1233
1268
|
const [cloneDocument] = useCloneDocumentMutation();
|
1234
1269
|
const clone = React__namespace.useCallback(
|
@@ -1254,6 +1289,7 @@ const useDocumentActions = () => {
|
|
1254
1289
|
defaultMessage: "Cloned document"
|
1255
1290
|
})
|
1256
1291
|
});
|
1292
|
+
navigate(`../../${res.data.data.documentId}`, { relative: "path" });
|
1257
1293
|
return res.data;
|
1258
1294
|
} catch (err) {
|
1259
1295
|
toggleNotification({
|
@@ -1264,7 +1300,7 @@ const useDocumentActions = () => {
|
|
1264
1300
|
throw err;
|
1265
1301
|
}
|
1266
1302
|
},
|
1267
|
-
[cloneDocument, trackUsage, toggleNotification, formatMessage, formatAPIError]
|
1303
|
+
[cloneDocument, trackUsage, toggleNotification, formatMessage, formatAPIError, navigate]
|
1268
1304
|
);
|
1269
1305
|
const [getDoc] = useLazyGetDocumentQuery();
|
1270
1306
|
const getDocument = React__namespace.useCallback(
|
@@ -1290,7 +1326,7 @@ const useDocumentActions = () => {
|
|
1290
1326
|
};
|
1291
1327
|
};
|
1292
1328
|
const ProtectedHistoryPage = React.lazy(
|
1293
|
-
() => Promise.resolve().then(() => require("./History-
|
1329
|
+
() => Promise.resolve().then(() => require("./History-BIYOzHws.js")).then((mod) => ({ default: mod.ProtectedHistoryPage }))
|
1294
1330
|
);
|
1295
1331
|
const routes$1 = [
|
1296
1332
|
{
|
@@ -1303,31 +1339,31 @@ const routes$1 = [
|
|
1303
1339
|
}
|
1304
1340
|
];
|
1305
1341
|
const ProtectedEditViewPage = React.lazy(
|
1306
|
-
() => Promise.resolve().then(() => require("./EditViewPage-
|
1342
|
+
() => Promise.resolve().then(() => require("./EditViewPage-BOeuvemd.js")).then((mod) => ({ default: mod.ProtectedEditViewPage }))
|
1307
1343
|
);
|
1308
1344
|
const ProtectedListViewPage = React.lazy(
|
1309
|
-
() => Promise.resolve().then(() => require("./ListViewPage-
|
1345
|
+
() => Promise.resolve().then(() => require("./ListViewPage-Djc5M_c0.js")).then((mod) => ({ default: mod.ProtectedListViewPage }))
|
1310
1346
|
);
|
1311
1347
|
const ProtectedListConfiguration = React.lazy(
|
1312
|
-
() => Promise.resolve().then(() => require("./ListConfigurationPage-
|
1348
|
+
() => Promise.resolve().then(() => require("./ListConfigurationPage-N7prXhOp.js")).then((mod) => ({
|
1313
1349
|
default: mod.ProtectedListConfiguration
|
1314
1350
|
}))
|
1315
1351
|
);
|
1316
1352
|
const ProtectedEditConfigurationPage = React.lazy(
|
1317
|
-
() => Promise.resolve().then(() => require("./EditConfigurationPage-
|
1353
|
+
() => Promise.resolve().then(() => require("./EditConfigurationPage-BcXQLYY9.js")).then((mod) => ({
|
1318
1354
|
default: mod.ProtectedEditConfigurationPage
|
1319
1355
|
}))
|
1320
1356
|
);
|
1321
1357
|
const ProtectedComponentConfigurationPage = React.lazy(
|
1322
|
-
() => Promise.resolve().then(() => require("./ComponentConfigurationPage-
|
1358
|
+
() => Promise.resolve().then(() => require("./ComponentConfigurationPage-BfOUhLa9.js")).then((mod) => ({
|
1323
1359
|
default: mod.ProtectedComponentConfigurationPage
|
1324
1360
|
}))
|
1325
1361
|
);
|
1326
1362
|
const NoPermissions = React.lazy(
|
1327
|
-
() => Promise.resolve().then(() => require("./NoPermissionsPage-
|
1363
|
+
() => Promise.resolve().then(() => require("./NoPermissionsPage-PfJfspJV.js")).then((mod) => ({ default: mod.NoPermissions }))
|
1328
1364
|
);
|
1329
1365
|
const NoContentType = React.lazy(
|
1330
|
-
() => Promise.resolve().then(() => require("./NoContentTypePage-
|
1366
|
+
() => Promise.resolve().then(() => require("./NoContentTypePage-DCX-hEMB.js")).then((mod) => ({ default: mod.NoContentType }))
|
1331
1367
|
);
|
1332
1368
|
const CollectionTypePages = () => {
|
1333
1369
|
const { collectionType } = reactRouterDom.useParams();
|
@@ -1441,12 +1477,14 @@ const DocumentActionButton = (action) => {
|
|
1441
1477
|
/* @__PURE__ */ jsxRuntime.jsx(
|
1442
1478
|
designSystem.Button,
|
1443
1479
|
{
|
1444
|
-
flex:
|
1480
|
+
flex: "auto",
|
1445
1481
|
startIcon: action.icon,
|
1446
1482
|
disabled: action.disabled,
|
1447
1483
|
onClick: handleClick(action),
|
1448
1484
|
justifyContent: "center",
|
1449
1485
|
variant: action.variant || "default",
|
1486
|
+
paddingTop: "7px",
|
1487
|
+
paddingBottom: "7px",
|
1450
1488
|
children: action.label
|
1451
1489
|
}
|
1452
1490
|
),
|
@@ -1454,7 +1492,7 @@ const DocumentActionButton = (action) => {
|
|
1454
1492
|
DocumentActionConfirmDialog,
|
1455
1493
|
{
|
1456
1494
|
...action.dialog,
|
1457
|
-
variant: action.variant,
|
1495
|
+
variant: action.dialog?.variant ?? action.variant,
|
1458
1496
|
isOpen: dialogId === action.id,
|
1459
1497
|
onClose: handleClose
|
1460
1498
|
}
|
@@ -1511,9 +1549,9 @@ const DocumentActionsMenu = ({
|
|
1511
1549
|
disabled: isDisabled,
|
1512
1550
|
size: "S",
|
1513
1551
|
endIcon: null,
|
1514
|
-
paddingTop: "
|
1515
|
-
paddingLeft: "
|
1516
|
-
paddingRight: "
|
1552
|
+
paddingTop: "4px",
|
1553
|
+
paddingLeft: "7px",
|
1554
|
+
paddingRight: "7px",
|
1517
1555
|
variant,
|
1518
1556
|
children: [
|
1519
1557
|
/* @__PURE__ */ jsxRuntime.jsx(Icons.More, { "aria-hidden": true, focusable: false }),
|
@@ -1524,7 +1562,7 @@ const DocumentActionsMenu = ({
|
|
1524
1562
|
]
|
1525
1563
|
}
|
1526
1564
|
),
|
1527
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, {
|
1565
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { maxHeight: void 0, popoverPlacement: "bottom-end", children: [
|
1528
1566
|
actions2.map((action) => {
|
1529
1567
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
1530
1568
|
designSystem.Menu.Item,
|
@@ -1533,10 +1571,25 @@ const DocumentActionsMenu = ({
|
|
1533
1571
|
onSelect: handleClick(action),
|
1534
1572
|
display: "block",
|
1535
1573
|
children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", gap: 4, children: [
|
1536
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
1537
|
-
|
1538
|
-
|
1539
|
-
|
1574
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
1575
|
+
designSystem.Flex,
|
1576
|
+
{
|
1577
|
+
color: !action.disabled ? convertActionVariantToColor(action.variant) : "inherit",
|
1578
|
+
gap: 2,
|
1579
|
+
tag: "span",
|
1580
|
+
children: [
|
1581
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
1582
|
+
designSystem.Flex,
|
1583
|
+
{
|
1584
|
+
tag: "span",
|
1585
|
+
color: !action.disabled ? convertActionVariantToIconColor(action.variant) : "inherit",
|
1586
|
+
children: action.icon
|
1587
|
+
}
|
1588
|
+
),
|
1589
|
+
action.label
|
1590
|
+
]
|
1591
|
+
}
|
1592
|
+
),
|
1540
1593
|
action.id.startsWith("HistoryAction") && /* @__PURE__ */ jsxRuntime.jsx(
|
1541
1594
|
designSystem.Flex,
|
1542
1595
|
{
|
@@ -1633,11 +1686,11 @@ const DocumentActionConfirmDialog = ({
|
|
1633
1686
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: title }),
|
1634
1687
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Body, { children: content }),
|
1635
1688
|
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Footer, { children: [
|
1636
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Cancel, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", children: formatMessage({
|
1689
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Cancel, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", fullWidth: true, children: formatMessage({
|
1637
1690
|
id: "app.components.Button.cancel",
|
1638
1691
|
defaultMessage: "Cancel"
|
1639
1692
|
}) }) }),
|
1640
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleConfirm, variant, children: formatMessage({
|
1693
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleConfirm, variant, fullWidth: true, children: formatMessage({
|
1641
1694
|
id: "app.components.Button.confirm",
|
1642
1695
|
defaultMessage: "Confirm"
|
1643
1696
|
}) })
|
@@ -1660,8 +1713,8 @@ const DocumentActionModal = ({
|
|
1660
1713
|
};
|
1661
1714
|
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Root, { open: isOpen, onOpenChange: handleClose, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Content, { children: [
|
1662
1715
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Title, { children: title }) }),
|
1663
|
-
|
1664
|
-
|
1716
|
+
typeof Content === "function" ? /* @__PURE__ */ jsxRuntime.jsx(Content, { onClose: handleClose }) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Body, { children: Content }),
|
1717
|
+
typeof Footer === "function" ? /* @__PURE__ */ jsxRuntime.jsx(Footer, { onClose: handleClose }) : Footer
|
1665
1718
|
] }) });
|
1666
1719
|
};
|
1667
1720
|
const PublishAction$1 = ({
|
@@ -1676,13 +1729,17 @@ const PublishAction$1 = ({
|
|
1676
1729
|
const navigate = reactRouterDom.useNavigate();
|
1677
1730
|
const { toggleNotification } = strapiAdmin.useNotification();
|
1678
1731
|
const { _unstableFormatValidationErrors: formatValidationErrors } = strapiAdmin.useAPIErrorHandler();
|
1732
|
+
const isListView = reactRouterDom.useMatch(LIST_PATH) !== null;
|
1679
1733
|
const isCloning = reactRouterDom.useMatch(CLONE_PATH) !== null;
|
1680
1734
|
const { formatMessage } = reactIntl.useIntl();
|
1681
|
-
const { canPublish
|
1682
|
-
"PublishAction",
|
1683
|
-
({ canPublish: canPublish2, canCreate: canCreate2, canUpdate: canUpdate2 }) => ({ canPublish: canPublish2, canCreate: canCreate2, canUpdate: canUpdate2 })
|
1684
|
-
);
|
1735
|
+
const canPublish = useDocumentRBAC("PublishAction", ({ canPublish: canPublish2 }) => canPublish2);
|
1685
1736
|
const { publish } = useDocumentActions();
|
1737
|
+
const [
|
1738
|
+
countDraftRelations,
|
1739
|
+
{ isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }
|
1740
|
+
] = useLazyGetDraftRelationCountQuery();
|
1741
|
+
const [localCountOfDraftRelations, setLocalCountOfDraftRelations] = React__namespace.useState(0);
|
1742
|
+
const [serverCountOfDraftRelations, setServerCountOfDraftRelations] = React__namespace.useState(0);
|
1686
1743
|
const [{ query, rawQuery }] = strapiAdmin.useQueryParams();
|
1687
1744
|
const params = React__namespace.useMemo(() => buildValidParams(query), [query]);
|
1688
1745
|
const modified = strapiAdmin.useForm("PublishAction", ({ modified: modified2 }) => modified2);
|
@@ -1691,10 +1748,103 @@ const PublishAction$1 = ({
|
|
1691
1748
|
const validate = strapiAdmin.useForm("PublishAction", (state) => state.validate);
|
1692
1749
|
const setErrors = strapiAdmin.useForm("PublishAction", (state) => state.setErrors);
|
1693
1750
|
const formValues = strapiAdmin.useForm("PublishAction", ({ values }) => values);
|
1751
|
+
React__namespace.useEffect(() => {
|
1752
|
+
if (isErrorDraftRelations) {
|
1753
|
+
toggleNotification({
|
1754
|
+
type: "danger",
|
1755
|
+
message: formatMessage({
|
1756
|
+
id: getTranslation("error.records.fetch-draft-relatons"),
|
1757
|
+
defaultMessage: "An error occurred while fetching draft relations on this document."
|
1758
|
+
})
|
1759
|
+
});
|
1760
|
+
}
|
1761
|
+
}, [isErrorDraftRelations, toggleNotification, formatMessage]);
|
1762
|
+
React__namespace.useEffect(() => {
|
1763
|
+
const localDraftRelations = /* @__PURE__ */ new Set();
|
1764
|
+
const extractDraftRelations = (data) => {
|
1765
|
+
const relations = data.connect || [];
|
1766
|
+
relations.forEach((relation) => {
|
1767
|
+
if (relation.status === "draft") {
|
1768
|
+
localDraftRelations.add(relation.id);
|
1769
|
+
}
|
1770
|
+
});
|
1771
|
+
};
|
1772
|
+
const traverseAndExtract = (data) => {
|
1773
|
+
Object.entries(data).forEach(([key, value]) => {
|
1774
|
+
if (key === "connect" && Array.isArray(value)) {
|
1775
|
+
extractDraftRelations({ connect: value });
|
1776
|
+
} else if (typeof value === "object" && value !== null) {
|
1777
|
+
traverseAndExtract(value);
|
1778
|
+
}
|
1779
|
+
});
|
1780
|
+
};
|
1781
|
+
if (!documentId || modified) {
|
1782
|
+
traverseAndExtract(formValues);
|
1783
|
+
setLocalCountOfDraftRelations(localDraftRelations.size);
|
1784
|
+
}
|
1785
|
+
}, [documentId, modified, formValues, setLocalCountOfDraftRelations]);
|
1786
|
+
React__namespace.useEffect(() => {
|
1787
|
+
if (!document || !document.documentId || isListView) {
|
1788
|
+
return;
|
1789
|
+
}
|
1790
|
+
const fetchDraftRelationsCount = async () => {
|
1791
|
+
const { data, error } = await countDraftRelations({
|
1792
|
+
collectionType,
|
1793
|
+
model,
|
1794
|
+
documentId,
|
1795
|
+
params
|
1796
|
+
});
|
1797
|
+
if (error) {
|
1798
|
+
throw error;
|
1799
|
+
}
|
1800
|
+
if (data) {
|
1801
|
+
setServerCountOfDraftRelations(data.data);
|
1802
|
+
}
|
1803
|
+
};
|
1804
|
+
fetchDraftRelationsCount();
|
1805
|
+
}, [isListView, document, documentId, countDraftRelations, collectionType, model, params]);
|
1694
1806
|
const isDocumentPublished = (document?.[PUBLISHED_AT_ATTRIBUTE_NAME] || meta?.availableStatus.some((doc) => doc[PUBLISHED_AT_ATTRIBUTE_NAME] !== null)) && document?.status !== "modified";
|
1695
1807
|
if (!schema?.options?.draftAndPublish) {
|
1696
1808
|
return null;
|
1697
1809
|
}
|
1810
|
+
const performPublish = async () => {
|
1811
|
+
setSubmitting(true);
|
1812
|
+
try {
|
1813
|
+
const { errors } = await validate();
|
1814
|
+
if (errors) {
|
1815
|
+
toggleNotification({
|
1816
|
+
type: "danger",
|
1817
|
+
message: formatMessage({
|
1818
|
+
id: "content-manager.validation.error",
|
1819
|
+
defaultMessage: "There are validation errors in your document. Please fix them before saving."
|
1820
|
+
})
|
1821
|
+
});
|
1822
|
+
return;
|
1823
|
+
}
|
1824
|
+
const res = await publish(
|
1825
|
+
{
|
1826
|
+
collectionType,
|
1827
|
+
model,
|
1828
|
+
documentId,
|
1829
|
+
params
|
1830
|
+
},
|
1831
|
+
formValues
|
1832
|
+
);
|
1833
|
+
if ("data" in res && collectionType !== SINGLE_TYPES) {
|
1834
|
+
navigate({
|
1835
|
+
pathname: `../${collectionType}/${model}/${res.data.documentId}`,
|
1836
|
+
search: rawQuery
|
1837
|
+
});
|
1838
|
+
} else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
|
1839
|
+
setErrors(formatValidationErrors(res.error));
|
1840
|
+
}
|
1841
|
+
} finally {
|
1842
|
+
setSubmitting(false);
|
1843
|
+
}
|
1844
|
+
};
|
1845
|
+
const totalDraftRelations = localCountOfDraftRelations + serverCountOfDraftRelations;
|
1846
|
+
const enableDraftRelationsCount = false;
|
1847
|
+
const hasDraftRelations = enableDraftRelationsCount;
|
1698
1848
|
return {
|
1699
1849
|
/**
|
1700
1850
|
* Disabled when:
|
@@ -1704,49 +1854,36 @@ const PublishAction$1 = ({
|
|
1704
1854
|
* - the document is already published & not modified
|
1705
1855
|
* - the document is being created & not modified
|
1706
1856
|
* - the user doesn't have the permission to publish
|
1707
|
-
* - the user doesn't have the permission to create a new document
|
1708
|
-
* - the user doesn't have the permission to update the document
|
1709
1857
|
*/
|
1710
|
-
disabled: isCloning || isSubmitting || activeTab === "published" || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish
|
1858
|
+
disabled: isCloning || isSubmitting || isLoadingDraftRelations || activeTab === "published" || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish,
|
1711
1859
|
label: formatMessage({
|
1712
1860
|
id: "app.utils.publish",
|
1713
1861
|
defaultMessage: "Publish"
|
1714
1862
|
}),
|
1715
1863
|
onClick: async () => {
|
1716
|
-
|
1717
|
-
|
1718
|
-
|
1719
|
-
|
1720
|
-
|
1721
|
-
|
1722
|
-
|
1723
|
-
|
1724
|
-
|
1725
|
-
|
1726
|
-
|
1727
|
-
|
1728
|
-
|
1729
|
-
|
1730
|
-
|
1731
|
-
|
1732
|
-
|
1733
|
-
documentId,
|
1734
|
-
params
|
1735
|
-
},
|
1736
|
-
formValues
|
1737
|
-
);
|
1738
|
-
if ("data" in res && collectionType !== SINGLE_TYPES) {
|
1739
|
-
navigate({
|
1740
|
-
pathname: `../${collectionType}/${model}/${res.data.documentId}`,
|
1741
|
-
search: rawQuery
|
1742
|
-
});
|
1743
|
-
} else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
|
1744
|
-
setErrors(formatValidationErrors(res.error));
|
1864
|
+
await performPublish();
|
1865
|
+
},
|
1866
|
+
dialog: hasDraftRelations ? {
|
1867
|
+
type: "dialog",
|
1868
|
+
variant: "danger",
|
1869
|
+
footer: null,
|
1870
|
+
title: formatMessage({
|
1871
|
+
id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.title`),
|
1872
|
+
defaultMessage: "Confirmation"
|
1873
|
+
}),
|
1874
|
+
content: formatMessage(
|
1875
|
+
{
|
1876
|
+
id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.message`),
|
1877
|
+
defaultMessage: "This entry is related to {count, plural, one {# draft entry} other {# draft entries}}. Publishing it could leave broken links in your app."
|
1878
|
+
},
|
1879
|
+
{
|
1880
|
+
count: totalDraftRelations
|
1745
1881
|
}
|
1746
|
-
|
1747
|
-
|
1882
|
+
),
|
1883
|
+
onConfirm: async () => {
|
1884
|
+
await performPublish();
|
1748
1885
|
}
|
1749
|
-
}
|
1886
|
+
} : void 0
|
1750
1887
|
};
|
1751
1888
|
};
|
1752
1889
|
PublishAction$1.type = "publish";
|
@@ -1762,10 +1899,6 @@ const UpdateAction = ({
|
|
1762
1899
|
const cloneMatch = reactRouterDom.useMatch(CLONE_PATH);
|
1763
1900
|
const isCloning = cloneMatch !== null;
|
1764
1901
|
const { formatMessage } = reactIntl.useIntl();
|
1765
|
-
const { canCreate, canUpdate } = useDocumentRBAC("UpdateAction", ({ canCreate: canCreate2, canUpdate: canUpdate2 }) => ({
|
1766
|
-
canCreate: canCreate2,
|
1767
|
-
canUpdate: canUpdate2
|
1768
|
-
}));
|
1769
1902
|
const { create, update, clone } = useDocumentActions();
|
1770
1903
|
const [{ query, rawQuery }] = strapiAdmin.useQueryParams();
|
1771
1904
|
const params = React__namespace.useMemo(() => buildValidParams(query), [query]);
|
@@ -1782,10 +1915,8 @@ const UpdateAction = ({
|
|
1782
1915
|
* - the form is submitting
|
1783
1916
|
* - the document is not modified & we're not cloning (you can save a clone entity straight away)
|
1784
1917
|
* - the active tab is the published tab
|
1785
|
-
* - the user doesn't have the permission to create a new document
|
1786
|
-
* - the user doesn't have the permission to update the document
|
1787
1918
|
*/
|
1788
|
-
disabled: isSubmitting || !modified && !isCloning || activeTab === "published"
|
1919
|
+
disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
|
1789
1920
|
label: formatMessage({
|
1790
1921
|
id: "content-manager.containers.Edit.save",
|
1791
1922
|
defaultMessage: "Save"
|
@@ -1793,16 +1924,18 @@ const UpdateAction = ({
|
|
1793
1924
|
onClick: async () => {
|
1794
1925
|
setSubmitting(true);
|
1795
1926
|
try {
|
1796
|
-
|
1797
|
-
|
1798
|
-
|
1799
|
-
|
1800
|
-
|
1801
|
-
|
1802
|
-
|
1803
|
-
|
1804
|
-
|
1805
|
-
|
1927
|
+
if (activeTab !== "draft") {
|
1928
|
+
const { errors } = await validate();
|
1929
|
+
if (errors) {
|
1930
|
+
toggleNotification({
|
1931
|
+
type: "danger",
|
1932
|
+
message: formatMessage({
|
1933
|
+
id: "content-manager.validation.error",
|
1934
|
+
defaultMessage: "There are validation errors in your document. Please fix them before saving."
|
1935
|
+
})
|
1936
|
+
});
|
1937
|
+
return;
|
1938
|
+
}
|
1806
1939
|
}
|
1807
1940
|
if (isCloning) {
|
1808
1941
|
const res = await clone(
|
@@ -1814,10 +1947,13 @@ const UpdateAction = ({
|
|
1814
1947
|
document
|
1815
1948
|
);
|
1816
1949
|
if ("data" in res) {
|
1817
|
-
navigate(
|
1818
|
-
|
1819
|
-
|
1820
|
-
|
1950
|
+
navigate(
|
1951
|
+
{
|
1952
|
+
pathname: `../${res.data.documentId}`,
|
1953
|
+
search: rawQuery
|
1954
|
+
},
|
1955
|
+
{ relative: "path" }
|
1956
|
+
);
|
1821
1957
|
} else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
|
1822
1958
|
setErrors(formatValidationErrors(res.error));
|
1823
1959
|
}
|
@@ -1847,10 +1983,10 @@ const UpdateAction = ({
|
|
1847
1983
|
if ("data" in res && collectionType !== SINGLE_TYPES) {
|
1848
1984
|
navigate(
|
1849
1985
|
{
|
1850
|
-
pathname: `../${
|
1986
|
+
pathname: `../${res.data.documentId}`,
|
1851
1987
|
search: rawQuery
|
1852
1988
|
},
|
1853
|
-
{ replace: true }
|
1989
|
+
{ replace: true, relative: "path" }
|
1854
1990
|
);
|
1855
1991
|
} else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
|
1856
1992
|
setErrors(formatValidationErrors(res.error));
|
@@ -1895,7 +2031,7 @@ const UnpublishAction$1 = ({
|
|
1895
2031
|
id: "app.utils.unpublish",
|
1896
2032
|
defaultMessage: "Unpublish"
|
1897
2033
|
}),
|
1898
|
-
icon: /* @__PURE__ */ jsxRuntime.jsx(
|
2034
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Cross, {}),
|
1899
2035
|
onClick: async () => {
|
1900
2036
|
if (!documentId && collectionType !== SINGLE_TYPES || isDocumentModified) {
|
1901
2037
|
if (!documentId) {
|
@@ -2007,7 +2143,7 @@ const DiscardAction = ({
|
|
2007
2143
|
id: "content-manager.actions.discard.label",
|
2008
2144
|
defaultMessage: "Discard changes"
|
2009
2145
|
}),
|
2010
|
-
icon: /* @__PURE__ */ jsxRuntime.jsx(
|
2146
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Cross, {}),
|
2011
2147
|
position: ["panel", "table-row"],
|
2012
2148
|
variant: "danger",
|
2013
2149
|
dialog: {
|
@@ -2035,11 +2171,6 @@ const DiscardAction = ({
|
|
2035
2171
|
};
|
2036
2172
|
};
|
2037
2173
|
DiscardAction.type = "discard";
|
2038
|
-
const StyledCrossCircle = styledComponents.styled(Icons.CrossCircle)`
|
2039
|
-
path {
|
2040
|
-
fill: currentColor;
|
2041
|
-
}
|
2042
|
-
`;
|
2043
2174
|
const DEFAULT_ACTIONS = [PublishAction$1, UpdateAction, UnpublishAction$1, DiscardAction];
|
2044
2175
|
const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
|
2045
2176
|
const RelativeTime = React__namespace.forwardRef(
|
@@ -2087,7 +2218,7 @@ const getDisplayName = ({
|
|
2087
2218
|
};
|
2088
2219
|
const capitalise = (str) => str.charAt(0).toUpperCase() + str.slice(1);
|
2089
2220
|
const DocumentStatus = ({ status = "draft", ...restProps }) => {
|
2090
|
-
const statusVariant = status === "draft" ? "
|
2221
|
+
const statusVariant = status === "draft" ? "secondary" : status === "published" ? "success" : "alternative";
|
2091
2222
|
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Status, { ...restProps, showBullet: false, size: "S", variant: statusVariant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "omega", fontWeight: "bold", children: capitalise(status) }) });
|
2092
2223
|
};
|
2093
2224
|
const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
|
@@ -2097,23 +2228,13 @@ const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
|
|
2097
2228
|
id: "content-manager.containers.edit.title.new",
|
2098
2229
|
defaultMessage: "Create an entry"
|
2099
2230
|
}) : documentTitle;
|
2100
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "flex-start", paddingTop:
|
2231
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "flex-start", paddingTop: 6, paddingBottom: 4, gap: 2, children: [
|
2101
2232
|
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.BackButton, {}),
|
2102
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
2103
|
-
designSystem.
|
2104
|
-
{
|
2105
|
-
|
2106
|
-
|
2107
|
-
paddingTop: 1,
|
2108
|
-
gap: "80px",
|
2109
|
-
alignItems: "flex-start",
|
2110
|
-
children: [
|
2111
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "alpha", tag: "h1", children: title }),
|
2112
|
-
/* @__PURE__ */ jsxRuntime.jsx(HeaderToolbar, {})
|
2113
|
-
]
|
2114
|
-
}
|
2115
|
-
),
|
2116
|
-
status ? /* @__PURE__ */ jsxRuntime.jsx(DocumentStatus, { status: isCloning ? "draft" : status }) : null
|
2233
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", justifyContent: "space-between", gap: "80px", alignItems: "flex-start", children: [
|
2234
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "alpha", tag: "h1", children: title }),
|
2235
|
+
/* @__PURE__ */ jsxRuntime.jsx(HeaderToolbar, {})
|
2236
|
+
] }),
|
2237
|
+
status ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 1, children: /* @__PURE__ */ jsxRuntime.jsx(DocumentStatus, { status: isCloning ? "draft" : status }) }) : null
|
2117
2238
|
] });
|
2118
2239
|
};
|
2119
2240
|
const HeaderToolbar = () => {
|
@@ -2280,8 +2401,22 @@ const Information = ({ activeTab }) => {
|
|
2280
2401
|
);
|
2281
2402
|
};
|
2282
2403
|
const HeaderActions = ({ actions: actions2 }) => {
|
2283
|
-
|
2284
|
-
|
2404
|
+
const [dialogId, setDialogId] = React__namespace.useState(null);
|
2405
|
+
const handleClick = (action) => async (e) => {
|
2406
|
+
if (!("options" in action)) {
|
2407
|
+
const { onClick = () => false, dialog, id } = action;
|
2408
|
+
const muteDialog = await onClick(e);
|
2409
|
+
if (dialog && !muteDialog) {
|
2410
|
+
e.preventDefault();
|
2411
|
+
setDialogId(id);
|
2412
|
+
}
|
2413
|
+
}
|
2414
|
+
};
|
2415
|
+
const handleClose = () => {
|
2416
|
+
setDialogId(null);
|
2417
|
+
};
|
2418
|
+
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { gap: 1, children: actions2.map((action) => {
|
2419
|
+
if (action.options) {
|
2285
2420
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
2286
2421
|
designSystem.SingleSelect,
|
2287
2422
|
{
|
@@ -2295,10 +2430,49 @@ const HeaderActions = ({ actions: actions2 }) => {
|
|
2295
2430
|
action.id
|
2296
2431
|
);
|
2297
2432
|
} else {
|
2298
|
-
|
2433
|
+
if (action.type === "icon") {
|
2434
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
|
2435
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
2436
|
+
designSystem.IconButton,
|
2437
|
+
{
|
2438
|
+
disabled: action.disabled,
|
2439
|
+
label: action.label,
|
2440
|
+
size: "S",
|
2441
|
+
onClick: handleClick(action),
|
2442
|
+
children: action.icon
|
2443
|
+
}
|
2444
|
+
),
|
2445
|
+
action.dialog ? /* @__PURE__ */ jsxRuntime.jsx(
|
2446
|
+
HeaderActionDialog,
|
2447
|
+
{
|
2448
|
+
...action.dialog,
|
2449
|
+
isOpen: dialogId === action.id,
|
2450
|
+
onClose: handleClose
|
2451
|
+
}
|
2452
|
+
) : null
|
2453
|
+
] }, action.id);
|
2454
|
+
}
|
2299
2455
|
}
|
2300
2456
|
}) });
|
2301
2457
|
};
|
2458
|
+
const HeaderActionDialog = ({
|
2459
|
+
onClose,
|
2460
|
+
onCancel,
|
2461
|
+
title,
|
2462
|
+
content: Content,
|
2463
|
+
isOpen
|
2464
|
+
}) => {
|
2465
|
+
const handleClose = async () => {
|
2466
|
+
if (onCancel) {
|
2467
|
+
await onCancel();
|
2468
|
+
}
|
2469
|
+
onClose();
|
2470
|
+
};
|
2471
|
+
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, { open: isOpen, onOpenChange: handleClose, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
|
2472
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: title }),
|
2473
|
+
typeof Content === "function" ? /* @__PURE__ */ jsxRuntime.jsx(Content, { onClose: handleClose }) : Content
|
2474
|
+
] }) });
|
2475
|
+
};
|
2302
2476
|
const ConfigureTheViewAction = ({ collectionType, model }) => {
|
2303
2477
|
const navigate = reactRouterDom.useNavigate();
|
2304
2478
|
const { formatMessage } = reactIntl.useIntl();
|
@@ -2434,7 +2608,7 @@ const ActionsPanel = () => {
|
|
2434
2608
|
return {
|
2435
2609
|
title: formatMessage({
|
2436
2610
|
id: "content-manager.containers.edit.panels.default.title",
|
2437
|
-
defaultMessage: "
|
2611
|
+
defaultMessage: "Entry"
|
2438
2612
|
}),
|
2439
2613
|
content: /* @__PURE__ */ jsxRuntime.jsx(ActionsPanelContent, {})
|
2440
2614
|
};
|
@@ -2678,7 +2852,8 @@ const formatEditLayout = (data, {
|
|
2678
2852
|
layout: convertEditLayoutToFieldLayouts(
|
2679
2853
|
configuration.layouts.edit,
|
2680
2854
|
components[uid].attributes,
|
2681
|
-
configuration.metadatas
|
2855
|
+
configuration.metadatas,
|
2856
|
+
{ configurations: data.components, schemas: components }
|
2682
2857
|
),
|
2683
2858
|
settings: {
|
2684
2859
|
...configuration.settings,
|
@@ -2804,7 +2979,7 @@ const ConfirmBulkActionDialog = ({
|
|
2804
2979
|
endAction
|
2805
2980
|
}) => {
|
2806
2981
|
const { formatMessage } = reactIntl.useIntl();
|
2807
|
-
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, {
|
2982
|
+
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, { open: isOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
|
2808
2983
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: formatMessage({
|
2809
2984
|
id: "app.components.ConfirmDialog.title",
|
2810
2985
|
defaultMessage: "Confirmation"
|
@@ -2835,6 +3010,7 @@ const ConfirmDialogPublishAll = ({
|
|
2835
3010
|
const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler(getTranslation);
|
2836
3011
|
const { model, schema } = useDoc();
|
2837
3012
|
const [{ query }] = strapiAdmin.useQueryParams();
|
3013
|
+
const enableDraftRelationsCount = false;
|
2838
3014
|
const {
|
2839
3015
|
data: countDraftRelations = 0,
|
2840
3016
|
isLoading,
|
@@ -2846,7 +3022,7 @@ const ConfirmDialogPublishAll = ({
|
|
2846
3022
|
locale: query?.plugins?.i18n?.locale
|
2847
3023
|
},
|
2848
3024
|
{
|
2849
|
-
skip:
|
3025
|
+
skip: !enableDraftRelationsCount
|
2850
3026
|
}
|
2851
3027
|
);
|
2852
3028
|
React__namespace.useEffect(() => {
|
@@ -3031,7 +3207,7 @@ const SelectedEntriesTableContent = ({
|
|
3031
3207
|
status: row.status
|
3032
3208
|
}
|
3033
3209
|
) }),
|
3034
|
-
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
3210
|
+
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
3035
3211
|
designSystem.IconButton,
|
3036
3212
|
{
|
3037
3213
|
tag: reactRouterDom.Link,
|
@@ -3054,9 +3230,10 @@ const SelectedEntriesTableContent = ({
|
|
3054
3230
|
),
|
3055
3231
|
target: "_blank",
|
3056
3232
|
marginLeft: "auto",
|
3057
|
-
|
3233
|
+
variant: "ghost",
|
3234
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Pencil, { width: "1.6rem", height: "1.6rem" })
|
3058
3235
|
}
|
3059
|
-
) })
|
3236
|
+
) }) })
|
3060
3237
|
] }, row.id)) })
|
3061
3238
|
] });
|
3062
3239
|
};
|
@@ -3093,7 +3270,13 @@ const SelectedEntriesModalContent = ({
|
|
3093
3270
|
);
|
3094
3271
|
const { rows, validationErrors } = React__namespace.useMemo(() => {
|
3095
3272
|
if (data.length > 0 && schema) {
|
3096
|
-
const validate = createYupSchema(
|
3273
|
+
const validate = createYupSchema(
|
3274
|
+
schema.attributes,
|
3275
|
+
components,
|
3276
|
+
// Since this is the "Publish" action, the validation
|
3277
|
+
// schema must enforce the rules for published entities
|
3278
|
+
{ status: "published" }
|
3279
|
+
);
|
3097
3280
|
const validationErrors2 = {};
|
3098
3281
|
const rows2 = data.map((entry) => {
|
3099
3282
|
try {
|
@@ -3443,7 +3626,7 @@ const TableActions = ({ document }) => {
|
|
3443
3626
|
strapiAdmin.DescriptionComponentRenderer,
|
3444
3627
|
{
|
3445
3628
|
props,
|
3446
|
-
descriptions: plugins["content-manager"].apis.getDocumentActions(),
|
3629
|
+
descriptions: plugins["content-manager"].apis.getDocumentActions().filter((action) => action.name !== "PublishAction"),
|
3447
3630
|
children: (actions2) => {
|
3448
3631
|
const tableRowActions = actions2.filter((action) => {
|
3449
3632
|
const positions = Array.isArray(action.position) ? action.position : [action.position];
|
@@ -3554,7 +3737,7 @@ const CloneAction = ({ model, documentId }) => {
|
|
3554
3737
|
}),
|
3555
3738
|
content: /* @__PURE__ */ jsxRuntime.jsx(AutoCloneFailureModalBody, { prohibitedFields }),
|
3556
3739
|
footer: ({ onClose }) => {
|
3557
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.
|
3740
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Footer, { children: [
|
3558
3741
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: onClose, variant: "tertiary", children: formatMessage({
|
3559
3742
|
id: "cancel",
|
3560
3743
|
defaultMessage: "Cancel"
|
@@ -3595,8 +3778,7 @@ class ContentManagerPlugin {
|
|
3595
3778
|
documentActions = [
|
3596
3779
|
...DEFAULT_ACTIONS,
|
3597
3780
|
...DEFAULT_TABLE_ROW_ACTIONS,
|
3598
|
-
...DEFAULT_HEADER_ACTIONS
|
3599
|
-
HistoryAction
|
3781
|
+
...DEFAULT_HEADER_ACTIONS
|
3600
3782
|
];
|
3601
3783
|
editViewSidePanels = [ActionsPanel];
|
3602
3784
|
headerActions = [];
|
@@ -3685,6 +3867,52 @@ const getPrintableType = (value) => {
|
|
3685
3867
|
}
|
3686
3868
|
return nativeType;
|
3687
3869
|
};
|
3870
|
+
const HistoryAction = ({ model, document }) => {
|
3871
|
+
const { formatMessage } = reactIntl.useIntl();
|
3872
|
+
const [{ query }] = strapiAdmin.useQueryParams();
|
3873
|
+
const navigate = reactRouterDom.useNavigate();
|
3874
|
+
const pluginsQueryParams = qs.stringify({ plugins: query.plugins }, { encode: false });
|
3875
|
+
if (!window.strapi.features.isEnabled("cms-content-history")) {
|
3876
|
+
return null;
|
3877
|
+
}
|
3878
|
+
return {
|
3879
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.ClockCounterClockwise, {}),
|
3880
|
+
label: formatMessage({
|
3881
|
+
id: "content-manager.history.document-action",
|
3882
|
+
defaultMessage: "Content History"
|
3883
|
+
}),
|
3884
|
+
onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
|
3885
|
+
disabled: (
|
3886
|
+
/**
|
3887
|
+
* The user is creating a new document.
|
3888
|
+
* It hasn't been saved yet, so there's no history to go to
|
3889
|
+
*/
|
3890
|
+
!document || /**
|
3891
|
+
* The document has been created but the current dimension has never been saved.
|
3892
|
+
* For example, the user is creating a new locale in an existing document,
|
3893
|
+
* so there's no history for the document in that locale
|
3894
|
+
*/
|
3895
|
+
!document.id || /**
|
3896
|
+
* History is only available for content types created by the user.
|
3897
|
+
* These have the `api::` prefix, as opposed to the ones created by Strapi or plugins,
|
3898
|
+
* which start with `admin::` or `plugin::`
|
3899
|
+
*/
|
3900
|
+
!model.startsWith("api::")
|
3901
|
+
),
|
3902
|
+
position: "header"
|
3903
|
+
};
|
3904
|
+
};
|
3905
|
+
HistoryAction.type = "history";
|
3906
|
+
const historyAdmin = {
|
3907
|
+
bootstrap(app) {
|
3908
|
+
const { addDocumentAction } = app.getPlugin("content-manager").apis;
|
3909
|
+
addDocumentAction((actions2) => {
|
3910
|
+
const indexOfDeleteAction = actions2.findIndex((action) => action.type === "delete");
|
3911
|
+
actions2.splice(indexOfDeleteAction, 0, HistoryAction);
|
3912
|
+
return actions2;
|
3913
|
+
});
|
3914
|
+
}
|
3915
|
+
};
|
3688
3916
|
const initialState = {
|
3689
3917
|
collectionTypeLinks: [],
|
3690
3918
|
components: [],
|
@@ -3740,7 +3968,7 @@ const index = {
|
|
3740
3968
|
app.router.addRoute({
|
3741
3969
|
path: "content-manager/*",
|
3742
3970
|
lazy: async () => {
|
3743
|
-
const { Layout } = await Promise.resolve().then(() => require("./layout-
|
3971
|
+
const { Layout } = await Promise.resolve().then(() => require("./layout-T2xBqmuZ.js"));
|
3744
3972
|
return {
|
3745
3973
|
Component: Layout
|
3746
3974
|
};
|
@@ -3749,10 +3977,15 @@ const index = {
|
|
3749
3977
|
});
|
3750
3978
|
app.registerPlugin(cm.config);
|
3751
3979
|
},
|
3980
|
+
bootstrap(app) {
|
3981
|
+
if (typeof historyAdmin.bootstrap === "function") {
|
3982
|
+
historyAdmin.bootstrap(app);
|
3983
|
+
}
|
3984
|
+
},
|
3752
3985
|
async registerTrads({ locales }) {
|
3753
3986
|
const importedTrads = await Promise.all(
|
3754
3987
|
locales.map((locale) => {
|
3755
|
-
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/ar.json": () => Promise.resolve().then(() => require("./ar-BUUWXIYu.js")), "./translations/ca.json": () => Promise.resolve().then(() => require("./ca-Cmk45QO6.js")), "./translations/cs.json": () => Promise.resolve().then(() => require("./cs-CkJy6B2v.js")), "./translations/de.json": () => Promise.resolve().then(() => require("./de-CCEmbAah.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-
|
3988
|
+
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/ar.json": () => Promise.resolve().then(() => require("./ar-BUUWXIYu.js")), "./translations/ca.json": () => Promise.resolve().then(() => require("./ca-Cmk45QO6.js")), "./translations/cs.json": () => Promise.resolve().then(() => require("./cs-CkJy6B2v.js")), "./translations/de.json": () => Promise.resolve().then(() => require("./de-CCEmbAah.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-BVzUkPxZ.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-EUonQTon.js")), "./translations/eu.json": () => Promise.resolve().then(() => require("./eu-VDH-3ovk.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-B7kGGg3E.js")), "./translations/gu.json": () => Promise.resolve().then(() => require("./gu-BRmF601H.js")), "./translations/hi.json": () => Promise.resolve().then(() => require("./hi-CCJBptSq.js")), "./translations/hu.json": () => Promise.resolve().then(() => require("./hu-sNV_yLYy.js")), "./translations/id.json": () => Promise.resolve().then(() => require("./id-B5Ser98A.js")), "./translations/it.json": () => Promise.resolve().then(() => require("./it-DkBIs7vD.js")), "./translations/ja.json": () => Promise.resolve().then(() => require("./ja-CcFe8diO.js")), "./translations/ko.json": () => Promise.resolve().then(() => require("./ko-woFZPmLk.js")), "./translations/ml.json": () => Promise.resolve().then(() => require("./ml-C2W8N8k1.js")), "./translations/ms.json": () => Promise.resolve().then(() => require("./ms-BuFotyP_.js")), "./translations/nl.json": () => Promise.resolve().then(() => require("./nl-bbEOHChV.js")), "./translations/pl.json": () => Promise.resolve().then(() => require("./pl-uzwG-hk7.js")), "./translations/pt-BR.json": () => Promise.resolve().then(() => require("./pt-BR-BiOz37D9.js")), "./translations/pt.json": () => Promise.resolve().then(() => require("./pt-CeXQuq50.js")), "./translations/ru.json": () => Promise.resolve().then(() => require("./ru-BT3ybNny.js")), "./translations/sa.json": () => Promise.resolve().then(() => require("./sa-CcvkYInH.js")), "./translations/sk.json": () => Promise.resolve().then(() => require("./sk-CvY09Xjv.js")), "./translations/sv.json": () => Promise.resolve().then(() => require("./sv-MYDuzgvT.js")), "./translations/th.json": () => Promise.resolve().then(() => require("./th-D9_GfAjc.js")), "./translations/tr.json": () => Promise.resolve().then(() => require("./tr-D9UH-O_R.js")), "./translations/uk.json": () => Promise.resolve().then(() => require("./uk-C8EiqJY7.js")), "./translations/vi.json": () => Promise.resolve().then(() => require("./vi-CJlYDheJ.js")), "./translations/zh-Hans.json": () => Promise.resolve().then(() => require("./zh-Hans-9kOncHGw.js")), "./translations/zh.json": () => Promise.resolve().then(() => require("./zh-CQQfszqR.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
|
3756
3989
|
return {
|
3757
3990
|
data: prefixPluginTranslations(data, PLUGIN_ID),
|
3758
3991
|
locale
|
@@ -3770,6 +4003,7 @@ const index = {
|
|
3770
4003
|
};
|
3771
4004
|
exports.ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD = ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD;
|
3772
4005
|
exports.BulkActionsRenderer = BulkActionsRenderer;
|
4006
|
+
exports.CLONE_PATH = CLONE_PATH;
|
3773
4007
|
exports.COLLECTION_TYPES = COLLECTION_TYPES;
|
3774
4008
|
exports.CREATOR_FIELDS = CREATOR_FIELDS;
|
3775
4009
|
exports.DEFAULT_SETTINGS = DEFAULT_SETTINGS;
|
@@ -3809,4 +4043,4 @@ exports.useGetAllDocumentsQuery = useGetAllDocumentsQuery;
|
|
3809
4043
|
exports.useGetContentTypeConfigurationQuery = useGetContentTypeConfigurationQuery;
|
3810
4044
|
exports.useGetInitialDataQuery = useGetInitialDataQuery;
|
3811
4045
|
exports.useUpdateContentTypeConfigurationMutation = useUpdateContentTypeConfigurationMutation;
|
3812
|
-
//# sourceMappingURL=index-
|
4046
|
+
//# sourceMappingURL=index-jun-ZqyN.js.map
|