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