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

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
@@ -2,7 +2,6 @@ import React from "react";
2
2
  import { CompositionScope } from "@webiny/app-admin";
3
3
  import { EditorConfig, EditorConfigComponents } from "../../../BaseEditor/index.js";
4
4
  import { EDITOR_NAME } from "../constants.js";
5
- import { PageSettings } from "./PageSettings/PageSettings.js";
6
5
  const PrimaryPageEditorConfig = ({
7
6
  children
8
7
  }) => {
@@ -25,13 +24,9 @@ const SecondaryPageEditorConfig = ({
25
24
  };
26
25
 
27
26
  /* This one is an internal API for the base app. It ensures this config is always applied first. */
28
- export const InternalPageEditorConfig = Object.assign(PrimaryPageEditorConfig, EditorConfigComponents, {
29
- PageSettings
30
- });
27
+ export const InternalPageEditorConfig = Object.assign(PrimaryPageEditorConfig, EditorConfigComponents);
31
28
 
32
29
  /* This one is a public API for other apps and third party developers. */
33
- export const PageEditorConfig = Object.assign(SecondaryPageEditorConfig, EditorConfigComponents, {
34
- PageSettings
35
- });
30
+ export const PageEditorConfig = Object.assign(SecondaryPageEditorConfig, EditorConfigComponents);
36
31
 
37
32
  //# sourceMappingURL=PageEditorConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","CompositionScope","EditorConfig","EditorConfigComponents","EDITOR_NAME","PageSettings","PrimaryPageEditorConfig","children","createElement","name","inherit","priority","SecondaryPageEditorConfig","InternalPageEditorConfig","Object","assign","PageEditorConfig"],"sources":["PageEditorConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { CompositionScope } from \"@webiny/app-admin\";\nimport { EditorConfig, EditorConfigComponents } from \"~/BaseEditor/index.js\";\nimport { EDITOR_NAME } from \"~/modules/pages/constants.js\";\nimport { PageSettings } from \"./PageSettings/PageSettings.js\";\n\ninterface PageEditorConfigProps {\n children: React.ReactNode;\n}\n\nconst PrimaryPageEditorConfig = ({ children }: PageEditorConfigProps) => {\n return (\n <CompositionScope name={EDITOR_NAME} inherit={true}>\n <EditorConfig priority={\"primary\"}>{children}</EditorConfig>\n </CompositionScope>\n );\n};\n\nconst SecondaryPageEditorConfig = ({ children }: PageEditorConfigProps) => {\n return (\n <CompositionScope name={EDITOR_NAME} inherit={true}>\n <EditorConfig priority={\"secondary\"}>{children}</EditorConfig>\n </CompositionScope>\n );\n};\n\n/* This one is an internal API for the base app. It ensures this config is always applied first. */\nexport const InternalPageEditorConfig = Object.assign(\n PrimaryPageEditorConfig,\n EditorConfigComponents,\n { PageSettings }\n);\n\n/* This one is a public API for other apps and third party developers. */\nexport const PageEditorConfig = Object.assign(SecondaryPageEditorConfig, EditorConfigComponents, {\n PageSettings\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,gBAAgB,QAAQ,mBAAmB;AACpD,SAASC,YAAY,EAAEC,sBAAsB;AAC7C,SAASC,WAAW;AACpB,SAASC,YAAY;AAMrB,MAAMC,uBAAuB,GAAGA,CAAC;EAAEC;AAAgC,CAAC,KAAK;EACrE,oBACIP,KAAA,CAAAQ,aAAA,CAACP,gBAAgB;IAACQ,IAAI,EAAEL,WAAY;IAACM,OAAO,EAAE;EAAK,gBAC/CV,KAAA,CAAAQ,aAAA,CAACN,YAAY;IAACS,QAAQ,EAAE;EAAU,GAAEJ,QAAuB,CAC7C,CAAC;AAE3B,CAAC;AAED,MAAMK,yBAAyB,GAAGA,CAAC;EAAEL;AAAgC,CAAC,KAAK;EACvE,oBACIP,KAAA,CAAAQ,aAAA,CAACP,gBAAgB;IAACQ,IAAI,EAAEL,WAAY;IAACM,OAAO,EAAE;EAAK,gBAC/CV,KAAA,CAAAQ,aAAA,CAACN,YAAY;IAACS,QAAQ,EAAE;EAAY,GAAEJ,QAAuB,CAC/C,CAAC;AAE3B,CAAC;;AAED;AACA,OAAO,MAAMM,wBAAwB,GAAGC,MAAM,CAACC,MAAM,CACjDT,uBAAuB,EACvBH,sBAAsB,EACtB;EAAEE;AAAa,CACnB,CAAC;;AAED;AACA,OAAO,MAAMW,gBAAgB,GAAGF,MAAM,CAACC,MAAM,CAACH,yBAAyB,EAAET,sBAAsB,EAAE;EAC7FE;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","CompositionScope","EditorConfig","EditorConfigComponents","EDITOR_NAME","PrimaryPageEditorConfig","children","createElement","name","inherit","priority","SecondaryPageEditorConfig","InternalPageEditorConfig","Object","assign","PageEditorConfig"],"sources":["PageEditorConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { CompositionScope } from \"@webiny/app-admin\";\nimport { EditorConfig, EditorConfigComponents } from \"~/BaseEditor/index.js\";\nimport { EDITOR_NAME } from \"~/modules/pages/constants.js\";\n\ninterface PageEditorConfigProps {\n children: React.ReactNode;\n}\n\nconst PrimaryPageEditorConfig = ({ children }: PageEditorConfigProps) => {\n return (\n <CompositionScope name={EDITOR_NAME} inherit={true}>\n <EditorConfig priority={\"primary\"}>{children}</EditorConfig>\n </CompositionScope>\n );\n};\n\nconst SecondaryPageEditorConfig = ({ children }: PageEditorConfigProps) => {\n return (\n <CompositionScope name={EDITOR_NAME} inherit={true}>\n <EditorConfig priority={\"secondary\"}>{children}</EditorConfig>\n </CompositionScope>\n );\n};\n\n/* This one is an internal API for the base app. It ensures this config is always applied first. */\nexport const InternalPageEditorConfig = Object.assign(\n PrimaryPageEditorConfig,\n EditorConfigComponents\n);\n\n/* This one is a public API for other apps and third party developers. */\nexport const PageEditorConfig = Object.assign(SecondaryPageEditorConfig, EditorConfigComponents);\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,gBAAgB,QAAQ,mBAAmB;AACpD,SAASC,YAAY,EAAEC,sBAAsB;AAC7C,SAASC,WAAW;AAMpB,MAAMC,uBAAuB,GAAGA,CAAC;EAAEC;AAAgC,CAAC,KAAK;EACrE,oBACIN,KAAA,CAAAO,aAAA,CAACN,gBAAgB;IAACO,IAAI,EAAEJ,WAAY;IAACK,OAAO,EAAE;EAAK,gBAC/CT,KAAA,CAAAO,aAAA,CAACL,YAAY;IAACQ,QAAQ,EAAE;EAAU,GAAEJ,QAAuB,CAC7C,CAAC;AAE3B,CAAC;AAED,MAAMK,yBAAyB,GAAGA,CAAC;EAAEL;AAAgC,CAAC,KAAK;EACvE,oBACIN,KAAA,CAAAO,aAAA,CAACN,gBAAgB;IAACO,IAAI,EAAEJ,WAAY;IAACK,OAAO,EAAE;EAAK,gBAC/CT,KAAA,CAAAO,aAAA,CAACL,YAAY;IAACQ,QAAQ,EAAE;EAAY,GAAEJ,QAAuB,CAC/C,CAAC;AAE3B,CAAC;;AAED;AACA,OAAO,MAAMM,wBAAwB,GAAGC,MAAM,CAACC,MAAM,CACjDT,uBAAuB,EACvBF,sBACJ,CAAC;;AAED;AACA,OAAO,MAAMY,gBAAgB,GAAGF,MAAM,CAACC,MAAM,CAACH,yBAAyB,EAAER,sBAAsB,CAAC","ignoreList":[]}
@@ -0,0 +1,22 @@
1
+ import { FormModelFactory } from "@webiny/app-admin";
2
+ import { PageSettingsPresenter as PresenterAbstraction } from "./abstractions.js";
3
+ import { PageSettingsGroup } from "./abstractions.js";
4
+ import { PageSettingsGroupModifier } from "./abstractions.js";
5
+ declare class PageSettingsPresenterImpl implements PresenterAbstraction.Interface {
6
+ private factory;
7
+ private groups;
8
+ private modifiers;
9
+ private form;
10
+ private error;
11
+ private originalData;
12
+ constructor(factory: FormModelFactory.Interface, groups: PageSettingsGroup.Interface[], modifiers: PageSettingsGroupModifier.Interface[] | undefined);
13
+ get vm(): PresenterAbstraction.ViewModel;
14
+ init(data: PageSettingsGroup.PageDocument): void;
15
+ submit(): Promise<PageSettingsGroup.PageDocument | false>;
16
+ private collectGroups;
17
+ private buildForm;
18
+ }
19
+ export declare const PageSettingsPresenterRegistration: typeof PageSettingsPresenterImpl & {
20
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IPageSettingsPresenter>;
21
+ };
22
+ export {};
@@ -0,0 +1,154 @@
1
+ import { makeAutoObservable, computed } from "mobx";
2
+ import { FormModelFactory } from "@webiny/app-admin";
3
+ import { PageSettingsPresenter as PresenterAbstraction } from "./abstractions.js";
4
+ import { PageSettingsGroup } from "./abstractions.js";
5
+ import { PageSettingsGroupModifier } from "./abstractions.js";
6
+ class PageSettingsPresenterImpl {
7
+ form = null;
8
+ error = null;
9
+ originalData = null;
10
+ constructor(factory, groups, modifiers) {
11
+ this.factory = factory;
12
+ this.groups = groups;
13
+ this.modifiers = modifiers;
14
+ makeAutoObservable(this, {
15
+ vm: computed
16
+ }, {
17
+ autoBind: true
18
+ });
19
+ }
20
+ get vm() {
21
+ return {
22
+ form: this.form ? this.form.vm : null,
23
+ error: this.error
24
+ };
25
+ }
26
+ init(data) {
27
+ this.error = null;
28
+ this.originalData = data;
29
+ this.form = this.buildForm();
30
+ const mapped = {};
31
+ for (const group of this.groups) {
32
+ mapped[group.name] = group.mapToForm(data);
33
+ }
34
+ for (const modifier of this.modifiers ?? []) {
35
+ if (modifier.mapToForm) {
36
+ const modData = modifier.mapToForm(data);
37
+ mapped[modifier.group] = {
38
+ ...mapped[modifier.group],
39
+ ...modData
40
+ };
41
+ }
42
+ }
43
+ this.form.setData(mapped);
44
+ }
45
+ async submit() {
46
+ if (!this.form || !this.originalData) {
47
+ return false;
48
+ }
49
+ const data = await this.form.submit();
50
+ if (!data) {
51
+ return false;
52
+ }
53
+ console.log("data", data);
54
+ const doc = structuredClone(this.originalData);
55
+ for (const group of this.groups) {
56
+ group.mapFromForm(data[group.name] ?? {}, doc);
57
+ }
58
+ for (const modifier of this.modifiers ?? []) {
59
+ if (modifier.mapFromForm) {
60
+ modifier.mapFromForm(data[modifier.group] ?? {}, doc);
61
+ }
62
+ }
63
+ return doc;
64
+ }
65
+ collectGroups() {
66
+ return this.groups.map(group => {
67
+ const fieldsFns = [];
68
+ const layoutFns = [];
69
+ const builder = {
70
+ fields(fn) {
71
+ fieldsFns.push(fn);
72
+ },
73
+ layout(fn) {
74
+ layoutFns.push(fn);
75
+ }
76
+ };
77
+ group.buildForm(builder);
78
+ for (const modifier of this.modifiers ?? []) {
79
+ if (modifier.group === group.name) {
80
+ modifier.modifyForm(builder);
81
+ }
82
+ }
83
+ return {
84
+ group,
85
+ fieldsFns,
86
+ layoutFns
87
+ };
88
+ });
89
+ }
90
+ buildForm() {
91
+ const collected = this.collectGroups();
92
+ return this.factory.create({
93
+ fields: fields => {
94
+ const result = {};
95
+ for (const {
96
+ group,
97
+ fieldsFns
98
+ } of collected) {
99
+ if (fieldsFns.length === 0) {
100
+ continue;
101
+ }
102
+ result[group.name] = fields.object().label(group.label).renderer("passthrough").fields(registry => {
103
+ const merged = {};
104
+ for (const fn of fieldsFns) {
105
+ Object.assign(merged, fn(registry));
106
+ }
107
+ return merged;
108
+ });
109
+ }
110
+ return result;
111
+ },
112
+ layout: layout => {
113
+ if (collected.length === 0) {
114
+ return [];
115
+ }
116
+ const tabsBuilder = layout.tabs("settings-tabs").renderer("tabsVertical");
117
+ for (const {
118
+ group,
119
+ layoutFns
120
+ } of collected) {
121
+ tabsBuilder.tab(group.name, tab => {
122
+ tab.label(group.label);
123
+ if (group.description) {
124
+ tab.description(group.description);
125
+ }
126
+ if (group.icon) {
127
+ tab.icon(group.icon);
128
+ }
129
+ tab.layout(l => {
130
+ if (layoutFns.length > 0) {
131
+ return [l.object(group.name, inner => {
132
+ return layoutFns.flatMap(fn => fn(inner));
133
+ })];
134
+ }
135
+ return [l.row(group.name)];
136
+ });
137
+ });
138
+ }
139
+ return [tabsBuilder];
140
+ }
141
+ });
142
+ }
143
+ }
144
+ export const PageSettingsPresenterRegistration = PresenterAbstraction.createImplementation({
145
+ implementation: PageSettingsPresenterImpl,
146
+ dependencies: [FormModelFactory, [PageSettingsGroup, {
147
+ multiple: true
148
+ }], [PageSettingsGroupModifier, {
149
+ multiple: true,
150
+ optional: true
151
+ }]]
152
+ });
153
+
154
+ //# sourceMappingURL=PageSettingsPresenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["makeAutoObservable","computed","FormModelFactory","PageSettingsPresenter","PresenterAbstraction","PageSettingsGroup","PageSettingsGroupModifier","PageSettingsPresenterImpl","form","error","originalData","constructor","factory","groups","modifiers","vm","autoBind","init","data","buildForm","mapped","group","name","mapToForm","modifier","modData","setData","submit","console","log","doc","structuredClone","mapFromForm","collectGroups","map","fieldsFns","layoutFns","builder","fields","fn","push","layout","modifyForm","collected","create","result","length","object","label","renderer","registry","merged","Object","assign","tabsBuilder","tabs","tab","description","icon","l","inner","flatMap","row","PageSettingsPresenterRegistration","createImplementation","implementation","dependencies","multiple","optional"],"sources":["PageSettingsPresenter.ts"],"sourcesContent":["import { makeAutoObservable, computed } from \"mobx\";\nimport { FormModelFactory, FormModel } from \"@webiny/app-admin\";\nimport { PageSettingsPresenter as PresenterAbstraction } from \"./abstractions.js\";\nimport { PageSettingsGroup } from \"./abstractions.js\";\nimport { PageSettingsGroupModifier } from \"./abstractions.js\";\n\ntype FieldsFactory = (\n fields: FormModelFactory.FieldBuilderRegistry\n) => Record<string, FormModelFactory.FieldBuilder>;\n\ntype LayoutFactory = (layout: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[];\n\ninterface CollectedGroup {\n group: PageSettingsGroup.Interface;\n fieldsFns: FieldsFactory[];\n layoutFns: LayoutFactory[];\n}\n\nclass PageSettingsPresenterImpl implements PresenterAbstraction.Interface {\n private form: FormModel.Interface | null = null;\n private error: string | null = null;\n private originalData: PageSettingsGroup.PageDocument | null = null;\n\n constructor(\n private factory: FormModelFactory.Interface,\n private groups: PageSettingsGroup.Interface[],\n private modifiers: PageSettingsGroupModifier.Interface[] | undefined\n ) {\n makeAutoObservable(this, { vm: computed }, { autoBind: true });\n }\n\n get vm(): PresenterAbstraction.ViewModel {\n return {\n form: this.form ? this.form.vm : null,\n error: this.error\n };\n }\n\n init(data: PageSettingsGroup.PageDocument): void {\n this.error = null;\n this.originalData = data;\n\n this.form = this.buildForm();\n\n const mapped: Record<string, any> = {};\n for (const group of this.groups) {\n mapped[group.name] = group.mapToForm(data);\n }\n\n for (const modifier of this.modifiers ?? []) {\n if (modifier.mapToForm) {\n const modData = modifier.mapToForm(data);\n mapped[modifier.group] = { ...mapped[modifier.group], ...modData };\n }\n }\n\n this.form.setData(mapped);\n }\n\n async submit(): Promise<PageSettingsGroup.PageDocument | false> {\n if (!this.form || !this.originalData) {\n return false;\n }\n\n const data = await this.form.submit<Record<string, any>>();\n if (!data) {\n return false;\n }\n\n console.log(\"data\", data);\n\n const doc = structuredClone(this.originalData);\n\n for (const group of this.groups) {\n group.mapFromForm(data[group.name] ?? {}, doc);\n }\n\n for (const modifier of this.modifiers ?? []) {\n if (modifier.mapFromForm) {\n modifier.mapFromForm(data[modifier.group] ?? {}, doc);\n }\n }\n\n return doc;\n }\n\n private collectGroups(): CollectedGroup[] {\n return this.groups.map(group => {\n const fieldsFns: FieldsFactory[] = [];\n const layoutFns: LayoutFactory[] = [];\n\n const builder: PageSettingsGroup.FormBuilder = {\n fields(fn: FieldsFactory) {\n fieldsFns.push(fn);\n },\n layout(fn: LayoutFactory) {\n layoutFns.push(fn);\n }\n };\n\n group.buildForm(builder);\n\n for (const modifier of this.modifiers ?? []) {\n if (modifier.group === group.name) {\n modifier.modifyForm(builder);\n }\n }\n\n return { group, fieldsFns, layoutFns };\n });\n }\n\n private buildForm() {\n const collected = this.collectGroups();\n\n return this.factory.create({\n fields: fields => {\n const result: Record<string, FormModelFactory.FieldBuilder> = {};\n for (const { group, fieldsFns } of collected) {\n if (fieldsFns.length === 0) {\n continue;\n }\n result[group.name] = fields\n .object()\n .label(group.label)\n .renderer(\"passthrough\")\n .fields(registry => {\n const merged: Record<string, FormModelFactory.FieldBuilder> = {};\n for (const fn of fieldsFns) {\n Object.assign(merged, fn(registry));\n }\n return merged;\n });\n }\n return result;\n },\n layout: layout => {\n if (collected.length === 0) {\n return [];\n }\n\n const tabsBuilder = layout.tabs(\"settings-tabs\").renderer(\"tabsVertical\");\n\n for (const { group, layoutFns } of collected) {\n tabsBuilder.tab(group.name, tab => {\n tab.label(group.label);\n if (group.description) {\n tab.description(group.description);\n }\n if (group.icon) {\n tab.icon(group.icon);\n }\n tab.layout(l => {\n if (layoutFns.length > 0) {\n return [\n l.object(group.name, inner => {\n return layoutFns.flatMap(fn => fn(inner));\n })\n ];\n }\n\n return [l.row(group.name)];\n });\n });\n }\n\n return [tabsBuilder];\n }\n });\n }\n}\n\nexport const PageSettingsPresenterRegistration = PresenterAbstraction.createImplementation({\n implementation: PageSettingsPresenterImpl,\n dependencies: [\n FormModelFactory,\n [PageSettingsGroup, { multiple: true }],\n [PageSettingsGroupModifier, { multiple: true, optional: true }]\n ]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,54 @@
1
+ import { FormModel } from "@webiny/app-admin";
2
+ import { FormModelFactory } from "@webiny/app-admin";
3
+ import type { Icon } from "@webiny/app-admin/components/IconPicker/types.js";
4
+ import type { EditorPage } from "@webiny/website-builder-sdk";
5
+ export interface IPageSettingsGroupFormBuilder {
6
+ fields(fn: (fields: FormModelFactory.FieldBuilderRegistry) => Record<string, FormModelFactory.FieldBuilder>): void;
7
+ layout(fn: (layout: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]): void;
8
+ }
9
+ export interface IPageDocument {
10
+ properties: EditorPage["properties"];
11
+ metadata: EditorPage["metadata"];
12
+ extensions: EditorPage["extensions"];
13
+ }
14
+ export interface IPageSettingsGroup {
15
+ name: string;
16
+ label: string;
17
+ description?: string;
18
+ icon?: Icon;
19
+ buildForm(formBuilder: IPageSettingsGroupFormBuilder): void;
20
+ mapToForm(document: IPageDocument): Record<string, any>;
21
+ mapFromForm(formData: Record<string, any>, document: IPageDocument): void;
22
+ }
23
+ export declare const PageSettingsGroup: import("@webiny/di").Abstraction<IPageSettingsGroup>;
24
+ export declare namespace PageSettingsGroup {
25
+ type Interface = IPageSettingsGroup;
26
+ type FormBuilder = IPageSettingsGroupFormBuilder;
27
+ type PageDocument = IPageDocument;
28
+ }
29
+ export interface IPageSettingsGroupModifier {
30
+ group: string;
31
+ modifyForm(formBuilder: IPageSettingsGroupFormBuilder): void;
32
+ mapToForm?(document: PageSettingsGroupModifier.PageDocument): Record<string, any>;
33
+ mapFromForm?(formData: Record<string, any>, document: PageSettingsGroupModifier.PageDocument): void;
34
+ }
35
+ export declare const PageSettingsGroupModifier: import("@webiny/di").Abstraction<IPageSettingsGroupModifier>;
36
+ export declare namespace PageSettingsGroupModifier {
37
+ type Interface = IPageSettingsGroupModifier;
38
+ type PageDocument = IPageDocument;
39
+ type FormBuilder = IPageSettingsGroupFormBuilder;
40
+ }
41
+ export interface IPageSettingsVm {
42
+ form: FormModel.FormVM | null;
43
+ error: string | null;
44
+ }
45
+ export interface IPageSettingsPresenter {
46
+ readonly vm: IPageSettingsVm;
47
+ init(data: IPageDocument): void;
48
+ submit(): Promise<IPageDocument | false>;
49
+ }
50
+ export declare const PageSettingsPresenter: import("@webiny/di").Abstraction<IPageSettingsPresenter>;
51
+ export declare namespace PageSettingsPresenter {
52
+ type Interface = IPageSettingsPresenter;
53
+ type ViewModel = IPageSettingsVm;
54
+ }
@@ -0,0 +1,12 @@
1
+ import { createAbstraction } from "@webiny/feature/admin";
2
+
3
+ // Settings Group
4
+
5
+ export const PageSettingsGroup = createAbstraction("PageEditor/SettingsGroup");
6
+ export const PageSettingsGroupModifier = createAbstraction("PageEditor/SettingsGroupModifier");
7
+
8
+ // Presenter
9
+
10
+ export const PageSettingsPresenter = createAbstraction("PageEditor/SettingsPresenter");
11
+
12
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createAbstraction","PageSettingsGroup","PageSettingsGroupModifier","PageSettingsPresenter"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport { FormModel } from \"@webiny/app-admin\";\nimport { FormModelFactory } from \"@webiny/app-admin\";\nimport type { Icon } from \"@webiny/app-admin/components/IconPicker/types.js\";\nimport type { EditorPage } from \"@webiny/website-builder-sdk\";\n\n// Settings Group\n\nexport interface IPageSettingsGroupFormBuilder {\n fields(\n fn: (\n fields: FormModelFactory.FieldBuilderRegistry\n ) => Record<string, FormModelFactory.FieldBuilder>\n ): void;\n layout(fn: (layout: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]): void;\n}\n\nexport interface IPageDocument {\n properties: EditorPage[\"properties\"];\n metadata: EditorPage[\"metadata\"];\n extensions: EditorPage[\"extensions\"];\n}\n\nexport interface IPageSettingsGroup {\n name: string;\n label: string;\n description?: string;\n icon?: Icon;\n buildForm(formBuilder: IPageSettingsGroupFormBuilder): void;\n mapToForm(document: IPageDocument): Record<string, any>;\n mapFromForm(formData: Record<string, any>, document: IPageDocument): void;\n}\n\nexport const PageSettingsGroup = createAbstraction<IPageSettingsGroup>(\"PageEditor/SettingsGroup\");\n\nexport namespace PageSettingsGroup {\n export type Interface = IPageSettingsGroup;\n export type FormBuilder = IPageSettingsGroupFormBuilder;\n export type PageDocument = IPageDocument;\n}\n\nexport interface IPageSettingsGroupModifier {\n group: string;\n modifyForm(formBuilder: IPageSettingsGroupFormBuilder): void;\n mapToForm?(document: PageSettingsGroupModifier.PageDocument): Record<string, any>;\n mapFromForm?(\n formData: Record<string, any>,\n document: PageSettingsGroupModifier.PageDocument\n ): void;\n}\n\nexport const PageSettingsGroupModifier = createAbstraction<IPageSettingsGroupModifier>(\n \"PageEditor/SettingsGroupModifier\"\n);\n\nexport namespace PageSettingsGroupModifier {\n export type Interface = IPageSettingsGroupModifier;\n export type PageDocument = IPageDocument;\n export type FormBuilder = IPageSettingsGroupFormBuilder;\n}\n\n// Presenter\n\nexport interface IPageSettingsVm {\n form: FormModel.FormVM | null;\n error: string | null;\n}\n\nexport interface IPageSettingsPresenter {\n readonly vm: IPageSettingsVm;\n init(data: IPageDocument): void;\n submit(): Promise<IPageDocument | false>;\n}\n\nexport const PageSettingsPresenter = createAbstraction<IPageSettingsPresenter>(\n \"PageEditor/SettingsPresenter\"\n);\n\nexport namespace PageSettingsPresenter {\n export type Interface = IPageSettingsPresenter;\n export type ViewModel = IPageSettingsVm;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,uBAAuB;;AAMzD;;AA2BA,OAAO,MAAMC,iBAAiB,GAAGD,iBAAiB,CAAqB,0BAA0B,CAAC;AAkBlG,OAAO,MAAME,yBAAyB,GAAGF,iBAAiB,CACtD,kCACJ,CAAC;;AAQD;;AAaA,OAAO,MAAMG,qBAAqB,GAAGH,iBAAiB,CAClD,8BACJ,CAAC","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ export declare const PageSettingsFeature: import("@webiny/feature/admin").FeatureDefinition<{
2
+ presenter: import("./abstractions.js").IPageSettingsPresenter;
3
+ }, []>;
@@ -0,0 +1,24 @@
1
+ import { createFeature } from "@webiny/feature/admin";
2
+ import { PageSettingsPresenter as PresenterAbstraction } from "./abstractions.js";
3
+ import { PageSettingsPresenterRegistration } from "./PageSettingsPresenter.js";
4
+ import { GeneralSettingsGroup } from "./groups/GeneralSettingsGroup.js";
5
+ import { SeoSettingsGroup } from "./groups/SeoSettingsGroup.js";
6
+ import { SocialSettingsGroup } from "./groups/SocialSettingsGroup.js";
7
+ import { SchemaSettingsGroup } from "./groups/SchemaSettingsGroup.js";
8
+ export const PageSettingsFeature = createFeature({
9
+ name: "PageEditor/Settings",
10
+ register(container) {
11
+ container.register(GeneralSettingsGroup);
12
+ container.register(SeoSettingsGroup);
13
+ container.register(SocialSettingsGroup);
14
+ container.register(SchemaSettingsGroup);
15
+ container.register(PageSettingsPresenterRegistration);
16
+ },
17
+ resolve(container) {
18
+ return {
19
+ presenter: container.resolve(PresenterAbstraction)
20
+ };
21
+ }
22
+ });
23
+
24
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createFeature","PageSettingsPresenter","PresenterAbstraction","PageSettingsPresenterRegistration","GeneralSettingsGroup","SeoSettingsGroup","SocialSettingsGroup","SchemaSettingsGroup","PageSettingsFeature","name","register","container","resolve","presenter"],"sources":["feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { PageSettingsPresenter as PresenterAbstraction } from \"./abstractions.js\";\nimport { PageSettingsPresenterRegistration } from \"./PageSettingsPresenter.js\";\nimport { GeneralSettingsGroup } from \"./groups/GeneralSettingsGroup.js\";\nimport { SeoSettingsGroup } from \"./groups/SeoSettingsGroup.js\";\nimport { SocialSettingsGroup } from \"./groups/SocialSettingsGroup.js\";\nimport { SchemaSettingsGroup } from \"./groups/SchemaSettingsGroup.js\";\n\nexport const PageSettingsFeature = createFeature({\n name: \"PageEditor/Settings\",\n register(container) {\n container.register(GeneralSettingsGroup);\n container.register(SeoSettingsGroup);\n container.register(SocialSettingsGroup);\n container.register(SchemaSettingsGroup);\n container.register(PageSettingsPresenterRegistration);\n },\n resolve(container) {\n return {\n presenter: container.resolve(PresenterAbstraction)\n };\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,uBAAuB;AACrD,SAASC,qBAAqB,IAAIC,oBAAoB;AACtD,SAASC,iCAAiC;AAC1C,SAASC,oBAAoB;AAC7B,SAASC,gBAAgB;AACzB,SAASC,mBAAmB;AAC5B,SAASC,mBAAmB;AAE5B,OAAO,MAAMC,mBAAmB,GAAGR,aAAa,CAAC;EAC7CS,IAAI,EAAE,qBAAqB;EAC3BC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACN,oBAAoB,CAAC;IACxCO,SAAS,CAACD,QAAQ,CAACL,gBAAgB,CAAC;IACpCM,SAAS,CAACD,QAAQ,CAACJ,mBAAmB,CAAC;IACvCK,SAAS,CAACD,QAAQ,CAACH,mBAAmB,CAAC;IACvCI,SAAS,CAACD,QAAQ,CAACP,iCAAiC,CAAC;EACzD,CAAC;EACDS,OAAOA,CAACD,SAAS,EAAE;IACf,OAAO;MACHE,SAAS,EAAEF,SAAS,CAACC,OAAO,CAACV,oBAAoB;IACrD,CAAC;EACL;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ import { PageSettingsGroup } from "../abstractions.js";
2
+ declare class GeneralSettingsGroupImpl implements PageSettingsGroup.Interface {
3
+ name: string;
4
+ label: string;
5
+ description: string;
6
+ icon: {
7
+ type: string;
8
+ name: string;
9
+ };
10
+ buildForm(form: PageSettingsGroup.FormBuilder): void;
11
+ mapToForm(doc: PageSettingsGroup.PageDocument): Record<string, any>;
12
+ mapFromForm(formData: Record<string, any>, doc: PageSettingsGroup.PageDocument): void;
13
+ }
14
+ export declare const GeneralSettingsGroup: typeof GeneralSettingsGroupImpl & {
15
+ __abstraction: import("@webiny/di").Abstraction<import("../abstractions.js").IPageSettingsGroup>;
16
+ };
17
+ export {};
@@ -0,0 +1,42 @@
1
+ import { PageSettingsGroup } from "../abstractions.js";
2
+ class GeneralSettingsGroupImpl {
3
+ name = "general";
4
+ label = "General";
5
+ description = "Configure the page's core details like title, path, snippet, and image.";
6
+ icon = {
7
+ type: "icon",
8
+ name: "fas/cog"
9
+ };
10
+ buildForm(form) {
11
+ form.fields(fields => ({
12
+ title: fields.text().label("Page title").required(),
13
+ path: fields.text().label("Path").required(),
14
+ snippet: fields.text().label("Snippet").renderer("textarea"),
15
+ image: fields.file().label("Image").description("Select an image to represent this page"),
16
+ tags: fields.text().label("Tags").description("Add page tags. These can be used for page rendering, filtering, etc.").renderer("tags").list()
17
+ }));
18
+ form.layout(layout => [layout.row("title"), layout.row("path"), layout.row("snippet"), layout.row("image"), layout.row("tags")]);
19
+ }
20
+ mapToForm(doc) {
21
+ return {
22
+ title: doc.properties?.title,
23
+ path: doc.properties?.path,
24
+ snippet: doc.properties?.snippet,
25
+ image: doc.properties?.image,
26
+ tags: doc.properties?.tags
27
+ };
28
+ }
29
+ mapFromForm(formData, doc) {
30
+ doc.properties.title = formData.title;
31
+ doc.properties.path = formData.path;
32
+ doc.properties.snippet = formData.snippet;
33
+ doc.properties.image = formData.image;
34
+ doc.properties.tags = formData.tags;
35
+ }
36
+ }
37
+ export const GeneralSettingsGroup = PageSettingsGroup.createImplementation({
38
+ implementation: GeneralSettingsGroupImpl,
39
+ dependencies: []
40
+ });
41
+
42
+ //# sourceMappingURL=GeneralSettingsGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["PageSettingsGroup","GeneralSettingsGroupImpl","name","label","description","icon","type","buildForm","form","fields","title","text","required","path","snippet","renderer","image","file","tags","list","layout","row","mapToForm","doc","properties","mapFromForm","formData","GeneralSettingsGroup","createImplementation","implementation","dependencies"],"sources":["GeneralSettingsGroup.ts"],"sourcesContent":["import { PageSettingsGroup } from \"../abstractions.js\";\n\nclass GeneralSettingsGroupImpl implements PageSettingsGroup.Interface {\n name = \"general\";\n label = \"General\";\n description = \"Configure the page's core details like title, path, snippet, and image.\";\n icon = { type: \"icon\", name: \"fas/cog\" };\n\n buildForm(form: PageSettingsGroup.FormBuilder): void {\n form.fields(fields => ({\n title: fields.text().label(\"Page title\").required(),\n path: fields.text().label(\"Path\").required(),\n snippet: fields.text().label(\"Snippet\").renderer(\"textarea\"),\n image: fields\n .file()\n .label(\"Image\")\n .description(\"Select an image to represent this page\"),\n tags: fields\n .text()\n .label(\"Tags\")\n .description(\"Add page tags. These can be used for page rendering, filtering, etc.\")\n .renderer(\"tags\")\n .list()\n }));\n\n form.layout(layout => [\n layout.row(\"title\"),\n layout.row(\"path\"),\n layout.row(\"snippet\"),\n layout.row(\"image\"),\n layout.row(\"tags\")\n ]);\n }\n\n mapToForm(doc: PageSettingsGroup.PageDocument): Record<string, any> {\n return {\n title: doc.properties?.title,\n path: doc.properties?.path,\n snippet: doc.properties?.snippet,\n image: doc.properties?.image,\n tags: doc.properties?.tags\n };\n }\n\n mapFromForm(formData: Record<string, any>, doc: PageSettingsGroup.PageDocument): void {\n doc.properties.title = formData.title;\n doc.properties.path = formData.path;\n doc.properties.snippet = formData.snippet;\n doc.properties.image = formData.image;\n doc.properties.tags = formData.tags;\n }\n}\n\nexport const GeneralSettingsGroup = PageSettingsGroup.createImplementation({\n implementation: GeneralSettingsGroupImpl,\n dependencies: []\n});\n"],"mappings":"AAAA,SAASA,iBAAiB;AAE1B,MAAMC,wBAAwB,CAAwC;EAClEC,IAAI,GAAG,SAAS;EAChBC,KAAK,GAAG,SAAS;EACjBC,WAAW,GAAG,yEAAyE;EACvFC,IAAI,GAAG;IAAEC,IAAI,EAAE,MAAM;IAAEJ,IAAI,EAAE;EAAU,CAAC;EAExCK,SAASA,CAACC,IAAmC,EAAQ;IACjDA,IAAI,CAACC,MAAM,CAACA,MAAM,KAAK;MACnBC,KAAK,EAAED,MAAM,CAACE,IAAI,CAAC,CAAC,CAACR,KAAK,CAAC,YAAY,CAAC,CAACS,QAAQ,CAAC,CAAC;MACnDC,IAAI,EAAEJ,MAAM,CAACE,IAAI,CAAC,CAAC,CAACR,KAAK,CAAC,MAAM,CAAC,CAACS,QAAQ,CAAC,CAAC;MAC5CE,OAAO,EAAEL,MAAM,CAACE,IAAI,CAAC,CAAC,CAACR,KAAK,CAAC,SAAS,CAAC,CAACY,QAAQ,CAAC,UAAU,CAAC;MAC5DC,KAAK,EAAEP,MAAM,CACRQ,IAAI,CAAC,CAAC,CACNd,KAAK,CAAC,OAAO,CAAC,CACdC,WAAW,CAAC,wCAAwC,CAAC;MAC1Dc,IAAI,EAAET,MAAM,CACPE,IAAI,CAAC,CAAC,CACNR,KAAK,CAAC,MAAM,CAAC,CACbC,WAAW,CAAC,sEAAsE,CAAC,CACnFW,QAAQ,CAAC,MAAM,CAAC,CAChBI,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEHX,IAAI,CAACY,MAAM,CAACA,MAAM,IAAI,CAClBA,MAAM,CAACC,GAAG,CAAC,OAAO,CAAC,EACnBD,MAAM,CAACC,GAAG,CAAC,MAAM,CAAC,EAClBD,MAAM,CAACC,GAAG,CAAC,SAAS,CAAC,EACrBD,MAAM,CAACC,GAAG,CAAC,OAAO,CAAC,EACnBD,MAAM,CAACC,GAAG,CAAC,MAAM,CAAC,CACrB,CAAC;EACN;EAEAC,SAASA,CAACC,GAAmC,EAAuB;IAChE,OAAO;MACHb,KAAK,EAAEa,GAAG,CAACC,UAAU,EAAEd,KAAK;MAC5BG,IAAI,EAAEU,GAAG,CAACC,UAAU,EAAEX,IAAI;MAC1BC,OAAO,EAAES,GAAG,CAACC,UAAU,EAAEV,OAAO;MAChCE,KAAK,EAAEO,GAAG,CAACC,UAAU,EAAER,KAAK;MAC5BE,IAAI,EAAEK,GAAG,CAACC,UAAU,EAAEN;IAC1B,CAAC;EACL;EAEAO,WAAWA,CAACC,QAA6B,EAAEH,GAAmC,EAAQ;IAClFA,GAAG,CAACC,UAAU,CAACd,KAAK,GAAGgB,QAAQ,CAAChB,KAAK;IACrCa,GAAG,CAACC,UAAU,CAACX,IAAI,GAAGa,QAAQ,CAACb,IAAI;IACnCU,GAAG,CAACC,UAAU,CAACV,OAAO,GAAGY,QAAQ,CAACZ,OAAO;IACzCS,GAAG,CAACC,UAAU,CAACR,KAAK,GAAGU,QAAQ,CAACV,KAAK;IACrCO,GAAG,CAACC,UAAU,CAACN,IAAI,GAAGQ,QAAQ,CAACR,IAAI;EACvC;AACJ;AAEA,OAAO,MAAMS,oBAAoB,GAAG3B,iBAAiB,CAAC4B,oBAAoB,CAAC;EACvEC,cAAc,EAAE5B,wBAAwB;EACxC6B,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ import { PageSettingsGroup } from "../../../../../modules/pages/PageEditor/PageSettings/abstractions.js";
2
+ declare class SchemaSettingsGroupImpl implements PageSettingsGroup.Interface {
3
+ name: string;
4
+ label: string;
5
+ description: string;
6
+ icon: {
7
+ type: string;
8
+ name: string;
9
+ };
10
+ buildForm(form: PageSettingsGroup.FormBuilder): void;
11
+ mapToForm(doc: PageSettingsGroup.PageDocument): Record<string, any>;
12
+ mapFromForm(formData: Record<string, any>, doc: PageSettingsGroup.PageDocument): void;
13
+ }
14
+ export declare const SchemaSettingsGroup: typeof SchemaSettingsGroupImpl & {
15
+ __abstraction: import("@webiny/di").Abstraction<import("~/modules/pages/PageEditor/PageSettings/abstractions.js").IPageSettingsGroup>;
16
+ };
17
+ export {};
@@ -0,0 +1,34 @@
1
+ import { PageSettingsGroup } from "../abstractions.js";
2
+ class SchemaSettingsGroupImpl {
3
+ name = "schema";
4
+ label = "Schema";
5
+ description = "Add structured data markup to enhance search result appearance.";
6
+ icon = {
7
+ type: "icon",
8
+ name: "fas/code"
9
+ };
10
+ buildForm(form) {
11
+ form.fields(fields => ({
12
+ structuredSchema: fields.text().label("Structured Schema").defaultValue("").renderer("codeEditor", {
13
+ language: "html",
14
+ height: 400
15
+ })
16
+ }));
17
+ form.layout(layout => [layout.row("structuredSchema")]);
18
+ }
19
+ mapToForm(doc) {
20
+ return {
21
+ structuredSchema: doc.properties?.seo?.structuredSchema ?? ""
22
+ };
23
+ }
24
+ mapFromForm(formData, doc) {
25
+ doc.properties.seo = doc.properties.seo ?? {};
26
+ doc.properties.seo.structuredSchema = formData.structuredSchema;
27
+ }
28
+ }
29
+ export const SchemaSettingsGroup = PageSettingsGroup.createImplementation({
30
+ implementation: SchemaSettingsGroupImpl,
31
+ dependencies: []
32
+ });
33
+
34
+ //# sourceMappingURL=SchemaSettingsGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["PageSettingsGroup","SchemaSettingsGroupImpl","name","label","description","icon","type","buildForm","form","fields","structuredSchema","text","defaultValue","renderer","language","height","layout","row","mapToForm","doc","properties","seo","mapFromForm","formData","SchemaSettingsGroup","createImplementation","implementation","dependencies"],"sources":["SchemaSettingsGroup.ts"],"sourcesContent":["import { PageSettingsGroup } from \"~/modules/pages/PageEditor/PageSettings/abstractions.js\";\n\nclass SchemaSettingsGroupImpl implements PageSettingsGroup.Interface {\n name = \"schema\";\n label = \"Schema\";\n description = \"Add structured data markup to enhance search result appearance.\";\n icon = { type: \"icon\", name: \"fas/code\" };\n\n buildForm(form: PageSettingsGroup.FormBuilder): void {\n form.fields(fields => ({\n structuredSchema: fields\n .text()\n .label(\"Structured Schema\")\n .defaultValue(\"\")\n .renderer(\"codeEditor\", { language: \"html\", height: 400 })\n }));\n\n form.layout(layout => [layout.row(\"structuredSchema\")]);\n }\n\n mapToForm(doc: PageSettingsGroup.PageDocument): Record<string, any> {\n return {\n structuredSchema: doc.properties?.seo?.structuredSchema ?? \"\"\n };\n }\n\n mapFromForm(formData: Record<string, any>, doc: PageSettingsGroup.PageDocument): void {\n doc.properties.seo = doc.properties.seo ?? {};\n doc.properties.seo.structuredSchema = formData.structuredSchema;\n }\n}\n\nexport const SchemaSettingsGroup = PageSettingsGroup.createImplementation({\n implementation: SchemaSettingsGroupImpl,\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;EAAW,CAAC;EAEzCK,SAASA,CAACC,IAAmC,EAAQ;IACjDA,IAAI,CAACC,MAAM,CAACA,MAAM,KAAK;MACnBC,gBAAgB,EAAED,MAAM,CACnBE,IAAI,CAAC,CAAC,CACNR,KAAK,CAAC,mBAAmB,CAAC,CAC1BS,YAAY,CAAC,EAAE,CAAC,CAChBC,QAAQ,CAAC,YAAY,EAAE;QAAEC,QAAQ,EAAE,MAAM;QAAEC,MAAM,EAAE;MAAI,CAAC;IACjE,CAAC,CAAC,CAAC;IAEHP,IAAI,CAACQ,MAAM,CAACA,MAAM,IAAI,CAACA,MAAM,CAACC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;EAC3D;EAEAC,SAASA,CAACC,GAAmC,EAAuB;IAChE,OAAO;MACHT,gBAAgB,EAAES,GAAG,CAACC,UAAU,EAAEC,GAAG,EAAEX,gBAAgB,IAAI;IAC/D,CAAC;EACL;EAEAY,WAAWA,CAACC,QAA6B,EAAEJ,GAAmC,EAAQ;IAClFA,GAAG,CAACC,UAAU,CAACC,GAAG,GAAGF,GAAG,CAACC,UAAU,CAACC,GAAG,IAAI,CAAC,CAAC;IAC7CF,GAAG,CAACC,UAAU,CAACC,GAAG,CAACX,gBAAgB,GAAGa,QAAQ,CAACb,gBAAgB;EACnE;AACJ;AAEA,OAAO,MAAMc,mBAAmB,GAAGxB,iBAAiB,CAACyB,oBAAoB,CAAC;EACtEC,cAAc,EAAEzB,uBAAuB;EACvC0B,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ import { PageSettingsGroup } from "../abstractions.js";
2
+ declare module "@webiny/app-admin/features/formModel/abstractions.js" {
3
+ interface IFieldRendererRegistry {
4
+ keyValueTags: {
5
+ fieldType: "object";
6
+ settings?: {
7
+ addItemLabel?: string;
8
+ };
9
+ };
10
+ }
11
+ }
12
+ declare class SeoSettingsGroupImpl implements PageSettingsGroup.Interface {
13
+ name: string;
14
+ label: string;
15
+ description: string;
16
+ icon: {
17
+ type: string;
18
+ name: string;
19
+ };
20
+ buildForm(form: PageSettingsGroup.FormBuilder): void;
21
+ mapToForm(doc: PageSettingsGroup.PageDocument): Record<string, any>;
22
+ mapFromForm(formData: Record<string, any>, doc: PageSettingsGroup.PageDocument): void;
23
+ }
24
+ export declare const SeoSettingsGroup: typeof SeoSettingsGroupImpl & {
25
+ __abstraction: import("@webiny/di").Abstraction<import("../abstractions.js").IPageSettingsGroup>;
26
+ };
27
+ export {};
@@ -0,0 +1,52 @@
1
+ import { z } from "zod";
2
+ import { PageSettingsGroup } from "../abstractions.js";
3
+ const PATHNAME_REGEX = new RegExp(`^\\/(?:[a-zA-Z0-9._~:@!$&'()*+,;=%/-])*(?:\\?[a-zA-Z0-9._~:@!$&'()*+,;=?/%#[\\]-]*)?(?:#[a-zA-Z0-9._~:@!$&'()*+,;=?/%#[\\]-]*)?$`);
4
+ class SeoSettingsGroupImpl {
5
+ name = "seo";
6
+ label = "SEO";
7
+ description = "Optimize how this page appears in search engine results.";
8
+ icon = {
9
+ type: "icon",
10
+ name: "fas/search"
11
+ };
12
+ buildForm(form) {
13
+ form.fields(fields => ({
14
+ title: fields.text().label("Title").description("SEO title"),
15
+ description: fields.text().label("Description").description("SEO description").renderer("textarea"),
16
+ metaTags: fields.object().label("Meta Tags").description("Add SEO tags").renderer("keyValueTags").fields(f => ({
17
+ name: f.text().placeholder("Name"),
18
+ content: f.text().placeholder("Content")
19
+ })).list(),
20
+ canonicalUrl: fields.text().label("Canonical URL").description("The canonical URL for this page").schema(z.string().optional().refine(val => !val || PATHNAME_REGEX.test(val), "Enter a valid pathname, e.g.: /path/to/page?query=value")),
21
+ noIndex: fields.boolean().label("No Index").description("Whether this page should be indexed by search engines").defaultValue(false).renderer("switch"),
22
+ noFollow: fields.boolean().label("No Follow").description("Whether search engines should follow links on this page").defaultValue(false).renderer("switch")
23
+ }));
24
+ form.layout(layout => [layout.row("title"), layout.row("description"), layout.row("metaTags"), layout.row("canonicalUrl"), layout.row("noIndex"), layout.row("noFollow")]);
25
+ }
26
+ mapToForm(doc) {
27
+ const seo = doc.properties?.seo ?? {};
28
+ return {
29
+ title: seo.title,
30
+ description: seo.description,
31
+ metaTags: seo.metaTags,
32
+ canonicalUrl: seo.canonicalUrl,
33
+ noIndex: seo.noIndex ?? false,
34
+ noFollow: seo.noFollow ?? false
35
+ };
36
+ }
37
+ mapFromForm(formData, doc) {
38
+ doc.properties.seo = doc.properties.seo ?? {};
39
+ doc.properties.seo.title = formData.title;
40
+ doc.properties.seo.description = formData.description;
41
+ doc.properties.seo.metaTags = formData.metaTags;
42
+ doc.properties.seo.canonicalUrl = formData.canonicalUrl;
43
+ doc.properties.seo.noIndex = formData.noIndex;
44
+ doc.properties.seo.noFollow = formData.noFollow;
45
+ }
46
+ }
47
+ export const SeoSettingsGroup = PageSettingsGroup.createImplementation({
48
+ implementation: SeoSettingsGroupImpl,
49
+ dependencies: []
50
+ });
51
+
52
+ //# sourceMappingURL=SeoSettingsGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["z","PageSettingsGroup","PATHNAME_REGEX","RegExp","SeoSettingsGroupImpl","name","label","description","icon","type","buildForm","form","fields","title","text","renderer","metaTags","object","f","placeholder","content","list","canonicalUrl","schema","string","optional","refine","val","test","noIndex","boolean","defaultValue","noFollow","layout","row","mapToForm","doc","seo","properties","mapFromForm","formData","SeoSettingsGroup","createImplementation","implementation","dependencies"],"sources":["SeoSettingsGroup.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { PageSettingsGroup } from \"../abstractions.js\";\n\ndeclare module \"@webiny/app-admin/features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n keyValueTags: {\n fieldType: \"object\";\n settings?: { addItemLabel?: string };\n };\n }\n}\n\nconst PATHNAME_REGEX = new RegExp(\n `^\\\\/(?:[a-zA-Z0-9._~:@!$&'()*+,;=%/-])*(?:\\\\?[a-zA-Z0-9._~:@!$&'()*+,;=?/%#[\\\\]-]*)?(?:#[a-zA-Z0-9._~:@!$&'()*+,;=?/%#[\\\\]-]*)?$`\n);\n\nclass SeoSettingsGroupImpl implements PageSettingsGroup.Interface {\n name = \"seo\";\n label = \"SEO\";\n description = \"Optimize how this page appears in search engine results.\";\n icon = { type: \"icon\", name: \"fas/search\" };\n\n buildForm(form: PageSettingsGroup.FormBuilder): void {\n form.fields(fields => ({\n title: fields.text().label(\"Title\").description(\"SEO title\"),\n description: fields\n .text()\n .label(\"Description\")\n .description(\"SEO description\")\n .renderer(\"textarea\"),\n metaTags: fields\n .object()\n .label(\"Meta Tags\")\n .description(\"Add SEO tags\")\n .renderer(\"keyValueTags\")\n .fields(f => ({\n name: f.text().placeholder(\"Name\"),\n content: f.text().placeholder(\"Content\")\n }))\n .list(),\n canonicalUrl: fields\n .text()\n .label(\"Canonical URL\")\n .description(\"The canonical URL for this page\")\n .schema(\n z\n .string()\n .optional()\n .refine(\n val => !val || PATHNAME_REGEX.test(val),\n \"Enter a valid pathname, e.g.: /path/to/page?query=value\"\n )\n ),\n noIndex: fields\n .boolean()\n .label(\"No Index\")\n .description(\"Whether this page should be indexed by search engines\")\n .defaultValue(false)\n .renderer(\"switch\"),\n noFollow: fields\n .boolean()\n .label(\"No Follow\")\n .description(\"Whether search engines should follow links on this page\")\n .defaultValue(false)\n .renderer(\"switch\")\n }));\n\n form.layout(layout => [\n layout.row(\"title\"),\n layout.row(\"description\"),\n layout.row(\"metaTags\"),\n layout.row(\"canonicalUrl\"),\n layout.row(\"noIndex\"),\n layout.row(\"noFollow\")\n ]);\n }\n\n mapToForm(doc: PageSettingsGroup.PageDocument): Record<string, any> {\n const seo = doc.properties?.seo ?? {};\n return {\n title: seo.title,\n description: seo.description,\n metaTags: seo.metaTags,\n canonicalUrl: seo.canonicalUrl,\n noIndex: seo.noIndex ?? false,\n noFollow: seo.noFollow ?? false\n };\n }\n\n mapFromForm(formData: Record<string, any>, doc: PageSettingsGroup.PageDocument): void {\n doc.properties.seo = doc.properties.seo ?? {};\n doc.properties.seo.title = formData.title;\n doc.properties.seo.description = formData.description;\n doc.properties.seo.metaTags = formData.metaTags;\n doc.properties.seo.canonicalUrl = formData.canonicalUrl;\n doc.properties.seo.noIndex = formData.noIndex;\n doc.properties.seo.noFollow = formData.noFollow;\n }\n}\n\nexport const SeoSettingsGroup = PageSettingsGroup.createImplementation({\n implementation: SeoSettingsGroupImpl,\n dependencies: []\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ import { PageSettingsGroup } from "../abstractions.js";
2
+ declare class SocialSettingsGroupImpl implements PageSettingsGroup.Interface {
3
+ name: string;
4
+ label: string;
5
+ description: string;
6
+ icon: {
7
+ type: string;
8
+ name: string;
9
+ };
10
+ buildForm(form: PageSettingsGroup.FormBuilder): void;
11
+ mapToForm(doc: PageSettingsGroup.PageDocument): Record<string, any>;
12
+ mapFromForm(formData: Record<string, any>, doc: PageSettingsGroup.PageDocument): void;
13
+ }
14
+ export declare const SocialSettingsGroup: typeof SocialSettingsGroupImpl & {
15
+ __abstraction: import("@webiny/di").Abstraction<import("../abstractions.js").IPageSettingsGroup>;
16
+ };
17
+ export {};