@strapi/content-manager 0.0.0-experimental.25e22c6cc9bc6b35392bb55d09f641a0a65e7403 → 0.0.0-experimental.4ddd402c7194d1a969a797313bf007c93148d59a

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.
Files changed (87) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-WRPUXGd6.js → ComponentConfigurationPage-BZIaEffq.js} +3 -3
  2. package/dist/_chunks/{ComponentConfigurationPage-WRPUXGd6.js.map → ComponentConfigurationPage-BZIaEffq.js.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-gdUj_t-O.mjs → ComponentConfigurationPage-Cxz51Sve.mjs} +3 -3
  4. package/dist/_chunks/{ComponentConfigurationPage-gdUj_t-O.mjs.map → ComponentConfigurationPage-Cxz51Sve.mjs.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-C1vjMBgy.js → EditConfigurationPage-CM62NN0L.js} +3 -3
  6. package/dist/_chunks/{EditConfigurationPage-C1vjMBgy.js.map → EditConfigurationPage-CM62NN0L.js.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-BwuIPOJG.mjs → EditConfigurationPage-CZLbgfIp.mjs} +3 -3
  8. package/dist/_chunks/{EditConfigurationPage-BwuIPOJG.mjs.map → EditConfigurationPage-CZLbgfIp.mjs.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-DbcGfyqK.js → EditViewPage-CU7724gt.js} +45 -45
  10. package/dist/_chunks/EditViewPage-CU7724gt.js.map +1 -0
  11. package/dist/_chunks/{EditViewPage-0MiFkXa8.mjs → EditViewPage-CzuJgWWp.mjs} +46 -46
  12. package/dist/_chunks/EditViewPage-CzuJgWWp.mjs.map +1 -0
  13. package/dist/_chunks/{Field-BG1xu38N.js → Field-Dh1yZyqy.js} +115 -103
  14. package/dist/_chunks/Field-Dh1yZyqy.js.map +1 -0
  15. package/dist/_chunks/{Field-BDMSCcy5.mjs → Field-QtUSh5mU.mjs} +116 -104
  16. package/dist/_chunks/Field-QtUSh5mU.mjs.map +1 -0
  17. package/dist/_chunks/{Form-9BnFyUjy.js → Form-BOR8NOe1.js} +25 -21
  18. package/dist/_chunks/Form-BOR8NOe1.js.map +1 -0
  19. package/dist/_chunks/{Form-CPVWavB8.mjs → Form-COLpvlnv.mjs} +27 -23
  20. package/dist/_chunks/Form-COLpvlnv.mjs.map +1 -0
  21. package/dist/_chunks/{History-BVpd8LP3.mjs → History-Bu53Yfw-.mjs} +22 -101
  22. package/dist/_chunks/History-Bu53Yfw-.mjs.map +1 -0
  23. package/dist/_chunks/{History-BWWxLt2Z.js → History-CW2akQ6h.js} +21 -100
  24. package/dist/_chunks/History-CW2akQ6h.js.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-DozVMKcR.mjs → ListConfigurationPage-TqrmwjPN.mjs} +45 -43
  26. package/dist/_chunks/ListConfigurationPage-TqrmwjPN.mjs.map +1 -0
  27. package/dist/_chunks/{ListConfigurationPage-6swzjdAZ.js → ListConfigurationPage-jzdhEk_u.js} +43 -42
  28. package/dist/_chunks/ListConfigurationPage-jzdhEk_u.js.map +1 -0
  29. package/dist/_chunks/{ListViewPage-BlzfjS2Q.js → ListViewPage-B3bMOrMv.js} +64 -47
  30. package/dist/_chunks/ListViewPage-B3bMOrMv.js.map +1 -0
  31. package/dist/_chunks/{ListViewPage-Ds0ulgfG.mjs → ListViewPage-BO_mOXIl.mjs} +65 -48
  32. package/dist/_chunks/ListViewPage-BO_mOXIl.mjs.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-D2nCCWEl.js → NoContentTypePage-D77xsNHj.js} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-D2nCCWEl.js.map → NoContentTypePage-D77xsNHj.js.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-BH11kaKt.mjs → NoContentTypePage-DqB0QV0k.mjs} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-BH11kaKt.mjs.map → NoContentTypePage-DqB0QV0k.mjs.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-DN_JlsU2.js → NoPermissionsPage-C6qTGogm.js} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-DN_JlsU2.js.map → NoPermissionsPage-C6qTGogm.js.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-BT2Tn0D_.mjs → NoPermissionsPage-DTXi042N.mjs} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-BT2Tn0D_.mjs.map → NoPermissionsPage-DTXi042N.mjs.map} +1 -1
  41. package/dist/_chunks/{Relations-CcgFTcWo.js → Relations-B6fb2POW.js} +3 -3
  42. package/dist/_chunks/{Relations-CcgFTcWo.js.map → Relations-B6fb2POW.js.map} +1 -1
  43. package/dist/_chunks/{Relations-Dnag3fhV.mjs → Relations-CJ4qdkRo.mjs} +3 -3
  44. package/dist/_chunks/{Relations-Dnag3fhV.mjs.map → Relations-CJ4qdkRo.mjs.map} +1 -1
  45. package/dist/_chunks/{en-Ux26r5pl.mjs → en-9GwRW_ku.mjs} +1 -3
  46. package/dist/_chunks/{en-Ux26r5pl.mjs.map → en-9GwRW_ku.mjs.map} +1 -1
  47. package/dist/_chunks/{en-fbKQxLGn.js → en-DZXjRiWA.js} +1 -3
  48. package/dist/_chunks/{en-fbKQxLGn.js.map → en-DZXjRiWA.js.map} +1 -1
  49. package/dist/_chunks/{index-JNNNKUHs.mjs → index-Dahjdw4h.mjs} +266 -88
  50. package/dist/_chunks/index-Dahjdw4h.mjs.map +1 -0
  51. package/dist/_chunks/{index-CWpLBSt0.js → index-DcUu-_72.js} +265 -87
  52. package/dist/_chunks/index-DcUu-_72.js.map +1 -0
  53. package/dist/_chunks/{layout--iHdZzRk.js → layout-jcY4dyUG.js} +3 -3
  54. package/dist/_chunks/{layout--iHdZzRk.js.map → layout-jcY4dyUG.js.map} +1 -1
  55. package/dist/_chunks/{layout-DC503LnF.mjs → layout-omucV6TV.mjs} +3 -3
  56. package/dist/_chunks/{layout-DC503LnF.mjs.map → layout-omucV6TV.mjs.map} +1 -1
  57. package/dist/_chunks/{relations-CTje5t-a.mjs → relations-CN0-aw6p.mjs} +2 -2
  58. package/dist/_chunks/{relations-CTje5t-a.mjs.map → relations-CN0-aw6p.mjs.map} +1 -1
  59. package/dist/_chunks/{relations-BbHizA5K.js → relations-DGzD7ORa.js} +2 -2
  60. package/dist/_chunks/{relations-BbHizA5K.js.map → relations-DGzD7ORa.js.map} +1 -1
  61. package/dist/admin/index.js +1 -1
  62. package/dist/admin/index.mjs +1 -1
  63. package/dist/admin/src/history/components/VersionInputRenderer.d.ts +1 -1
  64. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +3 -7
  65. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +10 -2
  66. package/dist/admin/src/pages/ListView/components/BulkActions/Actions.d.ts +30 -3
  67. package/dist/admin/src/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.d.ts +2 -2
  68. package/dist/server/index.js +0 -3
  69. package/dist/server/index.js.map +1 -1
  70. package/dist/server/index.mjs +0 -3
  71. package/dist/server/index.mjs.map +1 -1
  72. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  73. package/package.json +8 -8
  74. package/dist/_chunks/EditViewPage-0MiFkXa8.mjs.map +0 -1
  75. package/dist/_chunks/EditViewPage-DbcGfyqK.js.map +0 -1
  76. package/dist/_chunks/Field-BDMSCcy5.mjs.map +0 -1
  77. package/dist/_chunks/Field-BG1xu38N.js.map +0 -1
  78. package/dist/_chunks/Form-9BnFyUjy.js.map +0 -1
  79. package/dist/_chunks/Form-CPVWavB8.mjs.map +0 -1
  80. package/dist/_chunks/History-BVpd8LP3.mjs.map +0 -1
  81. package/dist/_chunks/History-BWWxLt2Z.js.map +0 -1
  82. package/dist/_chunks/ListConfigurationPage-6swzjdAZ.js.map +0 -1
  83. package/dist/_chunks/ListConfigurationPage-DozVMKcR.mjs.map +0 -1
  84. package/dist/_chunks/ListViewPage-BlzfjS2Q.js.map +0 -1
  85. package/dist/_chunks/ListViewPage-Ds0ulgfG.mjs.map +0 -1
  86. package/dist/_chunks/index-CWpLBSt0.js.map +0 -1
  87. package/dist/_chunks/index-JNNNKUHs.mjs.map +0 -1
@@ -7,13 +7,13 @@ 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-CWpLBSt0.js");
10
+ const index = require("./index-DcUu-_72.js");
11
11
  const pipe = require("lodash/fp/pipe");
12
12
  const hooks = require("./hooks-BAaaKPS_.js");
13
- const Field = require("./Field-BG1xu38N.js");
13
+ const Field = require("./Field-Dh1yZyqy.js");
14
14
  const Icons = require("@strapi/icons");
15
15
  const styledComponents = require("styled-components");
16
- const relations = require("./relations-BbHizA5K.js");
16
+ const relations = require("./relations-DGzD7ORa.js");
17
17
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
18
18
  function _interopNamespace(e) {
19
19
  if (e && e.__esModule)
@@ -60,7 +60,7 @@ const CustomRelationInput = (props) => {
60
60
  } : field.value;
61
61
  if (!formattedFieldValue || formattedFieldValue.results.length === 0 && formattedFieldValue.meta.missingCount === 0) {
62
62
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
63
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { action: props.labelAction, children: props.label }),
63
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: props.label }),
64
64
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 1, children: /* @__PURE__ */ jsxRuntime.jsx(StyledAlert, { variant: "default", children: formatMessage({
65
65
  id: "content-manager.history.content.no-relations",
66
66
  defaultMessage: "No relations."
@@ -150,39 +150,12 @@ const CustomMediaInput = (props) => {
150
150
  )
151
151
  ] });
152
152
  };
