@strapi/content-manager 0.0.0-experimental.a6728ad43ac70ae19dabb624dbfca1f2d9610a86 → 0.0.0-experimental.a687a6977f91492ccfc6771bf398a5236ece3c94

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 (169) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-_6osrv39.js → ComponentConfigurationPage-BebDdCkl.js} +4 -4
  2. package/dist/_chunks/{ComponentConfigurationPage-_6osrv39.js.map → ComponentConfigurationPage-BebDdCkl.js.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-DJ5voqEK.mjs → ComponentConfigurationPage-XdGcgtZh.mjs} +4 -4
  4. package/dist/_chunks/{ComponentConfigurationPage-DJ5voqEK.mjs.map → ComponentConfigurationPage-XdGcgtZh.mjs.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-CZofxSLy.mjs → EditConfigurationPage-DaNf9MoK.mjs} +4 -4
  6. package/dist/_chunks/{EditConfigurationPage-CZofxSLy.mjs.map → EditConfigurationPage-DaNf9MoK.mjs.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-ZN3s568V.js → EditConfigurationPage-sdGi-bna.js} +4 -4
  8. package/dist/_chunks/{EditConfigurationPage-ZN3s568V.js.map → EditConfigurationPage-sdGi-bna.js.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-Co2IKQZH.js → EditViewPage-BRA-JSnw.js} +49 -9
  10. package/dist/_chunks/EditViewPage-BRA-JSnw.js.map +1 -0
  11. package/dist/_chunks/{EditViewPage-HYljoEY7.mjs → EditViewPage-DtbTsNeX.mjs} +50 -10
  12. package/dist/_chunks/EditViewPage-DtbTsNeX.mjs.map +1 -0
  13. package/dist/_chunks/{Field-BOPUMZ1u.mjs → Field-CDmB9zqh.mjs} +107 -44
  14. package/dist/_chunks/Field-CDmB9zqh.mjs.map +1 -0
  15. package/dist/_chunks/{Field-G9CkFUtP.js → Field-DoVRA4co.js} +107 -44
  16. package/dist/_chunks/Field-DoVRA4co.js.map +1 -0
  17. package/dist/_chunks/{Form-crsbkGxI.js → Form-BEh514bg.js} +3 -3
  18. package/dist/_chunks/Form-BEh514bg.js.map +1 -0
  19. package/dist/_chunks/{Form-CDwNp7pU.mjs → Form-Cle2X-4n.mjs} +3 -3
  20. package/dist/_chunks/Form-Cle2X-4n.mjs.map +1 -0
  21. package/dist/_chunks/{History-CWcM9HnW.js → History-BsPXl1XH.js} +40 -97
  22. package/dist/_chunks/History-BsPXl1XH.js.map +1 -0
  23. package/dist/_chunks/{History-BDZrgfZ3.mjs → History-ktAPcvHJ.mjs} +42 -99
  24. package/dist/_chunks/History-ktAPcvHJ.mjs.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-BZ3ScUna.mjs → ListConfigurationPage-BNAS_v2s.mjs} +6 -5
  26. package/dist/_chunks/ListConfigurationPage-BNAS_v2s.mjs.map +1 -0
  27. package/dist/_chunks/{ListConfigurationPage-DGzoQD_I.js → ListConfigurationPage-CN1-7Pgi.js} +5 -4
  28. package/dist/_chunks/ListConfigurationPage-CN1-7Pgi.js.map +1 -0
  29. package/dist/_chunks/{ListViewPage-CsX7tWx-.mjs → ListViewPage-B15c_0Vt.mjs} +17 -6
  30. package/dist/_chunks/{ListViewPage-CsX7tWx-.mjs.map → ListViewPage-B15c_0Vt.mjs.map} +1 -1
  31. package/dist/_chunks/{ListViewPage-BBAC9aPu.js → ListViewPage-BUKFOJuS.js} +17 -6
  32. package/dist/_chunks/ListViewPage-BUKFOJuS.js.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-LClTUPWs.mjs → NoContentTypePage-CAgdmhlo.mjs} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-LClTUPWs.mjs.map → NoContentTypePage-CAgdmhlo.mjs.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-CwVDx_YC.js → NoContentTypePage-Cs7Kk9EW.js} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-CwVDx_YC.js.map → NoContentTypePage-Cs7Kk9EW.js.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-D2iWw-sn.js → NoPermissionsPage-DRPnEq9t.js} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-D2iWw-sn.js.map → NoPermissionsPage-DRPnEq9t.js.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-S4Re3FwO.mjs → NoPermissionsPage-JxX4Y4RJ.mjs} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-S4Re3FwO.mjs.map → NoPermissionsPage-JxX4Y4RJ.mjs.map} +1 -1
  41. package/dist/_chunks/Preview-BKuVG1dV.js +286 -0
  42. package/dist/_chunks/Preview-BKuVG1dV.js.map +1 -0
  43. package/dist/_chunks/Preview-CQlTtbLc.mjs +267 -0
  44. package/dist/_chunks/Preview-CQlTtbLc.mjs.map +1 -0
  45. package/dist/_chunks/{Relations-Dmv0Tpe5.mjs → Relations-DMQ93R3L.mjs} +72 -36
  46. package/dist/_chunks/Relations-DMQ93R3L.mjs.map +1 -0
  47. package/dist/_chunks/{Relations-jwuTFGOV.js → Relations-DTEGSaM_.js} +71 -35
  48. package/dist/_chunks/Relations-DTEGSaM_.js.map +1 -0
  49. package/dist/_chunks/{en-C8YBvRrK.mjs → en-CfIXaZf9.mjs} +20 -9
  50. package/dist/_chunks/{en-C8YBvRrK.mjs.map → en-CfIXaZf9.mjs.map} +1 -1
  51. package/dist/_chunks/{en-BlhnxQfj.js → en-DTWPCdTS.js} +20 -9
  52. package/dist/_chunks/{en-BlhnxQfj.js.map → en-DTWPCdTS.js.map} +1 -1
  53. package/dist/_chunks/{es-EUonQTon.js → es-9K52xZIr.js} +2 -2
  54. package/dist/_chunks/{ja-CcFe8diO.js.map → es-9K52xZIr.js.map} +1 -1
  55. package/dist/_chunks/{es-CeXiYflN.mjs → es-D34tqjMw.mjs} +2 -2
  56. package/dist/_chunks/{es-CeXiYflN.mjs.map → es-D34tqjMw.mjs.map} +1 -1
  57. package/dist/_chunks/{fr-CD9VFbPM.mjs → fr--pg5jUbt.mjs} +13 -3
  58. package/dist/_chunks/{fr-CD9VFbPM.mjs.map → fr--pg5jUbt.mjs.map} +1 -1
  59. package/dist/_chunks/{fr-B7kGGg3E.js → fr-B2Kyv8Z9.js} +13 -3
  60. package/dist/_chunks/{fr-B7kGGg3E.js.map → fr-B2Kyv8Z9.js.map} +1 -1
  61. package/dist/_chunks/{index-BmUAydCA.mjs → index-BdUq-Dtg.mjs} +262 -156
  62. package/dist/_chunks/index-BdUq-Dtg.mjs.map +1 -0
  63. package/dist/_chunks/{index-CBX6KyXv.js → index-DjV7tyGu.js} +258 -151
  64. package/dist/_chunks/index-DjV7tyGu.js.map +1 -0
  65. package/dist/_chunks/{ja-CcFe8diO.js → ja-7sfIbjxE.js} +2 -2
  66. package/dist/_chunks/{es-EUonQTon.js.map → ja-7sfIbjxE.js.map} +1 -1
  67. package/dist/_chunks/{ja-CtsUxOvk.mjs → ja-BHqhDq4V.mjs} +2 -2
  68. package/dist/_chunks/{ja-CtsUxOvk.mjs.map → ja-BHqhDq4V.mjs.map} +1 -1
  69. package/dist/_chunks/{layout-ClP-DC72.mjs → layout-BJ8CpEJu.mjs} +3 -3
  70. package/dist/_chunks/{layout-ClP-DC72.mjs.map → layout-BJ8CpEJu.mjs.map} +1 -1
  71. package/dist/_chunks/{layout-CxxkX9jY.js → layout-Cx9LHtH5.js} +3 -3
  72. package/dist/_chunks/{layout-CxxkX9jY.js.map → layout-Cx9LHtH5.js.map} +1 -1
  73. package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
  74. package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
  75. package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
  76. package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
  77. package/dist/_chunks/{relations-DIjTADIu.js → relations-5bc76OJz.js} +6 -7
  78. package/dist/_chunks/relations-5bc76OJz.js.map +1 -0
  79. package/dist/_chunks/{relations-op89RClB.mjs → relations-BeezTo41.mjs} +6 -7
  80. package/dist/_chunks/relations-BeezTo41.mjs.map +1 -0
  81. package/dist/admin/index.js +1 -1
  82. package/dist/admin/index.mjs +4 -4
  83. package/dist/admin/src/hooks/useDocument.d.ts +2 -0
  84. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
  85. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +2 -2
  86. package/dist/admin/src/pages/EditView/components/Header.d.ts +1 -0
  87. package/dist/admin/src/preview/components/PreviewContent.d.ts +2 -0
  88. package/dist/admin/src/preview/components/PreviewHeader.d.ts +2 -0
  89. package/dist/admin/src/preview/components/PreviewSidePanel.d.ts +3 -0
  90. package/dist/admin/src/preview/constants.d.ts +1 -0
  91. package/dist/admin/src/preview/index.d.ts +4 -0
  92. package/dist/admin/src/preview/pages/Preview.d.ts +11 -0
  93. package/dist/admin/src/preview/routes.d.ts +3 -0
  94. package/dist/admin/src/preview/services/preview.d.ts +3 -0
  95. package/dist/admin/src/router.d.ts +1 -1
  96. package/dist/admin/src/services/documents.d.ts +0 -3
  97. package/dist/server/index.js +371 -158
  98. package/dist/server/index.js.map +1 -1
  99. package/dist/server/index.mjs +371 -158
  100. package/dist/server/index.mjs.map +1 -1
  101. package/dist/server/src/bootstrap.d.ts.map +1 -1
  102. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  103. package/dist/server/src/controllers/index.d.ts.map +1 -1
  104. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  105. package/dist/server/src/controllers/utils/metadata.d.ts +15 -1
  106. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  107. package/dist/server/src/history/services/history.d.ts.map +1 -1
  108. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  109. package/dist/server/src/history/services/utils.d.ts +2 -3
  110. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  111. package/dist/server/src/index.d.ts +4 -4
  112. package/dist/server/src/preview/constants.d.ts +2 -0
  113. package/dist/server/src/preview/constants.d.ts.map +1 -0
  114. package/dist/server/src/preview/controllers/index.d.ts +2 -0
  115. package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
  116. package/dist/server/src/preview/controllers/preview.d.ts +13 -0
  117. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
  118. package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
  119. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
  120. package/dist/server/src/preview/index.d.ts +4 -0
  121. package/dist/server/src/preview/index.d.ts.map +1 -0
  122. package/dist/server/src/preview/routes/index.d.ts +8 -0
  123. package/dist/server/src/preview/routes/index.d.ts.map +1 -0
  124. package/dist/server/src/preview/routes/preview.d.ts +4 -0
  125. package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
  126. package/dist/server/src/preview/services/index.d.ts +15 -0
  127. package/dist/server/src/preview/services/index.d.ts.map +1 -0
  128. package/dist/server/src/preview/services/preview-config.d.ts +30 -0
  129. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
  130. package/dist/server/src/preview/services/preview.d.ts +12 -0
  131. package/dist/server/src/preview/services/preview.d.ts.map +1 -0
  132. package/dist/server/src/preview/utils.d.ts +18 -0
  133. package/dist/server/src/preview/utils.d.ts.map +1 -0
  134. package/dist/server/src/routes/index.d.ts.map +1 -1
  135. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  136. package/dist/server/src/services/document-metadata.d.ts +8 -8
  137. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  138. package/dist/server/src/services/index.d.ts +4 -4
  139. package/dist/server/src/services/index.d.ts.map +1 -1
  140. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  141. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  142. package/dist/server/src/utils/index.d.ts +2 -0
  143. package/dist/server/src/utils/index.d.ts.map +1 -1
  144. package/dist/shared/contracts/index.d.ts +1 -0
  145. package/dist/shared/contracts/index.d.ts.map +1 -1
  146. package/dist/shared/contracts/preview.d.ts +27 -0
  147. package/dist/shared/contracts/preview.d.ts.map +1 -0
  148. package/dist/shared/index.js +4 -0
  149. package/dist/shared/index.js.map +1 -1
  150. package/dist/shared/index.mjs +4 -0
  151. package/dist/shared/index.mjs.map +1 -1
  152. package/package.json +11 -11
  153. package/dist/_chunks/EditViewPage-Co2IKQZH.js.map +0 -1
  154. package/dist/_chunks/EditViewPage-HYljoEY7.mjs.map +0 -1
  155. package/dist/_chunks/Field-BOPUMZ1u.mjs.map +0 -1
  156. package/dist/_chunks/Field-G9CkFUtP.js.map +0 -1
  157. package/dist/_chunks/Form-CDwNp7pU.mjs.map +0 -1
  158. package/dist/_chunks/Form-crsbkGxI.js.map +0 -1
  159. package/dist/_chunks/History-BDZrgfZ3.mjs.map +0 -1
  160. package/dist/_chunks/History-CWcM9HnW.js.map +0 -1
  161. package/dist/_chunks/ListConfigurationPage-BZ3ScUna.mjs.map +0 -1
  162. package/dist/_chunks/ListConfigurationPage-DGzoQD_I.js.map +0 -1
  163. package/dist/_chunks/ListViewPage-BBAC9aPu.js.map +0 -1
  164. package/dist/_chunks/Relations-Dmv0Tpe5.mjs.map +0 -1
  165. package/dist/_chunks/Relations-jwuTFGOV.js.map +0 -1
  166. package/dist/_chunks/index-BmUAydCA.mjs.map +0 -1
  167. package/dist/_chunks/index-CBX6KyXv.js.map +0 -1
  168. package/dist/_chunks/relations-DIjTADIu.js.map +0 -1
  169. package/dist/_chunks/relations-op89RClB.mjs.map +0 -1
