@strapi/content-manager 0.0.0-next.39bf1ab0d2e327b0a192d2f5adcb4182de865411 → 0.0.0-next.3a1d87a9c3b1d4d89f741c6ecd7f501230fd8d76

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 (130) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-DYq8aqos.js → ComponentConfigurationPage-DMxUlNOo.js} +3 -3
  2. package/dist/_chunks/{ComponentConfigurationPage-DYq8aqos.js.map → ComponentConfigurationPage-DMxUlNOo.js.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-CzVt9QCC.mjs → ComponentConfigurationPage-baEkO-OV.mjs} +3 -3
  4. package/dist/_chunks/{ComponentConfigurationPage-CzVt9QCC.mjs.map → ComponentConfigurationPage-baEkO-OV.mjs.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-C9IATpr0.js → EditConfigurationPage-CXxV7mKn.js} +3 -3
  6. package/dist/_chunks/{EditConfigurationPage-C9IATpr0.js.map → EditConfigurationPage-CXxV7mKn.js.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-CLDwrUv5.mjs → EditConfigurationPage-YR8-4VCS.mjs} +3 -3
  8. package/dist/_chunks/{EditConfigurationPage-CLDwrUv5.mjs.map → EditConfigurationPage-YR8-4VCS.mjs.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-Ch-uBvbv.js → EditViewPage-BfR6jAR6.js} +13 -76
  10. package/dist/_chunks/EditViewPage-BfR6jAR6.js.map +1 -0
  11. package/dist/_chunks/{EditViewPage-DtKM7Jgw.mjs → EditViewPage-DFF7c27p.mjs} +11 -74
  12. package/dist/_chunks/EditViewPage-DFF7c27p.mjs.map +1 -0
  13. package/dist/_chunks/{Form-C3kjKrPw.js → Form-CjcMRP5A.js} +2 -2
  14. package/dist/_chunks/{Form-C3kjKrPw.js.map → Form-CjcMRP5A.js.map} +1 -1
  15. package/dist/_chunks/{Form-BB5i9Pxl.mjs → Form-MSOSfGGN.mjs} +2 -2
  16. package/dist/_chunks/{Form-BB5i9Pxl.mjs.map → Form-MSOSfGGN.mjs.map} +1 -1
  17. package/dist/_chunks/{History-AwrK0-SA.js → History-BgZ7gVuF.js} +43 -19
  18. package/dist/_chunks/History-BgZ7gVuF.js.map +1 -0
  19. package/dist/_chunks/{History-Cw2Q7OQL.mjs → History-WOQNVho-.mjs} +32 -8
  20. package/dist/_chunks/History-WOQNVho-.mjs.map +1 -0
  21. package/dist/_chunks/{Field-Bn1jgMeF.mjs → Input-BkKwZ6Qt.mjs} +1215 -1193
  22. package/dist/_chunks/Input-BkKwZ6Qt.mjs.map +1 -0
  23. package/dist/_chunks/{Field-B9ADaInZ.js → Input-BwOibhc3.js} +1297 -1274
  24. package/dist/_chunks/Input-BwOibhc3.js.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-B47JIu1e.mjs → ListConfigurationPage-BeXfr6uW.mjs} +2 -2
  26. package/dist/_chunks/{ListConfigurationPage-B47JIu1e.mjs.map → ListConfigurationPage-BeXfr6uW.mjs.map} +1 -1
  27. package/dist/_chunks/{ListConfigurationPage-CNTJ0DBm.js → ListConfigurationPage-DnJ3nbwL.js} +2 -2
  28. package/dist/_chunks/{ListConfigurationPage-CNTJ0DBm.js.map → ListConfigurationPage-DnJ3nbwL.js.map} +1 -1
  29. package/dist/_chunks/{ListViewPage-Be_UEBar.js → ListViewPage-CJFDudKl.js} +13 -10
  30. package/dist/_chunks/{ListViewPage-Be_UEBar.js.map → ListViewPage-CJFDudKl.js.map} +1 -1
  31. package/dist/_chunks/{ListViewPage-DuvjX6ra.mjs → ListViewPage-VK2v44Q1.mjs} +8 -5
  32. package/dist/_chunks/{ListViewPage-DuvjX6ra.mjs.map → ListViewPage-VK2v44Q1.mjs.map} +1 -1
  33. package/dist/_chunks/{NoContentTypePage-C6M-Q0Tv.mjs → NoContentTypePage-T8ttty6K.mjs} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-C6M-Q0Tv.mjs.map → NoContentTypePage-T8ttty6K.mjs.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-B1J0KUCO.js → NoContentTypePage-en2PwWgI.js} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-B1J0KUCO.js.map → NoContentTypePage-en2PwWgI.js.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-CN34TlEE.js → NoPermissionsPage-CcjILry3.js} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-CN34TlEE.js.map → NoPermissionsPage-CcjILry3.js.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-CAi3zCAD.mjs → NoPermissionsPage-CokBHhhy.mjs} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-CAi3zCAD.mjs.map → NoPermissionsPage-CokBHhhy.mjs.map} +1 -1
  41. package/dist/_chunks/{Preview-BrBRcL10.mjs → Preview-BF81YhRj.mjs} +10 -16
  42. package/dist/_chunks/Preview-BF81YhRj.mjs.map +1 -0
  43. package/dist/_chunks/{Preview-DOqm5jcJ.js → Preview-DgzAuzWQ.js} +10 -16
  44. package/dist/_chunks/Preview-DgzAuzWQ.js.map +1 -0
  45. package/dist/_chunks/{Relations-xtKZHtTN.js → Relations-1O-JcM4t.js} +3 -3
  46. package/dist/_chunks/{Relations-xtKZHtTN.js.map → Relations-1O-JcM4t.js.map} +1 -1
  47. package/dist/_chunks/{Relations-_K-HYOiM.mjs → Relations-BncdhGCd.mjs} +3 -3
  48. package/dist/_chunks/{Relations-_K-HYOiM.mjs.map → Relations-BncdhGCd.mjs.map} +1 -1
  49. package/dist/_chunks/{en-Dtk_ot79.mjs → en-BZaUty0m.mjs} +8 -2
  50. package/dist/_chunks/{en-Dtk_ot79.mjs.map → en-BZaUty0m.mjs.map} +1 -1
  51. package/dist/_chunks/{en-BK8Xyl5I.js → en-CzCnBk4S.js} +8 -2
  52. package/dist/_chunks/{en-BK8Xyl5I.js.map → en-CzCnBk4S.js.map} +1 -1
  53. package/dist/_chunks/{index-tETMKK2G.mjs → index-DiluOUp6.mjs} +214 -52
  54. package/dist/_chunks/index-DiluOUp6.mjs.map +1 -0
  55. package/dist/_chunks/{index-BlX-OdHL.js → index-EXJvmn4t.js} +197 -35
  56. package/dist/_chunks/index-EXJvmn4t.js.map +1 -0
  57. package/dist/_chunks/{layout-D8Sz3KxF.js → layout-4TbKVax8.js} +3 -3
  58. package/dist/_chunks/{layout-D8Sz3KxF.js.map → layout-4TbKVax8.js.map} +1 -1
  59. package/dist/_chunks/{layout-BaQBaz56.mjs → layout-mSwsYzxv.mjs} +3 -3
  60. package/dist/_chunks/{layout-BaQBaz56.mjs.map → layout-mSwsYzxv.mjs.map} +1 -1
  61. package/dist/_chunks/{relations-CsfmCqOU.mjs → relations--YOvQBqv.mjs} +2 -2
  62. package/dist/_chunks/{relations-CsfmCqOU.mjs.map → relations--YOvQBqv.mjs.map} +1 -1
  63. package/dist/_chunks/{relations-CAbbX8Sa.js → relations-Ai6Izh7h.js} +2 -2
  64. package/dist/_chunks/{relations-CAbbX8Sa.js.map → relations-Ai6Izh7h.js.map} +1 -1
  65. package/dist/_chunks/{useDebounce-DmuSJIF3.mjs → usePrev-CZGy2Vjf.mjs} +11 -11
  66. package/dist/_chunks/usePrev-CZGy2Vjf.mjs.map +1 -0
  67. package/dist/_chunks/{useDebounce-CtcjDB3L.js → usePrev-D5J_2fEu.js} +8 -8
  68. package/dist/_chunks/usePrev-D5J_2fEu.js.map +1 -0
  69. package/dist/admin/index.js +2 -1
  70. package/dist/admin/index.js.map +1 -1
  71. package/dist/admin/index.mjs +6 -5
  72. package/dist/admin/src/exports.d.ts +1 -0
  73. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  74. package/dist/admin/src/hooks/useDocument.d.ts +19 -2
  75. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +1 -1
  76. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
  77. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
  78. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
  79. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +4 -1
  80. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +4 -1
  81. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +27 -0
  82. package/dist/admin/src/pages/EditView/utils/data.d.ts +1 -0
  83. package/dist/admin/src/preview/pages/Preview.d.ts +1 -1
  84. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  85. package/dist/admin/src/services/api.d.ts +1 -1
  86. package/dist/admin/src/services/components.d.ts +2 -2
  87. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  88. package/dist/admin/src/services/documents.d.ts +16 -16
  89. package/dist/admin/src/services/init.d.ts +1 -1
  90. package/dist/admin/src/services/relations.d.ts +2 -2
  91. package/dist/admin/src/services/uid.d.ts +3 -3
  92. package/dist/server/index.js +156 -142
  93. package/dist/server/index.js.map +1 -1
  94. package/dist/server/index.mjs +157 -143
  95. package/dist/server/index.mjs.map +1 -1
  96. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  97. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  98. package/dist/server/src/history/controllers/history-version.d.ts +1 -1
  99. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  100. package/dist/server/src/history/services/history.d.ts +3 -3
  101. package/dist/server/src/history/services/history.d.ts.map +1 -1
  102. package/dist/server/src/history/services/utils.d.ts +6 -10
  103. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  104. package/dist/server/src/index.d.ts +3 -2
  105. package/dist/server/src/index.d.ts.map +1 -1
  106. package/dist/server/src/preview/index.d.ts.map +1 -1
  107. package/dist/server/src/services/document-metadata.d.ts +4 -2
  108. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  109. package/dist/server/src/services/index.d.ts +3 -2
  110. package/dist/server/src/services/index.d.ts.map +1 -1
  111. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  112. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  113. package/dist/server/src/services/utils/populate.d.ts +2 -2
  114. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  115. package/package.json +8 -7
  116. package/dist/_chunks/EditViewPage-Ch-uBvbv.js.map +0 -1
  117. package/dist/_chunks/EditViewPage-DtKM7Jgw.mjs.map +0 -1
  118. package/dist/_chunks/Field-B9ADaInZ.js.map +0 -1
  119. package/dist/_chunks/Field-Bn1jgMeF.mjs.map +0 -1
  120. package/dist/_chunks/History-AwrK0-SA.js.map +0 -1
  121. package/dist/_chunks/History-Cw2Q7OQL.mjs.map +0 -1
  122. package/dist/_chunks/Preview-BrBRcL10.mjs.map +0 -1
  123. package/dist/_chunks/Preview-DOqm5jcJ.js.map +0 -1
  124. package/dist/_chunks/index-BlX-OdHL.js.map +0 -1
  125. package/dist/_chunks/index-tETMKK2G.mjs.map +0 -1
  126. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +0 -1
  127. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +0 -1
  128. package/dist/admin/src/preview/constants.d.ts +0 -1
  129. package/dist/server/src/preview/constants.d.ts +0 -2
  130. package/dist/server/src/preview/constants.d.ts.map +0 -1
@@ -3,23 +3,73 @@ const jsxRuntime = require("react/jsx-runtime");
3
3
  const React = require("react");
4
4
  const strapiAdmin = require("@strapi/admin/strapi-admin");
5
5
  const designSystem = require("@strapi/design-system");
6
- const pipe$1 = require("lodash/fp/pipe");
7
- const reactIntl = require("react-intl");
8
- const index = require("./index-BlX-OdHL.js");
9
- const fractionalIndexing = require("fractional-indexing");
10
- const Relations = require("./Relations-xtKZHtTN.js");
11
6
  const Icons = require("@strapi/icons");
7
+ const reactIntl = require("react-intl");
8
+ const index = require("./index-EXJvmn4t.js");
12
9
  const styledComponents = require("styled-components");
13
- const ComponentIcon = require("./ComponentIcon-CRbtQEUV.js");
14
- const reactDndHtml5Backend = require("react-dnd-html5-backend");
15
- const useDragAndDrop = require("./useDragAndDrop-BMtgCYzL.js");
16
- const objects = require("./objects-BcXOv6_9.js");
17
10
  const slate = require("slate");
18
11
  const slateHistory = require("slate-history");
19
12
  const slateReact = require("slate-react");
20
- const useDebounce = require("./useDebounce-CtcjDB3L.js");
13
+ const Prism = require("prismjs");
14
+ require("prismjs/themes/prism-solarizedlight.css");
15
+ require("prismjs/components/prism-asmatmel");
16
+ require("prismjs/components/prism-bash");
17
+ require("prismjs/components/prism-basic");
18
+ require("prismjs/components/prism-c");
19
+ require("prismjs/components/prism-clojure");
20
+ require("prismjs/components/prism-cobol");
21
+ require("prismjs/components/prism-cpp");
22
+ require("prismjs/components/prism-csharp");
23
+ require("prismjs/components/prism-dart");
24
+ require("prismjs/components/prism-docker");
25
+ require("prismjs/components/prism-elixir");
26
+ require("prismjs/components/prism-erlang");
27
+ require("prismjs/components/prism-fortran");
28
+ require("prismjs/components/prism-fsharp");
29
+ require("prismjs/components/prism-go");
30
+ require("prismjs/components/prism-graphql");
31
+ require("prismjs/components/prism-groovy");
32
+ require("prismjs/components/prism-haskell");
33
+ require("prismjs/components/prism-haxe");
34
+ require("prismjs/components/prism-ini");
35
+ require("prismjs/components/prism-java");
36
+ require("prismjs/components/prism-javascript");
37
+ require("prismjs/components/prism-jsx");
38
+ require("prismjs/components/prism-json");
39
+ require("prismjs/components/prism-julia");
40
+ require("prismjs/components/prism-kotlin");
41
+ require("prismjs/components/prism-latex");
42
+ require("prismjs/components/prism-lua");
43
+ require("prismjs/components/prism-markdown");
44
+ require("prismjs/components/prism-matlab");
45
+ require("prismjs/components/prism-makefile");
46
+ require("prismjs/components/prism-objectivec");
47
+ require("prismjs/components/prism-perl");
48
+ require("prismjs/components/prism-php");
49
+ require("prismjs/components/prism-powershell");
50
+ require("prismjs/components/prism-python");
51
+ require("prismjs/components/prism-r");
52
+ require("prismjs/components/prism-ruby");
53
+ require("prismjs/components/prism-rust");
54
+ require("prismjs/components/prism-sas");
55
+ require("prismjs/components/prism-scala");
56
+ require("prismjs/components/prism-scheme");
57
+ require("prismjs/components/prism-sql");
58
+ require("prismjs/components/prism-stata");
59
+ require("prismjs/components/prism-swift");
60
+ require("prismjs/components/prism-typescript");
61
+ require("prismjs/components/prism-tsx");
62
+ require("prismjs/components/prism-vbnet");
63
+ require("prismjs/components/prism-yaml");
64
+ const usePrev = require("./usePrev-D5J_2fEu.js");
65
+ const useDragAndDrop = require("./useDragAndDrop-BMtgCYzL.js");
21
66
  const Toolbar = require("@radix-ui/react-toolbar");
67
+ const reactDndHtml5Backend = require("react-dnd-html5-backend");
22
68
  const reactRouterDom = require("react-router-dom");
69
+ const objects = require("./objects-BcXOv6_9.js");
70
+ const Relations = require("./Relations-1O-JcM4t.js");
71
+ const pipe$1 = require("lodash/fp/pipe");
72
+ const ComponentIcon = require("./ComponentIcon-CRbtQEUV.js");
23
73
  const CodeMirror = require("codemirror5");
24
74
  const sanitizeHtml = require("sanitize-html");
25
75
  const highlight_js = require("highlight.js");
@@ -54,8 +104,9 @@ function _interopNamespace(e) {
54
104
  return Object.freeze(n);
55
105
  }
56
106
  const React__namespace = /* @__PURE__ */ _interopNamespace(React);
57
- const pipe__default = /* @__PURE__ */ _interopDefault(pipe$1);
107
+ const Prism__namespace = /* @__PURE__ */ _interopNamespace(Prism);
58
108
  const Toolbar__namespace = /* @__PURE__ */ _interopNamespace(Toolbar);
109
+ const pipe__default = /* @__PURE__ */ _interopDefault(pipe$1);
59
110
  const CodeMirror__default = /* @__PURE__ */ _interopDefault(CodeMirror);
60
111
  const sanitizeHtml__default = /* @__PURE__ */ _interopDefault(sanitizeHtml);