153
- const getLabelAction = (labelAction) => {
154
- if (!React__namespace.isValidElement(labelAction)) {
155
- return labelAction;
156
- }
157
- const labelActionTitleId = labelAction.props.title.id;
158
- if (labelActionTitleId === "i18n.Field.localized") {
159
- return React__namespace.cloneElement(labelAction, {
160
- ...labelAction.props,
161
- title: {
162
- id: "history.content.localized",
163
- defaultMessage: "This value is specific to this locale. If you restore this version, the content will not be replaced for other locales."
164
- }
165
- });
166
- }
167
- if (labelActionTitleId === "i18n.Field.not-localized") {
168
- return React__namespace.cloneElement(labelAction, {
169
- ...labelAction.props,
170
- title: {
171
- id: "history.content.not-localized",
172
- defaultMessage: "This value is common to all locales. If you restore this version and save the changes, the content will be replaced for all locales."
173
- }
174
- });
175
- }
176
- return labelAction;
177
- };
178
153
  const VersionInputRenderer = ({
179
154
  visible,
180
155
  hint: providedHint,
181
156
  shouldIgnoreRBAC = false,
182
- labelAction,
183
157
  ...props
184
158
  }) => {
185
- const customLabelAction = getLabelAction(labelAction);
186
159
  const { formatMessage } = reactIntl.useIntl();
187
160
  const version = useHistoryContext("VersionContent", (state) => state.selectedVersion);
188
161
  const configuration = useHistoryContext("VersionContent", (state) => state.configuration);
@@ -240,42 +213,25 @@ const VersionInputRenderer = ({
240
213
  if (attributeHasCustomFieldProperty(props.attribute)) {
241
214
  const CustomInput = lazyComponentStore[props.attribute.customField];
242
215
  if (CustomInput) {
243
- return /* @__PURE__ */ jsxRuntime.jsx(
244
- CustomInput,
245
- {
246
- ...props,
247
- hint,
248
- labelAction: customLabelAction,
249
- disabled: fieldIsDisabled
250
- }
251
- );
216
+ return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, hint, disabled: fieldIsDisabled });
252
217
  }
253
218
  return /* @__PURE__ */ jsxRuntime.jsx(
254
219
  strapiAdmin.InputRenderer,
255
220
  {
256
221
  ...props,
257
222
  hint,
258
- labelAction: customLabelAction,
259
223
  type: props.attribute.customField,
260
224
  disabled: fieldIsDisabled
261
225
  }
262
226
  );
263
227
  }
264
228
  if (props.type === "media") {
265
- return /* @__PURE__ */ jsxRuntime.jsx(CustomMediaInput, { ...props, labelAction: customLabelAction, disabled: fieldIsDisabled });
229
+ return /* @__PURE__ */ jsxRuntime.jsx(CustomMediaInput, { ...props, disabled: fieldIsDisabled });
266
230
  }
267
231
  const addedInputTypes = Object.keys(fields);
268
232
  if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {
269
233
  const CustomInput = fields[props.type];
270
- return /* @__PURE__ */ jsxRuntime.jsx(
271
- CustomInput,
272
- {
273
- ...props,
274
- hint,
275
- labelAction: customLabelAction,
276
- disabled: fieldIsDisabled
277
- }
278
- );
234
+ return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, hint, disabled: fieldIsDisabled });
279
235
  }
280
236
  switch (props.type) {
281
237
  case "blocks":
@@ -294,60 +250,24 @@ const VersionInputRenderer = ({
294
250
  ...props,
295
251
  layout: [...layout, ...remainingFieldsLayout || []],
296
252
  hint,
297
- labelAction: customLabelAction,
298
253
  disabled: fieldIsDisabled,
299
254
  children: (inputProps) => /* @__PURE__ */ jsxRuntime.jsx(VersionInputRenderer, { ...inputProps, shouldIgnoreRBAC: true })
300
255
  }
301
256
  );
302
257
  case "dynamiczone":
303
- return /* @__PURE__ */ jsxRuntime.jsx(
304
- Field.DynamicZone,
305
- {
306
- ...props,
307
- hint,
308
- labelAction: customLabelAction,
309
- disabled: fieldIsDisabled
310
- }
311
- );
258
+ return /* @__PURE__ */ jsxRuntime.jsx(Field.DynamicZone, { ...props, hint, disabled: fieldIsDisabled });
312
259
  case "relation":
313
- return /* @__PURE__ */ jsxRuntime.jsx(
314
- CustomRelationInput,
315
- {
316
- ...props,
317
- hint,
318
- labelAction: customLabelAction,
319
- disabled: fieldIsDisabled
320
- }
321
- );
260
+ return /* @__PURE__ */ jsxRuntime.jsx(CustomRelationInput, { ...props, hint, disabled: fieldIsDisabled });
322
261
  case "richtext":
323
- return /* @__PURE__ */ jsxRuntime.jsx(
324
- Field.MemoizedWysiwyg,
325
- {
326
- ...props,
327
- hint,
328
- type: props.type,
329
- labelAction: customLabelAction,
330
- disabled: fieldIsDisabled
331
- }
332
- );
262
+ return /* @__PURE__ */ jsxRuntime.jsx(Field.MemoizedWysiwyg, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
333
263
  case "uid":
334
- return /* @__PURE__ */ jsxRuntime.jsx(
335
- Field.MemoizedUIDInput,
336
- {
337
- ...props,
338
- hint,
339
- type: props.type,
340
- labelAction: customLabelAction,
341
- disabled: fieldIsDisabled
342
- }
343
- );
264
+ return /* @__PURE__ */ jsxRuntime.jsx(Field.MemoizedUIDInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
344
265
  case "enumeration":
345
266
  return /* @__PURE__ */ jsxRuntime.jsx(
346
267
  strapiAdmin.InputRenderer,
347
268
  {
348
269
  ...props,
349
270
  hint,
350
- labelAction: customLabelAction,
351
271
  options: props.attribute.enum.map((value) => ({ value })),
352
272
  type: props.customField ? "custom-field" : props.type,
353
273
  disabled: fieldIsDisabled
@@ -360,7 +280,6 @@ const VersionInputRenderer = ({
360
280
  {
361
281
  ...restProps,
362
282
  hint,
363
- labelAction: customLabelAction,
364
283
  type: props.customField ? "custom-field" : props.type,
365
284
  disabled: fieldIsDisabled
366
285
  }
@@ -414,7 +333,7 @@ const FormPanel = ({ panel }) => {
414
333
  if (panel.some((row) => row.some((field) => field.type === "dynamiczone"))) {
415
334
  const [row] = panel;
416
335
  const [field] = row;
417
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 12, s: 12, xs: 12, children: /* @__PURE__ */ jsxRuntime.jsx(VersionInputRenderer, { ...field }) }) }, field.name);
336
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid, { gap: 4, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: 12, s: 12, xs: 12, children: /* @__PURE__ */ jsxRuntime.jsx(VersionInputRenderer, { ...field }) }) }, field.name);
418
337
  }
419
338
  return /* @__PURE__ */ jsxRuntime.jsx(
420
339
  designSystem.Box,
@@ -427,8 +346,8 @@ const FormPanel = ({ panel }) => {
427
346
  paddingTop: 6,
428
347
  paddingBottom: 6,
429
348
  borderColor: "neutral150",
430
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: panel.map((row, gridRowIndex) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: row.map(({ size, ...field }) => {
431
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: size, s: 12, xs: 12, children: /* @__PURE__ */ jsxRuntime.jsx(VersionInputRenderer, { ...field }) }, field.name);
349
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: panel.map((row, gridRowIndex) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid, { gap: 4, children: row.map(({ size, ...field }) => {
350
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: size, s: 12, xs: 12, children: /* @__PURE__ */ jsxRuntime.jsx(VersionInputRenderer, { ...field }) }, field.name);
432
351
  }) }, gridRowIndex)) })
433
352
  }
434
353
  );
@@ -610,7 +529,7 @@ const VersionHeader = ({ headerId }) => {
610
529
  });
611
530
  }
612
531
  };
613
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Root, { open: isConfirmDialogOpen, onOpenChange: setIsConfirmDialogOpen, children: [
532
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
614
533
  /* @__PURE__ */ jsxRuntime.jsx(
615
534
  strapiAdmin.Layouts.BaseHeader,
616
535
  {
@@ -638,7 +557,7 @@ const VersionHeader = ({ headerId }) => {
638
557
  defaultMessage: "Back"
639
558
  }) }),
640
559
  sticky: false,
641
- primaryAction: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(
560
+ primaryAction: /* @__PURE__ */ jsxRuntime.jsx(
642
561
  designSystem.Button,
643
562
  {
644
563
  disabled: !allowedActions.canUpdate || isCurrentVersion,
@@ -650,13 +569,16 @@ const VersionHeader = ({ headerId }) => {
650
569
  defaultMessage: "Restore"
651
570
  })
652
571
  }
653
- ) })
572
+ )
654
573
  }
655
574
  ),