@@ -5,16 +5,25 @@ import { Flex, Grid, Box, Main, Tabs } from "@strapi/design-system";
5
5
  import { useIntl } from "react-intl";
6
6
  import { useLocation, useParams } from "react-router-dom";
7
7
  import { styled } from "styled-components";
8
- import { c as useDoc, f as useDocumentRBAC, h as useDocumentLayout, i as createYupSchema, j as Header, g as getTranslation, P as Panels, k as PERMISSIONS, l as DocumentRBAC, S as SINGLE_TYPES } from "./index-BmUAydCA.mjs";
9
- import { M as MemoizedInputRenderer, u as useLazyComponents, c as createDefaultForm, t as transformDocument } from "./Field-BOPUMZ1u.mjs";
8
+ import { c as useDoc, f as useDocumentRBAC, h as useDocumentLayout, i as createYupSchema, j as Header, g as getTranslation, P as Panels, k as PERMISSIONS, l as DocumentRBAC, S as SINGLE_TYPES } from "./index-BdUq-Dtg.mjs";
9
+ import { M as MemoizedInputRenderer, u as useLazyComponents, c as createDefaultForm, t as transformDocument } from "./Field-CDmB9zqh.mjs";
10
10
  const useOnce = (effect) => React.useEffect(effect, emptyDeps);