61
112
  const Markdown__default = /* @__PURE__ */ _interopDefault(Markdown);
@@ -68,93 +119,6 @@ const ins__default = /* @__PURE__ */ _interopDefault(ins);
68
119
  const mark__default = /* @__PURE__ */ _interopDefault(mark);
69
120
  const sub__default = /* @__PURE__ */ _interopDefault(sub);
70
121
  const sup__default = /* @__PURE__ */ _interopDefault(sup);
71
- const BLOCK_LIST_ATTRIBUTE_KEYS = ["__component", "__temp_key__"];
72
- const traverseData = (predicate, transform) => (schema, components = {}) => (data = {}) => {
73
- const traverse = (datum, attributes) => {
74
- return Object.entries(datum).reduce((acc, [key, value]) => {
75
- const attribute = attributes[key];
76
- if (BLOCK_LIST_ATTRIBUTE_KEYS.includes(key) || value === null || value === void 0) {
77
- acc[key] = value;
78
- return acc;
79
- }
80
- if (attribute.type === "component") {
81
- if (attribute.repeatable) {
82
- const componentValue = predicate(attribute, value) ? transform(value, attribute) : value;
83
- acc[key] = componentValue.map(
84
- (componentData) => traverse(componentData, components[attribute.component]?.attributes ?? {})
85
- );
86
- } else {
87
- const componentValue = predicate(attribute, value) ? transform(value, attribute) : value;
88
- acc[key] = traverse(componentValue, components[attribute.component]?.attributes ?? {});
89
- }
90
- } else if (attribute.type === "dynamiczone") {
91
- const dynamicZoneValue = predicate(attribute, value) ? transform(value, attribute) : value;
92
- acc[key] = dynamicZoneValue.map(
93
- (componentData) => traverse(componentData, components[componentData.__component]?.attributes ?? {})
94
- );
95
- } else if (predicate(attribute, value)) {
96
- acc[key] = transform(value, attribute);
97
- } else {
98
- acc[key] = value;
99
- }
100
- return acc;
101
- }, {});
102
- };
103
- return traverse(data, schema.attributes);
104
- };
105
- const removeProhibitedFields = (prohibitedFields) => traverseData(
106
- (attribute) => prohibitedFields.includes(attribute.type),
107
- () => ""
108
- );
109
- const prepareRelations = traverseData(
110
- (attribute) => attribute.type === "relation",
111
- () => ({
112
- connect: [],
113
- disconnect: []
114
- })
115
- );
116
- const prepareTempKeys = traverseData(
117
- (attribute) => attribute.type === "component" && attribute.repeatable || attribute.type === "dynamiczone",
118
- (data) => {
119
- if (Array.isArray(data) && data.length > 0) {
120
- const keys = fractionalIndexing.generateNKeysBetween(void 0, void 0, data.length);
121
- return data.map((datum, index2) => ({
122
- ...datum,
123
- __temp_key__: keys[index2]
124
- }));
125
- }
126
- return data;
127
- }
128
- );
129
- const removeFieldsThatDontExistOnSchema = (schema) => (data) => {
130
- const schemaKeys = Object.keys(schema.attributes);
131
- const dataKeys = Object.keys(data);
132
- const keysToRemove = dataKeys.filter((key) => !schemaKeys.includes(key));
133
- const revisedData = [...keysToRemove, ...index.DOCUMENT_META_FIELDS].reduce((acc, key) => {
134
- delete acc[key];
135
- return acc;
136
- }, structuredClone(data));
137
- return revisedData;
138
- };
139
- const removeNullValues = (data) => {
140
- return Object.entries(data).reduce((acc, [key, value]) => {
141
- if (value === null) {
142
- return acc;
143
- }
144
- acc[key] = value;
145
- return acc;
146
- }, {});
147
- };
148
- const transformDocument = (schema, components = {}) => (document2) => {
149
- const transformations = pipe__default.default(
150
- removeFieldsThatDontExistOnSchema(schema),
151
- removeProhibitedFields(["password"])(schema, components),
152
- removeNullValues,
153
- prepareRelations(schema, components),
154
- prepareTempKeys(schema, components)
155
- );
156
- return transformations(document2);
157
- };
158
122
  const componentStore = /* @__PURE__ */ new Map();
159
123
  const useLazyComponents = (componentUids = []) => {
160
124
  const [lazyComponentStore, setLazyComponentStore] = React.useState(Object.fromEntries(componentStore));
@@ -196,7 +160,8 @@ const useLazyComponents = (componentUids = []) => {
196
160
  const codeLanguages = [
197
161
  {
198
162
  value: "asm",
199
- label: "Assembly"
163
+ label: "Assembly",
164
+ decorate: "asmatmel"
200
165
  },
201
166
  {
202
167
  value: "bash",
@@ -232,7 +197,8 @@ const codeLanguages = [
232
197
  },
233
198
  {
234
199
  value: "dockerfile",
235
- label: "Dockerfile"
200
+ label: "Dockerfile",
201
+ decorate: "docker"
236
202
  },
237
203
  {
238
204
  value: "elixir",
@@ -388,7 +354,8 @@ const codeLanguages = [
388
354
  },
389
355
  {
390
356
  value: "typescript",
391
- label: "TypeScript"
357
+ label: "TypeScript",
358
+ decorate: "ts"
392
359
  },
393
360
  {
394
361
  value: "tsx",
@@ -404,7 +371,8 @@ const codeLanguages = [
404
371
  },
405
372
  {
406
373
  value: "yaml",
407
- label: "YAML"
374
+ label: "YAML",
375
+ decorate: "yml"
408
376
  }
409
377
  ];
410
378
  const baseHandleConvert = (editor, attributesToSet) => {
@@ -470,6 +438,29 @@ const pressEnterTwiceToExit = (editor) => {
470
438
  });
471
439
  }
472
440
  };
441
+ const decorateCode = ([node, path]) => {
442
+ const ranges = [];
443
+ if (!slate.Element.isElement(node) || node.type !== "code") return ranges;
444
+ const text = slate.Node.string(node);
445
+ const language = codeLanguages.find((lang) => lang.value === node.language);
446
+ const decorateKey = language?.decorate ?? language?.value;
447
+ const selectedLanguage = Prism__namespace.languages[decorateKey || "plaintext"];
448
+ const tokens = Prism__namespace.tokenize(text, selectedLanguage);
449
+ let start = 0;
450
+ for (const token of tokens) {
451
+ const length = token.length;
452
+ const end = start + length;
453
+ if (typeof token !== "string") {
454
+ ranges.push({
455
+ anchor: { path, offset: start },
456
+ focus: { path, offset: end },
457
+ className: `token ${token.type}`
458
+ });
459
+ }
460
+ start = end;
461
+ }
462
+ return ranges;
463
+ };
473
464
  const CodeBlock = styledComponents.styled.pre`
474
465
  border-radius: ${({ theme }) => theme.borderRadius};
475
466
  background-color: ${({ theme }) => theme.colors.neutral100};
@@ -554,8 +545,7 @@ const codeBlocks = {
554
545
  handleEnterKey(editor) {
555
546
  pressEnterTwiceToExit(editor);
556
547
  },
557
- snippets: ["```"],
558
- dragHandleTopMargin: "10px"
548
+ snippets: ["```"]
559
549
  }
560
550
  };
561
551
  const H1 = styledComponents.styled(designSystem.Typography).attrs({ tag: "h1" })`
@@ -764,7 +754,7 @@ const ImageDialog = () => {
764
754
  const nodeImage = {
765
755
  ...expectedImage,
766
756
  alternativeText: expectedImage.alternativeText || expectedImage.name,
767
- url: useDebounce.prefixFileUrlWithBackendUrl(image.url)
757
+ url: usePrev.prefixFileUrlWithBackendUrl(image.url)
768
758
  };
769
759
  return nodeImage;
770
760
  });
@@ -1334,13 +1324,13 @@ const quoteBlocks = {
1334
1324
  handleEnterKey(editor) {
1335
1325
  pressEnterTwiceToExit(editor);
1336
1326
  },
1337
- snippets: [">"],
1338
- dragHandleTopMargin: "6px"
1327
+ snippets: [">"]
1339
1328
  }
1340
1329
  };
1341
1330
  const ToolbarWrapper = styledComponents.styled(designSystem.Flex)`
1342
1331
  &[aria-disabled='true'] {
1343
1332
  cursor: not-allowed;
1333
+ background: ${({ theme }) => theme.colors.neutral150};
1344
1334
  }
1345
1335
  `;
1346
1336
  const Separator = styledComponents.styled(Toolbar__namespace.Separator)`
@@ -1351,7 +1341,7 @@ const Separator = styledComponents.styled(Toolbar__namespace.Separator)`
1351
1341
  const FlexButton = styledComponents.styled(designSystem.Flex)`
1352
1342
  // Inherit the not-allowed cursor from ToolbarWrapper when disabled
1353
1343
  &[aria-disabled] {
1354
- cursor: inherit;
1344
+ cursor: not-allowed;
1355
1345
  }
1356
1346
 
1357
1347
  &[aria-disabled='false'] {
@@ -1703,7 +1693,7 @@ const BlocksToolbar = () => {
1703
1693
  return false;
1704
1694
  };
1705
1695
  const isButtonDisabled = checkButtonDisabled();
1706
- return /* @__PURE__ */ jsxRuntime.jsx(Toolbar__namespace.Root, { "aria-disabled": disabled, asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarWrapper, { gap: 2, padding: 2, children: [
1696
+ return /* @__PURE__ */ jsxRuntime.jsx(Toolbar__namespace.Root, { "aria-disabled": disabled, asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarWrapper, { gap: 2, padding: 2, width: "100%", children: [
1707
1697
  /* @__PURE__ */ jsxRuntime.jsx(BlocksDropdown, {}),
1708
1698
  /* @__PURE__ */ jsxRuntime.jsx(Separator, {}),
1709
1699
  /* @__PURE__ */ jsxRuntime.jsx(Toolbar__namespace.ToggleGroup, { type: "multiple", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 1, children: [
@@ -1777,30 +1767,32 @@ const DragIconButton = styledComponents.styled(designSystem.IconButton)`
1777
1767
  display: flex;
1778
1768
  align-items: center;
1779
1769
  justify-content: center;
1770
+ border: none;
1780
1771
  border-radius: ${({ theme }) => theme.borderRadius};
1781
- width: ${({ theme }) => theme.spaces[4]};
1782
- height: ${({ theme }) => theme.spaces[6]};
1772
+ padding-left: ${({ theme }) => theme.spaces[0]};
1773
+ padding-right: ${({ theme }) => theme.spaces[0]};
1774
+ padding-top: ${({ theme }) => theme.spaces[1]};
1775
+ padding-bottom: ${({ theme }) => theme.spaces[1]};
1783
1776
  visibility: hidden;
1784
1777
  cursor: grab;
1785
1778
  opacity: inherit;
1786
1779
  margin-top: ${(props) => props.$dragHandleTopMargin ?? 0};
1787
1780
 
1788
1781
  &:hover {
1789
- background: ${({ theme }) => theme.colors.neutral200};
1782
+ background: ${({ theme }) => theme.colors.neutral100};
1790
1783
  }
1791
1784
  &:active {
1792
1785
  cursor: grabbing;
1786
+ background: ${({ theme }) => theme.colors.neutral150};
1793
1787
  }
1794
1788
  &[aria-disabled='true'] {
1795
- cursor: not-allowed;
1796
- background: transparent;
1789
+ visibility: hidden;
1797
1790
  }
1798
1791
  svg {
1799
- height: auto;
1800
1792
  min-width: ${({ theme }) => theme.spaces[3]};
1801
1793
 
1802
1794
  path {
1803
- fill: ${({ theme }) => theme.colors.neutral700};
1795
+ fill: ${({ theme }) => theme.colors.neutral500};
1804
1796
  }
1805
1797
  }
1806
1798
  `;
@@ -1951,7 +1943,7 @@ const baseRenderLeaf = (props, modifiers2) => {
1951
1943
  }
1952
1944
  return currentChildren;
1953
1945
  }, props.children);
1954
- return /* @__PURE__ */ jsxRuntime.jsx("span", { ...props.attributes, children: wrappedChildren });
1946
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { ...props.attributes, className: props.leaf.className, children: wrappedChildren });
1955
1947
  };
1956
1948
  const baseRenderElement = ({
1957
1949
  props,
@@ -2153,7 +2145,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
2153
2145
  background: "neutral0",
2154
2146
  color: "neutral800",
2155
2147
  lineHeight: 6,
2156
- paddingRight: 4,
2148
+ paddingRight: 7,
2157
2149
  paddingTop: 6,
2158
2150
  paddingBottom: 3,
2159
2151
  children: [
@@ -2164,6 +2156,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
2164
2156
  readOnly: disabled,
2165
2157
  placeholder,
2166
2158
  isExpandedMode,
2159
+ decorate: decorateCode,
2167
2160
  renderElement,
2168
2161
  renderLeaf,
2169
2162
  onKeyDown: handleKeyDown,
@@ -2486,6 +2479,7 @@ const ExpandIconButton = styledComponents.styled(designSystem.IconButton)`
2486
2479
  position: absolute;
2487
2480
  bottom: 1.2rem;
2488
2481
  right: 1.2rem;
2482
+ box-shadow: ${({ theme }) => theme.shadows.filterShadow};
2489
2483
  `;
2490
2484
  function useResetKey(value) {
2491
2485
  const slateUpdatesCount = React__namespace.useRef(0);
@@ -2617,26 +2611,6 @@ const BlocksInput = React__namespace.forwardRef(
2617
2611
  }
2618
2612
  );
2619
2613
  const MemoizedBlocksInput = React__namespace.memo(BlocksInput);
2620
- const createDefaultForm = (contentType, components = {}) => {
2621
- const traverseSchema = (attributes) => {
2622
- return Object.entries(attributes).reduce((acc, [key, attribute]) => {
2623
- if ("default" in attribute) {
2624
- acc[key] = attribute.default;
2625
- } else if (attribute.type === "component" && attribute.required) {
2626
- const defaultComponentForm = traverseSchema(components[attribute.component].attributes);
2627
- if (attribute.repeatable) {
2628
- acc[key] = attribute.min ? [...Array(attribute.min).fill(defaultComponentForm)] : [];
2629
- } else {
2630
- acc[key] = defaultComponentForm;
2631
- }
2632
- } else if (attribute.type === "dynamiczone" && attribute.required) {
2633
- acc[key] = [];
2634
- }
2635
- return acc;
2636
- }, {});
2637
- };
2638
- return traverseSchema(contentType.attributes);
2639
- };
2640
2614
  const Initializer = ({ disabled, name: name2, onClick }) => {
2641
2615
  const { formatMessage } = reactIntl.useIntl();
2642
2616
  const field = strapiAdmin.useField(name2);
@@ -2671,624 +2645,619 @@ const Initializer = ({ disabled, name: name2, onClick }) => {
2671
2645
  }
2672
2646
  ) });
2673
2647
  };
2674
- const NonRepeatableComponent = ({
2675
- attribute,
2676
- name: name2,
2648
+ const AddComponentButton = ({
2649
+ hasError,
2650
+ isDisabled,
2651
+ isOpen,
2677
2652
  children,
2678
- layout
2653
+ onClick
2654
+ }) => {
2655
+ return /* @__PURE__ */ jsxRuntime.jsx(
2656
+ StyledButton,
2657
+ {
2658
+ type: "button",
2659
+ onClick,
2660
+ disabled: isDisabled,
2661
+ background: "neutral0",
2662
+ style: { cursor: isDisabled ? "not-allowed" : "pointer" },
2663
+ variant: "tertiary",
2664
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { tag: "span", gap: 2, children: [
2665
+ /* @__PURE__ */ jsxRuntime.jsx(StyledAddIcon, { "aria-hidden": true, $isOpen: isOpen, $hasError: hasError && !isOpen }),
2666
+ /* @__PURE__ */ jsxRuntime.jsx(
2667
+ designSystem.Typography,
2668
+ {
2669
+ variant: "pi",
2670
+ fontWeight: "bold",
2671
+ textColor: hasError && !isOpen ? "danger600" : "neutral600",
2672
+ children
2673
+ }
2674
+ )
2675
+ ] })
2676
+ }
2677
+ );
2678
+ };
2679
+ const StyledAddIcon = styledComponents.styled(Icons.PlusCircle)`
2680
+ height: ${({ theme }) => theme.spaces[6]};
2681
+ width: ${({ theme }) => theme.spaces[6]};
2682
+ transform: ${({ $isOpen }) => $isOpen ? "rotate(45deg)" : "rotate(0deg)"};
2683
+
2684
+ > circle {
2685
+ fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger200 : theme.colors.neutral150};
2686
+ }
2687
+ > path {
2688
+ fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger600 : theme.colors.neutral500};
2689
+ }
2690
+ `;
2691
+ const StyledButton = styledComponents.styled(designSystem.Button)`
2692
+ padding-left: ${({ theme }) => theme.spaces[3]};
2693
+ border-radius: 26px;
2694
+ box-shadow: ${({ theme }) => theme.shadows.filterShadow};
2695
+ height: 5rem;
2696
+ `;
2697
+ const ComponentCategory = ({
2698
+ category,
2699
+ components = [],
2700
+ variant = "primary",
2701
+ onAddComponent
2679
2702
  }) => {
2680
2703
  const { formatMessage } = reactIntl.useIntl();
2681
- const { value } = strapiAdmin.useField(name2);
2682
- const level = Relations.useComponent("NonRepeatableComponent", (state) => state.level);
2683
- const isNested = level > 0;
2684
- return /* @__PURE__ */ jsxRuntime.jsx(Relations.ComponentProvider, { id: value?.id, uid: attribute.component, level: level + 1, type: "component", children: /* @__PURE__ */ jsxRuntime.jsx(
2704
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: category, children: [
2705
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { variant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: formatMessage({ id: category, defaultMessage: category }) }) }),
2706
+ /* @__PURE__ */ jsxRuntime.jsx(ResponsiveAccordionContent, { children: /* @__PURE__ */ jsxRuntime.jsx(Grid, { paddingTop: 4, paddingBottom: 4, paddingLeft: 3, paddingRight: 3, children: components.map(({ uid, displayName, icon }) => /* @__PURE__ */ jsxRuntime.jsx(
2707
+ ComponentBox,
2708
+ {
2709
+ tag: "button",
2710
+ type: "button",
2711
+ background: "neutral100",
2712
+ justifyContent: "center",
2713
+ onClick: onAddComponent(uid),
2714
+ hasRadius: true,
2715
+ height: "8.4rem",
2716
+ shrink: 0,
2717
+ borderColor: "neutral200",
2718
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 1, alignItems: "center", justifyContent: "center", children: [
2719
+ /* @__PURE__ */ jsxRuntime.jsx(ComponentIcon.ComponentIcon, { color: "currentColor", background: "primary200", icon }),
2720
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", children: displayName })
2721
+ ] })
2722
+ },
2723
+ uid
2724
+ )) }) })
2725
+ ] });
2726
+ };
2727
+ const ResponsiveAccordionContent = styledComponents.styled(designSystem.Accordion.Content)`
2728
+ container-type: inline-size;
2729
+ `;
2730
+ const Grid = styledComponents.styled(designSystem.Box)`
2731
+ display: grid;
2732
+ grid-template-columns: repeat(auto-fill, 100%);
2733
+ grid-gap: ${({ theme }) => theme.spaces[1]};
2734
+
2735
+ @container (min-width: ${() => RESPONSIVE_CONTAINER_BREAKPOINTS.sm}) {
2736
+ grid-template-columns: repeat(auto-fill, 14rem);
2737
+ }
2738
+ `;
2739
+ const ComponentBox = styledComponents.styled(designSystem.Flex)`
2740
+ color: ${({ theme }) => theme.colors.neutral600};
2741
+ cursor: pointer;
2742
+
2743
+ @media (prefers-reduced-motion: no-preference) {
2744
+ transition: color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
2745
+ }
2746
+
2747
+ &:focus,
2748
+ &:hover {
2749
+ border: 1px solid ${({ theme }) => theme.colors.primary200};
2750
+ background: ${({ theme }) => theme.colors.primary100};
2751
+ color: ${({ theme }) => theme.colors.primary600};
2752
+ }
2753
+ `;
2754
+ const ComponentPicker = ({
2755
+ dynamicComponentsByCategory = {},
2756
+ isOpen,
2757
+ onClickAddComponent
2758
+ }) => {
2759
+ const { formatMessage } = reactIntl.useIntl();
2760
+ const handleAddComponentToDz = (componentUid) => () => {
2761
+ onClickAddComponent(componentUid);
2762
+ };
2763
+ if (!isOpen) {
2764
+ return null;
2765
+ }
2766
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2685
2767
  designSystem.Box,
2686
2768
  {
2687
- background: "neutral100",
2688
- paddingLeft: 6,
2689
- paddingRight: 6,
2690
2769
  paddingTop: 6,
2691
2770
  paddingBottom: 6,
2692
- hasRadius: isNested,
2693
- borderColor: isNested ? "neutral200" : void 0,
2694
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((row, index2) => {
2695
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: row.map(({ size, ...field }) => {
2696
- const completeFieldName = `${name2}.${field.name}`;
2697
- const translatedLabel = formatMessage({
2698
- id: `content-manager.components.${attribute.component}.${field.name}`,
2699
- defaultMessage: field.label
2700
- });
2701
- return /* @__PURE__ */ jsxRuntime.jsx(
2702
- designSystem.Grid.Item,
2703
- {
2704
- col: size,
2705
- s: 12,
2706
- xs: 12,
2707
- direction: "column",
2708
- alignItems: "stretch",
2709
- children: children({ ...field, label: translatedLabel, name: completeFieldName })
2710
- },
2711
- completeFieldName
2712
- );
2713
- }) }, index2);
2714
- }) })
2771
+ paddingLeft: 5,
2772
+ paddingRight: 5,
2773
+ background: "neutral0",
2774
+ shadow: "tableShadow",
2775
+ borderColor: "neutral150",
2776
+ hasRadius: true,
2777
+ children: [
2778
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", textColor: "neutral600", children: formatMessage({
2779
+ id: index.getTranslation("components.DynamicZone.ComponentPicker-label"),
2780
+ defaultMessage: "Pick one component"
2781
+ }) }) }),
2782
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 2, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Root, { defaultValue: Object.keys(dynamicComponentsByCategory)[0], children: Object.entries(dynamicComponentsByCategory).map(([category, components], index2) => /* @__PURE__ */ jsxRuntime.jsx(
2783
+ ComponentCategory,
2784
+ {
2785
+ category,
2786
+ components,
2787
+ onAddComponent: handleAddComponentToDz,
2788
+ variant: index2 % 2 === 1 ? "primary" : "secondary"
2789
+ },
2790
+ category
2791
+ )) }) })
2792
+ ]
2715
2793
  }
