@webiny/app-website-builder 6.3.0-beta.2 → 6.3.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/BaseEditor/components/Editor.js +7 -0
  2. package/BaseEditor/components/Editor.js.map +1 -1
  3. package/BaseEditor/config/EditorConfig.d.ts +1 -2
  4. package/BaseEditor/config/EditorConfig.js.map +1 -1
  5. package/BaseEditor/defaultConfig/Content/Preview/PreviewEvents.js +1 -1
  6. package/BaseEditor/defaultConfig/Content/Preview/PreviewEvents.js.map +1 -1
  7. package/Extension.js +3 -0
  8. package/Extension.js.map +1 -1
  9. package/ecommerce/components/ResourcesList.js +2 -2
  10. package/ecommerce/components/ResourcesList.js.map +1 -1
  11. package/ecommerce/components/ResourcesPicker.js +1 -1
  12. package/ecommerce/components/ResourcesPicker.js.map +1 -1
  13. package/editorSdk/createCommand.js +1 -1
  14. package/editorSdk/createCommand.js.map +1 -1
  15. package/exports/admin/website-builder/page/editor.d.ts +1 -0
  16. package/exports/admin/website-builder/page/editor.js +1 -0
  17. package/exports/admin/website-builder/page/editor.js.map +1 -1
  18. package/modules/pages/PageEditor/DefaultPageEditorConfig.js +1 -2
  19. package/modules/pages/PageEditor/DefaultPageEditorConfig.js.map +1 -1
  20. package/modules/pages/PageEditor/PageEditorConfig.d.ts +180 -198
  21. package/modules/pages/PageEditor/PageEditorConfig.js +2 -7
  22. package/modules/pages/PageEditor/PageEditorConfig.js.map +1 -1
  23. package/modules/pages/PageEditor/PageSettings/PageSettingsPresenter.d.ts +22 -0
  24. package/modules/pages/PageEditor/PageSettings/PageSettingsPresenter.js +154 -0
  25. package/modules/pages/PageEditor/PageSettings/PageSettingsPresenter.js.map +1 -0
  26. package/modules/pages/PageEditor/PageSettings/abstractions.d.ts +54 -0
  27. package/modules/pages/PageEditor/PageSettings/abstractions.js +12 -0
  28. package/modules/pages/PageEditor/PageSettings/abstractions.js.map +1 -0
  29. package/modules/pages/PageEditor/PageSettings/feature.d.ts +3 -0
  30. package/modules/pages/PageEditor/PageSettings/feature.js +24 -0
  31. package/modules/pages/PageEditor/PageSettings/feature.js.map +1 -0
  32. package/modules/pages/PageEditor/PageSettings/groups/GeneralSettingsGroup.d.ts +17 -0
  33. package/modules/pages/PageEditor/PageSettings/groups/GeneralSettingsGroup.js +42 -0
  34. package/modules/pages/PageEditor/PageSettings/groups/GeneralSettingsGroup.js.map +1 -0
  35. package/modules/pages/PageEditor/PageSettings/groups/SchemaSettingsGroup.d.ts +17 -0
  36. package/modules/pages/PageEditor/PageSettings/groups/SchemaSettingsGroup.js +34 -0
  37. package/modules/pages/PageEditor/PageSettings/groups/SchemaSettingsGroup.js.map +1 -0
  38. package/modules/pages/PageEditor/PageSettings/groups/SeoSettingsGroup.d.ts +27 -0
  39. package/modules/pages/PageEditor/PageSettings/groups/SeoSettingsGroup.js +52 -0
  40. package/modules/pages/PageEditor/PageSettings/groups/SeoSettingsGroup.js.map +1 -0
  41. package/modules/pages/PageEditor/PageSettings/groups/SocialSettingsGroup.d.ts +17 -0
  42. package/modules/pages/PageEditor/PageSettings/groups/SocialSettingsGroup.js +44 -0
  43. package/modules/pages/PageEditor/PageSettings/groups/SocialSettingsGroup.js.map +1 -0
  44. package/modules/pages/PageEditor/PageSettings/index.d.ts +3 -0
  45. package/modules/pages/PageEditor/PageSettings/index.js +5 -0
  46. package/modules/pages/PageEditor/PageSettings/index.js.map +1 -0
  47. package/modules/pages/PageEditor/TopBar/PageSettingsDrawer.d.ts +11 -0
  48. package/modules/pages/PageEditor/TopBar/PageSettingsDrawer.js +35 -0
  49. package/modules/pages/PageEditor/TopBar/PageSettingsDrawer.js.map +1 -0
  50. package/modules/pages/PageEditor/TopBar/SettingsButton.d.ts +0 -6
  51. package/modules/pages/PageEditor/TopBar/SettingsButton.js +29 -26
  52. package/modules/pages/PageEditor/TopBar/SettingsButton.js.map +1 -1
  53. package/modules/pages/PageEditor/usePageEditorConfig.d.ts +4 -20
  54. package/modules/pages/PageEditor/usePageEditorConfig.js +1 -8
  55. package/modules/pages/PageEditor/usePageEditorConfig.js.map +1 -1
  56. package/package.json +31 -28
  57. package/presentation/navigation/Extension.js +5 -6
  58. package/presentation/navigation/Extension.js.map +1 -1
  59. package/presentation/pages/CreatePage/AddLanguageModifier.js +5 -5
  60. package/presentation/pages/CreatePage/AddLanguageModifier.js.map +1 -1
  61. package/presentation/pages/CreatePage/CreatePage.test.js +9 -13
  62. package/presentation/pages/CreatePage/CreatePage.test.js.map +1 -1
  63. package/presentation/pages/CreatePage/CreatePagePresenter.js +1 -1
  64. package/presentation/pages/CreatePage/CreatePagePresenter.js.map +1 -1
  65. package/shared/PagePath.js +1 -1
  66. package/shared/PagePath.js.map +1 -1
  67. package/shared/pagePathFromTitle.js +1 -1
  68. package/shared/pagePathFromTitle.js.map +1 -1
  69. package/modules/pages/PageEditor/PageSettings/PageSettings.d.ts +0 -30
  70. package/modules/pages/PageEditor/PageSettings/PageSettings.js +0 -84
  71. package/modules/pages/PageEditor/PageSettings/PageSettings.js.map +0 -1
  72. package/modules/pages/PageEditor/PageSettings/PageSettingsConfig.d.ts +0 -2
  73. package/modules/pages/PageEditor/PageSettings/PageSettingsConfig.js +0 -98
  74. package/modules/pages/PageEditor/PageSettings/PageSettingsConfig.js.map +0 -1
  75. package/modules/pages/PageEditor/PageSettings/elements/GeneralImage.d.ts +0 -2
  76. package/modules/pages/PageEditor/PageSettings/elements/GeneralImage.js +0 -31
  77. package/modules/pages/PageEditor/PageSettings/elements/GeneralImage.js.map +0 -1
  78. package/modules/pages/PageEditor/PageSettings/elements/GeneralPath.d.ts +0 -2
  79. package/modules/pages/PageEditor/PageSettings/elements/GeneralPath.js +0 -16
  80. package/modules/pages/PageEditor/PageSettings/elements/GeneralPath.js.map +0 -1
  81. package/modules/pages/PageEditor/PageSettings/elements/GeneralSnippet.d.ts +0 -2
  82. package/modules/pages/PageEditor/PageSettings/elements/GeneralSnippet.js +0 -14
  83. package/modules/pages/PageEditor/PageSettings/elements/GeneralSnippet.js.map +0 -1
  84. package/modules/pages/PageEditor/PageSettings/elements/GeneralTags.d.ts +0 -2
  85. package/modules/pages/PageEditor/PageSettings/elements/GeneralTags.js +0 -14
  86. package/modules/pages/PageEditor/PageSettings/elements/GeneralTags.js.map +0 -1
  87. package/modules/pages/PageEditor/PageSettings/elements/GeneralTitle.d.ts +0 -2
  88. package/modules/pages/PageEditor/PageSettings/elements/GeneralTitle.js +0 -16
  89. package/modules/pages/PageEditor/PageSettings/elements/GeneralTitle.js.map +0 -1
  90. package/modules/pages/PageEditor/PageSettings/elements/SchemaEditor.d.ts +0 -2
  91. package/modules/pages/PageEditor/PageSettings/elements/SchemaEditor.js +0 -31
  92. package/modules/pages/PageEditor/PageSettings/elements/SchemaEditor.js.map +0 -1
  93. package/modules/pages/PageEditor/PageSettings/elements/SeoCanonicalUrl.d.ts +0 -2
  94. package/modules/pages/PageEditor/PageSettings/elements/SeoCanonicalUrl.js +0 -26
  95. package/modules/pages/PageEditor/PageSettings/elements/SeoCanonicalUrl.js.map +0 -1
  96. package/modules/pages/PageEditor/PageSettings/elements/SeoDescription.d.ts +0 -2
  97. package/modules/pages/PageEditor/PageSettings/elements/SeoDescription.js +0 -15
  98. package/modules/pages/PageEditor/PageSettings/elements/SeoDescription.js.map +0 -1
  99. package/modules/pages/PageEditor/PageSettings/elements/SeoMetaTags.d.ts +0 -2
  100. package/modules/pages/PageEditor/PageSettings/elements/SeoMetaTags.js +0 -18
  101. package/modules/pages/PageEditor/PageSettings/elements/SeoMetaTags.js.map +0 -1
  102. package/modules/pages/PageEditor/PageSettings/elements/SeoNoFollow.d.ts +0 -2
  103. package/modules/pages/PageEditor/PageSettings/elements/SeoNoFollow.js +0 -16
  104. package/modules/pages/PageEditor/PageSettings/elements/SeoNoFollow.js.map +0 -1
  105. package/modules/pages/PageEditor/PageSettings/elements/SeoNoIndex.d.ts +0 -2
  106. package/modules/pages/PageEditor/PageSettings/elements/SeoNoIndex.js +0 -16
  107. package/modules/pages/PageEditor/PageSettings/elements/SeoNoIndex.js.map +0 -1
  108. package/modules/pages/PageEditor/PageSettings/elements/SeoTitle.d.ts +0 -2
  109. package/modules/pages/PageEditor/PageSettings/elements/SeoTitle.js +0 -15
  110. package/modules/pages/PageEditor/PageSettings/elements/SeoTitle.js.map +0 -1
  111. package/modules/pages/PageEditor/PageSettings/elements/SocialDescription.d.ts +0 -2
  112. package/modules/pages/PageEditor/PageSettings/elements/SocialDescription.js +0 -15
  113. package/modules/pages/PageEditor/PageSettings/elements/SocialDescription.js.map +0 -1
  114. package/modules/pages/PageEditor/PageSettings/elements/SocialImage.d.ts +0 -2
  115. package/modules/pages/PageEditor/PageSettings/elements/SocialImage.js +0 -31
  116. package/modules/pages/PageEditor/PageSettings/elements/SocialImage.js.map +0 -1
  117. package/modules/pages/PageEditor/PageSettings/elements/SocialMetaTags.d.ts +0 -2
  118. package/modules/pages/PageEditor/PageSettings/elements/SocialMetaTags.js +0 -18
  119. package/modules/pages/PageEditor/PageSettings/elements/SocialMetaTags.js.map +0 -1
  120. package/modules/pages/PageEditor/PageSettings/elements/SocialTitle.d.ts +0 -2
  121. package/modules/pages/PageEditor/PageSettings/elements/SocialTitle.js +0 -15
  122. package/modules/pages/PageEditor/PageSettings/elements/SocialTitle.js.map +0 -1
  123. package/modules/pages/PageEditor/TopBar/Settings/KeyValueGridEditor.d.ts +0 -2
  124. package/modules/pages/PageEditor/TopBar/Settings/KeyValueGridEditor.js +0 -59
  125. package/modules/pages/PageEditor/TopBar/Settings/KeyValueGridEditor.js.map +0 -1
  126. package/modules/pages/PageEditor/TopBar/Settings/MetaTags.d.ts +0 -11
  127. package/modules/pages/PageEditor/TopBar/Settings/MetaTags.js +0 -80
  128. package/modules/pages/PageEditor/TopBar/Settings/MetaTags.js.map +0 -1
  129. package/modules/pages/PageEditor/TopBar/Settings/PageSettingsDialog.d.ts +0 -2
  130. package/modules/pages/PageEditor/TopBar/Settings/PageSettingsDialog.js +0 -37
  131. package/modules/pages/PageEditor/TopBar/Settings/PageSettingsDialog.js.map +0 -1
  132. package/modules/pages/PageEditor/TopBar/Settings/PageSettingsDrawer.d.ts +0 -3
  133. package/modules/pages/PageEditor/TopBar/Settings/PageSettingsDrawer.js +0 -73
  134. package/modules/pages/PageEditor/TopBar/Settings/PageSettingsDrawer.js.map +0 -1
  135. package/modules/pages/PageEditor/TopBar/Settings/SettingsDialogBody.d.ts +0 -6
  136. package/modules/pages/PageEditor/TopBar/Settings/SettingsDialogBody.js +0 -21
  137. package/modules/pages/PageEditor/TopBar/Settings/SettingsDialogBody.js.map +0 -1
  138. package/modules/pages/PageEditor/TopBar/Settings/SimpleTags.d.ts +0 -7
  139. package/modules/pages/PageEditor/TopBar/Settings/SimpleTags.js +0 -75
  140. package/modules/pages/PageEditor/TopBar/Settings/SimpleTags.js.map +0 -1