656
575
  /* @__PURE__ */ jsxRuntime.jsx(
657
576
  strapiAdmin.ConfirmDialog,
658
577
  {
578
+ isOpen: isConfirmDialogOpen,
579
+ onClose: () => setIsConfirmDialogOpen(false),
659
580
  onConfirm: handleRestore,
581
+ icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.WarningCircle, {}),
660
582
  endAction: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "secondary", onClick: handleRestore, loading: isLoading, children: formatMessage({
661
583
  id: "content-manager.history.restore.confirm.button",
662
584
  defaultMessage: "Restore"
@@ -670,7 +592,6 @@ const VersionHeader = ({ headerId }) => {
670
592
  gap: 2,
671
593
  textAlign: "center",
672
594
  children: [
673
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.WarningCircle, { width: "24px", height: "24px", fill: "danger600" }) }),
674
595
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage({
675
596
  id: "content-manager.history.restore.confirm.title",
676
597
  defaultMessage: "Are you sure you want to restore this version?"
@@ -1025,4 +946,4 @@ const ProtectedHistoryPage = () => {
1025
946
  exports.HistoryProvider = HistoryProvider;
1026
947
  exports.ProtectedHistoryPage = ProtectedHistoryPage;
1027
948
  exports.useHistoryContext = useHistoryContext;
1028
- //# sourceMappingURL=History-BWWxLt2Z.js.map
949
+ //# sourceMappingURL=History-CW2akQ6h.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"History-CW2akQ6h.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 } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\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: () => {} })`\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 const formattedFieldValue = Array.isArray(field.value)\n ? {\n results: field.value,\n meta: { missingCount: 0 },\n }\n : field.value;\n\n if (\n !formattedFieldValue ||\n (formattedFieldValue.results.length === 0 && formattedFieldValue.meta.missingCount === 0)\n ) {\n return (\n <>\n <Field.Label>{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 href = `../${COLLECTION_TYPES}/${props.attribute.targetModel}/${relationData.documentId}`;\n const label = getRelationLabel(relationData, props.mainField);\n\n return (\n <Flex\n key={relationData.documentId}\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 description={label}>\n <LinkEllipsis tag={NavLink} to={href}>\n {label}\n </LinkEllipsis>\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\nconst CustomMediaInput = (props: VersionInputRendererProps) => {\n const {\n value: { results, meta },\n } = useField(props.name);\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 return (\n <Flex direction=\"column\" gap={2} alignItems=\"stretch\">\n <Form method=\"PUT\" disabled={true} initialValues={{ [props.name]: results }}>\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 * @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 ...props\n}: VersionInputRendererProps) => {\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 // @ts-expect-error – TODO: fix this type error in the useLazyComponents hook.\n return <CustomInput {...props} hint={hint} disabled={fieldIsDisabled} />;\n }\n\n return (\n <FormInputRenderer\n {...props}\n hint={hint}\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 <CustomMediaInput {...props} disabled={fieldIsDisabled} />;\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 // @ts-expect-error – TODO: fix this type error in the useLibrary hook.\n return <CustomInput {...props} hint={hint} disabled={fieldIsDisabled} />;\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 disabled={fieldIsDisabled}\n >\n {(inputProps) => <VersionInputRenderer {...inputProps} shouldIgnoreRBAC={true} />}\n </ComponentInput>\n );\n case 'dynamiczone':\n return <DynamicZone {...props} hint={hint} disabled={fieldIsDisabled} />;\n case 'relation':\n return <CustomRelationInput {...props} hint={hint} disabled={fieldIsDisabled} />;\n case 'richtext':\n return <Wysiwyg {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\n case 'uid':\n return <UIDInput {...props} hint={hint} type={props.type} disabled={fieldIsDisabled} />;\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 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 // @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, GridItem, 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 key={field.name} gap={4}>\n <GridItem col={12} s={12} xs={12}>\n <VersionInputRenderer {...field} />\n </GridItem>\n </Grid>\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 key={gridRowIndex} gap={4}>\n {row.map(({ size, ...field }) => {\n return (\n <GridItem col={size} key={field.name} s={12} xs={12}>\n <VersionInputRenderer {...field} />\n </GridItem>\n );\n })}\n </Grid>\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 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 useRBAC,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Button, Typography, Flex, Link } 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 { COLLECTION_TYPES } from '../../constants/collections';\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 { 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 if (collectionType === COLLECTION_TYPES) {\n return {\n pathname: `/content-manager/${collectionType}/${version.contentType}/${version.relatedDocumentId}`,\n search: pluginsQueryParams,\n };\n }\n\n return {\n pathname: `/content-manager/${collectionType}/${version.contentType}`,\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());\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: 'The content of the restored version is not published yet.',\n }),\n });\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 <>\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\">\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 startIcon={<ArrowLeft />} tag={NavLink} to={getNextNavigation()} isExternal={false}>\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n sticky={false}\n primaryAction={\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 }\n />\n <ConfirmDialog\n isOpen={isConfirmDialogOpen}\n onClose={() => setIsConfirmDialogOpen(false)}\n onConfirm={handleRestore}\n icon={<WarningCircle />}\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 <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 </>\n );\n};\n","import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, Typography, type BoxProps } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { RelativeTime } from '../../components/RelativeTime';\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\">{children}</Typography>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * VersionCard\n * -----------------------------------------------------------------------------------------------*/\n\ninterface StatusData {\n background: BoxProps['background'];\n border: BoxProps['borderColor'];\n text: BoxProps['color'];\n message: MessageDescriptor;\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\n const statusData = ((): StatusData => {\n switch (version.status) {\n case 'draft':\n return {\n background: 'secondary100',\n border: 'secondary200',\n text: 'secondary700',\n message: {\n id: 'content-manager.containers.List.draft',\n defaultMessage: 'Draft',\n },\n };\n case 'modified':\n return {\n background: 'alternative100',\n border: 'alternative200',\n text: 'alternative700',\n message: {\n // TODO: check the translation key once D&P v5 is done\n id: 'content-manager.containers.List.modified',\n defaultMessage: 'Modified',\n },\n };\n case 'published':\n default:\n return {\n background: 'success100',\n border: 'success200',\n text: 'success700',\n message: {\n id: 'content-manager.containers.List.published',\n defaultMessage: 'Published',\n },\n };\n }\n })();\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 paddingTop={4}\n paddingBottom={4}\n paddingLeft={5}\n paddingRight={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 && (\n <Box\n background={statusData.background}\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n borderColor={statusData.border}\n hasRadius\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n >\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor={statusData.text}>\n {formatMessage(statusData.message)}\n </Typography>\n </Box>\n )}\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\n direction=\"column\"\n gap={3}\n paddingTop={5}\n paddingBottom={5}\n paddingLeft={4}\n paddingRight={4}\n tag=\"ul\"\n alignItems=\"stretch\"\n >\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={5} 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 } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useParams } 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 <Page.NoData />;\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","NavLink","DocumentStatus","useStrapiApp","Form","useTypedSelector","useDoc","useForm","useDynamicZone","useDocumentRBAC","useLazyComponents","useFieldHint","useDocLayout","NotAllowedInput","FormInputRenderer","BlocksInput","ComponentInput","DynamicZone","Wysiwyg","UIDInput","Grid","GridItem","React","components","schema","pipe","removeFieldsThatDontExistOnSchema","prepareTempKeys","Layouts","index","Divider","Typography","contentManagerApi","useNavigate","useNotification","useQueryParams","useParams","useRBAC","PERMISSIONS","stringify","ArrowLeft","Button","ConfirmDialog","WarningCircle","getDisplayName","RelativeTime","createContext","useDocument","useDocumentLayout","useGetContentTypeConfigurationQuery","buildValidParams","Navigate","Page","Main","permissions","DocumentRBAC","Portal","FocusTrap"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,MAAM,cAAcA,iBAAAA,OAAOC,aAAAA,KAAK,EAAE,MAAM,EAAE,YAAY,SAAS,SAAS,MAAM;AAAC,EAAA,CAAG;AAAA;AAAA;AAAA;AAAA;AAUlF,MAAM,eAAeD,iBAAAA,OAAOE,aAAAA,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWhC,MAAM,sBAAsB,CAAC,UAA+B;AACpD,QAAA,EAAE,kBAAkBC,UAAAA;AACpB,QAAA,QAAQC,YAAAA,SAEZ,MAAM,IAAI;AAMZ,QAAM,sBAAsB,MAAM,QAAQ,MAAM,KAAK,IACjD;AAAA,IACE,SAAS,MAAM;AAAA,IACf,MAAM,EAAE,cAAc,EAAE;AAAA,EAAA,IAE1B,MAAM;AAGR,MAAA,CAAC,uBACA,oBAAoB,QAAQ,WAAW,KAAK,oBAAoB,KAAK,iBAAiB,GACvF;AACA,WAEIC,2BAAA,KAAAC,qBAAA,EAAA,UAAA;AAAA,MAAAC,2BAAA,IAACC,aAAM,MAAA,OAAN,EAAa,UAAA,MAAM,OAAM;AAAA,MAC1BD,2BAAAA,IAACE,oBAAI,WAAW,GAEd,yCAAC,aAAY,EAAA,SAAQ,WAClB,UAAc,cAAA;AAAA,QACb,IAAI;AAAA,QACJ,gBAAgB;AAAA,MAAA,CACjB,GACH,EACF,CAAA;AAAA,IACF,EAAA,CAAA;AAAA,EAEJ;AAEM,QAAA,EAAE,SAAS,KAAS,IAAA;AAE1B,yCACGA,kBACC,EAAA,UAAA;AAAA,IAAAF,2BAAA,IAACC,aAAM,MAAA,OAAN,EAAa,UAAA,MAAM,OAAM;AAAA,IACzB,QAAQ,SAAS,KACfD,2BAAAA,IAAAG,aAAAA,MAAA,EAAK,WAAU,UAAS,KAAK,GAAG,WAAW,GAAG,YAAW,WACvD,UAAQ,QAAA,IAAI,CAAC,iBAAiB;AAEvB,YAAA,OAAO,MAAMC,MAAAA,gBAAgB,IAAI,MAAM,UAAU,WAAW,IAAI,aAAa,UAAU;AAC7F,YAAM,QAAQC,UAAA,iBAAiB,cAAc,MAAM,SAAS;AAG1D,aAAAP,2BAAA;AAAA,QAACK,aAAA;AAAA,QAAA;AAAA,UAEC,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,aAAa;AAAA,UACb,cAAc;AAAA,UACd,WAAS;AAAA,UACT,aAAY;AAAA,UACZ,YAAW;AAAA,UACX,gBAAe;AAAA,UAEf,UAAA;AAAA,YAACH,2BAAAA,IAAAE,aAAAA,KAAA,EAAI,UAAU,GAAG,YAAY,GAAG,eAAe,GAAG,cAAc,GAC/D,UAAAF,2BAAA,IAACM,wBAAQ,aAAa,OACpB,yCAAC,cAAa,EAAA,KAAKC,eAAAA,SAAS,IAAI,MAC7B,UACH,MAAA,CAAA,EAAA,CACF,EACF,CAAA;AAAA,YACCP,2BAAAA,IAAAQ,MAAAA,gBAAA,EAAe,QAAQ,aAAa,OAAkB,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAjBlD,aAAa;AAAA,MAAA;AAAA,IAoBvB,CAAA,GACH;AAAA,IAED,KAAK,eAAe;AAAA,IAEnBR,2BAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,QACX,SAAQ;AAAA,QACR,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,gBACE;AAAA,UACJ;AAAA,UACA,EAAE,QAAQ,KAAK,aAAa;AAAA,QAC9B;AAAA,QAEC,UAAA;AAAA,UACC;AAAA,YACE,IAAI;AAAA,YACJ,gBACE;AAAA,UACJ;AAAA,UACA,EAAE,QAAQ,KAAK,aAAa;AAAA,QAC9B;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,EAAA,CAAA;AAEJ;AAMA,MAAM,mBAAmB,CAAC,UAAqC;AACvD,QAAA;AAAA,IACJ,OAAO,EAAE,SAAS,KAAK;AAAA,EAAA,IACrBH,YAAS,SAAA,MAAM,IAAI;AACjB,QAAA,EAAE,kBAAkBD,UAAAA;AAE1B,QAAM,SAASa,YAAAA,aAAa,oBAAoB,CAAC,UAAU,MAAM,MAAM;AACvE,QAAM,eAAe,OAAO;AAG5B,yCACGN,mBAAK,EAAA,WAAU,UAAS,KAAK,GAAG,YAAW,WAC1C,UAAA;AAAA,IAACH,2BAAAA,IAAAU,YAAA,MAAA,EAAK,QAAO,OAAM,UAAU,MAAM,eAAe,EAAE,CAAC,MAAM,IAAI,GAAG,QAChE,GAAA,UAAAV,2BAAAA,IAAC,cAAc,EAAA,GAAG,OAAO,UAAU,MAAM,UAAU,QAAQ,SAAS,EAAA,CAAG,EACzE,CAAA;AAAA,IACC,KAAK,eAAe,KACnBA,2BAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,YAAW;AAAA,QACX,SAAS,MAAM;AAAA,QAAC;AAAA,QAChB,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,gBACE;AAAA,UACJ;AAAA,UACA,EAAE,QAAQ,KAAK,aAAa;AAAA,QAC9B;AAAA,QAEC,UAAA;AAAA,UACC;AAAA,YACE,IAAI;AAAA,YACJ,gBACE;AAAA,UACJ;AAAA,UACA,EAAE,QAAQ,KAAK,aAAa;AAAA,QAC9B;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,EAAA,CAAA;AAEJ;AAiBA,MAAM,uBAAuB,CAAC;AAAA,EAC5B;AAAA,EACA,MAAM;AAAA,EACN,mBAAmB;AAAA,EACnB,GAAG;AACL,MAAiC;AACzB,QAAA,EAAE,kBAAkBJ,UAAAA;AAC1B,QAAM,UAAU,kBAAkB,kBAAkB,CAAC,UAAU,MAAM,eAAe;AACpF,QAAM,gBAAgB,kBAAkB,kBAAkB,CAAC,UAAU,MAAM,aAAa;AAClF,QAAA,aAAae,uBAAiB,CAAC,UAAU,MAAM,iBAAiB,EAAE,IAAI,UAAU;AAEtF,QAAM,EAAE,IAAI,WAAW,IAAIC,MAAO,OAAA;AAClC,QAAM,iBAAiBC,YAAAA,QAAQ,iBAAiB,CAAC,UAAU,MAAM,QAAQ;AAEzE,QAAM,kBAAkBC,MAAAA,eAAe,mBAAmB,CAAC,UAAU,MAAM,eAAe;AAE1F,QAAM,kBAAkBC,MAAAA,gBAAgB,iBAAiB,CAAC,SAAS,KAAK,eAAe;AACvF,QAAM,gBAAgBA,MAAAA,gBAAgB,iBAAiB,CAAC,SAAS,KAAK,aAAa;AACnF,QAAM,kBAAkBA,MAAAA,gBAAgB,iBAAiB,CAAC,SAAS,KAAK,eAAe;AACvF,QAAM,gBAAgBA,MAAAA,gBAAgB,iBAAiB,CAAC,SAAS,KAAK,aAAa;AAE7E,QAAA,iBAAiB,KAAK,kBAAkB;AACxC,QAAA,iBAAiB,KAAK,gBAAgB;AAK5C,QAAM,mBAAmB,cAAc,MAAM,MAAM,gBAAgB,MAAM,IAAI;AAC7E,QAAM,mBAAmB,cAAc,MAAM,MAAM,gBAAgB,MAAM,IAAI;AAE7E,QAAM,SAASN,YAAAA,aAAa,iBAAiB,CAAC,QAAQ,IAAI,MAAM;AAC1D,QAAA,EAAE,uBAAuBO,MAAA;AAAA,IAC7B,gCAAgC,MAAM,SAAS,IAAI,CAAC,MAAM,UAAU,WAAW,IAAI;AAAA,EAAA;AAGrF,QAAM,OAAOC,MAAA,aAAa,cAAc,MAAM,SAAS;AACjD,QAAA;AAAA,IACJ,MAAM,EAAE,YAAY,iBAAiB;AAAA,MACnCC,MAAa,aAAA;AAEjB,MAAI,CAAC,SAAS;AACL,WAAA;AAAA,EACT;AAKA,MAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,iBAAiB;AAC9D,WAAQlB,2BAAAA,IAAAmB,MAAAA,iBAAA,EAAgB,MAAa,GAAG,MAAO,CAAA;AAAA,EACjD;AAEA,QAAM,kBACH,CAAC,oBAAoB,CAAC,mBAAoB,MAAM,YAAY;AAMzD,QAAA,kBAAkB,QAAQ,KAAK,kBAAkB;AACvD,MAAI,OAAO,KAAK,eAAe,EAAE,SAAS,MAAM,IAAI,GAAG;AACrD,2CACGhB,mBAAK,EAAA,WAAU,UAAS,YAAW,cAAa,KAAK,GACpD,UAAA;AAAA,MAAAH,2BAAA,IAACC,aAAM,MAAA,OAAN,EAAa,UAAA,MAAM,OAAM;AAAA,MAC1BD,2BAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,YAAW;AAAA,UACX,SAAS,MAAM;AAAA,UAAC;AAAA,UAChB,SAAQ;AAAA,UACR,OAAO,cAAc;AAAA,YACnB,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,UAEA,UAAc,cAAA;AAAA,YACb,IAAI;AAAA,YACJ,gBACE;AAAA,UAAA,CACH;AAAA,QAAA;AAAA,MACH;AAAA,IACF,EAAA,CAAA;AAAA,EAEJ;AAMI,MAAA,gCAAgC,MAAM,SAAS,GAAG;AACpD,UAAM,cAAc,mBAAmB,MAAM,UAAU,WAAW;AAElE,QAAI,aAAa;AAEf,4CAAQ,aAAa,EAAA,GAAG,OAAO,MAAY,UAAU,gBAAiB,CAAA;AAAA,IACxE;AAGE,WAAAA,2BAAA;AAAA,MAACoB,YAAA;AAAA,MAAA;AAAA,QACE,GAAG;AAAA,QACJ;AAAA,QAEA,MAAM,MAAM,UAAU;AAAA,QACtB,UAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AAMI,MAAA,MAAM,SAAS,SAAS;AAC1B,WAAQpB,2BAAAA,IAAA,kBAAA,EAAkB,GAAG,OAAO,UAAU,gBAAiB,CAAA;AAAA,EACjE;AAIM,QAAA,kBAAkB,OAAO,KAAK,MAAM;AACtC,MAAA,CAAC,gCAAgC,MAAM,SAAS,KAAK,gBAAgB,SAAS,MAAM,IAAI,GAAG;AACvF,UAAA,cAAc,OAAO,MAAM,IAAI;AAErC,0CAAQ,aAAa,EAAA,GAAG,OAAO,MAAY,UAAU,gBAAiB,CAAA;AAAA,EACxE;AAMA,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACI,aAAAA,+BAACqB,MAAAA,uBAAa,GAAG,OAAO,MAAY,MAAM,MAAM,MAAM,UAAU,gBAAiB,CAAA;AAAA,IAC1F,KAAK;AACH,YAAM,EAAE,OAAO,IAAI,iBAAiB,MAAM,UAAU,SAAS;AAEvD,YAAA,CAAC,qBAAqB,IAAI,uBAAuB;AAAA,QACrD,QAAQ,CAAC,MAAM;AAAA,QACf,WAAW,cAAc,WAAW,MAAM,UAAU,SAAS,EAAE;AAAA,QAC/D;AAAA,QACA,kBAAkB,WAAW,MAAM,UAAU,SAAS,EAAE;AAAA,MAAA,CACzD;AAGC,aAAArB,2BAAA;AAAA,QAACsB,MAAA;AAAA,QAAA;AAAA,UACE,GAAG;AAAA,UACJ,QAAQ,CAAC,GAAG,QAAQ,GAAI,yBAAyB,CAAA,CAAG;AAAA,UACpD;AAAA,UACA,UAAU;AAAA,UAET,WAAC,eAAetB,+BAAC,wBAAsB,GAAG,YAAY,kBAAkB,MAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IAGrF,KAAK;AACH,4CAAQuB,MAAa,aAAA,EAAA,GAAG,OAAO,MAAY,UAAU,gBAAiB,CAAA;AAAA,IACxE,KAAK;AACH,4CAAQ,qBAAqB,EAAA,GAAG,OAAO,MAAY,UAAU,gBAAiB,CAAA;AAAA,IAChF,KAAK;AACI,aAAAvB,+BAACwB,MAAAA,mBAAS,GAAG,OAAO,MAAY,MAAM,MAAM,MAAM,UAAU,gBAAiB,CAAA;AAAA,IACtF,KAAK;AACI,aAAAxB,+BAACyB,MAAAA,oBAAU,GAAG,OAAO,MAAY,MAAM,MAAM,MAAM,UAAU,gBAAiB,CAAA;AAAA,IAIvF,KAAK;AAED,aAAAzB,2BAAA;AAAA,QAACoB,YAAA;AAAA,QAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA,SAAS,MAAM,UAAU,KAAK,IAAI,CAAC,WAAW,EAAE,MAAA,EAAQ;AAAA,UAExD,MAAM,MAAM,cAAc,iBAAiB,MAAM;AAAA,UACjD,UAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IAGhB;AAEE,YAAM,EAAE,QAAQ,SAAS,WAAW,YAAY,GAAG,UAAc,IAAA;AAE/D,aAAApB,2BAAA;AAAA,QAACoB,YAAA;AAAA,QAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UAEA,MAAM,MAAM,cAAc,iBAAiB,MAAM;AAAA,UACjD,UAAU;AAAA,QAAA;AAAA,MAAA;AAAA,EAGlB;AACF;AAEA,MAAM,kCAAkC,CACtC,cAEA,iBAAiB,aAAa,OAAO,UAAU,gBAAgB;AC1YjE,MAAM,yBAAyB,CAA2C,WAAgB;AACxF,SACE,OACG,OAAmB,CAAC,MAAM,UAAU;AAC/B,QAAA,MAAM,SAAS,eAAe;AAE3B,WAAA,KAAK,CAAC,KAAK,CAAC;AAEV,aAAA;AAAA,IACT;AAEA,QAAI,CAAC,KAAK,KAAK,SAAS,CAAC,GAAG;AAErB,WAAA,KAAK,CAAA,CAAE;AAAA,IACd;AAGA,SAAK,KAAK,SAAS,CAAC,EAAE,KAAK,KAAK;AAEzB,WAAA;AAAA,EAAA,GACN,CAAA,CAAE,EAEJ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AAEzB;AAmBA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoC;AAClC,QAAM,iBAAiB,OAAO;AAAA,IAAQ,CAAC,UACrC,MAAM,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,MAAM,IAAI,CAAC;AAAA,EAAA;AAE3D,QAAM,kBAAkB,OAAO,QAAQ,SAAS,EAAE;AAAA,IAChD,CAAC,wBAAwB,CAAC,MAAM,KAAK,MAAM;AAErC,UAAA,CAAC,eAAe,SAAS,IAAI,KAAK,MAAM,KAAK,YAAY,MAAM;AAC3D,cAAA,YAAY,iBAAiB,IAAI;AAEvC,+BAAuB,KAAK;AAAA,UAC1B;AAAA,UACA,MAAM,UAAU;AAAA,UAChB,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO,MAAM,KAAK,SAAS;AAAA,UAC3B;AAAA,UACA,MAAM,WAAW,UAAU,IAAI,EAAE,WAAW;AAAA,QAAA,CAC7C;AAAA,MACH;AAEO,aAAA;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EAAA;AAGH,SAAO,uBAAuB,eAAe;AAC/C;AAMA,MAAM,YAAY,CAAC,EAAE,YAA4C;AAC/D,MAAI,MAAM,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,UAAU,MAAM,SAAS,aAAa,CAAC,GAAG;AACpE,UAAA,CAAC,GAAG,IAAI;AACR,UAAA,CAAC,KAAK,IAAI;AAEhB,0CACGM,aAAAA,MAAsB,EAAA,KAAK,GAC1B,UAAC1B,2BAAA,IAAA2B,uBAAA,EAAS,KAAK,IAAI,GAAG,IAAI,IAAI,IAC5B,yCAAC,sBAAsB,EAAA,GAAG,MAAO,CAAA,GACnC,EAAA,GAHS,MAAM,IAIjB;AAAA,EAEJ;AAGE,SAAA3B,2BAAA;AAAA,IAACE,aAAA;AAAA,IAAA;AAAA,MACC,WAAS;AAAA,MACT,YAAW;AAAA,MACX,QAAO;AAAA,MACP,aAAa;AAAA,MACb,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,aAAY;AAAA,MAEZ,UAAAF,2BAAAA,IAACG,aAAAA,MAAK,EAAA,WAAU,UAAS,YAAW,WAAU,KAAK,GAChD,UAAM,MAAA,IAAI,CAAC,KAAK,iBACdH,2BAAAA,IAAA0B,aAAAA,MAAA,EAAwB,KAAK,GAC3B,UAAI,IAAA,IAAI,CAAC,EAAE,MAAM,GAAG,MAAA,MAAY;AAC/B,eACG1B,2BAAAA,IAAA2B,aAAAA,UAAA,EAAS,KAAK,MAAuB,GAAG,IAAI,IAAI,IAC/C,UAAA3B,2BAAA,IAAC,sBAAsB,EAAA,GAAG,MAAO,CAAA,KADT,MAAM,IAEhC;AAAA,MAAA,CAEH,EAAA,GAPQ,YAQX,CACD,GACH;AAAA,IAAA;AAAA,EAAA;AAGN;AAQA,MAAM,iBAAiB,MAAM;AACrB,QAAA,EAAE,kBAAkBJ,UAAAA;AACpB,QAAA,EAAE,WAAe,IAAAe,uBAAiB,CAAC,UAAU,MAAM,iBAAiB,EAAE,GAAG;AAC/E,QAAM,UAAU,kBAAkB,kBAAkB,CAAC,UAAU,MAAM,eAAe;AACpF,QAAM,SAAS,kBAAkB,kBAAkB,CAAC,UAAU,MAAM,MAAM;AAC1E,QAAM,gBAAgB,kBAAkB,kBAAkB,CAAC,UAAU,MAAM,aAAa;AACxF,QAAM,SAAS,kBAAkB,kBAAkB,CAAC,UAAU,MAAM,MAAM;AAGpE,QAAA,oBAAoB,QAAQ,KAAK,kBAAkB;AACzD,QAAM,4BAA4B,OAAO,QAAQ,iBAAiB,EAAE;AAAA,IAClE,CAAC,CAAC,eAAe,SAAS,MAAM;AAC9B,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA,kBAAkB;AAAA,QAClB,MAAM,UAAU;AAAA,QAChB,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM,WAAW,UAAU,IAAI,EAAE,WAAW;AAAA,MAAA;AAGvC,aAAA;AAAA,IACT;AAAA,EAAA;AAEI,QAAA,sBAAsB,uBAAuB,yBAAyB;AAG5E,QAAM,wBAAwB,uBAAuB;AAAA,IACnD,WAAW,cAAc,YAAY;AAAA,IACrC;AAAA,IACA,kBAAkB,OAAO;AAAA,IACzB;AAAA,EAAA,CACD;AAEK,QAAA,EAAE,eAAeC,MAAAA;AAMjB,QAAA,kBAAkBgB,iBAAM,QAAQ,MAAM;AAC1C,UAAM,YACJ,CAAC,kBAAqCC,cAAmC,CAAC,MAC1E,CAAC,aAAmC;AAC5BC,YAAAA,UAAS,EAAE,YAAY;AAC7B,YAAM,kBAAkBC,cAAA;AAAA,QACtBC,MAAAA,kCAAkCF,OAAM;AAAA,QACxCG,MAAA,gBAAgBH,SAAQD,WAAU;AAAA,MAAA;AAEpC,aAAO,gBAAgB,QAAQ;AAAA,IAAA;AAGnC,WAAO,UAAU,QAAQ,QAAQ,UAAU,EAAE,QAAQ,IAAI;AAAA,EAAA,GACxD,CAAC,YAAY,QAAQ,MAAM,QAAQ,MAAM,CAAC;AAG3C,SAAA/B,gCAACoC,YAAAA,QAAQ,SAAR,EACC,UAAA;AAAA,IAAAlC,2BAAA,IAACE,aAAI,KAAA,EAAA,eAAe,GAClB,UAAAF,2BAAAA,IAACU,YAAK,MAAA,EAAA,UAAU,MAAM,QAAO,OAAM,eAAe,iBAChD,UAAAV,+BAACG,aAAAA,QAAK,WAAU,UAAS,YAAW,WAAU,KAAK,GAAG,UAAS,YAC5D,UAAC,CAAA,GAAG,QAAQ,GAAG,qBAAqB,EAAE,IAAI,CAAC,OAAOgC,WAAU;AACpD,aAAAnC,2BAAA,IAAC,WAAsB,EAAA,MAAA,GAAPmC,MAAqB;AAAA,IAAA,CAC7C,EACH,CAAA,EACF,CAAA,GACF;AAAA,IACC,0BAA0B,SAAS,KAEhCrC,2BAAA,KAAAC,WAAA,UAAA,EAAA,UAAA;AAAA,MAAAC,2BAAA,IAACoC,aAAQ,SAAA,EAAA;AAAA,MACTtC,2BAAAA,KAACI,aAAAA,KAAI,EAAA,YAAY,GACf,UAAA;AAAA,QAACJ,2BAAAA,KAAAK,aAAA,MAAA,EAAK,WAAU,UAAS,YAAW,cAAa,eAAe,GAAG,KAAK,GACtE,UAAA;AAAA,UAACH,2BAAA,IAAAqC,aAAA,YAAA,EAAW,SAAQ,SACjB,UAAc,cAAA;AAAA,YACb,IAAI;AAAA,YACJ,gBAAgB;AAAA,UACjB,CAAA,GACH;AAAA,UACArC,2BAAAA,IAACqC,aAAAA,YAAW,EAAA,SAAQ,MACjB,UAAA;AAAA,YACC;AAAA,cACE,IAAI;AAAA,cACJ,gBACE;AAAA,YACJ;AAAA,YACA;AAAA,cACE,GAAG,CAAC,WACFrC,2BAAA,IAACqC,2BAAW,SAAQ,MAAK,YAAW,QACjC,UACH,OAAA,CAAA;AAAA,YAEJ;AAAA,UAAA,GAEJ;AAAA,QAAA,GACF;AAAA,QACArC,2BAAAA,IAACU,YAAAA,QAAK,UAAU,MAAM,QAAO,OAAM,eAAe,QAAQ,MACxD,UAACV,2BAAAA,IAAAG,aAAAA,MAAA,EAAK,WAAU,UAAS,YAAW,WAAU,KAAK,GAAG,UAAS,YAC5D,UAAoB,oBAAA,IAAI,CAAC,OAAOgC,WAAU;AAClC,iBAAAnC,2BAAA,IAAC,WAAsB,EAAA,MAAA,GAAPmC,MAAqB;AAAA,QAAA,CAC7C,GACH,EACF,CAAA;AAAA,MAAA,GACF;AAAA,IAAA,GACF;AAAA,EAEJ,EAAA,CAAA;AAEJ;ACtPA,MAAM,qBAAqBG,wBAAkB,gBAAgB;AAAA,EAC3D,WAAW,CAAC,aAAa;AAAA,IACvB,oBAAoB,QAAQ,MAG1B;AAAA,MACA,MAAM,QAAQ;AACL,eAAA;AAAA,UACL,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ;AAAA,MACA,cAAc,CAAC,gBAAgB;AAAA,IAAA,CAChC;AAAA,IACD,gBAAgB,QAAQ,SAAyD;AAAA,MAC/E,MAAM,EAAE,QAAQ,QAAQ;AACf,eAAA;AAAA,UACL,KAAK,qCAAqC,OAAO,SAAS;AAAA,UAC1D,QAAQ;AAAA,UACR,MAAM;AAAA,QAAA;AAAA,MAEV;AAAA,MACA,iBAAiB,CAAC,MAAM,QAAQ,EAAE,YAAY,gBAAgB,aAAa;AAClE,eAAA;AAAA,UACL;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,IACE,mBAAmBlC,yBACf,GAAG,OAAO,WAAW,IAAI,UAAU,KACnC,OAAO;AAAA,UACf;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA,CACD;AAAA,EAAA;AAEL,CAAC;AAED,MAAM,EAAE,4BAA4B,0BAAA,IAA8B;AC9B3D,MAAM,gBAAgB,CAAC,EAAE,eAAmC;AACjE,QAAM,CAAC,qBAAqB,sBAAsB,IAAIwB,iBAAM,SAAS,KAAK;AAC1E,QAAM,WAAWW,eAAAA;AACjB,QAAM,EAAE,eAAe,WAAW,IAAI3C,UAAQ,QAAA;AACxC,QAAA,EAAE,uBAAuB4C,YAAAA;AAC/B,QAAM,CAAC,EAAE,OAAO,IAAIC,YAEjB,eAAA;AACH,QAAM,EAAE,gBAAgB,KAAK,IAAIC,eAA6D,UAAA;AAC9F,QAAM,CAAC,gBAAgB,EAAE,UAAU,CAAC,IAAI,0BAA0B;AAClE,QAAM,EAAE,eAAmB,IAAAC,oBAAQC,MAAAA,YAAY,IAAI,CAAC,YAAY,EAAE,QAAQ,SAAS,OAAO,CAAC;AAE3F,QAAM,UAAU,kBAAkB,iBAAiB,CAAC,UAAU,MAAM,eAAe;AACnF,QAAM,YAAY,kBAAkB,iBAAiB,CAAC,UAAU,MAAM,SAAS;AAC/E,QAAM,SAAS,kBAAkB,iBAAiB,CAAC,UAAU,MAAM,MAAM;AACzE,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA,CAAC,UAAU,MAAM,SAAS,KAAK,MAAM,SAAS,KAAK,CAAC,EAAE,OAAO,MAAM,gBAAgB;AAAA,EAAA;AAG/E,QAAA,iBAAiB,QAAQ,KAAK,SAAS;AAE7C,QAAM,oBAAoB,MAAU;AAC5B,UAAA,qBAAqBC,aAAU,EAAE,SAAS,MAAM,WAAW,EAAE,QAAQ,MAAA,CAAO;AAElF,QAAI,mBAAmBzC,MAAAA,kBAAkB;AAChC,aAAA;AAAA,QACL,UAAU,oBAAoB,cAAc,IAAI,QAAQ,WAAW,IAAI,QAAQ,iBAAiB;AAAA,QAChG,QAAQ;AAAA,MAAA;AAAA,IAEZ;AAEO,WAAA;AAAA,MACL,UAAU,oBAAoB,cAAc,IAAI,QAAQ,WAAW;AAAA,MACnE,QAAQ;AAAA,IAAA;AAAA,EACV;AAGF,QAAM,gBAAgB,YAAY;AAC5B,QAAA;AACI,YAAA,WAAW,MAAM,eAAe;AAAA,QACpC,YAAY,QAAQ;AAAA,QACpB;AAAA,QACA,QAAQ;AAAA,UACN,WAAW,QAAQ;AAAA,UACnB,aAAa,QAAQ;AAAA,QACvB;AAAA,QACA,MAAM,EAAE,aAAa,QAAQ,YAAY;AAAA,MAAA,CAC1C;AAED,UAAI,UAAU,UAAU;AACtB,iBAAS,mBAAmB;AAET,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,OAAO,cAAc;AAAA,YACnB,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,UACD,SAAS,cAAc;AAAA,YACrB,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,QAAA,CACF;AAAA,MACH;AAEA,UAAI,WAAW,UAAU;AACJ,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,cAAc;AAAA,YACrB,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,QAAA,CACF;AAAA,MACH;AAAA,aACO,OAAO;AACK,yBAAA;AAAA,QACjB,MAAM;AAAA,QACN,SAAS,cAAc,EAAE,IAAI,sBAAsB,gBAAgB,qBAAqB;AAAA,MAAA,CACzF;AAAA,IACH;AAAA,EAAA;AAGF,SAEIN,2BAAA,KAAAC,qBAAA,EAAA,UAAA;AAAA,IAAAC,2BAAA;AAAA,MAACkC,YAAAA,QAAQ;AAAA,MAAR;AAAA,QACC,IAAI;AAAA,QACJ,OAAO,WAAW,IAAI,KAAK,QAAQ,SAAS,GAAG;AAAA,UAC7C,MAAM;AAAA,UACN,OAAO;AAAA,UACP,KAAK;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,QAAA,CACT;AAAA,QACD,UACElC,2BAAA,IAACqC,aAAW,YAAA,EAAA,SAAQ,WACjB,UAAA;AAAA,UACC;AAAA,YACE,IAAI;AAAA,YACJ,gBACE;AAAA,UACJ;AAAA,UACA;AAAA,YACE,WAAW,QAAQ,QAAQ,MAAM;AAAA,YACjC,UAAU,GAAG,kBAAkB,EAAE,KAAK,OAAO,KAAK,YAAY,IAAI,KAAK;AAAA,YACvE,QAAQ,QAAQ,QAAQ;AAAA,UAC1B;AAAA,QAAA,GAEJ;AAAA,QAEF,kBACErC,2BAAA,IAACL,mBAAK,EAAA,0CAAYmD,MAAU,WAAA,EAAA,GAAI,KAAKvC,eAAA,SAAS,IAAI,kBAAqB,GAAA,YAAY,OAChF,UAAc,cAAA;AAAA,UACb,IAAI;AAAA,UACJ,gBAAgB;AAAA,QACjB,CAAA,GACH;AAAA,QAEF,QAAQ;AAAA,QACR,eACEP,2BAAA;AAAA,UAAC+C,aAAA;AAAA,UAAA;AAAA,YACC,UAAU,CAAC,eAAe,aAAa;AAAA,YACvC,SAAS,MAAM;AACb,qCAAuB,IAAI;AAAA,YAC7B;AAAA,YAEC,UAAc,cAAA;AAAA,cACb,IAAI;AAAA,cACJ,gBAAgB;AAAA,YAAA,CACjB;AAAA,UAAA;AAAA,QACH;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA/C,2BAAA;AAAA,MAACgD,YAAA;AAAA,MAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM,uBAAuB,KAAK;AAAA,QAC3C,WAAW;AAAA,QACX,qCAAOC,MAAc,eAAA,EAAA;AAAA,QACrB,0CACGF,qBAAO,EAAA,SAAQ,aAAY,SAAS,eAAe,SAAS,WAC1D,UAAc,cAAA;AAAA,UACb,IAAI;AAAA,UACJ,gBAAgB;AAAA,QACjB,CAAA,GACH;AAAA,QAGF,UAAAjD,2BAAA;AAAA,UAACK,aAAA;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,YAAW;AAAA,YACX,gBAAe;AAAA,YACf,KAAK;AAAA,YACL,WAAU;AAAA,YAEV,UAAA;AAAA,cAAAH,2BAAAA,IAACqC,2BACE,UAAc,cAAA;AAAA,gBACb,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cACjB,CAAA,GACH;AAAA,6CACCA,aAAAA,YACE,EAAA,UAAA;AAAA,gBACC;AAAA,kBACE,IAAI;AAAA,kBACJ,gBACE;AAAA,gBACJ;AAAA,gBACA;AAAA,kBACE,SAAS,QAAQ,WAAW;AAAA,gBAC9B;AAAA,cAAA,GAEJ;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA;AAEJ;ACvLA,MAAM,WAAW,CAAC,4CACfA,aAAAA,YAAW,EAAA,WAAU,cAAc,SAAS,CAAA;AAmB/C,MAAM,cAAc,CAAC,EAAE,SAAS,gBAAkC;AAChE,QAAM,EAAE,YAAY,cAAc,IAAIzC,UAAQ,QAAA;AAC9C,QAAM,CAAC,EAAE,OAAO,IAAI6C,YAAgC,eAAA;AAEpD,QAAM,cAAc,MAAkB;AACpC,YAAQ,QAAQ,QAAQ;AAAA,MACtB,KAAK;AACI,eAAA;AAAA,UACL,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AAAA,YACP,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAClB;AAAA,QAAA;AAAA,MAEJ,KAAK;AACI,eAAA;AAAA,UACL,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AAAA;AAAA,YAEP,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAClB;AAAA,QAAA;AAAA,MAEJ,KAAK;AAAA,MACL;AACS,eAAA;AAAA,UACL,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AAAA,YACP,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAClB;AAAA,QAAA;AAAA,IAEN;AAAA,EAAA;AAEF,QAAM,WAAW,MAAM,OAAO,QAAQ,GAAG;AACzC,QAAM,SAAS,QAAQ,aAAaS,MAAAA,eAAe,QAAQ,SAAS;AAGlE,SAAApD,2BAAA;AAAA,IAACK,aAAA;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,YAAW;AAAA,MACX,KAAK;AAAA,MACL,WAAS;AAAA,MACT,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,aAAa,WAAW,eAAe;AAAA,MACvC,OAAM;AAAA,MACN,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,aAAa;AAAA,MACb,cAAc;AAAA,MACd,KAAKR,eAAA;AAAA,MACL,IAAI,IAAIkD,GAAAA,UAAU,EAAE,GAAG,OAAO,IAAI,QAAQ,GAAI,CAAA,CAAC;AAAA,MAC/C,OAAO,EAAE,gBAAgB,OAAO;AAAA,MAEhC,UAAA;AAAA,QAAA/C,gCAACK,aAAAA,QAAK,WAAU,UAAS,KAAK,GAAG,YAAW,cAC1C,UAAA;AAAA,UAAAH,2BAAAA,IAACqC,2BAAW,KAAI,MAAK,YAAW,YAC7B,UAAA,WAAW,QAAQ,WAAW;AAAA,YAC7B,KAAK;AAAA,YACL,OAAO;AAAA,YACP,MAAM;AAAA,YACN,MAAM;AAAA,YACN,QAAQ;AAAA,UACT,CAAA,GACH;AAAA,yCACCA,aAAAA,YAAW,EAAA,KAAI,KAAI,SAAQ,MAAK,WAAU,cACxC,UAAA;AAAA,YACC;AAAA,cACE,IAAI;AAAA,cACJ,gBACE;AAAA,YACJ;AAAA,YACA;AAAA,cACE,8CAAgBc,MAAAA,cAAa,EAAA,WAAW,IAAI,KAAK,QAAQ,SAAS,GAAG;AAAA,cACrE;AAAA,cACA,aAAa,CAAC,QAAQ,QAAQ,SAAS;AAAA,cACvC;AAAA,cACA,GAAG;AAAA,YACL;AAAA,UAAA,GAEJ;AAAA,QAAA,GACF;AAAA,QACC,QAAQ,UACPnD,2BAAA;AAAA,UAACE,aAAA;AAAA,UAAA;AAAA,YACC,YAAY,WAAW;AAAA,YACvB,aAAY;AAAA,YACZ,aAAY;AAAA,YACZ,aAAa,WAAW;AAAA,YACxB,WAAS;AAAA,YACT,aAAY;AAAA,YACZ,cAAa;AAAA,YACb,YAAW;AAAA,YACX,eAAc;AAAA,YAEd,UAACF,2BAAA,IAAAqC,aAAA,YAAA,EAAW,SAAQ,MAAK,YAAW,QAAO,WAAW,WAAW,MAC9D,UAAA,cAAc,WAAW,OAAO,GACnC;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;AAWA,MAAM,mBAAmB,CAAC,EAAE,MAAM,eAAsC;AACtE,QAAM,CAAC,EAAE,OAAO,IAAII,YAAgC,eAAA;AAIpD,QAAM,EAAE,IAAI,KAAK,GAAG,cAAc;AAGhC,SAAAzC,+BAACL,eAAAA,MAAK,EAAA,IAAI,EAAE,QAAQkD,aAAU,EAAE,GAAG,WAAW,MAAM,EAAA,GAAK,OAAO,EAAE,gBAAgB,UAChF,UAAA7C,2BAAA,IAACqC,aAAW,YAAA,EAAA,SAAQ,SAAQ,WAAU,cACnC,SACH,CAAA,EACF,CAAA;AAEJ;AAMA,MAAM,eAAe,MAAM;AACnB,QAAA,EAAE,kBAAkBzC,UAAAA;AAC1B,QAAM,EAAE,UAAU,KAAA,IAAS,kBAAkB,gBAAgB,CAAC,WAAW;AAAA,IACvE,UAAU,MAAM;AAAA,IAChB,MAAM,MAAM;AAAA,EACZ,EAAA;AAGA,SAAAE,2BAAA;AAAA,IAACK,aAAA;AAAA,IAAA;AAAA,MACC,QAAQ;AAAA,MACR,WAAU;AAAA,MACV,YAAW;AAAA,MACX,OAAM;AAAA,MACN,QAAO;AAAA,MACP,YAAW;AAAA,MACX,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,KAAI;AAAA,MAEJ,UAAA;AAAA,QAAAL,2BAAA;AAAA,UAACK,aAAA;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,gBAAe;AAAA,YACf,SAAS;AAAA,YACT,aAAY;AAAA,YACZ,aAAY;AAAA,YACZ,aAAY;AAAA,YACZ,KAAI;AAAA,YAEJ,UAAA;AAAA,cAAAH,2BAAAA,IAACqC,2BAAW,KAAI,MAAK,SAAQ,SAAQ,YAAW,YAC7C,UAAc,cAAA;AAAA,gBACb,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cACjB,CAAA,GACH;AAAA,6CACCnC,aAAI,KAAA,EAAA,YAAW,cAAa,WAAS,MAAC,SAAS,GAC9C,UAAAF,+BAACqC,aAAAA,YAAW,EAAA,SAAQ,SAAQ,WAAU,cACnC,mBAAS,KAAK,WAAW,MAC5B,CAAA,GACF;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,QACCvC,2BAAA,KAAAI,aAAA,KAAA,EAAI,MAAM,GAAG,UAAS,QACpB,UAAA;AAAA,UAAA,SAAS,KAAK,WAAW,OAAO,oCAC9BA,aAAAA,KAAI,EAAA,YAAY,GAAG,WAAU,UAC5B,UAACF,2BAAA,IAAA,kBAAA,EAAiB,MAAM,OAAO,GAC5B,UAAc,cAAA;AAAA,YACb,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB,GACH,EACF,CAAA;AAAA,UAEFA,2BAAA;AAAA,YAACG,aAAA;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,KAAK;AAAA,cACL,YAAY;AAAA,cACZ,eAAe;AAAA,cACf,aAAa;AAAA,cACb,cAAc;AAAA,cACd,KAAI;AAAA,cACJ,YAAW;AAAA,cAEV,UAAS,SAAA,KAAK,IAAI,CAAC,SAASgC,WAC3BnC,2BAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,cAAY,cAAc;AAAA,oBACxB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBAED,yCAAC,aAAY,EAAA,SAAkB,WAAW,SAAS,KAAKmC,WAAU,GAAG;AAAA,gBAAA;AAAA,gBANhE,QAAQ;AAAA,cAAA,CAQhB;AAAA,YAAA;AAAA,UACH;AAAA,UACC,SAAS,KAAK,WAAW,OAAO,SAAS,KAAK,WAAW,aACxDnC,+BAACE,aAAAA,OAAI,eAAe,GAAG,WAAU,UAC/B,UAAAF,+BAAC,oBAAiB,MAAM,OAAO,GAC5B,UAAc,cAAA;AAAA,YACb,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB,GACH,EACF,CAAA;AAAA,QAAA,GAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;ACxNA,MAAM,CAAC,iBAAiB,iBAAiB,IAAIoD,YAAAA,cAAmC,aAAa;AAM7F,MAAM,cAAc,MAAM;AAClB,QAAA,WAAWxB,iBAAM;AACjB,QAAA,EAAE,kBAAkBhC,UAAAA;AACpB,QAAA;AAAA,IACJ;AAAA,IACA,IAAI;AAAA,IACJ;AAAA,MACE8C,eAID,UAAA;AAEH,QAAM,EAAE,WAAW,mBAAmB,OAAA,IAAWW,MAAAA,YAAY;AAAA,IAC3D;AAAA,IACA,OAAO;AAAA,EAAA,CACR;AAEK,QAAA;AAAA,IACJ,WAAW;AAAA,IACX,MAAM;AAAA,MACJ;AAAA,MACA,UAAU,EAAE,aAAa,UAAU;AAAA,IACrC;AAAA,EAAA,IACEC,MAAAA,kBAAkB,IAAK;AAC3B,QAAM,EAAE,MAAM,eAAe,WAAW,2BACtCC,MAAAA,oCAAoC,IAAK;AAG3C,QAAM,CAAC,EAAE,OAAO,IAAId,YAIjB,eAAA;AACH,QAAM,EAAE,IAAI,mBAAmB,GAAG,mBAAmB;AAC/C,QAAA,4BAA4Be,uBAAiB,cAAc;AACjE,QAAM,OAAO,0BAA0B,OAAO,OAAO,0BAA0B,IAAI,IAAI;AAEvF,QAAM,mBAAmB;AAAA,IACvB;AAAA,MACE,aAAa;AAAA,MACb,GAAI,aAAa,EAAE,WAAA,IAAe,CAAC;AAAA;AAAA,MAEnC,GAAG;AAAA,IACL;AAAA,IACA,EAAE,2BAA2B,KAAK;AAAA,EAAA;AAapC,QAAM,mBAAmB5B,iBAAM,OAAO,iBAAiB,SAAS;AAC1D,QAAA,iBAAiB,iBAAiB,cAAc,iBAAiB;AAOvE,MAAI,CAAC,QAAS,mBAAmBxB,MAAA,oBAAoB,CAAC,YAAa;AAC1D,WAAAJ,2BAAA,IAACyD,eAAS,UAAA,EAAA,IAAG,mBAAmB,CAAA;AAAA,EACzC;AAEA,MACE,qBACA,mBACA,iBAAiB,cACjB,kBACA,wBACA;AACO,WAAAzD,+BAAC0D,YAAAA,KAAK,SAAL,CAAa,CAAA;AAAA,EACvB;AAGA,MAAI,CAAC,iBAAiB,WAAW,CAAC,iBAAiB,MAAM,MAAM,QAAQ;AAC9D,WAAA1D,+BAAC0D,YAAAA,KAAK,QAAL,CAAY,CAAA;AAAA,EACtB;AAGA,MAAI,iBAAiB,MAAM,MAAM,UAAU,CAAC,mBAAmB;AAE3D,WAAA1D,2BAAA;AAAA,MAACyD,eAAA;AAAA,MAAA;AAAA,QACC,IAAI,EAAE,QAAQZ,aAAU,EAAE,GAAG,OAAO,IAAI,iBAAiB,KAAK,KAAK,CAAC,EAAE,GAAI,CAAA,EAAE;AAAA,QAC5E,SAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAGb;AAEM,QAAA,kBAAkB,iBAAiB,MAAM,MAAM;AAAA,IACnD,CAAC,YAAY,QAAQ,GAAG,SAAe,MAAA;AAAA,EAAA;AAGvC,MAAA,iBAAiB,WACjB,CAAC,UACD,CAAC,UACD,CAAC,mBACD,CAAC;AAAA,EAED,iBAAiB,KAAK,OACtB;AACO,WAAA7C,+BAAC0D,YAAAA,KAAK,OAAL,CAAW,CAAA;AAAA,EACrB;AAEA,SAEI5D,2BAAA,KAAAC,qBAAA,EAAA,UAAA;AAAA,IAACC,2BAAAA,IAAA0D,YAAA,KAAK,OAAL,EACE,UAAA;AAAA,MACC;AAAA,QACE,IAAI;AAAA,QACJ,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,aAAa;AAAA,MACf;AAAA,IAAA,GAEJ;AAAA,IACA1D,2BAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAa;AAAA,QACb,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,iBAAiB;AAAA,QAC3B;AAAA,QACA;AAAA,QAEA,UAACF,2BAAAA,KAAAK,aAAAA,MAAA,EAAK,WAAU,OAAM,YAAW,cAC/B,UAAA;AAAA,UAAAL,2BAAA;AAAA,YAAC6D,aAAA;AAAA,YAAA;AAAA,cACC,MAAM;AAAA,cACN,QAAO;AAAA,cACP,YAAW;AAAA,cACX,eAAe;AAAA,cACf,UAAS;AAAA,cACT,YAAY;AAAA,cAEZ,UAAA;AAAA,gBAAA3D,+BAAC,iBAAc,UAAoB;AAAA,+CAClC,gBAAe,EAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAClB;AAAA,yCACC,cAAa,EAAA;AAAA,QAAA,GAChB;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA;AAEJ;AAMA,MAAM,2BAA2B,MAAM;AAC/B,QAAA,EAAE,SAAS0C,eAAAA;AAGX,QAAA;AAAA,IACJ,cAAc,CAAC;AAAA,IACf;AAAA,IACA;AAAA,EACF,IAAIC,oBAAQC,MAAAA,YAAY,IAAI,CAAC,YAAY,EAAE,QAAQ,SAAS,OAAO,CAAC;AAEpE,MAAI,WAAW;AACN,WAAA5C,+BAAC0D,YAAAA,KAAK,SAAL,CAAa,CAAA;AAAA,EACvB;AAEI,MAAA,SAAS,CAAC,MAAM;AAEhB,WAAA1D,2BAAA;AAAA,MAACE,aAAA;AAAA,MAAA;AAAA,QACC,QAAO;AAAA,QACP,OAAM;AAAA,QACN,UAAS;AAAA,QACT,KAAK;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,YAAW;AAAA,QAEX,UAAAF,2BAAA,IAAC0D,iBAAK,OAAL,CAAA,CAAW;AAAA,MAAA;AAAA,IAAA;AAAA,EAGlB;AAGE,SAAA1D,2BAAA;AAAA,IAACE,aAAA;AAAA,IAAA;AAAA,MACC,QAAO;AAAA,MACP,OAAM;AAAA,MACN,UAAS;AAAA,MACT,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAW;AAAA,MAEX,yCAACwD,YAAK,KAAA,SAAL,EAAa,aACX,WAAC,EAAE,aAAAE,aAAY,qCACbC,oBAAa,EAAA,aAAaD,cACzB,UAAC5D,2BAAA,IAAA,aAAA,CAAA,CAAY,EACf,CAAA,GAEJ;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,MAAM,uBAAuB,MAAM;AACjC,wCACG8D,aACC,QAAA,EAAA,UAAA9D,2BAAA,IAAC+D,0BACC,UAAC/D,2BAAA,IAAA,0BAAA,CAAyB,CAAA,EAC5B,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1,10 +1,11 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
+ import { useId } from "react";
3
4
  import { useForm, Layouts, BackButton, InputRenderer, useNotification, useField, Form, useTracking, useAPIErrorHandler, Page } from "@strapi/admin/strapi-admin";
4
- import { Button, useCollator, Flex, Typography, Grid, Modal, Box, useComposedRefs, Menu, VisuallyHidden, Main, Divider } from "@strapi/design-system";
5
+ import { Button, useCollator, Flex, Typography, Grid, GridItem, ModalLayout, ModalHeader, ModalBody, ModalFooter, Box, useComposedRefs, Menu, VisuallyHidden, Main, Divider } from "@strapi/design-system";
5
6
  import { useIntl } from "react-intl";
6
7
  import { Navigate } from "react-router-dom";
7
- import { g as getTranslation, y as capitalise, c as useDoc, o as useGetContentTypeConfigurationQuery, v as checkIfAttributeIsDisplayable, n as useDocLayout, z as useUpdateContentTypeConfigurationMutation, S as SINGLE_TYPES } from "./index-JNNNKUHs.mjs";
8
+ import { g as getTranslation, y as capitalise, c as useDoc, o as useGetContentTypeConfigurationQuery, v as checkIfAttributeIsDisplayable, n as useDocLayout, z as useUpdateContentTypeConfigurationMutation, S as SINGLE_TYPES } from "./index-Dahjdw4h.mjs";
8
9
  import { u as useTypedSelector } from "./hooks-E5u1mcgM.mjs";
9
10
  import { s as setIn } from "./objects-mKMAmfec.mjs";
10
11
  import { Drag, Pencil, Cross, Plus } from "@strapi/icons";
@@ -102,8 +103,8 @@ const Settings = () => {
102
103
  id: getTranslation("containers.SettingPage.settings"),
103
104
  defaultMessage: "Settings"
104
105
  }) }),
105
- /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: formLayout.map(
106
- (row) => row.map(({ size, ...field }) => /* @__PURE__ */ jsx(Grid.Item, { s: 12, col: size, children: /* @__PURE__ */ jsx(InputRenderer, { ...field }) }, field.name))
106
+ /* @__PURE__ */ jsx(Grid, { gap: 4, children: formLayout.map(
107
+ (row) => row.map(({ size, ...field }) => /* @__PURE__ */ jsx(GridItem, { s: 12, col: size, children: /* @__PURE__ */ jsx(InputRenderer, { ...field }) }, field.name))
107
108
  ) }, "bottom")
108
109
  ] });