2716
- ) });
2794
+ );
2717
2795
  };
2718
- const RepeatableComponent = ({
2719
- attribute,
2796
+ const DynamicComponent = ({
2797
+ componentUid,
2720
2798
  disabled,
2799
+ index: index$1,
2721
2800
  name: name2,
2722
- mainField,
2723
- children,
2724
- layout
2801
+ onRemoveComponentClick,
2802
+ onMoveComponent,
2803
+ onGrabItem,
2804
+ onDropItem,
2805
+ onCancel,
2806
+ dynamicComponentsByCategory = {},
2807
+ onAddComponent,
2808
+ children
2725
2809
  }) => {
2726
- const { toggleNotification } = strapiAdmin.useNotification();
2727
2810
  const { formatMessage } = reactIntl.useIntl();
2728
- const { search: searchString } = reactRouterDom.useLocation();
2729
- const search = React__namespace.useMemo(() => new URLSearchParams(searchString), [searchString]);
2730
- const { components } = index.useDoc();
2811
+ const formValues = strapiAdmin.useForm("DynamicComponent", (state) => state.values);
2731
2812
  const {
2732
- value = [],
2733
- error,
2734
- rawError
2735
- } = strapiAdmin.useField(name2);
2736
- const addFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.addFieldRow);
2737
- const moveFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.moveFieldRow);
2738
- const removeFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.removeFieldRow);
2739
- const { max = Infinity } = attribute;
2740
- const [collapseToOpen, setCollapseToOpen] = React__namespace.useState("");
2741
- const [liveText, setLiveText] = React__namespace.useState("");
2742
- React__namespace.useEffect(() => {
2743
- const hasNestedErrors = rawError && Array.isArray(rawError) && rawError.length > 0;
2744
- const hasNestedValue = value && Array.isArray(value) && value.length > 0;
2745
- if (hasNestedErrors && hasNestedValue) {
2746
- const errorOpenItems = rawError.map((_, idx) => {
2747
- return value[idx] ? value[idx].__temp_key__ : null;
2748
- }).filter((value2) => !!value2);
2749
- if (errorOpenItems && errorOpenItems.length > 0) {
2750
- setCollapseToOpen((collapseToOpen2) => {
2751
- if (!errorOpenItems.includes(collapseToOpen2)) {
2752
- return errorOpenItems[0];
2753
- }
2754
- return collapseToOpen2;
2755
- });
2756
- }
2757
- }
2758
- }, [rawError, value]);
2759
- const componentTmpKeyWithFocussedField = React__namespace.useMemo(() => {
2760
- if (search.has("field")) {
2761
- const fieldParam = search.get("field");
2762
- if (!fieldParam) {
2763
- return void 0;
2764
- }
2765
- const [, path] = fieldParam.split(`${name2}.`);
2766
- if (objects.getIn(value, path, void 0) !== void 0) {
2767
- const [subpath] = path.split(".");
2768
- return objects.getIn(value, subpath, void 0)?.__temp_key__;
2769
- }
2770
- }
2771
- return void 0;
2772
- }, [search, name2, value]);
2773
- const prevValue = useDebounce.usePrev(value);
2774
- React__namespace.useEffect(() => {
2775
- if (prevValue && prevValue.length < value.length) {
2776
- setCollapseToOpen(value[value.length - 1].__temp_key__);
2777
- }
2778
- }, [value, prevValue]);
2779
- React__namespace.useEffect(() => {
2780
- if (typeof componentTmpKeyWithFocussedField === "string") {
2781
- setCollapseToOpen(componentTmpKeyWithFocussedField);
2782
- }
2783
- }, [componentTmpKeyWithFocussedField]);
2784
- const toggleCollapses = () => {
2785
- setCollapseToOpen("");
2786
- };
2787
- const handleClick = () => {
2788
- if (value.length < max) {
2789
- const schema = components[attribute.component];
2790
- const form = createDefaultForm(schema, components);
2791
- const data = transformDocument(schema, components)(form);
2792
- addFieldRow(name2, data);
2793
- } else if (value.length >= max) {
2794
- toggleNotification({
2795
- type: "info",
2796
- message: formatMessage({
2797
- id: index.getTranslation("components.notification.info.maximum-requirement")
2798
- })
2799
- });
2800
- }
2801
- };
2802
- const handleMoveComponentField = (newIndex, currentIndex) => {
2803
- setLiveText(
2804
- formatMessage(
2805
- {
2806
- id: index.getTranslation("dnd.reorder"),
2807
- defaultMessage: "{item}, moved. New position in list: {position}."
2808
- },
2809
- {
2810
- item: `${name2}.${currentIndex}`,
2811
- position: getItemPos(newIndex)
2812
- }
2813
- )
2814
- );
2815
- moveFieldRow(name2, currentIndex, newIndex);
2816
- };
2817
- const handleValueChange = (key) => {
2818
- setCollapseToOpen(key);
2819
- };
2820
- const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
2821
- const handleCancel = (index$1) => {
2822
- setLiveText(
2823
- formatMessage(
2824
- {
2825
- id: index.getTranslation("dnd.cancel-item"),
2826
- defaultMessage: "{item}, dropped. Re-order cancelled."
2827
- },
2828
- {
2829
- item: `${name2}.${index$1}`
2830
- }
2831
- )
2832
- );
2833
- };
2834
- const handleGrabItem = (index$1) => {
2835
- setLiveText(
2836
- formatMessage(
2837
- {
2838
- id: index.getTranslation("dnd.grab-item"),
2839
- defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
2840
- },
2841
- {
2842
- item: `${name2}.${index$1}`,
2843
- position: getItemPos(index$1)
2844
- }
2845
- )
2846
- );
2847
- };
2848
- const handleDropItem = (index$1) => {
2849
- setLiveText(
2850
- formatMessage(
2851
- {
2852
- id: index.getTranslation("dnd.drop-item"),
2853
- defaultMessage: `{item}, dropped. Final position in list: {position}.`
2854
- },
2855
- {
2856
- item: `${name2}.${index$1}`,
2857
- position: getItemPos(index$1)
2858
- }
2859
- )
2860
- );
2861
- };
2862
- const ariaDescriptionId = React__namespace.useId();
2863
- const level = Relations.useComponent("RepeatableComponent", (state) => state.level);
2864
- if (value.length === 0) {
2865
- return /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleClick });
2866
- }
2867
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { hasRadius: true, children: [
2868
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
2869
- id: index.getTranslation("dnd.instructions"),
2870
- defaultMessage: `Press spacebar to grab and re-order`
2871
- }) }),
2872
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
2873
- /* @__PURE__ */ jsxRuntime.jsxs(
2874
- AccordionRoot,
2875
- {
2876
- $error: error,
2877
- value: collapseToOpen,
2878
- onValueChange: handleValueChange,
2879
- "aria-describedby": ariaDescriptionId,
2880
- children: [
2881
- value.map(({ __temp_key__: key, id }, index2) => {
2882
- const nameWithIndex = `${name2}.${index2}`;
2883
- return /* @__PURE__ */ jsxRuntime.jsx(
2884
- Relations.ComponentProvider,
2885
- {
2886
- id,
2887
- uid: attribute.component,
2888
- level: level + 1,
2889
- type: "repeatable",
2890
- children: /* @__PURE__ */ jsxRuntime.jsx(
2891
- Component,
2892
- {
2893
- disabled,
2894
- name: nameWithIndex,
2895
- attribute,
2896
- index: index2,
2897
- mainField,
2898
- onMoveItem: handleMoveComponentField,
2899
- onDeleteComponent: () => {
2900
- removeFieldRow(name2, index2);
2901
- toggleCollapses();
2902
- },
2903
- toggleCollapses,
2904
- onCancel: handleCancel,
2905
- onDropItem: handleDropItem,
2906
- onGrabItem: handleGrabItem,
2907
- __temp_key__: key,
2908
- children: layout.map((row, index22) => {
2909
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: row.map(({ size, ...field }) => {
2910
- const completeFieldName = `${nameWithIndex}.${field.name}`;
2911
- const translatedLabel = formatMessage({
2912
- id: `content-manager.components.${attribute.component}.${field.name}`,
2913
- defaultMessage: field.label
2914
- });
2915
- return /* @__PURE__ */ jsxRuntime.jsx(
2916
- designSystem.Grid.Item,
2917
- {
2918
- col: size,
2919
- s: 12,
2920
- xs: 12,
2921
- direction: "column",
2922
- alignItems: "stretch",
2923
- children: children({
2924
- ...field,
2925
- label: translatedLabel,
2926
- name: completeFieldName
2927
- })
2928
- },
2929
- completeFieldName
2930
- );
2931
- }) }, index22);
2932
- })
2933
- }
2934
- )
2935
- },
2936
- key
2937
- );
2938
- }),
2939
- /* @__PURE__ */ jsxRuntime.jsx(TextButtonCustom, { disabled, onClick: handleClick, startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Plus, {}), children: formatMessage({
2940
- id: index.getTranslation("containers.EditView.add.new-entry"),
2941
- defaultMessage: "Add an entry"
2942
- }) })
2943
- ]
2944
- }
2945
- )
2946
- ] });
2947
- };
2948
- const AccordionRoot = styledComponents.styled(designSystem.Accordion.Root)`
2949
- border: 1px solid
2950
- ${({ theme, $error }) => $error ? theme.colors.danger600 : theme.colors.neutral200};
2951
- `;
2952
- const TextButtonCustom = styledComponents.styled(designSystem.TextButton)`
2953
- width: 100%;
2954
- display: flex;
2955
- justify-content: center;
2956
- border-top: 1px solid ${({ theme }) => theme.colors.neutral200};
2957
- padding-inline: ${(props) => props.theme.spaces[6]};
2958
- padding-block: ${(props) => props.theme.spaces[3]};
2959
-
2960
- &:not([disabled]) {
2961
- cursor: pointer;
2962
-
2963
- &:hover {
2964
- background-color: ${(props) => props.theme.colors.primary100};
2965
- }
2966
- }
2967
-
2968
- span {
2969
- font-weight: 600;
2970
- font-size: 1.4rem;
2971
- line-height: 2.4rem;
2972
- }
2973
-
2974
- @media (prefers-reduced-motion: no-preference) {
2975
- transition: background-color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
2976
- }
2977
- `;
2978
- const Component = ({
2979
- disabled,
2980
- index: index$1,
2981
- name: name2,
2982
- mainField = {
2983
- name: "id",
2984
- type: "integer"
2985
- },
2986
- children,
2987
- onDeleteComponent,
2988
- toggleCollapses,
2989
- __temp_key__,
2990
- ...dragProps
2991
- }) => {
2992
- const { formatMessage } = reactIntl.useIntl();
2993
- const displayValue = strapiAdmin.useForm("RepeatableComponent", (state) => {
2994
- return objects.getIn(state.values, [...name2.split("."), mainField.name]);
2995
- });
2996
- const accordionRef = React__namespace.useRef(null);
2997
- const componentKey = name2.split(".").slice(0, -1).join(".");
2813
+ edit: { components }
2814
+ } = index.useDocLayout();
2815
+ const title = React__namespace.useMemo(() => {
2816
+ const { mainField } = components[componentUid]?.settings ?? { mainField: "id" };
2817
+ const mainFieldValue = objects.getIn(formValues, `${name2}.${index$1}.${mainField}`);
2818
+ const displayedValue = mainField === "id" || !mainFieldValue ? "" : String(mainFieldValue).trim();
2819
+ const mainValue = displayedValue.length > 0 ? `- ${displayedValue}` : displayedValue;
2820
+ return mainValue;
2821
+ }, [componentUid, components, formValues, name2, index$1]);
2822
+ const { icon, displayName } = React__namespace.useMemo(() => {
2823
+ const [category] = componentUid.split(".");
2824
+ const { icon: icon2, displayName: displayName2 } = (dynamicComponentsByCategory[category] ?? []).find(
2825
+ (component) => component.uid === componentUid
2826
+ ) ?? { icon: null, displayName: null };
2827
+ return { icon: icon2, displayName: displayName2 };
2828
+ }, [componentUid, dynamicComponentsByCategory]);
2998
2829
  const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop.useDragAndDrop(!disabled, {
2999
- type: `${useDragAndDrop.ItemTypes.COMPONENT}_${componentKey}`,
2830
+ type: `${useDragAndDrop.ItemTypes.DYNAMIC_ZONE}_${name2}`,
3000
2831
  index: index$1,
3001
2832
  item: {
3002
2833
  index: index$1,
3003
- displayedValue: displayValue
3004
- },
3005
- onStart() {
3006
- toggleCollapses();
2834
+ displayedValue: `${displayName} ${title}`,
2835
+ icon
3007
2836
  },
3008
- ...dragProps
2837
+ onMoveItem: onMoveComponent,
2838
+ onDropItem,
2839
+ onGrabItem,
2840
+ onCancel
3009
2841
  });