@@ -0,0 +1,44 @@
1
+ import { PageSettingsGroup } from "../abstractions.js";
2
+ class SocialSettingsGroupImpl {
3
+ name = "social";
4
+ label = "Social";
5
+ description = "Control how this page is previewed when shared on social media.";
6
+ icon = {
7
+ type: "icon",
8
+ name: "fas/thumbs-up"
9
+ };
10
+ buildForm(form) {
11
+ form.fields(fields => ({
12
+ title: fields.text().label("Title").description("Title for social platforms (og:title)"),
13
+ description: fields.text().label("Description").description("Description for social platforms (og:description)").renderer("textarea"),
14
+ image: fields.file().label("Image").description("Select an image for social platforms (og:image)"),
15
+ metaTags: fields.object().label("Meta Tags").description("Add more Open Graph tags").renderer("keyValueTags").fields(f => ({
16
+ property: f.text().placeholder("Property"),
17
+ content: f.text().placeholder("Content")
18
+ })).list()
19
+ }));
20
+ form.layout(layout => [layout.row("title"), layout.row("description"), layout.row("image"), layout.row("metaTags")]);
21
+ }
22
+ mapToForm(doc) {
23
+ const social = doc.properties?.social ?? {};
24
+ return {
25
+ title: social.title,
26
+ description: social.description,
27
+ image: social.image,
28
+ metaTags: social.metaTags
29
+ };
30
+ }
31
+ mapFromForm(formData, doc) {
32
+ doc.properties.social = doc.properties.social ?? {};
33
+ doc.properties.social.title = formData.title;
34
+ doc.properties.social.description = formData.description;
35
+ doc.properties.social.image = formData.image;
36
+ doc.properties.social.metaTags = formData.metaTags;
37
+ }
38
+ }
39
+ export const SocialSettingsGroup = PageSettingsGroup.createImplementation({
40
+ implementation: SocialSettingsGroupImpl,
41
+ dependencies: []
42
+ });
43
+
44
+ //# sourceMappingURL=SocialSettingsGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["PageSettingsGroup","SocialSettingsGroupImpl","name","label","description","icon","type","buildForm","form","fields","title","text","renderer","image","file","metaTags","object","f","property","placeholder","content","list","layout","row","mapToForm","doc","social","properties","mapFromForm","formData","SocialSettingsGroup","createImplementation","implementation","dependencies"],"sources":["SocialSettingsGroup.ts"],"sourcesContent":["import { PageSettingsGroup } from \"../abstractions.js\";\n\nclass SocialSettingsGroupImpl implements PageSettingsGroup.Interface {\n name = \"social\";\n label = \"Social\";\n description = \"Control how this page is previewed when shared on social media.\";\n icon = { type: \"icon\", name: \"fas/thumbs-up\" };\n\n buildForm(form: PageSettingsGroup.FormBuilder): void {\n form.fields(fields => ({\n title: fields\n .text()\n .label(\"Title\")\n .description(\"Title for social platforms (og:title)\"),\n description: fields\n .text()\n .label(\"Description\")\n .description(\"Description for social platforms (og:description)\")\n .renderer(\"textarea\"),\n image: fields\n .file()\n .label(\"Image\")\n .description(\"Select an image for social platforms (og:image)\"),\n metaTags: fields\n .object()\n .label(\"Meta Tags\")\n .description(\"Add more Open Graph tags\")\n .renderer(\"keyValueTags\")\n .fields(f => ({\n property: f.text().placeholder(\"Property\"),\n content: f.text().placeholder(\"Content\")\n }))\n .list()\n }));\n\n form.layout(layout => [\n layout.row(\"title\"),\n layout.row(\"description\"),\n layout.row(\"image\"),\n layout.row(\"metaTags\")\n ]);\n }\n\n mapToForm(doc: PageSettingsGroup.PageDocument): Record<string, any> {\n const social = doc.properties?.social ?? {};\n return {\n title: social.title,\n description: social.description,\n image: social.image,\n metaTags: social.metaTags\n };\n }\n\n mapFromForm(formData: Record<string, any>, doc: PageSettingsGroup.PageDocument): void {\n doc.properties.social = doc.properties.social ?? {};\n doc.properties.social.title = formData.title;\n doc.properties.social.description = formData.description;\n doc.properties.social.image = formData.image;\n doc.properties.social.metaTags = formData.metaTags;\n }\n}\n\nexport const SocialSettingsGroup = PageSettingsGroup.createImplementation({\n implementation: SocialSettingsGroupImpl,\n dependencies: []\n});\n"],"mappings":"AAAA,SAASA,iBAAiB;AAE1B,MAAMC,uBAAuB,CAAwC;EACjEC,IAAI,GAAG,QAAQ;EACfC,KAAK,GAAG,QAAQ;EAChBC,WAAW,GAAG,iEAAiE;EAC/EC,IAAI,GAAG;IAAEC,IAAI,EAAE,MAAM;IAAEJ,IAAI,EAAE;EAAgB,CAAC;EAE9CK,SAASA,CAACC,IAAmC,EAAQ;IACjDA,IAAI,CAACC,MAAM,CAACA,MAAM,KAAK;MACnBC,KAAK,EAAED,MAAM,CACRE,IAAI,CAAC,CAAC,CACNR,KAAK,CAAC,OAAO,CAAC,CACdC,WAAW,CAAC,uCAAuC,CAAC;MACzDA,WAAW,EAAEK,MAAM,CACdE,IAAI,CAAC,CAAC,CACNR,KAAK,CAAC,aAAa,CAAC,CACpBC,WAAW,CAAC,mDAAmD,CAAC,CAChEQ,QAAQ,CAAC,UAAU,CAAC;MACzBC,KAAK,EAAEJ,MAAM,CACRK,IAAI,CAAC,CAAC,CACNX,KAAK,CAAC,OAAO,CAAC,CACdC,WAAW,CAAC,iDAAiD,CAAC;MACnEW,QAAQ,EAAEN,MAAM,CACXO,MAAM,CAAC,CAAC,CACRb,KAAK,CAAC,WAAW,CAAC,CAClBC,WAAW,CAAC,0BAA0B,CAAC,CACvCQ,QAAQ,CAAC,cAAc,CAAC,CACxBH,MAAM,CAACQ,CAAC,KAAK;QACVC,QAAQ,EAAED,CAAC,CAACN,IAAI,CAAC,CAAC,CAACQ,WAAW,CAAC,UAAU,CAAC;QAC1CC,OAAO,EAAEH,CAAC,CAACN,IAAI,CAAC,CAAC,CAACQ,WAAW,CAAC,SAAS;MAC3C,CAAC,CAAC,CAAC,CACFE,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEHb,IAAI,CAACc,MAAM,CAACA,MAAM,IAAI,CAClBA,MAAM,CAACC,GAAG,CAAC,OAAO,CAAC,EACnBD,MAAM,CAACC,GAAG,CAAC,aAAa,CAAC,EACzBD,MAAM,CAACC,GAAG,CAAC,OAAO,CAAC,EACnBD,MAAM,CAACC,GAAG,CAAC,UAAU,CAAC,CACzB,CAAC;EACN;EAEAC,SAASA,CAACC,GAAmC,EAAuB;IAChE,MAAMC,MAAM,GAAGD,GAAG,CAACE,UAAU,EAAED,MAAM,IAAI,CAAC,CAAC;IAC3C,OAAO;MACHhB,KAAK,EAAEgB,MAAM,CAAChB,KAAK;MACnBN,WAAW,EAAEsB,MAAM,CAACtB,WAAW;MAC/BS,KAAK,EAAEa,MAAM,CAACb,KAAK;MACnBE,QAAQ,EAAEW,MAAM,CAACX;IACrB,CAAC;EACL;EAEAa,WAAWA,CAACC,QAA6B,EAAEJ,GAAmC,EAAQ;IAClFA,GAAG,CAACE,UAAU,CAACD,MAAM,GAAGD,GAAG,CAACE,UAAU,CAACD,MAAM,IAAI,CAAC,CAAC;IACnDD,GAAG,CAACE,UAAU,CAACD,MAAM,CAAChB,KAAK,GAAGmB,QAAQ,CAACnB,KAAK;IAC5Ce,GAAG,CAACE,UAAU,CAACD,MAAM,CAACtB,WAAW,GAAGyB,QAAQ,CAACzB,WAAW;IACxDqB,GAAG,CAACE,UAAU,CAACD,MAAM,CAACb,KAAK,GAAGgB,QAAQ,CAAChB,KAAK;IAC5CY,GAAG,CAACE,UAAU,CAACD,MAAM,CAACX,QAAQ,GAAGc,QAAQ,CAACd,QAAQ;EACtD;AACJ;AAEA,OAAO,MAAMe,mBAAmB,GAAG9B,iBAAiB,CAAC+B,oBAAoB,CAAC;EACtEC,cAAc,EAAE/B,uBAAuB;EACvCgC,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ export { PageSettingsPresenter } from "./abstractions.js";
2
+ export { PageSettingsGroup } from "./abstractions.js";
3
+ export { PageSettingsGroupModifier } from "./abstractions.js";
@@ -0,0 +1,5 @@
1
+ export { PageSettingsPresenter } from "./abstractions.js";
2
+ export { PageSettingsGroup } from "./abstractions.js";
3
+ export { PageSettingsGroupModifier } from "./abstractions.js";
4
+
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["PageSettingsPresenter","PageSettingsGroup","PageSettingsGroupModifier"],"sources":["index.ts"],"sourcesContent":["export { PageSettingsPresenter } from \"./abstractions.js\";\nexport { PageSettingsGroup } from \"./abstractions.js\";\nexport { PageSettingsGroupModifier } from \"./abstractions.js\";\n"],"mappings":"AAAA,SAASA,qBAAqB;AAC9B,SAASC,iBAAiB;AAC1B,SAASC,yBAAyB","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import type { PageSettingsPresenter } from "../../../../modules/pages/PageEditor/PageSettings/index.js";
3
+ export interface PageSettingsDrawerProps {
4
+ presenter: PageSettingsPresenter.Interface;
5
+ open: boolean;
6
+ onClose: () => void;
7
+ onSave: () => void;
8
+ }
9
+ export declare const PageSettingsDrawer: (({ presenter, open, onClose, onSave }: PageSettingsDrawerProps) => React.JSX.Element) & {
10
+ displayName: string;
11
+ };
@@ -0,0 +1,35 @@
1
+ import React from "react";
2
+ import { observer } from "mobx-react-lite";
3
+ import { FormView } from "@webiny/app-admin";
4
+ import { Drawer } from "@webiny/admin-ui";
5
+ export const PageSettingsDrawer = observer(({
6
+ presenter,
7
+ open,
8
+ onClose,
9
+ onSave
10
+ }) => {
11
+ const vm = presenter.vm;
12
+ return /*#__PURE__*/React.createElement(Drawer, {
13
+ open: open,
14
+ onClose: onClose,
15
+ modal: true,
16
+ width: 900,
17
+ bodyPadding: false,
18
+ title: "Page Settings",
19
+ actions: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Drawer.CancelButton, {
20
+ text: "Cancel"
21
+ }), /*#__PURE__*/React.createElement(Drawer.ConfirmButton, {
22
+ onClick: onSave,
23
+ text: "Save Settings"
24
+ })),
25
+ headerSeparator: true,
26
+ footerSeparator: true,
27
+ className: "flex flex-col"
28
+ }, vm.error ? /*#__PURE__*/React.createElement("div", {
29
+ className: "text-destructive-default text-sm p-md"
30
+ }, vm.error) : null, vm.form ? /*#__PURE__*/React.createElement(FormView, {
31
+ form: vm.form
32
+ }) : null);
33
+ });
34
+
35
+ //# sourceMappingURL=PageSettingsDrawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","observer","FormView","Drawer","PageSettingsDrawer","presenter","open","onClose","onSave","vm","createElement","modal","width","bodyPadding","title","actions","Fragment","CancelButton","text","ConfirmButton","onClick","headerSeparator","footerSeparator","className","error","form"],"sources":["PageSettingsDrawer.tsx"],"sourcesContent":["import React from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { FormView } from \"@webiny/app-admin\";\nimport { Drawer } from \"@webiny/admin-ui\";\nimport type { PageSettingsPresenter } from \"~/modules/pages/PageEditor/PageSettings/index.js\";\n\nexport interface PageSettingsDrawerProps {\n presenter: PageSettingsPresenter.Interface;\n open: boolean;\n onClose: () => void;\n onSave: () => void;\n}\n\nexport const PageSettingsDrawer = observer(\n ({ presenter, open, onClose, onSave }: PageSettingsDrawerProps) => {\n const vm = presenter.vm;\n\n return (\n <Drawer\n open={open}\n onClose={onClose}\n modal={true}\n width={900}\n bodyPadding={false}\n title={\"Page Settings\"}\n actions={\n <>\n <Drawer.CancelButton text={\"Cancel\"} />\n <Drawer.ConfirmButton onClick={onSave} text={\"Save Settings\"} />\n </>\n }\n headerSeparator={true}\n footerSeparator={true}\n className={\"flex flex-col\"}\n >\n {vm.error ? (\n <div className=\"text-destructive-default text-sm p-md\">{vm.error}</div>\n ) : null}\n {vm.form ? <FormView form={vm.form} /> : null}\n </Drawer>\n );\n }\n);\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,SAASC,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,MAAM,QAAQ,kBAAkB;AAUzC,OAAO,MAAMC,kBAAkB,GAAGH,QAAQ,CACtC,CAAC;EAAEI,SAAS;EAAEC,IAAI;EAAEC,OAAO;EAAEC;AAAgC,CAAC,KAAK;EAC/D,MAAMC,EAAE,GAAGJ,SAAS,CAACI,EAAE;EAEvB,oBACIT,KAAA,CAAAU,aAAA,CAACP,MAAM;IACHG,IAAI,EAAEA,IAAK;IACXC,OAAO,EAAEA,OAAQ;IACjBI,KAAK,EAAE,IAAK;IACZC,KAAK,EAAE,GAAI;IACXC,WAAW,EAAE,KAAM;IACnBC,KAAK,EAAE,eAAgB;IACvBC,OAAO,eACHf,KAAA,CAAAU,aAAA,CAAAV,KAAA,CAAAgB,QAAA,qBACIhB,KAAA,CAAAU,aAAA,CAACP,MAAM,CAACc,YAAY;MAACC,IAAI,EAAE;IAAS,CAAE,CAAC,eACvClB,KAAA,CAAAU,aAAA,CAACP,MAAM,CAACgB,aAAa;MAACC,OAAO,EAAEZ,MAAO;MAACU,IAAI,EAAE;IAAgB,CAAE,CACjE,CACL;IACDG,eAAe,EAAE,IAAK;IACtBC,eAAe,EAAE,IAAK;IACtBC,SAAS,EAAE;EAAgB,GAE1Bd,EAAE,CAACe,KAAK,gBACLxB,KAAA,CAAAU,aAAA;IAAKa,SAAS,EAAC;EAAuC,GAAEd,EAAE,CAACe,KAAW,CAAC,GACvE,IAAI,EACPf,EAAE,CAACgB,IAAI,gBAAGzB,KAAA,CAAAU,aAAA,CAACR,QAAQ;IAACuB,IAAI,EAAEhB,EAAE,CAACgB;EAAK,CAAE,CAAC,GAAG,IACrC,CAAC;AAEjB,CACJ,CAAC","ignoreList":[]}
@@ -1,8 +1,2 @@
1
1
  import React from "react";
