@strapi/content-manager 0.0.0-experimental.f49f46a1c17445a39e8af3f63124bcccf73842e6 → 0.0.0-experimental.f6f58027a6338ed795382f2d1c8882158b242361
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/CardDragPreview-C0QyJgRA.js.map +1 -1
- package/dist/_chunks/CardDragPreview-DOxamsuj.mjs.map +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-D3ZWDAHG.mjs → ComponentConfigurationPage-D4H-v0et.mjs} +3 -3
- package/dist/_chunks/{ComponentConfigurationPage-D3ZWDAHG.mjs.map → ComponentConfigurationPage-D4H-v0et.mjs.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-ClKl_TA2.js → ComponentConfigurationPage-DdkVGfXC.js} +4 -5
- package/dist/_chunks/{ComponentConfigurationPage-ClKl_TA2.js.map → ComponentConfigurationPage-DdkVGfXC.js.map} +1 -1
- package/dist/_chunks/{ComponentIcon-BXdiCGQp.js → ComponentIcon-CRbtQEUV.js} +2 -3
- package/dist/_chunks/{ComponentIcon-BXdiCGQp.js.map → ComponentIcon-CRbtQEUV.js.map} +1 -1
- package/dist/_chunks/ComponentIcon-u4bIXTFY.mjs.map +1 -1
- package/dist/_chunks/{EditConfigurationPage-BYCBSJxP.mjs → EditConfigurationPage-D1nvB7Br.mjs} +3 -3
- package/dist/_chunks/{EditConfigurationPage-BYCBSJxP.mjs.map → EditConfigurationPage-D1nvB7Br.mjs.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-OWez0Kxp.js → EditConfigurationPage-LYEvR4fW.js} +4 -5
- package/dist/_chunks/{EditConfigurationPage-OWez0Kxp.js.map → EditConfigurationPage-LYEvR4fW.js.map} +1 -1
- package/dist/_chunks/{EditViewPage-5pdbvsO_.mjs → EditViewPage-Bcnff6Vd.mjs} +11 -74
- package/dist/_chunks/EditViewPage-Bcnff6Vd.mjs.map +1 -0
- package/dist/_chunks/{EditViewPage-BEs5iGDi.js → EditViewPage-DqelJ9UK.js} +14 -78
- package/dist/_chunks/EditViewPage-DqelJ9UK.js.map +1 -0
- package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +1 -1
- package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +1 -1
- package/dist/_chunks/{Form-CoRxWJOz.js → Form-CnHfBeiB.js} +5 -6
- package/dist/_chunks/{Form-CoRxWJOz.js.map → Form-CnHfBeiB.js.map} +1 -1
- package/dist/_chunks/{Form-CGwM_-5c.mjs → Form-CzPCJi3B.mjs} +3 -3
- package/dist/_chunks/{Form-CGwM_-5c.mjs.map → Form-CzPCJi3B.mjs.map} +1 -1
- package/dist/_chunks/{History-DEvr3Q_V.mjs → History-CcmSn3Mj.mjs} +33 -9
- package/dist/_chunks/History-CcmSn3Mj.mjs.map +1 -0
- package/dist/_chunks/{History-BcUTQrfG.js → History-zArjENzj.js} +45 -22
- package/dist/_chunks/History-zArjENzj.js.map +1 -0
- package/dist/_chunks/{Field-DNHm4wHx.js → Input-CDHKQd7o.js} +1321 -1317
- package/dist/_chunks/Input-CDHKQd7o.js.map +1 -0
- package/dist/_chunks/{Field-DcKuFHYK.mjs → Input-aV8SSoTa.mjs} +1235 -1231
- package/dist/_chunks/Input-aV8SSoTa.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-BM4zZZcM.mjs → ListConfigurationPage-BPvzENJJ.mjs} +3 -3
- package/dist/_chunks/{ListConfigurationPage-BM4zZZcM.mjs.map → ListConfigurationPage-BPvzENJJ.mjs.map} +1 -1
- package/dist/_chunks/{ListConfigurationPage-BE_Ho7tV.js → ListConfigurationPage-ByZAO_9H.js} +4 -5
- package/dist/_chunks/{ListConfigurationPage-BE_Ho7tV.js.map → ListConfigurationPage-ByZAO_9H.js.map} +1 -1
- package/dist/_chunks/{ListViewPage-BkT8Eao0.js → ListViewPage-BVKBeQAA.js} +61 -58
- package/dist/_chunks/ListViewPage-BVKBeQAA.js.map +1 -0
- package/dist/_chunks/{ListViewPage-BK2mkrql.mjs → ListViewPage-HljQVnFH.mjs} +55 -51
- package/dist/_chunks/ListViewPage-HljQVnFH.mjs.map +1 -0
- package/dist/_chunks/{NoContentTypePage-C8mtyc4H.js → NoContentTypePage-BV5zfDxr.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-C8mtyc4H.js.map → NoContentTypePage-BV5zfDxr.js.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-BvcAutu9.mjs → NoContentTypePage-BfHaSM-K.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-BvcAutu9.mjs.map → NoContentTypePage-BfHaSM-K.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-BmbRz7PR.mjs → NoPermissionsPage-D6ze2nQL.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-BmbRz7PR.mjs.map → NoPermissionsPage-D6ze2nQL.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-B5Y9Y78B.js → NoPermissionsPage-vdNpc6jb.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-B5Y9Y78B.js.map → NoPermissionsPage-vdNpc6jb.js.map} +1 -1
- package/dist/_chunks/{Preview-BF8ZDYqS.js → Preview-DEHdENT1.js} +35 -16
- package/dist/_chunks/Preview-DEHdENT1.js.map +1 -0
- package/dist/_chunks/{Preview-DcexhKJE.mjs → Preview-vfWOtPG5.mjs} +36 -16
- package/dist/_chunks/Preview-vfWOtPG5.mjs.map +1 -0
- package/dist/_chunks/{Relations-BjIzc4EK.mjs → Relations-B7_hbF0w.mjs} +9 -10
- package/dist/_chunks/Relations-B7_hbF0w.mjs.map +1 -0
- package/dist/_chunks/{Relations-BKnoK1R0.js → Relations-DcoOBejP.js} +10 -12
- package/dist/_chunks/Relations-DcoOBejP.js.map +1 -0
- package/dist/_chunks/{en-DTWPCdTS.js → en-BR48D_RH.js} +11 -3
- package/dist/_chunks/{en-DTWPCdTS.js.map → en-BR48D_RH.js.map} +1 -1
- package/dist/_chunks/{en-CfIXaZf9.mjs → en-D65uIF6Y.mjs} +11 -3
- package/dist/_chunks/{en-CfIXaZf9.mjs.map → en-D65uIF6Y.mjs.map} +1 -1
- package/dist/_chunks/{fr-B2Kyv8Z9.js → fr-C43IbhA_.js} +4 -1
- package/dist/_chunks/{fr-B2Kyv8Z9.js.map → fr-C43IbhA_.js.map} +1 -1
- package/dist/_chunks/{fr--pg5jUbt.mjs → fr-DBseuRuB.mjs} +4 -1
- package/dist/_chunks/{fr--pg5jUbt.mjs.map → fr-DBseuRuB.mjs.map} +1 -1
- package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
- package/dist/_chunks/{index-DOzAG2cq.js → index-CxLSGwnk.js} +482 -188
- package/dist/_chunks/index-CxLSGwnk.js.map +1 -0
- package/dist/_chunks/{index-BW-rXkjn.mjs → index-EH8ZtHd5.mjs} +500 -205
- package/dist/_chunks/index-EH8ZtHd5.mjs.map +1 -0
- package/dist/_chunks/{layout-DFVbgjp2.mjs → layout-CxDMdJ13.mjs} +4 -4
- package/dist/_chunks/{layout-DFVbgjp2.mjs.map → layout-CxDMdJ13.mjs.map} +1 -1
- package/dist/_chunks/{layout-RC3W2obV.js → layout-DSeUTfMv.js} +5 -6
- package/dist/_chunks/{layout-RC3W2obV.js.map → layout-DSeUTfMv.js.map} +1 -1
- package/dist/_chunks/objects-BcXOv6_9.js.map +1 -1
- package/dist/_chunks/objects-D6yBsdmx.mjs.map +1 -1
- package/dist/_chunks/{relations-Dogh8HWI.mjs → relations-B8_Uu38Q.mjs} +17 -3
- package/dist/_chunks/relations-B8_Uu38Q.mjs.map +1 -0
- package/dist/_chunks/{relations-zam7-5H7.js → relations-S5nNKdN3.js} +16 -2
- package/dist/_chunks/relations-S5nNKdN3.js.map +1 -0
- package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
- package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
- package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
- package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
- package/dist/_chunks/{useDebounce-CtcjDB3L.js → usePrev-B9w_-eYc.js} +1 -14
- package/dist/_chunks/usePrev-B9w_-eYc.js.map +1 -0
- package/dist/_chunks/usePrev-DH6iah0A.mjs +16 -0
- package/dist/_chunks/usePrev-DH6iah0A.mjs.map +1 -0
- package/dist/admin/index.js +2 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +6 -5
- package/dist/admin/src/content-manager.d.ts +3 -2
- package/dist/admin/src/exports.d.ts +1 -0
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useDocument.d.ts +19 -2
- package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +27 -0
- package/dist/admin/src/pages/EditView/utils/data.d.ts +1 -0
- package/dist/admin/src/preview/pages/Preview.d.ts +1 -1
- package/dist/admin/src/preview/services/preview.d.ts +1 -1
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/components.d.ts +2 -2
- package/dist/admin/src/services/contentTypes.d.ts +3 -3
- package/dist/admin/src/services/documents.d.ts +16 -19
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +2 -2
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/server/index.js +230 -187
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +231 -187
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
- package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
- package/dist/server/src/history/controllers/history-version.d.ts +1 -1
- package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
- package/dist/server/src/history/services/history.d.ts +3 -3
- package/dist/server/src/history/services/history.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts +6 -10
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +3 -2
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
- package/dist/server/src/preview/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/index.d.ts +1 -0
- package/dist/server/src/preview/services/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview-config.d.ts +2 -0
- package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
- package/dist/server/src/preview/utils.d.ts +1 -0
- package/dist/server/src/preview/utils.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts +4 -2
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +3 -2
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
- package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
- package/dist/server/src/services/utils/populate.d.ts +2 -2
- package/dist/server/src/services/utils/populate.d.ts.map +1 -1
- package/package.json +11 -10
- package/dist/_chunks/EditViewPage-5pdbvsO_.mjs.map +0 -1
- package/dist/_chunks/EditViewPage-BEs5iGDi.js.map +0 -1
- package/dist/_chunks/Field-DNHm4wHx.js.map +0 -1
- package/dist/_chunks/Field-DcKuFHYK.mjs.map +0 -1
- package/dist/_chunks/History-BcUTQrfG.js.map +0 -1
- package/dist/_chunks/History-DEvr3Q_V.mjs.map +0 -1
- package/dist/_chunks/ListViewPage-BK2mkrql.mjs.map +0 -1
- package/dist/_chunks/ListViewPage-BkT8Eao0.js.map +0 -1
- package/dist/_chunks/Preview-BF8ZDYqS.js.map +0 -1
- package/dist/_chunks/Preview-DcexhKJE.mjs.map +0 -1
- package/dist/_chunks/Relations-BKnoK1R0.js.map +0 -1
- package/dist/_chunks/Relations-BjIzc4EK.mjs.map +0 -1
- package/dist/_chunks/index-BW-rXkjn.mjs.map +0 -1
- package/dist/_chunks/index-DOzAG2cq.js.map +0 -1
- package/dist/_chunks/relations-Dogh8HWI.mjs.map +0 -1
- package/dist/_chunks/relations-zam7-5H7.js.map +0 -1
- package/dist/_chunks/useDebounce-CtcjDB3L.js.map +0 -1
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs +0 -29
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +0 -1
- package/dist/admin/src/preview/constants.d.ts +0 -1
- package/dist/server/src/preview/constants.d.ts +0 -2
- package/dist/server/src/preview/constants.d.ts.map +0 -1
@@ -3,23 +3,74 @@ 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-DOzAG2cq.js");
|
9
|
-
const fractionalIndexing = require("fractional-indexing");
|
10
|
-
const Relations = require("./Relations-BKnoK1R0.js");
|
11
6
|
const Icons = require("@strapi/icons");
|
7
|
+
const reactIntl = require("react-intl");
|
8
|
+
const index = require("./index-CxLSGwnk.js");
|
12
9
|
const styledComponents = require("styled-components");
|
13
|
-
const ComponentIcon = require("./ComponentIcon-BXdiCGQp.js");
|
14
|
-
const reactDndHtml5Backend = require("react-dnd-html5-backend");
|
15
|
-
const useDragAndDrop = require("./useDragAndDrop-J0TUUbR6.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
|
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-B9w_-eYc.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-DcoOBejP.js");
|
71
|
+
const pipe$1 = require("lodash/fp/pipe");
|
72
|
+
const ComponentIcon = require("./ComponentIcon-CRbtQEUV.js");
|
73
|
+
const relations = require("./relations-S5nNKdN3.js");
|
23
74
|
const CodeMirror = require("codemirror5");
|
24
75
|
const sanitizeHtml = require("sanitize-html");
|
25
76
|
const highlight_js = require("highlight.js");
|
@@ -37,8 +88,7 @@ require("highlight.js/styles/solarized-dark.css");
|
|
37
88
|
require("codemirror5/addon/display/placeholder");
|
38
89
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
39
90
|
function _interopNamespace(e) {
|
40
|
-
if (e && e.__esModule)
|
41
|
-
return e;
|
91
|
+
if (e && e.__esModule) return e;
|
42
92
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
43
93
|
if (e) {
|
44
94
|
for (const k in e) {
|
@@ -55,8 +105,9 @@ function _interopNamespace(e) {
|
|
55
105
|
return Object.freeze(n);
|
56
106
|
}
|
57
107
|
const React__namespace = /* @__PURE__ */ _interopNamespace(React);
|
58
|
-
const
|
108
|
+
const Prism__namespace = /* @__PURE__ */ _interopNamespace(Prism);
|
59
109
|
const Toolbar__namespace = /* @__PURE__ */ _interopNamespace(Toolbar);
|
110
|
+
const pipe__default = /* @__PURE__ */ _interopDefault(pipe$1);
|
60
111
|
const CodeMirror__default = /* @__PURE__ */ _interopDefault(CodeMirror);
|
61
112
|
const sanitizeHtml__default = /* @__PURE__ */ _interopDefault(sanitizeHtml);
|
62
113
|
const Markdown__default = /* @__PURE__ */ _interopDefault(Markdown);
|
@@ -69,93 +120,6 @@ const ins__default = /* @__PURE__ */ _interopDefault(ins);
|
|
69
120
|
const mark__default = /* @__PURE__ */ _interopDefault(mark);
|
70
121
|
const sub__default = /* @__PURE__ */ _interopDefault(sub);
|
71
122
|
const sup__default = /* @__PURE__ */ _interopDefault(sup);
|
72
|
-
const BLOCK_LIST_ATTRIBUTE_KEYS = ["__component", "__temp_key__"];
|
73
|
-
const traverseData = (predicate, transform) => (schema, components = {}) => (data = {}) => {
|
74
|
-
const traverse = (datum, attributes) => {
|
75
|
-
return Object.entries(datum).reduce((acc, [key, value]) => {
|
76
|
-
const attribute = attributes[key];
|
77
|
-
if (BLOCK_LIST_ATTRIBUTE_KEYS.includes(key) || value === null || value === void 0) {
|
78
|
-
acc[key] = value;
|
79
|
-
return acc;
|
80
|
-
}
|
81
|
-
if (attribute.type === "component") {
|
82
|
-
if (attribute.repeatable) {
|
83
|
-
const componentValue = predicate(attribute, value) ? transform(value, attribute) : value;
|
84
|
-
acc[key] = componentValue.map(
|
85
|
-
(componentData) => traverse(componentData, components[attribute.component]?.attributes ?? {})
|
86
|
-
);
|
87
|
-
} else {
|
88
|
-
const componentValue = predicate(attribute, value) ? transform(value, attribute) : value;
|
89
|
-
acc[key] = traverse(componentValue, components[attribute.component]?.attributes ?? {});
|
90
|
-
}
|
91
|
-
} else if (attribute.type === "dynamiczone") {
|
92
|
-
const dynamicZoneValue = predicate(attribute, value) ? transform(value, attribute) : value;
|
93
|
-
acc[key] = dynamicZoneValue.map(
|
94
|
-
(componentData) => traverse(componentData, components[componentData.__component]?.attributes ?? {})
|
95
|
-
);
|
96
|
-
} else if (predicate(attribute, value)) {
|
97
|
-
acc[key] = transform(value, attribute);
|
98
|
-
} else {
|
99
|
-
acc[key] = value;
|
100
|
-
}
|
101
|
-
return acc;
|
102
|
-
}, {});
|
103
|
-
};
|
104
|
-
return traverse(data, schema.attributes);
|
105
|
-
};
|
106
|
-
const removeProhibitedFields = (prohibitedFields) => traverseData(
|
107
|
-
(attribute) => prohibitedFields.includes(attribute.type),
|
108
|
-
() => ""
|
109
|
-
);
|
110
|
-
const prepareRelations = traverseData(
|
111
|
-
(attribute) => attribute.type === "relation",
|
112
|
-
() => ({
|
113
|
-
connect: [],
|
114
|
-
disconnect: []
|
115
|
-
})
|
116
|
-
);
|
117
|
-
const prepareTempKeys = traverseData(
|
118
|
-
(attribute) => attribute.type === "component" && attribute.repeatable || attribute.type === "dynamiczone",
|
119
|
-
(data) => {
|
120
|
-
if (Array.isArray(data) && data.length > 0) {
|
121
|
-
const keys = fractionalIndexing.generateNKeysBetween(void 0, void 0, data.length);
|
122
|
-
return data.map((datum, index2) => ({
|
123
|
-
...datum,
|
124
|
-
__temp_key__: keys[index2]
|
125
|
-
}));
|
126
|
-
}
|
127
|
-
return data;
|
128
|
-
}
|
129
|
-
);
|
130
|
-
const removeFieldsThatDontExistOnSchema = (schema) => (data) => {
|
131
|
-
const schemaKeys = Object.keys(schema.attributes);
|
132
|
-
const dataKeys = Object.keys(data);
|
133
|
-
const keysToRemove = dataKeys.filter((key) => !schemaKeys.includes(key));
|
134
|
-
const revisedData = [...keysToRemove, ...index.DOCUMENT_META_FIELDS].reduce((acc, key) => {
|
135
|
-
delete acc[key];
|
136
|
-
return acc;
|
137
|
-
}, structuredClone(data));
|
138
|
-
return revisedData;
|
139
|
-
};
|
140
|
-
const removeNullValues = (data) => {
|
141
|
-
return Object.entries(data).reduce((acc, [key, value]) => {
|
142
|
-
if (value === null) {
|
143
|
-
return acc;
|
144
|
-
}
|
145
|
-
acc[key] = value;
|
146
|
-
return acc;
|
147
|
-
}, {});
|
148
|
-
};
|
149
|
-
const transformDocument = (schema, components = {}) => (document2) => {
|
150
|
-
const transformations = pipe__default.default(
|
151
|
-
removeFieldsThatDontExistOnSchema(schema),
|
152
|
-
removeProhibitedFields(["password"])(schema, components),
|
153
|
-
removeNullValues,
|
154
|
-
prepareRelations(schema, components),
|
155
|
-
prepareTempKeys(schema, components)
|
156
|
-
);
|
157
|
-
return transformations(document2);
|
158
|
-
};
|
159
123
|
const componentStore = /* @__PURE__ */ new Map();
|
160
124
|
const useLazyComponents = (componentUids = []) => {
|
161
125
|
const [lazyComponentStore, setLazyComponentStore] = React.useState(Object.fromEntries(componentStore));
|
@@ -197,7 +161,8 @@ const useLazyComponents = (componentUids = []) => {
|
|
197
161
|
const codeLanguages = [
|
198
162
|
{
|
199
163
|
value: "asm",
|
200
|
-
label: "Assembly"
|
164
|
+
label: "Assembly",
|
165
|
+
decorate: "asmatmel"
|
201
166
|
},
|
202
167
|
{
|
203
168
|
value: "bash",
|
@@ -233,7 +198,8 @@ const codeLanguages = [
|
|
233
198
|
},
|
234
199
|
{
|
235
200
|
value: "dockerfile",
|
236
|
-
label: "Dockerfile"
|
201
|
+
label: "Dockerfile",
|
202
|
+
decorate: "docker"
|
237
203
|
},
|
238
204
|
{
|
239
205
|
value: "elixir",
|
@@ -389,7 +355,8 @@ const codeLanguages = [
|
|
389
355
|
},
|
390
356
|
{
|
391
357
|
value: "typescript",
|
392
|
-
label: "TypeScript"
|
358
|
+
label: "TypeScript",
|
359
|
+
decorate: "ts"
|
393
360
|
},
|
394
361
|
{
|
395
362
|
value: "tsx",
|
@@ -405,7 +372,8 @@ const codeLanguages = [
|
|
405
372
|
},
|
406
373
|
{
|
407
374
|
value: "yaml",
|
408
|
-
label: "YAML"
|
375
|
+
label: "YAML",
|
376
|
+
decorate: "yml"
|
409
377
|
}
|
410
378
|
];
|
411
379
|
const baseHandleConvert = (editor, attributesToSet) => {
|
@@ -471,6 +439,29 @@ const pressEnterTwiceToExit = (editor) => {
|
|
471
439
|
});
|
472
440
|
}
|
473
441
|
};
|
442
|
+
const decorateCode = ([node, path]) => {
|
443
|
+
const ranges = [];
|
444
|
+
if (!slate.Element.isElement(node) || node.type !== "code") return ranges;
|
445
|
+
const text = slate.Node.string(node);
|
446
|
+
const language = codeLanguages.find((lang) => lang.value === node.language);
|
447
|
+
const decorateKey = language?.decorate ?? language?.value;
|
448
|
+
const selectedLanguage = Prism__namespace.languages[decorateKey || "plaintext"];
|
449
|
+
const tokens = Prism__namespace.tokenize(text, selectedLanguage);
|
450
|
+
let start = 0;
|
451
|
+
for (const token of tokens) {
|
452
|
+
const length = token.length;
|
453
|
+
const end = start + length;
|
454
|
+
if (typeof token !== "string") {
|
455
|
+
ranges.push({
|
456
|
+
anchor: { path, offset: start },
|
457
|
+
focus: { path, offset: end },
|
458
|
+
className: `token ${token.type}`
|
459
|
+
});
|
460
|
+
}
|
461
|
+
start = end;
|
462
|
+
}
|
463
|
+
return ranges;
|
464
|
+
};
|
474
465
|
const CodeBlock = styledComponents.styled.pre`
|
475
466
|
border-radius: ${({ theme }) => theme.borderRadius};
|
476
467
|
background-color: ${({ theme }) => theme.colors.neutral100};
|
@@ -542,7 +533,7 @@ const CodeEditor = (props) => {
|
|
542
533
|
const codeBlocks = {
|
543
534
|
code: {
|
544
535
|
renderElement: (props) => /* @__PURE__ */ jsxRuntime.jsx(CodeEditor, { ...props }),
|
545
|
-
icon: Icons.
|
536
|
+
icon: Icons.CodeBlock,
|
546
537
|
label: {
|
547
538
|
id: "components.Blocks.blocks.code",
|
548
539
|
defaultMessage: "Code block"
|
@@ -555,8 +546,7 @@ const codeBlocks = {
|
|
555
546
|
handleEnterKey(editor) {
|
556
547
|
pressEnterTwiceToExit(editor);
|
557
548
|
},
|
558
|
-
snippets: ["```"]
|
559
|
-
dragHandleTopMargin: "10px"
|
549
|
+
snippets: ["```"]
|
560
550
|
}
|
561
551
|
};
|
562
552
|
const H1 = styledComponents.styled(designSystem.Typography).attrs({ tag: "h1" })`
|
@@ -731,8 +721,7 @@ const ImageDialog = () => {
|
|
731
721
|
const [isOpen, setIsOpen] = React__namespace.useState(true);
|
732
722
|
const { editor } = useBlocksEditorContext("ImageDialog");
|
733
723
|
const components = strapiAdmin.useStrapiApp("ImageDialog", (state) => state.components);
|
734
|
-
if (!components || !isOpen)
|
735
|
-
return null;
|
724
|
+
if (!components || !isOpen) return null;
|
736
725
|
const MediaLibraryDialog = components["media-library"];
|
737
726
|
const insertImages = (images) => {
|
738
727
|
slate.Transforms.unwrapNodes(editor, {
|
@@ -741,14 +730,12 @@ const ImageDialog = () => {
|
|
741
730
|
});
|
742
731
|
const nodeEntryBeingReplaced = slate.Editor.above(editor, {
|
743
732
|
match(node) {
|
744
|
-
if (slate.Editor.isEditor(node))
|
745
|
-
return false;
|
733
|
+
if (slate.Editor.isEditor(node)) return false;
|
746
734
|
const isInlineNode = ["text", "link"].includes(node.type);
|
747
735
|
return !isInlineNode;
|
748
736
|
}
|
749
737
|
});
|
750
|
-
if (!nodeEntryBeingReplaced)
|
751
|
-
return;
|
738
|
+
if (!nodeEntryBeingReplaced) return;
|
752
739
|
const [, pathToInsert] = nodeEntryBeingReplaced;
|
753
740
|
slate.Transforms.removeNodes(editor);
|
754
741
|
const nodesToInsert = images.map((image) => {
|
@@ -768,7 +755,7 @@ const ImageDialog = () => {
|
|
768
755
|
const nodeImage = {
|
769
756
|
...expectedImage,
|
770
757
|
alternativeText: expectedImage.alternativeText || expectedImage.name,
|
771
|
-
url:
|
758
|
+
url: usePrev.prefixFileUrlWithBackendUrl(image.url)
|
772
759
|
};
|
773
760
|
return nodeImage;
|
774
761
|
});
|
@@ -926,8 +913,7 @@ const LinkContent = React__namespace.forwardRef(
|
|
926
913
|
slateReact.ReactEditor.focus(editor);
|
927
914
|
};
|
928
915
|
React__namespace.useEffect(() => {
|
929
|
-
if (popoverOpen)
|
930
|
-
linkInputRef.current?.focus();
|
916
|
+
if (popoverOpen) linkInputRef.current?.focus();
|
931
917
|
}, [popoverOpen]);
|
932
918
|
const inputNotDirty = !linkText || !linkUrl || link.url && link.url === linkUrl && elementText && elementText === linkText;
|
933
919
|
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Popover.Root, { open: popoverOpen, children: [
|
@@ -997,11 +983,11 @@ const LinkContent = React__namespace.forwardRef(
|
|
997
983
|
),
|
998
984
|
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
|
999
985
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", onClick: handleClose, children: formatMessage({
|
1000
|
-
id: "
|
986
|
+
id: "global.cancel",
|
1001
987
|
defaultMessage: "Cancel"
|
1002
988
|
}) }),
|
1003
989
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { disabled: Boolean(inputNotDirty) || isSaveDisabled, onClick: handleSave, children: formatMessage({
|
1004
|
-
id: "
|
990
|
+
id: "global.save",
|
1005
991
|
defaultMessage: "Save"
|
1006
992
|
}) })
|
1007
993
|
] })
|
@@ -1082,8 +1068,7 @@ const isText$1 = (node) => {
|
|
1082
1068
|
return slate.Node.isNode(node) && !slate.Editor.isEditor(node) && node.type === "text";
|
1083
1069
|
};
|
1084
1070
|
const handleBackspaceKeyOnList = (editor, event) => {
|
1085
|
-
if (!editor.selection)
|
1086
|
-
return;
|
1071
|
+
if (!editor.selection) return;
|
1087
1072
|
const [currentListItem, currentListItemPath] = slate.Editor.parent(editor, editor.selection.anchor);
|
1088
1073
|
const [currentList, currentListPath] = slate.Editor.parent(editor, currentListItemPath);
|
1089
1074
|
const isListEmpty = currentList.children.length === 1 && isText$1(currentListItem.children[0]) && currentListItem.children[0].text === "";
|
@@ -1192,8 +1177,7 @@ const handleEnterKeyOnList = (editor) => {
|
|
1192
1177
|
};
|
1193
1178
|
const handleConvertToList = (editor, format) => {
|
1194
1179
|
const convertedPath = baseHandleConvert(editor, { type: "list-item" });
|
1195
|
-
if (!convertedPath)
|
1196
|
-
return;
|
1180
|
+
if (!convertedPath) return;
|
1197
1181
|
slate.Transforms.wrapNodes(editor, { type: "list", format, children: [] }, { at: convertedPath });
|
1198
1182
|
};
|
1199
1183
|
const handleTabOnList = (editor) => {
|
@@ -1205,8 +1189,7 @@ const handleTabOnList = (editor) => {
|
|
1205
1189
|
}
|
1206
1190
|
const [currentListItem, currentListItemPath] = currentListItemEntry;
|
1207
1191
|
const [currentList] = slate.Editor.parent(editor, currentListItemPath);
|
1208
|
-
if (currentListItem === currentList.children[0])
|
1209
|
-
return;
|
1192
|
+
if (currentListItem === currentList.children[0]) return;
|
1210
1193
|
const currentListItemIndex = currentList.children.findIndex((item) => item === currentListItem);
|
1211
1194
|
const previousNode = currentList.children[currentListItemIndex - 1];
|
1212
1195
|
if (previousNode.type === "list") {
|
@@ -1342,13 +1325,13 @@ const quoteBlocks = {
|
|
1342
1325
|
handleEnterKey(editor) {
|
1343
1326
|
pressEnterTwiceToExit(editor);
|
1344
1327
|
},
|
1345
|
-
snippets: [">"]
|
1346
|
-
dragHandleTopMargin: "6px"
|
1328
|
+
snippets: [">"]
|
1347
1329
|
}
|
1348
1330
|
};
|
1349
1331
|
const ToolbarWrapper = styledComponents.styled(designSystem.Flex)`
|
1350
1332
|
&[aria-disabled='true'] {
|
1351
1333
|
cursor: not-allowed;
|
1334
|
+
background: ${({ theme }) => theme.colors.neutral150};
|
1352
1335
|
}
|
1353
1336
|
`;
|
1354
1337
|
const Separator = styledComponents.styled(Toolbar__namespace.Separator)`
|
@@ -1359,7 +1342,7 @@ const Separator = styledComponents.styled(Toolbar__namespace.Separator)`
|
|
1359
1342
|
const FlexButton = styledComponents.styled(designSystem.Flex)`
|
1360
1343
|
// Inherit the not-allowed cursor from ToolbarWrapper when disabled
|
1361
1344
|
&[aria-disabled] {
|
1362
|
-
cursor:
|
1345
|
+
cursor: not-allowed;
|
1363
1346
|
}
|
1364
1347
|
|
1365
1348
|
&[aria-disabled='false'] {
|
@@ -1573,8 +1556,7 @@ const isListNode = (node) => {
|
|
1573
1556
|
const ListButton = ({ block, format }) => {
|
1574
1557
|
const { editor, disabled, blocks } = useBlocksEditorContext("ListButton");
|
1575
1558
|
const isListActive = () => {
|
1576
|
-
if (!editor.selection)
|
1577
|
-
return false;
|
1559
|
+
if (!editor.selection) return false;
|
1578
1560
|
const currentListEntry = slate.Editor.above(editor, {
|
1579
1561
|
match: (node) => !slate.Editor.isEditor(node) && node.type === "list",
|
1580
1562
|
at: editor.selection.anchor
|
@@ -1648,8 +1630,7 @@ const LinkButton = ({ disabled }) => {
|
|
1648
1630
|
const { editor } = useBlocksEditorContext("LinkButton");
|
1649
1631
|
const isLinkActive = () => {
|
1650
1632
|
const { selection } = editor;
|
1651
|
-
if (!selection)
|
1652
|
-
return false;
|
1633
|
+
if (!selection) return false;
|
1653
1634
|
const [match] = Array.from(
|
1654
1635
|
slate.Editor.nodes(editor, {
|
1655
1636
|
at: slate.Editor.unhangRange(editor, selection),
|
@@ -1713,7 +1694,7 @@ const BlocksToolbar = () => {
|
|
1713
1694
|
return false;
|
1714
1695
|
};
|
1715
1696
|
const isButtonDisabled = checkButtonDisabled();
|
1716
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Toolbar__namespace.Root, { "aria-disabled": disabled, asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarWrapper, { gap: 2, padding: 2, children: [
|
1697
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Toolbar__namespace.Root, { "aria-disabled": disabled, asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarWrapper, { gap: 2, padding: 2, width: "100%", children: [
|
1717
1698
|
/* @__PURE__ */ jsxRuntime.jsx(BlocksDropdown, {}),
|
1718
1699
|
/* @__PURE__ */ jsxRuntime.jsx(Separator, {}),
|
1719
1700
|
/* @__PURE__ */ jsxRuntime.jsx(Toolbar__namespace.ToggleGroup, { type: "multiple", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 1, children: [
|
@@ -1787,30 +1768,32 @@ const DragIconButton = styledComponents.styled(designSystem.IconButton)`
|
|
1787
1768
|
display: flex;
|
1788
1769
|
align-items: center;
|
1789
1770
|
justify-content: center;
|
1771
|
+
border: none;
|
1790
1772
|
border-radius: ${({ theme }) => theme.borderRadius};
|
1791
|
-
|
1792
|
-
|
1773
|
+
padding-left: ${({ theme }) => theme.spaces[0]};
|
1774
|
+
padding-right: ${({ theme }) => theme.spaces[0]};
|
1775
|
+
padding-top: ${({ theme }) => theme.spaces[1]};
|
1776
|
+
padding-bottom: ${({ theme }) => theme.spaces[1]};
|
1793
1777
|
visibility: hidden;
|
1794
1778
|
cursor: grab;
|
1795
1779
|
opacity: inherit;
|
1796
1780
|
margin-top: ${(props) => props.$dragHandleTopMargin ?? 0};
|
1797
1781
|
|
1798
1782
|
&:hover {
|
1799
|
-
background: ${({ theme }) => theme.colors.
|
1783
|
+
background: ${({ theme }) => theme.colors.neutral100};
|
1800
1784
|
}
|
1801
1785
|
&:active {
|
1802
1786
|
cursor: grabbing;
|
1787
|
+
background: ${({ theme }) => theme.colors.neutral150};
|
1803
1788
|
}
|
1804
1789
|
&[aria-disabled='true'] {
|
1805
|
-
|
1806
|
-
background: transparent;
|
1790
|
+
visibility: hidden;
|
1807
1791
|
}
|
1808
1792
|
svg {
|
1809
|
-
height: auto;
|
1810
1793
|
min-width: ${({ theme }) => theme.spaces[3]};
|
1811
1794
|
|
1812
1795
|
path {
|
1813
|
-
fill: ${({ theme }) => theme.colors.
|
1796
|
+
fill: ${({ theme }) => theme.colors.neutral500};
|
1814
1797
|
}
|
1815
1798
|
}
|
1816
1799
|
`;
|
@@ -1855,8 +1838,7 @@ const DragAndDropElement = ({
|
|
1855
1838
|
displayedValue: children
|
1856
1839
|
},
|
1857
1840
|
onDropItem(currentIndex, newIndex) {
|
1858
|
-
if (newIndex)
|
1859
|
-
handleMoveBlock(newIndex, currentIndex);
|
1841
|
+
if (newIndex) handleMoveBlock(newIndex, currentIndex);
|
1860
1842
|
}
|
1861
1843
|
});
|
1862
1844
|
const composedBoxRefs = designSystem.useComposedRefs(blockRef, dropRef);
|
@@ -1962,7 +1944,7 @@ const baseRenderLeaf = (props, modifiers2) => {
|
|
1962
1944
|
}
|
1963
1945
|
return currentChildren;
|
1964
1946
|
}, props.children);
|
1965
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { ...props.attributes, children: wrappedChildren });
|
1947
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { ...props.attributes, className: props.leaf.className, children: wrappedChildren });
|
1966
1948
|
};
|
1967
1949
|
const baseRenderElement = ({
|
1968
1950
|
props,
|
@@ -2000,8 +1982,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
|
|
2000
1982
|
[modifiers2]
|
2001
1983
|
);
|
2002
1984
|
const handleMoveBlocks = (editor2, event) => {
|
2003
|
-
if (!editor2.selection)
|
2004
|
-
return;
|
1985
|
+
if (!editor2.selection) return;
|
2005
1986
|
const start = slate.Range.start(editor2.selection);
|
2006
1987
|
const currentIndex = [start.path[0]];
|
2007
1988
|
let newIndexPosition = 0;
|
@@ -2138,8 +2119,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
|
|
2138
2119
|
}
|
2139
2120
|
};
|
2140
2121
|
const handleScrollSelectionIntoView = () => {
|
2141
|
-
if (!editor.selection)
|
2142
|
-
return;
|
2122
|
+
if (!editor.selection) return;
|
2143
2123
|
const domRange = slateReact.ReactEditor.toDOMRange(editor, editor.selection);
|
2144
2124
|
const domRect = domRange.getBoundingClientRect();
|
2145
2125
|
const blocksInput = blocksRef.current;
|
@@ -2166,7 +2146,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
|
|
2166
2146
|
background: "neutral0",
|
2167
2147
|
color: "neutral800",
|
2168
2148
|
lineHeight: 6,
|
2169
|
-
paddingRight:
|
2149
|
+
paddingRight: 7,
|
2170
2150
|
paddingTop: 6,
|
2171
2151
|
paddingBottom: 3,
|
2172
2152
|
children: [
|
@@ -2177,6 +2157,7 @@ const BlocksContent = ({ placeholder, ariaLabelId }) => {
|
|
2177
2157
|
readOnly: disabled,
|
2178
2158
|
placeholder,
|
2179
2159
|
isExpandedMode,
|
2160
|
+
decorate: decorateCode,
|
2180
2161
|
renderElement,
|
2181
2162
|
renderLeaf,
|
2182
2163
|
onKeyDown: handleKeyDown,
|
@@ -2333,8 +2314,7 @@ const InlineCode = styledComponents.styled.code`
|
|
2333
2314
|
`;
|
2334
2315
|
const baseCheckIsActive = (editor, name2) => {
|
2335
2316
|
const marks = slate.Editor.marks(editor);
|
2336
|
-
if (!marks)
|
2337
|
-
return false;
|
2317
|
+
if (!marks) return false;
|
2338
2318
|
return Boolean(marks[name2]);
|
2339
2319
|
};
|
2340
2320
|
const baseHandleToggle = (editor, name2) => {
|
@@ -2500,6 +2480,7 @@ const ExpandIconButton = styledComponents.styled(designSystem.IconButton)`
|
|
2500
2480
|
position: absolute;
|
2501
2481
|
bottom: 1.2rem;
|
2502
2482
|
right: 1.2rem;
|
2483
|
+
box-shadow: ${({ theme }) => theme.shadows.filterShadow};
|
2503
2484
|
`;
|
2504
2485
|
function useResetKey(value) {
|
2505
2486
|
const slateUpdatesCount = React__namespace.useRef(0);
|
@@ -2631,26 +2612,6 @@ const BlocksInput = React__namespace.forwardRef(
|
|
2631
2612
|
}
|
2632
2613
|
);
|
2633
2614
|
const MemoizedBlocksInput = React__namespace.memo(BlocksInput);
|
2634
|
-
const createDefaultForm = (contentType, components = {}) => {
|
2635
|
-
const traverseSchema = (attributes) => {
|
2636
|
-
return Object.entries(attributes).reduce((acc, [key, attribute]) => {
|
2637
|
-
if ("default" in attribute) {
|
2638
|
-
acc[key] = attribute.default;
|
2639
|
-
} else if (attribute.type === "component" && attribute.required) {
|
2640
|
-
const defaultComponentForm = traverseSchema(components[attribute.component].attributes);
|
2641
|
-
if (attribute.repeatable) {
|
2642
|
-
acc[key] = attribute.min ? [...Array(attribute.min).fill(defaultComponentForm)] : [];
|
2643
|
-
} else {
|
2644
|
-
acc[key] = defaultComponentForm;
|
2645
|
-
}
|
2646
|
-
} else if (attribute.type === "dynamiczone" && attribute.required) {
|
2647
|
-
acc[key] = [];
|
2648
|
-
}
|
2649
|
-
return acc;
|
2650
|
-
}, {});
|
2651
|
-
};
|
2652
|
-
return traverseSchema(contentType.attributes);
|
2653
|
-
};
|
2654
2615
|
const Initializer = ({ disabled, name: name2, onClick }) => {
|
2655
2616
|
const { formatMessage } = reactIntl.useIntl();
|
2656
2617
|
const field = strapiAdmin.useField(name2);
|
@@ -2685,624 +2646,619 @@ const Initializer = ({ disabled, name: name2, onClick }) => {
|
|
2685
2646
|
}
|
2686
2647
|
) });
|
2687
2648
|
};
|
2688
|
-
const
|
2689
|
-
|
2690
|
-
|
2649
|
+
const AddComponentButton = ({
|
2650
|
+
hasError,
|
2651
|
+
isDisabled,
|
2652
|
+
isOpen,
|
2691
2653
|
children,
|
2692
|
-
|
2654
|
+
onClick
|
2655
|
+
}) => {
|
2656
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
2657
|
+
StyledButton,
|
2658
|
+
{
|
2659
|
+
type: "button",
|
2660
|
+
onClick,
|
2661
|
+
disabled: isDisabled,
|
2662
|
+
background: "neutral0",
|
2663
|
+
style: { cursor: isDisabled ? "not-allowed" : "pointer" },
|
2664
|
+
variant: "tertiary",
|
2665
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { tag: "span", gap: 2, children: [
|
2666
|
+
/* @__PURE__ */ jsxRuntime.jsx(StyledAddIcon, { "aria-hidden": true, $isOpen: isOpen, $hasError: hasError && !isOpen }),
|
2667
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
2668
|
+
designSystem.Typography,
|
2669
|
+
{
|
2670
|
+
variant: "pi",
|
2671
|
+
fontWeight: "bold",
|
2672
|
+
textColor: hasError && !isOpen ? "danger600" : "neutral600",
|
2673
|
+
children
|
2674
|
+
}
|
2675
|
+
)
|
2676
|
+
] })
|
2677
|
+
}
|
2678
|
+
);
|
2679
|
+
};
|
2680
|
+
const StyledAddIcon = styledComponents.styled(Icons.PlusCircle)`
|
2681
|
+
height: ${({ theme }) => theme.spaces[6]};
|
2682
|
+
width: ${({ theme }) => theme.spaces[6]};
|
2683
|
+
transform: ${({ $isOpen }) => $isOpen ? "rotate(45deg)" : "rotate(0deg)"};
|
2684
|
+
|
2685
|
+
> circle {
|
2686
|
+
fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger200 : theme.colors.neutral150};
|
2687
|
+
}
|
2688
|
+
> path {
|
2689
|
+
fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger600 : theme.colors.neutral500};
|
2690
|
+
}
|
2691
|
+
`;
|
2692
|
+
const StyledButton = styledComponents.styled(designSystem.Button)`
|
2693
|
+
padding-left: ${({ theme }) => theme.spaces[3]};
|
2694
|
+
border-radius: 26px;
|
2695
|
+
box-shadow: ${({ theme }) => theme.shadows.filterShadow};
|
2696
|
+
height: 5rem;
|
2697
|
+
`;
|
2698
|
+
const ComponentCategory = ({
|
2699
|
+
category,
|
2700
|
+
components = [],
|
2701
|
+
variant = "primary",
|
2702
|
+
onAddComponent
|
2693
2703
|
}) => {
|
2694
2704
|
const { formatMessage } = reactIntl.useIntl();
|
2695
|
-
|
2696
|
-
|
2697
|
-
|
2698
|
-
|
2705
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: category, children: [
|
2706
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { variant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: formatMessage({ id: category, defaultMessage: category }) }) }),
|
2707
|
+
/* @__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(
|
2708
|
+
ComponentBox,
|
2709
|
+
{
|
2710
|
+
tag: "button",
|
2711
|
+
type: "button",
|
2712
|
+
background: "neutral100",
|
2713
|
+
justifyContent: "center",
|
2714
|
+
onClick: onAddComponent(uid),
|
2715
|
+
hasRadius: true,
|
2716
|
+
height: "8.4rem",
|
2717
|
+
shrink: 0,
|
2718
|
+
borderColor: "neutral200",
|
2719
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 1, alignItems: "center", justifyContent: "center", children: [
|
2720
|
+
/* @__PURE__ */ jsxRuntime.jsx(ComponentIcon.ComponentIcon, { color: "currentColor", background: "primary200", icon }),
|
2721
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", children: displayName })
|
2722
|
+
] })
|
2723
|
+
},
|
2724
|
+
uid
|
2725
|
+
)) }) })
|
2726
|
+
] });
|
2727
|
+
};
|
2728
|
+
const ResponsiveAccordionContent = styledComponents.styled(designSystem.Accordion.Content)`
|
2729
|
+
container-type: inline-size;
|
2730
|
+
`;
|
2731
|
+
const Grid = styledComponents.styled(designSystem.Box)`
|
2732
|
+
display: grid;
|
2733
|
+
grid-template-columns: repeat(auto-fill, 100%);
|
2734
|
+
grid-gap: ${({ theme }) => theme.spaces[1]};
|
2735
|
+
|
2736
|
+
@container (min-width: ${() => RESPONSIVE_CONTAINER_BREAKPOINTS.sm}) {
|
2737
|
+
grid-template-columns: repeat(auto-fill, 14rem);
|
2738
|
+
}
|
2739
|
+
`;
|
2740
|
+
const ComponentBox = styledComponents.styled(designSystem.Flex)`
|
2741
|
+
color: ${({ theme }) => theme.colors.neutral600};
|
2742
|
+
cursor: pointer;
|
2743
|
+
|
2744
|
+
@media (prefers-reduced-motion: no-preference) {
|
2745
|
+
transition: color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
|
2746
|
+
}
|
2747
|
+
|
2748
|
+
&:focus,
|
2749
|
+
&:hover {
|
2750
|
+
border: 1px solid ${({ theme }) => theme.colors.primary200};
|
2751
|
+
background: ${({ theme }) => theme.colors.primary100};
|
2752
|
+
color: ${({ theme }) => theme.colors.primary600};
|
2753
|
+
}
|
2754
|
+
`;
|
2755
|
+
const ComponentPicker = ({
|
2756
|
+
dynamicComponentsByCategory = {},
|
2757
|
+
isOpen,
|
2758
|
+
onClickAddComponent
|
2759
|
+
}) => {
|
2760
|
+
const { formatMessage } = reactIntl.useIntl();
|
2761
|
+
const handleAddComponentToDz = (componentUid) => () => {
|
2762
|
+
onClickAddComponent(componentUid);
|
2763
|
+
};
|
2764
|
+
if (!isOpen) {
|
2765
|
+
return null;
|
2766
|
+
}
|
2767
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
2699
2768
|
designSystem.Box,
|
2700
2769
|
{
|
2701
|
-
background: "neutral100",
|
2702
|
-
paddingLeft: 6,
|
2703
|
-
paddingRight: 6,
|
2704
2770
|
paddingTop: 6,
|
2705
2771
|
paddingBottom: 6,
|
2706
|
-
|
2707
|
-
|
2708
|
-
|
2709
|
-
|
2710
|
-
|
2711
|
-
|
2712
|
-
|
2713
|
-
|
2714
|
-
|
2715
|
-
|
2716
|
-
|
2717
|
-
|
2718
|
-
|
2719
|
-
|
2720
|
-
|
2721
|
-
|
2722
|
-
|
2723
|
-
|
2724
|
-
|
2725
|
-
|
2726
|
-
|
2727
|
-
|
2728
|
-
}) })
|
2772
|
+
paddingLeft: 5,
|
2773
|
+
paddingRight: 5,
|
2774
|
+
background: "neutral0",
|
2775
|
+
shadow: "tableShadow",
|
2776
|
+
borderColor: "neutral150",
|
2777
|
+
hasRadius: true,
|
2778
|
+
children: [
|
2779
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", textColor: "neutral600", children: formatMessage({
|
2780
|
+
id: index.getTranslation("components.DynamicZone.ComponentPicker-label"),
|
2781
|
+
defaultMessage: "Pick one component"
|
2782
|
+
}) }) }),
|
2783
|
+
/* @__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(
|
2784
|
+
ComponentCategory,
|
2785
|
+
{
|
2786
|
+
category,
|
2787
|
+
components,
|
2788
|
+
onAddComponent: handleAddComponentToDz,
|
2789
|
+
variant: index2 % 2 === 1 ? "primary" : "secondary"
|
2790
|
+
},
|
2791
|
+
category
|
2792
|
+
)) }) })
|
2793
|
+
]
|
2729
2794
|
}
|
2730
|
-
)
|
2795
|
+
);
|
2731
2796
|
};
|
2732
|
-
const
|
2733
|
-
|
2797
|
+
const DynamicComponent = ({
|
2798
|
+
componentUid,
|
2734
2799
|
disabled,
|
2800
|
+
index: index$1,
|
2735
2801
|
name: name2,
|
2736
|
-
|
2737
|
-
|
2738
|
-
|
2802
|
+
onRemoveComponentClick,
|
2803
|
+
onMoveComponent,
|
2804
|
+
onGrabItem,
|
2805
|
+
onDropItem,
|
2806
|
+
onCancel,
|
2807
|
+
dynamicComponentsByCategory = {},
|
2808
|
+
onAddComponent,
|
2809
|
+
children
|
2739
2810
|
}) => {
|
2740
|
-
const { toggleNotification } = strapiAdmin.useNotification();
|
2741
2811
|
const { formatMessage } = reactIntl.useIntl();
|
2742
|
-
const
|
2743
|
-
const search = React__namespace.useMemo(() => new URLSearchParams(searchString), [searchString]);
|
2744
|
-
const { components } = index.useDoc();
|
2812
|
+
const formValues = strapiAdmin.useForm("DynamicComponent", (state) => state.values);
|
2745
2813
|
const {
|
2746
|
-
|
2747
|
-
|
2748
|
-
|
2749
|
-
|
2750
|
-
|
2751
|
-
|
2752
|
-
|
2753
|
-
|
2754
|
-
|
2755
|
-
const
|
2756
|
-
|
2757
|
-
const
|
2758
|
-
|
2759
|
-
|
2760
|
-
|
2761
|
-
|
2762
|
-
}).filter((value2) => !!value2);
|
2763
|
-
if (errorOpenItems && errorOpenItems.length > 0) {
|
2764
|
-
setCollapseToOpen((collapseToOpen2) => {
|
2765
|
-
if (!errorOpenItems.includes(collapseToOpen2)) {
|
2766
|
-
return errorOpenItems[0];
|
2767
|
-
}
|
2768
|
-
return collapseToOpen2;
|
2769
|
-
});
|
2770
|
-
}
|
2771
|
-
}
|
2772
|
-
}, [rawError, value]);
|
2773
|
-
const componentTmpKeyWithFocussedField = React__namespace.useMemo(() => {
|
2774
|
-
if (search.has("field")) {
|
2775
|
-
const fieldParam = search.get("field");
|
2776
|
-
if (!fieldParam) {
|
2777
|
-
return void 0;
|
2778
|
-
}
|
2779
|
-
const [, path] = fieldParam.split(`${name2}.`);
|
2780
|
-
if (objects.getIn(value, path, void 0) !== void 0) {
|
2781
|
-
const [subpath] = path.split(".");
|
2782
|
-
return objects.getIn(value, subpath, void 0)?.__temp_key__;
|
2783
|
-
}
|
2784
|
-
}
|
2785
|
-
return void 0;
|
2786
|
-
}, [search, name2, value]);
|
2787
|
-
const prevValue = useDebounce.usePrev(value);
|
2788
|
-
React__namespace.useEffect(() => {
|
2789
|
-
if (prevValue && prevValue.length < value.length) {
|
2790
|
-
setCollapseToOpen(value[value.length - 1].__temp_key__);
|
2791
|
-
}
|
2792
|
-
}, [value, prevValue]);
|
2793
|
-
React__namespace.useEffect(() => {
|
2794
|
-
if (typeof componentTmpKeyWithFocussedField === "string") {
|
2795
|
-
setCollapseToOpen(componentTmpKeyWithFocussedField);
|
2796
|
-
}
|
2797
|
-
}, [componentTmpKeyWithFocussedField]);
|
2798
|
-
const toggleCollapses = () => {
|
2799
|
-
setCollapseToOpen("");
|
2800
|
-
};
|
2801
|
-
const handleClick = () => {
|
2802
|
-
if (value.length < max) {
|
2803
|
-
const schema = components[attribute.component];
|
2804
|
-
const form = createDefaultForm(schema, components);
|
2805
|
-
const data = transformDocument(schema, components)(form);
|
2806
|
-
addFieldRow(name2, data);
|
2807
|
-
} else if (value.length >= max) {
|
2808
|
-
toggleNotification({
|
2809
|
-
type: "info",
|
2810
|
-
message: formatMessage({
|
2811
|
-
id: index.getTranslation("components.notification.info.maximum-requirement")
|
2812
|
-
})
|
2813
|
-
});
|
2814
|
-
}
|
2815
|
-
};
|
2816
|
-
const handleMoveComponentField = (newIndex, currentIndex) => {
|
2817
|
-
setLiveText(
|
2818
|
-
formatMessage(
|
2819
|
-
{
|
2820
|
-
id: index.getTranslation("dnd.reorder"),
|
2821
|
-
defaultMessage: "{item}, moved. New position in list: {position}."
|
2822
|
-
},
|
2823
|
-
{
|
2824
|
-
item: `${name2}.${currentIndex}`,
|
2825
|
-
position: getItemPos(newIndex)
|
2826
|
-
}
|
2827
|
-
)
|
2828
|
-
);
|
2829
|
-
moveFieldRow(name2, currentIndex, newIndex);
|
2830
|
-
};
|
2831
|
-
const handleValueChange = (key) => {
|
2832
|
-
setCollapseToOpen(key);
|
2833
|
-
};
|
2834
|
-
const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
|
2835
|
-
const handleCancel = (index$1) => {
|
2836
|
-
setLiveText(
|
2837
|
-
formatMessage(
|
2838
|
-
{
|
2839
|
-
id: index.getTranslation("dnd.cancel-item"),
|
2840
|
-
defaultMessage: "{item}, dropped. Re-order cancelled."
|
2841
|
-
},
|
2842
|
-
{
|
2843
|
-
item: `${name2}.${index$1}`
|
2844
|
-
}
|
2845
|
-
)
|
2846
|
-
);
|
2847
|
-
};
|
2848
|
-
const handleGrabItem = (index$1) => {
|
2849
|
-
setLiveText(
|
2850
|
-
formatMessage(
|
2851
|
-
{
|
2852
|
-
id: index.getTranslation("dnd.grab-item"),
|
2853
|
-
defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
|
2854
|
-
},
|
2855
|
-
{
|
2856
|
-
item: `${name2}.${index$1}`,
|
2857
|
-
position: getItemPos(index$1)
|
2858
|
-
}
|
2859
|
-
)
|
2860
|
-
);
|
2861
|
-
};
|
2862
|
-
const handleDropItem = (index$1) => {
|
2863
|
-
setLiveText(
|
2864
|
-
formatMessage(
|
2865
|
-
{
|
2866
|
-
id: index.getTranslation("dnd.drop-item"),
|
2867
|
-
defaultMessage: `{item}, dropped. Final position in list: {position}.`
|
2868
|
-
},
|
2869
|
-
{
|
2870
|
-
item: `${name2}.${index$1}`,
|
2871
|
-
position: getItemPos(index$1)
|
2872
|
-
}
|
2873
|
-
)
|
2874
|
-
);
|
2875
|
-
};
|
2876
|
-
const ariaDescriptionId = React__namespace.useId();
|
2877
|
-
const level = Relations.useComponent("RepeatableComponent", (state) => state.level);
|
2878
|
-
if (value.length === 0) {
|
2879
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleClick });
|
2880
|
-
}
|
2881
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { hasRadius: true, children: [
|
2882
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
|
2883
|
-
id: index.getTranslation("dnd.instructions"),
|
2884
|
-
defaultMessage: `Press spacebar to grab and re-order`
|
2885
|
-
}) }),
|
2886
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
|
2887
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
2888
|
-
AccordionRoot,
|
2889
|
-
{
|
2890
|
-
$error: error,
|
2891
|
-
value: collapseToOpen,
|
2892
|
-
onValueChange: handleValueChange,
|
2893
|
-
"aria-describedby": ariaDescriptionId,
|
2894
|
-
children: [
|
2895
|
-
value.map(({ __temp_key__: key, id }, index2) => {
|
2896
|
-
const nameWithIndex = `${name2}.${index2}`;
|
2897
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
2898
|
-
Relations.ComponentProvider,
|
2899
|
-
{
|
2900
|
-
id,
|
2901
|
-
uid: attribute.component,
|
2902
|
-
level: level + 1,
|
2903
|
-
type: "repeatable",
|
2904
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
2905
|
-
Component,
|
2906
|
-
{
|
2907
|
-
disabled,
|
2908
|
-
name: nameWithIndex,
|
2909
|
-
attribute,
|
2910
|
-
index: index2,
|
2911
|
-
mainField,
|
2912
|
-
onMoveItem: handleMoveComponentField,
|
2913
|
-
onDeleteComponent: () => {
|
2914
|
-
removeFieldRow(name2, index2);
|
2915
|
-
toggleCollapses();
|
2916
|
-
},
|
2917
|
-
toggleCollapses,
|
2918
|
-
onCancel: handleCancel,
|
2919
|
-
onDropItem: handleDropItem,
|
2920
|
-
onGrabItem: handleGrabItem,
|
2921
|
-
__temp_key__: key,
|
2922
|
-
children: layout.map((row, index22) => {
|
2923
|
-
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: row.map(({ size, ...field }) => {
|
2924
|
-
const completeFieldName = `${nameWithIndex}.${field.name}`;
|
2925
|
-
const translatedLabel = formatMessage({
|
2926
|
-
id: `content-manager.components.${attribute.component}.${field.name}`,
|
2927
|
-
defaultMessage: field.label
|
2928
|
-
});
|
2929
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
2930
|
-
designSystem.Grid.Item,
|
2931
|
-
{
|
2932
|
-
col: size,
|
2933
|
-
s: 12,
|
2934
|
-
xs: 12,
|
2935
|
-
direction: "column",
|
2936
|
-
alignItems: "stretch",
|
2937
|
-
children: children({
|
2938
|
-
...field,
|
2939
|
-
label: translatedLabel,
|
2940
|
-
name: completeFieldName
|
2941
|
-
})
|
2942
|
-
},
|
2943
|
-
completeFieldName
|
2944
|
-
);
|
2945
|
-
}) }, index22);
|
2946
|
-
})
|
2947
|
-
}
|
2948
|
-
)
|
2949
|
-
},
|
2950
|
-
key
|
2951
|
-
);
|
2952
|
-
}),
|
2953
|
-
/* @__PURE__ */ jsxRuntime.jsx(TextButtonCustom, { disabled, onClick: handleClick, startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Plus, {}), children: formatMessage({
|
2954
|
-
id: index.getTranslation("containers.EditView.add.new-entry"),
|
2955
|
-
defaultMessage: "Add an entry"
|
2956
|
-
}) })
|
2957
|
-
]
|
2958
|
-
}
|
2959
|
-
)
|
2960
|
-
] });
|
2961
|
-
};
|
2962
|
-
const AccordionRoot = styledComponents.styled(designSystem.Accordion.Root)`
|
2963
|
-
border: 1px solid
|
2964
|
-
${({ theme, $error }) => $error ? theme.colors.danger600 : theme.colors.neutral200};
|
2965
|
-
`;
|
2966
|
-
const TextButtonCustom = styledComponents.styled(designSystem.TextButton)`
|
2967
|
-
width: 100%;
|
2968
|
-
display: flex;
|
2969
|
-
justify-content: center;
|
2970
|
-
border-top: 1px solid ${({ theme }) => theme.colors.neutral200};
|
2971
|
-
padding-inline: ${(props) => props.theme.spaces[6]};
|
2972
|
-
padding-block: ${(props) => props.theme.spaces[3]};
|
2973
|
-
|
2974
|
-
&:not([disabled]) {
|
2975
|
-
cursor: pointer;
|
2976
|
-
|
2977
|
-
&:hover {
|
2978
|
-
background-color: ${(props) => props.theme.colors.primary100};
|
2979
|
-
}
|
2980
|
-
}
|
2981
|
-
|
2982
|
-
span {
|
2983
|
-
font-weight: 600;
|
2984
|
-
font-size: 1.4rem;
|
2985
|
-
line-height: 2.4rem;
|
2986
|
-
}
|
2987
|
-
|
2988
|
-
@media (prefers-reduced-motion: no-preference) {
|
2989
|
-
transition: background-color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
|
2990
|
-
}
|
2991
|
-
`;
|
2992
|
-
const Component = ({
|
2993
|
-
disabled,
|
2994
|
-
index: index$1,
|
2995
|
-
name: name2,
|
2996
|
-
mainField = {
|
2997
|
-
name: "id",
|
2998
|
-
type: "integer"
|
2999
|
-
},
|
3000
|
-
children,
|
3001
|
-
onDeleteComponent,
|
3002
|
-
toggleCollapses,
|
3003
|
-
__temp_key__,
|
3004
|
-
...dragProps
|
3005
|
-
}) => {
|
3006
|
-
const { formatMessage } = reactIntl.useIntl();
|
3007
|
-
const displayValue = strapiAdmin.useForm("RepeatableComponent", (state) => {
|
3008
|
-
return objects.getIn(state.values, [...name2.split("."), mainField.name]);
|
3009
|
-
});
|
3010
|
-
const accordionRef = React__namespace.useRef(null);
|
3011
|
-
const componentKey = name2.split(".").slice(0, -1).join(".");
|
2814
|
+
edit: { components }
|
2815
|
+
} = index.useDocLayout();
|
2816
|
+
const title = React__namespace.useMemo(() => {
|
2817
|
+
const { mainField } = components[componentUid]?.settings ?? { mainField: "id" };
|
2818
|
+
const mainFieldValue = objects.getIn(formValues, `${name2}.${index$1}.${mainField}`);
|
2819
|
+
const displayedValue = mainField === "id" || !mainFieldValue ? "" : String(mainFieldValue).trim();
|
2820
|
+
const mainValue = displayedValue.length > 0 ? `- ${displayedValue}` : displayedValue;
|
2821
|
+
return mainValue;
|
2822
|
+
}, [componentUid, components, formValues, name2, index$1]);
|
2823
|
+
const { icon, displayName } = React__namespace.useMemo(() => {
|
2824
|
+
const [category] = componentUid.split(".");
|
2825
|
+
const { icon: icon2, displayName: displayName2 } = (dynamicComponentsByCategory[category] ?? []).find(
|
2826
|
+
(component) => component.uid === componentUid
|
2827
|
+
) ?? { icon: null, displayName: null };
|
2828
|
+
return { icon: icon2, displayName: displayName2 };
|
2829
|
+
}, [componentUid, dynamicComponentsByCategory]);
|
3012
2830
|
const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop.useDragAndDrop(!disabled, {
|
3013
|
-
type: `${useDragAndDrop.ItemTypes.
|
2831
|
+
type: `${useDragAndDrop.ItemTypes.DYNAMIC_ZONE}_${name2}`,
|
3014
2832
|
index: index$1,
|
3015
2833
|
item: {
|
3016
2834
|
index: index$1,
|
3017
|
-
displayedValue:
|
3018
|
-
|
3019
|
-
onStart() {
|
3020
|
-
toggleCollapses();
|
2835
|
+
displayedValue: `${displayName} ${title}`,
|
2836
|
+
icon
|
3021
2837
|
},
|
3022
|
-
|
2838
|
+
onMoveItem: onMoveComponent,
|
2839
|
+
onDropItem,
|
2840
|
+
onGrabItem,
|
2841
|
+
onCancel
|
3023
2842
|
});
|
3024
2843
|
React__namespace.useEffect(() => {
|
3025
2844
|
dragPreviewRef(reactDndHtml5Backend.getEmptyImage(), { captureDraggingState: false });
|
3026
2845
|
}, [dragPreviewRef, index$1]);
|
3027
|
-
const
|
3028
|
-
const
|
3029
|
-
|
3030
|
-
|
3031
|
-
|
3032
|
-
|
3033
|
-
|
3034
|
-
|
3035
|
-
|
3036
|
-
|
3037
|
-
|
2846
|
+
const accordionValue = React__namespace.useId();
|
2847
|
+
const { value = [], rawError } = strapiAdmin.useField(`${name2}.${index$1}`);
|
2848
|
+
const [collapseToOpen, setCollapseToOpen] = React__namespace.useState("");
|
2849
|
+
React__namespace.useEffect(() => {
|
2850
|
+
if (rawError && value) {
|
2851
|
+
setCollapseToOpen(accordionValue);
|
2852
|
+
}
|
2853
|
+
}, [rawError, value, accordionValue]);
|
2854
|
+
const composedBoxRefs = designSystem.useComposedRefs(boxRef, dropRef);
|
2855
|
+
const accordionActions = disabled ? null : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
2856
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
2857
|
+
designSystem.IconButton,
|
2858
|
+
{
|
2859
|
+
variant: "ghost",
|
2860
|
+
label: formatMessage(
|
3038
2861
|
{
|
3039
|
-
|
3040
|
-
|
3041
|
-
|
3042
|
-
|
3043
|
-
defaultMessage: "Delete"
|
3044
|
-
}),
|
3045
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
|
3046
|
-
}
|
2862
|
+
id: index.getTranslation("components.DynamicZone.delete-label"),
|
2863
|
+
defaultMessage: "Delete {name}"
|
2864
|
+
},
|
2865
|
+
{ name: title }
|
3047
2866
|
),
|
3048
|
-
|
3049
|
-
|
3050
|
-
|
3051
|
-
|
3052
|
-
|
3053
|
-
|
3054
|
-
"data-handler-id": handlerId,
|
3055
|
-
label: formatMessage({
|
3056
|
-
id: index.getTranslation("components.DragHandle-label"),
|
3057
|
-
defaultMessage: "Drag"
|
3058
|
-
}),
|
3059
|
-
onKeyDown: handleKeyDown,
|
3060
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
|
3061
|
-
}
|
3062
|
-
)
|
3063
|
-
] })
|
3064
|
-
] }),
|
3065
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
3066
|
-
designSystem.Flex,
|
2867
|
+
onClick: onRemoveComponentClick,
|
2868
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
|
2869
|
+
}
|
2870
|
+
),
|
2871
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
2872
|
+
designSystem.IconButton,
|
3067
2873
|
{
|
3068
|
-
|
3069
|
-
|
3070
|
-
|
3071
|
-
|
3072
|
-
|
3073
|
-
|
2874
|
+
variant: "ghost",
|
2875
|
+
onClick: (e) => e.stopPropagation(),
|
2876
|
+
"data-handler-id": handlerId,
|
2877
|
+
ref: dragRef,
|
2878
|
+
label: formatMessage({
|
2879
|
+
id: index.getTranslation("components.DragHandle-label"),
|
2880
|
+
defaultMessage: "Drag"
|
2881
|
+
}),
|
2882
|
+
onKeyDown: handleKeyDown,
|
2883
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
|
3074
2884
|
}
|
3075
|
-
)
|
3076
|
-
|
3077
|
-
|
3078
|
-
const Preview$1 = () => {
|
3079
|
-
return /* @__PURE__ */ jsxRuntime.jsx(StyledSpan, { tag: "span", padding: 6, background: "primary100" });
|
3080
|
-
};
|
3081
|
-
const StyledSpan = styledComponents.styled(designSystem.Box)`
|
3082
|
-
display: block;
|
3083
|
-
outline: 1px dashed ${({ theme }) => theme.colors.primary500};
|
3084
|
-
outline-offset: -1px;
|
3085
|
-
`;
|
3086
|
-
const ComponentInput = ({
|
3087
|
-
label,
|
3088
|
-
required,
|
3089
|
-
name: name2,
|
3090
|
-
attribute,
|
3091
|
-
disabled,
|
3092
|
-
labelAction,
|
3093
|
-
...props
|
3094
|
-
}) => {
|
3095
|
-
const { formatMessage } = reactIntl.useIntl();
|
3096
|
-
const field = strapiAdmin.useField(name2);
|
3097
|
-
const showResetComponent = !attribute.repeatable && field.value && !disabled;
|
3098
|
-
const { components } = index.useDoc();
|
3099
|
-
const handleInitialisationClick = () => {
|
3100
|
-
const schema = components[attribute.component];
|
3101
|
-
const form = createDefaultForm(schema, components);
|
3102
|
-
const data = transformDocument(schema, components)(form);
|
3103
|
-
field.onChange(name2, data);
|
3104
|
-
};
|
3105
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error: field.error, required, children: [
|
3106
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", children: [
|
3107
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Label, { action: labelAction, children: [
|
3108
|
-
label,
|
3109
|
-
attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
3110
|
-
" (",
|
3111
|
-
Array.isArray(field.value) ? field.value.length : 0,
|
3112
|
-
")"
|
3113
|
-
] })
|
3114
|
-
] }),
|
3115
|
-
showResetComponent && /* @__PURE__ */ jsxRuntime.jsx(
|
2885
|
+
),
|
2886
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
|
2887
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Trigger, { size: "S", endIcon: null, paddingLeft: 0, paddingRight: 0, children: /* @__PURE__ */ jsxRuntime.jsx(
|
3116
2888
|
designSystem.IconButton,
|
3117
2889
|
{
|
2890
|
+
variant: "ghost",
|
3118
2891
|
label: formatMessage({
|
3119
|
-
id: index.getTranslation("components.
|
3120
|
-
defaultMessage: "
|
2892
|
+
id: index.getTranslation("components.DynamicZone.more-actions"),
|
2893
|
+
defaultMessage: "More actions"
|
3121
2894
|
}),
|
3122
|
-
|
3123
|
-
|
3124
|
-
field.onChange(name2, null);
|
3125
|
-
},
|
3126
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
|
2895
|
+
tag: "span",
|
2896
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.More, { "aria-hidden": true, focusable: false })
|
3127
2897
|
}
|
3128
|
-
)
|
3129
|
-
|
3130
|
-
|
3131
|
-
|
3132
|
-
|
3133
|
-
|
2898
|
+
) }),
|
2899
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { children: [
|
2900
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
|
2901
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
|
2902
|
+
id: index.getTranslation("components.DynamicZone.add-item-above"),
|
2903
|
+
defaultMessage: "Add component above"
|
2904
|
+
}) }),
|
2905
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
|
2906
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
|
2907
|
+
components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1), children: displayName2 }, componentUid))
|
2908
|
+
] }, category)) })
|
2909
|
+
] }),
|
2910
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
|
2911
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
|
2912
|
+
id: index.getTranslation("components.DynamicZone.add-item-below"),
|
2913
|
+
defaultMessage: "Add component below"
|
2914
|
+
}) }),
|
2915
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
|
2916
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
|
2917
|
+
components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1 + 1), children: displayName2 }, componentUid))
|
2918
|
+
] }, category)) })
|
2919
|
+
] })
|
2920
|
+
] })
|
2921
|
+
] })
|
2922
|
+
] });
|
2923
|
+
const accordionTitle = title ? `${displayName} ${title}` : displayName;
|
2924
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ComponentContainer, { tag: "li", width: "100%", children: [
|
2925
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Rectangle, { background: "neutral200" }) }),
|
2926
|
+
/* @__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: [
|
2927
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
|
2928
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
2929
|
+
designSystem.Accordion.Trigger,
|
2930
|
+
{
|
2931
|
+
icon: icon && ComponentIcon.COMPONENT_ICONS[icon] ? ComponentIcon.COMPONENT_ICONS[icon] : ComponentIcon.COMPONENT_ICONS.dashboard,
|
2932
|
+
children: accordionTitle
|
2933
|
+
}
|
2934
|
+
),
|
2935
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Actions, { children: accordionActions })
|
2936
|
+
] }),
|
2937
|
+
/* @__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(
|
2938
|
+
designSystem.Grid.Item,
|
2939
|
+
{
|
2940
|
+
col: 12,
|
2941
|
+
s: 12,
|
2942
|
+
xs: 12,
|
2943
|
+
direction: "column",
|
2944
|
+
alignItems: "stretch",
|
2945
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
|
2946
|
+
const fieldName = `${name2}.${index$1}.${field.name}`;
|
2947
|
+
const fieldWithTranslatedLabel = {
|
2948
|
+
...field,
|
2949
|
+
label: formatMessage({
|
2950
|
+
id: `content-manager.components.${componentUid}.${field.name}`,
|
2951
|
+
defaultMessage: field.label
|
2952
|
+
})
|
2953
|
+
};
|
2954
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
2955
|
+
ResponsiveGridItem,
|
2956
|
+
{
|
2957
|
+
col: size,
|
2958
|
+
s: 12,
|
2959
|
+
xs: 12,
|
2960
|
+
direction: "column",
|
2961
|
+
alignItems: "stretch",
|
2962
|
+
children: children ? children({ ...fieldWithTranslatedLabel, name: fieldName }) : /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel, name: fieldName })
|
2963
|
+
},
|
2964
|
+
fieldName
|
2965
|
+
);
|
2966
|
+
}) })
|
2967
|
+
},
|
2968
|
+
rowInd
|
2969
|
+
)) }) }) }) })
|
2970
|
+
] }) }) })
|
3134
2971
|
] });
|
3135
2972
|
};
|
3136
|
-
const
|
3137
|
-
|
3138
|
-
|
3139
|
-
|
3140
|
-
|
3141
|
-
|
3142
|
-
|
2973
|
+
const StyledBox = styledComponents.styled(designSystem.Box)`
|
2974
|
+
> div:first-child {
|
2975
|
+
box-shadow: ${({ theme }) => theme.shadows.tableShadow};
|
2976
|
+
}
|
2977
|
+
`;
|
2978
|
+
const AccordionContentRadius = styledComponents.styled(designSystem.Box)`
|
2979
|
+
border-radius: 0 0 ${({ theme }) => theme.spaces[1]} ${({ theme }) => theme.spaces[1]};
|
2980
|
+
`;
|
2981
|
+
const Rectangle = styledComponents.styled(designSystem.Box)`
|
2982
|
+
width: ${({ theme }) => theme.spaces[2]};
|
2983
|
+
height: ${({ theme }) => theme.spaces[4]};
|
2984
|
+
`;
|
2985
|
+
const Preview$1 = styledComponents.styled.span`
|
2986
|
+
display: block;
|
2987
|
+
background-color: ${({ theme }) => theme.colors.primary100};
|
2988
|
+
outline: 1px dashed ${({ theme }) => theme.colors.primary500};
|
2989
|
+
outline-offset: -1px;
|
2990
|
+
padding: ${({ theme }) => theme.spaces[6]};
|
2991
|
+
`;
|
2992
|
+
const ComponentContainer = styledComponents.styled(designSystem.Box)`
|
2993
|
+
list-style: none;
|
2994
|
+
padding: 0;
|
2995
|
+
margin: 0;
|
2996
|
+
`;
|
2997
|
+
const DynamicZoneLabel = ({
|
2998
|
+
hint,
|
2999
|
+
label,
|
3000
|
+
labelAction,
|
3001
|
+
name: name2,
|
3002
|
+
numberOfComponents = 0,
|
3003
|
+
required
|
3143
3004
|
}) => {
|
3144
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
3145
|
-
|
3005
|
+
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
3006
|
+
designSystem.Box,
|
3146
3007
|
{
|
3147
|
-
|
3148
|
-
|
3149
|
-
|
3008
|
+
paddingTop: 3,
|
3009
|
+
paddingBottom: 3,
|
3010
|
+
paddingRight: 4,
|
3011
|
+
paddingLeft: 4,
|
3012
|
+
borderRadius: "26px",
|
3150
3013
|
background: "neutral0",
|
3151
|
-
|
3152
|
-
|
3153
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, {
|
3154
|
-
/* @__PURE__ */ jsxRuntime.
|
3155
|
-
|
3156
|
-
|
3157
|
-
|
3158
|
-
|
3159
|
-
|
3160
|
-
|
3161
|
-
|
3162
|
-
|
3163
|
-
|
3014
|
+
shadow: "filterShadow",
|
3015
|
+
color: "neutral500",
|
3016
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", justifyContent: "center", children: [
|
3017
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { maxWidth: "35.6rem", children: [
|
3018
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", ellipsis: true, children: [
|
3019
|
+
label || name2,
|
3020
|
+
" "
|
3021
|
+
] }),
|
3022
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", children: [
|
3023
|
+
"(",
|
3024
|
+
numberOfComponents,
|
3025
|
+
")"
|
3026
|
+
] }),
|
3027
|
+
required && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", children: "*" }),
|
3028
|
+
labelAction && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 1, children: labelAction })
|
3029
|
+
] }),
|
3030
|
+
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 }) })
|
3164
3031
|
] })
|
3165
3032
|
}
|
3166
|
-
);
|
3033
|
+
) });
|
3167
3034
|
};
|
3168
|
-
const
|
3169
|
-
|
3170
|
-
|
3171
|
-
|
3172
|
-
|
3173
|
-
> circle {
|
3174
|
-
fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger200 : theme.colors.neutral150};
|
3175
|
-
}
|
3176
|
-
> path {
|
3177
|
-
fill: ${({ theme, $hasError }) => $hasError ? theme.colors.danger600 : theme.colors.neutral600};
|
3035
|
+
const [DynamicZoneProvider, useDynamicZone] = strapiAdmin.createContext(
|
3036
|
+
"DynamicZone",
|
3037
|
+
{
|
3038
|
+
isInDynamicZone: false
|
3178
3039
|
}
|
3179
|
-
|
3180
|
-
const
|
3181
|
-
|
3182
|
-
|
3183
|
-
|
3184
|
-
|
3185
|
-
|
3186
|
-
|
3187
|
-
|
3188
|
-
|
3189
|
-
|
3190
|
-
|
3191
|
-
|
3192
|
-
|
3193
|
-
|
3194
|
-
|
3195
|
-
|
3196
|
-
|
3197
|
-
|
3040
|
+
);
|
3041
|
+
const DynamicZone = ({
|
3042
|
+
attribute,
|
3043
|
+
disabled: disabledProp,
|
3044
|
+
hint,
|
3045
|
+
label,
|
3046
|
+
labelAction,
|
3047
|
+
name: name2,
|
3048
|
+
required = false,
|
3049
|
+
children
|
3050
|
+
}) => {
|
3051
|
+
const { max = Infinity, min = -Infinity } = attribute ?? {};
|
3052
|
+
const [addComponentIsOpen, setAddComponentIsOpen] = React__namespace.useState(false);
|
3053
|
+
const [liveText, setLiveText] = React__namespace.useState("");
|
3054
|
+
const { components, isLoading } = index.useDoc();
|
3055
|
+
const disabled = disabledProp || isLoading;
|
3056
|
+
const { addFieldRow, removeFieldRow, moveFieldRow } = strapiAdmin.useForm(
|
3057
|
+
"DynamicZone",
|
3058
|
+
({ addFieldRow: addFieldRow2, removeFieldRow: removeFieldRow2, moveFieldRow: moveFieldRow2 }) => ({
|
3059
|
+
addFieldRow: addFieldRow2,
|
3060
|
+
removeFieldRow: removeFieldRow2,
|
3061
|
+
moveFieldRow: moveFieldRow2
|
3062
|
+
})
|
3063
|
+
);
|
3064
|
+
const { value = [], error } = strapiAdmin.useField(name2);
|
3065
|
+
const dynamicComponentsByCategory = React__namespace.useMemo(() => {
|
3066
|
+
return attribute.components.reduce((acc, componentUid) => {
|
3067
|
+
const { category, info } = components[componentUid] ?? { info: {} };
|
3068
|
+
const component = { uid: componentUid, displayName: info.displayName, icon: info.icon };
|
3069
|
+
if (!acc[category]) {
|
3070
|
+
acc[category] = [];
|
3198
3071
|
}
|
3072
|
+
acc[category] = [...acc[category], component];
|
3073
|
+
return acc;
|
3074
|
+
}, {});
|
3075
|
+
}, [attribute.components, components]);
|
3076
|
+
const { formatMessage } = reactIntl.useIntl();
|
3077
|
+
const { toggleNotification } = strapiAdmin.useNotification();
|
3078
|
+
const dynamicDisplayedComponentsLength = value.length;
|
3079
|
+
const handleAddComponent = (uid, position) => {
|
3080
|
+
setAddComponentIsOpen(false);
|
3081
|
+
const schema = components[uid];
|
3082
|
+
const form = index.createDefaultForm(schema, components);
|
3083
|
+
const transformations = pipe__default.default(index.transformDocument(schema, components), (data2) => ({
|
3084
|
+
...data2,
|
3085
|
+
__component: uid
|
3086
|
+
}));
|
3087
|
+
const data = transformations(form);
|
3088
|
+
addFieldRow(name2, data, position);
|
3089
|
+
};
|
3090
|
+
const handleClickOpenPicker = () => {
|
3091
|
+
if (dynamicDisplayedComponentsLength < max) {
|
3092
|
+
setAddComponentIsOpen((prev) => !prev);
|
3093
|
+
} else {
|
3094
|
+
toggleNotification({
|
3095
|
+
type: "info",
|
3096
|
+
message: formatMessage({
|
3097
|
+
id: index.getTranslation("components.notification.info.maximum-requirement")
|
3098
|
+
})
|
3099
|
+
});
|
3199
3100
|
}
|
3200
|
-
}
|
3201
|
-
|
3202
|
-
|
3203
|
-
|
3101
|
+
};
|
3102
|
+
const handleMoveComponent = (newIndex, currentIndex) => {
|
3103
|
+
setLiveText(
|
3104
|
+
formatMessage(
|
3105
|
+
{
|
3106
|
+
id: index.getTranslation("dnd.reorder"),
|
3107
|
+
defaultMessage: "{item}, moved. New position in list: {position}."
|
3108
|
+
},
|
3109
|
+
{
|
3110
|
+
item: `${name2}.${currentIndex}`,
|
3111
|
+
position: getItemPos(newIndex)
|
3112
|
+
}
|
3113
|
+
)
|
3114
|
+
);
|
3115
|
+
moveFieldRow(name2, currentIndex, newIndex);
|
3116
|
+
};
|
3117
|
+
const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
|
3118
|
+
const handleCancel = (index$1) => {
|
3119
|
+
setLiveText(
|
3120
|
+
formatMessage(
|
3121
|
+
{
|
3122
|
+
id: index.getTranslation("dnd.cancel-item"),
|
3123
|
+
defaultMessage: "{item}, dropped. Re-order cancelled."
|
3124
|
+
},
|
3125
|
+
{
|
3126
|
+
item: `${name2}.${index$1}`
|
3127
|
+
}
|
3128
|
+
)
|
3129
|
+
);
|
3130
|
+
};
|
3131
|
+
const handleGrabItem = (index$1) => {
|
3132
|
+
setLiveText(
|
3133
|
+
formatMessage(
|
3134
|
+
{
|
3135
|
+
id: index.getTranslation("dnd.grab-item"),
|
3136
|
+
defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
|
3137
|
+
},
|
3138
|
+
{
|
3139
|
+
item: `${name2}.${index$1}`,
|
3140
|
+
position: getItemPos(index$1)
|
3141
|
+
}
|
3142
|
+
)
|
3143
|
+
);
|
3144
|
+
};
|
3145
|
+
const handleDropItem = (index$1) => {
|
3146
|
+
setLiveText(
|
3147
|
+
formatMessage(
|
3148
|
+
{
|
3149
|
+
id: index.getTranslation("dnd.drop-item"),
|
3150
|
+
defaultMessage: `{item}, dropped. Final position in list: {position}.`
|
3151
|
+
},
|
3152
|
+
{
|
3153
|
+
item: `${name2}.${index$1}`,
|
3154
|
+
position: getItemPos(index$1)
|
3155
|
+
}
|
3156
|
+
)
|
3157
|
+
);
|
3158
|
+
};
|
3159
|
+
const handleRemoveComponent = (name22, currentIndex) => () => {
|
3160
|
+
removeFieldRow(name22, currentIndex);
|
3161
|
+
};
|
3162
|
+
const hasError = error !== void 0;
|
3163
|
+
const renderButtonLabel = () => {
|
3164
|
+
if (addComponentIsOpen) {
|
3165
|
+
return formatMessage({ id: "app.utils.close-label", defaultMessage: "Close" });
|
3204
3166
|
}
|
3205
|
-
|
3206
|
-
|
3207
|
-
|
3208
|
-
|
3209
|
-
|
3210
|
-
|
3211
|
-
|
3167
|
+
if (hasError && dynamicDisplayedComponentsLength > max) {
|
3168
|
+
return formatMessage(
|
3169
|
+
{
|
3170
|
+
id: index.getTranslation(`components.DynamicZone.extra-components`),
|
3171
|
+
defaultMessage: "There {number, plural, =0 {are # extra components} one {is # extra component} other {are # extra components}}"
|
3172
|
+
},
|
3173
|
+
{
|
3174
|
+
number: dynamicDisplayedComponentsLength - max
|
3175
|
+
}
|
3176
|
+
);
|
3177
|
+
}
|
3178
|
+
if (hasError && dynamicDisplayedComponentsLength < min) {
|
3179
|
+
return formatMessage(
|
3180
|
+
{
|
3181
|
+
id: index.getTranslation(`components.DynamicZone.missing-components`),
|
3182
|
+
defaultMessage: "There {number, plural, =0 {are # missing components} one {is # missing component} other {are # missing components}}"
|
3183
|
+
},
|
3184
|
+
{ number: min - dynamicDisplayedComponentsLength }
|
3185
|
+
);
|
3212
3186
|
}
|
3213
|
-
|
3214
|
-
`;
|
3215
|
-
const ComponentCategory = ({
|
3216
|
-
category,
|
3217
|
-
components = [],
|
3218
|
-
variant = "primary",
|
3219
|
-
onAddComponent
|
3220
|
-
}) => {
|
3221
|
-
const { formatMessage } = reactIntl.useIntl();
|
3222
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: category, children: [
|
3223
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { variant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: formatMessage({ id: category, defaultMessage: category }) }) }),
|
3224
|
-
/* @__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(
|
3225
|
-
ComponentBox,
|
3187
|
+
return formatMessage(
|
3226
3188
|
{
|
3227
|
-
|
3228
|
-
|
3229
|
-
background: "neutral100",
|
3230
|
-
justifyContent: "center",
|
3231
|
-
onClick: onAddComponent(uid),
|
3232
|
-
hasRadius: true,
|
3233
|
-
height: "8.4rem",
|
3234
|
-
shrink: 0,
|
3235
|
-
borderColor: "neutral200",
|
3236
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 1, alignItems: "center", justifyContent: "center", children: [
|
3237
|
-
/* @__PURE__ */ jsxRuntime.jsx(ComponentIcon.ComponentIcon, { color: "currentColor", background: "primary200", icon }),
|
3238
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", children: displayName })
|
3239
|
-
] })
|
3189
|
+
id: index.getTranslation("components.DynamicZone.add-component"),
|
3190
|
+
defaultMessage: "Add a component to {componentName}"
|
3240
3191
|
},
|
3241
|
-
|
3242
|
-
)
|
3243
|
-
] });
|
3244
|
-
};
|
3245
|
-
const Grid = styledComponents.styled(designSystem.Box)`
|
3246
|
-
display: grid;
|
3247
|
-
grid-template-columns: repeat(auto-fit, 14rem);
|
3248
|
-
grid-gap: ${({ theme }) => theme.spaces[1]};
|
3249
|
-
`;
|
3250
|
-
const ComponentBox = styledComponents.styled(designSystem.Flex)`
|
3251
|
-
color: ${({ theme }) => theme.colors.neutral600};
|
3252
|
-
cursor: pointer;
|
3253
|
-
|
3254
|
-
@media (prefers-reduced-motion: no-preference) {
|
3255
|
-
transition: color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
|
3256
|
-
}
|
3257
|
-
|
3258
|
-
&:focus,
|
3259
|
-
&:hover {
|
3260
|
-
border: 1px solid ${({ theme }) => theme.colors.primary200};
|
3261
|
-
background: ${({ theme }) => theme.colors.primary100};
|
3262
|
-
color: ${({ theme }) => theme.colors.primary600};
|
3263
|
-
}
|
3264
|
-
`;
|
3265
|
-
const ComponentPicker = ({
|
3266
|
-
dynamicComponentsByCategory = {},
|
3267
|
-
isOpen,
|
3268
|
-
onClickAddComponent
|
3269
|
-
}) => {
|
3270
|
-
const { formatMessage } = reactIntl.useIntl();
|
3271
|
-
const handleAddComponentToDz = (componentUid) => () => {
|
3272
|
-
onClickAddComponent(componentUid);
|
3192
|
+
{ componentName: label || name2 }
|
3193
|
+
);
|
3273
3194
|
};
|
3274
|
-
|
3275
|
-
|
3276
|
-
|
3277
|
-
|
3278
|
-
|
3279
|
-
|
3280
|
-
|
3281
|
-
|
3282
|
-
|
3283
|
-
|
3284
|
-
|
3285
|
-
|
3286
|
-
|
3287
|
-
|
3288
|
-
|
3289
|
-
|
3290
|
-
|
3291
|
-
|
3292
|
-
|
3293
|
-
|
3294
|
-
|
3295
|
-
|
3296
|
-
|
3297
|
-
|
3298
|
-
|
3299
|
-
|
3300
|
-
|
3301
|
-
|
3302
|
-
|
3303
|
-
|
3304
|
-
|
3305
|
-
|
3195
|
+
const level = Relations.useComponent("DynamicZone", (state) => state.level);
|
3196
|
+
const ariaDescriptionId = React__namespace.useId();
|
3197
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DynamicZoneProvider, { isInDynamicZone: true, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
|
3198
|
+
dynamicDisplayedComponentsLength > 0 && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
|
3199
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
3200
|
+
DynamicZoneLabel,
|
3201
|
+
{
|
3202
|
+
hint,
|
3203
|
+
label,
|
3204
|
+
labelAction,
|
3205
|
+
name: name2,
|
3206
|
+
numberOfComponents: dynamicDisplayedComponentsLength,
|
3207
|
+
required
|
3208
|
+
}
|
3209
|
+
),
|
3210
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
|
3211
|
+
id: index.getTranslation("dnd.instructions"),
|
3212
|
+
defaultMessage: `Press spacebar to grab and re-order`
|
3213
|
+
}) }),
|
3214
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
|
3215
|
+
/* @__PURE__ */ jsxRuntime.jsx("ol", { "aria-describedby": ariaDescriptionId, children: value.map((field, index2) => /* @__PURE__ */ jsxRuntime.jsx(
|
3216
|
+
Relations.ComponentProvider,
|
3217
|
+
{
|
3218
|
+
level: level + 1,
|
3219
|
+
uid: field.__component,
|
3220
|
+
id: field.id,
|
3221
|
+
type: "dynamiczone",
|
3222
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
3223
|
+
DynamicComponent,
|
3224
|
+
{
|
3225
|
+
disabled,
|
3226
|
+
name: name2,
|
3227
|
+
index: index2,
|
3228
|
+
componentUid: field.__component,
|
3229
|
+
onMoveComponent: handleMoveComponent,
|
3230
|
+
onRemoveComponentClick: handleRemoveComponent(name2, index2),
|
3231
|
+
onCancel: handleCancel,
|
3232
|
+
onDropItem: handleDropItem,
|
3233
|
+
onGrabItem: handleGrabItem,
|
3234
|
+
onAddComponent: handleAddComponent,
|
3235
|
+
dynamicComponentsByCategory,
|
3236
|
+
children
|
3237
|
+
}
|
3238
|
+
)
|
3239
|
+
},
|
3240
|
+
field.__temp_key__
|
3241
|
+
)) })
|
3242
|
+
] }),
|
3243
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
3244
|
+
AddComponentButton,
|
3245
|
+
{
|
3246
|
+
hasError,
|
3247
|
+
isDisabled: disabled,
|
3248
|
+
isOpen: addComponentIsOpen,
|
3249
|
+
onClick: handleClickOpenPicker,
|
3250
|
+
children: renderButtonLabel()
|
3251
|
+
}
|
3252
|
+
) }),
|
3253
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
3254
|
+
ComponentPicker,
|
3255
|
+
{
|
3256
|
+
dynamicComponentsByCategory,
|
3257
|
+
isOpen: addComponentIsOpen,
|
3258
|
+
onClickAddComponent: handleAddComponent
|
3259
|
+
}
|
3260
|
+
)
|
3261
|
+
] }) });
|
3306
3262
|
};
|
3307
3263
|
const NotAllowedInput = ({ hint, label, required, name: name2 }) => {
|
3308
3264
|
const { formatMessage } = reactIntl.useIntl();
|
@@ -3376,7 +3332,7 @@ const UIDInput = React__namespace.forwardRef(
|
|
3376
3332
|
const [showRegenerate, setShowRegenerate] = React__namespace.useState(false);
|
3377
3333
|
const isCloning = reactRouterDom.useMatch(index.CLONE_PATH) !== null;
|
3378
3334
|
const field = strapiAdmin.useField(name2);
|
3379
|
-
const debouncedValue =
|
3335
|
+
const debouncedValue = relations.useDebounce(field.value, 300);
|
3380
3336
|
const hasChanged = debouncedValue !== field.initialValue;
|
3381
3337
|
const { toggleNotification } = strapiAdmin.useNotification();
|
3382
3338
|
const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
|
@@ -3782,8 +3738,7 @@ const Wrapper = styledComponents.styled.div`
|
|
3782
3738
|
`;
|
3783
3739
|
var listRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/, emptyListRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/, unorderedListRE = /[*+-]\s/;
|
3784
3740
|
function newlineAndIndentContinueMarkdownList(cm) {
|
3785
|
-
if (cm.getOption("disableInput"))
|
3786
|
-
return CodeMirror__default.default.Pass;
|
3741
|
+
if (cm.getOption("disableInput")) return CodeMirror__default.default.Pass;
|
3787
3742
|
var ranges = cm.listSelections(), replacements = [];
|
3788
3743
|
for (var i = 0; i < ranges.length; i++) {
|
3789
3744
|
var pos = ranges[i].head;
|
@@ -3817,8 +3772,7 @@ function newlineAndIndentContinueMarkdownList(cm) {
|
|
3817
3772
|
var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0);
|
3818
3773
|
var bullet = numbered ? parseInt(match[3], 10) + 1 + match[4] : match[2].replace("x", " ");
|
3819
3774
|
replacements[i] = "\n" + indent + bullet + after;
|
3820
|
-
if (numbered)
|
3821
|
-
incrementRemainingMarkdownListNumbers(cm, pos);
|
3775
|
+
if (numbered) incrementRemainingMarkdownListNumbers(cm, pos);
|
3822
3776
|
}
|
3823
3777
|
}
|
3824
3778
|
cm.replaceSelections(replacements);
|
@@ -3836,10 +3790,8 @@ function incrementRemainingMarkdownListNumbers(cm, pos) {
|
|
3836
3790
|
var newNumber = parseInt(startItem[3], 10) + lookAhead - skipCount;
|
3837
3791
|
var nextNumber = parseInt(nextItem[3], 10), itemNumber = nextNumber;
|
3838
3792
|
if (startIndent === nextIndent && !isNaN(nextNumber)) {
|
3839
|
-
if (newNumber === nextNumber)
|
3840
|
-
|
3841
|
-
if (newNumber > nextNumber)
|
3842
|
-
itemNumber = newNumber + 1;
|
3793
|
+
if (newNumber === nextNumber) itemNumber = nextNumber + 1;
|
3794
|
+
if (newNumber > nextNumber) itemNumber = newNumber + 1;
|
3843
3795
|
cm.replaceRange(
|
3844
3796
|
nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]),
|
3845
3797
|
{
|
@@ -3852,10 +3804,8 @@ function incrementRemainingMarkdownListNumbers(cm, pos) {
|
|
3852
3804
|
}
|
3853
3805
|
);
|
3854
3806
|
} else {
|
3855
|
-
if (startIndent.length > nextIndent.length)
|
3856
|
-
|
3857
|
-
if (startIndent.length < nextIndent.length && lookAhead === 1)
|
3858
|
-
return;
|
3807
|
+
if (startIndent.length > nextIndent.length) return;
|
3808
|
+
if (startIndent.length < nextIndent.length && lookAhead === 1) return;
|
3859
3809
|
skipCount += 1;
|
3860
3810
|
}
|
3861
3811
|
}
|
@@ -4933,7 +4883,7 @@ const Wysiwyg = React__namespace.forwardRef(
|
|
4933
4883
|
const handleSelectAssets = (files) => {
|
4934
4884
|
const formattedFiles = files.map((f) => ({
|
4935
4885
|
alt: f.alternativeText || f.name,
|
4936
|
-
url:
|
4886
|
+
url: usePrev.prefixFileUrlWithBackendUrl(f.url),
|
4937
4887
|
mime: f.mime
|
4938
4888
|
}));
|
4939
4889
|
insertFile(editorRef, formattedFiles);
|
@@ -4989,626 +4939,680 @@ const Wysiwyg = React__namespace.forwardRef(
|
|
4989
4939
|
/* @__PURE__ */ jsxRuntime.jsx(MediaLibraryDialog, { onClose: handleToggleMediaLib, onSelectAssets: handleSelectAssets })
|
4990
4940
|
] });
|
4991
4941
|
}
|
4992
|
-
);
|
4993
|
-
const MemoizedWysiwyg = React__namespace.memo(Wysiwyg);
|
4994
|
-
const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
|
4995
|
-
const { id, document: document2, collectionType } = index.useDoc();
|
4996
|
-
const isFormDisabled = strapiAdmin.useForm("InputRenderer", (state) => state.disabled);
|
4997
|
-
const isInDynamicZone = useDynamicZone("isInDynamicZone", (state) => state.isInDynamicZone);
|
4998
|
-
const canCreateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canCreateFields);
|
4999
|
-
const canReadFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canReadFields);
|
5000
|
-
const canUpdateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUpdateFields);
|
5001
|
-
const canUserAction = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUserAction);
|
5002
|
-
let idToCheck = id;
|
5003
|
-
if (collectionType === index.SINGLE_TYPES) {
|
5004
|
-
idToCheck = document2?.documentId;
|
4942
|
+
);
|
4943
|
+
const MemoizedWysiwyg = React__namespace.memo(Wysiwyg);
|
4944
|
+
const InputRenderer = ({ visible, hint: providedHint, ...props }) => {
|
4945
|
+
const { id, document: document2, collectionType } = index.useDoc();
|
4946
|
+
const isFormDisabled = strapiAdmin.useForm("InputRenderer", (state) => state.disabled);
|
4947
|
+
const isInDynamicZone = useDynamicZone("isInDynamicZone", (state) => state.isInDynamicZone);
|
4948
|
+
const canCreateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canCreateFields);
|
4949
|
+
const canReadFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canReadFields);
|
4950
|
+
const canUpdateFields = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUpdateFields);
|
4951
|
+
const canUserAction = index.useDocumentRBAC("InputRenderer", (rbac) => rbac.canUserAction);
|
4952
|
+
let idToCheck = id;
|
4953
|
+
if (collectionType === index.SINGLE_TYPES) {
|
4954
|
+
idToCheck = document2?.documentId;
|
4955
|
+
}
|
4956
|
+
const editableFields = idToCheck ? canUpdateFields : canCreateFields;
|
4957
|
+
const readableFields = idToCheck ? canReadFields : canCreateFields;
|
4958
|
+
const canUserReadField = canUserAction(props.name, readableFields, props.type);
|
4959
|
+
const canUserEditField = canUserAction(props.name, editableFields, props.type);
|
4960
|
+
const fields = strapiAdmin.useStrapiApp("InputRenderer", (app) => app.fields);
|
4961
|
+
const { lazyComponentStore } = useLazyComponents(
|
4962
|
+
attributeHasCustomFieldProperty(props.attribute) ? [props.attribute.customField] : void 0
|
4963
|
+
);
|
4964
|
+
const hint = useFieldHint(providedHint, props.attribute);
|
4965
|
+
const {
|
4966
|
+
edit: { components }
|
4967
|
+
} = index.useDocLayout();
|
4968
|
+
const field = strapiAdmin.useField(props.name);
|
4969
|
+
if (!visible) {
|
4970
|
+
return null;
|
4971
|
+
}
|
4972
|
+
if (!canUserReadField && !isInDynamicZone) {
|
4973
|
+
return /* @__PURE__ */ jsxRuntime.jsx(NotAllowedInput, { hint, ...props });
|
4974
|
+
}
|
4975
|
+
const fieldIsDisabled = !canUserEditField && !isInDynamicZone || props.disabled || isFormDisabled;
|
4976
|
+
if (attributeHasCustomFieldProperty(props.attribute)) {
|
4977
|
+
const CustomInput = lazyComponentStore[props.attribute.customField];
|
4978
|
+
if (CustomInput) {
|
4979
|
+
return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, ...field, hint, disabled: fieldIsDisabled });
|
4980
|
+
}
|
4981
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
4982
|
+
strapiAdmin.InputRenderer,
|
4983
|
+
{
|
4984
|
+
...props,
|
4985
|
+
hint,
|
4986
|
+
type: props.attribute.customField,
|
4987
|
+
disabled: fieldIsDisabled
|
4988
|
+
}
|
4989
|
+
);
|
4990
|
+
}
|
4991
|
+
const addedInputTypes = Object.keys(fields);
|
4992
|
+
if (!attributeHasCustomFieldProperty(props.attribute) && addedInputTypes.includes(props.type)) {
|
4993
|
+
const CustomInput = fields[props.type];
|
4994
|
+
return /* @__PURE__ */ jsxRuntime.jsx(CustomInput, { ...props, hint, disabled: fieldIsDisabled });
|
4995
|
+
}
|
4996
|
+
switch (props.type) {
|
4997
|
+
case "blocks":
|
4998
|
+
return /* @__PURE__ */ jsxRuntime.jsx(MemoizedBlocksInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
|
4999
|
+
case "component":
|
5000
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
5001
|
+
MemoizedComponentInput,
|
5002
|
+
{
|
5003
|
+
...props,
|
5004
|
+
hint,
|
5005
|
+
layout: components[props.attribute.component].layout,
|
5006
|
+
disabled: fieldIsDisabled,
|
5007
|
+
children: (inputProps) => /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...inputProps })
|
5008
|
+
}
|
5009
|
+
);
|
5010
|
+
case "dynamiczone":
|
5011
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DynamicZone, { ...props, hint, disabled: fieldIsDisabled });
|
5012
|
+
case "relation":
|
5013
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Relations.MemoizedRelationsField, { ...props, hint, disabled: fieldIsDisabled });
|
5014
|
+
case "richtext":
|
5015
|
+
return /* @__PURE__ */ jsxRuntime.jsx(MemoizedWysiwyg, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
|
5016
|
+
case "uid":
|
5017
|
+
return /* @__PURE__ */ jsxRuntime.jsx(MemoizedUIDInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
|
5018
|
+
case "enumeration":
|
5019
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
5020
|
+
strapiAdmin.InputRenderer,
|
5021
|
+
{
|
5022
|
+
...props,
|
5023
|
+
hint,
|
5024
|
+
options: props.attribute.enum.map((value) => ({ value })),
|
5025
|
+
type: props.customField ? "custom-field" : props.type,
|
5026
|
+
disabled: fieldIsDisabled
|
5027
|
+
}
|
5028
|
+
);
|
5029
|
+
default:
|
5030
|
+
const { unique: _unique, mainField: _mainField, ...restProps } = props;
|
5031
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
5032
|
+
strapiAdmin.InputRenderer,
|
5033
|
+
{
|
5034
|
+
...restProps,
|
5035
|
+
hint,
|
5036
|
+
type: props.customField ? "custom-field" : props.type,
|
5037
|
+
disabled: fieldIsDisabled
|
5038
|
+
}
|
5039
|
+
);
|
5040
|
+
}
|
5041
|
+
};
|
5042
|
+
const attributeHasCustomFieldProperty = (attribute) => "customField" in attribute && typeof attribute.customField === "string";
|
5043
|
+
const useFieldHint = (hint = void 0, attribute) => {
|
5044
|
+
const { formatMessage } = reactIntl.useIntl();
|
5045
|
+
const { maximum, minimum } = getMinMax(attribute);
|
5046
|
+
if (!maximum && !minimum) {
|
5047
|
+
return hint;
|
5005
5048
|
}
|
5006
|
-
const
|
5007
|
-
|
5008
|
-
|
5009
|
-
|
5010
|
-
|
5011
|
-
|
5012
|
-
|
5049
|
+
const units = !["biginteger", "integer", "number", "dynamiczone", "component"].includes(
|
5050
|
+
attribute.type
|
5051
|
+
) ? formatMessage(
|
5052
|
+
{
|
5053
|
+
id: "content-manager.form.Input.hint.character.unit",
|
5054
|
+
defaultMessage: "{maxValue, plural, one { character} other { characters}}"
|
5055
|
+
},
|
5056
|
+
{
|
5057
|
+
maxValue: Math.max(minimum || 0, maximum || 0)
|
5058
|
+
}
|
5059
|
+
) : null;
|
5060
|
+
const hasMinAndMax = typeof minimum === "number" && typeof maximum === "number";
|
5061
|
+
return formatMessage(
|
5062
|
+
{
|
5063
|
+
id: "content-manager.form.Input.hint.text",
|
5064
|
+
defaultMessage: "{min, select, undefined {} other {min. {min}}}{divider}{max, select, undefined {} other {max. {max}}}{unit}{br}{description}"
|
5065
|
+
},
|
5066
|
+
{
|
5067
|
+
min: minimum,
|
5068
|
+
max: maximum,
|
5069
|
+
description: hint,
|
5070
|
+
unit: units,
|
5071
|
+
divider: hasMinAndMax ? formatMessage({
|
5072
|
+
id: "content-manager.form.Input.hint.minMaxDivider",
|
5073
|
+
defaultMessage: " / "
|
5074
|
+
}) : null,
|
5075
|
+
br: /* @__PURE__ */ jsxRuntime.jsx("br", {})
|
5076
|
+
}
|
5013
5077
|
);
|
5014
|
-
|
5015
|
-
|
5016
|
-
|
5017
|
-
|
5018
|
-
|
5019
|
-
|
5020
|
-
|
5078
|
+
};
|
5079
|
+
const getMinMax = (attribute) => {
|
5080
|
+
if ("min" in attribute || "max" in attribute) {
|
5081
|
+
return {
|
5082
|
+
maximum: !Number.isNaN(Number(attribute.max)) ? Number(attribute.max) : void 0,
|
5083
|
+
minimum: !Number.isNaN(Number(attribute.min)) ? Number(attribute.min) : void 0
|
5084
|
+
};
|
5085
|
+
} else if ("maxLength" in attribute || "minLength" in attribute) {
|
5086
|
+
return { maximum: attribute.maxLength, minimum: attribute.minLength };
|
5087
|
+
} else {
|
5088
|
+
return { maximum: void 0, minimum: void 0 };
|
5021
5089
|
}
|
5022
|
-
|
5023
|
-
|
5090
|
+
};
|
5091
|
+
const MemoizedInputRenderer = React.memo(InputRenderer);
|
5092
|
+
const RESPONSIVE_CONTAINER_BREAKPOINTS = {
|
5093
|
+
sm: "27.5rem"
|
5094
|
+
// 440px
|
5095
|
+
};
|
5096
|
+
const ResponsiveGridRoot = styledComponents.styled(designSystem.Grid.Root)`
|
5097
|
+
container-type: inline-size;
|
5098
|
+
`;
|
5099
|
+
const ResponsiveGridItem = styledComponents.styled(designSystem.Grid.Item)`
|
5100
|
+
grid-column: span 12;
|
5101
|
+
|
5102
|
+
@container (min-width: ${RESPONSIVE_CONTAINER_BREAKPOINTS.sm}) {
|
5103
|
+
${({ col }) => col && `grid-column: span ${col};`}
|
5024
5104
|
}
|
5025
|
-
|
5026
|
-
|
5027
|
-
|
5028
|
-
|
5029
|
-
|
5105
|
+
`;
|
5106
|
+
const FormLayout = ({ layout }) => {
|
5107
|
+
const { formatMessage } = reactIntl.useIntl();
|
5108
|
+
const { model } = index.useDoc();
|
5109
|
+
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((panel, index2) => {
|
5110
|
+
if (panel.some((row) => row.some((field) => field.type === "dynamiczone"))) {
|
5111
|
+
const [row] = panel;
|
5112
|
+
const [field] = row;
|
5113
|
+
const fieldWithTranslatedLabel = {
|
5114
|
+
...field,
|
5115
|
+
label: formatMessage({
|
5116
|
+
id: `content-manager.content-types.${model}.${field.name}`,
|
5117
|
+
defaultMessage: field.label
|
5118
|
+
})
|
5119
|
+
};
|
5120
|
+
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);
|
5030
5121
|
}
|
5031
5122
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
5032
|
-
|
5123
|
+
designSystem.Box,
|
5033
5124
|
{
|
5034
|
-
|
5035
|
-
|
5036
|
-
|
5037
|
-
|
5125
|
+
hasRadius: true,
|
5126
|
+
background: "neutral0",
|
5127
|
+
shadow: "tableShadow",
|
5128
|
+
paddingLeft: 6,
|
5129
|
+
paddingRight: 6,
|
5130
|
+
paddingTop: 6,
|
5131
|
+
paddingBottom: 6,
|
5132
|
+
borderColor: "neutral150",
|
5133
|
+
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 }) => {
|
5134
|
+
const fieldWithTranslatedLabel = {
|
5135
|
+
...field,
|
5136
|
+
label: formatMessage({
|
5137
|
+
id: `content-manager.content-types.${model}.${field.name}`,
|
5138
|
+
defaultMessage: field.label
|
5139
|
+
})
|
5140
|
+
};
|
5141
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
5142
|
+
ResponsiveGridItem,
|
5143
|
+
{
|
5144
|
+
col: size,
|
5145
|
+
s: 12,
|
5146
|
+
xs: 12,
|
5147
|
+
direction: "column",
|
5148
|
+
alignItems: "stretch",
|
5149
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel })
|
5150
|
+
},
|
5151
|
+
field.name
|
5152
|
+
);
|
5153
|
+
}) }, gridRowIndex)) })
|
5154
|
+
},
|
5155
|
+
index2
|
5156
|
+
);
|
5157
|
+
}) });
|
5158
|
+
};
|
5159
|
+
const NonRepeatableComponent = ({
|
5160
|
+
attribute,
|
5161
|
+
name: name2,
|
5162
|
+
children,
|
5163
|
+
layout
|
5164
|
+
}) => {
|
5165
|
+
const { formatMessage } = reactIntl.useIntl();
|
5166
|
+
const { value } = strapiAdmin.useField(name2);
|
5167
|
+
const level = Relations.useComponent("NonRepeatableComponent", (state) => state.level);
|
5168
|
+
const isNested = level > 0;
|
5169
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Relations.ComponentProvider, { id: value?.id, uid: attribute.component, level: level + 1, type: "component", children: /* @__PURE__ */ jsxRuntime.jsx(
|
5170
|
+
designSystem.Box,
|
5171
|
+
{
|
5172
|
+
background: "neutral100",
|
5173
|
+
paddingLeft: 6,
|
5174
|
+
paddingRight: 6,
|
5175
|
+
paddingTop: 6,
|
5176
|
+
paddingBottom: 6,
|
5177
|
+
hasRadius: isNested,
|
5178
|
+
borderColor: isNested ? "neutral200" : void 0,
|
5179
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: layout.map((row, index2) => {
|
5180
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
|
5181
|
+
const completeFieldName = `${name2}.${field.name}`;
|
5182
|
+
const translatedLabel = formatMessage({
|
5183
|
+
id: `content-manager.components.${attribute.component}.${field.name}`,
|
5184
|
+
defaultMessage: field.label
|
5185
|
+
});
|
5186
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
5187
|
+
ResponsiveGridItem,
|
5188
|
+
{
|
5189
|
+
col: size,
|
5190
|
+
s: 12,
|
5191
|
+
xs: 12,
|
5192
|
+
direction: "column",
|
5193
|
+
alignItems: "stretch",
|
5194
|
+
children: children({ ...field, label: translatedLabel, name: completeFieldName })
|
5195
|
+
},
|
5196
|
+
completeFieldName
|
5197
|
+
);
|
5198
|
+
}) }, index2);
|
5199
|
+
}) })
|
5200
|
+
}
|
5201
|
+
) });
|
5202
|
+
};
|
5203
|
+
const RepeatableComponent = ({
|
5204
|
+
attribute,
|
5205
|
+
disabled,
|
5206
|
+
name: name2,
|
5207
|
+
mainField,
|
5208
|
+
children,
|
5209
|
+
layout
|
5210
|
+
}) => {
|
5211
|
+
const { toggleNotification } = strapiAdmin.useNotification();
|
5212
|
+
const { formatMessage } = reactIntl.useIntl();
|
5213
|
+
const { search: searchString } = reactRouterDom.useLocation();
|
5214
|
+
const search = React__namespace.useMemo(() => new URLSearchParams(searchString), [searchString]);
|
5215
|
+
const { components } = index.useDoc();
|
5216
|
+
const {
|
5217
|
+
value = [],
|
5218
|
+
error,
|
5219
|
+
rawError
|
5220
|
+
} = strapiAdmin.useField(name2);
|
5221
|
+
const addFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.addFieldRow);
|
5222
|
+
const moveFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.moveFieldRow);
|
5223
|
+
const removeFieldRow = strapiAdmin.useForm("RepeatableComponent", (state) => state.removeFieldRow);
|
5224
|
+
const { max = Infinity } = attribute;
|
5225
|
+
const [collapseToOpen, setCollapseToOpen] = React__namespace.useState("");
|
5226
|
+
const [liveText, setLiveText] = React__namespace.useState("");
|
5227
|
+
React__namespace.useEffect(() => {
|
5228
|
+
const hasNestedErrors = rawError && Array.isArray(rawError) && rawError.length > 0;
|
5229
|
+
const hasNestedValue = value && Array.isArray(value) && value.length > 0;
|
5230
|
+
if (hasNestedErrors && hasNestedValue) {
|
5231
|
+
const errorOpenItems = rawError.map((_, idx) => {
|
5232
|
+
return value[idx] ? value[idx].__temp_key__ : null;
|
5233
|
+
}).filter((value2) => !!value2);
|
5234
|
+
if (errorOpenItems && errorOpenItems.length > 0) {
|
5235
|
+
setCollapseToOpen((collapseToOpen2) => {
|
5236
|
+
if (!errorOpenItems.includes(collapseToOpen2)) {
|
5237
|
+
return errorOpenItems[0];
|
5238
|
+
}
|
5239
|
+
return collapseToOpen2;
|
5240
|
+
});
|
5241
|
+
}
|
5242
|
+
}
|
5243
|
+
}, [rawError, value]);
|
5244
|
+
const componentTmpKeyWithFocussedField = React__namespace.useMemo(() => {
|
5245
|
+
if (search.has("field")) {
|
5246
|
+
const fieldParam = search.get("field");
|
5247
|
+
if (!fieldParam) {
|
5248
|
+
return void 0;
|
5249
|
+
}
|
5250
|
+
const [, path] = fieldParam.split(`${name2}.`);
|
5251
|
+
if (objects.getIn(value, path, void 0) !== void 0) {
|
5252
|
+
const [subpath] = path.split(".");
|
5253
|
+
return objects.getIn(value, subpath, void 0)?.__temp_key__;
|
5038
5254
|
}
|
5255
|
+
}
|
5256
|
+
return void 0;
|
5257
|
+
}, [search, name2, value]);
|
5258
|
+
const prevValue = usePrev.usePrev(value);
|
5259
|
+
React__namespace.useEffect(() => {
|
5260
|
+
if (prevValue && prevValue.length < value.length) {
|
5261
|
+
setCollapseToOpen(value[value.length - 1].__temp_key__);
|
5262
|
+
}
|
5263
|
+
}, [value, prevValue]);
|
5264
|
+
React__namespace.useEffect(() => {
|
5265
|
+
if (typeof componentTmpKeyWithFocussedField === "string") {
|
5266
|
+
setCollapseToOpen(componentTmpKeyWithFocussedField);
|
5267
|
+
}
|
5268
|
+
}, [componentTmpKeyWithFocussedField]);
|
5269
|
+
const toggleCollapses = () => {
|
5270
|
+
setCollapseToOpen("");
|
5271
|
+
};
|
5272
|
+
const handleClick = () => {
|
5273
|
+
if (value.length < max) {
|
5274
|
+
const schema = components[attribute.component];
|
5275
|
+
const form = index.createDefaultForm(schema, components);
|
5276
|
+
const data = index.transformDocument(schema, components)(form);
|
5277
|
+
addFieldRow(name2, data);
|
5278
|
+
} else if (value.length >= max) {
|
5279
|
+
toggleNotification({
|
5280
|
+
type: "info",
|
5281
|
+
message: formatMessage({
|
5282
|
+
id: index.getTranslation("components.notification.info.maximum-requirement")
|
5283
|
+
})
|
5284
|
+
});
|
5285
|
+
}
|
5286
|
+
};
|
5287
|
+
const handleMoveComponentField = (newIndex, currentIndex) => {
|
5288
|
+
setLiveText(
|
5289
|
+
formatMessage(
|
5290
|
+
{
|
5291
|
+
id: index.getTranslation("dnd.reorder"),
|
5292
|
+
defaultMessage: "{item}, moved. New position in list: {position}."
|
5293
|
+
},
|
5294
|
+
{
|
5295
|
+
item: `${name2}.${currentIndex}`,
|
5296
|
+
position: getItemPos(newIndex)
|
5297
|
+
}
|
5298
|
+
)
|
5039
5299
|
);
|
5040
|
-
|
5041
|
-
|
5042
|
-
|
5043
|
-
|
5044
|
-
|
5045
|
-
}
|
5046
|
-
|
5047
|
-
|
5048
|
-
|
5049
|
-
case "component":
|
5050
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
5051
|
-
MemoizedComponentInput,
|
5300
|
+
moveFieldRow(name2, currentIndex, newIndex);
|
5301
|
+
};
|
5302
|
+
const handleValueChange = (key) => {
|
5303
|
+
setCollapseToOpen(key);
|
5304
|
+
};
|
5305
|
+
const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
|
5306
|
+
const handleCancel = (index$1) => {
|
5307
|
+
setLiveText(
|
5308
|
+
formatMessage(
|
5052
5309
|
{
|
5053
|
-
|
5054
|
-
|
5055
|
-
|
5056
|
-
|
5057
|
-
|
5310
|
+
id: index.getTranslation("dnd.cancel-item"),
|
5311
|
+
defaultMessage: "{item}, dropped. Re-order cancelled."
|
5312
|
+
},
|
5313
|
+
{
|
5314
|
+
item: `${name2}.${index$1}`
|
5058
5315
|
}
|
5059
|
-
)
|
5060
|
-
|
5061
|
-
|
5062
|
-
|
5063
|
-
|
5064
|
-
|
5065
|
-
return /* @__PURE__ */ jsxRuntime.jsx(MemoizedWysiwyg, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
|
5066
|
-
case "uid":
|
5067
|
-
return /* @__PURE__ */ jsxRuntime.jsx(MemoizedUIDInput, { ...props, hint, type: props.type, disabled: fieldIsDisabled });
|
5068
|
-
case "enumeration":
|
5069
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
5070
|
-
strapiAdmin.InputRenderer,
|
5316
|
+
)
|
5317
|
+
);
|
5318
|
+
};
|
5319
|
+
const handleGrabItem = (index$1) => {
|
5320
|
+
setLiveText(
|
5321
|
+
formatMessage(
|
5071
5322
|
{
|
5072
|
-
|
5073
|
-
|
5074
|
-
|
5075
|
-
|
5076
|
-
|
5323
|
+
id: index.getTranslation("dnd.grab-item"),
|
5324
|
+
defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
|
5325
|
+
},
|
5326
|
+
{
|
5327
|
+
item: `${name2}.${index$1}`,
|
5328
|
+
position: getItemPos(index$1)
|
5077
5329
|
}
|
5078
|
-
)
|
5079
|
-
|
5080
|
-
|
5081
|
-
|
5082
|
-
|
5330
|
+
)
|
5331
|
+
);
|
5332
|
+
};
|
5333
|
+
const handleDropItem = (index$1) => {
|
5334
|
+
setLiveText(
|
5335
|
+
formatMessage(
|
5083
5336
|
{
|
5084
|
-
|
5085
|
-
|
5086
|
-
|
5087
|
-
|
5337
|
+
id: index.getTranslation("dnd.drop-item"),
|
5338
|
+
defaultMessage: `{item}, dropped. Final position in list: {position}.`
|
5339
|
+
},
|
5340
|
+
{
|
5341
|
+
item: `${name2}.${index$1}`,
|
5342
|
+
position: getItemPos(index$1)
|
5088
5343
|
}
|
5089
|
-
)
|
5344
|
+
)
|
5345
|
+
);
|
5346
|
+
};
|
5347
|
+
const ariaDescriptionId = React__namespace.useId();
|
5348
|
+
const level = Relations.useComponent("RepeatableComponent", (state) => state.level);
|
5349
|
+
if (value.length === 0) {
|
5350
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleClick });
|
5090
5351
|
}
|
5352
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { hasRadius: true, children: [
|
5353
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
|
5354
|
+
id: index.getTranslation("dnd.instructions"),
|
5355
|
+
defaultMessage: `Press spacebar to grab and re-order`
|
5356
|
+
}) }),
|
5357
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
|
5358
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
5359
|
+
AccordionRoot,
|
5360
|
+
{
|
5361
|
+
$error: error,
|
5362
|
+
value: collapseToOpen,
|
5363
|
+
onValueChange: handleValueChange,
|
5364
|
+
"aria-describedby": ariaDescriptionId,
|
5365
|
+
children: [
|
5366
|
+
value.map(({ __temp_key__: key, id }, index2) => {
|
5367
|
+
const nameWithIndex = `${name2}.${index2}`;
|
5368
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
5369
|
+
Relations.ComponentProvider,
|
5370
|
+
{
|
5371
|
+
id,
|
5372
|
+
uid: attribute.component,
|
5373
|
+
level: level + 1,
|
5374
|
+
type: "repeatable",
|
5375
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
5376
|
+
Component,
|
5377
|
+
{
|
5378
|
+
disabled,
|
5379
|
+
name: nameWithIndex,
|
5380
|
+
attribute,
|
5381
|
+
index: index2,
|
5382
|
+
mainField,
|
5383
|
+
onMoveItem: handleMoveComponentField,
|
5384
|
+
onDeleteComponent: () => {
|
5385
|
+
removeFieldRow(name2, index2);
|
5386
|
+
toggleCollapses();
|
5387
|
+
},
|
5388
|
+
toggleCollapses,
|
5389
|
+
onCancel: handleCancel,
|
5390
|
+
onDropItem: handleDropItem,
|
5391
|
+
onGrabItem: handleGrabItem,
|
5392
|
+
__temp_key__: key,
|
5393
|
+
children: layout.map((row, index22) => {
|
5394
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ResponsiveGridRoot, { gap: 4, children: row.map(({ size, ...field }) => {
|
5395
|
+
const completeFieldName = `${nameWithIndex}.${field.name}`;
|
5396
|
+
const translatedLabel = formatMessage({
|
5397
|
+
id: `content-manager.components.${attribute.component}.${field.name}`,
|
5398
|
+
defaultMessage: field.label
|
5399
|
+
});
|
5400
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
5401
|
+
ResponsiveGridItem,
|
5402
|
+
{
|
5403
|
+
col: size,
|
5404
|
+
s: 12,
|
5405
|
+
xs: 12,
|
5406
|
+
direction: "column",
|
5407
|
+
alignItems: "stretch",
|
5408
|
+
children: children({
|
5409
|
+
...field,
|
5410
|
+
label: translatedLabel,
|
5411
|
+
name: completeFieldName
|
5412
|
+
})
|
5413
|
+
},
|
5414
|
+
completeFieldName
|
5415
|
+
);
|
5416
|
+
}) }, index22);
|
5417
|
+
})
|
5418
|
+
}
|
5419
|
+
)
|
5420
|
+
},
|
5421
|
+
key
|
5422
|
+
);
|
5423
|
+
}),
|
5424
|
+
/* @__PURE__ */ jsxRuntime.jsx(TextButtonCustom, { disabled, onClick: handleClick, startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Plus, {}), children: formatMessage({
|
5425
|
+
id: index.getTranslation("containers.EditView.add.new-entry"),
|
5426
|
+
defaultMessage: "Add an entry"
|
5427
|
+
}) })
|
5428
|
+
]
|
5429
|
+
}
|
5430
|
+
)
|
5431
|
+
] });
|
5091
5432
|
};
|
5092
|
-
const
|
5093
|
-
|
5094
|
-
|
5095
|
-
|
5096
|
-
|
5097
|
-
|
5098
|
-
|
5099
|
-
|
5100
|
-
|
5101
|
-
)
|
5102
|
-
|
5103
|
-
|
5104
|
-
|
5105
|
-
|
5106
|
-
|
5107
|
-
|
5108
|
-
|
5109
|
-
) : null;
|
5110
|
-
const hasMinAndMax = typeof minimum === "number" && typeof maximum === "number";
|
5111
|
-
return formatMessage(
|
5112
|
-
{
|
5113
|
-
id: "content-manager.form.Input.hint.text",
|
5114
|
-
defaultMessage: "{min, select, undefined {} other {min. {min}}}{divider}{max, select, undefined {} other {max. {max}}}{unit}{br}{description}"
|
5115
|
-
},
|
5116
|
-
{
|
5117
|
-
min: minimum,
|
5118
|
-
max: maximum,
|
5119
|
-
description: hint,
|
5120
|
-
unit: units,
|
5121
|
-
divider: hasMinAndMax ? formatMessage({
|
5122
|
-
id: "content-manager.form.Input.hint.minMaxDivider",
|
5123
|
-
defaultMessage: " / "
|
5124
|
-
}) : null,
|
5125
|
-
br: /* @__PURE__ */ jsxRuntime.jsx("br", {})
|
5433
|
+
const AccordionRoot = styledComponents.styled(designSystem.Accordion.Root)`
|
5434
|
+
border: 1px solid
|
5435
|
+
${({ theme, $error }) => $error ? theme.colors.danger600 : theme.colors.neutral200};
|
5436
|
+
`;
|
5437
|
+
const TextButtonCustom = styledComponents.styled(designSystem.TextButton)`
|
5438
|
+
width: 100%;
|
5439
|
+
display: flex;
|
5440
|
+
justify-content: center;
|
5441
|
+
border-top: 1px solid ${({ theme }) => theme.colors.neutral200};
|
5442
|
+
padding-inline: ${(props) => props.theme.spaces[6]};
|
5443
|
+
padding-block: ${(props) => props.theme.spaces[3]};
|
5444
|
+
|
5445
|
+
&:not([disabled]) {
|
5446
|
+
cursor: pointer;
|
5447
|
+
|
5448
|
+
&:hover {
|
5449
|
+
background-color: ${(props) => props.theme.colors.primary100};
|
5126
5450
|
}
|
5127
|
-
);
|
5128
|
-
};
|
5129
|
-
const getMinMax = (attribute) => {
|
5130
|
-
if ("min" in attribute || "max" in attribute) {
|
5131
|
-
return {
|
5132
|
-
maximum: !Number.isNaN(Number(attribute.max)) ? Number(attribute.max) : void 0,
|
5133
|
-
minimum: !Number.isNaN(Number(attribute.min)) ? Number(attribute.min) : void 0
|
5134
|
-
};
|
5135
|
-
} else if ("maxLength" in attribute || "minLength" in attribute) {
|
5136
|
-
return { maximum: attribute.maxLength, minimum: attribute.minLength };
|
5137
|
-
} else {
|
5138
|
-
return { maximum: void 0, minimum: void 0 };
|
5139
5451
|
}
|
5140
|
-
|
5141
|
-
|
5142
|
-
|
5143
|
-
|
5452
|
+
|
5453
|
+
span {
|
5454
|
+
font-weight: 600;
|
5455
|
+
font-size: 1.4rem;
|
5456
|
+
line-height: 2.4rem;
|
5457
|
+
}
|
5458
|
+
|
5459
|
+
@media (prefers-reduced-motion: no-preference) {
|
5460
|
+
transition: background-color 120ms ${(props) => props.theme.motion.easings.easeOutQuad};
|
5461
|
+
}
|
5462
|
+
`;
|
5463
|
+
const Component = ({
|
5144
5464
|
disabled,
|
5145
5465
|
index: index$1,
|
5146
5466
|
name: name2,
|
5147
|
-
|
5148
|
-
|
5149
|
-
|
5150
|
-
|
5151
|
-
|
5152
|
-
|
5153
|
-
|
5467
|
+
mainField = {
|
5468
|
+
name: "id",
|
5469
|
+
type: "integer"
|
5470
|
+
},
|
5471
|
+
children,
|
5472
|
+
onDeleteComponent,
|
5473
|
+
toggleCollapses,
|
5474
|
+
__temp_key__,
|
5475
|
+
...dragProps
|
5154
5476
|
}) => {
|
5155
5477
|
const { formatMessage } = reactIntl.useIntl();
|
5156
|
-
const
|
5157
|
-
|
5158
|
-
|
5159
|
-
|
5160
|
-
const
|
5161
|
-
const { mainField } = components[componentUid]?.settings ?? { mainField: "id" };
|
5162
|
-
const mainFieldValue = objects.getIn(formValues, `${name2}.${index$1}.${mainField}`);
|
5163
|
-
const displayedValue = mainField === "id" || !mainFieldValue ? "" : String(mainFieldValue).trim();
|
5164
|
-
const mainValue = displayedValue.length > 0 ? `- ${displayedValue}` : displayedValue;
|
5165
|
-
return mainValue;
|
5166
|
-
}, [componentUid, components, formValues, name2, index$1]);
|
5167
|
-
const { icon, displayName } = React__namespace.useMemo(() => {
|
5168
|
-
const [category] = componentUid.split(".");
|
5169
|
-
const { icon: icon2, displayName: displayName2 } = (dynamicComponentsByCategory[category] ?? []).find(
|
5170
|
-
(component) => component.uid === componentUid
|
5171
|
-
) ?? { icon: null, displayName: null };
|
5172
|
-
return { icon: icon2, displayName: displayName2 };
|
5173
|
-
}, [componentUid, dynamicComponentsByCategory]);
|
5478
|
+
const displayValue = strapiAdmin.useForm("RepeatableComponent", (state) => {
|
5479
|
+
return objects.getIn(state.values, [...name2.split("."), mainField.name]);
|
5480
|
+
});
|
5481
|
+
const accordionRef = React__namespace.useRef(null);
|
5482
|
+
const componentKey = name2.split(".").slice(0, -1).join(".");
|
5174
5483
|
const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop.useDragAndDrop(!disabled, {
|
5175
|
-
type: `${useDragAndDrop.ItemTypes.
|
5484
|
+
type: `${useDragAndDrop.ItemTypes.COMPONENT}_${componentKey}`,
|
5176
5485
|
index: index$1,
|
5177
5486
|
item: {
|
5178
5487
|
index: index$1,
|
5179
|
-
displayedValue:
|
5180
|
-
icon
|
5488
|
+
displayedValue: displayValue
|
5181
5489
|
},
|
5182
|
-
|
5183
|
-
|
5184
|
-
|
5185
|
-
|
5490
|
+
onStart() {
|
5491
|
+
toggleCollapses();
|
5492
|
+
},
|
5493
|
+
...dragProps
|
5186
5494
|
});
|
5187
5495
|
React__namespace.useEffect(() => {
|
5188
5496
|
dragPreviewRef(reactDndHtml5Backend.getEmptyImage(), { captureDraggingState: false });
|
5189
5497
|
}, [dragPreviewRef, index$1]);
|
5190
|
-
const
|
5191
|
-
const
|
5192
|
-
|
5193
|
-
|
5194
|
-
|
5195
|
-
|
5196
|
-
|
5197
|
-
|
5198
|
-
|
5199
|
-
|
5200
|
-
|
5201
|
-
designSystem.IconButton,
|
5202
|
-
{
|
5203
|
-
variant: "ghost",
|
5204
|
-
label: formatMessage(
|
5498
|
+
const composedAccordionRefs = designSystem.useComposedRefs(accordionRef, dragRef);
|
5499
|
+
const composedBoxRefs = designSystem.useComposedRefs(
|
5500
|
+
boxRef,
|
5501
|
+
dropRef
|
5502
|
+
);
|
5503
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: isDragging ? /* @__PURE__ */ jsxRuntime.jsx(Preview, {}) : /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { ref: composedBoxRefs, value: __temp_key__, children: [
|
5504
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
|
5505
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: displayValue }),
|
5506
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Actions, { children: [
|
5507
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
5508
|
+
designSystem.IconButton,
|
5205
5509
|
{
|
5206
|
-
|
5207
|
-
|
5208
|
-
|
5209
|
-
|
5510
|
+
variant: "ghost",
|
5511
|
+
onClick: onDeleteComponent,
|
5512
|
+
label: formatMessage({
|
5513
|
+
id: index.getTranslation("containers.Edit.delete"),
|
5514
|
+
defaultMessage: "Delete"
|
5515
|
+
}),
|
5516
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
|
5517
|
+
}
|
5210
5518
|
),
|
5211
|
-
onClick: onRemoveComponentClick,
|
5212
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
|
5213
|
-
}
|
5214
|
-
),
|
5215
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
5216
|
-
designSystem.IconButton,
|
5217
|
-
{
|
5218
|
-
variant: "ghost",
|
5219
|
-
onClick: (e) => e.stopPropagation(),
|
5220
|
-
"data-handler-id": handlerId,
|
5221
|
-
ref: dragRef,
|
5222
|
-
label: formatMessage({
|
5223
|
-
id: index.getTranslation("components.DragHandle-label"),
|
5224
|
-
defaultMessage: "Drag"
|
5225
|
-
}),
|
5226
|
-
onKeyDown: handleKeyDown,
|
5227
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
|
5228
|
-
}
|
5229
|
-
),
|
5230
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
|
5231
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Trigger, { size: "S", endIcon: null, paddingLeft: 2, paddingRight: 2, children: [
|
5232
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icons.More, { "aria-hidden": true, focusable: false }),
|
5233
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { tag: "span", children: formatMessage({
|
5234
|
-
id: index.getTranslation("components.DynamicZone.more-actions"),
|
5235
|
-
defaultMessage: "More actions"
|
5236
|
-
}) })
|
5237
|
-
] }),
|
5238
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { children: [
|
5239
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
|
5240
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
|
5241
|
-
id: index.getTranslation("components.DynamicZone.add-item-above"),
|
5242
|
-
defaultMessage: "Add component above"
|
5243
|
-
}) }),
|
5244
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
|
5245
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
|
5246
|
-
components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1), children: displayName2 }, componentUid))
|
5247
|
-
] }, category)) })
|
5248
|
-
] }),
|
5249
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
|
5250
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubTrigger, { children: formatMessage({
|
5251
|
-
id: index.getTranslation("components.DynamicZone.add-item-below"),
|
5252
|
-
defaultMessage: "Add component below"
|
5253
|
-
}) }),
|
5254
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.SubContent, { children: Object.entries(dynamicComponentsByCategory).map(([category, components2]) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
|
5255
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Label, { children: category }),
|
5256
|
-
components2.map(({ displayName: displayName2, uid }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onSelect: () => onAddComponent(uid, index$1 + 1), children: displayName2 }, componentUid))
|
5257
|
-
] }, category)) })
|
5258
|
-
] })
|
5259
|
-
] })
|
5260
|
-
] })
|
5261
|
-
] });
|
5262
|
-
const accordionTitle = title ? `${displayName} ${title}` : displayName;
|
5263
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(ComponentContainer, { tag: "li", width: "100%", children: [
|
5264
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Rectangle, { background: "neutral200" }) }),
|
5265
|
-
/* @__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: [
|
5266
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
|
5267
5519
|
/* @__PURE__ */ jsxRuntime.jsx(
|
5268
|
-
designSystem.
|
5520
|
+
designSystem.IconButton,
|
5269
5521
|
{
|
5270
|
-
|
5271
|
-
|
5522
|
+
ref: composedAccordionRefs,
|
5523
|
+
variant: "ghost",
|
5524
|
+
onClick: (e) => e.stopPropagation(),
|
5525
|
+
"data-handler-id": handlerId,
|
5526
|
+
label: formatMessage({
|
5527
|
+
id: index.getTranslation("components.DragHandle-label"),
|
5528
|
+
defaultMessage: "Drag"
|
5529
|
+
}),
|
5530
|
+
onKeyDown: handleKeyDown,
|
5531
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
|
5272
5532
|
}
|
5273
|
-
)
|
5274
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Actions, { children: accordionActions })
|
5275
|
-
] }),
|
5276
|
-
/* @__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(
|
5277
|
-
designSystem.Grid.Item,
|
5278
|
-
{
|
5279
|
-
col: 12,
|
5280
|
-
s: 12,
|
5281
|
-
xs: 12,
|
5282
|
-
direction: "column",
|
5283
|
-
alignItems: "stretch",
|
5284
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, children: row.map(({ size, ...field }) => {
|
5285
|
-
const fieldName = `${name2}.${index$1}.${field.name}`;
|
5286
|
-
const fieldWithTranslatedLabel = {
|
5287
|
-
...field,
|
5288
|
-
label: formatMessage({
|
5289
|
-
id: `content-manager.components.${componentUid}.${field.name}`,
|
5290
|
-
defaultMessage: field.label
|
5291
|
-
})
|
5292
|
-
};
|
5293
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
5294
|
-
designSystem.Grid.Item,
|
5295
|
-
{
|
5296
|
-
col: size,
|
5297
|
-
s: 12,
|
5298
|
-
xs: 12,
|
5299
|
-
direction: "column",
|
5300
|
-
alignItems: "stretch",
|
5301
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(MemoizedInputRenderer, { ...fieldWithTranslatedLabel, name: fieldName })
|
5302
|
-
},
|
5303
|
-
fieldName
|
5304
|
-
);
|
5305
|
-
}) })
|
5306
|
-
},
|
5307
|
-
rowInd
|
5308
|
-
)) }) }) }) })
|
5309
|
-
] }) }) })
|
5310
|
-
] });
|
5311
|
-
};
|
5312
|
-
const StyledBox = styledComponents.styled(designSystem.Box)`
|
5313
|
-
> div:first-child {
|
5314
|
-
box-shadow: ${({ theme }) => theme.shadows.tableShadow};
|
5315
|
-
}
|
5316
|
-
`;
|
5317
|
-
const AccordionContentRadius = styledComponents.styled(designSystem.Box)`
|
5318
|
-
border-radius: 0 0 ${({ theme }) => theme.spaces[1]} ${({ theme }) => theme.spaces[1]};
|
5319
|
-
`;
|
5320
|
-
const Rectangle = styledComponents.styled(designSystem.Box)`
|
5321
|
-
width: ${({ theme }) => theme.spaces[2]};
|
5322
|
-
height: ${({ theme }) => theme.spaces[4]};
|
5323
|
-
`;
|
5324
|
-
const Preview = styledComponents.styled.span`
|
5325
|
-
display: block;
|
5326
|
-
background-color: ${({ theme }) => theme.colors.primary100};
|
5327
|
-
outline: 1px dashed ${({ theme }) => theme.colors.primary500};
|
5328
|
-
outline-offset: -1px;
|
5329
|
-
padding: ${({ theme }) => theme.spaces[6]};
|
5330
|
-
`;
|
5331
|
-
const ComponentContainer = styledComponents.styled(designSystem.Box)`
|
5332
|
-
list-style: none;
|
5333
|
-
padding: 0;
|
5334
|
-
margin: 0;
|
5335
|
-
`;
|
5336
|
-
const DynamicZoneLabel = ({
|
5337
|
-
hint,
|
5338
|
-
label,
|
5339
|
-
labelAction,
|
5340
|
-
name: name2,
|
5341
|
-
numberOfComponents = 0,
|
5342
|
-
required
|
5343
|
-
}) => {
|
5344
|
-
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
5345
|
-
designSystem.Box,
|
5346
|
-
{
|
5347
|
-
paddingTop: 3,
|
5348
|
-
paddingBottom: 3,
|
5349
|
-
paddingRight: 4,
|
5350
|
-
paddingLeft: 4,
|
5351
|
-
borderRadius: "26px",
|
5352
|
-
background: "neutral0",
|
5353
|
-
shadow: "filterShadow",
|
5354
|
-
color: "neutral500",
|
5355
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", justifyContent: "center", children: [
|
5356
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { maxWidth: "35.6rem", children: [
|
5357
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", ellipsis: true, children: [
|
5358
|
-
label || name2,
|
5359
|
-
" "
|
5360
|
-
] }),
|
5361
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", textColor: "neutral600", fontWeight: "bold", children: [
|
5362
|
-
"(",
|
5363
|
-
numberOfComponents,
|
5364
|
-
")"
|
5365
|
-
] }),
|
5366
|
-
required && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", children: "*" }),
|
5367
|
-
labelAction && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 1, children: labelAction })
|
5368
|
-
] }),
|
5369
|
-
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 }) })
|
5533
|
+
)
|
5370
5534
|
] })
|
5371
|
-
}
|
5372
|
-
|
5535
|
+
] }),
|
5536
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
5537
|
+
designSystem.Flex,
|
5538
|
+
{
|
5539
|
+
direction: "column",
|
5540
|
+
alignItems: "stretch",
|
5541
|
+
background: "neutral100",
|
5542
|
+
padding: 6,
|
5543
|
+
gap: 6,
|
5544
|
+
children
|
5545
|
+
}
|
5546
|
+
) })
|
5547
|
+
] }) });
|
5548
|
+
};
|
5549
|
+
const Preview = () => {
|
5550
|
+
return /* @__PURE__ */ jsxRuntime.jsx(StyledSpan, { tag: "span", padding: 6, background: "primary100" });
|
5373
5551
|
};
|
5374
|
-
const
|
5375
|
-
|
5376
|
-
{
|
5377
|
-
|
5378
|
-
|
5379
|
-
|
5380
|
-
const DynamicZone = ({
|
5381
|
-
attribute,
|
5382
|
-
disabled: disabledProp,
|
5383
|
-
hint,
|
5552
|
+
const StyledSpan = styledComponents.styled(designSystem.Box)`
|
5553
|
+
display: block;
|
5554
|
+
outline: 1px dashed ${({ theme }) => theme.colors.primary500};
|
5555
|
+
outline-offset: -1px;
|
5556
|
+
`;
|
5557
|
+
const ComponentInput = ({
|
5384
5558
|
label,
|
5385
|
-
|
5559
|
+
required,
|
5386
5560
|
name: name2,
|
5387
|
-
|
5561
|
+
attribute,
|
5562
|
+
disabled,
|
5563
|
+
labelAction,
|
5564
|
+
...props
|
5388
5565
|
}) => {
|
5389
|
-
const { max = Infinity, min = -Infinity } = attribute ?? {};
|
5390
|
-
const [addComponentIsOpen, setAddComponentIsOpen] = React__namespace.useState(false);
|
5391
|
-
const [liveText, setLiveText] = React__namespace.useState("");
|
5392
|
-
const { components, isLoading } = index.useDoc();
|
5393
|
-
const disabled = disabledProp || isLoading;
|
5394
|
-
const { addFieldRow, removeFieldRow, moveFieldRow } = strapiAdmin.useForm(
|
5395
|
-
"DynamicZone",
|
5396
|
-
({ addFieldRow: addFieldRow2, removeFieldRow: removeFieldRow2, moveFieldRow: moveFieldRow2 }) => ({
|
5397
|
-
addFieldRow: addFieldRow2,
|
5398
|
-
removeFieldRow: removeFieldRow2,
|
5399
|
-
moveFieldRow: moveFieldRow2
|
5400
|
-
})
|
5401
|
-
);
|
5402
|
-
const { value = [], error } = strapiAdmin.useField(name2);
|
5403
|
-
const dynamicComponentsByCategory = React__namespace.useMemo(() => {
|
5404
|
-
return attribute.components.reduce((acc, componentUid) => {
|
5405
|
-
const { category, info } = components[componentUid] ?? { info: {} };
|
5406
|
-
const component = { uid: componentUid, displayName: info.displayName, icon: info.icon };
|
5407
|
-
if (!acc[category]) {
|
5408
|
-
acc[category] = [];
|
5409
|
-
}
|
5410
|
-
acc[category] = [...acc[category], component];
|
5411
|
-
return acc;
|
5412
|
-
}, {});
|
5413
|
-
}, [attribute.components, components]);
|
5414
5566
|
const { formatMessage } = reactIntl.useIntl();
|
5415
|
-
const
|
5416
|
-
const
|
5417
|
-
const
|
5418
|
-
|
5419
|
-
const schema = components[
|
5420
|
-
const form = createDefaultForm(schema, components);
|
5421
|
-
const
|
5422
|
-
|
5423
|
-
__component: uid
|
5424
|
-
}));
|
5425
|
-
const data = transformations(form);
|
5426
|
-
addFieldRow(name2, data, position);
|
5427
|
-
};
|
5428
|
-
const handleClickOpenPicker = () => {
|
5429
|
-
if (dynamicDisplayedComponentsLength < max) {
|
5430
|
-
setAddComponentIsOpen((prev) => !prev);
|
5431
|
-
} else {
|
5432
|
-
toggleNotification({
|
5433
|
-
type: "info",
|
5434
|
-
message: formatMessage({
|
5435
|
-
id: index.getTranslation("components.notification.info.maximum-requirement")
|
5436
|
-
})
|
5437
|
-
});
|
5438
|
-
}
|
5439
|
-
};
|
5440
|
-
const handleMoveComponent = (newIndex, currentIndex) => {
|
5441
|
-
setLiveText(
|
5442
|
-
formatMessage(
|
5443
|
-
{
|
5444
|
-
id: index.getTranslation("dnd.reorder"),
|
5445
|
-
defaultMessage: "{item}, moved. New position in list: {position}."
|
5446
|
-
},
|
5447
|
-
{
|
5448
|
-
item: `${name2}.${currentIndex}`,
|
5449
|
-
position: getItemPos(newIndex)
|
5450
|
-
}
|
5451
|
-
)
|
5452
|
-
);
|
5453
|
-
moveFieldRow(name2, currentIndex, newIndex);
|
5454
|
-
};
|
5455
|
-
const getItemPos = (index2) => `${index2 + 1} of ${value.length}`;
|
5456
|
-
const handleCancel = (index$1) => {
|
5457
|
-
setLiveText(
|
5458
|
-
formatMessage(
|
5459
|
-
{
|
5460
|
-
id: index.getTranslation("dnd.cancel-item"),
|
5461
|
-
defaultMessage: "{item}, dropped. Re-order cancelled."
|
5462
|
-
},
|
5463
|
-
{
|
5464
|
-
item: `${name2}.${index$1}`
|
5465
|
-
}
|
5466
|
-
)
|
5467
|
-
);
|
5468
|
-
};
|
5469
|
-
const handleGrabItem = (index$1) => {
|
5470
|
-
setLiveText(
|
5471
|
-
formatMessage(
|
5472
|
-
{
|
5473
|
-
id: index.getTranslation("dnd.grab-item"),
|
5474
|
-
defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
|
5475
|
-
},
|
5476
|
-
{
|
5477
|
-
item: `${name2}.${index$1}`,
|
5478
|
-
position: getItemPos(index$1)
|
5479
|
-
}
|
5480
|
-
)
|
5481
|
-
);
|
5567
|
+
const field = strapiAdmin.useField(name2);
|
5568
|
+
const showResetComponent = !attribute.repeatable && field.value && !disabled;
|
5569
|
+
const { components } = index.useDoc();
|
5570
|
+
const handleInitialisationClick = () => {
|
5571
|
+
const schema = components[attribute.component];
|
5572
|
+
const form = index.createDefaultForm(schema, components);
|
5573
|
+
const data = index.transformDocument(schema, components)(form);
|
5574
|
+
field.onChange(name2, data);
|
5482
5575
|
};
|
5483
|
-
|
5484
|
-
|
5485
|
-
|
5486
|
-
|
5487
|
-
|
5488
|
-
|
5489
|
-
|
5576
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error: field.error, required, children: [
|
5577
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", children: [
|
5578
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Label, { action: labelAction, children: [
|
5579
|
+
label,
|
5580
|
+
attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
5581
|
+
" (",
|
5582
|
+
Array.isArray(field.value) ? field.value.length : 0,
|
5583
|
+
")"
|
5584
|
+
] })
|
5585
|
+
] }),
|
5586
|
+
showResetComponent && /* @__PURE__ */ jsxRuntime.jsx(
|
5587
|
+
designSystem.IconButton,
|
5490
5588
|
{
|
5491
|
-
|
5492
|
-
|
5589
|
+
label: formatMessage({
|
5590
|
+
id: index.getTranslation("components.reset-entry"),
|
5591
|
+
defaultMessage: "Reset Entry"
|
5592
|
+
}),
|
5593
|
+
variant: "ghost",
|
5594
|
+
onClick: () => {
|
5595
|
+
field.onChange(name2, null);
|
5596
|
+
},
|
5597
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {})
|
5493
5598
|
}
|
5494
5599
|
)
|
5495
|
-
);
|
5496
|
-
};
|
5497
|
-
const handleRemoveComponent = (name22, currentIndex) => () => {
|
5498
|
-
removeFieldRow(name22, currentIndex);
|
5499
|
-
};
|
5500
|
-
const hasError = error !== void 0;
|
5501
|
-
const renderButtonLabel = () => {
|
5502
|
-
if (addComponentIsOpen) {
|
5503
|
-
return formatMessage({ id: "app.utils.close-label", defaultMessage: "Close" });
|
5504
|
-
}
|
5505
|
-
if (hasError && dynamicDisplayedComponentsLength > max) {
|
5506
|
-
return formatMessage(
|
5507
|
-
{
|
5508
|
-
id: index.getTranslation(`components.DynamicZone.extra-components`),
|
5509
|
-
defaultMessage: "There {number, plural, =0 {are # extra components} one {is # extra component} other {are # extra components}}"
|
5510
|
-
},
|
5511
|
-
{
|
5512
|
-
number: dynamicDisplayedComponentsLength - max
|
5513
|
-
}
|
5514
|
-
);
|
5515
|
-
}
|
5516
|
-
if (hasError && dynamicDisplayedComponentsLength < min) {
|
5517
|
-
return formatMessage(
|
5518
|
-
{
|
5519
|
-
id: index.getTranslation(`components.DynamicZone.missing-components`),
|
5520
|
-
defaultMessage: "There {number, plural, =0 {are # missing components} one {is # missing component} other {are # missing components}}"
|
5521
|
-
},
|
5522
|
-
{ number: min - dynamicDisplayedComponentsLength }
|
5523
|
-
);
|
5524
|
-
}
|
5525
|
-
return formatMessage(
|
5526
|
-
{
|
5527
|
-
id: index.getTranslation("components.DynamicZone.add-component"),
|
5528
|
-
defaultMessage: "Add a component to {componentName}"
|
5529
|
-
},
|
5530
|
-
{ componentName: label || name2 }
|
5531
|
-
);
|
5532
|
-
};
|
5533
|
-
const level = Relations.useComponent("DynamicZone", (state) => state.level);
|
5534
|
-
const ariaDescriptionId = React__namespace.useId();
|
5535
|
-
return /* @__PURE__ */ jsxRuntime.jsx(DynamicZoneProvider, { isInDynamicZone: true, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
|
5536
|
-
dynamicDisplayedComponentsLength > 0 && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
|
5537
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
5538
|
-
DynamicZoneLabel,
|
5539
|
-
{
|
5540
|
-
hint,
|
5541
|
-
label,
|
5542
|
-
labelAction,
|
5543
|
-
name: name2,
|
5544
|
-
numberOfComponents: dynamicDisplayedComponentsLength,
|
5545
|
-
required
|
5546
|
-
}
|
5547
|
-
),
|
5548
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
|
5549
|
-
id: index.getTranslation("dnd.instructions"),
|
5550
|
-
defaultMessage: `Press spacebar to grab and re-order`
|
5551
|
-
}) }),
|
5552
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
|
5553
|
-
/* @__PURE__ */ jsxRuntime.jsx("ol", { "aria-describedby": ariaDescriptionId, children: value.map((field, index2) => /* @__PURE__ */ jsxRuntime.jsx(
|
5554
|
-
Relations.ComponentProvider,
|
5555
|
-
{
|
5556
|
-
level: level + 1,
|
5557
|
-
uid: field.__component,
|
5558
|
-
id: field.id,
|
5559
|
-
type: "dynamiczone",
|
5560
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
5561
|
-
DynamicComponent,
|
5562
|
-
{
|
5563
|
-
disabled,
|
5564
|
-
name: name2,
|
5565
|
-
index: index2,
|
5566
|
-
componentUid: field.__component,
|
5567
|
-
onMoveComponent: handleMoveComponent,
|
5568
|
-
onRemoveComponentClick: handleRemoveComponent(name2, index2),
|
5569
|
-
onCancel: handleCancel,
|
5570
|
-
onDropItem: handleDropItem,
|
5571
|
-
onGrabItem: handleGrabItem,
|
5572
|
-
onAddComponent: handleAddComponent,
|
5573
|
-
dynamicComponentsByCategory
|
5574
|
-
}
|
5575
|
-
)
|
5576
|
-
},
|
5577
|
-
field.__temp_key__
|
5578
|
-
)) })
|
5579
5600
|
] }),
|
5580
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
5581
|
-
|
5582
|
-
|
5583
|
-
|
5584
|
-
|
5585
|
-
isOpen: addComponentIsOpen,
|
5586
|
-
onClick: handleClickOpenPicker,
|
5587
|
-
children: renderButtonLabel()
|
5588
|
-
}
|
5589
|
-
) }),
|
5590
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
5591
|
-
ComponentPicker,
|
5592
|
-
{
|
5593
|
-
dynamicComponentsByCategory,
|
5594
|
-
isOpen: addComponentIsOpen,
|
5595
|
-
onClickAddComponent: handleAddComponent
|
5596
|
-
}
|
5597
|
-
)
|
5598
|
-
] }) });
|
5601
|
+
!attribute.repeatable && !field.value && /* @__PURE__ */ jsxRuntime.jsx(Initializer, { disabled, name: name2, onClick: handleInitialisationClick }),
|
5602
|
+
!attribute.repeatable && field.value ? /* @__PURE__ */ jsxRuntime.jsx(NonRepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }) : null,
|
5603
|
+
attribute.repeatable && /* @__PURE__ */ jsxRuntime.jsx(RepeatableComponent, { attribute, name: name2, disabled, ...props, children: props.children }),
|
5604
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Error, {})
|
5605
|
+
] });
|
5599
5606
|
};
|
5607
|
+
const MemoizedComponentInput = React__namespace.memo(ComponentInput);
|
5600
5608
|
exports.DynamicZone = DynamicZone;
|
5609
|
+
exports.FormLayout = FormLayout;
|
5601
5610
|
exports.MemoizedBlocksInput = MemoizedBlocksInput;
|
5602
5611
|
exports.MemoizedComponentInput = MemoizedComponentInput;
|
5603
|
-
exports.MemoizedInputRenderer = MemoizedInputRenderer;
|
5604
5612
|
exports.MemoizedUIDInput = MemoizedUIDInput;
|
5605
5613
|
exports.MemoizedWysiwyg = MemoizedWysiwyg;
|
5606
5614
|
exports.NotAllowedInput = NotAllowedInput;
|
5607
|
-
exports.createDefaultForm = createDefaultForm;
|
5608
|
-
exports.prepareTempKeys = prepareTempKeys;
|
5609
|
-
exports.removeFieldsThatDontExistOnSchema = removeFieldsThatDontExistOnSchema;
|
5610
|
-
exports.transformDocument = transformDocument;
|
5611
5615
|
exports.useDynamicZone = useDynamicZone;
|
5612
5616
|
exports.useFieldHint = useFieldHint;
|
5613
5617
|
exports.useLazyComponents = useLazyComponents;
|
5614
|
-
//# sourceMappingURL=
|
5618
|
+
//# sourceMappingURL=Input-CDHKQd7o.js.map
|