3010
2842
  React__namespace.useEffect(() => {
3011
2843
  dragPreviewRef(reactDndHtml5Backend.getEmptyImage(), { captureDraggingState: false });
3012
2844
  }, [dragPreviewRef, index$1]);
3013
- const composedAccordionRefs = designSystem.useComposedRefs(accordionRef, dragRef);
3014
- const composedBoxRefs = designSystem.useComposedRefs(
3015
- boxRef,
3016
- dropRef
3017
- );
3018
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: isDragging ? /* @__PURE__ */ jsxRuntime.jsx(Preview$1, {}) : /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { ref: composedBoxRefs, value: __temp_key__, children: [
3019
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
3020
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: displayValue }),
3021
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Actions, { children: [
3022
- /* @__PURE__ */ jsxRuntime.jsx(
3023
- designSystem.IconButton,
2845
+ const accordionValue = React__namespace.useId();
2846
+ const { value = [], rawError } = strapiAdmin.useField(`${name2}.${index$1}`);
2847
+ const [collapseToOpen, setCollapseToOpen] = React__namespace.useState("");
2848
+ React__namespace.useEffect(() => {
2849
+ if (rawError && value) {
2850
+ setCollapseToOpen(accordionValue);
2851
+ }
2852
+ }, [rawError, value, accordionValue]);
2853
+ const composedBoxRefs = designSystem.useComposedRefs(boxRef, dropRef);
2854
+ const accordionActions = disabled ? null : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2855
+ /* @__PURE__ */ jsxRuntime.jsx(
2856
+ designSystem.IconButton,
2857
+ {
2858
+ variant: "ghost",
2859
+ label: formatMessage(
3024
2860
  {
3025
- variant: "ghost",
3026
- onClick: onDeleteComponent,
3027
- label: formatMessage({
3028
- id: index.getTranslation("containers.Edit.delete"),
3029
- defaultMessage: "Delete"
3030
- }),
3031
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
3032
- }
2861
+ id: index.getTranslation("components.DynamicZone.delete-label"),
2862
+ defaultMessage: "Delete {name}"
2863
+ },
2864
+ { name: title }
3033
2865
  ),
3034
- /* @__PURE__ */ jsxRuntime.jsx(
3035
- designSystem.IconButton,
3036
- {
3037
- ref: composedAccordionRefs,
3038
- variant: "ghost",
3039
- onClick: (e) => e.stopPropagation(),
3040
- "data-handler-id": handlerId,
3041
- label: formatMessage({
3042
- id: index.getTranslation("components.DragHandle-label"),
3043
- defaultMessage: "Drag"
3044
- }),
3045
- onKeyDown: handleKeyDown,
3046
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
3047
- }
3048
- )
3049
- ] })
3050
- ] }),
3051
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(
3052
- designSystem.Flex,
2866
+ onClick: onRemoveComponentClick,
2867
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
2868
+ }
2869
+ ),
2870
+ /* @__PURE__ */ jsxRuntime.jsx(
2871
+ designSystem.IconButton,
3053
2872
  {
3054
- direction: "column",
3055
- alignItems: "stretch",
3056
- background: "neutral100",
3057
- padding: 6,
3058
- gap: 6,
3059
- children
2873
+ variant: "ghost",
2874
+ onClick: (e) => e.stopPropagation(),
2875
+ "data-handler-id": handlerId,
2876
+ ref: dragRef,
2877
+ label: formatMessage({
2878
+ id: index.getTranslation("components.DragHandle-label"),
2879
+ defaultMessage: "Drag"
2880
+ }),
2881
+ onKeyDown: handleKeyDown,
2882
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
3060
2883
  }
3061
- ) })
3062
- ] }) });
3063
- };
3064
- const Preview$1 = () => {
3065
- return /* @__PURE__ */ jsxRuntime.jsx(StyledSpan, { tag: "span", padding: 6, background: "primary100" });
3066
- };
3067
- const StyledSpan = styledComponents.styled(designSystem.Box)`
3068
- display: block;
3069
- outline: 1px dashed ${({ theme }) => theme.colors.primary500};
3070
- outline-offset: -1px;
3071
- `;
3072
- const ComponentInput = ({
3073
- label,
3074
- required,
3075
- name: name2,
3076
- attribute,
3077
- disabled,
3078
- labelAction,
3079
- ...props
3080
- }) => {
3081
- const { formatMessage } = reactIntl.useIntl();
3082
- const field = strapiAdmin.useField(name2);
3083
- const showResetComponent = !attribute.repeatable && field.value && !disabled;
3084
- const { components } = index.useDoc();
3085
- const handleInitialisationClick = () => {
3086
- const schema = components[attribute.component];
3087
- const form = createDefaultForm(schema, components);
3088
- const data = transformDocument(schema, components)(form);
3089
- field.onChange(name2, data);
3090
- };
3091
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error: field.error, required, children: [
3092
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", children: [
3093
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Label, { action: labelAction, children: [
3094
- label,
3095
- attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3096
- " (",
3097
- Array.isArray(field.value) ? field.value.length : 0,
3098
- ")"
3099
- ] })
3100
- ] }),
3101
- showResetComponent && /* @__PURE__ */ jsxRuntime.jsx(
2884
+ ),
2885
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
2886
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Trigger, { size: "S", endIcon: null, paddingLeft: 0, paddingRight: 0, children: /* @__PURE__ */ jsxRuntime.jsx(
3102
2887
  designSystem.IconButton,
3103
2888
  {
2889
+ variant: "ghost",
3104
2890
  label: formatMessage({
3105
- id: index.getTranslation("components.reset-entry"),
3106
- defaultMessage: "Reset Entry"
2891
+ id: index.getTranslation("components.DynamicZone.more-actions"),
2892
+ defaultMessage: "More actions"
3107
2893
  }),
3108
- variant: "ghost",
3109
- onClick: () => {
3110
- field.onChange(name2, null);
3111
- },
3112
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
2894
+ tag: "span",
2895
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.More, { "aria-hidden": true, focusable: false })
3113
2896
  }
3114
- )
3115
- ] }),
3116
- !attribute.repeatable && !field.value && /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleInitialisationClick }),
3117
- !attribute.repeatable && field.value ? /* @__PURE__ */ jsxRuntime.jsx(NonRepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }) : null,
3118
- attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsx(RepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }),
3119
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Error, {})
2897
+ ) }),
2898
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { children: [
2899
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
2900
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
2901
+ id: index.getTranslation("components.DynamicZone.add-item-above"),
2902
+ defaultMessage: "Add component above"
2903
+ }) }),
2904
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
2905
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
2906
+ components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1), children: displayName2 }, componentUid))
2907
+ ] }, category)) })
2908
+ ] }),
2909
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
2910
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
2911
+ id: index.getTranslation("components.DynamicZone.add-item-below"),
2912
+ defaultMessage: "Add component below"
2913
+ }) }),
2914
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
2915
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
2916
+ components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1 + 1), children: displayName2 }, componentUid))
2917
+ ] }, category)) })
2918
+ ] })
2919
+ ] })
2920
+ ] })
2921
+ ] });
2922
+ const accordionTitle = title ? `${displayName} ${title}` : displayName;
2923
+ return /* @__PURE__ */ jsxRuntime.jsxs(ComponentContainer, { tag: "li", width: "100%", children: [
2924
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Rectangle, { background: "neutral200" }) }),
2925
+ /* @__PURE__ */ jsxRuntime.jsx(StyledBox, { ref: composedBoxRefs, hasRadius: true, children: isDragging ? /* @__PURE__ */ jsxRuntime.jsx(Preview$1, {}) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Root, { value: collapseToOpen, onValueChange: setCollapseToOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: accordionValue, children: [
2926
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
2927
+ /* @__PURE__ */ jsxRuntime.jsx(
2928
+ designSystem.Accordion.Trigger,
2929
+ {
2930
+ icon: icon && ComponentIcon.COMPONENT_ICONS[icon] ? ComponentIcon.COMPONENT_ICONS[icon] : ComponentIcon.COMPONENT_ICONS.dashboard,
2931
+ children: accordionTitle
2932
+ }
2933
+ ),
2934
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Actions, { children: accordionActions })
2935
+ ] }),
2936
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(AccordionContentRadius, { background: "neutral0", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 6, paddingRight: 6, paddingTop: 6, paddingBottom: 6, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: components[componentUid]?.layout?.map((row, rowInd) => /* @__PURE__ */ jsxRuntime.jsx(
2937
+ designSystem.Grid.Item,
2938
+ {
2939
+ col: 12,
2940
+ s: 12,
2941
+ xs: 12,
2942
+ direction: "column",
2943
+ alignItems: "stretch",
2944
+ children: /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
2945
+ const fieldName = `${name2}.${index$1}.${field.name}`;
2946
+ const fieldWithTranslatedLabel = {
2947
+ ...field,
2948
+ label: formatMessage({
2949
+ id: `content-manager.components.${componentUid}.${field.name}`,
2950
+ defaultMessage: field.label
2951
+ })
2952
+ };
2953
+ return /* @__PURE__ */ jsxRuntime.jsx(
2954
+ ResponsiveGridItem,
2955
+ {
2956
+ col: size,
2957
+ s: 12,
2958
+ xs: 12,
2959
+ direction: "column",
2960
+ alignItems: "stretch",
2961
+ children: children ? children({ ...fieldWithTranslatedLabel, name: fieldName }) : /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel, name: fieldName })
2962
+ },
2963
+ fieldName
2964
+ );
2965
+ }) })
2966
+ },
2967
+ rowInd
2968
+ )) }) }) }) })
2969
+ ] }) }) })
3120
2970
  ] });
3121
2971
  };
3122
- const MemoizedComponentInput = React__namespace.memo(ComponentInput);
3123
- const AddComponentButton = ({
3124
- hasError,
3125
- isDisabled,
3126
- isOpen,
3127
- children,
3128
- onClick
2972
+ const StyledBox = styledComponents.styled(designSystem.Box)`
2973
+ > div:first-child {
2974
+ box-shadow: ${({ theme }) => theme.shadows.tableShadow};
2975
+ }
2976
+ `;
2977
+ const AccordionContentRadius = styledComponents.styled(designSystem.Box)`
2978
+ border-radius: 0 0 ${({ theme }) => theme.spaces[1]} ${({ theme }) => theme.spaces[1]};
2979
+ `;
2980
+ const Rectangle = styledComponents.styled(designSystem.Box)`
2981
+ width: ${({ theme }) => theme.spaces[2]};
2982
+ height: ${({ theme }) => theme.spaces[4]};
2983
+ `;
2984
+ const Preview$1 = styledComponents.styled.span`
2985
+ display: block;
2986
+ background-color: ${({ theme }) => theme.colors.primary100};
2987
+ outline: 1px dashed ${({ theme }) => theme.colors.primary500};
2988
+ outline-offset: -1px;
2989
+ padding: ${({ theme }) => theme.spaces[6]};
2990
+ `;
2991
+ const ComponentContainer = styledComponents.styled(designSystem.Box)`
2992
+ list-style: none;
2993
+ padding: 0;
2994
+ margin: 0;
2995
+ `;
2996
+ const DynamicZoneLabel = ({
2997
+ hint,
2998
+ label,
2999
+ labelAction,
3000
+ name: name2,
3001
+ numberOfComponents = 0,
3002
+ required
3129
3003
  }) => {
3130
- return /* @__PURE__ */ jsxRuntime.jsx(
3131
- StyledButton,
3004
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
3005
+ designSystem.Box,
3132
3006
  {
3133
- type: "button",
3134
- onClick,
3135
- disabled: isDisabled,
3007
+ paddingTop: 3,
3008
+ paddingBottom: 3,
3009
+ paddingRight: 4,
3010
+ paddingLeft: 4,
3011
+ borderRadius: "26px",
3136
3012
  background: "neutral0",
3137
- style: { cursor: isDisabled ? "not-allowed" : "pointer" },
3138
- variant: "tertiary",
3139
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { tag: "span", gap: 2, children: [
3140
- /* @__PURE__ */ jsxRuntime.jsx(StyledAddIcon, { "aria-hidden": true, $isOpen: isOpen, $hasError: hasError && !isOpen }),
3141
- /* @__PURE__ */ jsxRuntime.jsx(
3142
- AddComponentTitle,
3143
- {
3144
- variant: "pi",
3145
- fontWeight: "bold",
3146
- textColor: hasError && !isOpen ? "danger600" : "neutral500",
3147
- children
3148
- }
3149
- )
3013
+ shadow: "filterShadow",
3014
+ color: "neutral500",
3015
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", justifyContent: "center", children: [
3016
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { maxWidth: "35.6rem", children: [
3017
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", ellipsis: true, children: [
3018
+ label || name2,
3019
+ " "
3020
+ ] }),
3021
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", children: [
3022
+ "(",
3023
+ numberOfComponents,
3024
+ ")"
3025
+ ] }),
3026
+ required && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", children: "*" }),
3027
+ labelAction && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 1, children: labelAction })
3028
+ ] }),
3029
+ hint && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 1, maxWidth: "35.6rem", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", ellipsis: true, children: hint }) })
3150
3030
  ] })
3151
3031
  }
3152
- );
3032
+ ) });
3153
3033
  };