2
- export interface PageSettingsOverlayProps {
3
- open: boolean;
4
- data: Record<string, any>;
5
- onClose: () => void;
6
- onSave: (data: Record<string, any>) => void;
7
- }
8
2
  export declare const SettingsButton: () => React.JSX.Element;
@@ -3,31 +3,17 @@ import React, { useCallback, useState } from "react";
3
3
  import { IconButton } from "@webiny/admin-ui";
4
4
  import { useHotkeys } from "@webiny/app-admin";
5
5
  import { ReactComponent as SettingsIcon } from "@webiny/icons/settings.svg";
6
+ import { useFeature } from "@webiny/app";
6
7
  import { useDocumentEditor } from "../../../../DocumentEditor/index.js";
7
8
  import { useSelectFromDocument } from "../../../../BaseEditor/hooks/useSelectFromDocument.js";
8
- import { usePageEditorConfig } from "../usePageEditorConfig.js";
9
- import { PageSettingsDrawer } from "./Settings/PageSettingsDrawer.js";
10
- import { PageSettingsDialog } from "./Settings/PageSettingsDialog.js";
9
+ import { PageSettingsFeature } from "../PageSettings/feature.js";
10
+ import { PageSettingsDrawer } from "./PageSettingsDrawer.js";
11
11
  export const SettingsButton = () => {
12
12
  const editor = useDocumentEditor();
13
13
  const {
14
- pageSettings
15
- } = usePageEditorConfig();
14
+ presenter
15
+ } = useFeature(PageSettingsFeature);
16
16
  const [isOverlayOpen, setOverlayOpen] = useState(false);