11
11
  const emptyDeps = [];
12
12
  const FormLayout = ({ layout }) => {
13
+ const { formatMessage } = useIntl();
14
+ const { model } = useDoc();
13
15
  return /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((panel, index) => {
14
16
  if (panel.some((row) => row.some((field) => field.type === "dynamiczone"))) {
15
17
  const [row] = panel;
16
18
  const [field] = row;
17
- return /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: /* @__PURE__ */ jsx(Grid.Item, { col: 12, s: 12, xs: 12, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(MemoizedInputRenderer, { ...field }) }) }, field.name);
19
+ const fieldWithTranslatedLabel = {
20
+ ...field,
21
+ label: formatMessage({
22
+ id: `content-manager.content-types.${model}.${field.name}`,
23
+ defaultMessage: field.label
24
+ })
25
+ };
26
+ return /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: /* @__PURE__ */ jsx(Grid.Item, { col: 12, s: 12, xs: 12, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel }) }) }, field.name);
18
27
  }
19
28
  return /* @__PURE__ */ jsx(
20
29
  Box,
@@ -28,6 +37,13 @@ const FormLayout = ({ layout }) => {
28
37
  paddingBottom: 6,
29
38
  borderColor: "neutral150",
30
39
  children: /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: panel.map((row, gridRowIndex) => /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: row.map(({ size, ...field }) => {
40
+ const fieldWithTranslatedLabel = {
41
+ ...field,
42
+ label: formatMessage({
43
+ id: `content-manager.content-types.${model}.${field.name}`,
44
+ defaultMessage: field.label
45
+ })
46
+ };
31
47
  return /* @__PURE__ */ jsx(
32
48
  Grid.Item,
33
49
  {
@@ -36,7 +52,7 @@ const FormLayout = ({ layout }) => {
36
52
  xs: 12,
37
53
  direction: "column",
38
54
  alignItems: "stretch",
39
- children: /* @__PURE__ */ jsx(MemoizedInputRenderer, { ...field })
55
+ children: /* @__PURE__ */ jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel })
40
56
  },
41
57
  field.name
42
58
  );
@@ -66,7 +82,8 @@ const EditViewPage = () => {
66
82
  components,
67
83
  collectionType,
68
84
  id,
69
- model
85
+ model,
86
+ hasError
70
87
  } = useDoc();
71
88
  const hasDraftAndPublished = schema?.options?.draftAndPublish ?? false;
72
89
  useOnce(() => {
@@ -97,6 +114,9 @@ const EditViewPage = () => {
97
114
  const form = document?.id ? document : createDefaultForm(schema, components);
98
115
  return transformDocument(schema, components)(form);
99
116
  }, [document, isCreatingDocument, isSingleType, schema, components]);
117
+ if (hasError) {
118
+ return /* @__PURE__ */ jsx(Page.Error, {});
119
+ }
100
120
  if (isLoading && !document?.documentId) {
101
121
  return /* @__PURE__ */ jsx(Page.Loading, {});
102
122
  }
@@ -108,16 +128,35 @@ const EditViewPage = () => {
108
128
  setQuery({ status: status2 }, "push", true);
109
129
  }
110
130
  };
111
- const documentTitle = mainField !== "id" && document?.[mainField] ? document[mainField] : "Untitled";
131
+ let documentTitle = "Untitled";
132
+ if (mainField !== "id" && document?.[mainField]) {
133
+ documentTitle = document[mainField];
134
+ } else if (isSingleType && schema?.info.displayName) {
135
+ documentTitle = schema.info.displayName;
136
+ }
137
+ const validateSync = (values, options) => {
138
+ const yupSchema = createYupSchema(schema?.attributes, components, {
139
+ status,
140
+ ...options
141
+ });
142
+ return yupSchema.validateSync(values, { abortEarly: false });
143
+ };
112
144
  return /* @__PURE__ */ jsxs(Main, { paddingLeft: 10, paddingRight: 10, children: [
113
- /* @__PURE__ */ jsx(Page.Title, { children: `${documentTitle}` }),
145
+ /* @__PURE__ */ jsx(Page.Title, { children: documentTitle }),
114
146
  /* @__PURE__ */ jsx(
115
147
  Form,
116
148
  {
117
149
  disabled: hasDraftAndPublished && status === "published",
118
150
  initialValues,
119
151
  method: isCreatingDocument ? "POST" : "PUT",
120
- validationSchema: createYupSchema(schema?.attributes, components, { status }),
152
+ validate: (values, options) => {
153
+ const yupSchema = createYupSchema(schema?.attributes, components, {
154
+ status,
155
+ ...options
156
+ });
157
+ return yupSchema.validate(values, { abortEarly: false });
158
+ },
159
+ initialErrors: location?.state?.forceValidation ? validateSync(initialValues, {}) : {},
121
160
  children: ({ resetForm }) => /* @__PURE__ */ jsxs(Fragment, { children: [
122
161
  /* @__PURE__ */ jsx(
123
162
  Header,
@@ -209,6 +248,7 @@ const ProtectedEditViewPage = () => {
209
248
  };
210
249
  export {
211
250
  EditViewPage,
212
- ProtectedEditViewPage
251
+ ProtectedEditViewPage,
252
+ getDocumentStatus
213
253
  };
214
- //# sourceMappingURL=EditViewPage-HYljoEY7.mjs.map
254
+ //# sourceMappingURL=EditViewPage-DtbTsNeX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditViewPage-DtbTsNeX.mjs","sources":["../../admin/src/hooks/useOnce.ts","../../admin/src/pages/EditView/components/FormLayout.tsx","../../admin/src/pages/EditView/EditViewPage.tsx"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport * as React from 'react';\n\nexport const useOnce = (effect: React.EffectCallback) => React.useEffect(effect, emptyDeps);\n\nconst emptyDeps: React.DependencyList = [];\n","import { Box, Flex, Grid } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { EditLayout } from '../../../hooks/useDocumentLayout';\n\nimport { InputRenderer } from './InputRenderer';\n\ninterface FormLayoutProps extends Pick<EditLayout, 'layout'> {}\n\nconst FormLayout = ({ layout }: FormLayoutProps) => {\n const { formatMessage } = useIntl();\n const { model } = useDoc();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {layout.map((panel, index) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n const fieldWithTranslatedLabel = {\n ...field,\n label: formatMessage({\n id: `content-manager.content-types.${model}.${field.name}`,\n defaultMessage: field.label,\n }),\n };\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer {...fieldWithTranslatedLabel} />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n key={index}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n paddingLeft={6}\n paddingRight={6}\n paddingTop={6}\n paddingBottom={6}\n borderColor=\"neutral150\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row, gridRowIndex) => (\n <Grid.Root key={gridRowIndex} gap={4}>\n {row.map(({ size, ...field }) => {\n const fieldWithTranslatedLabel = {\n ...field,\n label: formatMessage({\n id: `content-manager.content-types.${model}.${field.name}`,\n defaultMessage: field.label,\n }),\n };\n return (\n <Grid.Item\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <InputRenderer {...fieldWithTranslatedLabel} />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n ))}\n </Flex>\n </Box>\n );\n })}\n </Flex>\n );\n};\n\nexport { FormLayout, FormLayoutProps };\n","import * as React from 'react';\n\nimport {\n Page,\n Blocker,\n Form,\n useRBAC,\n useNotification,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { Grid, Main, Tabs } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { SINGLE_TYPES } from '../../constants/collections';\nimport { PERMISSIONS } from '../../constants/plugin';\nimport { DocumentRBAC, useDocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDoc } from '../../hooks/useDocument';\nimport { useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { useLazyComponents } from '../../hooks/useLazyComponents';\nimport { useOnce } from '../../hooks/useOnce';\nimport { getTranslation } from '../../utils/translations';\nimport { createYupSchema } from '../../utils/validation';\n\nimport { FormLayout } from './components/FormLayout';\nimport { Header } from './components/Header';\nimport { Panels } from './components/Panels';\nimport { transformDocument } from './utils/data';\nimport { createDefaultForm } from './utils/forms';\n\n/* -------------------------------------------------------------------------------------------------\n * EditViewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst EditViewPage = () => {\n const location = useLocation();\n const [\n {\n query: { status },\n },\n setQuery,\n ] = useQueryParams<{ status: 'draft' | 'published' }>({\n status: 'draft',\n });\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n\n const {\n document,\n meta,\n isLoading: isLoadingDocument,\n schema,\n components,\n collectionType,\n id,\n model,\n hasError,\n } = useDoc();\n\n const hasDraftAndPublished = schema?.options?.draftAndPublish ?? false;\n\n useOnce(() => {\n /**\n * We only ever want to fire the notification once otherwise\n * whenever the app re-renders it'll pop up regardless of\n * what we do because the state comes from react-router-dom\n */\n if (location?.state && 'error' in location.state) {\n toggleNotification({\n type: 'danger',\n message: location.state.error,\n timeout: 5000,\n });\n }\n });\n\n const isLoadingActionsRBAC = useDocumentRBAC('EditViewPage', (state) => state.isLoading);\n\n const isSingleType = collectionType === SINGLE_TYPES;\n\n /**\n * single-types don't current have an id, but because they're a singleton\n * we can simply use the update operation to continuously update the same\n * document with varying params.\n */\n const isCreatingDocument = !id && !isSingleType;\n\n const {\n isLoading: isLoadingLayout,\n edit: {\n layout,\n settings: { mainField },\n },\n } = useDocumentLayout(model);\n\n const { isLazyLoading } = useLazyComponents([]);\n\n const isLoading = isLoadingActionsRBAC || isLoadingDocument || isLoadingLayout || isLazyLoading;\n\n /**\n * Here we prepare the form for editing, we need to:\n * - remove prohibited fields from the document (passwords | ADD YOURS WHEN THERES A NEW ONE)\n * - swap out count objects on relations for empty arrays\n * - set __temp_key__ on array objects for drag & drop\n *\n * We also prepare the form for new documents, so we need to:\n * - set default values on fields\n */\n const initialValues = React.useMemo(() => {\n if ((!document && !isCreatingDocument && !isSingleType) || !schema) {\n return undefined;\n }\n\n /**\n * Check that we have an ID so we know the\n * document has been created in some way.\n */\n const form = document?.id ? document : createDefaultForm(schema, components);\n\n return transformDocument(schema, components)(form);\n }, [document, isCreatingDocument, isSingleType, schema, components]);\n\n if (hasError) {\n return <Page.Error />;\n }\n\n if (isLoading && !document?.documentId) {\n return <Page.Loading />;\n }\n\n if (!initialValues) {\n return <Page.Error />;\n }\n\n const handleTabChange = (status: string) => {\n if (status === 'published' || status === 'draft') {\n setQuery({ status }, 'push', true);\n }\n };\n\n /**\n * We look to see what the mainField is from the configuration, if it's an id\n * we don't use it because it's a uuid format and not very user friendly.\n * Instead, we display the schema name for single-type documents\n * or \"Untitled\".\n */\n let documentTitle = 'Untitled';\n if (mainField !== 'id' && document?.[mainField]) {\n documentTitle = document[mainField];\n } else if (isSingleType && schema?.info.displayName) {\n documentTitle = schema.info.displayName;\n }\n\n const validateSync = (values: Record<string, unknown>, options: Record<string, string>) => {\n const yupSchema = createYupSchema(schema?.attributes, components, {\n status,\n ...options,\n });\n\n return yupSchema.validateSync(values, { abortEarly: false });\n };\n\n return (\n <Main paddingLeft={10} paddingRight={10}>\n <Page.Title>{documentTitle}</Page.Title>\n <Form\n disabled={hasDraftAndPublished && status === 'published'}\n initialValues={initialValues}\n method={isCreatingDocument ? 'POST' : 'PUT'}\n validate={(values: Record<string, unknown>, options: Record<string, string>) => {\n const yupSchema = createYupSchema(schema?.attributes, components, {\n status,\n ...options,\n });\n\n return yupSchema.validate(values, { abortEarly: false });\n }}\n initialErrors={location?.state?.forceValidation ? validateSync(initialValues, {}) : {}}\n >\n {({ resetForm }) => (\n <>\n <Header\n isCreating={isCreatingDocument}\n status={hasDraftAndPublished ? getDocumentStatus(document, meta) : undefined}\n title={documentTitle}\n />\n <Tabs.Root variant=\"simple\" value={status} onValueChange={handleTabChange}>\n <Tabs.List\n aria-label={formatMessage({\n id: getTranslation('containers.edit.tabs.label'),\n defaultMessage: 'Document status',\n })}\n >\n {hasDraftAndPublished ? (\n <>\n <StatusTab value=\"draft\">\n {formatMessage({\n id: getTranslation('containers.edit.tabs.draft'),\n defaultMessage: 'draft',\n })}\n </StatusTab>\n <StatusTab\n disabled={!meta || meta.availableStatus.length === 0}\n value=\"published\"\n >\n {formatMessage({\n id: getTranslation('containers.edit.tabs.published'),\n defaultMessage: 'published',\n })}\n </StatusTab>\n </>\n ) : null}\n </Tabs.List>\n <Grid.Root paddingTop={8} gap={4}>\n <Grid.Item col={9} s={12} direction=\"column\" alignItems=\"stretch\">\n <Tabs.Content value=\"draft\">\n <FormLayout layout={layout} />\n </Tabs.Content>\n <Tabs.Content value=\"published\">\n <FormLayout layout={layout} />\n </Tabs.Content>\n </Grid.Item>\n <Grid.Item col={3} s={12} direction=\"column\" alignItems=\"stretch\">\n <Panels />\n </Grid.Item>\n </Grid.Root>\n </Tabs.Root>\n <Blocker\n // We reset the form to the published version to avoid errors like – https://strapi-inc.atlassian.net/browse/CONTENT-2284\n onProceed={resetForm}\n />\n </>\n )}\n </Form>\n </Main>\n );\n};\n\nconst StatusTab = styled(Tabs.Trigger)`\n text-transform: uppercase;\n`;\n\n/**\n * @internal\n * @description Returns the status of the document where its latest state takes priority,\n * this typically will be \"published\" unless a user has edited their draft in which we should\n * display \"modified\".\n */\nconst getDocumentStatus = (\n document: ReturnType<UseDocument>['document'],\n meta: ReturnType<UseDocument>['meta']\n): 'draft' | 'published' | 'modified' => {\n const docStatus = document?.status;\n const statuses = meta?.availableStatus ?? [];\n\n /**\n * Creating an entry\n */\n if (!docStatus) {\n return 'draft';\n }\n\n /**\n * We're viewing a draft, but the document could have a published version\n */\n if (docStatus === 'draft' && statuses.find((doc) => doc.publishedAt !== null)) {\n return 'published';\n }\n\n return docStatus;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedEditViewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedEditViewPage = () => {\n const { slug = '' } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC(\n PERMISSIONS.map((action) => ({\n action,\n subject: slug,\n }))\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !slug) {\n return <Page.Error />;\n }\n\n return (\n <Page.Protect permissions={permissions}>\n {({ permissions }) => (\n <DocumentRBAC permissions={permissions}>\n <EditViewPage />\n </DocumentRBAC>\n )}\n </Page.Protect>\n );\n};\n\nexport { EditViewPage, ProtectedEditViewPage, getDocumentStatus };\n"],"names":["InputRenderer","status","permissions"],"mappings":"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"}
@@ -5,15 +5,15 @@ import { useStrapiApp, createContext, useField, useNotification, useForm, useAPI
5
5
  import { Box, SingleSelect, SingleSelectOption, Typography, Flex, BaseLink, Button, Popover, Field, Tooltip, IconButton, useComposedRefs, Portal, FocusTrap, Divider, VisuallyHidden, Grid as Grid$1, Accordion, TextButton, TextInput, IconButtonGroup, Menu, MenuItem } from "@strapi/design-system";
6
6
  import pipe$1 from "lodash/fp/pipe";
7
7
  import { useIntl } from "react-intl";
8
- import { m as DOCUMENT_META_FIELDS, g as getTranslation, c as useDoc, e as contentManagerApi, n as CLONE_PATH, d as buildValidParams, f as useDocumentRBAC, o as useDocLayout } from "./index-BmUAydCA.mjs";
8
+ import { m as DOCUMENT_META_FIELDS, g as getTranslation, c as useDoc, e as contentManagerApi, n as CLONE_PATH, d as buildValidParams, f as useDocumentRBAC, S as SINGLE_TYPES, o as useDocLayout } from "./index-BdUq-Dtg.mjs";
9
9
  import { generateNKeysBetween } from "fractional-indexing";
10
- import { u as useComponent, C as ComponentProvider, M as MemoizedRelationsField } from "./Relations-Dmv0Tpe5.mjs";
10
+ import { u as useComponent, C as ComponentProvider, M as MemoizedRelationsField } from "./Relations-DMQ93R3L.mjs";
11
11
  import { Code, HeadingOne, HeadingTwo, HeadingThree, HeadingFour, HeadingFive, HeadingSix, Image as Image$1, NumberList, BulletList, Paragraph, Quotes, Link as Link$1, Drag, Collapse, Bold, Italic, Underline, StrikeThrough, Expand, PlusCircle, Plus, Trash, EyeStriked, CheckCircle, WarningCircle, Loader, ArrowClockwise, More } from "@strapi/icons";
12
12
  import { styled, css, keyframes } from "styled-components";
13
13
  import { C as ComponentIcon, a as COMPONENT_ICONS } from "./ComponentIcon-u4bIXTFY.mjs";
14
14
  import { getEmptyImage } from "react-dnd-html5-backend";
15
15
  import { a as DIRECTIONS, u as useDragAndDrop, I as ItemTypes } from "./useDragAndDrop-DdHgKsqq.mjs";
16
- import { g as getIn } from "./objects-mKMAmfec.mjs";
16
+ import { g as getIn } from "./objects-D6yBsdmx.mjs";
17
17
  import { Editor as Editor$1, Transforms, Node, Element, Range, Path, Point, createEditor } from "slate";
18
18
  import { withHistory } from "slate-history";
19
19
  import { useFocused, useSelected, ReactEditor, Editable, useSlate, Slate, withReact } from "slate-react";
@@ -2624,7 +2624,7 @@ const Initializer = ({ disabled, name: name2, onClick }) => {
2624
2624
  Box,
2625
2625
  {
2626
2626
  tag: "button",
2627
- background: "neutral100",
2627
+ background: disabled ? "neutral150" : "neutral100",
2628
2628
  borderColor: field.error ? "danger600" : "neutral200",
2629
2629
  hasRadius: true,
2630
2630
  disabled,
@@ -2632,32 +2632,32 @@ const Initializer = ({ disabled, name: name2, onClick }) => {
2632
2632
  paddingTop: 9,
2633
2633
  paddingBottom: 9,
2634
2634
  type: "button",
2635
+ style: { cursor: disabled ? "not-allowed" : "pointer" },
2635
2636
  children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 2, children: [
2636
- /* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(CircleIcon, {}) }),
2637
- /* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(Typography, { textColor: "primary600", variant: "pi", fontWeight: "bold", children: formatMessage({
2638
- id: getTranslation("components.empty-repeatable"),
2639
- defaultMessage: "No entry yet. Click on the button below to add one."
2640
- }) }) })
2637
+ /* @__PURE__ */ jsx(Flex, { justifyContent: "center", color: disabled ? "neutral500" : "primary600", children: /* @__PURE__ */ jsx(PlusCircle, { width: "3.2rem", height: "3.2rem" }) }),
2638
+ /* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(
2639
+ Typography,
2640
+ {
2641
+ textColor: disabled ? "neutral600" : "primary600",
2642
+ variant: "pi",
2643
+ fontWeight: "bold",
2644
+ children: formatMessage({
2645
+ id: getTranslation("components.empty-repeatable"),
2646
+ defaultMessage: "No entry yet. Click to add one."
2647
+ })
2648
+ }
2649
+ ) })
2641
2650
  ] })
2642
2651
  }
2643
2652
  ) });
2644
2653
  };
2645
- const CircleIcon = styled(PlusCircle)`
2646
- width: 2.4rem;
2647
- height: 2.4rem;
2648
- > circle {
2649
- fill: ${({ theme }) => theme.colors.primary200};
2650
- }
2651
- > path {
2652
- fill: ${({ theme }) => theme.colors.primary600};
2653
- }
2654
- `;
2655
2654
  const NonRepeatableComponent = ({
2656
2655
  attribute,
2657
2656
  name: name2,
2658
2657
  children,
2659
2658
  layout
2660
2659
  }) => {
2660
+ const { formatMessage } = useIntl();
2661
2661
  const { value } = useField(name2);
2662
2662
  const level = useComponent("NonRepeatableComponent", (state) => state.level);
2663
2663
  const isNested = level > 0;
@@ -2674,6 +2674,10 @@ const NonRepeatableComponent = ({
2674
2674
  children: /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((row, index) => {
2675
2675
  return /* @__PURE__ */ jsx(Grid$1.Root, { gap: 4, children: row.map(({ size, ...field }) => {
2676
2676
  const completeFieldName = `${name2}.${field.name}`;
2677
+ const translatedLabel = formatMessage({
2678
+ id: `content-manager.components.${attribute.component}.${field.name}`,
2679
+ defaultMessage: field.label
2680
+ });
2677
2681
  return /* @__PURE__ */ jsx(
2678
2682
  Grid$1.Item,
2679
2683
  {
@@ -2682,7 +2686,7 @@ const NonRepeatableComponent = ({
2682
2686
  xs: 12,
2683
2687
  direction: "column",
2684
2688
  alignItems: "stretch",
2685
- children: children({ ...field, name: completeFieldName })
2689
+ children: children({ ...field, label: translatedLabel, name: completeFieldName })
2686
2690
  },
2687
2691
  completeFieldName
2688
2692
  );
@@ -2704,13 +2708,34 @@ const RepeatableComponent = ({
2704
2708
  const { search: searchString } = useLocation();
2705
2709
  const search = React.useMemo(() => new URLSearchParams(searchString), [searchString]);
2706
2710
  const { components } = useDoc();
2707
- const { value = [], error } = useField(name2);
2711
+ const {
2712
+ value = [],
2713
+ error,
2714
+ rawError
2715
+ } = useField(name2);
2708
2716
  const addFieldRow = useForm("RepeatableComponent", (state) => state.addFieldRow);
2709
2717
  const moveFieldRow = useForm("RepeatableComponent", (state) => state.moveFieldRow);
2710
2718
  const removeFieldRow = useForm("RepeatableComponent", (state) => state.removeFieldRow);
2711
2719
  const { max = Infinity } = attribute;
2712
2720
  const [collapseToOpen, setCollapseToOpen] = React.useState("");
2713
2721
  const [liveText, setLiveText] = React.useState("");
2722
+ React.useEffect(() => {
2723
+ const hasNestedErrors = rawError && Array.isArray(rawError) && rawError.length > 0;
2724
+ const hasNestedValue = value && Array.isArray(value) && value.length > 0;
2725
+ if (hasNestedErrors && hasNestedValue) {
2726
+ const errorOpenItems = rawError.map((_, idx) => {
2727
+ return value[idx] ? value[idx].__temp_key__ : null;
2728
+ }).filter((value2) => !!value2);
2729
+ if (errorOpenItems && errorOpenItems.length > 0) {
2730
+ setCollapseToOpen((collapseToOpen2) => {
2731
+ if (!errorOpenItems.includes(collapseToOpen2)) {
2732
+ return errorOpenItems[0];
2733
+ }
2734
+ return collapseToOpen2;
2735
+ });
2736
+ }
2737
+ }
2738
+ }, [rawError, value]);
2714
2739
  const componentTmpKeyWithFocussedField = React.useMemo(() => {
2715
2740
  if (search.has("field")) {
2716
2741
  const fieldParam = search.get("field");
@@ -2863,6 +2888,10 @@ const RepeatableComponent = ({
2863
2888
  children: layout.map((row, index2) => {
2864
2889
  return /* @__PURE__ */ jsx(Grid$1.Root, { gap: 4, children: row.map(({ size, ...field }) => {
2865
2890
  const completeFieldName = `${nameWithIndex}.${field.name}`;
2891
+ const translatedLabel = formatMessage({
2892
+ id: `content-manager.components.${attribute.component}.${field.name}`,
2893
+ defaultMessage: field.label
2894
+ });
2866
2895
  return /* @__PURE__ */ jsx(
2867
2896
  Grid$1.Item,
2868
2897
  {
@@ -2871,7 +2900,11 @@ const RepeatableComponent = ({
2871
2900
  xs: 12,
2872
2901
  direction: "column",
2873
2902
  alignItems: "stretch",
2874
- children: children({ ...field, name: completeFieldName })
2903
+ children: children({
2904
+ ...field,
2905
+ label: translatedLabel,
2906
+ name: completeFieldName
2907
+ })
2875
2908
  },
2876
2909
  completeFieldName
2877
2910
  );
@@ -4925,15 +4958,19 @@ const Wysiwyg = React.forwardRef(
4925
4958
  );
4926
4959
  const MemoizedWysiwyg = React.memo(Wysiwyg);
4927
4960
  const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
4928
- const { id } = useDoc();
4961
+ const { id, document: document2, collectionType } = useDoc();
4929
4962
  const isFormDisabled = useForm("InputRenderer", (state) => state.disabled);
4930
4963
  const isInDynamicZone = useDynamicZone("isInDynamicZone", (state) => state.isInDynamicZone);
4931
4964
  const canCreateFields = useDocumentRBAC("InputRenderer", (rbac) => rbac.canCreateFields);
4932
4965
  const canReadFields = useDocumentRBAC("InputRenderer", (rbac) => rbac.canReadFields);
4933
4966
  const canUpdateFields = useDocumentRBAC("InputRenderer", (rbac) => rbac.canUpdateFields);
4934
4967
  const canUserAction = useDocumentRBAC("InputRenderer", (rbac) => rbac.canUserAction);
4935
- const editableFields = id ? canUpdateFields : canCreateFields;
4936
- const readableFields = id ? canReadFields : canCreateFields;
4968
+ let idToCheck = id;
4969
+ if (collectionType === SINGLE_TYPES) {
4970
+ idToCheck = document2?.documentId;
4971
+ }
4972
+ const editableFields = idToCheck ? canUpdateFields : canCreateFields;
4973
+ const readableFields = idToCheck ? canReadFields : canCreateFields;
4937
4974
  const canUserReadField = canUserAction(props.name, readableFields, props.type);
4938
4975
  const canUserEditField = canUserAction(props.name, editableFields, props.type);
4939
4976
  const fields = useStrapiApp("InputRenderer", (app) => app.fields);
@@ -4944,6 +4981,7 @@ const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
4944
4981
  const {
4945
4982
  edit: { components }
4946
4983
  } = useDocLayout();
4984
+ const field = useField(props.name);
4947
4985
  if (!visible) {
4948
4986
  return null;
4949
4987
  }
@@ -4954,7 +4992,7 @@ const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
4954
4992
  if (attributeHasCustomFieldProperty(props.attribute)) {
4955
4993
  const CustomInput = lazyComponentStore[props.attribute.customField];
4956
4994
  if (CustomInput) {
4957
- return /* @__PURE__ */ jsx(CustomInput, { ...props, hint, disabled: fieldIsDisabled });
4995
+ return /* @__PURE__ */ jsx(CustomInput, { ...props, ...field, hint, disabled: fieldIsDisabled });
4958
4996
  }
4959
4997
  return /* @__PURE__ */ jsx(
4960
4998
  InputRenderer$1,
@@ -5115,6 +5153,14 @@ const DynamicComponent = ({
5115
5153
  React.useEffect(() => {
5116
5154
  dragPreviewRef(getEmptyImage(), { captureDraggingState: false });
5117
5155
  }, [dragPreviewRef, index]);
5156
+ const accordionValue = React.useId();
5157
+ const { value = [], rawError } = useField(`${name2}.${index}`);
5158
+ const [collapseToOpen, setCollapseToOpen] = React.useState("");
5159
+ React.useEffect(() => {
5160
+ if (rawError && value) {
5161
+ setCollapseToOpen(accordionValue);
5162
+ }
5163
+ }, [rawError, value, accordionValue]);
5118
5164
  const composedBoxRefs = useComposedRefs(boxRef, dropRef);
5119
5165
  const accordionActions = disabled ? null : /* @__PURE__ */ jsxs(Fragment, { children: [
5120
5166
  /* @__PURE__ */ jsx(
@@ -5180,10 +5226,9 @@ const DynamicComponent = ({
5180
5226
  ] })
5181
5227
  ] });
5182
5228
  const accordionTitle = title ? `${displayName} ${title}` : displayName;
5183
- const accordionValue = React.useId();
5184
5229
  return /* @__PURE__ */ jsxs(ComponentContainer, { tag: "li", width: "100%", children: [
5185
5230
  /* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(Rectangle, { background: "neutral200" }) }),
5186
- /* @__PURE__ */ jsx(StyledBox, { ref: composedBoxRefs, hasRadius: true, children: isDragging ? /* @__PURE__ */ jsx(Preview, {}) : /* @__PURE__ */ jsx(Accordion.Root, { children: /* @__PURE__ */ jsxs(Accordion.Item, { value: accordionValue, children: [
5231
+ /* @__PURE__ */ jsx(StyledBox, { ref: composedBoxRefs, hasRadius: true, children: isDragging ? /* @__PURE__ */ jsx(Preview, {}) : /* @__PURE__ */ jsx(Accordion.Root, { value: collapseToOpen, onValueChange: setCollapseToOpen, children: /* @__PURE__ */ jsxs(Accordion.Item, { value: accordionValue, children: [
5187
5232
  /* @__PURE__ */ jsxs(Accordion.Header, { children: [
5188
5233
  /* @__PURE__ */ jsx(
5189
5234
  Accordion.Trigger,
@@ -5194,21 +5239,39 @@ const DynamicComponent = ({
5194
5239
  ),
5195
5240
  /* @__PURE__ */ jsx(Accordion.Actions, { children: accordionActions })
5196
5241
  ] }),
5197
- /* @__PURE__ */ jsx(Accordion.Content, { children: /* @__PURE__ */ jsx(AccordionContentRadius, { background: "neutral0", children: /* @__PURE__ */ jsx(Box, { paddingLeft: 6, paddingRight: 6, paddingTop: 6, paddingBottom: 6, children: components[componentUid]?.layout?.map((row, rowInd) => /* @__PURE__ */ jsx(Grid$1.Root, { gap: 4, children: row.map(({ size, ...field }) => {
5198
- const fieldName = `${name2}.${index}.${field.name}`;
5199
- return /* @__PURE__ */ jsx(
5200
- Grid$1.Item,
5201
- {
5202
- col: size,
5203
- s: 12,
5204
- xs: 12,
5205
- direction: "column",
5206
- alignItems: "stretch",
5207
- children: /* @__PURE__ */ jsx(MemoizedInputRenderer, { ...field, name: fieldName })
5208
- },
5209
- fieldName
5210
- );
5211
- }) }, rowInd)) }) }) })
5242
+ /* @__PURE__ */ jsx(Accordion.Content, { children: /* @__PURE__ */ jsx(AccordionContentRadius, { background: "neutral0", children: /* @__PURE__ */ jsx(Box, { paddingLeft: 6, paddingRight: 6, paddingTop: 6, paddingBottom: 6, children: /* @__PURE__ */ jsx(Grid$1.Root, { gap: 4, children: components[componentUid]?.layout?.map((row, rowInd) => /* @__PURE__ */ jsx(
5243
+ Grid$1.Item,
5244
+ {
5245
+ col: 12,
5246
+ s: 12,
5247
+ xs: 12,
5248
+ direction: "column",
5249
+ alignItems: "stretch",
5250
+ children: /* @__PURE__ */ jsx(Grid$1.Root, { gap: 4, children: row.map(({ size, ...field }) => {
5251
+ const fieldName = `${name2}.${index}.${field.name}`;
5252
+ const fieldWithTranslatedLabel = {
5253
+ ...field,
5254
+ label: formatMessage({
5255
+ id: `content-manager.components.${componentUid}.${field.name}`,
5256
+ defaultMessage: field.label
5257
+ })
5258
+ };
5259
+ return /* @__PURE__ */ jsx(
5260
+ Grid$1.Item,
5261
+ {
5262
+ col: size,
5263
+ s: 12,
5264
+ xs: 12,
5265
+ direction: "column",
5266
+ alignItems: "stretch",
5267
+ children: /* @__PURE__ */ jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel, name: fieldName })
5268
+ },
5269
+ fieldName
5270
+ );
5271
+ }) })
5272
+ },
5273
+ rowInd
5274
+ )) }) }) }) })
5212
5275
  ] }) }) })
5213
5276
  ] });
5214
5277
  };
@@ -5516,4 +5579,4 @@ export {
5516
5579
  transformDocument as t,
5517
5580
  useLazyComponents as u
5518
5581
  };
5519
- //# sourceMappingURL=Field-BOPUMZ1u.mjs.map
5582
+ //# sourceMappingURL=Field-CDmB9zqh.mjs.map