3154
- const StyledAddIcon = styledComponents.styled(Icons.PlusCircle)`
3155
- height: ${({ theme }) => theme.spaces[6]};
3156
- width: ${({ theme }) => theme.spaces[6]};
3157
- transform: ${({ $isOpen }) => $isOpen ? "rotate(45deg)" : "rotate(0deg)"};
3158
-
3159
- > circle {
3160
- fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger200 : theme.colors.neutral150};
3161
- }
3162
- > path {
3163
- fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger600 : theme.colors.neutral600};
3034
+ const [DynamicZoneProvider, useDynamicZone] = strapiAdmin.createContext(
3035
+ "DynamicZone",
3036
+ {
3037
+ isInDynamicZone: false
3164
3038
  }
3165
- `;
3166
- const AddComponentTitle = styledComponents.styled(designSystem.Typography)``;
3167
- const StyledButton = styledComponents.styled(designSystem.Button)`
3168
- border-radius: 26px;
3169
- border-color: ${({ theme }) => theme.colors.neutral150};
3170
- box-shadow: ${({ theme }) => theme.shadows.filterShadow};
3171
- height: 5rem;
3172
-
3173
- &:hover {
3174
- ${AddComponentTitle} {
3175
- color: ${({ theme }) => theme.colors.primary600};
3176
- }
3177
-
3178
- ${StyledAddIcon} {
3179
- > circle {
3180
- fill: ${({ theme }) => theme.colors.primary600};
3181
- }
3182
- > path {
3183
- fill: ${({ theme }) => theme.colors.primary600};
3039
+ );
3040
+ const DynamicZone = ({
3041
+ attribute,
3042
+ disabled: disabledProp,
3043
+ hint,
3044
+ label,
3045
+ labelAction,
3046
+ name: name2,
3047
+ required = false,
3048
+ children
3049
+ }) => {
3050
+ const { max = Infinity, min = -Infinity } = attribute ?? {};
3051
+ const [addComponentIsOpen, setAddComponentIsOpen] = React__namespace.useState(false);
3052
+ const [liveText, setLiveText] = React__namespace.useState("");
3053
+ const { components, isLoading } = index.useDoc();
3054
+ const disabled = disabledProp || isLoading;
3055
+ const { addFieldRow, removeFieldRow, moveFieldRow } = strapiAdmin.useForm(
3056
+ "DynamicZone",
3057
+ ({ addFieldRow: addFieldRow2, removeFieldRow: removeFieldRow2, moveFieldRow: moveFieldRow2 }) => ({
3058
+ addFieldRow: addFieldRow2,
3059
+ removeFieldRow: removeFieldRow2,
3060
+ moveFieldRow: moveFieldRow2
3061
+ })
3062
+ );
3063
+ const { value = [], error } = strapiAdmin.useField(name2);
3064
+ const dynamicComponentsByCategory = React__namespace.useMemo(() => {
3065
+ return attribute.components.reduce((acc, componentUid) => {
3066
+ const { category, info } = components[componentUid] ?? { info: {} };
3067
+ const component = { uid: componentUid, displayName: info.displayName, icon: info.icon };
3068
+ if (!acc[category]) {
3069
+ acc[category] = [];
3184
3070
  }
3071
+ acc[category] = [...acc[category], component];
3072
+ return acc;
3073
+ }, {});
3074
+ }, [attribute.components, components]);
3075
+ const { formatMessage } = reactIntl.useIntl();
3076
+ const { toggleNotification } = strapiAdmin.useNotification();
3077
+ const dynamicDisplayedComponentsLength = value.length;
3078
+ const handleAddComponent = (uid, position) => {
3079
+ setAddComponentIsOpen(false);
3080
+ const schema = components[uid];
3081
+ const form = index.createDefaultForm(schema, components);
3082
+ const transformations = pipe__default.default(index.transformDocument(schema, components), (data2) => ({
3083
+ ...data2,
3084
+ __component: uid
3085
+ }));
3086
+ const data = transformations(form);
3087
+ addFieldRow(name2, data, position);
3088
+ };
3089
+ const handleClickOpenPicker = () => {
3090
+ if (dynamicDisplayedComponentsLength < max) {
3091
+ setAddComponentIsOpen((prev) => !prev);
3092
+ } else {
3093
+ toggleNotification({
3094
+ type: "info",
3095
+ message: formatMessage({
3096
+ id: index.getTranslation("components.notification.info.maximum-requirement")
3097
+ })
3098
+ });
3185
3099
  }
3186
- }
3187
- &:active {
3188
- ${AddComponentTitle} {
3189
- color: ${({ theme }) => theme.colors.primary600};
3100
+ };
3101
+ const handleMoveComponent = (newIndex, currentIndex) => {
3102
+ setLiveText(
3103
+ formatMessage(
3104
+ {
3105
+ id: index.getTranslation("dnd.reorder"),
3106
+ defaultMessage: "{item}, moved. New position in list: {position}."
3107
+ },
3108
+ {
3109
+ item: `${name2}.${currentIndex}`,
3110
+ position: getItemPos(newIndex)
3111
+ }
3112
+ )
3113
+ );
3114
+ moveFieldRow(name2, currentIndex, newIndex);
3115
+ };
3116
+ const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
3117
+ const handleCancel = (index$1) => {
3118
+ setLiveText(
3119
+ formatMessage(
3120
+ {
3121
+ id: index.getTranslation("dnd.cancel-item"),
3122
+ defaultMessage: "{item}, dropped. Re-order cancelled."
3123
+ },
3124
+ {
3125
+ item: `${name2}.${index$1}`
3126
+ }
3127
+ )
3128
+ );
3129
+ };
3130
+ const handleGrabItem = (index$1) => {
3131
+ setLiveText(
3132
+ formatMessage(
3133
+ {
3134
+ id: index.getTranslation("dnd.grab-item"),
3135
+ defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
3136
+ },
3137
+ {
3138
+ item: `${name2}.${index$1}`,
3139
+ position: getItemPos(index$1)
3140
+ }
3141
+ )
3142
+ );
3143
+ };
3144
+ const handleDropItem = (index$1) => {
3145
+ setLiveText(
3146
+ formatMessage(
3147
+ {
3148
+ id: index.getTranslation("dnd.drop-item"),
3149
+ defaultMessage: `{item}, dropped. Final position in list: {position}.`
3150
+ },
3151
+ {
3152
+ item: `${name2}.${index$1}`,
3153
+ position: getItemPos(index$1)
3154
+ }
3155
+ )
3156
+ );
3157
+ };
3158
+ const handleRemoveComponent = (name22, currentIndex) => () => {
3159
+ removeFieldRow(name22, currentIndex);
3160
+ };
3161
+ const hasError = error !== void 0;
3162
+ const renderButtonLabel = () => {
3163
+ if (addComponentIsOpen) {
3164
+ return formatMessage({ id: "app.utils.close-label", defaultMessage: "Close" });
3190
3165
  }
3191
- ${StyledAddIcon} {
3192
- > circle {
3193
- fill: ${({ theme }) => theme.colors.primary600};
3194
- }
3195
- > path {
3196
- fill: ${({ theme }) => theme.colors.neutral100};
3197
- }
3166
+ if (hasError && dynamicDisplayedComponentsLength > max) {
3167
+ return formatMessage(
3168
+ {
3169
+ id: index.getTranslation(`components.DynamicZone.extra-components`),
3170
+ defaultMessage: "There {number, plural, =0 {are # extra components} one {is # extra component} other {are # extra components}}"
3171
+ },
3172
+ {
3173
+ number: dynamicDisplayedComponentsLength - max
3174
+ }
3175
+ );
3198
3176
  }
3199
- }
3200
- `;
3201
- const ComponentCategory = ({
3202
- category,
3203
- components = [],
3204
- variant = "primary",
3205
- onAddComponent
3206
- }) => {
3207
- const { formatMessage } = reactIntl.useIntl();
3208
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: category, children: [
3209
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { variant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: formatMessage({ id: category, defaultMessage: category }) }) }),
3210
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(Grid, { paddingTop: 4, paddingBottom: 4, paddingLeft: 3, paddingRight: 3, children: components.map(({ uid, displayName, icon }) => /* @__PURE__ */ jsxRuntime.jsx(
3211
- ComponentBox,
3177
+ if (hasError && dynamicDisplayedComponentsLength < min) {
3178
+ return formatMessage(
3179
+ {
3180
+ id: index.getTranslation(`components.DynamicZone.missing-components`),
3181
+ defaultMessage: "There {number, plural, =0 {are # missing components} one {is # missing component} other {are # missing components}}"
3182
+ },
3183
+ { number: min - dynamicDisplayedComponentsLength }
3184
+ );
3185
+ }
3186
+ return formatMessage(
3212
3187
  {
3213
- tag: "button",
3214
- type: "button",
3215
- background: "neutral100",
3216
- justifyContent: "center",
3217
- onClick: onAddComponent(uid),
3218
- hasRadius: true,
3219
- height: "8.4rem",
3220
- shrink: 0,
3221
- borderColor: "neutral200",
3222
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 1, alignItems: "center", justifyContent: "center", children: [
3223
- /* @__PURE__ */ jsxRuntime.jsx(ComponentIcon.ComponentIcon, { color: "currentColor", background: "primary200", icon }),
3224
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", children: displayName })
3225
- ] })
3188
+ id: index.getTranslation("components.DynamicZone.add-component"),
3189
+ defaultMessage: "Add a component to {componentName}"
3226
3190
  },
3227
- uid
3228
- )) }) })
3229
- ] });
3230
- };
3231
- const Grid = styledComponents.styled(designSystem.Box)`
3232
- display: grid;
3233
- grid-template-columns: repeat(auto-fit, 14rem);
3234
- grid-gap: ${({ theme }) => theme.spaces[1]};
3235
- `;
3236
- const ComponentBox = styledComponents.styled(designSystem.Flex)`
3237
- color: ${({ theme }) => theme.colors.neutral600};
3238
- cursor: pointer;
3239
-
3240
- @media (prefers-reduced-motion: no-preference) {
3241
- transition: color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
3242
- }
3243
-
3244
- &:focus,
3245
- &:hover {
3246
- border: 1px solid ${({ theme }) => theme.colors.primary200};
3247
- background: ${({ theme }) => theme.colors.primary100};
3248
- color: ${({ theme }) => theme.colors.primary600};
3249
- }
3250
- `;
3251
- const ComponentPicker = ({
3252
- dynamicComponentsByCategory = {},
3253
- isOpen,
3254
- onClickAddComponent
3255
- }) => {
3256
- const { formatMessage } = reactIntl.useIntl();
3257
- const handleAddComponentToDz = (componentUid) => () => {
3258
- onClickAddComponent(componentUid);
3191
+ { componentName: label || name2 }
3192
+ );
3259
3193
  };
3260
- if (!isOpen) {
3261
- return null;
3262
- }
3263
- return /* @__PURE__ */ jsxRuntime.jsxs(
3264
- designSystem.Box,
3265
- {
3266
- paddingTop: 6,
3267
- paddingBottom: 6,
3268
- paddingLeft: 5,
3269
- paddingRight: 5,
3270
- background: "neutral0",
3271
- shadow: "tableShadow",
3272
- borderColor: "neutral150",
3273
- hasRadius: true,
3274
- children: [
3275
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", textColor: "neutral600", children: formatMessage({
3276
- id: index.getTranslation("components.DynamicZone.ComponentPicker-label"),
3277
- defaultMessage: "Pick one component"
3278
- }) }) }),
3279
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 2, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Root, { defaultValue: Object.keys(dynamicComponentsByCategory)[0], children: Object.entries(dynamicComponentsByCategory).map(([category, components], index2) => /* @__PURE__ */ jsxRuntime.jsx(
3280
- ComponentCategory,
3281
- {
3282
- category,
3283
- components,
3284
- onAddComponent: handleAddComponentToDz,
3285
- variant: index2 % 2 === 1 ? "primary" : "secondary"
3286
- },
3287
- category
3288
- )) }) })
3289
- ]
3290
- }
3291
- );
3194
+ const level = Relations.useComponent("DynamicZone", (state) => state.level);
3195
+ const ariaDescriptionId = React__namespace.useId();
3196
+ return /* @__PURE__ */ jsxRuntime.jsx(DynamicZoneProvider, { isInDynamicZone: true, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
3197
+ dynamicDisplayedComponentsLength > 0 && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
3198
+ /* @__PURE__ */ jsxRuntime.jsx(
3199
+ DynamicZoneLabel,
3200
+ {
3201
+ hint,
3202
+ label,
3203
+ labelAction,
3204
+ name: name2,
3205
+ numberOfComponents: dynamicDisplayedComponentsLength,
3206
+ required
3207
+ }
3208
+ ),
3209
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
3210
+ id: index.getTranslation("dnd.instructions"),
3211
+ defaultMessage: `Press spacebar to grab and re-order`
3212
+ }) }),
3213
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
3214
+ /* @__PURE__ */ jsxRuntime.jsx("ol", { "aria-describedby": ariaDescriptionId, children: value.map((field, index2) => /* @__PURE__ */ jsxRuntime.jsx(
3215
+ Relations.ComponentProvider,
3216
+ {
3217
+ level: level + 1,
3218
+ uid: field.__component,
3219
+ id: field.id,
3220
+ type: "dynamiczone",
3221
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3222
+ DynamicComponent,
3223
+ {
3224
+ disabled,
3225
+ name: name2,
3226
+ index: index2,
3227
+ componentUid: field.__component,
3228
+ onMoveComponent: handleMoveComponent,
3229
+ onRemoveComponentClick: handleRemoveComponent(name2, index2),
3230
+ onCancel: handleCancel,
3231
+ onDropItem: handleDropItem,
3232
+ onGrabItem: handleGrabItem,
3233
+ onAddComponent: handleAddComponent,
3234
+ dynamicComponentsByCategory,
3235
+ children
3236
+ }
3237
+ )
3238
+ },
3239
+ field.__temp_key__
3240
+ )) })
3241
+ ] }),
3242
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
3243
+ AddComponentButton,
3244
+ {
3245
+ hasError,
3246
+ isDisabled: disabled,
3247
+ isOpen: addComponentIsOpen,
3248
+ onClick: handleClickOpenPicker,
3249
+ children: renderButtonLabel()
3250
+ }
3251
+ ) }),
3252
+ /* @__PURE__ */ jsxRuntime.jsx(
3253
+ ComponentPicker,
3254
+ {
3255
+ dynamicComponentsByCategory,
3256
+ isOpen: addComponentIsOpen,
3257
+ onClickAddComponent: handleAddComponent
3258
+ }
3259
+ )
3260
+ ] }) });
3292
3261
  };