17
- const openOverlay = useCallback(() => {
18
- setOverlayOpen(() => true);
19
- }, []);
20
- const closeOverlay = useCallback(() => {
21
- setOverlayOpen(() => false);
22
- }, []);
23
- const saveSettings = useCallback(data => {
24
- editor.updateDocument(document => {
25
- document.properties = observable(data.properties);
26
- document.metadata = observable(data.metadata);
27
- document.extensions = observable(data.extensions);
28
- });
29
- closeOverlay();
30
- }, []);
31
17
  const formData = useSelectFromDocument(document => {
32
18
  return structuredClone({
33
19
  properties: toJS(document.properties),
@@ -35,6 +21,24 @@ export const SettingsButton = () => {
35
21
  extensions: toJS(document.extensions)
36
22
  });
37
23
  });
24
+ const openOverlay = useCallback(() => {
25
+ presenter.init(formData);
26
+ setOverlayOpen(true);
27
+ }, [formData]);
28
+ const closeOverlay = useCallback(() => {
29
+ setOverlayOpen(false);
30
+ }, []);
31
+ const saveSettings = useCallback(async () => {
32
+ const result = await presenter.submit();
33
+ if (result) {
34
+ editor.updateDocument(document => {
35
+ document.properties = observable(result.properties);
36
+ document.metadata = observable(result.metadata);
37
+ document.extensions = observable(result.extensions);
38
+ });
39
+ closeOverlay();
40
+ }
41
+ }, []);
38
42
  useHotkeys({
39
43
  zIndex: 55,
40
44
  disabled: !isOverlayOpen,
@@ -42,19 +46,18 @@ export const SettingsButton = () => {
42
46
  esc: closeOverlay
43
47
  }
44
48
  });
45
- const props = {
46
- open: isOverlayOpen,
47
- onClose: closeOverlay,
48
- data: formData,
49
- onSave: saveSettings
50
- };
51
49
  return /*#__PURE__*/React.createElement("div", {
52
50
  className: "flex gap-x-sm"
53
51
  }, /*#__PURE__*/React.createElement(IconButton, {
54
52
  variant: "ghost",
55
53
  icon: /*#__PURE__*/React.createElement(SettingsIcon, null),
56
54
  onClick: openOverlay
57
- }), pageSettings.viewMode === "dialog" ? /*#__PURE__*/React.createElement(PageSettingsDialog, props) : null, pageSettings.viewMode === "drawer" ? /*#__PURE__*/React.createElement(PageSettingsDrawer, props) : null);
55
+ }), /*#__PURE__*/React.createElement(PageSettingsDrawer, {
56
+ presenter: presenter,
57
+ open: isOverlayOpen,
58
+ onClose: closeOverlay,
59
+ onSave: saveSettings
60
+ }));
58
61
  };
59
62
 