109
110
  };
@@ -181,6 +182,7 @@ const FIELD_SCHEMA = yup.object().shape({
181
182
  const EditFieldForm = ({ attribute, name, onClose }) => {
182
183
  const { formatMessage } = useIntl();
183
184
  const { toggleNotification } = useNotification();
185
+ const id = useId();
184
186
  const { value, onChange } = useField(name);
185
187
  if (!value) {
186
188
  console.error(
@@ -199,7 +201,7 @@ const EditFieldForm = ({ attribute, name, onClose }) => {
199
201
  if ("relation" in attribute && ["oneWay", "oneToOne", "manyToOne"].includes(attribute.relation)) {
200
202
  shouldDisplaySortToggle = true;
201
203
  }
202
- return /* @__PURE__ */ jsx(Modal.Content, { children: /* @__PURE__ */ jsxs(
204
+ return /* @__PURE__ */ jsx(ModalLayout, { onClose, labelledBy: id, children: /* @__PURE__ */ jsxs(
203
205
  Form,
204
206
  {
205
207
  method: "PUT",
@@ -210,9 +212,9 @@ const EditFieldForm = ({ attribute, name, onClose }) => {
210
212
  onClose();
211
213
  },
212
214
  children: [
213
- /* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsxs(HeaderContainer, { children: [
215
+ /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsxs(HeaderContainer, { children: [
214
216
  /* @__PURE__ */ jsx(FieldTypeIcon, { type: attribute.type }),
215
- /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage(
217
+ /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", textColor: "neutral800", tag: "h2", id, children: formatMessage(
216
218
  {
217
219
  id: getTranslation("containers.list-settings.modal-form.label"),
218
220
  defaultMessage: "Edit {fieldName}"
@@ -220,7 +222,7 @@ const EditFieldForm = ({ attribute, name, onClose }) => {
220
222
  { fieldName: capitalise(value.label) }
221
223
  ) })
222
224
  ] }) }),
223
- /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: [
225
+ /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsx(Grid, { gap: 4, children: [
224
226
  {
225
227
  name: "label",
226
228
  label: formatMessage({
@@ -245,11 +247,14 @@ const EditFieldForm = ({ attribute, name, onClose }) => {
245
247
  }
246
248
  ].filter(
247
249
  (field) => field.name !== "sortable" || field.name === "sortable" && shouldDisplaySortToggle
248
- ).map(({ size, ...field }) => /* @__PURE__ */ jsx(Grid.Item, { s: 12, col: size, children: /* @__PURE__ */ jsx(InputRenderer, { ...field }) }, field.name)) }) }),
249
- /* @__PURE__ */ jsxs(Modal.Footer, { children: [
250
- /* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "tertiary", children: formatMessage({ id: "app.components.Button.cancel", defaultMessage: "Cancel" }) }),
251
- /* @__PURE__ */ jsx(Button, { type: "submit", children: formatMessage({ id: "global.finish", defaultMessage: "Finish" }) })
252
- ] })
250
+ ).map(({ size, ...field }) => /* @__PURE__ */ jsx(GridItem, { s: 12, col: size, children: /* @__PURE__ */ jsx(InputRenderer, { ...field }) }, field.name)) }) }),
251
+ /* @__PURE__ */ jsx(
252
+ ModalFooter,
253
+ {
254
+ startActions: /* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "tertiary", children: formatMessage({ id: "app.components.Button.cancel", defaultMessage: "Cancel" }) }),
255
+ endActions: /* @__PURE__ */ jsx(Button, { type: "submit", children: formatMessage({ id: "global.finish", defaultMessage: "Finish" }) })
256
+ }
257
+ )
253
258
  ]
254
259
  }
255
260
  ) });
@@ -325,36 +330,25 @@ const DraggableCard = ({
325
330
  ),
326
331
  /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children: label })