3293
3262
  const NotAllowedInput = ({ hint, label, required, name: name2 }) => {
3294
3263
  const { formatMessage } = reactIntl.useIntl();
@@ -3362,7 +3331,7 @@ const UIDInput = React__namespace.forwardRef(
3362
3331
  const [showRegenerate, setShowRegenerate] = React__namespace.useState(false);
3363
3332
  const isCloning = reactRouterDom.useMatch(index.CLONE_PATH) !== null;
3364
3333
  const field = strapiAdmin.useField(name2);
3365
- const debouncedValue = useDebounce.useDebounce(field.value, 300);
3334
+ const debouncedValue = usePrev.useDebounce(field.value, 300);
3366
3335
  const hasChanged = debouncedValue !== field.initialValue;
3367
3336
  const { toggleNotification } = strapiAdmin.useNotification();
3368
3337
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
@@ -4913,7 +4882,7 @@ const Wysiwyg = React__namespace.forwardRef(
4913
4882
  const handleSelectAssets = (files) => {
4914
4883
  const formattedFiles = files.map((f) => ({
4915
4884
  alt: f.alternativeText || f.name,
4916
- url: useDebounce.prefixFileUrlWithBackendUrl(f.url),
4885
+ url: usePrev.prefixFileUrlWithBackendUrl(f.url),
4917
4886
  mime: f.mime
4918
4887
  }));
4919
4888
  insertFile(editorRef, formattedFiles);
@@ -4969,626 +4938,680 @@ const Wysiwyg = React__namespace.forwardRef(
4969
4938
  /* @__PURE__ */ jsxRuntime.jsx(MediaLibraryDialog, { onClose: handleToggleMediaLib, onSelectAssets: handleSelectAssets })
4970
4939
  ] });
4971
4940
  }
4972
- );
4973
- const MemoizedWysiwyg = React__namespace.memo(Wysiwyg);
4974
- const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
4975
- const { id, document: document2, collectionType } = index.useDoc();
4976
- const isFormDisabled = strapiAdmin.useForm("InputRenderer", (state) => state.disabled);
4977
- const isInDynamicZone = useDynamicZone("isInDynamicZone", (state) => state.isInDynamicZone);
4978
- const canCreateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canCreateFields);
4979
- const canReadFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canReadFields);
4980
- const canUpdateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUpdateFields);
4981
- const canUserAction = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUserAction);
4982
- let idToCheck = id;
4983
- if (collectionType === index.SINGLE_TYPES) {
4984
- idToCheck = document2?.documentId;
4941
+ );
4942
+ const MemoizedWysiwyg = React__namespace.memo(Wysiwyg);
4943
+ const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
4944
+ const { id, document: document2, collectionType } = index.useDoc();
4945
+ const isFormDisabled = strapiAdmin.useForm("InputRenderer", (state) => state.disabled);
4946
+ const isInDynamicZone = useDynamicZone("isInDynamicZone", (state) => state.isInDynamicZone);
4947
+ const canCreateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canCreateFields);
4948
+ const canReadFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canReadFields);
4949
+ const canUpdateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUpdateFields);
4950
+ const canUserAction = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUserAction);
4951
+ let idToCheck = id;
4952
+ if (collectionType === index.SINGLE_TYPES) {
4953
+ idToCheck = document2?.documentId;
4954
+ }
4955
+ const editableFields = idToCheck ? canUpdateFields : canCreateFields;
4956
+ const readableFields = idToCheck ? canReadFields : canCreateFields;
4957
+ const canUserReadField = canUserAction(props.name, readableFields, props.type);
4958
+ const canUserEditField = canUserAction(props.name, editableFields, props.type);
4959
+ const fields = strapiAdmin.useStrapiApp("InputRenderer", (app) => app.fields);
4960
+ const { lazyComponentStore } = useLazyComponents(
4961
+ attributeHasCustomFieldProperty(props.attribute) ? [props.attribute.customField] : void 0
4962
+ );
4963
+ const hint = useFieldHint(providedHint, props.attribute);
4964
+ const {
4965
+ edit: { components }
4966
+ } = index.useDocLayout();
4967
+ const field = strapiAdmin.useField(props.name);
4968
+ if (!visible) {
4969
+ return null;
4970
+ }
4971
+ if (!canUserReadField && !isInDynamicZone) {
4972
+ return /* @__PURE__ */ jsxRuntime.jsx(NotAllowedInput, { hint, ...props });
4973
+ }
4974
+ const fieldIsDisabled = !canUserEditField && !isInDynamicZone || props.disabled || isFormDisabled;
4975
+ if (attributeHasCustomFieldProperty(props.attribute)) {
4976
+ const CustomInput = lazyComponentStore[props.attribute.customField];
4977
+ if (CustomInput) {
4978
+ return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, ...field, hint, disabled: fieldIsDisabled });
4979
+ }
4980
+ return /* @__PURE__ */ jsxRuntime.jsx(
4981
+ strapiAdmin.InputRenderer,
4982
+ {
4983
+ ...props,
4984
+ hint,
4985
+ type: props.attribute.customField,
4986
+ disabled: fieldIsDisabled
4987
+ }
4988
+ );
4989
+ }
4990
+ const addedInputTypes = Object.keys(fields);
4991
+ if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {
4992
+ const CustomInput = fields[props.type];
4993
+ return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, hint, disabled: fieldIsDisabled });
4994
+ }
4995
+ switch (props.type) {
4996
+ case "blocks":
4997
+ return /* @__PURE__ */ jsxRuntime.jsx(MemoizedBlocksInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
4998
+ case "component":
4999
+ return /* @__PURE__ */ jsxRuntime.jsx(
5000
+ MemoizedComponentInput,
5001
+ {
5002
+ ...props,
5003
+ hint,
5004
+ layout: components[props.attribute.component].layout,
5005
+ disabled: fieldIsDisabled,
5006
+ children: (inputProps) => /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...inputProps })
5007
+ }
5008
+ );
5009
+ case "dynamiczone":
5010
+ return /* @__PURE__ */ jsxRuntime.jsx(DynamicZone, { ...props, hint, disabled: fieldIsDisabled });
5011
+ case "relation":
5012
+ return /* @__PURE__ */ jsxRuntime.jsx(Relations.MemoizedRelationsField, { ...props, hint, disabled: fieldIsDisabled });
5013
+ case "richtext":
5014
+ return /* @__PURE__ */ jsxRuntime.jsx(MemoizedWysiwyg, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
5015
+ case "uid":
5016
+ return /* @__PURE__ */ jsxRuntime.jsx(MemoizedUIDInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
5017
+ case "enumeration":
5018
+ return /* @__PURE__ */ jsxRuntime.jsx(
5019
+ strapiAdmin.InputRenderer,
5020
+ {
5021
+ ...props,
5022
+ hint,
5023
+ options: props.attribute.enum.map((value) => ({ value })),
5024
+ type: props.customField ? "custom-field" : props.type,
5025
+ disabled: fieldIsDisabled
5026
+ }
5027
+ );
5028
+ default:
5029
+ const { unique: _unique, mainField: _mainField, ...restProps } = props;
5030
+ return /* @__PURE__ */ jsxRuntime.jsx(
5031
+ strapiAdmin.InputRenderer,
5032
+ {
5033
+ ...restProps,
5034
+ hint,
5035
+ type: props.customField ? "custom-field" : props.type,
5036
+ disabled: fieldIsDisabled
5037
+ }
5038
+ );
5039
+ }
5040
+ };
5041
+ const attributeHasCustomFieldProperty = (attribute) => "customField" in attribute && typeof attribute.customField === "string";
5042
+ const useFieldHint = (hint = void 0, attribute) => {
5043
+ const { formatMessage } = reactIntl.useIntl();
5044
+ const { maximum, minimum } = getMinMax(attribute);
5045
+ if (!maximum && !minimum) {
5046
+ return hint;
4985
5047
  }
4986
- const editableFields = idToCheck ? canUpdateFields : canCreateFields;
4987
- const readableFields = idToCheck ? canReadFields : canCreateFields;
4988
- const canUserReadField = canUserAction(props.name, readableFields, props.type);
4989
- const canUserEditField = canUserAction(props.name, editableFields, props.type);
4990
- const fields = strapiAdmin.useStrapiApp("InputRenderer", (app) => app.fields);
4991
- const { lazyComponentStore } = useLazyComponents(
4992
- attributeHasCustomFieldProperty(props.attribute) ? [props.attribute.customField] : void 0
5048
+ const units = !["biginteger", "integer", "number", "dynamiczone", "component"].includes(
5049
+ attribute.type
5050
+ ) ? formatMessage(
5051
+ {
5052
+ id: "content-manager.form.Input.hint.character.unit",
5053
+ defaultMessage: "{maxValue, plural, one { character} other { characters}}"
5054
+ },
5055
+ {
5056
+ maxValue: Math.max(minimum || 0, maximum || 0)
5057
+ }
5058
+ ) : null;
5059
+ const hasMinAndMax = typeof minimum === "number" && typeof maximum === "number";
5060
+ return formatMessage(
5061
+ {
5062
+ id: "content-manager.form.Input.hint.text",
5063
+ defaultMessage: "{min, select, undefined {} other {min. {min}}}{divider}{max, select, undefined {} other {max. {max}}}{unit}{br}{description}"
5064
+ },
5065
+ {
5066
+ min: minimum,
5067
+ max: maximum,
5068
+ description: hint,
5069
+ unit: units,
5070
+ divider: hasMinAndMax ? formatMessage({
5071
+ id: "content-manager.form.Input.hint.minMaxDivider",
5072
+ defaultMessage: " / "
5073
+ }) : null,
5074
+ br: /* @__PURE__ */ jsxRuntime.jsx("br", {})
5075
+ }
4993
5076
  );
4994
- const hint = useFieldHint(providedHint, props.attribute);
4995
- const {
4996
- edit: { components }
4997
- } = index.useDocLayout();
4998
- const field = strapiAdmin.useField(props.name);
4999
- if (!visible) {
5000
- return null;
5077
+ };
5078
+ const getMinMax = (attribute) => {
5079
+ if ("min" in attribute || "max" in attribute) {
5080
+ return {
5081
+ maximum: !Number.isNaN(Number(attribute.max)) ? Number(attribute.max) : void 0,
5082
+ minimum: !Number.isNaN(Number(attribute.min)) ? Number(attribute.min) : void 0
5083
+ };
5084
+ } else if ("maxLength" in attribute || "minLength" in attribute) {
5085
+ return { maximum: attribute.maxLength, minimum: attribute.minLength };
5086
+ } else {
5087
+ return { maximum: void 0, minimum: void 0 };
5001
5088
  }
5002
- if (!canUserReadField && !isInDynamicZone) {
5003
- return /* @__PURE__ */ jsxRuntime.jsx(NotAllowedInput, { hint, ...props });
5089
+ };
5090
+ const MemoizedInputRenderer = React.memo(InputRenderer);
5091
+ const RESPONSIVE_CONTAINER_BREAKPOINTS = {
5092
+ sm: "27.5rem"
5093
+ // 440px
5094
+ };
5095
+ const ResponsiveGridRoot = styledComponents.styled(designSystem.Grid.Root)`
5096
+ container-type: inline-size;
5097
+ `;
5098
+ const ResponsiveGridItem = styledComponents.styled(designSystem.Grid.Item)`
5099
+ grid-column: span 12;
5100
+
5101
+ @container (min-width: ${RESPONSIVE_CONTAINER_BREAKPOINTS.sm}) {
5102
+ ${({ col }) => col && `grid-column: span ${col};`}
5004
5103
  }
5005
- const fieldIsDisabled = !canUserEditField && !isInDynamicZone || props.disabled || isFormDisabled;
5006
- if (attributeHasCustomFieldProperty(props.attribute)) {
5007
- const CustomInput = lazyComponentStore[props.attribute.customField];
5008
- if (CustomInput) {
5009
- return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, ...field, hint, disabled: fieldIsDisabled });
5104
+ `;
5105
+ const FormLayout = ({ layout }) => {
5106
+ const { formatMessage } = reactIntl.useIntl();
5107
+ const { model } = index.useDoc();
5108
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((panel, index2) => {
5109
+ if (panel.some((row) => row.some((field) => field.type === "dynamiczone"))) {
5110
+ const [row] = panel;
5111
+ const [field] = row;
5112
+ const fieldWithTranslatedLabel = {
5113
+ ...field,
5114
+ label: formatMessage({
5115
+ id: `content-manager.content-types.${model}.${field.name}`,
5116
+ defaultMessage: field.label
5117
+ })
5118
+ };
5119
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 12, s: 12, xs: 12, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel }) }) }, field.name);
5010
5120
  }
5011
5121
  return /* @__PURE__ */ jsxRuntime.jsx(
5012
- strapiAdmin.InputRenderer,
5122
+ designSystem.Box,
5013
5123
  {
5014
- ...props,
5015
- hint,
5016
- type: props.attribute.customField,
5017
- disabled: fieldIsDisabled
5124
+ hasRadius: true,
5125
+ background: "neutral0",
5126
+ shadow: "tableShadow",
5127
+ paddingLeft: 6,
5128
+ paddingRight: 6,
5129
+ paddingTop: 6,
5130
+ paddingBottom: 6,
5131
+ borderColor: "neutral150",
5132
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: panel.map((row, gridRowIndex) => /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
5133
+ const fieldWithTranslatedLabel = {
5134
+ ...field,
5135
+ label: formatMessage({
5136
+ id: `content-manager.content-types.${model}.${field.name}`,
5137
+ defaultMessage: field.label
5138
+ })
5139
+ };
5140
+ return /* @__PURE__ */ jsxRuntime.jsx(
5141
+ ResponsiveGridItem,
5142
+ {
5143
+ col: size,
5144
+ s: 12,
5145
+ xs: 12,
5146
+ direction: "column",
5147
+ alignItems: "stretch",
5148
+ children: /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel })
5149
+ },
5150
+ field.name
5151
+ );
5152
+ }) }, gridRowIndex)) })
5153
+ },
5154
+ index2
5155
+ );
5156
+ }) });
5157
+ };
5158
+ const NonRepeatableComponent = ({
5159
+ attribute,
5160
+ name: name2,
5161
+ children,
5162
+ layout
5163
+ }) => {
5164
+ const { formatMessage } = reactIntl.useIntl();
5165
+ const { value } = strapiAdmin.useField(name2);
5166
+ const level = Relations.useComponent("NonRepeatableComponent", (state) => state.level);
5167
+ const isNested = level > 0;
5168
+ return /* @__PURE__ */ jsxRuntime.jsx(Relations.ComponentProvider, { id: value?.id, uid: attribute.component, level: level + 1, type: "component", children: /* @__PURE__ */ jsxRuntime.jsx(
5169
+ designSystem.Box,
5170
+ {
5171
+ background: "neutral100",
5172
+ paddingLeft: 6,
5173
+ paddingRight: 6,
5174
+ paddingTop: 6,
5175
+ paddingBottom: 6,
5176
+ hasRadius: isNested,
5177
+ borderColor: isNested ? "neutral200" : void 0,
5178
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((row, index2) => {
5179
+ return /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
5180
+ const completeFieldName = `${name2}.${field.name}`;
5181
+ const translatedLabel = formatMessage({
5182
+ id: `content-manager.components.${attribute.component}.${field.name}`,
5183
+ defaultMessage: field.label
5184
+ });
5185
+ return /* @__PURE__ */ jsxRuntime.jsx(
5186
+ ResponsiveGridItem,
5187
+ {
5188
+ col: size,
5189
+ s: 12,
5190
+ xs: 12,
5191
+ direction: "column",
5192
+ alignItems: "stretch",
5193
+ children: children({ ...field, label: translatedLabel, name: completeFieldName })
5194
+ },
5195
+ completeFieldName
5196
+ );
5197
+ }) }, index2);
5198
+ }) })
5199
+ }
5200
+ ) });
5201
+ };
5202
+ const RepeatableComponent = ({
5203
+ attribute,
5204
+ disabled,
5205
+ name: name2,
5206
+ mainField,
5207
+ children,
5208
+ layout
5209
+ }) => {
5210
+ const { toggleNotification } = strapiAdmin.useNotification();
5211
+ const { formatMessage } = reactIntl.useIntl();
5212
+ const { search: searchString } = reactRouterDom.useLocation();
5213
+ const search = React__namespace.useMemo(() => new URLSearchParams(searchString), [searchString]);
5214
+ const { components } = index.useDoc();
5215
+ const {
5216
+ value = [],
5217
+ error,
5218
+ rawError
5219
+ } = strapiAdmin.useField(name2);
5220
+ const addFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.addFieldRow);
5221
+ const moveFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.moveFieldRow);
5222
+ const removeFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.removeFieldRow);
5223
+ const { max = Infinity } = attribute;
5224
+ const [collapseToOpen, setCollapseToOpen] = React__namespace.useState("");
5225
+ const [liveText, setLiveText] = React__namespace.useState("");
5226
+ React__namespace.useEffect(() => {
5227
+ const hasNestedErrors = rawError && Array.isArray(rawError) && rawError.length > 0;
5228
+ const hasNestedValue = value && Array.isArray(value) && value.length > 0;
5229
+ if (hasNestedErrors && hasNestedValue) {
5230
+ const errorOpenItems = rawError.map((_, idx) => {
5231
+ return value[idx] ? value[idx].__temp_key__ : null;
5232
+ }).filter((value2) => !!value2);
5233
+ if (errorOpenItems && errorOpenItems.length > 0) {
5234
+ setCollapseToOpen((collapseToOpen2) => {
5235
+ if (!errorOpenItems.includes(collapseToOpen2)) {
5236
+ return errorOpenItems[0];
5237
+ }
5238
+ return collapseToOpen2;
5239
+ });
5240
+ }
5241
+ }
5242
+ }, [rawError, value]);
5243
+ const componentTmpKeyWithFocussedField = React__namespace.useMemo(() => {
5244
+ if (search.has("field")) {
5245
+ const fieldParam = search.get("field");
5246
+ if (!fieldParam) {
5247
+ return void 0;
5248
+ }
5249
+ const [, path] = fieldParam.split(`${name2}.`);
5250
+ if (objects.getIn(value, path, void 0) !== void 0) {
5251
+ const [subpath] = path.split(".");
5252
+ return objects.getIn(value, subpath, void 0)?.__temp_key__;
5018
5253
  }
5254
+ }
5255
+ return void 0;
5256
+ }, [search, name2, value]);
5257
+ const prevValue = usePrev.usePrev(value);
5258
+ React__namespace.useEffect(() => {
5259
+ if (prevValue && prevValue.length < value.length) {
5260
+ setCollapseToOpen(value[value.length - 1].__temp_key__);
5261
+ }
5262
+ }, [value, prevValue]);
5263
+ React__namespace.useEffect(() => {
5264
+ if (typeof componentTmpKeyWithFocussedField === "string") {
5265
+ setCollapseToOpen(componentTmpKeyWithFocussedField);
5266
+ }
5267
+ }, [componentTmpKeyWithFocussedField]);
5268
+ const toggleCollapses = () => {
5269
+ setCollapseToOpen("");
5270
+ };
5271
+ const handleClick = () => {
5272
+ if (value.length < max) {
5273
+ const schema = components[attribute.component];
5274
+ const form = index.createDefaultForm(schema, components);
5275
+ const data = index.transformDocument(schema, components)(form);
5276
+ addFieldRow(name2, data);
5277
+ } else if (value.length >= max) {
5278
+ toggleNotification({
5279
+ type: "info",
5280
+ message: formatMessage({
5281
+ id: index.getTranslation("components.notification.info.maximum-requirement")
5282
+ })
5283
+ });
5284
+ }
5285
+ };
5286
+ const handleMoveComponentField = (newIndex, currentIndex) => {
5287
+ setLiveText(
5288
+ formatMessage(
5289
+ {
5290
+ id: index.getTranslation("dnd.reorder"),
5291
+ defaultMessage: "{item}, moved. New position in list: {position}."
5292
+ },
5293
+ {
5294
+ item: `${name2}.${currentIndex}`,
5295
+ position: getItemPos(newIndex)
5296
+ }
5297
+ )
5019
5298
  );
5020
- }
5021
- const addedInputTypes = Object.keys(fields);
5022
- if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {
5023
- const CustomInput = fields[props.type];
5024
- return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, hint, disabled: fieldIsDisabled });
5025
- }
5026
- switch (props.type) {
5027
- case "blocks":
5028
- return /* @__PURE__ */ jsxRuntime.jsx(MemoizedBlocksInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
5029
- case "component":
5030
- return /* @__PURE__ */ jsxRuntime.jsx(
5031
- MemoizedComponentInput,
5299
+ moveFieldRow(name2, currentIndex, newIndex);
5300
+ };
5301
+ const handleValueChange = (key) => {
5302
+ setCollapseToOpen(key);
5303
+ };
5304
+ const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
5305
+ const handleCancel = (index$1) => {
5306
+ setLiveText(
5307
+ formatMessage(
5032
5308
  {
5033
- ...props,
5034
- hint,
5035
- layout: components[props.attribute.component].layout,
5036
- disabled: fieldIsDisabled,
5037
- children: (inputProps) => /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...inputProps })
5309
+ id: index.getTranslation("dnd.cancel-item"),
5310
+ defaultMessage: "{item}, dropped. Re-order cancelled."
5311
+ },
5312
+ {
5313
+ item: `${name2}.${index$1}`
5038
5314
  }
5039
- );
5040
- case "dynamiczone":
5041
- return /* @__PURE__ */ jsxRuntime.jsx(DynamicZone, { ...props, hint, disabled: fieldIsDisabled });
5042
- case "relation":
5043
- return /* @__PURE__ */ jsxRuntime.jsx(Relations.MemoizedRelationsField, { ...props, hint, disabled: fieldIsDisabled });
5044
- case "richtext":
5045
- return /* @__PURE__ */ jsxRuntime.jsx(MemoizedWysiwyg, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
5046
- case "uid":
5047
- return /* @__PURE__ */ jsxRuntime.jsx(MemoizedUIDInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
5048
- case "enumeration":
5049
- return /* @__PURE__ */ jsxRuntime.jsx(
5050
- strapiAdmin.InputRenderer,
5315
+ )
5316
+ );
5317
+ };
5318
+ const handleGrabItem = (index$1) => {
5319
+ setLiveText(
5320
+ formatMessage(
5051
5321
  {
5052
- ...props,
5053
- hint,
5054
- options: props.attribute.enum.map((value) => ({ value })),
5055
- type: props.customField ? "custom-field" : props.type,
5056
- disabled: fieldIsDisabled
5322
+ id: index.getTranslation("dnd.grab-item"),
5323
+ defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
5324
+ },
5325
+ {
5326
+ item: `${name2}.${index$1}`,
5327
+ position: getItemPos(index$1)
5057
5328
  }
5058
- );
5059
- default:
5060
- const { unique: _unique, mainField: _mainField, ...restProps } = props;
5061
- return /* @__PURE__ */ jsxRuntime.jsx(
5062
- strapiAdmin.InputRenderer,
5329
+ )
5330
+ );
5331
+ };
5332
+ const handleDropItem = (index$1) => {
5333
+ setLiveText(
5334
+ formatMessage(
5063
5335
  {
5064
- ...restProps,
5065
- hint,
5066
- type: props.customField ? "custom-field" : props.type,
5067
- disabled: fieldIsDisabled
5336
+ id: index.getTranslation("dnd.drop-item"),
5337
+ defaultMessage: `{item}, dropped. Final position in list: {position}.`
5338
+ },
5339
+ {
5340
+ item: `${name2}.${index$1}`,
5341
+ position: getItemPos(index$1)
5068
5342
  }
5069
- );
5343
+ )
5344
+ );
5345
+ };
5346
+ const ariaDescriptionId = React__namespace.useId();
5347
+ const level = Relations.useComponent("RepeatableComponent", (state) => state.level);
5348
+ if (value.length === 0) {
5349
+ return /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleClick });
5070
5350
  }