60
63
  //# sourceMappingURL=SettingsButton.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["observable","toJS","React","useCallback","useState","IconButton","useHotkeys","ReactComponent","SettingsIcon","useDocumentEditor","useSelectFromDocument","usePageEditorConfig","PageSettingsDrawer","PageSettingsDialog","SettingsButton","editor","pageSettings","isOverlayOpen","setOverlayOpen","openOverlay","closeOverlay","saveSettings","data","updateDocument","document","properties","metadata","extensions","formData","structuredClone","zIndex","disabled","keys","esc","props","open","onClose","onSave","createElement","className","variant","icon","onClick","viewMode"],"sources":["SettingsButton.tsx"],"sourcesContent":["import { observable, toJS } from \"mobx\";\nimport React, { useCallback, useState } from \"react\";\nimport { IconButton } from \"@webiny/admin-ui\";\nimport { useHotkeys } from \"@webiny/app-admin\";\nimport { ReactComponent as SettingsIcon } from \"@webiny/icons/settings.svg\";\nimport type { GenericFormData } from \"@webiny/form\";\nimport { useDocumentEditor } from \"~/DocumentEditor/index.js\";\nimport { useSelectFromDocument } from \"~/BaseEditor/hooks/useSelectFromDocument.js\";\nimport { usePageEditorConfig } from \"~/modules/pages/PageEditor/usePageEditorConfig.js\";\nimport { PageSettingsDrawer } from \"./Settings/PageSettingsDrawer.js\";\nimport { PageSettingsDialog } from \"./Settings/PageSettingsDialog.js\";\n\nexport interface PageSettingsOverlayProps {\n open: boolean;\n data: Record<string, any>;\n onClose: () => void;\n onSave: (data: Record<string, any>) => void;\n}\n\nexport const SettingsButton = () => {\n const editor = useDocumentEditor();\n const { pageSettings } = usePageEditorConfig();\n const [isOverlayOpen, setOverlayOpen] = useState(false);\n\n const openOverlay = useCallback(() => {\n setOverlayOpen(() => true);\n }, []);\n\n const closeOverlay = useCallback(() => {\n setOverlayOpen(() => false);\n }, []);\n\n const saveSettings = useCallback((data: GenericFormData) => {\n editor.updateDocument(document => {\n document.properties = observable(data.properties);\n document.metadata = observable(data.metadata);\n document.extensions = observable(data.extensions);\n });\n closeOverlay();\n }, []);\n\n const formData = useSelectFromDocument(document => {\n return structuredClone({\n properties: toJS(document.properties),\n metadata: toJS(document.metadata),\n extensions: toJS(document.extensions)\n });\n });\n\n useHotkeys({\n zIndex: 55,\n disabled: !isOverlayOpen,\n keys: {\n esc: closeOverlay\n }\n });\n\n const props: PageSettingsOverlayProps = {\n open: isOverlayOpen,\n onClose: closeOverlay,\n data: formData,\n onSave: saveSettings\n };\n\n return (\n <div className={\"flex gap-x-sm\"}>\n <IconButton variant=\"ghost\" icon={<SettingsIcon />} onClick={openOverlay} />\n {pageSettings.viewMode === \"dialog\" ? <PageSettingsDialog {...props} /> : null}\n {pageSettings.viewMode === \"drawer\" ? <PageSettingsDrawer {...props} /> : null}\n </div>\n );\n};\n"],"mappings":"AAAA,SAASA,UAAU,EAAEC,IAAI,QAAQ,MAAM;AACvC,OAAOC,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,UAAU,QAAQ,mBAAmB;AAC9C,SAASC,cAAc,IAAIC,YAAY,QAAQ,4BAA4B;AAE3E,SAASC,iBAAiB;AAC1B,SAASC,qBAAqB;AAC9B,SAASC,mBAAmB;AAC5B,SAASC,kBAAkB;AAC3B,SAASC,kBAAkB;AAS3B,OAAO,MAAMC,cAAc,GAAGA,CAAA,KAAM;EAChC,MAAMC,MAAM,GAAGN,iBAAiB,CAAC,CAAC;EAClC,MAAM;IAAEO;EAAa,CAAC,GAAGL,mBAAmB,CAAC,CAAC;EAC9C,MAAM,CAACM,aAAa,EAAEC,cAAc,CAAC,GAAGd,QAAQ,CAAC,KAAK,CAAC;EAEvD,MAAMe,WAAW,GAAGhB,WAAW,CAAC,MAAM;IAClCe,cAAc,CAAC,MAAM,IAAI,CAAC;EAC9B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,YAAY,GAAGjB,WAAW,CAAC,MAAM;IACnCe,cAAc,CAAC,MAAM,KAAK,CAAC;EAC/B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMG,YAAY,GAAGlB,WAAW,CAAEmB,IAAqB,IAAK;IACxDP,MAAM,CAACQ,cAAc,CAACC,QAAQ,IAAI;MAC9BA,QAAQ,CAACC,UAAU,GAAGzB,UAAU,CAACsB,IAAI,CAACG,UAAU,CAAC;MACjDD,QAAQ,CAACE,QAAQ,GAAG1B,UAAU,CAACsB,IAAI,CAACI,QAAQ,CAAC;MAC7CF,QAAQ,CAACG,UAAU,GAAG3B,UAAU,CAACsB,IAAI,CAACK,UAAU,CAAC;IACrD,CAAC,CAAC;IACFP,YAAY,CAAC,CAAC;EAClB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMQ,QAAQ,GAAGlB,qBAAqB,CAACc,QAAQ,IAAI;IAC/C,OAAOK,eAAe,CAAC;MACnBJ,UAAU,EAAExB,IAAI,CAACuB,QAAQ,CAACC,UAAU,CAAC;MACrCC,QAAQ,EAAEzB,IAAI,CAACuB,QAAQ,CAACE,QAAQ,CAAC;MACjCC,UAAU,EAAE1B,IAAI,CAACuB,QAAQ,CAACG,UAAU;IACxC,CAAC,CAAC;EACN,CAAC,CAAC;EAEFrB,UAAU,CAAC;IACPwB,MAAM,EAAE,EAAE;IACVC,QAAQ,EAAE,CAACd,aAAa;IACxBe,IAAI,EAAE;MACFC,GAAG,EAAEb;IACT;EACJ,CAAC,CAAC;EAEF,MAAMc,KAA+B,GAAG;IACpCC,IAAI,EAAElB,aAAa;IACnBmB,OAAO,EAAEhB,YAAY;IACrBE,IAAI,EAAEM,QAAQ;IACdS,MAAM,EAAEhB;EACZ,CAAC;EAED,oBACInB,KAAA,CAAAoC,aAAA;IAAKC,SAAS,EAAE;EAAgB,gBAC5BrC,KAAA,CAAAoC,aAAA,CAACjC,UAAU;IAACmC,OAAO,EAAC,OAAO;IAACC,IAAI,eAAEvC,KAAA,CAAAoC,aAAA,CAAC9B,YAAY,MAAE,CAAE;IAACkC,OAAO,EAAEvB;EAAY,CAAE,CAAC,EAC3EH,YAAY,CAAC2B,QAAQ,KAAK,QAAQ,gBAAGzC,KAAA,CAAAoC,aAAA,CAACzB,kBAAkB,EAAKqB,KAAQ,CAAC,GAAG,IAAI,EAC7ElB,YAAY,CAAC2B,QAAQ,KAAK,QAAQ,gBAAGzC,KAAA,CAAAoC,aAAA,CAAC1B,kBAAkB,EAAKsB,KAAQ,CAAC,GAAG,IACzE,CAAC;AAEd,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["observable","toJS","React","useCallback","useState","IconButton","useHotkeys","ReactComponent","SettingsIcon","useFeature","useDocumentEditor","useSelectFromDocument","PageSettingsFeature","PageSettingsDrawer","SettingsButton","editor","presenter","isOverlayOpen","setOverlayOpen","formData","document","structuredClone","properties","metadata","extensions","openOverlay","init","closeOverlay","saveSettings","result","submit","updateDocument","zIndex","disabled","keys","esc","createElement","className","variant","icon","onClick","open","onClose","onSave"],"sources":["SettingsButton.tsx"],"sourcesContent":["import { observable, toJS } from \"mobx\";\nimport React, { useCallback, useState } from \"react\";\nimport { IconButton } from \"@webiny/admin-ui\";\nimport { useHotkeys } from \"@webiny/app-admin\";\nimport { ReactComponent as SettingsIcon } from \"@webiny/icons/settings.svg\";\nimport { useFeature } from \"@webiny/app\";\nimport { useDocumentEditor } from \"~/DocumentEditor/index.js\";\nimport { useSelectFromDocument } from \"~/BaseEditor/hooks/useSelectFromDocument.js\";\nimport { PageSettingsFeature } from \"~/modules/pages/PageEditor/PageSettings/feature.js\";\nimport { PageSettingsDrawer } from \"./PageSettingsDrawer.js\";\nimport { PageSettingsGroup } from \"~/modules/pages/PageEditor/PageSettings/index.js\";\n\nexport const SettingsButton = () => {\n const editor = useDocumentEditor();\n const { presenter } = useFeature(PageSettingsFeature);\n const [isOverlayOpen, setOverlayOpen] = useState(false);\n\n const formData = useSelectFromDocument(document => {\n return structuredClone({\n properties: toJS(document.properties),\n metadata: toJS(document.metadata),\n extensions: toJS(document.extensions)\n }) as PageSettingsGroup.PageDocument;\n });\n\n const openOverlay = useCallback(() => {\n presenter.init(formData);\n setOverlayOpen(true);\n }, [formData]);\n\n const closeOverlay = useCallback(() => {\n setOverlayOpen(false);\n }, []);\n\n const saveSettings = useCallback(async () => {\n const result = await presenter.submit();\n if (result) {\n editor.updateDocument(document => {\n document.properties = observable(result.properties);\n document.metadata = observable(result.metadata);\n document.extensions = observable(result.extensions);\n });\n closeOverlay();\n }\n }, []);\n\n useHotkeys({\n zIndex: 55,\n disabled: !isOverlayOpen,\n keys: {\n esc: closeOverlay\n }\n });\n\n return (\n <div className={\"flex gap-x-sm\"}>\n <IconButton variant=\"ghost\" icon={<SettingsIcon />} onClick={openOverlay} />\n <PageSettingsDrawer\n presenter={presenter}\n open={isOverlayOpen}\n onClose={closeOverlay}\n onSave={saveSettings}\n />\n </div>\n );\n};\n"],"mappings":"AAAA,SAASA,UAAU,EAAEC,IAAI,QAAQ,MAAM;AACvC,OAAOC,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,UAAU,QAAQ,mBAAmB;AAC9C,SAASC,cAAc,IAAIC,YAAY,QAAQ,4BAA4B;AAC3E,SAASC,UAAU,QAAQ,aAAa;AACxC,SAASC,iBAAiB;AAC1B,SAASC,qBAAqB;AAC9B,SAASC,mBAAmB;AAC5B,SAASC,kBAAkB;AAG3B,OAAO,MAAMC,cAAc,GAAGA,CAAA,KAAM;EAChC,MAAMC,MAAM,GAAGL,iBAAiB,CAAC,CAAC;EAClC,MAAM;IAAEM;EAAU,CAAC,GAAGP,UAAU,CAACG,mBAAmB,CAAC;EACrD,MAAM,CAACK,aAAa,EAAEC,cAAc,CAAC,GAAGd,QAAQ,CAAC,KAAK,CAAC;EAEvD,MAAMe,QAAQ,GAAGR,qBAAqB,CAACS,QAAQ,IAAI;IAC/C,OAAOC,eAAe,CAAC;MACnBC,UAAU,EAAErB,IAAI,CAACmB,QAAQ,CAACE,UAAU,CAAC;MACrCC,QAAQ,EAAEtB,IAAI,CAACmB,QAAQ,CAACG,QAAQ,CAAC;MACjCC,UAAU,EAAEvB,IAAI,CAACmB,QAAQ,CAACI,UAAU;IACxC,CAAC,CAAC;EACN,CAAC,CAAC;EAEF,MAAMC,WAAW,GAAGtB,WAAW,CAAC,MAAM;IAClCa,SAAS,CAACU,IAAI,CAACP,QAAQ,CAAC;IACxBD,cAAc,CAAC,IAAI,CAAC;EACxB,CAAC,EAAE,CAACC,QAAQ,CAAC,CAAC;EAEd,MAAMQ,YAAY,GAAGxB,WAAW,CAAC,MAAM;IACnCe,cAAc,CAAC,KAAK,CAAC;EACzB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMU,YAAY,GAAGzB,WAAW,CAAC,YAAY;IACzC,MAAM0B,MAAM,GAAG,MAAMb,SAAS,CAACc,MAAM,CAAC,CAAC;IACvC,IAAID,MAAM,EAAE;MACRd,MAAM,CAACgB,cAAc,CAACX,QAAQ,IAAI;QAC9BA,QAAQ,CAACE,UAAU,GAAGtB,UAAU,CAAC6B,MAAM,CAACP,UAAU,CAAC;QACnDF,QAAQ,CAACG,QAAQ,GAAGvB,UAAU,CAAC6B,MAAM,CAACN,QAAQ,CAAC;QAC/CH,QAAQ,CAACI,UAAU,GAAGxB,UAAU,CAAC6B,MAAM,CAACL,UAAU,CAAC;MACvD,CAAC,CAAC;MACFG,YAAY,CAAC,CAAC;IAClB;EACJ,CAAC,EAAE,EAAE,CAAC;EAENrB,UAAU,CAAC;IACP0B,MAAM,EAAE,EAAE;IACVC,QAAQ,EAAE,CAAChB,aAAa;IACxBiB,IAAI,EAAE;MACFC,GAAG,EAAER;IACT;EACJ,CAAC,CAAC;EAEF,oBACIzB,KAAA,CAAAkC,aAAA;IAAKC,SAAS,EAAE;EAAgB,gBAC5BnC,KAAA,CAAAkC,aAAA,CAAC/B,UAAU;IAACiC,OAAO,EAAC,OAAO;IAACC,IAAI,eAAErC,KAAA,CAAAkC,aAAA,CAAC5B,YAAY,MAAE,CAAE;IAACgC,OAAO,EAAEf;EAAY,CAAE,CAAC,eAC5EvB,KAAA,CAAAkC,aAAA,CAACvB,kBAAkB;IACfG,SAAS,EAAEA,SAAU;IACrByB,IAAI,EAAExB,aAAc;IACpByB,OAAO,EAAEf,YAAa;IACtBgB,MAAM,EAAEf;EAAa,CACxB,CACA,CAAC;AAEd,CAAC","ignoreList":[]}
@@ -1,20 +1,4 @@
1
- export interface PageSettingsElementConfig {
2
- name: string;
3
- element: JSX.Element;
4
- }
5
- export interface PageSettingsGroupConfig {
6
- name: string;
7
- title?: string;
8
- description?: string;
9
- icon?: React.ReactNode;
10
- elements: PageSettingsElementConfig[];
11
- }
12
- export interface EditorPageSettings {
13
- groups: PageSettingsGroupConfig[];
14
- viewMode: "dialog" | "drawer";
15
- }
16
- interface PageEditorConfig {
17
- pageSettings: EditorPageSettings;
18
- }
19
- export declare const usePageEditorConfig: () => PageEditorConfig;
20
- export {};
1
+ export declare const usePageEditorConfig: () => {
2
+ elements: import("../../../BaseEditor/config/Element").ElementConfig[];
3
+ inputRenderers: import("../../../BaseEditor/config/ElementInput").ElementInputConfig[];
4
+ } & Omit<import("~/BaseEditor/index.js").EditorConfig, "elements" | "inputRenderers">;
@@ -1,13 +1,6 @@
1
1
  import { useEditorConfig } from "../../../BaseEditor/index.js";
2
2
  export const usePageEditorConfig = () => {
3
- const config = useEditorConfig();
4
- return {
5
- ...config,
6
- pageSettings: {
7
- groups: config.pageSettings.groups ?? [],
8
- viewMode: config.pageSettings.viewMode ?? "dialog"
9
- }
10
- };
3
+ return useEditorConfig();
11
4
  };
12
5
 
