@strapi/content-manager 0.0.0-experimental.62ce06180fe9a772eaeb3d43d238b26644f39f7c → 0.0.0-experimental.65ad956ae83ac65d866b9bb3e8c022c34b85468f
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-DErJQEVW.mjs → ComponentConfigurationPage-CpBFh6_r.mjs} +3 -3
- package/dist/_chunks/{ComponentConfigurationPage-DErJQEVW.mjs.map → ComponentConfigurationPage-CpBFh6_r.mjs.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-Cl7eB3s4.js → ComponentConfigurationPage-_zF8p6CY.js} +3 -3
- package/dist/_chunks/{ComponentConfigurationPage-Cl7eB3s4.js.map → ComponentConfigurationPage-_zF8p6CY.js.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-CBosWqQ7.mjs → EditConfigurationPage-CE_yavTi.mjs} +3 -3
- package/dist/_chunks/{EditConfigurationPage-CBosWqQ7.mjs.map → EditConfigurationPage-CE_yavTi.mjs.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-CyfFvH6-.js → EditConfigurationPage-_aG2DJSU.js} +3 -3
- package/dist/_chunks/{EditConfigurationPage-CyfFvH6-.js.map → EditConfigurationPage-_aG2DJSU.js.map} +1 -1
- package/dist/_chunks/{EditViewPage-ClIueJnM.mjs → EditViewPage-DeTn7rAF.mjs} +19 -8
- package/dist/_chunks/EditViewPage-DeTn7rAF.mjs.map +1 -0
- package/dist/_chunks/{EditViewPage-DxyAOItK.js → EditViewPage-G9uNzwYL.js} +19 -8
- package/dist/_chunks/EditViewPage-G9uNzwYL.js.map +1 -0
- package/dist/_chunks/{Field-BZBYmvaf.mjs → Field-CnCKhI1R.mjs} +463 -143
- package/dist/_chunks/Field-CnCKhI1R.mjs.map +1 -0
- package/dist/_chunks/{Field-C0Y_SR9e.js → Field-DDHUWEfV.js} +465 -145
- package/dist/_chunks/Field-DDHUWEfV.js.map +1 -0
- package/dist/_chunks/{Form-DwvGnISS.js → Form-DYETaKUX.js} +35 -16
- package/dist/_chunks/Form-DYETaKUX.js.map +1 -0
- package/dist/_chunks/{Form-jwRSC2kV.mjs → Form-IvVVwqRL.mjs} +35 -16
- package/dist/_chunks/Form-IvVVwqRL.mjs.map +1 -0
- package/dist/_chunks/{History-BgzAIj0G.mjs → History-BMunT-do.mjs} +44 -19
- package/dist/_chunks/History-BMunT-do.mjs.map +1 -0
- package/dist/_chunks/{History-Cda0Yjzz.js → History-CnZDctSO.js} +44 -19
- package/dist/_chunks/History-CnZDctSO.js.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-C29EF97r.js → ListConfigurationPage-BynalOp8.js} +20 -8
- package/dist/_chunks/ListConfigurationPage-BynalOp8.js.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-GH55qfoT.mjs → ListConfigurationPage-CDqkCxgV.mjs} +20 -8
- package/dist/_chunks/ListConfigurationPage-CDqkCxgV.mjs.map +1 -0
- package/dist/_chunks/{ListViewPage-CnRt0UT7.js → ListViewPage-I88Ouzoq.js} +56 -42
- package/dist/_chunks/ListViewPage-I88Ouzoq.js.map +1 -0
- package/dist/_chunks/{ListViewPage-QU03PFj1.mjs → ListViewPage-_5gS-DOF.mjs} +54 -40
- package/dist/_chunks/ListViewPage-_5gS-DOF.mjs.map +1 -0
- package/dist/_chunks/{NoContentTypePage-DFDjxByI.js → NoContentTypePage-BaWQ7HsA.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-DFDjxByI.js.map → NoContentTypePage-BaWQ7HsA.js.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-CPs2CnzH.mjs → NoContentTypePage-Dht-55hr.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-CPs2CnzH.mjs.map → NoContentTypePage-Dht-55hr.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-ct58lcY0.mjs → NoPermissionsPage-Bs8D5W_v.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-ct58lcY0.mjs.map → NoPermissionsPage-Bs8D5W_v.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-BVHI-jv5.js → NoPermissionsPage-DCVUh5at.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-BVHI-jv5.js.map → NoPermissionsPage-DCVUh5at.js.map} +1 -1
- package/dist/_chunks/{Relations-BjpPPCKp.js → Relations-BPgFQeGj.js} +4 -4
- package/dist/_chunks/Relations-BPgFQeGj.js.map +1 -0
- package/dist/_chunks/{Relations-KMf5qEN0.mjs → Relations-Chdt5qWc.mjs} +4 -4
- package/dist/_chunks/Relations-Chdt5qWc.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-D9ZwczCV.js → index-BhbLFX4l.js} +440 -199
- package/dist/_chunks/index-BhbLFX4l.js.map +1 -0
- package/dist/_chunks/{index-6kKXK7y8.mjs → index-D4UGPFZC.mjs} +447 -206
- package/dist/_chunks/index-D4UGPFZC.mjs.map +1 -0
- package/dist/_chunks/{layout-BJfBoBiF.js → layout-CYA7s0qO.js} +25 -12
- package/dist/_chunks/layout-CYA7s0qO.js.map +1 -0
- package/dist/_chunks/{layout-B1Z-9koY.mjs → layout-D4HI4_PS.mjs} +27 -14
- package/dist/_chunks/layout-D4HI4_PS.mjs.map +1 -0
- package/dist/_chunks/{relations-CgZg7Pyx.mjs → relations-1pXaYpBK.mjs} +2 -2
- package/dist/_chunks/{relations-CgZg7Pyx.mjs.map → relations-1pXaYpBK.mjs.map} +1 -1
- package/dist/_chunks/{relations-CMvjzyU3.js → relations-DDZ9OxNo.js} +2 -2
- package/dist/_chunks/{relations-CMvjzyU3.js.map → relations-DDZ9OxNo.js.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 +1 -1
- 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/BlocksInput/utils/constants.d.ts +4 -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 +178 -105
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +179 -106
- 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-ClIueJnM.mjs.map +0 -1
- package/dist/_chunks/EditViewPage-DxyAOItK.js.map +0 -1
- package/dist/_chunks/Field-BZBYmvaf.mjs.map +0 -1
- package/dist/_chunks/Field-C0Y_SR9e.js.map +0 -1
- package/dist/_chunks/Form-DwvGnISS.js.map +0 -1
- package/dist/_chunks/Form-jwRSC2kV.mjs.map +0 -1
- package/dist/_chunks/History-BgzAIj0G.mjs.map +0 -1
- package/dist/_chunks/History-Cda0Yjzz.js.map +0 -1
- package/dist/_chunks/ListConfigurationPage-C29EF97r.js.map +0 -1
- package/dist/_chunks/ListConfigurationPage-GH55qfoT.mjs.map +0 -1
- package/dist/_chunks/ListViewPage-CnRt0UT7.js.map +0 -1
- package/dist/_chunks/ListViewPage-QU03PFj1.mjs.map +0 -1
- package/dist/_chunks/Relations-BjpPPCKp.js.map +0 -1
- package/dist/_chunks/Relations-KMf5qEN0.mjs.map +0 -1
- package/dist/_chunks/index-6kKXK7y8.mjs.map +0 -1
- package/dist/_chunks/index-D9ZwczCV.js.map +0 -1
- package/dist/_chunks/layout-B1Z-9koY.mjs.map +0 -1
- package/dist/_chunks/layout-BJfBoBiF.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";
|
@@ -216,8 +180,7 @@ const contentManagerApi = strapiAdmin.adminApi.enhanceEndpoints({
|
|
216
180
|
"InitialData",
|
217
181
|
"HistoryVersion",
|
218
182
|
"Relations",
|
219
|
-
"
|
220
|
-
"ReleaseAction"
|
183
|
+
"UidAvailability"
|
221
184
|
]
|
222
185
|
});
|
223
186
|
const documentApi = contentManagerApi.injectEndpoints({
|
@@ -231,7 +194,12 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
231
194
|
params: query
|
232
195
|
}
|
233
196
|
}),
|
234
|
-
invalidatesTags: (_result,
|
197
|
+
invalidatesTags: (_result, error, { model }) => {
|
198
|
+
if (error) {
|
199
|
+
return [];
|
200
|
+
}
|
201
|
+
return [{ type: "Document", id: `${model}_LIST` }];
|
202
|
+
}
|
235
203
|
}),
|
236
204
|
cloneDocument: builder.mutation({
|
237
205
|
query: ({ model, sourceId, data, params }) => ({
|
@@ -242,7 +210,10 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
242
210
|
params
|
243
211
|
}
|
244
212
|
}),
|
245
|
-
invalidatesTags: (_result, _error, { model }) => [
|
213
|
+
invalidatesTags: (_result, _error, { model }) => [
|
214
|
+
{ type: "Document", id: `${model}_LIST` },
|
215
|
+
{ type: "UidAvailability", id: model }
|
216
|
+
]
|
246
217
|
}),
|
247
218
|
/**
|
248
219
|
* Creates a new collection-type document. This should ONLY be used for collection-types.
|
@@ -259,7 +230,8 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
259
230
|
}),
|
260
231
|
invalidatesTags: (result, _error, { model }) => [
|
261
232
|
{ type: "Document", id: `${model}_LIST` },
|
262
|
-
"Relations"
|
233
|
+
"Relations",
|
234
|
+
{ type: "UidAvailability", id: model }
|
263
235
|
]
|
264
236
|
}),
|
265
237
|
deleteDocument: builder.mutation({
|
@@ -271,9 +243,7 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
271
243
|
}
|
272
244
|
}),
|
273
245
|
invalidatesTags: (_result, _error, { collectionType, model }) => [
|
274
|
-
{ type: "Document", id: collectionType !== SINGLE_TYPES ? `${model}_LIST` : model }
|
275
|
-
{ type: "Release", id: "LIST" },
|
276
|
-
{ type: "ReleaseAction", id: "LIST" }
|
246
|
+
{ type: "Document", id: collectionType !== SINGLE_TYPES ? `${model}_LIST` : model }
|
277
247
|
]
|
278
248
|
}),
|
279
249
|
deleteManyDocuments: builder.mutation({
|
@@ -285,11 +255,7 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
285
255
|
params
|
286
256
|
}
|
287
257
|
}),
|
288
|
-
invalidatesTags: (_res, _error, { model }) => [
|
289
|
-
{ type: "Document", id: `${model}_LIST` },
|
290
|
-
{ type: "Release", id: "LIST" },
|
291
|
-
{ type: "ReleaseAction", id: "LIST" }
|
292
|
-
]
|
258
|
+
invalidatesTags: (_res, _error, { model }) => [{ type: "Document", id: `${model}_LIST` }]
|
293
259
|
}),
|
294
260
|
discardDocument: builder.mutation({
|
295
261
|
query: ({ collectionType, model, documentId, params }) => ({
|
@@ -307,8 +273,7 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
307
273
|
},
|
308
274
|
{ type: "Document", id: `${model}_LIST` },
|
309
275
|
"Relations",
|
310
|
-
{ type: "
|
311
|
-
{ type: "ReleaseAction", id: "LIST" }
|
276
|
+
{ type: "UidAvailability", id: model }
|
312
277
|
];
|
313
278
|
}
|
314
279
|
}),
|
@@ -326,6 +291,7 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
326
291
|
}),
|
327
292
|
providesTags: (result, _error, arg) => {
|
328
293
|
return [
|
294
|
+
{ type: "Document", id: `ALL_LIST` },
|
329
295
|
{ type: "Document", id: `${arg.model}_LIST` },
|
330
296
|
...result?.results.map(({ documentId }) => ({
|
331
297
|
type: "Document",
|
@@ -364,6 +330,11 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
364
330
|
{
|
365
331
|
type: "Document",
|
366
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`
|
367
338
|
}
|
368
339
|
];
|
369
340
|
}
|
@@ -428,9 +399,20 @@ const documentApi = contentManagerApi.injectEndpoints({
|
|
428
399
|
id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
|
429
400
|
},
|
430
401
|
"Relations",
|
431
|
-
{ type: "
|
432
|
-
{ type: "ReleaseAction", id: "LIST" }
|
402
|
+
{ type: "UidAvailability", id: model }
|
433
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
|
+
}
|
434
416
|
}
|
435
417
|
}),
|
436
418
|
unpublishDocument: builder.mutation({
|
@@ -500,7 +482,7 @@ const buildValidParams = (query) => {
|
|
500
482
|
const isBaseQueryError = (error) => {
|
501
483
|
return error.name !== void 0;
|
502
484
|
};
|
503
|
-
const createYupSchema = (attributes = {}, components = {}) => {
|
485
|
+
const createYupSchema = (attributes = {}, components = {}, options = { status: null }) => {
|
504
486
|
const createModelSchema = (attributes2) => yup__namespace.object().shape(
|
505
487
|
Object.entries(attributes2).reduce((acc, [name, attribute]) => {
|
506
488
|
if (DOCUMENT_META_FIELDS.includes(name)) {
|
@@ -513,7 +495,7 @@ const createYupSchema = (attributes = {}, components = {}) => {
|
|
513
495
|
addMinValidation,
|
514
496
|
addMaxValidation,
|
515
497
|
addRegexValidation
|
516
|
-
].map((fn) => fn(attribute));
|
498
|
+
].map((fn) => fn(attribute, options));
|
517
499
|
const transformSchema = pipe__default.default(...validations);
|
518
500
|
switch (attribute.type) {
|
519
501
|
case "component": {
|
@@ -614,6 +596,14 @@ const createAttributeSchema = (attribute) => {
|
|
614
596
|
if (!value || typeof value === "string" && value.length === 0) {
|
615
597
|
return true;
|
616
598
|
}
|
599
|
+
if (typeof value === "object") {
|
600
|
+
try {
|
601
|
+
JSON.stringify(value);
|
602
|
+
return true;
|
603
|
+
} catch (err) {
|
604
|
+
return false;
|
605
|
+
}
|
606
|
+
}
|
617
607
|
try {
|
618
608
|
JSON.parse(value);
|
619
609
|
return true;
|
@@ -632,13 +622,7 @@ const createAttributeSchema = (attribute) => {
|
|
632
622
|
return yup__namespace.mixed();
|
633
623
|
}
|
634
624
|
};
|
635
|
-
const
|
636
|
-
if (attribute.required) {
|
637
|
-
return schema.required({
|
638
|
-
id: strapiAdmin.translatedErrors.required.id,
|
639
|
-
defaultMessage: "This field is required."
|
640
|
-
});
|
641
|
-
}
|
625
|
+
const nullableSchema = (schema) => {
|
642
626
|
return schema?.nullable ? schema.nullable() : (
|
643
627
|
// In some cases '.nullable' will not be available on the schema.
|
644
628
|
// e.g. when the schema has been built using yup.lazy (e.g. for relations).
|
@@ -646,7 +630,22 @@ const addRequiredValidation = (attribute) => (schema) => {
|
|
646
630
|
schema
|
647
631
|
);
|
648
632
|
};
|
649
|
-
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
|
+
}
|
650
649
|
if ("minLength" in attribute && attribute.minLength && Number.isInteger(attribute.minLength) && "min" in schema) {
|
651
650
|
return schema.min(attribute.minLength, {
|
652
651
|
...strapiAdmin.translatedErrors.minLength,
|
@@ -668,9 +667,31 @@ const addMaxLengthValidation = (attribute) => (schema) => {
|
|
668
667
|
}
|
669
668
|
return schema;
|
670
669
|
};
|
671
|
-
const addMinValidation = (attribute) => (schema) => {
|
670
|
+
const addMinValidation = (attribute, options) => (schema) => {
|
672
671
|
if ("min" in attribute) {
|
673
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
|
+
}
|
674
695
|
if ("min" in schema && min) {
|
675
696
|
return schema.min(min, {
|
676
697
|
...strapiAdmin.translatedErrors.min,
|
@@ -797,7 +818,10 @@ const useDocument = (args, opts) => {
|
|
797
818
|
isLoading: isLoadingDocument,
|
798
819
|
isFetching: isFetchingDocument,
|
799
820
|
error
|
800
|
-
} = useGetDocumentQuery(args,
|
821
|
+
} = useGetDocumentQuery(args, {
|
822
|
+
...opts,
|
823
|
+
skip: !args.documentId && args.collectionType !== SINGLE_TYPES || opts?.skip
|
824
|
+
});
|
801
825
|
const { components, schema, isLoading: isLoadingSchema } = useContentTypeSchema(args.model);
|
802
826
|
React__namespace.useEffect(() => {
|
803
827
|
if (error) {
|
@@ -883,6 +907,7 @@ const useDocumentActions = () => {
|
|
883
907
|
const { formatMessage } = reactIntl.useIntl();
|
884
908
|
const { trackUsage } = strapiAdmin.useTracking();
|
885
909
|
const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
|
910
|
+
const navigate = reactRouterDom.useNavigate();
|
886
911
|
const [deleteDocument] = useDeleteDocumentMutation();
|
887
912
|
const _delete = React__namespace.useCallback(
|
888
913
|
async ({ collectionType, model, documentId, params }, trackerProperty) => {
|
@@ -1218,7 +1243,6 @@ const useDocumentActions = () => {
|
|
1218
1243
|
sourceId
|
1219
1244
|
});
|
1220
1245
|
if ("error" in res) {
|
1221
|
-
toggleNotification({ type: "danger", message: formatAPIError(res.error) });
|
1222
1246
|
return { error: res.error };
|
1223
1247
|
}
|
1224
1248
|
toggleNotification({
|
@@ -1237,7 +1261,7 @@ const useDocumentActions = () => {
|
|
1237
1261
|
throw err;
|
1238
1262
|
}
|
1239
1263
|
},
|
1240
|
-
[autoCloneDocument,
|
1264
|
+
[autoCloneDocument, formatMessage, toggleNotification]
|
1241
1265
|
);
|
1242
1266
|
const [cloneDocument] = useCloneDocumentMutation();
|
1243
1267
|
const clone = React__namespace.useCallback(
|
@@ -1263,6 +1287,7 @@ const useDocumentActions = () => {
|
|
1263
1287
|
defaultMessage: "Cloned document"
|
1264
1288
|
})
|
1265
1289
|
});
|
1290
|
+
navigate(`../../${res.data.data.documentId}`, { relative: "path" });
|
1266
1291
|
return res.data;
|
1267
1292
|
} catch (err) {
|
1268
1293
|
toggleNotification({
|
@@ -1273,7 +1298,7 @@ const useDocumentActions = () => {
|
|
1273
1298
|
throw err;
|
1274
1299
|
}
|
1275
1300
|
},
|
1276
|
-
[cloneDocument, trackUsage, toggleNotification, formatMessage, formatAPIError]
|
1301
|
+
[cloneDocument, trackUsage, toggleNotification, formatMessage, formatAPIError, navigate]
|
1277
1302
|
);
|
1278
1303
|
const [getDoc] = useLazyGetDocumentQuery();
|
1279
1304
|
const getDocument = React__namespace.useCallback(
|
@@ -1299,7 +1324,7 @@ const useDocumentActions = () => {
|
|
1299
1324
|
};
|
1300
1325
|
};
|
1301
1326
|
const ProtectedHistoryPage = React.lazy(
|
1302
|
-
() => Promise.resolve().then(() => require("./History-
|
1327
|
+
() => Promise.resolve().then(() => require("./History-CnZDctSO.js")).then((mod) => ({ default: mod.ProtectedHistoryPage }))
|
1303
1328
|
);
|
1304
1329
|
const routes$1 = [
|
1305
1330
|
{
|
@@ -1312,31 +1337,31 @@ const routes$1 = [
|
|
1312
1337
|
}
|
1313
1338
|
];
|
1314
1339
|
const ProtectedEditViewPage = React.lazy(
|
1315
|
-
() => Promise.resolve().then(() => require("./EditViewPage-
|
1340
|
+
() => Promise.resolve().then(() => require("./EditViewPage-G9uNzwYL.js")).then((mod) => ({ default: mod.ProtectedEditViewPage }))
|
1316
1341
|
);
|
1317
1342
|
const ProtectedListViewPage = React.lazy(
|
1318
|
-
() => Promise.resolve().then(() => require("./ListViewPage-
|
1343
|
+
() => Promise.resolve().then(() => require("./ListViewPage-I88Ouzoq.js")).then((mod) => ({ default: mod.ProtectedListViewPage }))
|
1319
1344
|
);
|
1320
1345
|
const ProtectedListConfiguration = React.lazy(
|
1321
|
-
() => Promise.resolve().then(() => require("./ListConfigurationPage-
|
1346
|
+
() => Promise.resolve().then(() => require("./ListConfigurationPage-BynalOp8.js")).then((mod) => ({
|
1322
1347
|
default: mod.ProtectedListConfiguration
|
1323
1348
|
}))
|
1324
1349
|
);
|
1325
1350
|
const ProtectedEditConfigurationPage = React.lazy(
|
1326
|
-
() => Promise.resolve().then(() => require("./EditConfigurationPage-
|
1351
|
+
() => Promise.resolve().then(() => require("./EditConfigurationPage-_aG2DJSU.js")).then((mod) => ({
|
1327
1352
|
default: mod.ProtectedEditConfigurationPage
|
1328
1353
|
}))
|
1329
1354
|
);
|
1330
1355
|
const ProtectedComponentConfigurationPage = React.lazy(
|
1331
|
-
() => Promise.resolve().then(() => require("./ComponentConfigurationPage-
|
1356
|
+
() => Promise.resolve().then(() => require("./ComponentConfigurationPage-_zF8p6CY.js")).then((mod) => ({
|
1332
1357
|
default: mod.ProtectedComponentConfigurationPage
|
1333
1358
|
}))
|
1334
1359
|
);
|
1335
1360
|
const NoPermissions = React.lazy(
|
1336
|
-
() => Promise.resolve().then(() => require("./NoPermissionsPage-
|
1361
|
+
() => Promise.resolve().then(() => require("./NoPermissionsPage-DCVUh5at.js")).then((mod) => ({ default: mod.NoPermissions }))
|
1337
1362
|
);
|
1338
1363
|
const NoContentType = React.lazy(
|
1339
|
-
() => Promise.resolve().then(() => require("./NoContentTypePage-
|
1364
|
+
() => Promise.resolve().then(() => require("./NoContentTypePage-BaWQ7HsA.js")).then((mod) => ({ default: mod.NoContentType }))
|
1340
1365
|
);
|
1341
1366
|
const CollectionTypePages = () => {
|
1342
1367
|
const { collectionType } = reactRouterDom.useParams();
|
@@ -1450,12 +1475,14 @@ const DocumentActionButton = (action) => {
|
|
1450
1475
|
/* @__PURE__ */ jsxRuntime.jsx(
|
1451
1476
|
designSystem.Button,
|
1452
1477
|
{
|
1453
|
-
flex:
|
1478
|
+
flex: "auto",
|
1454
1479
|
startIcon: action.icon,
|
1455
1480
|
disabled: action.disabled,
|
1456
1481
|
onClick: handleClick(action),
|
1457
1482
|
justifyContent: "center",
|
1458
1483
|
variant: action.variant || "default",
|
1484
|
+
paddingTop: "7px",
|
1485
|
+
paddingBottom: "7px",
|
1459
1486
|
children: action.label
|
1460
1487
|
}
|
1461
1488
|
),
|
@@ -1463,7 +1490,7 @@ const DocumentActionButton = (action) => {
|
|
1463
1490
|
DocumentActionConfirmDialog,
|
1464
1491
|
{
|
1465
1492
|
...action.dialog,
|
1466
|
-
variant: action.variant,
|
1493
|
+
variant: action.dialog?.variant ?? action.variant,
|
1467
1494
|
isOpen: dialogId === action.id,
|
1468
1495
|
onClose: handleClose
|
1469
1496
|
}
|
@@ -1520,9 +1547,9 @@ const DocumentActionsMenu = ({
|
|
1520
1547
|
disabled: isDisabled,
|
1521
1548
|
size: "S",
|
1522
1549
|
endIcon: null,
|
1523
|
-
paddingTop: "
|
1524
|
-
paddingLeft: "
|
1525
|
-
paddingRight: "
|
1550
|
+
paddingTop: "4px",
|
1551
|
+
paddingLeft: "7px",
|
1552
|
+
paddingRight: "7px",
|
1526
1553
|
variant,
|
1527
1554
|
children: [
|
1528
1555
|
/* @__PURE__ */ jsxRuntime.jsx(Icons.More, { "aria-hidden": true, focusable: false }),
|
@@ -1542,10 +1569,25 @@ const DocumentActionsMenu = ({
|
|
1542
1569
|
onSelect: handleClick(action),
|
1543
1570
|
display: "block",
|
1544
1571
|
children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", gap: 4, children: [
|
1545
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
1546
|
-
|
1547
|
-
|
1548
|
-
|
1572
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
1573
|
+
designSystem.Flex,
|
1574
|
+
{
|
1575
|
+
color: !action.disabled ? convertActionVariantToColor(action.variant) : "inherit",
|
1576
|
+
gap: 2,
|
1577
|
+
tag: "span",
|
1578
|
+
children: [
|
1579
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
1580
|
+
designSystem.Flex,
|
1581
|
+
{
|
1582
|
+
tag: "span",
|
1583
|
+
color: !action.disabled ? convertActionVariantToIconColor(action.variant) : "inherit",
|
1584
|
+
children: action.icon
|
1585
|
+
}
|
1586
|
+
),
|
1587
|
+
action.label
|
1588
|
+
]
|
1589
|
+
}
|
1590
|
+
),
|
1549
1591
|
action.id.startsWith("HistoryAction") && /* @__PURE__ */ jsxRuntime.jsx(
|
1550
1592
|
designSystem.Flex,
|
1551
1593
|
{
|
@@ -1642,11 +1684,11 @@ const DocumentActionConfirmDialog = ({
|
|
1642
1684
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: title }),
|
1643
1685
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Body, { children: content }),
|
1644
1686
|
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Footer, { children: [
|
1645
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Cancel, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", children: formatMessage({
|
1687
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Cancel, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", fullWidth: true, children: formatMessage({
|
1646
1688
|
id: "app.components.Button.cancel",
|
1647
1689
|
defaultMessage: "Cancel"
|
1648
1690
|
}) }) }),
|
1649
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleConfirm, variant, children: formatMessage({
|
1691
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleConfirm, variant, fullWidth: true, children: formatMessage({
|
1650
1692
|
id: "app.components.Button.confirm",
|
1651
1693
|
defaultMessage: "Confirm"
|
1652
1694
|
}) })
|
@@ -1685,13 +1727,17 @@ const PublishAction$1 = ({
|
|
1685
1727
|
const navigate = reactRouterDom.useNavigate();
|
1686
1728
|
const { toggleNotification } = strapiAdmin.useNotification();
|
1687
1729
|
const { _unstableFormatValidationErrors: formatValidationErrors } = strapiAdmin.useAPIErrorHandler();
|
1730
|
+
const isListView = reactRouterDom.useMatch(LIST_PATH) !== null;
|
1688
1731
|
const isCloning = reactRouterDom.useMatch(CLONE_PATH) !== null;
|
1689
1732
|
const { formatMessage } = reactIntl.useIntl();
|
1690
|
-
const { canPublish
|
1691
|
-
"PublishAction",
|
1692
|
-
({ canPublish: canPublish2, canCreate: canCreate2, canUpdate: canUpdate2 }) => ({ canPublish: canPublish2, canCreate: canCreate2, canUpdate: canUpdate2 })
|
1693
|
-
);
|
1733
|
+
const canPublish = useDocumentRBAC("PublishAction", ({ canPublish: canPublish2 }) => canPublish2);
|
1694
1734
|
const { publish } = useDocumentActions();
|
1735
|
+
const [
|
1736
|
+
countDraftRelations,
|
1737
|
+
{ isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }
|
1738
|
+
] = useLazyGetDraftRelationCountQuery();
|
1739
|
+
const [localCountOfDraftRelations, setLocalCountOfDraftRelations] = React__namespace.useState(0);
|
1740
|
+
const [serverCountOfDraftRelations, setServerCountOfDraftRelations] = React__namespace.useState(0);
|
1695
1741
|
const [{ query, rawQuery }] = strapiAdmin.useQueryParams();
|
1696
1742
|
const params = React__namespace.useMemo(() => buildValidParams(query), [query]);
|
1697
1743
|
const modified = strapiAdmin.useForm("PublishAction", ({ modified: modified2 }) => modified2);
|
@@ -1700,10 +1746,103 @@ const PublishAction$1 = ({
|
|
1700
1746
|
const validate = strapiAdmin.useForm("PublishAction", (state) => state.validate);
|
1701
1747
|
const setErrors = strapiAdmin.useForm("PublishAction", (state) => state.setErrors);
|
1702
1748
|
const formValues = strapiAdmin.useForm("PublishAction", ({ values }) => values);
|
1749
|
+
React__namespace.useEffect(() => {
|
1750
|
+
if (isErrorDraftRelations) {
|
1751
|
+
toggleNotification({
|
1752
|
+
type: "danger",
|
1753
|
+
message: formatMessage({
|
1754
|
+
id: getTranslation("error.records.fetch-draft-relatons"),
|
1755
|
+
defaultMessage: "An error occurred while fetching draft relations on this document."
|
1756
|
+
})
|
1757
|
+
});
|
1758
|
+
}
|
1759
|
+
}, [isErrorDraftRelations, toggleNotification, formatMessage]);
|
1760
|
+
React__namespace.useEffect(() => {
|
1761
|
+
const localDraftRelations = /* @__PURE__ */ new Set();
|
1762
|
+
const extractDraftRelations = (data) => {
|
1763
|
+
const relations = data.connect || [];
|
1764
|
+
relations.forEach((relation) => {
|
1765
|
+
if (relation.status === "draft") {
|
1766
|
+
localDraftRelations.add(relation.id);
|
1767
|
+
}
|
1768
|
+
});
|
1769
|
+
};
|
1770
|
+
const traverseAndExtract = (data) => {
|
1771
|
+
Object.entries(data).forEach(([key, value]) => {
|
1772
|
+
if (key === "connect" && Array.isArray(value)) {
|
1773
|
+
extractDraftRelations({ connect: value });
|
1774
|
+
} else if (typeof value === "object" && value !== null) {
|
1775
|
+
traverseAndExtract(value);
|
1776
|
+
}
|
1777
|
+
});
|
1778
|
+
};
|
1779
|
+
if (!documentId || modified) {
|
1780
|
+
traverseAndExtract(formValues);
|
1781
|
+
setLocalCountOfDraftRelations(localDraftRelations.size);
|
1782
|
+
}
|
1783
|
+
}, [documentId, modified, formValues, setLocalCountOfDraftRelations]);
|
1784
|
+
React__namespace.useEffect(() => {
|
1785
|
+
if (!document || !document.documentId || isListView) {
|
1786
|
+
return;
|
1787
|
+
}
|
1788
|
+
const fetchDraftRelationsCount = async () => {
|
1789
|
+
const { data, error } = await countDraftRelations({
|
1790
|
+
collectionType,
|
1791
|
+
model,
|
1792
|
+
documentId,
|
1793
|
+
params
|
1794
|
+
});
|
1795
|
+
if (error) {
|
1796
|
+
throw error;
|
1797
|
+
}
|
1798
|
+
if (data) {
|
1799
|
+
setServerCountOfDraftRelations(data.data);
|
1800
|
+
}
|
1801
|
+
};
|
1802
|
+
fetchDraftRelationsCount();
|
1803
|
+
}, [isListView, document, documentId, countDraftRelations, collectionType, model, params]);
|
1703
1804
|
const isDocumentPublished = (document?.[PUBLISHED_AT_ATTRIBUTE_NAME] || meta?.availableStatus.some((doc) => doc[PUBLISHED_AT_ATTRIBUTE_NAME] !== null)) && document?.status !== "modified";
|
1704
1805
|
if (!schema?.options?.draftAndPublish) {
|
1705
1806
|
return null;
|
1706
1807
|
}
|
1808
|
+
const performPublish = async () => {
|
1809
|
+
setSubmitting(true);
|
1810
|
+
try {
|
1811
|
+
const { errors } = await validate();
|
1812
|
+
if (errors) {
|
1813
|
+
toggleNotification({
|
1814
|
+
type: "danger",
|
1815
|
+
message: formatMessage({
|
1816
|
+
id: "content-manager.validation.error",
|
1817
|
+
defaultMessage: "There are validation errors in your document. Please fix them before saving."
|
1818
|
+
})
|
1819
|
+
});
|
1820
|
+
return;
|
1821
|
+
}
|
1822
|
+
const res = await publish(
|
1823
|
+
{
|
1824
|
+
collectionType,
|
1825
|
+
model,
|
1826
|
+
documentId,
|
1827
|
+
params
|
1828
|
+
},
|
1829
|
+
formValues
|
1830
|
+
);
|
1831
|
+
if ("data" in res && collectionType !== SINGLE_TYPES) {
|
1832
|
+
navigate({
|
1833
|
+
pathname: `../${collectionType}/${model}/${res.data.documentId}`,
|
1834
|
+
search: rawQuery
|
1835
|
+
});
|
1836
|
+
} else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
|
1837
|
+
setErrors(formatValidationErrors(res.error));
|
1838
|
+
}
|
1839
|
+
} finally {
|
1840
|
+
setSubmitting(false);
|
1841
|
+
}
|
1842
|
+
};
|
1843
|
+
const totalDraftRelations = localCountOfDraftRelations + serverCountOfDraftRelations;
|
1844
|
+
const enableDraftRelationsCount = false;
|
1845
|
+
const hasDraftRelations = enableDraftRelationsCount;
|
1707
1846
|
return {
|
1708
1847
|
/**
|
1709
1848
|
* Disabled when:
|
@@ -1713,49 +1852,36 @@ const PublishAction$1 = ({
|
|
1713
1852
|
* - the document is already published & not modified
|
1714
1853
|
* - the document is being created & not modified
|
1715
1854
|
* - the user doesn't have the permission to publish
|
1716
|
-
* - the user doesn't have the permission to create a new document
|
1717
|
-
* - the user doesn't have the permission to update the document
|
1718
1855
|
*/
|
1719
|
-
disabled: isCloning || isSubmitting || activeTab === "published" || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish
|
1856
|
+
disabled: isCloning || isSubmitting || isLoadingDraftRelations || activeTab === "published" || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish,
|
1720
1857
|
label: formatMessage({
|
1721
1858
|
id: "app.utils.publish",
|
1722
1859
|
defaultMessage: "Publish"
|
1723
1860
|
}),
|
1724
1861
|
onClick: async () => {
|
1725
|
-
|
1726
|
-
|
1727
|
-
|
1728
|
-
|
1729
|
-
|
1730
|
-
|
1731
|
-
|
1732
|
-
|
1733
|
-
|
1734
|
-
|
1735
|
-
|
1736
|
-
|
1737
|
-
|
1738
|
-
|
1739
|
-
|
1740
|
-
|
1741
|
-
|
1742
|
-
documentId,
|
1743
|
-
params
|
1744
|
-
},
|
1745
|
-
formValues
|
1746
|
-
);
|
1747
|
-
if ("data" in res && collectionType !== SINGLE_TYPES) {
|
1748
|
-
navigate({
|
1749
|
-
pathname: `../${collectionType}/${model}/${res.data.documentId}`,
|
1750
|
-
search: rawQuery
|
1751
|
-
});
|
1752
|
-
} else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
|
1753
|
-
setErrors(formatValidationErrors(res.error));
|
1862
|
+
await performPublish();
|
1863
|
+
},
|
1864
|
+
dialog: hasDraftRelations ? {
|
1865
|
+
type: "dialog",
|
1866
|
+
variant: "danger",
|
1867
|
+
footer: null,
|
1868
|
+
title: formatMessage({
|
1869
|
+
id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.title`),
|
1870
|
+
defaultMessage: "Confirmation"
|
1871
|
+
}),
|
1872
|
+
content: formatMessage(
|
1873
|
+
{
|
1874
|
+
id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.message`),
|
1875
|
+
defaultMessage: "This entry is related to {count, plural, one {# draft entry} other {# draft entries}}. Publishing it could leave broken links in your app."
|
1876
|
+
},
|
1877
|
+
{
|
1878
|
+
count: totalDraftRelations
|
1754
1879
|
}
|
1755
|
-
|
1756
|
-
|
1880
|
+
),
|
1881
|
+
onConfirm: async () => {
|
1882
|
+
await performPublish();
|
1757
1883
|
}
|
1758
|
-
}
|
1884
|
+
} : void 0
|
1759
1885
|
};
|
1760
1886
|
};
|
1761
1887
|
PublishAction$1.type = "publish";
|
@@ -1771,10 +1897,6 @@ const UpdateAction = ({
|
|
1771
1897
|
const cloneMatch = reactRouterDom.useMatch(CLONE_PATH);
|
1772
1898
|
const isCloning = cloneMatch !== null;
|
1773
1899
|
const { formatMessage } = reactIntl.useIntl();
|
1774
|
-
const { canCreate, canUpdate } = useDocumentRBAC("UpdateAction", ({ canCreate: canCreate2, canUpdate: canUpdate2 }) => ({
|
1775
|
-
canCreate: canCreate2,
|
1776
|
-
canUpdate: canUpdate2
|
1777
|
-
}));
|
1778
1900
|
const { create, update, clone } = useDocumentActions();
|
1779
1901
|
const [{ query, rawQuery }] = strapiAdmin.useQueryParams();
|
1780
1902
|
const params = React__namespace.useMemo(() => buildValidParams(query), [query]);
|
@@ -1791,10 +1913,8 @@ const UpdateAction = ({
|
|
1791
1913
|
* - the form is submitting
|
1792
1914
|
* - the document is not modified & we're not cloning (you can save a clone entity straight away)
|
1793
1915
|
* - the active tab is the published tab
|
1794
|
-
* - the user doesn't have the permission to create a new document
|
1795
|
-
* - the user doesn't have the permission to update the document
|
1796
1916
|
*/
|
1797
|
-
disabled: isSubmitting || !modified && !isCloning || activeTab === "published"
|
1917
|
+
disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
|
1798
1918
|
label: formatMessage({
|
1799
1919
|
id: "content-manager.containers.Edit.save",
|
1800
1920
|
defaultMessage: "Save"
|
@@ -1802,16 +1922,18 @@ const UpdateAction = ({
|
|
1802
1922
|
onClick: async () => {
|
1803
1923
|
setSubmitting(true);
|
1804
1924
|
try {
|
1805
|
-
|
1806
|
-
|
1807
|
-
|
1808
|
-
|
1809
|
-
|
1810
|
-
|
1811
|
-
|
1812
|
-
|
1813
|
-
|
1814
|
-
|
1925
|
+
if (activeTab !== "draft") {
|
1926
|
+
const { errors } = await validate();
|
1927
|
+
if (errors) {
|
1928
|
+
toggleNotification({
|
1929
|
+
type: "danger",
|
1930
|
+
message: formatMessage({
|
1931
|
+
id: "content-manager.validation.error",
|
1932
|
+
defaultMessage: "There are validation errors in your document. Please fix them before saving."
|
1933
|
+
})
|
1934
|
+
});
|
1935
|
+
return;
|
1936
|
+
}
|
1815
1937
|
}
|
1816
1938
|
if (isCloning) {
|
1817
1939
|
const res = await clone(
|
@@ -1823,10 +1945,13 @@ const UpdateAction = ({
|
|
1823
1945
|
document
|
1824
1946
|
);
|
1825
1947
|
if ("data" in res) {
|
1826
|
-
navigate(
|
1827
|
-
|
1828
|
-
|
1829
|
-
|
1948
|
+
navigate(
|
1949
|
+
{
|
1950
|
+
pathname: `../${res.data.documentId}`,
|
1951
|
+
search: rawQuery
|
1952
|
+
},
|
1953
|
+
{ relative: "path" }
|
1954
|
+
);
|
1830
1955
|
} else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
|
1831
1956
|
setErrors(formatValidationErrors(res.error));
|
1832
1957
|
}
|
@@ -1854,10 +1979,13 @@ const UpdateAction = ({
|
|
1854
1979
|
document
|
1855
1980
|
);
|
1856
1981
|
if ("data" in res && collectionType !== SINGLE_TYPES) {
|
1857
|
-
navigate(
|
1858
|
-
|
1859
|
-
|
1860
|
-
|
1982
|
+
navigate(
|
1983
|
+
{
|
1984
|
+
pathname: `../${res.data.documentId}`,
|
1985
|
+
search: rawQuery
|
1986
|
+
},
|
1987
|
+
{ replace: true, relative: "path" }
|
1988
|
+
);
|
1861
1989
|
} else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
|
1862
1990
|
setErrors(formatValidationErrors(res.error));
|
1863
1991
|
}
|
@@ -1901,7 +2029,7 @@ const UnpublishAction$1 = ({
|
|
1901
2029
|
id: "app.utils.unpublish",
|
1902
2030
|
defaultMessage: "Unpublish"
|
1903
2031
|
}),
|
1904
|
-
icon: /* @__PURE__ */ jsxRuntime.jsx(
|
2032
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Cross, {}),
|
1905
2033
|
onClick: async () => {
|
1906
2034
|
if (!documentId && collectionType !== SINGLE_TYPES || isDocumentModified) {
|
1907
2035
|
if (!documentId) {
|
@@ -2013,7 +2141,7 @@ const DiscardAction = ({
|
|
2013
2141
|
id: "content-manager.actions.discard.label",
|
2014
2142
|
defaultMessage: "Discard changes"
|
2015
2143
|
}),
|
2016
|
-
icon: /* @__PURE__ */ jsxRuntime.jsx(
|
2144
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Cross, {}),
|
2017
2145
|
position: ["panel", "table-row"],
|
2018
2146
|
variant: "danger",
|
2019
2147
|
dialog: {
|
@@ -2041,11 +2169,6 @@ const DiscardAction = ({
|
|
2041
2169
|
};
|
2042
2170
|
};
|
2043
2171
|
DiscardAction.type = "discard";
|
2044
|
-
const StyledCrossCircle = styledComponents.styled(Icons.CrossCircle)`
|
2045
|
-
path {
|
2046
|
-
fill: currentColor;
|
2047
|
-
}
|
2048
|
-
`;
|
2049
2172
|
const DEFAULT_ACTIONS = [PublishAction$1, UpdateAction, UnpublishAction$1, DiscardAction];
|
2050
2173
|
const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
|
2051
2174
|
const RelativeTime = React__namespace.forwardRef(
|
@@ -2093,7 +2216,7 @@ const getDisplayName = ({
|
|
2093
2216
|
};
|
2094
2217
|
const capitalise = (str) => str.charAt(0).toUpperCase() + str.slice(1);
|
2095
2218
|
const DocumentStatus = ({ status = "draft", ...restProps }) => {
|
2096
|
-
const statusVariant = status === "draft" ? "
|
2219
|
+
const statusVariant = status === "draft" ? "secondary" : status === "published" ? "success" : "alternative";
|
2097
2220
|
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) }) });
|
2098
2221
|
};
|
2099
2222
|
const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
|
@@ -2103,23 +2226,13 @@ const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
|
|
2103
2226
|
id: "content-manager.containers.edit.title.new",
|
2104
2227
|
defaultMessage: "Create an entry"
|
2105
2228
|
}) : documentTitle;
|
2106
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "flex-start", paddingTop:
|
2229
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "flex-start", paddingTop: 6, paddingBottom: 4, gap: 2, children: [
|
2107
2230
|
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.BackButton, {}),
|
2108
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
2109
|
-
designSystem.
|
2110
|
-
{
|
2111
|
-
|
2112
|
-
|
2113
|
-
paddingTop: 1,
|
2114
|
-
gap: "80px",
|
2115
|
-
alignItems: "flex-start",
|
2116
|
-
children: [
|
2117
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "alpha", tag: "h1", children: title }),
|
2118
|
-
/* @__PURE__ */ jsxRuntime.jsx(HeaderToolbar, {})
|
2119
|
-
]
|
2120
|
-
}
|
2121
|
-
),
|
2122
|
-
status ? /* @__PURE__ */ jsxRuntime.jsx(DocumentStatus, { status: isCloning ? "draft" : status }) : null
|
2231
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", justifyContent: "space-between", gap: "80px", alignItems: "flex-start", children: [
|
2232
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "alpha", tag: "h1", children: title }),
|
2233
|
+
/* @__PURE__ */ jsxRuntime.jsx(HeaderToolbar, {})
|
2234
|
+
] }),
|
2235
|
+
status ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 1, children: /* @__PURE__ */ jsxRuntime.jsx(DocumentStatus, { status: isCloning ? "draft" : status }) }) : null
|
2123
2236
|
] });
|
2124
2237
|
};
|
2125
2238
|
const HeaderToolbar = () => {
|
@@ -2286,8 +2399,22 @@ const Information = ({ activeTab }) => {
|
|
2286
2399
|
);
|
2287
2400
|
};
|
2288
2401
|
const HeaderActions = ({ actions: actions2 }) => {
|
2289
|
-
|
2290
|
-
|
2402
|
+
const [dialogId, setDialogId] = React__namespace.useState(null);
|
2403
|
+
const handleClick = (action) => async (e) => {
|
2404
|
+
if (!("options" in action)) {
|
2405
|
+
const { onClick = () => false, dialog, id } = action;
|
2406
|
+
const muteDialog = await onClick(e);
|
2407
|
+
if (dialog && !muteDialog) {
|
2408
|
+
e.preventDefault();
|
2409
|
+
setDialogId(id);
|
2410
|
+
}
|
2411
|
+
}
|
2412
|
+
};
|
2413
|
+
const handleClose = () => {
|
2414
|
+
setDialogId(null);
|
2415
|
+
};
|
2416
|
+
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { gap: 1, children: actions2.map((action) => {
|
2417
|
+
if (action.options) {
|
2291
2418
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
2292
2419
|
designSystem.SingleSelect,
|
2293
2420
|
{
|
@@ -2301,10 +2428,49 @@ const HeaderActions = ({ actions: actions2 }) => {
|
|
2301
2428
|
action.id
|
2302
2429
|
);
|
2303
2430
|
} else {
|
2304
|
-
|
2431
|
+
if (action.type === "icon") {
|
2432
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
|
2433
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
2434
|
+
designSystem.IconButton,
|
2435
|
+
{
|
2436
|
+
disabled: action.disabled,
|
2437
|
+
label: action.label,
|
2438
|
+
size: "S",
|
2439
|
+
onClick: handleClick(action),
|
2440
|
+
children: action.icon
|
2441
|
+
}
|
2442
|
+
),
|
2443
|
+
action.dialog ? /* @__PURE__ */ jsxRuntime.jsx(
|
2444
|
+
HeaderActionDialog,
|
2445
|
+
{
|
2446
|
+
...action.dialog,
|
2447
|
+
isOpen: dialogId === action.id,
|
2448
|
+
onClose: handleClose
|
2449
|
+
}
|
2450
|
+
) : null
|
2451
|
+
] }, action.id);
|
2452
|
+
}
|
2305
2453
|
}
|
2306
2454
|
}) });
|
2307
2455
|
};
|
2456
|
+
const HeaderActionDialog = ({
|
2457
|
+
onClose,
|
2458
|
+
onCancel,
|
2459
|
+
title,
|
2460
|
+
content: Content,
|
2461
|
+
isOpen
|
2462
|
+
}) => {
|
2463
|
+
const handleClose = async () => {
|
2464
|
+
if (onCancel) {
|
2465
|
+
await onCancel();
|
2466
|
+
}
|
2467
|
+
onClose();
|
2468
|
+
};
|
2469
|
+
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, { open: isOpen, onOpenChange: handleClose, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
|
2470
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: title }),
|
2471
|
+
typeof Content === "function" ? /* @__PURE__ */ jsxRuntime.jsx(Content, { onClose: handleClose }) : Content
|
2472
|
+
] }) });
|
2473
|
+
};
|
2308
2474
|
const ConfigureTheViewAction = ({ collectionType, model }) => {
|
2309
2475
|
const navigate = reactRouterDom.useNavigate();
|
2310
2476
|
const { formatMessage } = reactIntl.useIntl();
|
@@ -2440,7 +2606,7 @@ const ActionsPanel = () => {
|
|
2440
2606
|
return {
|
2441
2607
|
title: formatMessage({
|
2442
2608
|
id: "content-manager.containers.edit.panels.default.title",
|
2443
|
-
defaultMessage: "
|
2609
|
+
defaultMessage: "Entry"
|
2444
2610
|
}),
|
2445
2611
|
content: /* @__PURE__ */ jsxRuntime.jsx(ActionsPanelContent, {})
|
2446
2612
|
};
|
@@ -2684,7 +2850,8 @@ const formatEditLayout = (data, {
|
|
2684
2850
|
layout: convertEditLayoutToFieldLayouts(
|
2685
2851
|
configuration.layouts.edit,
|
2686
2852
|
components[uid].attributes,
|
2687
|
-
configuration.metadatas
|
2853
|
+
configuration.metadatas,
|
2854
|
+
{ configurations: data.components, schemas: components }
|
2688
2855
|
),
|
2689
2856
|
settings: {
|
2690
2857
|
...configuration.settings,
|
@@ -2810,7 +2977,7 @@ const ConfirmBulkActionDialog = ({
|
|
2810
2977
|
endAction
|
2811
2978
|
}) => {
|
2812
2979
|
const { formatMessage } = reactIntl.useIntl();
|
2813
|
-
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, {
|
2980
|
+
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, { open: isOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
|
2814
2981
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: formatMessage({
|
2815
2982
|
id: "app.components.ConfirmDialog.title",
|
2816
2983
|
defaultMessage: "Confirmation"
|
@@ -2841,6 +3008,7 @@ const ConfirmDialogPublishAll = ({
|
|
2841
3008
|
const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler(getTranslation);
|
2842
3009
|
const { model, schema } = useDoc();
|
2843
3010
|
const [{ query }] = strapiAdmin.useQueryParams();
|
3011
|
+
const enableDraftRelationsCount = false;
|
2844
3012
|
const {
|
2845
3013
|
data: countDraftRelations = 0,
|
2846
3014
|
isLoading,
|
@@ -2852,7 +3020,7 @@ const ConfirmDialogPublishAll = ({
|
|
2852
3020
|
locale: query?.plugins?.i18n?.locale
|
2853
3021
|
},
|
2854
3022
|
{
|
2855
|
-
skip:
|
3023
|
+
skip: !enableDraftRelationsCount
|
2856
3024
|
}
|
2857
3025
|
);
|
2858
3026
|
React__namespace.useEffect(() => {
|
@@ -2931,7 +3099,14 @@ const formatErrorMessages = (errors, parentKey, formatMessage) => {
|
|
2931
3099
|
)
|
2932
3100
|
);
|
2933
3101
|
} else {
|
2934
|
-
messages.push(
|
3102
|
+
messages.push(
|
3103
|
+
...formatErrorMessages(
|
3104
|
+
// @ts-expect-error TODO: check why value is not compatible with FormErrors
|
3105
|
+
value,
|
3106
|
+
currentKey,
|
3107
|
+
formatMessage
|
3108
|
+
)
|
3109
|
+
);
|
2935
3110
|
}
|
2936
3111
|
} else {
|
2937
3112
|
messages.push(
|
@@ -3030,7 +3205,7 @@ const SelectedEntriesTableContent = ({
|
|
3030
3205
|
status: row.status
|
3031
3206
|
}
|
3032
3207
|
) }),
|
3033
|
-
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
3208
|
+
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
3034
3209
|
designSystem.IconButton,
|
3035
3210
|
{
|
3036
3211
|
tag: reactRouterDom.Link,
|
@@ -3053,9 +3228,10 @@ const SelectedEntriesTableContent = ({
|
|
3053
3228
|
),
|
3054
3229
|
target: "_blank",
|
3055
3230
|
marginLeft: "auto",
|
3056
|
-
|
3231
|
+
variant: "ghost",
|
3232
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Pencil, { width: "1.6rem", height: "1.6rem" })
|
3057
3233
|
}
|
3058
|
-
) })
|
3234
|
+
) }) })
|
3059
3235
|
] }, row.id)) })
|
3060
3236
|
] });
|
3061
3237
|
};
|
@@ -3092,7 +3268,13 @@ const SelectedEntriesModalContent = ({
|
|
3092
3268
|
);
|
3093
3269
|
const { rows, validationErrors } = React__namespace.useMemo(() => {
|
3094
3270
|
if (data.length > 0 && schema) {
|
3095
|
-
const validate = createYupSchema(
|
3271
|
+
const validate = createYupSchema(
|
3272
|
+
schema.attributes,
|
3273
|
+
components,
|
3274
|
+
// Since this is the "Publish" action, the validation
|
3275
|
+
// schema must enforce the rules for published entities
|
3276
|
+
{ status: "published" }
|
3277
|
+
);
|
3096
3278
|
const validationErrors2 = {};
|
3097
3279
|
const rows2 = data.map((entry) => {
|
3098
3280
|
try {
|
@@ -3442,7 +3624,7 @@ const TableActions = ({ document }) => {
|
|
3442
3624
|
strapiAdmin.DescriptionComponentRenderer,
|
3443
3625
|
{
|
3444
3626
|
props,
|
3445
|
-
descriptions: plugins["content-manager"].apis.getDocumentActions(),
|
3627
|
+
descriptions: plugins["content-manager"].apis.getDocumentActions().filter((action) => action.name !== "PublishAction"),
|
3446
3628
|
children: (actions2) => {
|
3447
3629
|
const tableRowActions = actions2.filter((action) => {
|
3448
3630
|
const positions = Array.isArray(action.position) ? action.position : [action.position];
|
@@ -3553,7 +3735,7 @@ const CloneAction = ({ model, documentId }) => {
|
|
3553
3735
|
}),
|
3554
3736
|
content: /* @__PURE__ */ jsxRuntime.jsx(AutoCloneFailureModalBody, { prohibitedFields }),
|
3555
3737
|
footer: ({ onClose }) => {
|
3556
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.
|
3738
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Footer, { children: [
|
3557
3739
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: onClose, variant: "tertiary", children: formatMessage({
|
3558
3740
|
id: "cancel",
|
3559
3741
|
defaultMessage: "Cancel"
|
@@ -3594,8 +3776,7 @@ class ContentManagerPlugin {
|
|
3594
3776
|
documentActions = [
|
3595
3777
|
...DEFAULT_ACTIONS,
|
3596
3778
|
...DEFAULT_TABLE_ROW_ACTIONS,
|
3597
|
-
...DEFAULT_HEADER_ACTIONS
|
3598
|
-
HistoryAction
|
3779
|
+
...DEFAULT_HEADER_ACTIONS
|
3599
3780
|
];
|
3600
3781
|
editViewSidePanels = [ActionsPanel];
|
3601
3782
|
headerActions = [];
|
@@ -3684,6 +3865,52 @@ const getPrintableType = (value) => {
|
|
3684
3865
|
}
|
3685
3866
|
return nativeType;
|
3686
3867
|
};
|
3868
|
+
const HistoryAction = ({ model, document }) => {
|
3869
|
+
const { formatMessage } = reactIntl.useIntl();
|
3870
|
+
const [{ query }] = strapiAdmin.useQueryParams();
|
3871
|
+
const navigate = reactRouterDom.useNavigate();
|
3872
|
+
const pluginsQueryParams = qs.stringify({ plugins: query.plugins }, { encode: false });
|
3873
|
+
if (!window.strapi.features.isEnabled("cms-content-history")) {
|
3874
|
+
return null;
|
3875
|
+
}
|
3876
|
+
return {
|
3877
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.ClockCounterClockwise, {}),
|
3878
|
+
label: formatMessage({
|
3879
|
+
id: "content-manager.history.document-action",
|
3880
|
+
defaultMessage: "Content History"
|
3881
|
+
}),
|
3882
|
+
onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
|
3883
|
+
disabled: (
|
3884
|
+
/**
|
3885
|
+
* The user is creating a new document.
|
3886
|
+
* It hasn't been saved yet, so there's no history to go to
|
3887
|
+
*/
|
3888
|
+
!document || /**
|
3889
|
+
* The document has been created but the current dimension has never been saved.
|
3890
|
+
* For example, the user is creating a new locale in an existing document,
|
3891
|
+
* so there's no history for the document in that locale
|
3892
|
+
*/
|
3893
|
+
!document.id || /**
|
3894
|
+
* History is only available for content types created by the user.
|
3895
|
+
* These have the `api::` prefix, as opposed to the ones created by Strapi or plugins,
|
3896
|
+
* which start with `admin::` or `plugin::`
|
3897
|
+
*/
|
3898
|
+
!model.startsWith("api::")
|
3899
|
+
),
|
3900
|
+
position: "header"
|
3901
|
+
};
|
3902
|
+
};
|
3903
|
+
HistoryAction.type = "history";
|
3904
|
+
const historyAdmin = {
|
3905
|
+
bootstrap(app) {
|
3906
|
+
const { addDocumentAction } = app.getPlugin("content-manager").apis;
|
3907
|
+
addDocumentAction((actions2) => {
|
3908
|
+
const indexOfDeleteAction = actions2.findIndex((action) => action.type === "delete");
|
3909
|
+
actions2.splice(indexOfDeleteAction, 0, HistoryAction);
|
3910
|
+
return actions2;
|
3911
|
+
});
|
3912
|
+
}
|
3913
|
+
};
|
3687
3914
|
const initialState = {
|
3688
3915
|
collectionTypeLinks: [],
|
3689
3916
|
components: [],
|
@@ -3734,15 +3961,29 @@ const index = {
|
|
3734
3961
|
defaultMessage: "Content Manager"
|
3735
3962
|
},
|
3736
3963
|
permissions: [],
|
3737
|
-
Component: () => Promise.resolve().then(() => require("./layout-BJfBoBiF.js")).then((mod) => ({ default: mod.Layout })),
|
3738
3964
|
position: 1
|
3739
3965
|
});
|
3966
|
+
app.router.addRoute({
|
3967
|
+
path: "content-manager/*",
|
3968
|
+
lazy: async () => {
|
3969
|
+
const { Layout } = await Promise.resolve().then(() => require("./layout-CYA7s0qO.js"));
|
3970
|
+
return {
|
3971
|
+
Component: Layout
|
3972
|
+
};
|
3973
|
+
},
|
3974
|
+
children: routes
|
3975
|
+
});
|
3740
3976
|
app.registerPlugin(cm.config);
|
3741
3977
|
},
|
3978
|
+
bootstrap(app) {
|
3979
|
+
if (typeof historyAdmin.bootstrap === "function") {
|
3980
|
+
historyAdmin.bootstrap(app);
|
3981
|
+
}
|
3982
|
+
},
|
3742
3983
|
async registerTrads({ locales }) {
|
3743
3984
|
const importedTrads = await Promise.all(
|
3744
3985
|
locales.map((locale) => {
|
3745
|
-
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-
|
3986
|
+
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 }) => {
|
3746
3987
|
return {
|
3747
3988
|
data: prefixPluginTranslations(data, PLUGIN_ID),
|
3748
3989
|
locale
|
@@ -3760,6 +4001,7 @@ const index = {
|
|
3760
4001
|
};
|
3761
4002
|
exports.ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD = ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD;
|
3762
4003
|
exports.BulkActionsRenderer = BulkActionsRenderer;
|
4004
|
+
exports.CLONE_PATH = CLONE_PATH;
|
3763
4005
|
exports.COLLECTION_TYPES = COLLECTION_TYPES;
|
3764
4006
|
exports.CREATOR_FIELDS = CREATOR_FIELDS;
|
3765
4007
|
exports.DEFAULT_SETTINGS = DEFAULT_SETTINGS;
|
@@ -3786,7 +4028,6 @@ exports.getDisplayName = getDisplayName;
|
|
3786
4028
|
exports.getMainField = getMainField;
|
3787
4029
|
exports.getTranslation = getTranslation;
|
3788
4030
|
exports.index = index;
|
3789
|
-
exports.routes = routes;
|
3790
4031
|
exports.setInitialData = setInitialData;
|
3791
4032
|
exports.useContentTypeSchema = useContentTypeSchema;
|
3792
4033
|
exports.useDoc = useDoc;
|
@@ -3800,4 +4041,4 @@ exports.useGetAllDocumentsQuery = useGetAllDocumentsQuery;
|
|
3800
4041
|
exports.useGetContentTypeConfigurationQuery = useGetContentTypeConfigurationQuery;
|
3801
4042
|
exports.useGetInitialDataQuery = useGetInitialDataQuery;
|
3802
4043
|
exports.useUpdateContentTypeConfigurationMutation = useUpdateContentTypeConfigurationMutation;
|
3803
|
-
//# sourceMappingURL=index-
|
4044
|
+
//# sourceMappingURL=index-BhbLFX4l.js.map
|