5351
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { hasRadius: true, children: [
5352
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
5353
+ id: index.getTranslation("dnd.instructions"),
5354
+ defaultMessage: `Press spacebar to grab and re-order`
5355
+ }) }),
5356
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
5357
+ /* @__PURE__ */ jsxRuntime.jsxs(
5358
+ AccordionRoot,
5359
+ {
5360
+ $error: error,
5361
+ value: collapseToOpen,
5362
+ onValueChange: handleValueChange,
5363
+ "aria-describedby": ariaDescriptionId,
5364
+ children: [
5365
+ value.map(({ __temp_key__: key, id }, index2) => {
5366
+ const nameWithIndex = `${name2}.${index2}`;
5367
+ return /* @__PURE__ */ jsxRuntime.jsx(
5368
+ Relations.ComponentProvider,
5369
+ {
5370
+ id,
5371
+ uid: attribute.component,
5372
+ level: level + 1,
5373
+ type: "repeatable",
5374
+ children: /* @__PURE__ */ jsxRuntime.jsx(
5375
+ Component,
5376
+ {
5377
+ disabled,
5378
+ name: nameWithIndex,
5379
+ attribute,
5380
+ index: index2,
5381
+ mainField,
5382
+ onMoveItem: handleMoveComponentField,
5383
+ onDeleteComponent: () => {
5384
+ removeFieldRow(name2, index2);
5385
+ toggleCollapses();
5386
+ },
5387
+ toggleCollapses,
5388
+ onCancel: handleCancel,
5389
+ onDropItem: handleDropItem,
5390
+ onGrabItem: handleGrabItem,
5391
+ __temp_key__: key,
5392
+ children: layout.map((row, index22) => {
5393
+ return /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
5394
+ const completeFieldName = `${nameWithIndex}.${field.name}`;
5395
+ const translatedLabel = formatMessage({
5396
+ id: `content-manager.components.${attribute.component}.${field.name}`,
5397
+ defaultMessage: field.label
5398
+ });
5399
+ return /* @__PURE__ */ jsxRuntime.jsx(
5400
+ ResponsiveGridItem,
5401
+ {
5402
+ col: size,
5403
+ s: 12,
5404
+ xs: 12,
5405
+ direction: "column",
5406
+ alignItems: "stretch",
5407
+ children: children({
5408
+ ...field,
5409
+ label: translatedLabel,
5410
+ name: completeFieldName
5411
+ })
5412
+ },
5413
+ completeFieldName
5414
+ );
5415
+ }) }, index22);
5416
+ })
5417
+ }
5418
+ )
5419
+ },
5420
+ key
5421
+ );
5422
+ }),
5423
+ /* @__PURE__ */ jsxRuntime.jsx(TextButtonCustom, { disabled, onClick: handleClick, startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Plus, {}), children: formatMessage({
5424
+ id: index.getTranslation("containers.EditView.add.new-entry"),
5425
+ defaultMessage: "Add an entry"
5426
+ }) })
5427
+ ]
5428
+ }
5429
+ )
5430
+ ] });
5071
5431
  };
5072
- const attributeHasCustomFieldProperty = (attribute) => "customField" in attribute && typeof attribute.customField === "string";
5073
- const useFieldHint = (hint = void 0, attribute) => {
5074
- const { formatMessage } = reactIntl.useIntl();
5075
- const { maximum, minimum } = getMinMax(attribute);
5076
- if (!maximum && !minimum) {
5077
- return hint;
5078
- }
5079
- const units = !["biginteger", "integer", "number", "dynamiczone", "component"].includes(
5080
- attribute.type
5081
- ) ? formatMessage(
5082
- {
5083
- id: "content-manager.form.Input.hint.character.unit",
5084
- defaultMessage: "{maxValue, plural, one { character} other { characters}}"
5085
- },
5086
- {
5087
- maxValue: Math.max(minimum || 0, maximum || 0)
5088
- }
5089
- ) : null;
5090
- const hasMinAndMax = typeof minimum === "number" && typeof maximum === "number";
5091
- return formatMessage(
5092
- {
5093
- id: "content-manager.form.Input.hint.text",
5094
- defaultMessage: "{min, select, undefined {} other {min. {min}}}{divider}{max, select, undefined {} other {max. {max}}}{unit}{br}{description}"
5095
- },
5096
- {
5097
- min: minimum,
5098
- max: maximum,
5099
- description: hint,
5100
- unit: units,
5101
- divider: hasMinAndMax ? formatMessage({
5102
- id: "content-manager.form.Input.hint.minMaxDivider",
5103
- defaultMessage: " / "
5104
- }) : null,
5105
- br: /* @__PURE__ */ jsxRuntime.jsx("br", {})
5432
+ const AccordionRoot = styledComponents.styled(designSystem.Accordion.Root)`
5433
+ border: 1px solid
5434
+ ${({ theme, $error }) => $error ? theme.colors.danger600 : theme.colors.neutral200};
5435
+ `;
5436
+ const TextButtonCustom = styledComponents.styled(designSystem.TextButton)`
5437
+ width: 100%;
5438
+ display: flex;
5439
+ justify-content: center;
5440
+ border-top: 1px solid ${({ theme }) => theme.colors.neutral200};
5441
+ padding-inline: ${(props) => props.theme.spaces[6]};
5442
+ padding-block: ${(props) => props.theme.spaces[3]};
5443
+
5444
+ &:not([disabled]) {
5445
+ cursor: pointer;
5446
+
5447
+ &:hover {
5448
+ background-color: ${(props) => props.theme.colors.primary100};
5106
5449
  }
5107
- );
5108
- };
5109
- const getMinMax = (attribute) => {
5110
- if ("min" in attribute || "max" in attribute) {
5111
- return {
5112
- maximum: !Number.isNaN(Number(attribute.max)) ? Number(attribute.max) : void 0,
5113
- minimum: !Number.isNaN(Number(attribute.min)) ? Number(attribute.min) : void 0
5114
- };
5115
- } else if ("maxLength" in attribute || "minLength" in attribute) {
5116
- return { maximum: attribute.maxLength, minimum: attribute.minLength };
5117
- } else {
5118
- return { maximum: void 0, minimum: void 0 };
5119
5450
  }
5120
- };
5121
- const MemoizedInputRenderer = React.memo(InputRenderer);
5122
- const DynamicComponent = ({
5123
- componentUid,
5451
+
5452
+ span {
5453
+ font-weight: 600;
5454
+ font-size: 1.4rem;
5455
+ line-height: 2.4rem;
5456
+ }
5457
+
5458
+ @media (prefers-reduced-motion: no-preference) {
5459
+ transition: background-color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
5460
+ }
5461
+ `;
5462
+ const Component = ({
5124
5463
  disabled,
5125
5464
  index: index$1,
5126
5465
  name: name2,
5127
- onRemoveComponentClick,
5128
- onMoveComponent,
5129
- onGrabItem,
5130
- onDropItem,
5131
- onCancel,
5132
- dynamicComponentsByCategory = {},
5133
- onAddComponent
5466
+ mainField = {
5467
+ name: "id",
5468
+ type: "integer"
5469
+ },
5470
+ children,
5471
+ onDeleteComponent,
5472
+ toggleCollapses,
5473
+ __temp_key__,
5474
+ ...dragProps
5134
5475
  }) => {
5135
5476
  const { formatMessage } = reactIntl.useIntl();
5136
- const formValues = strapiAdmin.useForm("DynamicComponent", (state) => state.values);
5137
- const {
5138
- edit: { components }
5139
- } = index.useDocLayout();
5140
- const title = React__namespace.useMemo(() => {
5141
- const { mainField } = components[componentUid]?.settings ?? { mainField: "id" };
5142
- const mainFieldValue = objects.getIn(formValues, `${name2}.${index$1}.${mainField}`);
5143
- const displayedValue = mainField === "id" || !mainFieldValue ? "" : String(mainFieldValue).trim();
5144
- const mainValue = displayedValue.length > 0 ? `- ${displayedValue}` : displayedValue;
5145
- return mainValue;
5146
- }, [componentUid, components, formValues, name2, index$1]);
5147
- const { icon, displayName } = React__namespace.useMemo(() => {
5148
- const [category] = componentUid.split(".");
5149
- const { icon: icon2, displayName: displayName2 } = (dynamicComponentsByCategory[category] ?? []).find(
5150
- (component) => component.uid === componentUid
5151
- ) ?? { icon: null, displayName: null };
5152
- return { icon: icon2, displayName: displayName2 };
5153
- }, [componentUid, dynamicComponentsByCategory]);
5477
+ const displayValue = strapiAdmin.useForm("RepeatableComponent", (state) => {
5478
+ return objects.getIn(state.values, [...name2.split("."), mainField.name]);
5479
+ });
5480
+ const accordionRef = React__namespace.useRef(null);
5481
+ const componentKey = name2.split(".").slice(0, -1).join(".");
5154
5482
  const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop.useDragAndDrop(!disabled, {
5155
- type: `${useDragAndDrop.ItemTypes.DYNAMIC_ZONE}_${name2}`,
5483
+ type: `${useDragAndDrop.ItemTypes.COMPONENT}_${componentKey}`,
5156
5484
  index: index$1,
5157
5485
  item: {
5158
5486
  index: index$1,
5159
- displayedValue: `${displayName} ${title}`,
5160
- icon
5487
+ displayedValue: displayValue
5161
5488
  },
5162
- onMoveItem: onMoveComponent,
5163
- onDropItem,
5164
- onGrabItem,
5165
- onCancel
5489
+ onStart() {
5490
+ toggleCollapses();
5491
+ },
5492
+ ...dragProps
5166
5493
  });
5167
5494
  React__namespace.useEffect(() => {
5168
5495
  dragPreviewRef(reactDndHtml5Backend.getEmptyImage(), { captureDraggingState: false });
5169
5496
  }, [dragPreviewRef, index$1]);
5170
- const accordionValue = React__namespace.useId();
5171
- const { value = [], rawError } = strapiAdmin.useField(`${name2}.${index$1}`);
5172
- const [collapseToOpen, setCollapseToOpen] = React__namespace.useState("");
5173
- React__namespace.useEffect(() => {
5174
- if (rawError && value) {
5175
- setCollapseToOpen(accordionValue);
5176
- }
5177
- }, [rawError, value, accordionValue]);
5178
- const composedBoxRefs = designSystem.useComposedRefs(boxRef, dropRef);
5179
- const accordionActions = disabled ? null : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5180
- /* @__PURE__ */ jsxRuntime.jsx(
5181
- designSystem.IconButton,
5182
- {
5183
- variant: "ghost",
5184
- label: formatMessage(
5497
+ const composedAccordionRefs = designSystem.useComposedRefs(accordionRef, dragRef);
5498
+ const composedBoxRefs = designSystem.useComposedRefs(
5499
+ boxRef,
5500
+ dropRef
5501
+ );
5502
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: isDragging ? /* @__PURE__ */ jsxRuntime.jsx(Preview, {}) : /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { ref: composedBoxRefs, value: __temp_key__, children: [
5503
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
5504
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: displayValue }),
5505
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Actions, { children: [
5506
+ /* @__PURE__ */ jsxRuntime.jsx(
5507
+ designSystem.IconButton,
5185
5508
  {
5186
- id: index.getTranslation("components.DynamicZone.delete-label"),
5187
- defaultMessage: "Delete {name}"
5188
- },
5189
- { name: title }
5509
+ variant: "ghost",
5510
+ onClick: onDeleteComponent,
5511
+ label: formatMessage({
5512
+ id: index.getTranslation("containers.Edit.delete"),
5513
+ defaultMessage: "Delete"
5514
+ }),
5515
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
5516
+ }
5190
5517
  ),
5191
- onClick: onRemoveComponentClick,
5192
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
5193
- }
5194
- ),
5195
- /* @__PURE__ */ jsxRuntime.jsx(
5196
- designSystem.IconButton,
5197
- {
5198
- variant: "ghost",
5199
- onClick: (e) => e.stopPropagation(),
5200
- "data-handler-id": handlerId,
5201
- ref: dragRef,
5202
- label: formatMessage({
5203
- id: index.getTranslation("components.DragHandle-label"),
5204
- defaultMessage: "Drag"
5205
- }),
5206
- onKeyDown: handleKeyDown,
5207
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
5208
- }
5209
- ),
5210
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
5211
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Trigger, { size: "S", endIcon: null, paddingLeft: 2, paddingRight: 2, children: [
5212
- /* @__PURE__ */ jsxRuntime.jsx(Icons.More, { "aria-hidden": true, focusable: false }),
5213
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { tag: "span", children: formatMessage({
5214
- id: index.getTranslation("components.DynamicZone.more-actions"),
5215
- defaultMessage: "More actions"
5216
- }) })
5217
- ] }),
5218
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { children: [
5219
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
5220
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
5221
- id: index.getTranslation("components.DynamicZone.add-item-above"),
5222
- defaultMessage: "Add component above"
5223
- }) }),
5224
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
5225
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
5226
- components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1), children: displayName2 }, componentUid))
5227
- ] }, category)) })
5228
- ] }),
5229
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
5230
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
5231
- id: index.getTranslation("components.DynamicZone.add-item-below"),
5232
- defaultMessage: "Add component below"
5233
- }) }),
5234
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
5235
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
5236
- components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1 + 1), children: displayName2 }, componentUid))
5237
- ] }, category)) })
5238
- ] })
5239
- ] })
5240
- ] })
5241
- ] });
5242
- const accordionTitle = title ? `${displayName} ${title}` : displayName;
5243
- return /* @__PURE__ */ jsxRuntime.jsxs(ComponentContainer, { tag: "li", width: "100%", children: [
5244
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Rectangle, { background: "neutral200" }) }),
5245
- /* @__PURE__ */ jsxRuntime.jsx(StyledBox, { ref: composedBoxRefs, hasRadius: true, children: isDragging ? /* @__PURE__ */ jsxRuntime.jsx(Preview, {}) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Root, { value: collapseToOpen, onValueChange: setCollapseToOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: accordionValue, children: [
5246
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
5247
5518
  /* @__PURE__ */ jsxRuntime.jsx(
5248
- designSystem.Accordion.Trigger,
5519
+ designSystem.IconButton,
5249
5520
  {
5250
- icon: icon && ComponentIcon.COMPONENT_ICONS[icon] ? ComponentIcon.COMPONENT_ICONS[icon] : ComponentIcon.COMPONENT_ICONS.dashboard,
5251
- children: accordionTitle
5521
+ ref: composedAccordionRefs,
5522
+ variant: "ghost",
5523
+ onClick: (e) => e.stopPropagation(),
5524
+ "data-handler-id": handlerId,
5525
+ label: formatMessage({
5526
+ id: index.getTranslation("components.DragHandle-label"),
5527
+ defaultMessage: "Drag"
5528
+ }),
5529
+ onKeyDown: handleKeyDown,
5530
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
5252
5531
  }
5253
- ),
5254
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Actions, { children: accordionActions })
5255
- ] }),
5256
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(AccordionContentRadius, { background: "neutral0", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 6, paddingRight: 6, paddingTop: 6, paddingBottom: 6, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: components[componentUid]?.layout?.map((row, rowInd) => /* @__PURE__ */ jsxRuntime.jsx(
5257
- designSystem.Grid.Item,
5258
- {
5259
- col: 12,
5260
- s: 12,
5261
- xs: 12,
5262
- direction: "column",
5263
- alignItems: "stretch",
5264
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: row.map(({ size, ...field }) => {
5265
- const fieldName = `${name2}.${index$1}.${field.name}`;
5266
- const fieldWithTranslatedLabel = {
5267
- ...field,
5268
- label: formatMessage({
5269
- id: `content-manager.components.${componentUid}.${field.name}`,
5270
- defaultMessage: field.label
5271
- })
5272
- };
5273
- return /* @__PURE__ */ jsxRuntime.jsx(
5274
- designSystem.Grid.Item,
5275
- {
5276
- col: size,
5277
- s: 12,
5278
- xs: 12,
5279
- direction: "column",
5280
- alignItems: "stretch",
5281
- children: /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel, name: fieldName })
5282
- },
5283
- fieldName
5284
- );
5285
- }) })
5286
- },
5287
- rowInd
5288
- )) }) }) }) })
5289
- ] }) }) })
5290
- ] });
5291
- };
5292
- const StyledBox = styledComponents.styled(designSystem.Box)`
5293
- > div:first-child {
5294
- box-shadow: ${({ theme }) => theme.shadows.tableShadow};
5295
- }
5296
- `;
5297
- const AccordionContentRadius = styledComponents.styled(designSystem.Box)`
5298
- border-radius: 0 0 ${({ theme }) => theme.spaces[1]} ${({ theme }) => theme.spaces[1]};
5299
- `;
5300
- const Rectangle = styledComponents.styled(designSystem.Box)`
5301
- width: ${({ theme }) => theme.spaces[2]};
5302
- height: ${({ theme }) => theme.spaces[4]};
5303
- `;
5304
- const Preview = styledComponents.styled.span`
5305
- display: block;
5306
- background-color: ${({ theme }) => theme.colors.primary100};
5307
- outline: 1px dashed ${({ theme }) => theme.colors.primary500};
5308
- outline-offset: -1px;
5309
- padding: ${({ theme }) => theme.spaces[6]};
5310
- `;
5311
- const ComponentContainer = styledComponents.styled(designSystem.Box)`
5312
- list-style: none;
5313
- padding: 0;
5314
- margin: 0;
5315
- `;
5316
- const DynamicZoneLabel = ({
5317
- hint,
5318
- label,
5319
- labelAction,
5320
- name: name2,
5321
- numberOfComponents = 0,
5322
- required
5323
- }) => {
5324
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
5325
- designSystem.Box,
5326
- {
5327
- paddingTop: 3,
5328
- paddingBottom: 3,
5329
- paddingRight: 4,
5330
- paddingLeft: 4,
5331
- borderRadius: "26px",
5332
- background: "neutral0",
5333
- shadow: "filterShadow",
5334
- color: "neutral500",
5335
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", justifyContent: "center", children: [
5336
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { maxWidth: "35.6rem", children: [
5337
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", ellipsis: true, children: [
5338
- label || name2,
5339
- " "
5340
- ] }),
5341
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", children: [
5342
- "(",
5343
- numberOfComponents,
5344
- ")"
5345
- ] }),
5346
- required && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", children: "*" }),
5347
- labelAction && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 1, children: labelAction })
5348
- ] }),
5349
- hint && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 1, maxWidth: "35.6rem", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", ellipsis: true, children: hint }) })
5532
+ )
5350
5533
  ] })