13
6
  //# sourceMappingURL=usePageEditorConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useEditorConfig","usePageEditorConfig","config","pageSettings","groups","viewMode"],"sources":["usePageEditorConfig.ts"],"sourcesContent":["import { useEditorConfig } from \"~/BaseEditor/index.js\";\n\nexport interface PageSettingsElementConfig {\n name: string;\n element: JSX.Element;\n}\n\nexport interface PageSettingsGroupConfig {\n name: string;\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n elements: PageSettingsElementConfig[];\n}\n\nexport interface EditorPageSettings {\n groups: PageSettingsGroupConfig[];\n viewMode: \"dialog\" | \"drawer\";\n}\n\ninterface PageEditorConfig {\n pageSettings: EditorPageSettings;\n}\n\nexport const usePageEditorConfig = (): PageEditorConfig => {\n const config = useEditorConfig<PageEditorConfig>();\n\n return {\n ...config,\n pageSettings: {\n groups: config.pageSettings.groups ?? [],\n viewMode: config.pageSettings.viewMode ?? \"dialog\"\n }\n };\n};\n"],"mappings":"AAAA,SAASA,eAAe;AAwBxB,OAAO,MAAMC,mBAAmB,GAAGA,CAAA,KAAwB;EACvD,MAAMC,MAAM,GAAGF,eAAe,CAAmB,CAAC;EAElD,OAAO;IACH,GAAGE,MAAM;IACTC,YAAY,EAAE;MACVC,MAAM,EAAEF,MAAM,CAACC,YAAY,CAACC,MAAM,IAAI,EAAE;MACxCC,QAAQ,EAAEH,MAAM,CAACC,YAAY,CAACE,QAAQ,IAAI;IAC9C;EACJ,CAAC;AACL,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useEditorConfig","usePageEditorConfig"],"sources":["usePageEditorConfig.ts"],"sourcesContent":["import { useEditorConfig } from \"~/BaseEditor/index.js\";\n\nexport const usePageEditorConfig = () => {\n return useEditorConfig();\n};\n"],"mappings":"AAAA,SAASA,eAAe;AAExB,OAAO,MAAMC,mBAAmB,GAAGA,CAAA,KAAM;EACrC,OAAOD,eAAe,CAAC,CAAC;AAC5B,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@webiny/app-website-builder",
3
- "version": "6.3.0-beta.2",
3
+ "version": "6.3.0-beta.4",
4
4
  "type": "module",
5
- "main": "index.js",
5
+ "exports": {
6
+ ".": "./index.js",
7
+ "./*": "./*"
8
+ },
6
9
  "repository": {
7
10
  "type": "git",
8
11
  "url": "https://github.com/webiny/webiny-js.git"
@@ -14,33 +17,33 @@
14
17
  "@emotion/css": "11.13.5",
15
18
  "@emotion/react": "11.14.0",
16
19
  "@emotion/styled": "11.14.1",
17
- "@lexical/utils": "0.43.0",
20
+ "@lexical/utils": "0.44.0",
18
21
  "@monaco-editor/react": "4.7.0",
19
22
  "@svgr/webpack": "8.1.0",
20
23
  "@types/react": "18.3.28",
21
- "@webiny/admin-ui": "6.3.0-beta.2",
22
- "@webiny/app": "6.3.0-beta.2",
23
- "@webiny/app-aco": "6.3.0-beta.2",
24
- "@webiny/app-admin": "6.3.0-beta.2",
25
- "@webiny/app-headless-cms-common": "6.3.0-beta.2",
26
- "@webiny/app-trash-bin": "6.3.0-beta.2",
27
- "@webiny/app-utils": "6.3.0-beta.2",
24
+ "@webiny/admin-ui": "6.3.0-beta.4",
25
+ "@webiny/app": "6.3.0-beta.4",
26
+ "@webiny/app-aco": "6.3.0-beta.4",
27
+ "@webiny/app-admin": "6.3.0-beta.4",
28
+ "@webiny/app-headless-cms-common": "6.3.0-beta.4",
29
+ "@webiny/app-trash-bin": "6.3.0-beta.4",
30
+ "@webiny/app-utils": "6.3.0-beta.4",
28
31
  "@webiny/di": "0.2.3",
29
- "@webiny/error": "6.3.0-beta.2",
30
- "@webiny/feature": "6.3.0-beta.2",
31
- "@webiny/form": "6.3.0-beta.2",
32
- "@webiny/icons": "6.3.0-beta.2",
33
- "@webiny/languages": "6.3.0-beta.2",
34
- "@webiny/lexical-converter": "6.3.0-beta.2",
35
- "@webiny/lexical-editor": "6.3.0-beta.2",
36
- "@webiny/lexical-nodes": "6.3.0-beta.2",
37
- "@webiny/lexical-theme": "6.3.0-beta.2",
38
- "@webiny/react-composition": "6.3.0-beta.2",
39
- "@webiny/react-properties": "6.3.0-beta.2",
40
- "@webiny/ui": "6.3.0-beta.2",
41
- "@webiny/utils": "6.3.0-beta.2",
42
- "@webiny/validation": "6.3.0-beta.2",
43
- "@webiny/website-builder-sdk": "6.3.0-beta.2",
32
+ "@webiny/error": "6.3.0-beta.4",
33
+ "@webiny/feature": "6.3.0-beta.4",
34
+ "@webiny/form": "6.3.0-beta.4",
35
+ "@webiny/icons": "6.3.0-beta.4",
36
+ "@webiny/languages": "6.3.0-beta.4",
37
+ "@webiny/lexical-converter": "6.3.0-beta.4",
38
+ "@webiny/lexical-editor": "6.3.0-beta.4",
39
+ "@webiny/lexical-nodes": "6.3.0-beta.4",
40
+ "@webiny/lexical-theme": "6.3.0-beta.4",
41
+ "@webiny/react-composition": "6.3.0-beta.4",
42
+ "@webiny/react-properties": "6.3.0-beta.4",
43
+ "@webiny/ui": "6.3.0-beta.4",
44
+ "@webiny/utils": "6.3.0-beta.4",
45
+ "@webiny/validation": "6.3.0-beta.4",
46
+ "@webiny/website-builder-sdk": "6.3.0-beta.4",
44
47
  "apollo-cache": "1.3.5",
45
48
  "apollo-client": "2.6.10",
46
49
  "apollo-link": "1.2.14",
@@ -53,7 +56,7 @@
53
56
  "lodash": "4.18.1",
54
57
  "markdown-to-jsx": "9.7.16",
55
58
  "matcher": "6.0.0",
56
- "mobx": "6.15.0",
59
+ "mobx": "6.15.1",
57
60
  "mobx-react-lite": "4.1.1",
58
61
  "pluralize": "8.0.0",
59
62
  "react": "18.3.1",
@@ -67,7 +70,7 @@
67
70
  "@emotion/babel-plugin": "11.13.5",
68
71
  "@types/deep-equal": "1.0.4",
69
72
  "@types/is-hotkey": "0.1.10",
70
- "@webiny/build-tools": "6.3.0-beta.2",
73
+ "@webiny/build-tools": "6.3.0-beta.4",
71
74
  "execa": "5.1.1",
72
75
  "rimraf": "6.1.3",
73
76
  "typescript": "6.0.3",
@@ -89,5 +92,5 @@
89
92
  ]
90
93
  }
91
94
  },
92
- "gitHead": "c5ae1dbcb99bf7457449ef67aef19c5b4b1ffc4c"
95
+ "gitHead": "7cefe15431dbd65504e1f58147dc9e55bcbfa693"
93
96
  }
@@ -1,6 +1,5 @@
1
1
  import React from "react";
2
2
  import { AdminConfig, useToggler } from "@webiny/app-admin";
3
- import { ReactComponent as SettingsIcon } from "@webiny/icons/settings.svg";
4
3
  import { NexjsConfigDialog } from "./NextjsConfig/NextjsConfigDialog.js";
