@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.
- package/BaseEditor/components/Editor.js +7 -0
- package/BaseEditor/components/Editor.js.map +1 -1
- package/BaseEditor/config/EditorConfig.d.ts +1 -2
- package/BaseEditor/config/EditorConfig.js.map +1 -1
- package/BaseEditor/defaultConfig/Content/Preview/PreviewEvents.js +1 -1
- package/BaseEditor/defaultConfig/Content/Preview/PreviewEvents.js.map +1 -1
- package/Extension.js +3 -0
- package/Extension.js.map +1 -1
- package/ecommerce/components/ResourcesList.js +2 -2
- package/ecommerce/components/ResourcesList.js.map +1 -1
- package/ecommerce/components/ResourcesPicker.js +1 -1
- package/ecommerce/components/ResourcesPicker.js.map +1 -1
- package/editorSdk/createCommand.js +1 -1
- package/editorSdk/createCommand.js.map +1 -1
- package/exports/admin/website-builder/page/editor.d.ts +1 -0
- package/exports/admin/website-builder/page/editor.js +1 -0
- package/exports/admin/website-builder/page/editor.js.map +1 -1
- package/modules/pages/PageEditor/DefaultPageEditorConfig.js +1 -2
- package/modules/pages/PageEditor/DefaultPageEditorConfig.js.map +1 -1
- package/modules/pages/PageEditor/PageEditorConfig.d.ts +180 -198
- package/modules/pages/PageEditor/PageEditorConfig.js +2 -7
- package/modules/pages/PageEditor/PageEditorConfig.js.map +1 -1
- package/modules/pages/PageEditor/PageSettings/PageSettingsPresenter.d.ts +22 -0
- package/modules/pages/PageEditor/PageSettings/PageSettingsPresenter.js +154 -0
- package/modules/pages/PageEditor/PageSettings/PageSettingsPresenter.js.map +1 -0
- package/modules/pages/PageEditor/PageSettings/abstractions.d.ts +54 -0
- package/modules/pages/PageEditor/PageSettings/abstractions.js +12 -0
- package/modules/pages/PageEditor/PageSettings/abstractions.js.map +1 -0
- package/modules/pages/PageEditor/PageSettings/feature.d.ts +3 -0
- package/modules/pages/PageEditor/PageSettings/feature.js +24 -0
- package/modules/pages/PageEditor/PageSettings/feature.js.map +1 -0
- package/modules/pages/PageEditor/PageSettings/groups/GeneralSettingsGroup.d.ts +17 -0
- package/modules/pages/PageEditor/PageSettings/groups/GeneralSettingsGroup.js +42 -0
- package/modules/pages/PageEditor/PageSettings/groups/GeneralSettingsGroup.js.map +1 -0
- package/modules/pages/PageEditor/PageSettings/groups/SchemaSettingsGroup.d.ts +17 -0
- package/modules/pages/PageEditor/PageSettings/groups/SchemaSettingsGroup.js +34 -0
- package/modules/pages/PageEditor/PageSettings/groups/SchemaSettingsGroup.js.map +1 -0
- package/modules/pages/PageEditor/PageSettings/groups/SeoSettingsGroup.d.ts +27 -0
- package/modules/pages/PageEditor/PageSettings/groups/SeoSettingsGroup.js +52 -0
- package/modules/pages/PageEditor/PageSettings/groups/SeoSettingsGroup.js.map +1 -0
- package/modules/pages/PageEditor/PageSettings/groups/SocialSettingsGroup.d.ts +17 -0
- package/modules/pages/PageEditor/PageSettings/groups/SocialSettingsGroup.js +44 -0
- package/modules/pages/PageEditor/PageSettings/groups/SocialSettingsGroup.js.map +1 -0
- package/modules/pages/PageEditor/PageSettings/index.d.ts +3 -0
- package/modules/pages/PageEditor/PageSettings/index.js +5 -0
- package/modules/pages/PageEditor/PageSettings/index.js.map +1 -0
- package/modules/pages/PageEditor/TopBar/PageSettingsDrawer.d.ts +11 -0
- package/modules/pages/PageEditor/TopBar/PageSettingsDrawer.js +35 -0
- package/modules/pages/PageEditor/TopBar/PageSettingsDrawer.js.map +1 -0
- package/modules/pages/PageEditor/TopBar/SettingsButton.d.ts +0 -6
- package/modules/pages/PageEditor/TopBar/SettingsButton.js +29 -26
- package/modules/pages/PageEditor/TopBar/SettingsButton.js.map +1 -1
- package/modules/pages/PageEditor/usePageEditorConfig.d.ts +4 -20
- package/modules/pages/PageEditor/usePageEditorConfig.js +1 -8
- package/modules/pages/PageEditor/usePageEditorConfig.js.map +1 -1
- package/package.json +31 -28
- package/presentation/navigation/Extension.js +5 -6
- package/presentation/navigation/Extension.js.map +1 -1
- package/presentation/pages/CreatePage/AddLanguageModifier.js +5 -5
- package/presentation/pages/CreatePage/AddLanguageModifier.js.map +1 -1
- package/presentation/pages/CreatePage/CreatePage.test.js +9 -13
- package/presentation/pages/CreatePage/CreatePage.test.js.map +1 -1
- package/presentation/pages/CreatePage/CreatePagePresenter.js +1 -1
- package/presentation/pages/CreatePage/CreatePagePresenter.js.map +1 -1
- package/shared/PagePath.js +1 -1
- package/shared/PagePath.js.map +1 -1
- package/shared/pagePathFromTitle.js +1 -1
- package/shared/pagePathFromTitle.js.map +1 -1
- package/modules/pages/PageEditor/PageSettings/PageSettings.d.ts +0 -30
- package/modules/pages/PageEditor/PageSettings/PageSettings.js +0 -84
- package/modules/pages/PageEditor/PageSettings/PageSettings.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/PageSettingsConfig.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/PageSettingsConfig.js +0 -98
- package/modules/pages/PageEditor/PageSettings/PageSettingsConfig.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/GeneralImage.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/GeneralImage.js +0 -31
- package/modules/pages/PageEditor/PageSettings/elements/GeneralImage.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/GeneralPath.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/GeneralPath.js +0 -16
- package/modules/pages/PageEditor/PageSettings/elements/GeneralPath.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/GeneralSnippet.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/GeneralSnippet.js +0 -14
- package/modules/pages/PageEditor/PageSettings/elements/GeneralSnippet.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/GeneralTags.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/GeneralTags.js +0 -14
- package/modules/pages/PageEditor/PageSettings/elements/GeneralTags.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/GeneralTitle.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/GeneralTitle.js +0 -16
- package/modules/pages/PageEditor/PageSettings/elements/GeneralTitle.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/SchemaEditor.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/SchemaEditor.js +0 -31
- package/modules/pages/PageEditor/PageSettings/elements/SchemaEditor.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/SeoCanonicalUrl.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/SeoCanonicalUrl.js +0 -26
- package/modules/pages/PageEditor/PageSettings/elements/SeoCanonicalUrl.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/SeoDescription.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/SeoDescription.js +0 -15
- package/modules/pages/PageEditor/PageSettings/elements/SeoDescription.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/SeoMetaTags.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/SeoMetaTags.js +0 -18
- package/modules/pages/PageEditor/PageSettings/elements/SeoMetaTags.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/SeoNoFollow.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/SeoNoFollow.js +0 -16
- package/modules/pages/PageEditor/PageSettings/elements/SeoNoFollow.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/SeoNoIndex.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/SeoNoIndex.js +0 -16
- package/modules/pages/PageEditor/PageSettings/elements/SeoNoIndex.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/SeoTitle.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/SeoTitle.js +0 -15
- package/modules/pages/PageEditor/PageSettings/elements/SeoTitle.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/SocialDescription.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/SocialDescription.js +0 -15
- package/modules/pages/PageEditor/PageSettings/elements/SocialDescription.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/SocialImage.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/SocialImage.js +0 -31
- package/modules/pages/PageEditor/PageSettings/elements/SocialImage.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/SocialMetaTags.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/SocialMetaTags.js +0 -18
- package/modules/pages/PageEditor/PageSettings/elements/SocialMetaTags.js.map +0 -1
- package/modules/pages/PageEditor/PageSettings/elements/SocialTitle.d.ts +0 -2
- package/modules/pages/PageEditor/PageSettings/elements/SocialTitle.js +0 -15
- package/modules/pages/PageEditor/PageSettings/elements/SocialTitle.js.map +0 -1
- package/modules/pages/PageEditor/TopBar/Settings/KeyValueGridEditor.d.ts +0 -2
- package/modules/pages/PageEditor/TopBar/Settings/KeyValueGridEditor.js +0 -59
- package/modules/pages/PageEditor/TopBar/Settings/KeyValueGridEditor.js.map +0 -1
- package/modules/pages/PageEditor/TopBar/Settings/MetaTags.d.ts +0 -11
- package/modules/pages/PageEditor/TopBar/Settings/MetaTags.js +0 -80
- package/modules/pages/PageEditor/TopBar/Settings/MetaTags.js.map +0 -1
- package/modules/pages/PageEditor/TopBar/Settings/PageSettingsDialog.d.ts +0 -2
- package/modules/pages/PageEditor/TopBar/Settings/PageSettingsDialog.js +0 -37
- package/modules/pages/PageEditor/TopBar/Settings/PageSettingsDialog.js.map +0 -1
- package/modules/pages/PageEditor/TopBar/Settings/PageSettingsDrawer.d.ts +0 -3
- package/modules/pages/PageEditor/TopBar/Settings/PageSettingsDrawer.js +0 -73
- package/modules/pages/PageEditor/TopBar/Settings/PageSettingsDrawer.js.map +0 -1
- package/modules/pages/PageEditor/TopBar/Settings/SettingsDialogBody.d.ts +0 -6
- package/modules/pages/PageEditor/TopBar/Settings/SettingsDialogBody.js +0 -21
- package/modules/pages/PageEditor/TopBar/Settings/SettingsDialogBody.js.map +0 -1
- package/modules/pages/PageEditor/TopBar/Settings/SimpleTags.d.ts +0 -7
- package/modules/pages/PageEditor/TopBar/Settings/SimpleTags.js +0 -75
- 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","
|
|
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,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 {};
|