327
332
  ] }),
328
- /* @__PURE__ */ jsxs(Flex, { paddingLeft: 3, onClick: (e) => e.stopPropagation(), children: [
329
- /* @__PURE__ */ jsxs(Modal.Root, { open: isModalOpen, onOpenChange: setIsModalOpen, children: [
330
- /* @__PURE__ */ jsx(Modal.Trigger, { children: /* @__PURE__ */ jsx(
331
- ActionButton,
332
- {
333
- onClick: (e) => {
334
- e.stopPropagation();
333
+ /* @__PURE__ */ jsxs(Flex, { paddingLeft: 3, children: [
334
+ /* @__PURE__ */ jsx(
335
+ ActionButton,
336
+ {
337
+ onClick: (e) => {
338
+ e.stopPropagation();
339
+ setIsModalOpen(true);
340
+ },
341
+ "aria-label": formatMessage(
342
+ {
343
+ id: getTranslation("components.DraggableCard.edit.field"),
344
+ defaultMessage: "Edit {item}"
335
345
  },
336
- "aria-label": formatMessage(
337
- {
338
- id: getTranslation("components.DraggableCard.edit.field"),
339
- defaultMessage: "Edit {item}"
340
- },
341
- { item: label }
342
- ),
343
- type: "button",
344
- children: /* @__PURE__ */ jsx(Pencil, { width: "1.2rem", height: "1.2rem" })
345
- }
346
- ) }),
347
- /* @__PURE__ */ jsx(
348
- EditFieldForm,
349
- {
350
- attribute,
351
- name: `layout.${index}`,
352
- onClose: () => {
353
- setIsModalOpen(false);
354
- }
355
- }
356
- )
357
- ] }),
346
+ { item: label }
347
+ ),
348
+ type: "button",
349
+ children: /* @__PURE__ */ jsx(Pencil, { width: "1.2rem", height: "1.2rem" })
350
+ }
351
+ ),
358
352
  /* @__PURE__ */ jsx(
359
353
  ActionButton,
360
354
  {
@@ -374,6 +368,14 @@ const DraggableCard = ({
374
368
  ] })
375
369
  ]
376
370
  }
371
+ ),
372
+ isModalOpen && /* @__PURE__ */ jsx(
373
+ EditFieldForm,
374
+ {
375
+ attribute,
376
+ name: `layout.${index}`,
377
+ onClose: () => setIsModalOpen(false)
378
+ }
377
379
  )
378
380
  ] });
379
381
  };
@@ -617,4 +619,4 @@ export {
617
619
  ListConfiguration,
618
620
  ProtectedListConfiguration
619
621
  };
620
- //# sourceMappingURL=ListConfigurationPage-DozVMKcR.mjs.map
622
+ //# sourceMappingURL=ListConfigurationPage-TqrmwjPN.mjs.map