5351
- }
5352
- ) });
5534
+ ] }),
5535
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(
5536
+ designSystem.Flex,
5537
+ {
5538
+ direction: "column",
5539
+ alignItems: "stretch",
5540
+ background: "neutral100",
5541
+ padding: 6,
5542
+ gap: 6,
5543
+ children
5544
+ }
5545
+ ) })
5546
+ ] }) });
5547
+ };
5548
+ const Preview = () => {
5549
+ return /* @__PURE__ */ jsxRuntime.jsx(StyledSpan, { tag: "span", padding: 6, background: "primary100" });
5353
5550
  };
5354
- const [DynamicZoneProvider, useDynamicZone] = strapiAdmin.createContext(
5355
- "DynamicZone",
5356
- {
5357
- isInDynamicZone: false
5358
- }
5359
- );
5360
- const DynamicZone = ({
5361
- attribute,
5362
- disabled: disabledProp,
5363
- hint,
5551
+ const StyledSpan = styledComponents.styled(designSystem.Box)`
5552
+ display: block;
5553
+ outline: 1px dashed ${({ theme }) => theme.colors.primary500};
5554
+ outline-offset: -1px;
5555
+ `;
5556
+ const ComponentInput = ({
5364
5557
  label,
5365
- labelAction,
5558
+ required,
5366
5559
  name: name2,
5367
- required = false
5560
+ attribute,
5561
+ disabled,
5562
+ labelAction,
5563
+ ...props
5368
5564
  }) => {
5369
- const { max = Infinity, min = -Infinity } = attribute ?? {};
5370
- const [addComponentIsOpen, setAddComponentIsOpen] = React__namespace.useState(false);
5371
- const [liveText, setLiveText] = React__namespace.useState("");
5372
- const { components, isLoading } = index.useDoc();
5373
- const disabled = disabledProp || isLoading;
5374
- const { addFieldRow, removeFieldRow, moveFieldRow } = strapiAdmin.useForm(
5375
- "DynamicZone",
5376
- ({ addFieldRow: addFieldRow2, removeFieldRow: removeFieldRow2, moveFieldRow: moveFieldRow2 }) => ({
5377
- addFieldRow: addFieldRow2,
5378
- removeFieldRow: removeFieldRow2,
5379
- moveFieldRow: moveFieldRow2
5380
- })
5381
- );
5382
- const { value = [], error } = strapiAdmin.useField(name2);
5383
- const dynamicComponentsByCategory = React__namespace.useMemo(() => {
5384
- return attribute.components.reduce((acc, componentUid) => {
5385
- const { category, info } = components[componentUid] ?? { info: {} };
5386
- const component = { uid: componentUid, displayName: info.displayName, icon: info.icon };
5387
- if (!acc[category]) {
5388
- acc[category] = [];
5389
- }
5390
- acc[category] = [...acc[category], component];
5391
- return acc;
5392
- }, {});
5393
- }, [attribute.components, components]);
5394
5565
  const { formatMessage } = reactIntl.useIntl();
5395
- const { toggleNotification } = strapiAdmin.useNotification();
5396
- const dynamicDisplayedComponentsLength = value.length;
5397
- const handleAddComponent = (uid, position) => {
5398
- setAddComponentIsOpen(false);
5399
- const schema = components[uid];
5400
- const form = createDefaultForm(schema, components);
5401
- const transformations = pipe__default.default(transformDocument(schema, components), (data2) => ({
5402
- ...data2,
5403
- __component: uid
5404
- }));
5405
- const data = transformations(form);
5406
- addFieldRow(name2, data, position);
5407
- };
5408
- const handleClickOpenPicker = () => {
5409
- if (dynamicDisplayedComponentsLength < max) {
5410
- setAddComponentIsOpen((prev) => !prev);
5411
- } else {
5412
- toggleNotification({
5413
- type: "info",
5414
- message: formatMessage({
5415
- id: index.getTranslation("components.notification.info.maximum-requirement")
5416
- })
5417
- });
5418
- }
5419
- };
5420
- const handleMoveComponent = (newIndex, currentIndex) => {
5421
- setLiveText(
5422
- formatMessage(
5423
- {
5424
- id: index.getTranslation("dnd.reorder"),
5425
- defaultMessage: "{item}, moved. New position in list: {position}."
5426
- },
5427
- {
5428
- item: `${name2}.${currentIndex}`,
5429
- position: getItemPos(newIndex)
5430
- }
5431
- )
5432
- );
5433
- moveFieldRow(name2, currentIndex, newIndex);
5434
- };
5435
- const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
5436
- const handleCancel = (index$1) => {
5437
- setLiveText(
5438
- formatMessage(
5439
- {
5440
- id: index.getTranslation("dnd.cancel-item"),
5441
- defaultMessage: "{item}, dropped. Re-order cancelled."
5442
- },
5443
- {
5444
- item: `${name2}.${index$1}`
5445
- }
5446
- )
5447
- );
5448
- };
5449
- const handleGrabItem = (index$1) => {
5450
- setLiveText(
5451
- formatMessage(
5452
- {
5453
- id: index.getTranslation("dnd.grab-item"),
5454
- defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
5455
- },
5456
- {
5457
- item: `${name2}.${index$1}`,
5458
- position: getItemPos(index$1)
5459
- }
5460
- )
5461
- );
5566
+ const field = strapiAdmin.useField(name2);
5567
+ const showResetComponent = !attribute.repeatable && field.value && !disabled;
5568
+ const { components } = index.useDoc();
5569
+ const handleInitialisationClick = () => {
5570
+ const schema = components[attribute.component];
5571
+ const form = index.createDefaultForm(schema, components);
5572
+ const data = index.transformDocument(schema, components)(form);
5573
+ field.onChange(name2, data);
5462
5574
  };
5463
- const handleDropItem = (index$1) => {
5464
- setLiveText(
5465
- formatMessage(
5466
- {
5467
- id: index.getTranslation("dnd.drop-item"),
5468
- defaultMessage: `{item}, dropped. Final position in list: {position}.`
5469
- },
5575
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error: field.error, required, children: [
5576
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", children: [
5577
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Label, { action: labelAction, children: [
5578
+ label,
5579
+ attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5580
+ " (",
5581
+ Array.isArray(field.value) ? field.value.length : 0,
5582
+ ")"
5583
+ ] })
5584
+ ] }),
5585
+ showResetComponent && /* @__PURE__ */ jsxRuntime.jsx(
5586
+ designSystem.IconButton,
5470
5587
  {
5471
- item: `${name2}.${index$1}`,
5472
- position: getItemPos(index$1)
5588
+ label: formatMessage({
5589
+ id: index.getTranslation("components.reset-entry"),
5590
+ defaultMessage: "Reset Entry"
5591
+ }),
5592
+ variant: "ghost",
5593
+ onClick: () => {
5594
+ field.onChange(name2, null);
5595
+ },
5596
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
5473
5597
  }
5474
5598
  )
5475
- );
5476
- };
5477
- const handleRemoveComponent = (name22, currentIndex) => () => {
5478
- removeFieldRow(name22, currentIndex);
5479
- };
5480
- const hasError = error !== void 0;
5481
- const renderButtonLabel = () => {
5482
- if (addComponentIsOpen) {
5483
- return formatMessage({ id: "app.utils.close-label", defaultMessage: "Close" });
5484
- }
5485
- if (hasError && dynamicDisplayedComponentsLength > max) {
5486
- return formatMessage(
5487
- {
5488
- id: index.getTranslation(`components.DynamicZone.extra-components`),
5489
- defaultMessage: "There {number, plural, =0 {are # extra components} one {is # extra component} other {are # extra components}}"
5490
- },
5491
- {
5492
- number: dynamicDisplayedComponentsLength - max
5493
- }
5494
- );
5495
- }
5496
- if (hasError && dynamicDisplayedComponentsLength < min) {
5497
- return formatMessage(
5498
- {
5499
- id: index.getTranslation(`components.DynamicZone.missing-components`),
5500
- defaultMessage: "There {number, plural, =0 {are # missing components} one {is # missing component} other {are # missing components}}"
5501
- },
5502
- { number: min - dynamicDisplayedComponentsLength }
5503
- );
5504
- }
5505
- return formatMessage(
5506
- {
5507
- id: index.getTranslation("components.DynamicZone.add-component"),
5508
- defaultMessage: "Add a component to {componentName}"
5509
- },
5510
- { componentName: label || name2 }
5511
- );
5512
- };
5513
- const level = Relations.useComponent("DynamicZone", (state) => state.level);
5514
- const ariaDescriptionId = React__namespace.useId();
5515
- return /* @__PURE__ */ jsxRuntime.jsx(DynamicZoneProvider, { isInDynamicZone: true, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
5516
- dynamicDisplayedComponentsLength > 0 && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
5517
- /* @__PURE__ */ jsxRuntime.jsx(
5518
- DynamicZoneLabel,
5519
- {
5520
- hint,
5521
- label,
5522
- labelAction,
5523
- name: name2,
5524
- numberOfComponents: dynamicDisplayedComponentsLength,
5525
- required
5526
- }
5527
- ),
5528
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
5529
- id: index.getTranslation("dnd.instructions"),
5530
- defaultMessage: `Press spacebar to grab and re-order`
5531
- }) }),
5532
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
5533
- /* @__PURE__ */ jsxRuntime.jsx("ol", { "aria-describedby": ariaDescriptionId, children: value.map((field, index2) => /* @__PURE__ */ jsxRuntime.jsx(
5534
- Relations.ComponentProvider,
5535
- {
5536
- level: level + 1,
5537
- uid: field.__component,
5538
- id: field.id,
5539
- type: "dynamiczone",
5540
- children: /* @__PURE__ */ jsxRuntime.jsx(
5541
- DynamicComponent,
5542
- {
5543
- disabled,
5544
- name: name2,
5545
- index: index2,
5546
- componentUid: field.__component,
5547
- onMoveComponent: handleMoveComponent,
5548
- onRemoveComponentClick: handleRemoveComponent(name2, index2),
5549
- onCancel: handleCancel,
5550
- onDropItem: handleDropItem,
5551
- onGrabItem: handleGrabItem,
5552
- onAddComponent: handleAddComponent,
5553
- dynamicComponentsByCategory
5554
- }
5555
- )
5556
- },
5557
- field.__temp_key__
5558
- )) })
5559
5599
  ] }),
5560
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
5561
- AddComponentButton,
5562
- {
5563
- hasError,
5564
- isDisabled: disabled,
5565
- isOpen: addComponentIsOpen,
5566
- onClick: handleClickOpenPicker,
5567
- children: renderButtonLabel()
5568
- }
5569
- ) }),
5570
- /* @__PURE__ */ jsxRuntime.jsx(
5571
- ComponentPicker,
5572
- {
5573
- dynamicComponentsByCategory,
5574
- isOpen: addComponentIsOpen,
5575
- onClickAddComponent: handleAddComponent
5576
- }
5577
- )
5578
- ] }) });
5600
+ !attribute.repeatable && !field.value && /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleInitialisationClick }),
5601
+ !attribute.repeatable && field.value ? /* @__PURE__ */ jsxRuntime.jsx(NonRepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }) : null,
5602
+ attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsx(RepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }),
5603
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Error, {})
5604
+ ] });
5579
5605
  };
5606
+ const MemoizedComponentInput = React__namespace.memo(ComponentInput);
5580
5607
  exports.DynamicZone = DynamicZone;
5608
+ exports.FormLayout = FormLayout;
5581
5609
  exports.MemoizedBlocksInput = MemoizedBlocksInput;
5582
5610
  exports.MemoizedComponentInput = MemoizedComponentInput;
5583
- exports.MemoizedInputRenderer = MemoizedInputRenderer;
5584
5611
  exports.MemoizedUIDInput = MemoizedUIDInput;
5585
5612
  exports.MemoizedWysiwyg = MemoizedWysiwyg;
5586
5613
  exports.NotAllowedInput = NotAllowedInput;
5587
- exports.createDefaultForm = createDefaultForm;
5588
- exports.prepareTempKeys = prepareTempKeys;
5589
- exports.removeFieldsThatDontExistOnSchema = removeFieldsThatDontExistOnSchema;
5590
- exports.transformDocument = transformDocument;
5591
5614
  exports.useDynamicZone = useDynamicZone;
5592
5615
  exports.useFieldHint = useFieldHint;
5593
5616
  exports.useLazyComponents = useLazyComponents;
5594
- //# sourceMappingURL=Field-B9ADaInZ.js.map
5617
+ //# sourceMappingURL=Input-BwOibhc3.js.map