5
4
  const {
6
5
  Menu
@@ -14,13 +13,13 @@ export const Extension = /*#__PURE__*/React.memo(() => {
14
13
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(NexjsConfigDialog, {
15
14
  open: on,
16
15
  onClose: toggleOff
17
- }), /*#__PURE__*/React.createElement(Menu.Support, {
16
+ }), /*#__PURE__*/React.createElement(Menu, {
18
17
  name: "wb.nextjs",
19
- element: /*#__PURE__*/React.createElement(Menu.Support.Item, {
18
+ parent: "wb",
19
+ pin: "end",
20
+ element: /*#__PURE__*/React.createElement(Menu.Item, {
20
21
  text: "Configure Next.js",
21
- onClick: toggleOn,
22
- icon: /*#__PURE__*/React.createElement(SettingsIcon, null),
23
- className: "cursor-pointer"
22
+ onClick: toggleOn
24
23
  })
25
24
  }));
26
25
  });
@@ -1 +1 @@
1
- {"version":3,"names":["React","AdminConfig","useToggler","ReactComponent","SettingsIcon","NexjsConfigDialog","Menu","Extension","memo","on","toggleOn","toggleOff","createElement","Fragment","open","onClose","Support","name","element","Item","text","onClick","icon","className","displayName"],"sources":["Extension.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig, useToggler } from \"@webiny/app-admin\";\nimport { ReactComponent as SettingsIcon } from \"@webiny/icons/settings.svg\";\nimport { NexjsConfigDialog } from \"./NextjsConfig/NextjsConfigDialog.js\";\n\nconst { Menu } = AdminConfig;\n\nexport const Extension = React.memo(() => {\n const { on, toggleOn, toggleOff } = useToggler(false);\n\n return (\n <>\n <NexjsConfigDialog open={on} onClose={toggleOff} />\n <Menu.Support\n name={\"wb.nextjs\"}\n element={\n <Menu.Support.Item\n text={\"Configure Next.js\"}\n onClick={toggleOn}\n icon={<SettingsIcon />}\n className={\"cursor-pointer\"}\n />\n }\n />\n </>\n );\n});\n\nExtension.displayName = \"NavigationExtension\";\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,WAAW,EAAEC,UAAU,QAAQ,mBAAmB;AAC3D,SAASC,cAAc,IAAIC,YAAY,QAAQ,4BAA4B;AAC3E,SAASC,iBAAiB;AAE1B,MAAM;EAAEC;AAAK,CAAC,GAAGL,WAAW;AAE5B,OAAO,MAAMM,SAAS,gBAAGP,KAAK,CAACQ,IAAI,CAAC,MAAM;EACtC,MAAM;IAAEC,EAAE;IAAEC,QAAQ;IAAEC;EAAU,CAAC,GAAGT,UAAU,CAAC,KAAK,CAAC;EAErD,oBACIF,KAAA,CAAAY,aAAA,CAAAZ,KAAA,CAAAa,QAAA,qBACIb,KAAA,CAAAY,aAAA,CAACP,iBAAiB;IAACS,IAAI,EAAEL,EAAG;IAACM,OAAO,EAAEJ;EAAU,CAAE,CAAC,eACnDX,KAAA,CAAAY,aAAA,CAACN,IAAI,CAACU,OAAO;IACTC,IAAI,EAAE,WAAY;IAClBC,OAAO,eACHlB,KAAA,CAAAY,aAAA,CAACN,IAAI,CAACU,OAAO,CAACG,IAAI;MACdC,IAAI,EAAE,mBAAoB;MAC1BC,OAAO,EAAEX,QAAS;MAClBY,IAAI,eAAEtB,KAAA,CAAAY,aAAA,CAACR,YAAY,MAAE,CAAE;MACvBmB,SAAS,EAAE;IAAiB,CAC/B;EACJ,CACJ,CACH,CAAC;AAEX,CAAC,CAAC;AAEFhB,SAAS,CAACiB,WAAW,GAAG,qBAAqB","ignoreList":[]}
1
+ {"version":3,"names":["React","AdminConfig","useToggler","NexjsConfigDialog","Menu","Extension","memo","on","toggleOn","toggleOff","createElement","Fragment","open","onClose","name","parent","pin","element","Item","text","onClick","displayName"],"sources":["Extension.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig, useToggler } from \"@webiny/app-admin\";\nimport { NexjsConfigDialog } from \"./NextjsConfig/NextjsConfigDialog.js\";\n\nconst { Menu } = AdminConfig;\n\nexport const Extension = React.memo(() => {\n const { on, toggleOn, toggleOff } = useToggler(false);\n\n return (\n <>\n <NexjsConfigDialog open={on} onClose={toggleOff} />\n <Menu\n name={\"wb.nextjs\"}\n parent={\"wb\"}\n pin={\"end\"}\n element={<Menu.Item text={\"Configure Next.js\"} onClick={toggleOn} />}\n />\n </>\n );\n});\n\nExtension.displayName = \"NavigationExtension\";\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,WAAW,EAAEC,UAAU,QAAQ,mBAAmB;AAC3D,SAASC,iBAAiB;AAE1B,MAAM;EAAEC;AAAK,CAAC,GAAGH,WAAW;AAE5B,OAAO,MAAMI,SAAS,gBAAGL,KAAK,CAACM,IAAI,CAAC,MAAM;EACtC,MAAM;IAAEC,EAAE;IAAEC,QAAQ;IAAEC;EAAU,CAAC,GAAGP,UAAU,CAAC,KAAK,CAAC;EAErD,oBACIF,KAAA,CAAAU,aAAA,CAAAV,KAAA,CAAAW,QAAA,qBACIX,KAAA,CAAAU,aAAA,CAACP,iBAAiB;IAACS,IAAI,EAAEL,EAAG;IAACM,OAAO,EAAEJ;EAAU,CAAE,CAAC,eACnDT,KAAA,CAAAU,aAAA,CAACN,IAAI;IACDU,IAAI,EAAE,WAAY;IAClBC,MAAM,EAAE,IAAK;IACbC,GAAG,EAAE,KAAM;IACXC,OAAO,eAAEjB,KAAA,CAAAU,aAAA,CAACN,IAAI,CAACc,IAAI;MAACC,IAAI,EAAE,mBAAoB;MAACC,OAAO,EAAEZ;IAAS,CAAE;EAAE,CACxE,CACH,CAAC;AAEX,CAAC,CAAC;AAEFH,SAAS,CAACgB,WAAW,GAAG,qBAAqB","ignoreList":[]}
@@ -15,7 +15,7 @@ class AddLanguagePageFormModifier {
15
15
  modifyForm(form) {
16
16
  void this.useCase.execute();
17
17
  form.fields(fields => ({
18
- language: fields.select().label("Language").hidden().options(() => this.getLanguageOptions()).afterChange((value, form) => this.afterChange(value, form))
18
+ language: fields.text().label("Language").hidden().options(() => this.getLanguageOptions()).afterChange((value, form) => this.afterChange(value, form))
19
19
  }));
20
20
 
21
21
  // When path is set programmatically (e.g., product selection, title change), apply the language prefix.
@@ -25,7 +25,7 @@ class AddLanguagePageFormModifier {
25
25
  if (!path) {
26
26
  return;
27
27
  }
28
- const langCode = String(f.field("language").getValue() || "");
28
+ const langCode = f.field("language").as("text").getValue() ?? "";
29
29
  if (!langCode || !this.shouldPrefixPath()) {
30
30
  return;
31
31
  }
@@ -60,7 +60,7 @@ class AddLanguagePageFormModifier {
60
60
  }
61
61
  mapFromForm(data, input) {
62
62
  if (data.language) {
63
- input.properties ??= {};
63
+ input.properties = input.properties ?? {};
64
64
  input.properties.language = data.language;
65
65
  }
66
66
  }
@@ -78,14 +78,14 @@ class AddLanguagePageFormModifier {
78
78
  afterChange(value, f) {
79
79
  const langCode = String(value);
80
80
  const codes = this.getSupportedCodes();
81
- const path = f.field("path").getValue() || "";
81
+ const path = f.field("path").as("text").getValue() || "";
82
82
  const stripped = PagePath.create(path).stripLanguageCode(codes);
83
83
  const needsPrefix = langCode && this.shouldPrefixPath();
84
84
 
85
85
  // Determine the bare path — either from existing path or from title.
86
86
  let barePath = stripped;
87
87
  if (barePath.isEmpty()) {
88
- const title = f.field("title").getValue() || "";
88
+ const title = f.field("title").as("text").getValue() || "";
89
89
  if (title) {
90
90
  barePath = PagePath.fromTitle(title);
91
91
  }
@@ -1 +1 @@
1
- {"version":3,"names":["reaction","ListLanguagesUseCase","ListLanguagesRepository","CreatePageFormModifier","PagePath","AddLanguagePageFormModifier","constructor","useCase","repository","modifyForm","form","execute","fields","language","select","label","hidden","options","getLanguageOptions","afterChange","value","field","addAfterSetValue","f","path","String","langCode","getValue","shouldPrefixPath","prefixed","create","setLanguageCode","getSupportedCodes","toString","setValue","layout","row","before","dispose","getLanguages","languages","length","languageField","defaultCode","getDefaultLanguageCode","current","setVisible","fireImmediately","mapFromForm","data","input","properties","map","l","code","defaultLang","find","isDefault","codes","stripped","stripLanguageCode","needsPrefix","barePath","isEmpty","title","fromTitle","setData","getData","lang","name","AddLanguageModifier","createImplementation","implementation","dependencies"],"sources":["AddLanguageModifier.ts"],"sourcesContent":["import { reaction } from \"mobx\";\nimport { FormModel } from \"@webiny/app-admin\";\nimport {\n ListLanguagesUseCase,\n ListLanguagesRepository\n} from \"@webiny/languages/admin/features/listLanguages/abstractions.js\";\nimport { CreatePageFormModifier } from \"~/presentation/pages/CreatePage/abstractions.js\";\nimport type { CreatePageParams } from \"~/features/pages/createPage/abstractions.js\";\nimport { PagePath } from \"~/shared/PagePath.js\";\n\n/**\n * Modifier that adds a language select field to the CreatePage form.\n * When a language is selected, the path is prefixed with the language code.\n */\nclass AddLanguagePageFormModifier implements CreatePageFormModifier.Interface {\n constructor(\n private useCase: ListLanguagesUseCase.Interface,\n private repository: ListLanguagesRepository.Interface\n ) {}\n\n modifyForm(form: FormModel.Interface): void {\n void this.useCase.execute();\n\n form.fields(fields => ({\n language: fields\n .select()\n .label(\"Language\")\n .hidden()\n .options(() => this.getLanguageOptions())\n .afterChange((value, form) => this.afterChange(value, form))\n }));\n\n // When path is set programmatically (e.g., product selection, title change), apply the language prefix.\n // afterSetValue only fires on programmatic setValue calls, not on UI typing.\n form.field(\"path\").addAfterSetValue((value, f) => {\n const path = String(value || \"\");\n if (!path) {\n return;\n }\n const langCode = String(f.field(\"language\").getValue() || \"\");\n if (!langCode || !this.shouldPrefixPath()) {\n return;\n }\n const prefixed = PagePath.create(path)\n .setLanguageCode(langCode, this.getSupportedCodes())\n .toString();\n if (prefixed !== path) {\n f.field(\"path\").setValue(prefixed);\n }\n });\n\n // Field starts hidden. Show it once languages load (if 2+).\n // - 0 languages: field stays hidden, no value.\n // - 1 language: auto-assign, stay hidden (no dropdown, no prefix).\n // - 2+ languages: make visible (show dropdown), preselect default, prefix paths.\n form.layout(layout => [layout.row(\"language\").before(\"title\")]);\n\n const dispose = reaction(\n () => this.repository.getLanguages(),\n languages => {\n if (languages.length === 0) {\n return;\n }\n\n const languageField = form.field(\"language\");\n\n const defaultCode = this.getDefaultLanguageCode();\n const current = languageField.getValue();\n\n if (!current && defaultCode) {\n languageField.setValue(defaultCode);\n }\n\n if (languages.length > 1) {\n languageField.setVisible(true);\n }\n\n dispose();\n },\n { fireImmediately: true }\n );\n }\n\n mapFromForm(data: Record<string, unknown>, input: CreatePageParams): void {\n if (data.language) {\n input.properties ??= {};\n input.properties.language = data.language;\n }\n }\n\n private getSupportedCodes(): string[] {\n return this.repository.getLanguages().map(l => l.code);\n }\n\n private getDefaultLanguageCode(): string | undefined {\n const languages = this.repository.getLanguages();\n const defaultLang = languages.find(l => l.isDefault);\n return defaultLang?.code ?? languages[0]?.code;\n }\n\n private shouldPrefixPath(): boolean {\n return this.repository.getLanguages().length > 1;\n }\n\n private afterChange(value: unknown, f: FormModel.Interface) {\n const langCode = String(value);\n const codes = this.getSupportedCodes();\n\n const path = f.field(\"path\").getValue<string>() || \"\";\n const stripped = PagePath.create(path).stripLanguageCode(codes);\n const needsPrefix = langCode && this.shouldPrefixPath();\n\n // Determine the bare path — either from existing path or from title.\n let barePath = stripped;\n if (barePath.isEmpty()) {\n const title = f.field(\"title\").getValue<string>() || \"\";\n if (title) {\n barePath = PagePath.fromTitle(title);\n }\n }\n\n if (barePath.isEmpty()) {\n // No path and no title — nothing to do.\n f.setData({ ...f.getData(), path: null });\n } else if (needsPrefix) {\n f.field(\"path\").setValue(barePath.setLanguageCode(langCode, codes).toString());\n } else {\n f.field(\"path\").setValue(barePath.toString());\n }\n }\n\n private getLanguageOptions() {\n return this.repository.getLanguages().map(lang => ({\n label: `${lang.name} (${lang.code})`,\n value: lang.code\n }));\n }\n}\n\nexport const AddLanguageModifier = CreatePageFormModifier.createImplementation({\n implementation: AddLanguagePageFormModifier,\n dependencies: [ListLanguagesUseCase, ListLanguagesRepository]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["reaction","ListLanguagesUseCase","ListLanguagesRepository","CreatePageFormModifier","PagePath","AddLanguagePageFormModifier","constructor","useCase","repository","modifyForm","form","execute","fields","language","text","label","hidden","options","getLanguageOptions","afterChange","value","field","addAfterSetValue","f","path","String","langCode","as","getValue","shouldPrefixPath","prefixed","create","setLanguageCode","getSupportedCodes","toString","setValue","layout","row","before","dispose","getLanguages","languages","length","languageField","defaultCode","getDefaultLanguageCode","current","setVisible","fireImmediately","mapFromForm","data","input","properties","map","l","code","defaultLang","find","isDefault","codes","stripped","stripLanguageCode","needsPrefix","barePath","isEmpty","title","fromTitle","setData","getData","lang","name","AddLanguageModifier","createImplementation","implementation","dependencies"],"sources":["AddLanguageModifier.ts"],"sourcesContent":["import { reaction } from \"mobx\";\nimport { FormModel } from \"@webiny/app-admin\";\nimport {\n ListLanguagesUseCase,\n ListLanguagesRepository\n} from \"@webiny/languages/admin/features/listLanguages/abstractions.js\";\nimport { CreatePageFormModifier } from \"~/presentation/pages/CreatePage/abstractions.js\";\nimport type { CreatePageParams } from \"~/features/pages/createPage/abstractions.js\";\nimport { PagePath } from \"~/shared/PagePath.js\";\n\n/**\n * Modifier that adds a language select field to the CreatePage form.\n * When a language is selected, the path is prefixed with the language code.\n */\nclass AddLanguagePageFormModifier implements CreatePageFormModifier.Interface {\n constructor(\n private useCase: ListLanguagesUseCase.Interface,\n private repository: ListLanguagesRepository.Interface\n ) {}\n\n modifyForm(form: FormModel.Interface): void {\n void this.useCase.execute();\n\n form.fields(fields => ({\n language: fields\n .text()\n .label(\"Language\")\n .hidden()\n .options(() => this.getLanguageOptions())\n .afterChange((value, form) => this.afterChange(value, form))\n }));\n\n // When path is set programmatically (e.g., product selection, title change), apply the language prefix.\n // afterSetValue only fires on programmatic setValue calls, not on UI typing.\n form.field(\"path\").addAfterSetValue((value, f) => {\n const path = String(value || \"\");\n if (!path) {\n return;\n }\n const langCode = f.field(\"language\").as(\"text\").getValue() ?? \"\";\n if (!langCode || !this.shouldPrefixPath()) {\n return;\n }\n const prefixed = PagePath.create(path)\n .setLanguageCode(langCode, this.getSupportedCodes())\n .toString();\n if (prefixed !== path) {\n f.field(\"path\").setValue(prefixed);\n }\n });\n\n // Field starts hidden. Show it once languages load (if 2+).\n // - 0 languages: field stays hidden, no value.\n // - 1 language: auto-assign, stay hidden (no dropdown, no prefix).\n // - 2+ languages: make visible (show dropdown), preselect default, prefix paths.\n form.layout(layout => [layout.row(\"language\").before(\"title\")]);\n\n const dispose = reaction(\n () => this.repository.getLanguages(),\n languages => {\n if (languages.length === 0) {\n return;\n }\n\n const languageField = form.field(\"language\");\n\n const defaultCode = this.getDefaultLanguageCode();\n const current = languageField.getValue();\n\n if (!current && defaultCode) {\n languageField.setValue(defaultCode);\n }\n\n if (languages.length > 1) {\n languageField.setVisible(true);\n }\n\n dispose();\n },\n { fireImmediately: true }\n );\n }\n\n mapFromForm(data: Record<string, unknown>, input: CreatePageParams): void {\n if (data.language) {\n input.properties = input.properties ?? {};\n input.properties.language = data.language;\n }\n }\n\n private getSupportedCodes(): string[] {\n return this.repository.getLanguages().map(l => l.code);\n }\n\n private getDefaultLanguageCode(): string | undefined {\n const languages = this.repository.getLanguages();\n const defaultLang = languages.find(l => l.isDefault);\n return defaultLang?.code ?? languages[0]?.code;\n }\n\n private shouldPrefixPath(): boolean {\n return this.repository.getLanguages().length > 1;\n }\n\n private afterChange(value: unknown, f: FormModel.Interface) {\n const langCode = String(value);\n const codes = this.getSupportedCodes();\n\n const path = f.field(\"path\").as(\"text\").getValue() || \"\";\n const stripped = PagePath.create(path).stripLanguageCode(codes);\n const needsPrefix = langCode && this.shouldPrefixPath();\n\n // Determine the bare path — either from existing path or from title.\n let barePath = stripped;\n if (barePath.isEmpty()) {\n const title = f.field(\"title\").as(\"text\").getValue() || \"\";\n if (title) {\n barePath = PagePath.fromTitle(title);\n }\n }\n\n if (barePath.isEmpty()) {\n // No path and no title — nothing to do.\n f.setData({ ...f.getData(), path: null });\n } else if (needsPrefix) {\n f.field(\"path\").setValue(barePath.setLanguageCode(langCode, codes).toString());\n } else {\n f.field(\"path\").setValue(barePath.toString());\n }\n }\n\n private getLanguageOptions() {\n return this.repository.getLanguages().map(lang => ({\n label: `${lang.name} (${lang.code})`,\n value: lang.code\n }));\n }\n}\n\nexport const AddLanguageModifier = CreatePageFormModifier.createImplementation({\n implementation: AddLanguagePageFormModifier,\n dependencies: [ListLanguagesUseCase, ListLanguagesRepository]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,11 +1,9 @@
1
1
  import { describe, it, expect } from "vitest";
2
- import { FormModel as FormModelImpl } from "@webiny/app-admin/features/formModel/FormModel.js";
2
+ import { Container } from "@webiny/di";
3
+ import { FormModelFeature } from "@webiny/app-admin/features/formModel/feature.js";
4
+ import { FormModelFactory } from "@webiny/app-admin/features/formModel/abstractions.js";
3
5
  import { AddLanguageModifier } from "./AddLanguageModifier.js";
4
6
  import { PagePath } from "../../../shared/PagePath.js";
5
- /**
6
- * Creates a mock use case + repository pair for the AddLanguageModifier.
7
- * Languages are pre-populated (simulating a completed fetch).
8
- */
9
7
  function createLanguageMocks(languages) {
10
8
  const repository = {
11
9
  execute: async () => languages,
@@ -19,13 +17,11 @@ function createLanguageMocks(languages) {
19
17
  repository
20
18
  };
21
19
  }
22
-
23
- /**
24
- * Creates the same base form that CreatePagePresenter builds,
25
- * without requiring DI or the page type cache.
26
- */
27
20
  function createBaseForm(config) {
28
- return new FormModelImpl({
21
+ const container = new Container();
22
+ FormModelFeature.register(container);
23
+ const factory = container.resolve(FormModelFactory);
24
+ return factory.create({
29
25
  fields: fields => ({
30
26
  title: fields.text().label("Title").required("Title is required").onBlur((value, f) => {
31
27
  const currentPath = f.field("path").getValue();
@@ -127,7 +123,7 @@ describe("PageType + Modifier 3-layer architecture", () => {
127
123
  label: "Product Page",
128
124
  modifyForm(form) {
129
125
  form.fields(fields => ({
130
- product: fields.select().label("Product").required("Product is required").options([{
126
+ product: fields.text().label("Product").required("Product is required").options([{
131
127
  label: "Shoes",
132
128
  value: "shoes"
133
129
  }, {
@@ -214,7 +210,7 @@ describe("Form rebuild on page type switch", () => {
214
210
  label: "Product Page",
215
211
  modifyForm(form) {
216
212
  form.fields(fields => ({
217
- product: fields.select().label("Product").required("Product is required").options([{
213
+ product: fields.text().label("Product").required("Product is required").options([{
218
214
  label: "Shoes",
219
215
  value: "shoes"
220
216
  }, {