@strapi/content-manager 0.0.0-next.8f63e1055db761e0213cb6610f80c55658196ae1 → 0.0.0-next.926e9af9369b89a571145e3c8fa1ce6bfd6cc0ab
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/CardDragPreview-C0QyJgRA.js.map +1 -1
- package/dist/_chunks/CardDragPreview-DOxamsuj.mjs.map +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-Cmm0LJof.js → ComponentConfigurationPage-DMxUlNOo.js} +4 -5
- package/dist/_chunks/{ComponentConfigurationPage-Cmm0LJof.js.map → ComponentConfigurationPage-DMxUlNOo.js.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-FQd019My.mjs → ComponentConfigurationPage-baEkO-OV.mjs} +3 -3
- package/dist/_chunks/{ComponentConfigurationPage-FQd019My.mjs.map → ComponentConfigurationPage-baEkO-OV.mjs.map} +1 -1
- package/dist/_chunks/{ComponentIcon-BXdiCGQp.js → ComponentIcon-CRbtQEUV.js} +2 -3
- package/dist/_chunks/{ComponentIcon-BXdiCGQp.js.map → ComponentIcon-CRbtQEUV.js.map} +1 -1
- package/dist/_chunks/ComponentIcon-u4bIXTFY.mjs.map +1 -1
- package/dist/_chunks/{EditConfigurationPage-CseHna9y.js → EditConfigurationPage-CXxV7mKn.js} +4 -5
- package/dist/_chunks/{EditConfigurationPage-CseHna9y.js.map → EditConfigurationPage-CXxV7mKn.js.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-BUJqRuRq.mjs → EditConfigurationPage-YR8-4VCS.mjs} +3 -3
- package/dist/_chunks/{EditConfigurationPage-BUJqRuRq.mjs.map → EditConfigurationPage-YR8-4VCS.mjs.map} +1 -1
- package/dist/_chunks/{EditViewPage-BhjvFXZr.js → EditViewPage-BfR6jAR6.js} +22 -78
- package/dist/_chunks/EditViewPage-BfR6jAR6.js.map +1 -0
- package/dist/_chunks/{EditViewPage-BB9VeS-u.mjs → EditViewPage-DFF7c27p.mjs} +19 -74
- package/dist/_chunks/EditViewPage-DFF7c27p.mjs.map +1 -0
- package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +1 -1
- package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +1 -1
- package/dist/_chunks/{Form-DH5m7r5s.js → Form-CjcMRP5A.js} +5 -6
- package/dist/_chunks/{Form-DH5m7r5s.js.map → Form-CjcMRP5A.js.map} +1 -1
- package/dist/_chunks/{Form-B5b7zgoL.mjs → Form-MSOSfGGN.mjs} +3 -3
- package/dist/_chunks/{Form-B5b7zgoL.mjs.map → Form-MSOSfGGN.mjs.map} +1 -1
- package/dist/_chunks/{History-CNO4Db6U.js → History-BgZ7gVuF.js} +48 -72
- package/dist/_chunks/History-BgZ7gVuF.js.map +1 -0
- package/dist/_chunks/{History-Dhy0xF0L.mjs → History-WOQNVho-.mjs} +37 -60
- package/dist/_chunks/History-WOQNVho-.mjs.map +1 -0
- package/dist/_chunks/{Field-CWi7XMCa.mjs → Input-BkKwZ6Qt.mjs} +1245 -1243
- package/dist/_chunks/Input-BkKwZ6Qt.mjs.map +1 -0
- package/dist/_chunks/{Field-B03STsf9.js → Input-BwOibhc3.js} +1331 -1329
- package/dist/_chunks/Input-BwOibhc3.js.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-C_FCilGf.mjs → ListConfigurationPage-BeXfr6uW.mjs} +6 -5
- package/dist/_chunks/ListConfigurationPage-BeXfr6uW.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-DE7NESsr.js → ListConfigurationPage-DnJ3nbwL.js} +6 -6
- package/dist/_chunks/ListConfigurationPage-DnJ3nbwL.js.map +1 -0
- package/dist/_chunks/{ListViewPage-C7p0PteR.js → ListViewPage-CJFDudKl.js} +61 -58
- package/dist/_chunks/ListViewPage-CJFDudKl.js.map +1 -0
- package/dist/_chunks/{ListViewPage-B6Ut2BH0.mjs → ListViewPage-VK2v44Q1.mjs} +55 -51
- package/dist/_chunks/ListViewPage-VK2v44Q1.mjs.map +1 -0
- package/dist/_chunks/{NoContentTypePage-rR7QwWP5.mjs → NoContentTypePage-T8ttty6K.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-rR7QwWP5.mjs.map → NoContentTypePage-T8ttty6K.mjs.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-BN-8niig.js → NoContentTypePage-en2PwWgI.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-BN-8niig.js.map → NoContentTypePage-en2PwWgI.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-Bw3b0OQm.js → NoPermissionsPage-CcjILry3.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-Bw3b0OQm.js.map → NoPermissionsPage-CcjILry3.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-CGUgxmce.mjs → NoPermissionsPage-CokBHhhy.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-CGUgxmce.mjs.map → NoPermissionsPage-CokBHhhy.mjs.map} +1 -1
- package/dist/_chunks/{Preview-_gomrUna.mjs → Preview-BF81YhRj.mjs} +75 -76
- package/dist/_chunks/Preview-BF81YhRj.mjs.map +1 -0
- package/dist/_chunks/{Preview-CICG4cRf.js → Preview-DgzAuzWQ.js} +74 -76
- package/dist/_chunks/Preview-DgzAuzWQ.js.map +1 -0
- package/dist/_chunks/{Relations-uyLoal2t.js → Relations-1O-JcM4t.js} +7 -10
- package/dist/_chunks/{Relations-uyLoal2t.js.map → Relations-1O-JcM4t.js.map} +1 -1
- package/dist/_chunks/{Relations-BEvinUkU.mjs → Relations-BncdhGCd.mjs} +6 -8
- package/dist/_chunks/{Relations-BEvinUkU.mjs.map → Relations-BncdhGCd.mjs.map} +1 -1
- package/dist/_chunks/{en-D_BMf0hT.mjs → en-BZaUty0m.mjs} +12 -3
- package/dist/_chunks/{en-D_BMf0hT.mjs.map → en-BZaUty0m.mjs.map} +1 -1
- package/dist/_chunks/{en-CHOp_xJv.js → en-CzCnBk4S.js} +12 -3
- package/dist/_chunks/{en-CHOp_xJv.js.map → en-CzCnBk4S.js.map} +1 -1
- package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
- package/dist/_chunks/{index-BagcPV6I.mjs → index-DiluOUp6.mjs} +462 -226
- package/dist/_chunks/index-DiluOUp6.mjs.map +1 -0
- package/dist/_chunks/{index-D_AvCmmG.js → index-EXJvmn4t.js} +445 -210
- package/dist/_chunks/index-EXJvmn4t.js.map +1 -0
- package/dist/_chunks/{layout-Dk0odfYR.js → layout-4TbKVax8.js} +5 -6
- package/dist/_chunks/{layout-Dk0odfYR.js.map → layout-4TbKVax8.js.map} +1 -1
- package/dist/_chunks/{layout-DKEX3X49.mjs → layout-mSwsYzxv.mjs} +4 -4
- package/dist/_chunks/{layout-DKEX3X49.mjs.map → layout-mSwsYzxv.mjs.map} +1 -1
- package/dist/_chunks/objects-BcXOv6_9.js.map +1 -1
- package/dist/_chunks/objects-D6yBsdmx.mjs.map +1 -1
- package/dist/_chunks/{relations-DDoMdwk6.mjs → relations--YOvQBqv.mjs} +2 -2
- package/dist/_chunks/{relations-DDoMdwk6.mjs.map → relations--YOvQBqv.mjs.map} +1 -1
- package/dist/_chunks/{relations-C312DwGU.js → relations-Ai6Izh7h.js} +2 -2
- package/dist/_chunks/{relations-C312DwGU.js.map → relations-Ai6Izh7h.js.map} +1 -1
- package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
- package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
- package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
- package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
- package/dist/_chunks/{useDebounce-DmuSJIF3.mjs → usePrev-CZGy2Vjf.mjs} +11 -11
- package/dist/_chunks/usePrev-CZGy2Vjf.mjs.map +1 -0
- package/dist/_chunks/{useDebounce-CtcjDB3L.js → usePrev-D5J_2fEu.js} +8 -8
- package/dist/_chunks/usePrev-D5J_2fEu.js.map +1 -0
- package/dist/admin/index.js +2 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +6 -5
- package/dist/admin/src/content-manager.d.ts +3 -2
- package/dist/admin/src/exports.d.ts +1 -0
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useDocument.d.ts +19 -2
- package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +3 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +27 -0
- package/dist/admin/src/pages/EditView/utils/data.d.ts +1 -0
- package/dist/admin/src/preview/pages/Preview.d.ts +1 -1
- package/dist/admin/src/preview/services/preview.d.ts +1 -1
- package/dist/admin/src/router.d.ts +1 -1
- 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 +16 -19
- 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/server/index.js +230 -187
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +231 -187
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
- package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
- package/dist/server/src/history/controllers/history-version.d.ts +1 -1
- package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
- package/dist/server/src/history/services/history.d.ts +3 -3
- package/dist/server/src/history/services/history.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts +6 -10
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +3 -2
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
- package/dist/server/src/preview/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/index.d.ts +1 -0
- package/dist/server/src/preview/services/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview-config.d.ts +2 -0
- package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
- package/dist/server/src/preview/utils.d.ts +1 -0
- package/dist/server/src/preview/utils.d.ts.map +1 -1
- package/dist/server/src/register.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 +4 -2
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +3 -2
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
- package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
- package/dist/server/src/services/utils/populate.d.ts +2 -2
- package/dist/server/src/services/utils/populate.d.ts.map +1 -1
- package/package.json +12 -11
- package/dist/_chunks/EditViewPage-BB9VeS-u.mjs.map +0 -1
- package/dist/_chunks/EditViewPage-BhjvFXZr.js.map +0 -1
- package/dist/_chunks/Field-B03STsf9.js.map +0 -1
- package/dist/_chunks/Field-CWi7XMCa.mjs.map +0 -1
- package/dist/_chunks/History-CNO4Db6U.js.map +0 -1
- package/dist/_chunks/History-Dhy0xF0L.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-C_FCilGf.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-DE7NESsr.js.map +0 -1
- package/dist/_chunks/ListViewPage-B6Ut2BH0.mjs.map +0 -1
- package/dist/_chunks/ListViewPage-C7p0PteR.js.map +0 -1
- package/dist/_chunks/Preview-CICG4cRf.js.map +0 -1
- package/dist/_chunks/Preview-_gomrUna.mjs.map +0 -1
- package/dist/_chunks/index-BagcPV6I.mjs.map +0 -1
- package/dist/_chunks/index-D_AvCmmG.js.map +0 -1
- package/dist/_chunks/useDebounce-CtcjDB3L.js.map +0 -1
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +0 -1
- package/dist/admin/src/preview/constants.d.ts +0 -1
- package/dist/server/src/preview/constants.d.ts +0 -2
- package/dist/server/src/preview/constants.d.ts.map +0 -1
@@ -7,17 +7,16 @@ const designSystem = require("@strapi/design-system");
|
|
7
7
|
const qs = require("qs");
|
8
8
|
const reactIntl = require("react-intl");
|
9
9
|
const reactRouterDom = require("react-router-dom");
|
10
|
-
const index = require("./index-
|
10
|
+
const index = require("./index-EXJvmn4t.js");
|
11
11
|
const pipe = require("lodash/fp/pipe");
|
12
12
|
const hooks = require("./hooks-BAaaKPS_.js");
|
13
|
-
const Field = require("./Field-B03STsf9.js");
|
14
13
|
const Icons = require("@strapi/icons");
|
15
14
|
const styledComponents = require("styled-components");
|
16
|
-
const
|
15
|
+
const Input = require("./Input-BwOibhc3.js");
|
16
|
+
const relations = require("./relations-Ai6Izh7h.js");
|
17
17
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
18
18
|
function _interopNamespace(e) {
|
19
|
-
if (e && e.__esModule)
|
20
|
-
return e;
|
19
|
+
if (e && e.__esModule) return e;
|
21
20
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
22
21
|
if (e) {
|
23
22
|
for (const k in e) {
|
@@ -118,15 +117,38 @@ const CustomRelationInput = (props) => {
|
|
118
117
|
)
|
119
118
|
] });
|
120
119
|
};
|
120
|
+
const createInitialValuesForPath = (keyPath, value) => {
|
121
|
+
const keys = keyPath.split(".");
|
122
|
+
const root = {};
|
123
|
+
let node = root;
|
124
|
+
keys.forEach((key, index2) => {
|
125
|
+
if (key === "__proto__" || key === "constructor") return;
|
126
|
+
if (index2 === keys.length - 1) {
|
127
|
+
node[key] = value;
|
128
|
+
} else {
|
129
|
+
node[key] = node[key] || {};
|
130
|
+
}
|
131
|
+
node = node[key];
|
132
|
+
});
|
133
|
+
return root;
|
134
|
+
};
|
121
135
|
const CustomMediaInput = (props) => {
|
122
136
|
const { value } = strapiAdmin.useField(props.name);
|
123
|
-
const results = value
|
124
|
-
const meta = value
|
137
|
+
const results = value?.results ?? [];
|
138
|
+
const meta = value?.meta ?? { missingCount: 0 };
|
125
139
|
const { formatMessage } = reactIntl.useIntl();
|
126
140
|
const fields = strapiAdmin.useStrapiApp("CustomMediaInput", (state) => state.fields);
|
127
141
|
const MediaLibrary = fields.media;
|
128
142
|
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 2, alignItems: "stretch", children: [
|
129
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
143
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
144
|
+
strapiAdmin.Form,
|
145
|
+
{
|
146
|
+
method: "PUT",
|
147
|
+
disabled: true,
|
148
|
+
initialValues: createInitialValuesForPath(props.name, results),
|
149
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(MediaLibrary, { ...props, disabled: true, multiple: results.length > 1 })
|
150
|
+
}
|
151
|
+
),
|
130
152
|
meta.missingCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
131
153
|
StyledAlert,
|
132
154
|
{
|
@@ -191,7 +213,7 @@ const VersionInputRenderer = ({
|
|
191
213
|
const fieldSizes = hooks.useTypedSelector((state) => state["content-manager"].app.fieldSizes);
|
192
214
|
const { id, components } = index.useDoc();
|
193
215
|
const isFormDisabled = strapiAdmin.useForm("InputRenderer", (state) => state.disabled);
|
194
|
-
const isInDynamicZone =
|
216
|
+
const isInDynamicZone = Input.useDynamicZone("isInDynamicZone", (state) => state.isInDynamicZone);
|
195
217
|
const canCreateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canCreateFields);
|
196
218
|
const canReadFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canReadFields);
|
197
219
|
const canUpdateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUpdateFields);
|
@@ -201,10 +223,10 @@ const VersionInputRenderer = ({
|
|
201
223
|
const canUserReadField = canUserAction(props.name, readableFields, props.type);
|
202
224
|
const canUserEditField = canUserAction(props.name, editableFields, props.type);
|
203
225
|
const fields = strapiAdmin.useStrapiApp("InputRenderer", (app) => app.fields);
|
204
|
-
const { lazyComponentStore } =
|
226
|
+
const { lazyComponentStore } = Input.useLazyComponents(
|
205
227
|
attributeHasCustomFieldProperty(props.attribute) ? [props.attribute.customField] : void 0
|
206
228
|
);
|
207
|
-
const hint =
|
229
|
+
const hint = Input.useFieldHint(providedHint, props.attribute);
|
208
230
|
const {
|
209
231
|
edit: { components: componentsLayout }
|
210
232
|
} = index.useDocLayout();
|
@@ -212,7 +234,7 @@ const VersionInputRenderer = ({
|
|
212
234
|
return null;
|
213
235
|
}
|
214
236
|
if (!shouldIgnoreRBAC && !canUserReadField && !isInDynamicZone) {
|
215
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
237
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Input.NotAllowedInput, { hint, ...props });
|
216
238
|
}
|
217
239
|
const fieldIsDisabled = !canUserEditField && !isInDynamicZone || props.disabled || isFormDisabled;
|
218
240
|
const addedAttributes = version.meta.unknownAttributes.added;
|
@@ -281,7 +303,7 @@ const VersionInputRenderer = ({
|
|
281
303
|
}
|
282
304
|
switch (props.type) {
|
283
305
|
case "blocks":
|
284
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
306
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Input.MemoizedBlocksInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
|
285
307
|
case "component":
|
286
308
|
const { layout } = componentsLayout[props.attribute.component];
|
287
309
|
const [remainingFieldsLayout] = getRemaingFieldsLayout({
|
@@ -291,7 +313,7 @@ const VersionInputRenderer = ({
|
|
291
313
|
schemaAttributes: components[props.attribute.component].attributes
|
292
314
|
});
|
293
315
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
294
|
-
|
316
|
+
Input.MemoizedComponentInput,
|
295
317
|
{
|
296
318
|
...props,
|
297
319
|
layout: [...layout, ...remainingFieldsLayout || []],
|
@@ -303,12 +325,13 @@ const VersionInputRenderer = ({
|
|
303
325
|
);
|
304
326
|
case "dynamiczone":
|
305
327
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
306
|
-
|
328
|
+
Input.DynamicZone,
|
307
329
|
{
|
308
330
|
...props,
|
309
331
|
hint,
|
310
332
|
labelAction: customLabelAction,
|
311
|
-
disabled: fieldIsDisabled
|
333
|
+
disabled: fieldIsDisabled,
|
334
|
+
children: (inputProps) => /* @__PURE__ */ jsxRuntime.jsx(VersionInputRenderer, { ...inputProps, shouldIgnoreRBAC: true })
|
312
335
|
}
|
313
336
|
);
|
314
337
|
case "relation":
|
@@ -323,7 +346,7 @@ const VersionInputRenderer = ({
|
|
323
346
|
);
|
324
347
|
case "richtext":
|
325
348
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
326
|
-
|
349
|
+
Input.MemoizedWysiwyg,
|
327
350
|
{
|
328
351
|
...props,
|
329
352
|
hint,
|
@@ -334,7 +357,7 @@ const VersionInputRenderer = ({
|
|
334
357
|
);
|
335
358
|
case "uid":
|
336
359
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
337
|
-
|
360
|
+
Input.MemoizedUIDInput,
|
338
361
|
{
|
339
362
|
...props,
|
340
363
|
hint,
|
@@ -481,8 +504,8 @@ const VersionContent = () => {
|
|
481
504
|
const transform = (schemaAttributes, components2 = {}) => (document) => {
|
482
505
|
const schema2 = { attributes: schemaAttributes };
|
483
506
|
const transformations = pipe__default.default(
|
484
|
-
|
485
|
-
|
507
|
+
index.removeFieldsThatDontExistOnSchema(schema2),
|
508
|
+
index.prepareTempKeys(schema2, components2)
|
486
509
|
);
|
487
510
|
return transformations(document);
|
488
511
|
};
|
@@ -556,6 +579,7 @@ const VersionHeader = ({ headerId }) => {
|
|
556
579
|
const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React__namespace.useState(false);
|
557
580
|
const navigate = reactRouterDom.useNavigate();
|
558
581
|
const { formatMessage, formatDate } = reactIntl.useIntl();
|
582
|
+
const { trackUsage } = strapiAdmin.useTracking();
|
559
583
|
const { toggleNotification } = strapiAdmin.useNotification();
|
560
584
|
const [{ query }] = strapiAdmin.useQueryParams();
|
561
585
|
const { collectionType, slug } = reactRouterDom.useParams();
|
@@ -597,9 +621,10 @@ const VersionHeader = ({ headerId }) => {
|
|
597
621
|
}),
|
598
622
|
message: formatMessage({
|
599
623
|
id: "content-manager.restore.success.message",
|
600
|
-
defaultMessage: "
|
624
|
+
defaultMessage: "A past version of the content was restored."
|
601
625
|
})
|
602
626
|
});
|
627
|
+
trackUsage("didRestoreHistoryVersion");
|
603
628
|
}
|
604
629
|
if ("error" in response) {
|
605
630
|
toggleNotification({
|
@@ -712,41 +737,6 @@ const BlueText = (children) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typog
|
|
712
737
|
const VersionCard = ({ version, isCurrent }) => {
|
713
738
|
const { formatDate, formatMessage } = reactIntl.useIntl();
|
714
739
|
const [{ query }] = strapiAdmin.useQueryParams();
|
715
|
-
const statusData = (() => {
|
716
|
-
switch (version.status) {
|
717
|
-
case "draft":
|
718
|
-
return {
|
719
|
-
background: "secondary100",
|
720
|
-
border: "secondary200",
|
721
|
-
text: "secondary700",
|
722
|
-
message: {
|
723
|
-
id: "content-manager.containers.List.draft",
|
724
|
-
defaultMessage: "Draft"
|
725
|
-
}
|
726
|
-
};
|
727
|
-
case "modified":
|
728
|
-
return {
|
729
|
-
background: "alternative100",
|
730
|
-
border: "alternative200",
|
731
|
-
text: "alternative700",
|
732
|
-
message: {
|
733
|
-
id: "content-manager.containers.List.modified",
|
734
|
-
defaultMessage: "Modified"
|
735
|
-
}
|
736
|
-
};
|
737
|
-
case "published":
|
738
|
-
default:
|
739
|
-
return {
|
740
|
-
background: "success100",
|
741
|
-
border: "success200",
|
742
|
-
text: "success700",
|
743
|
-
message: {
|
744
|
-
id: "content-manager.containers.List.published",
|
745
|
-
defaultMessage: "Published"
|
746
|
-
}
|
747
|
-
};
|
748
|
-
}
|
749
|
-
})();
|
750
740
|
const isActive = query.id === version.id.toString();
|
751
741
|
const author = version.createdBy && index.getDisplayName(version.createdBy);
|
752
742
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
@@ -787,21 +777,7 @@ const VersionCard = ({ version, isCurrent }) => {
|
|
787
777
|
}
|
788
778
|
) })
|
789
779
|
] }),
|
790
|
-
version.status && /* @__PURE__ */ jsxRuntime.jsx(
|
791
|
-
designSystem.Box,
|
792
|
-
{
|
793
|
-
background: statusData.background,
|
794
|
-
borderStyle: "solid",
|
795
|
-
borderWidth: "1px",
|
796
|
-
borderColor: statusData.border,
|
797
|
-
hasRadius: true,
|
798
|
-
paddingLeft: "6px",
|
799
|
-
paddingRight: "6px",
|
800
|
-
paddingTop: "2px",
|
801
|
-
paddingBottom: "2px",
|
802
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", textColor: statusData.text, children: formatMessage(statusData.message) })
|
803
|
-
}
|
804
|
-
)
|
780
|
+
version.status && /* @__PURE__ */ jsxRuntime.jsx(index.DocumentStatus, { status: version.status, size: "XS" })
|
805
781
|
]
|
806
782
|
}
|
807
783
|
);
|
@@ -1040,4 +1016,4 @@ const ProtectedHistoryPage = () => {
|
|
1040
1016
|
exports.HistoryProvider = HistoryProvider;
|
1041
1017
|
exports.ProtectedHistoryPage = ProtectedHistoryPage;
|
1042
1018
|
exports.useHistoryContext = useHistoryContext;
|
1043
|
-
//# sourceMappingURL=History-
|
1019
|
+
//# sourceMappingURL=History-BgZ7gVuF.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"History-BgZ7gVuF.js","sources":["../../admin/src/history/components/VersionInputRenderer.tsx","../../admin/src/history/components/VersionContent.tsx","../../admin/src/history/services/historyVersion.ts","../../admin/src/history/components/VersionHeader.tsx","../../admin/src/history/components/VersionsList.tsx","../../admin/src/history/pages/History.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useStrapiApp,\n useForm,\n InputRenderer as FormInputRenderer,\n useField,\n Form,\n} from '@strapi/admin/strapi-admin';\nimport { Alert, Box, Field, Flex, Link, Tooltip, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { HistoryVersionDataResponse } from '../../../../shared/contracts/history-versions';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { useDocumentRBAC } from '../../features/DocumentRBAC';\nimport { useDoc } from '../../hooks/useDocument';\nimport { useDocLayout } from '../../hooks/useDocumentLayout';\nimport { useLazyComponents } from '../../hooks/useLazyComponents';\nimport { useTypedSelector } from '../../modules/hooks';\nimport { DocumentStatus } from '../../pages/EditView/components/DocumentStatus';\nimport { BlocksInput } from '../../pages/EditView/components/FormInputs/BlocksInput/BlocksInput';\nimport { ComponentInput } from '../../pages/EditView/components/FormInputs/Component/Input';\nimport {\n DynamicZone,\n useDynamicZone,\n} from '../../pages/EditView/components/FormInputs/DynamicZone/Field';\nimport { NotAllowedInput } from '../../pages/EditView/components/FormInputs/NotAllowed';\nimport { UIDInput } from '../../pages/EditView/components/FormInputs/UID';\nimport { Wysiwyg } from '../../pages/EditView/components/FormInputs/Wysiwyg/Field';\nimport { useFieldHint } from '../../pages/EditView/components/InputRenderer';\nimport { getRelationLabel } from '../../utils/relations';\nimport { useHistoryContext } from '../pages/History';\n\nimport { getRemaingFieldsLayout } from './VersionContent';\n\nimport type { EditFieldLayout } from '../../hooks/useDocumentLayout';\nimport type { RelationsFieldProps } from '../../pages/EditView/components/FormInputs/Relations';\nimport type { RelationResult } from '../../services/relations';\nimport type { Schema } from '@strapi/types';\nimport type { DistributiveOmit } from 'react-redux';\n\nconst StyledAlert = styled(Alert).attrs({ closeLabel: 'Close', onClose: () => {}, shadow: 'none' })`\n button {\n display: none;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * CustomRelationInput\n * -----------------------------------------------------------------------------------------------*/\n\nconst LinkEllipsis = styled(Link)`\n display: block;\n\n & > span {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n }\n`;\n\nconst CustomRelationInput = (props: RelationsFieldProps) => {\n const { formatMessage } = useIntl();\n const field = useField<\n { results: RelationResult[]; meta: { missingCount: number } } | RelationResult[]\n >(props.name);\n\n /**\n * Ideally the server would return the correct shape, however, for admin user relations\n * it sanitizes everything out when it finds an object for the relation value.\n */\n let formattedFieldValue;\n if (field) {\n formattedFieldValue = Array.isArray(field.value)\n ? { results: field.value, meta: { missingCount: 0 } }\n : field.value;\n }\n\n if (\n !formattedFieldValue ||\n (formattedFieldValue.results.length === 0 && formattedFieldValue.meta.missingCount === 0)\n ) {\n return (\n <>\n <Field.Label action={props.labelAction}>{props.label}</Field.Label>\n <Box marginTop={1}>\n {/* @ts-expect-error – we dont need closeLabel */}\n <StyledAlert variant=\"default\">\n {formatMessage({\n id: 'content-manager.history.content.no-relations',\n defaultMessage: 'No relations.',\n })}\n </StyledAlert>\n </Box>\n </>\n );\n }\n\n const { results, meta } = formattedFieldValue;\n\n return (\n <Box>\n <Field.Label>{props.label}</Field.Label>\n {results.length > 0 && (\n <Flex direction=\"column\" gap={2} marginTop={1} alignItems=\"stretch\">\n {results.map((relationData) => {\n // @ts-expect-error - targetModel does exist on the attribute. But it's not typed.\n const { targetModel } = props.attribute;\n const href = `../${COLLECTION_TYPES}/${targetModel}/${relationData.documentId}`;\n const label = getRelationLabel(relationData, props.mainField);\n const isAdminUserRelation = targetModel === 'admin::user';\n\n return (\n <Flex\n key={relationData.documentId ?? relationData.id}\n paddingTop={2}\n paddingBottom={2}\n paddingLeft={4}\n paddingRight={4}\n hasRadius\n borderColor=\"neutral200\"\n background=\"neutral150\"\n justifyContent=\"space-between\"\n >\n <Box minWidth={0} paddingTop={1} paddingBottom={1} paddingRight={4}>\n <Tooltip label={label}>\n {isAdminUserRelation ? (\n <Typography>{label}</Typography>\n ) : (\n <LinkEllipsis tag={NavLink} to={href}>\n {label}\n </LinkEllipsis>\n )}\n </Tooltip>\n </Box>\n <DocumentStatus status={relationData.status as string} />\n </Flex>\n );\n })}\n </Flex>\n )}\n {meta.missingCount > 0 && (\n /* @ts-expect-error – we dont need closeLabel */\n <StyledAlert\n marginTop={1}\n variant=\"warning\"\n title={formatMessage(\n {\n id: 'content-manager.history.content.missing-relations.title',\n defaultMessage:\n '{number, plural, =1 {Missing relation} other {{number} missing relations}}',\n },\n { number: meta.missingCount }\n )}\n >\n {formatMessage(\n {\n id: 'content-manager.history.content.missing-relations.message',\n defaultMessage:\n \"{number, plural, =1 {It has} other {They have}} been deleted and can't be restored.\",\n },\n { number: meta.missingCount }\n )}\n </StyledAlert>\n )}\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CustomMediaInput\n * -----------------------------------------------------------------------------------------------*/\n\n// Create an object with value at key path (i.e. 'a.b.c')\nconst createInitialValuesForPath = (keyPath: string, value: any) => {\n const keys = keyPath.split('.');\n // The root level object\n const root: Record<string, any> = {};\n\n // Make the first node the root\n let node = root;\n keys.forEach((key, index) => {\n // Skip prototype pollution keys\n if (key === '__proto__' || key === 'constructor') return;\n // If it's the last key, set the node value\n if (index === keys.length - 1) {\n node[key] = value;\n } else {\n // Ensure the key exists and is an object\n node[key] = node[key] || {};\n }\n\n // Traverse down the tree\n node = node[key];\n });\n\n return root;\n};\n\nconst CustomMediaInput = (props: VersionInputRendererProps) => {\n const { value } = useField(props.name);\n const results = value?.results ?? [];\n const meta = value?.meta ?? { missingCount: 0 };\n\n const { formatMessage } = useIntl();\n\n const fields = useStrapiApp('CustomMediaInput', (state) => state.fields);\n const MediaLibrary = fields.media as React.ComponentType<\n VersionInputRendererProps & { multiple: boolean }\n >;\n\n return (\n <Flex direction=\"column\" gap={2} alignItems=\"stretch\">\n <Form\n method=\"PUT\"\n disabled={true}\n initialValues={createInitialValuesForPath(props.name, results)}\n >\n <MediaLibrary {...props} disabled={true} multiple={results.length > 1} />\n </Form>\n {meta.missingCount > 0 && (\n <StyledAlert\n variant=\"warning\"\n closeLabel=\"Close\"\n onClose={() => {}}\n title={formatMessage(\n {\n id: 'content-manager.history.content.missing-assets.title',\n defaultMessage:\n '{number, plural, =1 {Missing asset} other {{number} missing assets}}',\n },\n { number: meta.missingCount }\n )}\n >\n {formatMessage(\n {\n id: 'content-manager.history.content.missing-assets.message',\n defaultMessage:\n \"{number, plural, =1 {It has} other {They have}} been deleted in the Media Library and can't be restored.\",\n },\n { number: meta.missingCount }\n )}\n </StyledAlert>\n )}\n </Flex>\n );\n};\n\ntype VersionInputRendererProps = DistributiveOmit<EditFieldLayout, 'size'> & {\n /**\n * In the context of content history, deleted fields need to ignore RBAC\n * @default false\n */\n shouldIgnoreRBAC?: boolean;\n};\n\n/**\n * Checks if the i18n plugin added a label action to the field and modifies it\n * to adapt the wording for the history page.\n */\nconst getLabelAction = (labelAction: VersionInputRendererProps['labelAction']) => {\n if (!React.isValidElement(labelAction)) {\n return labelAction;\n }\n\n // TODO: find a better way to do this rather than access internals\n const labelActionTitleId = labelAction.props.title.id;\n\n if (labelActionTitleId === 'i18n.Field.localized') {\n return React.cloneElement(labelAction, {\n ...labelAction.props,\n title: {\n id: 'history.content.localized',\n defaultMessage:\n 'This value is specific to this locale. If you restore this version, the content will not be replaced for other locales.',\n },\n });\n }\n\n if (labelActionTitleId === 'i18n.Field.not-localized') {\n return React.cloneElement(labelAction, {\n ...labelAction.props,\n title: {\n id: 'history.content.not-localized',\n defaultMessage:\n 'This value is common to all locales. If you restore this version and save the changes, the content will be replaced for all locales.',\n },\n });\n }\n\n // Label action is unrelated to i18n, don't touch it.\n return labelAction;\n};\n\n/**\n * @internal\n *\n * @description An abstraction around the regular form input renderer designed specifically\n * to be used on the History page in the content-manager. It understands how to render specific\n * inputs within the context of a history version (i.e. relations, media, ignored RBAC, etc...)\n */\nconst VersionInputRenderer = ({\n visible,\n hint: providedHint,\n shouldIgnoreRBAC = false,\n labelAction,\n ...props\n}: VersionInputRendererProps) => {\n const customLabelAction = getLabelAction(labelAction);\n\n const { formatMessage } = useIntl();\n const version = useHistoryContext('VersionContent', (state) => state.selectedVersion);\n const configuration = useHistoryContext('VersionContent', (state) => state.configuration);\n const fieldSizes = useTypedSelector((state) => state['content-manager'].app.fieldSizes);\n\n const { id, components } = useDoc();\n const isFormDisabled = useForm('InputRenderer', (state) => state.disabled);\n\n const isInDynamicZone = useDynamicZone('isInDynamicZone', (state) => state.isInDynamicZone);\n\n const canCreateFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canCreateFields);\n const canReadFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canReadFields);\n const canUpdateFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUpdateFields);\n const canUserAction = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUserAction);\n\n const editableFields = id ? canUpdateFields : canCreateFields;\n const readableFields = id ? canReadFields : canCreateFields;\n /**\n * Component fields are always readable and editable,\n * however the fields within them may not be.\n */\n const canUserReadField = canUserAction(props.name, readableFields, props.type);\n const canUserEditField = canUserAction(props.name, editableFields, props.type);\n\n const fields = useStrapiApp('InputRenderer', (app) => app.fields);\n const { lazyComponentStore } = useLazyComponents(\n attributeHasCustomFieldProperty(props.attribute) ? [props.attribute.customField] : undefined\n );\n\n const hint = useFieldHint(providedHint, props.attribute);\n const {\n edit: { components: componentsLayout },\n } = useDocLayout();\n\n if (!visible) {\n return null;\n }\n\n /**\n * Don't render the field if the user can't read it.\n */\n if (!shouldIgnoreRBAC && !canUserReadField && !isInDynamicZone) {\n return <NotAllowedInput hint={hint} {...props} />;\n }\n\n const fieldIsDisabled =\n (!canUserEditField && !isInDynamicZone) || props.disabled || isFormDisabled;\n\n /**\n * Attributes found on the current content-type schema cannot be restored. We handle\n * this by displaying a warning alert to the user instead of the input for that field type.\n */\n const addedAttributes = version.meta.unknownAttributes.added;\n if (Object.keys(addedAttributes).includes(props.name)) {\n return (\n <Flex direction=\"column\" alignItems=\"flex-start\" gap={1}>\n <Field.Label>{props.label}</Field.Label>\n <StyledAlert\n width=\"100%\"\n closeLabel=\"Close\"\n onClose={() => {}}\n variant=\"warning\"\n title={formatMessage({\n id: 'content-manager.history.content.new-field.title',\n defaultMessage: 'New field',\n })}\n >\n {formatMessage({\n id: 'content-manager.history.content.new-field.message',\n defaultMessage:\n \"This field didn't exist when this version was saved. If you restore this version, it will be empty.\",\n })}\n </StyledAlert>\n </Flex>\n );\n }\n\n /**\n * Because a custom field has a unique prop but the type could be confused with either\n * the useField hook or the type of the field we need to handle it separately and first.\n */\n if (attributeHasCustomFieldProperty(props.attribute)) {\n const CustomInput = lazyComponentStore[props.attribute.customField];\n\n if (CustomInput) {\n return (\n <CustomInput\n {...props}\n // @ts-expect-error – TODO: fix this type error in the useLazyComponents hook.\n hint={hint}\n labelAction={customLabelAction}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n return (\n <FormInputRenderer\n {...props}\n hint={hint}\n labelAction={customLabelAction}\n // @ts-expect-error – this workaround lets us display that the custom field is missing.\n type={props.attribute.customField}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n /**\n * Since media fields use a custom input via the upload plugin provided by the useLibrary hook,\n * we need to handle the them before other custom inputs coming from the useLibrary hook.\n */\n if (props.type === 'media') {\n return (\n <CustomMediaInput {...props} labelAction={customLabelAction} disabled={fieldIsDisabled} />\n );\n }\n /**\n * This is where we handle ONLY the fields from the `useLibrary` hook.\n */\n const addedInputTypes = Object.keys(fields);\n if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {\n const CustomInput = fields[props.type];\n return (\n <CustomInput\n {...props}\n // @ts-expect-error – TODO: fix this type error in the useLibrary hook.\n hint={hint}\n labelAction={customLabelAction}\n disabled={fieldIsDisabled}\n />\n );\n }\n\n /**\n * These include the content-manager specific fields, failing that we fall back\n * to the more generic form input renderer.\n */\n switch (props.type) {\n case 'blocks':\n return <BlocksInput {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n case 'component':\n const { layout } = componentsLayout[props.attribute.component];\n // Components can only have one panel, so only save the first layout item\n const [remainingFieldsLayout] = getRemaingFieldsLayout({\n layout: [layout],\n metadatas: configuration.components[props.attribute.component].metadatas,\n fieldSizes,\n schemaAttributes: components[props.attribute.component].attributes,\n });\n\n return (\n <ComponentInput\n {...props}\n layout={[...layout, ...(remainingFieldsLayout || [])]}\n hint={hint}\n labelAction={customLabelAction}\n disabled={fieldIsDisabled}\n >\n {(inputProps) => <VersionInputRenderer {...inputProps} shouldIgnoreRBAC={true} />}\n </ComponentInput>\n );\n case 'dynamiczone':\n return (\n <DynamicZone\n {...props}\n hint={hint}\n labelAction={customLabelAction}\n disabled={fieldIsDisabled}\n >\n {(inputProps) => <VersionInputRenderer {...inputProps} shouldIgnoreRBAC={true} />}\n </DynamicZone>\n );\n case 'relation':\n return (\n <CustomRelationInput\n {...props}\n hint={hint}\n labelAction={customLabelAction}\n disabled={fieldIsDisabled}\n />\n );\n case 'richtext':\n return (\n <Wysiwyg\n {...props}\n hint={hint}\n type={props.type}\n labelAction={customLabelAction}\n disabled={fieldIsDisabled}\n />\n );\n case 'uid':\n return (\n <UIDInput\n {...props}\n hint={hint}\n type={props.type}\n labelAction={customLabelAction}\n disabled={fieldIsDisabled}\n />\n );\n /**\n * Enumerations are a special case because they require options.\n */\n case 'enumeration':\n return (\n <FormInputRenderer\n {...props}\n hint={hint}\n labelAction={customLabelAction}\n options={props.attribute.enum.map((value) => ({ value }))}\n // @ts-expect-error – Temp workaround so we don't forget custom-fields don't work!\n type={props.customField ? 'custom-field' : props.type}\n disabled={fieldIsDisabled}\n />\n );\n default:\n // These props are not needed for the generic form input renderer.\n const { unique: _unique, mainField: _mainField, ...restProps } = props;\n return (\n <FormInputRenderer\n {...restProps}\n hint={hint}\n labelAction={customLabelAction}\n // @ts-expect-error – Temp workaround so we don't forget custom-fields don't work!\n type={props.customField ? 'custom-field' : props.type}\n disabled={fieldIsDisabled}\n />\n );\n }\n};\n\nconst attributeHasCustomFieldProperty = (\n attribute: Schema.Attribute.AnyAttribute\n): attribute is Schema.Attribute.AnyAttribute & Schema.Attribute.CustomField<string> =>\n 'customField' in attribute && typeof attribute.customField === 'string';\n\nexport type { VersionInputRendererProps };\nexport { VersionInputRenderer };\n","import * as React from 'react';\n\nimport { Form, Layouts } from '@strapi/admin/strapi-admin';\nimport { Box, Divider, Flex, Grid, Typography } from '@strapi/design-system';\nimport { Schema } from '@strapi/types';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../hooks/useDocument';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n prepareTempKeys,\n removeFieldsThatDontExistOnSchema,\n} from '../../pages/EditView/utils/data';\nimport { HistoryContextValue, useHistoryContext } from '../pages/History';\n\nimport { VersionInputRenderer } from './VersionInputRenderer';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../../shared/contracts/init';\nimport type { ComponentsDictionary, Document } from '../../hooks/useDocument';\nimport type { EditFieldLayout } from '../../hooks/useDocumentLayout';\n\nconst createLayoutFromFields = <T extends EditFieldLayout | UnknownField>(fields: T[]) => {\n return (\n fields\n .reduce<Array<T[]>>((rows, field) => {\n if (field.type === 'dynamiczone') {\n // Dynamic zones take up all the columns in a row\n rows.push([field]);\n\n return rows;\n }\n\n if (!rows[rows.length - 1]) {\n // Create a new row if there isn't one available\n rows.push([]);\n }\n\n // Push fields to the current row, they wrap and handle their own column size\n rows[rows.length - 1].push(field);\n\n return rows;\n }, [])\n // Map the rows to panels\n .map((row) => [row])\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * getRemainingFieldsLayout\n * -----------------------------------------------------------------------------------------------*/\n\ninterface GetRemainingFieldsLayoutOptions\n extends Pick<HistoryContextValue, 'layout'>,\n Pick<GetInitData.Response['data'], 'fieldSizes'> {\n schemaAttributes: HistoryContextValue['schema']['attributes'];\n metadatas: Metadatas;\n}\n\n/**\n * Build a layout for the fields that are were deleted from the edit view layout\n * via the configure the view page. This layout will be merged with the main one.\n * Those fields would be restored if the user restores the history version, which is why it's\n * important to show them, even if they're not in the normal layout.\n */\nfunction getRemaingFieldsLayout({\n layout,\n metadatas,\n schemaAttributes,\n fieldSizes,\n}: GetRemainingFieldsLayoutOptions) {\n const fieldsInLayout = layout.flatMap((panel) =>\n panel.flatMap((row) => row.flatMap((field) => field.name))\n );\n const remainingFields = Object.entries(metadatas).reduce<EditFieldLayout[]>(\n (currentRemainingFields, [name, field]) => {\n // Make sure we do not fields that are not visible, e.g. \"id\"\n if (!fieldsInLayout.includes(name) && field.edit.visible === true) {\n const attribute = schemaAttributes[name];\n // @ts-expect-error not sure why attribute causes type error\n currentRemainingFields.push({\n attribute,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: field.edit.label || name,\n name: name,\n size: fieldSizes[attribute.type].default ?? 12,\n });\n }\n\n return currentRemainingFields;\n },\n []\n );\n\n return createLayoutFromFields(remainingFields);\n}\n\n/* -------------------------------------------------------------------------------------------------\n * FormPanel\n * -----------------------------------------------------------------------------------------------*/\n\nconst FormPanel = ({ panel }: { panel: EditFieldLayout[][] }) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <VersionInputRenderer {...field} />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n paddingLeft={6}\n paddingRight={6}\n paddingTop={6}\n paddingBottom={6}\n borderColor=\"neutral150\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row, gridRowIndex) => (\n <Grid.Root key={gridRowIndex} gap={4}>\n {row.map(({ size, ...field }) => {\n return (\n <Grid.Item\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <VersionInputRenderer {...field} />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n ))}\n </Flex>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionContent\n * -----------------------------------------------------------------------------------------------*/\n\ntype UnknownField = EditFieldLayout & { shouldIgnoreRBAC: boolean };\n\nconst VersionContent = () => {\n const { formatMessage } = useIntl();\n const { fieldSizes } = useTypedSelector((state) => state['content-manager'].app);\n const version = useHistoryContext('VersionContent', (state) => state.selectedVersion);\n const layout = useHistoryContext('VersionContent', (state) => state.layout);\n const configuration = useHistoryContext('VersionContent', (state) => state.configuration);\n const schema = useHistoryContext('VersionContent', (state) => state.schema);\n\n // Build a layout for the unknown fields section\n const removedAttributes = version.meta.unknownAttributes.removed;\n const removedAttributesAsFields = Object.entries(removedAttributes).map(\n ([attributeName, attribute]) => {\n const field = {\n attribute,\n shouldIgnoreRBAC: true,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: attributeName,\n name: attributeName,\n size: fieldSizes[attribute.type].default ?? 12,\n } as UnknownField;\n\n return field;\n }\n );\n const unknownFieldsLayout = createLayoutFromFields(removedAttributesAsFields);\n\n // Build a layout for the fields that are were deleted from the layout\n const remainingFieldsLayout = getRemaingFieldsLayout({\n metadatas: configuration.contentType.metadatas,\n layout,\n schemaAttributes: schema.attributes,\n fieldSizes,\n });\n\n const { components } = useDoc();\n\n /**\n * Transform the data before passing it to the form so that each field\n * has a uniquely generated key\n */\n const transformedData = React.useMemo(() => {\n const transform =\n (schemaAttributes: Schema.Attributes, components: ComponentsDictionary = {}) =>\n (document: Omit<Document, 'id'>) => {\n const schema = { attributes: schemaAttributes };\n\n const transformations = pipe(\n removeFieldsThatDontExistOnSchema(schema),\n prepareTempKeys(schema, components)\n );\n return transformations(document);\n };\n\n return transform(version.schema, components)(version.data);\n }, [components, version.data, version.schema]);\n\n return (\n <Layouts.Content>\n <Box paddingBottom={8}>\n <Form disabled={true} method=\"PUT\" initialValues={transformedData}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {[...layout, ...remainingFieldsLayout].map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n {removedAttributesAsFields.length > 0 && (\n <>\n <Divider />\n <Box paddingTop={8}>\n <Flex direction=\"column\" alignItems=\"flex-start\" paddingBottom={6} gap={1}>\n <Typography variant=\"delta\">\n {formatMessage({\n id: 'content-manager.history.content.unknown-fields.title',\n defaultMessage: 'Unknown fields',\n })}\n </Typography>\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'content-manager.history.content.unknown-fields.message',\n defaultMessage:\n 'These fields have been deleted or renamed in the Content-Type Builder. <b>These fields will not be restored.</b>',\n },\n {\n b: (chunks: React.ReactNode) => (\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n <Form disabled={true} method=\"PUT\" initialValues={version.data}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {unknownFieldsLayout.map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n </>\n )}\n </Layouts.Content>\n );\n};\n\nexport { VersionContent, getRemaingFieldsLayout };\n","import { Data } from '@strapi/types';\n\nimport {\n GetHistoryVersions,\n RestoreHistoryVersion,\n} from '../../../../shared/contracts/history-versions';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { contentManagerApi } from '../../services/api';\n\ninterface RestoreVersion extends RestoreHistoryVersion.Request {\n documentId: Data.ID;\n collectionType?: string;\n}\n\nconst historyVersionsApi = contentManagerApi.injectEndpoints({\n endpoints: (builder) => ({\n getHistoryVersions: builder.query<\n GetHistoryVersions.Response,\n GetHistoryVersions.Request['query']\n >({\n query(params) {\n return {\n url: `/content-manager/history-versions`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n providesTags: ['HistoryVersion'],\n }),\n restoreVersion: builder.mutation<RestoreHistoryVersion.Response, RestoreVersion>({\n query({ params, body }) {\n return {\n url: `/content-manager/history-versions/${params.versionId}/restore`,\n method: 'PUT',\n data: body,\n };\n },\n invalidatesTags: (_res, _error, { documentId, collectionType, params }) => {\n return [\n 'HistoryVersion',\n {\n type: 'Document',\n id:\n collectionType === COLLECTION_TYPES\n ? `${params.contentType}_${documentId}`\n : params.contentType,\n },\n ];\n },\n }),\n }),\n});\n\nconst { useGetHistoryVersionsQuery, useRestoreVersionMutation } = historyVersionsApi;\n\nexport { useGetHistoryVersionsQuery, useRestoreVersionMutation };\n","import * as React from 'react';\n\nimport {\n ConfirmDialog,\n useNotification,\n useQueryParams,\n useTracking,\n useRBAC,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Button, Typography, Flex, Link, Dialog } from '@strapi/design-system';\nimport { ArrowLeft, WarningCircle } from '@strapi/icons';\nimport { UID } from '@strapi/types';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate, useParams, type To } from 'react-router-dom';\n\nimport { PERMISSIONS } from '../../constants/plugin';\nimport { useHistoryContext } from '../pages/History';\nimport { useRestoreVersionMutation } from '../services/historyVersion';\n\ninterface VersionHeaderProps {\n headerId: string;\n}\n\nexport const VersionHeader = ({ headerId }: VersionHeaderProps) => {\n const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React.useState(false);\n const navigate = useNavigate();\n const { formatMessage, formatDate } = useIntl();\n const { trackUsage } = useTracking();\n const { toggleNotification } = useNotification();\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n }>();\n const { collectionType, slug } = useParams<{ collectionType: string; slug: UID.ContentType }>();\n const [restoreVersion, { isLoading }] = useRestoreVersionMutation();\n const { allowedActions } = useRBAC(PERMISSIONS.map((action) => ({ action, subject: slug })));\n\n const version = useHistoryContext('VersionHeader', (state) => state.selectedVersion);\n const mainField = useHistoryContext('VersionHeader', (state) => state.mainField);\n const schema = useHistoryContext('VersionHeader', (state) => state.schema);\n const isCurrentVersion = useHistoryContext(\n 'VersionHeader',\n (state) => state.page === 1 && state.versions.data[0].id === state.selectedVersion.id\n );\n\n const mainFieldValue = version.data[mainField];\n\n const getNextNavigation = (): To => {\n const pluginsQueryParams = stringify({ plugins: query.plugins }, { encode: false });\n\n return {\n pathname: '..',\n search: pluginsQueryParams,\n };\n };\n\n const handleRestore = async () => {\n try {\n const response = await restoreVersion({\n documentId: version.relatedDocumentId,\n collectionType,\n params: {\n versionId: version.id,\n contentType: version.contentType,\n },\n body: { contentType: version.contentType },\n });\n\n if ('data' in response) {\n navigate(getNextNavigation(), { relative: 'path' });\n\n toggleNotification({\n type: 'success',\n title: formatMessage({\n id: 'content-manager.restore.success.title',\n defaultMessage: 'Version restored.',\n }),\n message: formatMessage({\n id: 'content-manager.restore.success.message',\n defaultMessage: 'A past version of the content was restored.',\n }),\n });\n\n trackUsage('didRestoreHistoryVersion');\n }\n\n if ('error' in response) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.history.restore.error.message',\n defaultMessage: 'Could not restore version.',\n }),\n });\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n return (\n <Dialog.Root open={isConfirmDialogOpen} onOpenChange={setIsConfirmDialogOpen}>\n <Layouts.BaseHeader\n id={headerId}\n title={formatDate(new Date(version.createdAt), {\n year: 'numeric',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n })}\n subtitle={\n <Typography variant=\"epsilon\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: 'content-manager.history.version.subtitle',\n defaultMessage:\n '{hasLocale, select, true {{subtitle}, in {locale}} other {{subtitle}}}',\n },\n {\n hasLocale: Boolean(version.locale),\n subtitle: `${mainFieldValue || ''} (${schema.info.singularName})`.trim(),\n locale: version.locale?.name,\n }\n )}\n </Typography>\n }\n navigationAction={\n <Link\n startIcon={<ArrowLeft />}\n tag={NavLink}\n to={getNextNavigation()}\n relative=\"path\"\n isExternal={false}\n >\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n sticky={false}\n primaryAction={\n <Dialog.Trigger>\n <Button\n disabled={!allowedActions.canUpdate || isCurrentVersion}\n onClick={() => {\n setIsConfirmDialogOpen(true);\n }}\n >\n {formatMessage({\n id: 'content-manager.history.restore.confirm.button',\n defaultMessage: 'Restore',\n })}\n </Button>\n </Dialog.Trigger>\n }\n />\n <ConfirmDialog\n onConfirm={handleRestore}\n endAction={\n <Button variant=\"secondary\" onClick={handleRestore} loading={isLoading}>\n {formatMessage({\n id: 'content-manager.history.restore.confirm.button',\n defaultMessage: 'Restore',\n })}\n </Button>\n }\n >\n <Flex\n direction=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={2}\n textAlign=\"center\"\n >\n <Flex justifyContent=\"center\">\n <WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />\n </Flex>\n <Typography>\n {formatMessage({\n id: 'content-manager.history.restore.confirm.title',\n defaultMessage: 'Are you sure you want to restore this version?',\n })}\n </Typography>\n <Typography>\n {formatMessage(\n {\n id: 'content-manager.history.restore.confirm.message',\n defaultMessage:\n \"{isDraft, select, true {The restored content will override your draft.} other {The restored content won't be published, it will override the draft and be saved as pending changes. You'll be able to publish the changes at anytime.}}\",\n },\n {\n isDraft: version.status === 'draft',\n }\n )}\n </Typography>\n </Flex>\n </ConfirmDialog>\n </Dialog.Root>\n );\n};\n","import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { RelativeTime } from '../../components/RelativeTime';\nimport { DocumentStatus } from '../../pages/EditView/components/DocumentStatus';\nimport { getDisplayName } from '../../utils/users';\nimport { useHistoryContext } from '../pages/History';\n\nimport type { HistoryVersions } from '../../../../shared/contracts';\n\n/* -------------------------------------------------------------------------------------------------\n * BlueText\n * -----------------------------------------------------------------------------------------------*/\n\nconst BlueText = (children: React.ReactNode) => (\n <Typography textColor=\"primary600\" variant=\"pi\">\n {children}\n </Typography>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * VersionCard\n * -----------------------------------------------------------------------------------------------*/\n\ninterface VersionCardProps {\n version: HistoryVersions.HistoryVersionDataResponse;\n isCurrent: boolean;\n}\n\nconst VersionCard = ({ version, isCurrent }: VersionCardProps) => {\n const { formatDate, formatMessage } = useIntl();\n const [{ query }] = useQueryParams<{ id?: string }>();\n const isActive = query.id === version.id.toString();\n const author = version.createdBy && getDisplayName(version.createdBy);\n\n return (\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n gap={3}\n hasRadius\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={isActive ? 'primary600' : 'neutral200'}\n color=\"neutral800\"\n padding={5}\n tag={Link}\n to={`?${stringify({ ...query, id: version.id })}`}\n style={{ textDecoration: 'none' }}\n >\n <Flex direction=\"column\" gap={1} alignItems=\"flex-start\">\n <Typography tag=\"h3\" fontWeight=\"semiBold\">\n {formatDate(version.createdAt, {\n day: 'numeric',\n month: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })}\n </Typography>\n <Typography tag=\"p\" variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: 'content-manager.history.sidebar.versionDescription',\n defaultMessage:\n '{distanceToNow}{isAnonymous, select, true {} other { by {author}}}{isCurrent, select, true { <b>(current)</b>} other {}}',\n },\n {\n distanceToNow: <RelativeTime timestamp={new Date(version.createdAt)} />,\n author,\n isAnonymous: !Boolean(version.createdBy),\n isCurrent,\n b: BlueText,\n }\n )}\n </Typography>\n </Flex>\n {version.status && <DocumentStatus status={version.status} size=\"XS\" />}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PaginationButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PaginationButtonProps {\n page: number;\n children: React.ReactNode;\n}\n\nconst PaginationButton = ({ page, children }: PaginationButtonProps) => {\n const [{ query }] = useQueryParams<{ id?: string }>();\n\n // Remove the id from the pagination link, so that the history page can redirect\n // to the id of the first history version in the new page once it's loaded\n const { id: _id, ...queryRest } = query;\n\n return (\n <Link to={{ search: stringify({ ...queryRest, page }) }} style={{ textDecoration: 'none' }}>\n <Typography variant=\"omega\" textColor=\"primary600\">\n {children}\n </Typography>\n </Link>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionsList\n * -----------------------------------------------------------------------------------------------*/\n\nconst VersionsList = () => {\n const { formatMessage } = useIntl();\n const { versions, page } = useHistoryContext('VersionsList', (state) => ({\n versions: state.versions,\n page: state.page,\n }));\n\n return (\n <Flex\n shrink={0}\n direction=\"column\"\n alignItems=\"stretch\"\n width=\"320px\"\n height=\"100vh\"\n background=\"neutral0\"\n borderColor=\"neutral200\"\n borderWidth=\"0 0 0 1px\"\n borderStyle=\"solid\"\n tag=\"aside\"\n >\n <Flex\n direction=\"row\"\n justifyContent=\"space-between\"\n padding={4}\n borderColor=\"neutral200\"\n borderWidth=\"0 0 1px\"\n borderStyle=\"solid\"\n tag=\"header\"\n >\n <Typography tag=\"h2\" variant=\"omega\" fontWeight=\"semiBold\">\n {formatMessage({\n id: 'content-manager.history.sidebar.title',\n defaultMessage: 'Versions',\n })}\n </Typography>\n <Box background=\"neutral150\" hasRadius padding={1}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {versions.meta.pagination.total}\n </Typography>\n </Box>\n </Flex>\n <Box flex={1} overflow=\"auto\">\n {versions.meta.pagination.page > 1 && (\n <Box paddingTop={4} textAlign=\"center\">\n <PaginationButton page={page - 1}>\n {formatMessage({\n id: 'content-manager.history.sidebar.show-newer',\n defaultMessage: 'Show newer versions',\n })}\n </PaginationButton>\n </Box>\n )}\n <Flex direction=\"column\" gap={3} padding={4} tag=\"ul\" alignItems=\"stretch\">\n {versions.data.map((version, index) => (\n <li\n key={version.id}\n aria-label={formatMessage({\n id: 'content-manager.history.sidebar.title.version-card.aria-label',\n defaultMessage: 'Version card',\n })}\n >\n <VersionCard version={version} isCurrent={page === 1 && index === 0} />\n </li>\n ))}\n </Flex>\n {versions.meta.pagination.page < versions.meta.pagination.pageCount && (\n <Box paddingBottom={4} textAlign=\"center\">\n <PaginationButton page={page + 1}>\n {formatMessage({\n id: 'content-manager.history.sidebar.show-older',\n defaultMessage: 'Show older versions',\n })}\n </PaginationButton>\n </Box>\n )}\n </Box>\n </Flex>\n );\n};\n\nexport { VersionsList };\n","import * as React from 'react';\n\nimport { useQueryParams, Page, createContext, useRBAC } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, FocusTrap, Main, Portal, Link } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useParams, NavLink } from 'react-router-dom';\n\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { PERMISSIONS } from '../../constants/plugin';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { useGetContentTypeConfigurationQuery } from '../../services/contentTypes';\nimport { buildValidParams } from '../../utils/api';\nimport { VersionContent } from '../components/VersionContent';\nimport { VersionHeader } from '../components/VersionHeader';\nimport { VersionsList } from '../components/VersionsList';\nimport { useGetHistoryVersionsQuery } from '../services/historyVersion';\n\nimport type {\n ContentType,\n FindContentTypeConfiguration,\n} from '../../../../shared/contracts/content-types';\nimport type {\n HistoryVersionDataResponse,\n GetHistoryVersions,\n} from '../../../../shared/contracts/history-versions';\nimport type { UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * HistoryProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HistoryContextValue {\n contentType: UID.ContentType;\n id?: string; // null for single types\n layout: EditLayout['layout'];\n configuration: FindContentTypeConfiguration.Response['data'];\n selectedVersion: HistoryVersionDataResponse;\n // Errors are handled outside of the provider, so we exclude errors from the response type\n versions: Extract<GetHistoryVersions.Response, { data: Array<HistoryVersionDataResponse> }>;\n page: number;\n mainField: string;\n schema: ContentType;\n}\n\nconst [HistoryProvider, useHistoryContext] = createContext<HistoryContextValue>('HistoryPage');\n\n/* -------------------------------------------------------------------------------------------------\n * HistoryPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst HistoryPage = () => {\n const headerId = React.useId();\n const { formatMessage } = useIntl();\n const {\n slug,\n id: documentId,\n collectionType,\n } = useParams<{\n collectionType: string;\n slug: UID.ContentType;\n id: string;\n }>();\n\n const { isLoading: isLoadingDocument, schema } = useDocument({\n collectionType: collectionType!,\n model: slug!,\n });\n\n const {\n isLoading: isLoadingLayout,\n edit: {\n layout,\n settings: { displayName, mainField },\n },\n } = useDocumentLayout(slug!);\n const { data: configuration, isLoading: isLoadingConfiguration } =\n useGetContentTypeConfigurationQuery(slug!);\n\n // Parse state from query params\n const [{ query }] = useQueryParams<{\n page?: number;\n id?: string;\n plugins?: Record<string, unknown>;\n }>();\n const { id: selectedVersionId, ...queryWithoutId } = query;\n const validQueryParamsWithoutId = buildValidParams(queryWithoutId);\n const page = validQueryParamsWithoutId.page ? Number(validQueryParamsWithoutId.page) : 1;\n\n const versionsResponse = useGetHistoryVersionsQuery(\n {\n contentType: slug!,\n ...(documentId ? { documentId } : {}),\n // Omit id since it's not needed by the endpoint and caused extra refetches\n ...validQueryParamsWithoutId,\n },\n { refetchOnMountOrArgChange: true }\n );\n\n /**\n * When the page is first mounted, if there's already data in the cache, RTK has a fullfilled\n * status for the first render, right before it triggers a new request. This means the code\n * briefly reaches the part that redirects to the first history version (if none is set).\n * But since that data is stale, that means auto-selecting a version that may not be the most\n * recent. To avoid this, we identify through requestId if the query is stale despite the\n * fullfilled status, and show the loader in that case.\n * This means we essentially don't want cache. We always refetch when the page mounts, and\n * we always show the loader until we have the most recent data. That's fine for this page.\n */\n const initialRequestId = React.useRef(versionsResponse.requestId);\n const isStaleRequest = versionsResponse.requestId === initialRequestId.current;\n\n /**\n * Ensure that we have the necessary data to render the page:\n * - slug for single types\n * - slug _and_ documentId for collection types\n */\n if (!slug || (collectionType === COLLECTION_TYPES && !documentId)) {\n return <Navigate to=\"/content-manager\" />;\n }\n\n if (\n isLoadingDocument ||\n isLoadingLayout ||\n versionsResponse.isFetching ||\n isStaleRequest ||\n isLoadingConfiguration\n ) {\n return <Page.Loading />;\n }\n\n // It was a success, handle empty data\n if (!versionsResponse.isError && !versionsResponse.data?.data?.length) {\n return (\n <>\n <Page.NoData\n action={\n <Link\n tag={NavLink}\n to={`/content-manager/${collectionType}/${slug}${documentId ? `/${documentId}` : ''}`}\n >\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n />\n </>\n );\n }\n\n // We have data, handle selected version\n if (versionsResponse.data?.data?.length && !selectedVersionId) {\n return (\n <Navigate\n to={{ search: stringify({ ...query, id: versionsResponse.data.data[0].id }) }}\n replace\n />\n );\n }\n\n const selectedVersion = versionsResponse.data?.data?.find(\n (version) => version.id.toString() === selectedVersionId\n );\n if (\n versionsResponse.isError ||\n !layout ||\n !schema ||\n !selectedVersion ||\n !configuration ||\n // This should not happen as it's covered by versionsResponse.isError, but we need it for TS\n versionsResponse.data.error\n ) {\n return <Page.Error />;\n }\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.history.page-title',\n defaultMessage: '{contentType} history',\n },\n {\n contentType: displayName,\n }\n )}\n </Page.Title>\n <HistoryProvider\n contentType={slug}\n id={documentId}\n schema={schema}\n layout={layout}\n configuration={configuration}\n selectedVersion={selectedVersion}\n versions={versionsResponse.data}\n page={page}\n mainField={mainField}\n >\n <Flex direction=\"row\" alignItems=\"flex-start\">\n <Main\n grow={1}\n height=\"100vh\"\n background=\"neutral100\"\n paddingBottom={6}\n overflow=\"auto\"\n labelledBy={headerId}\n >\n <VersionHeader headerId={headerId} />\n <VersionContent />\n </Main>\n <VersionsList />\n </Flex>\n </HistoryProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedHistoryPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedHistoryPageImpl = () => {\n const { slug } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC(PERMISSIONS.map((action) => ({ action, subject: slug })));\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !slug) {\n return (\n <Box\n height=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\n background=\"neutral0\"\n >\n <Page.Protect permissions={permissions}>\n {({ permissions }) => (\n <DocumentRBAC permissions={permissions}>\n <HistoryPage />\n </DocumentRBAC>\n )}\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedHistoryPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedHistoryPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedHistoryPage, HistoryProvider, useHistoryContext };\nexport type { HistoryContextValue };\n"],"names":["styled","Alert","Link","useIntl","useField","jsxs","Fragment","jsx","Field","Box","Flex","COLLECTION_TYPES","getRelationLabel","Tooltip","Typography","NavLink","DocumentStatus","index","useStrapiApp","Form","React","useTypedSelector","useDoc","useForm","useDynamicZone","useDocumentRBAC","useLazyComponents","useFieldHint","useDocLayout","NotAllowedInput","FormInputRenderer","BlocksInput","ComponentInput","DynamicZone","Wysiwyg","UIDInput","Grid","components","schema","pipe","removeFieldsThatDontExistOnSchema","prepareTempKeys","Layouts","Divider","contentManagerApi","useNavigate","useTracking","useNotification","useQueryParams","useParams","useRBAC","PERMISSIONS","stringify","Dialog","ArrowLeft","Button","ConfirmDialog","WarningCircle","getDisplayName","RelativeTime","createContext","useDocument","useDocumentLayout","useGetContentTypeConfigurationQuery","buildValidParams","Navigate","Page","Main","permissions","DocumentRBAC","Portal","FocusTrap"],"mappings":"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"}
|
@@ -1,17 +1,17 @@
|
|
1
1
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
2
2
|
import * as React from "react";
|
3
|
-
import { useForm, useStrapiApp, InputRenderer, useField, Form, Layouts, useNotification, useQueryParams, useRBAC, ConfirmDialog, createContext, Page } from "@strapi/admin/strapi-admin";
|
3
|
+
import { useForm, useStrapiApp, InputRenderer, useField, Form, Layouts, useTracking, useNotification, useQueryParams, useRBAC, ConfirmDialog, createContext, Page } from "@strapi/admin/strapi-admin";
|
4
4
|
import { Alert, Link, Flex, Field, Box, Tooltip, Typography, Divider, Grid, Dialog, Button, Portal, FocusTrap, Main } from "@strapi/design-system";
|
5
5
|
import { stringify } from "qs";
|
6
6
|
import { useIntl } from "react-intl";
|
7
7
|
import { NavLink, useNavigate, useParams, Link as Link$1, Navigate } from "react-router-dom";
|
8
|
-
import { c as useDoc, f as useDocumentRBAC,
|
8
|
+
import { c as useDoc, f as useDocumentRBAC, m as useDocLayout, C as COLLECTION_TYPES, D as DocumentStatus, K as removeFieldsThatDontExistOnSchema, L as prepareTempKeys, e as contentManagerApi, k as PERMISSIONS, v as getDisplayName, R as RelativeTime, l as DocumentRBAC, M as useDocument, h as useDocumentLayout, p as useGetContentTypeConfigurationQuery, d as buildValidParams } from "./index-DiluOUp6.mjs";
|
9
9
|
import pipe from "lodash/fp/pipe";
|
10
10
|
import { u as useTypedSelector } from "./hooks-E5u1mcgM.mjs";
|
11
|
-
import { a as useDynamicZone, u as useLazyComponents, b as useFieldHint, N as NotAllowedInput, d as MemoizedUIDInput, e as MemoizedWysiwyg, D as DynamicZone, f as MemoizedComponentInput, g as MemoizedBlocksInput, r as removeFieldsThatDontExistOnSchema, p as prepareTempKeys } from "./Field-CWi7XMCa.mjs";
|
12
11
|
import { ArrowLeft, WarningCircle } from "@strapi/icons";
|
13
12
|
import { styled } from "styled-components";
|
14
|
-
import {
|
13
|
+
import { a as useDynamicZone, u as useLazyComponents, b as useFieldHint, N as NotAllowedInput, M as MemoizedUIDInput, c as MemoizedWysiwyg, D as DynamicZone, d as MemoizedComponentInput, e as MemoizedBlocksInput } from "./Input-BkKwZ6Qt.mjs";
|
14
|
+
import { g as getRelationLabel } from "./relations--YOvQBqv.mjs";
|
15
15
|
const StyledAlert = styled(Alert).attrs({ closeLabel: "Close", onClose: () => {
|
16
16
|
}, shadow: "none" })`
|
17
17
|
button {
|
@@ -95,15 +95,38 @@ const CustomRelationInput = (props) => {
|
|
95
95
|
)
|
96
96
|
] });
|
97
97
|
};
|
98
|
+
const createInitialValuesForPath = (keyPath, value) => {
|
99
|
+
const keys = keyPath.split(".");
|
100
|
+
const root = {};
|
101
|
+
let node = root;
|
102
|
+
keys.forEach((key, index) => {
|
103
|
+
if (key === "__proto__" || key === "constructor") return;
|
104
|
+
if (index === keys.length - 1) {
|
105
|
+
node[key] = value;
|
106
|
+
} else {
|
107
|
+
node[key] = node[key] || {};
|
108
|
+
}
|
109
|
+
node = node[key];
|
110
|
+
});
|
111
|
+
return root;
|
112
|
+
};
|
98
113
|
const CustomMediaInput = (props) => {
|
99
114
|
const { value } = useField(props.name);
|
100
|
-
const results = value
|
101
|
-
const meta = value
|
115
|
+
const results = value?.results ?? [];
|
116
|
+
const meta = value?.meta ?? { missingCount: 0 };
|
102
117
|
const { formatMessage } = useIntl();
|
103
118
|
const fields = useStrapiApp("CustomMediaInput", (state) => state.fields);
|
104
119
|
const MediaLibrary = fields.media;
|
105
120
|
return /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 2, alignItems: "stretch", children: [
|
106
|
-
/* @__PURE__ */ jsx(
|
121
|
+
/* @__PURE__ */ jsx(
|
122
|
+
Form,
|
123
|
+
{
|
124
|
+
method: "PUT",
|
125
|
+
disabled: true,
|
126
|
+
initialValues: createInitialValuesForPath(props.name, results),
|
127
|
+
children: /* @__PURE__ */ jsx(MediaLibrary, { ...props, disabled: true, multiple: results.length > 1 })
|
128
|
+
}
|
129
|
+
),
|
107
130
|
meta.missingCount > 0 && /* @__PURE__ */ jsx(
|
108
131
|
StyledAlert,
|
109
132
|
{
|
@@ -285,7 +308,8 @@ const VersionInputRenderer = ({
|
|
285
308
|
...props,
|
286
309
|
hint,
|
287
310
|
labelAction: customLabelAction,
|
288
|
-
disabled: fieldIsDisabled
|
311
|
+
disabled: fieldIsDisabled,
|
312
|
+
children: (inputProps) => /* @__PURE__ */ jsx(VersionInputRenderer, { ...inputProps, shouldIgnoreRBAC: true })
|
289
313
|
}
|
290
314
|
);
|
291
315
|
case "relation":
|
@@ -533,6 +557,7 @@ const VersionHeader = ({ headerId }) => {
|
|
533
557
|
const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React.useState(false);
|
534
558
|
const navigate = useNavigate();
|
535
559
|
const { formatMessage, formatDate } = useIntl();
|
560
|
+
const { trackUsage } = useTracking();
|
536
561
|
const { toggleNotification } = useNotification();
|
537
562
|
const [{ query }] = useQueryParams();
|
538
563
|
const { collectionType, slug } = useParams();
|
@@ -574,9 +599,10 @@ const VersionHeader = ({ headerId }) => {
|
|
574
599
|
}),
|
575
600
|
message: formatMessage({
|
576
601
|
id: "content-manager.restore.success.message",
|
577
|
-
defaultMessage: "
|
602
|
+
defaultMessage: "A past version of the content was restored."
|
578
603
|
})
|
579
604
|
});
|
605
|
+
trackUsage("didRestoreHistoryVersion");
|
580
606
|
}
|
581
607
|
if ("error" in response) {
|
582
608
|
toggleNotification({
|
@@ -689,41 +715,6 @@ const BlueText = (children) => /* @__PURE__ */ jsx(Typography, { textColor: "pri
|
|
689
715
|
const VersionCard = ({ version, isCurrent }) => {
|
690
716
|
const { formatDate, formatMessage } = useIntl();
|
691
717
|
const [{ query }] = useQueryParams();
|
692
|
-
const statusData = (() => {
|
693
|
-
switch (version.status) {
|
694
|
-
case "draft":
|
695
|
-
return {
|
696
|
-
background: "secondary100",
|
697
|
-
border: "secondary200",
|
698
|
-
text: "secondary700",
|
699
|
-
message: {
|
700
|
-
id: "content-manager.containers.List.draft",
|
701
|
-
defaultMessage: "Draft"
|
702
|
-
}
|
703
|
-
};
|
704
|
-
case "modified":
|
705
|
-
return {
|
706
|
-
background: "alternative100",
|
707
|
-
border: "alternative200",
|
708
|
-
text: "alternative700",
|
709
|
-
message: {
|
710
|
-
id: "content-manager.containers.List.modified",
|
711
|
-
defaultMessage: "Modified"
|
712
|
-
}
|
713
|
-
};
|
714
|
-
case "published":
|
715
|
-
default:
|
716
|
-
return {
|
717
|
-
background: "success100",
|
718
|
-
border: "success200",
|
719
|
-
text: "success700",
|
720
|
-
message: {
|
721
|
-
id: "content-manager.containers.List.published",
|
722
|
-
defaultMessage: "Published"
|
723
|
-
}
|
724
|
-
};
|
725
|
-
}
|
726
|
-
})();
|
727
718
|
const isActive = query.id === version.id.toString();
|
728
719
|
const author = version.createdBy && getDisplayName(version.createdBy);
|
729
720
|
return /* @__PURE__ */ jsxs(
|
@@ -764,21 +755,7 @@ const VersionCard = ({ version, isCurrent }) => {
|
|
764
755
|
}
|
765
756
|
) })
|
766
757
|
] }),
|
767
|
-
version.status && /* @__PURE__ */ jsx(
|
768
|
-
Box,
|
769
|
-
{
|
770
|
-
background: statusData.background,
|
771
|
-
borderStyle: "solid",
|
772
|
-
borderWidth: "1px",
|
773
|
-
borderColor: statusData.border,
|
774
|
-
hasRadius: true,
|
775
|
-
paddingLeft: "6px",
|
776
|
-
paddingRight: "6px",
|
777
|
-
paddingTop: "2px",
|
778
|
-
paddingBottom: "2px",
|
779
|
-
children: /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", textColor: statusData.text, children: formatMessage(statusData.message) })
|
780
|
-
}
|
781
|
-
)
|
758
|
+
version.status && /* @__PURE__ */ jsx(DocumentStatus, { status: version.status, size: "XS" })
|
782
759
|
]
|
783
760
|
}
|
784
761
|
);
|
@@ -1019,4 +996,4 @@ export {
|
|
1019
996
|
ProtectedHistoryPage,
|
1020
997
|
useHistoryContext
|
1021
998
|
};
|
1022
|
-
//# sourceMappingURL=History-
|
999
|
+
//# sourceMappingURL=History-WOQNVho-.mjs.map
|