@webiny/app-website-builder 6.5.0-beta.5 → 6.5.0-beta.7
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/defaultConfig/Content/Preview/PreviewContainer.js +1 -1
- package/BaseEditor/defaultConfig/Content/Preview/PreviewContainer.js.map +1 -1
- package/BaseEditor/defaultConfig/ElementInputRenderers.js +12 -0
- package/BaseEditor/defaultConfig/ElementInputRenderers.js.map +1 -1
- package/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.d.ts +22 -0
- package/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.js +17 -0
- package/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.js.map +1 -0
- package/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.test.d.ts +1 -0
- package/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.test.js +64 -0
- package/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.test.js.map +1 -0
- package/BaseEditor/defaultConfig/Sidebar/ElementSettings/useInputValue.js +7 -2
- package/BaseEditor/defaultConfig/Sidebar/ElementSettings/useInputValue.js.map +1 -1
- package/inputRenderers/DateTimeInput.d.ts +9 -0
- package/inputRenderers/DateTimeInput.js +21 -0
- package/inputRenderers/DateTimeInput.js.map +1 -0
- package/inputRenderers/DateTimeInput.test.d.ts +1 -0
- package/inputRenderers/DateTimeInput.test.js +27 -0
- package/inputRenderers/DateTimeInput.test.js.map +1 -0
- package/inputRenderers/RadioInput.d.ts +3 -0
- package/inputRenderers/RadioInput.js +20 -0
- package/inputRenderers/RadioInput.js.map +1 -0
- package/inputRenderers/TagsInput.d.ts +3 -0
- package/inputRenderers/TagsInput.js +22 -0
- package/inputRenderers/TagsInput.js.map +1 -0
- package/package.json +23 -23
|
@@ -11,7 +11,7 @@ const PreviewContainer = ({ children })=>{
|
|
|
11
11
|
style: {
|
|
12
12
|
height: `calc(100vh - ${uiHeight}px)`
|
|
13
13
|
},
|
|
14
|
-
className: "bg-neutral-subtle relative flex flex-col items-center w-full overflow-auto p-[24px]"
|
|
14
|
+
className: "fill-grid bg-neutral-subtle relative flex flex-col items-center w-full overflow-auto p-[24px]"
|
|
15
15
|
}, children), isDragging && /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement("div", {
|
|
16
16
|
className: "absolute z-50 pointer-events-none animate-fade-in top-0 left-0 right-0 h-2 bg-[#f9d8ce]"
|
|
17
17
|
}), /*#__PURE__*/ react.createElement("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseEditor/defaultConfig/Content/Preview/PreviewContainer.js","sources":["../../../../../src/BaseEditor/defaultConfig/Content/Preview/PreviewContainer.tsx"],"sourcesContent":["import React from \"react\";\nimport { useSelectFromEditor } from \"~/BaseEditor/hooks/useSelectFromEditor.js\";\nimport { useIsDragging } from \"./useIsDragging.js\";\n\ninterface PreviewContainerProps {\n children: React.ReactNode;\n}\n\nexport const PreviewContainer = ({ children }: PreviewContainerProps) => {\n const uiHeight = useSelectFromEditor(state => state.uiReservedSpace.height);\n const isDragging = useIsDragging();\n\n return (\n <>\n <div className={\"relative\"}>\n <div\n id={\"preview-container\"}\n style={{ height: `calc(100vh - ${uiHeight}px)` }}\n className={\n \"bg-neutral-subtle relative flex flex-col items-center w-full overflow-auto p-[24px]\"\n }\n >\n {children}\n </div>\n {isDragging && (\n <>\n <div\n className={\n \"absolute z-50 pointer-events-none animate-fade-in top-0 left-0 right-0 h-2 bg-[#f9d8ce]\"\n }\n />\n <div\n className={\n \"absolute z-50 pointer-events-none animate-fade-in bottom-0 left-0 right-0 h-2 bg-[#f9d8ce]\"\n }\n />\n <div\n className={\n \"absolute z-50 pointer-events-none animate-fade-in top-0 left-0 bottom-0 w-2 bg-[#f9d8ce]\"\n }\n />\n <div\n className={\n \"absolute z-50 pointer-events-none animate-fade-in top-0 right-0 bottom-0 w-2 bg-[#f9d8ce]\"\n }\n />\n </>\n )}\n </div>\n </>\n );\n};\n"],"names":["PreviewContainer","children","uiHeight","useSelectFromEditor","state","isDragging","useIsDragging"],"mappings":";;;AAQO,MAAMA,mBAAmB,CAAC,EAAEC,QAAQ,EAAyB;IAChE,MAAMC,WAAWC,oBAAoBC,CAAAA,QAASA,MAAM,eAAe,CAAC,MAAM;IAC1E,MAAMC,aAAaC;IAEnB,OAAO,WAAP,GACI,wDACI,oBAAC;QAAI,WAAW;qBACZ,oBAAC;QACG,IAAI;QACJ,OAAO;YAAE,QAAQ,CAAC,aAAa,EAAEJ,SAAS,GAAG,CAAC;QAAC;QAC/C,WACI;OAGHD,WAEJI,cAAc,WAAdA,GACG,wDACI,oBAAC;QACG,WACI;sBAGR,oBAAC;QACG,WACI;sBAGR,oBAAC;QACG,WACI;sBAGR,oBAAC;QACG,WACI;;AAQhC"}
|
|
1
|
+
{"version":3,"file":"BaseEditor/defaultConfig/Content/Preview/PreviewContainer.js","sources":["../../../../../src/BaseEditor/defaultConfig/Content/Preview/PreviewContainer.tsx"],"sourcesContent":["import React from \"react\";\nimport { useSelectFromEditor } from \"~/BaseEditor/hooks/useSelectFromEditor.js\";\nimport { useIsDragging } from \"./useIsDragging.js\";\n\ninterface PreviewContainerProps {\n children: React.ReactNode;\n}\n\nexport const PreviewContainer = ({ children }: PreviewContainerProps) => {\n const uiHeight = useSelectFromEditor(state => state.uiReservedSpace.height);\n const isDragging = useIsDragging();\n\n return (\n <>\n <div className={\"relative\"}>\n <div\n id={\"preview-container\"}\n style={{ height: `calc(100vh - ${uiHeight}px)` }}\n className={\n \"fill-grid bg-neutral-subtle relative flex flex-col items-center w-full overflow-auto p-[24px]\"\n }\n >\n {children}\n </div>\n {isDragging && (\n <>\n <div\n className={\n \"absolute z-50 pointer-events-none animate-fade-in top-0 left-0 right-0 h-2 bg-[#f9d8ce]\"\n }\n />\n <div\n className={\n \"absolute z-50 pointer-events-none animate-fade-in bottom-0 left-0 right-0 h-2 bg-[#f9d8ce]\"\n }\n />\n <div\n className={\n \"absolute z-50 pointer-events-none animate-fade-in top-0 left-0 bottom-0 w-2 bg-[#f9d8ce]\"\n }\n />\n <div\n className={\n \"absolute z-50 pointer-events-none animate-fade-in top-0 right-0 bottom-0 w-2 bg-[#f9d8ce]\"\n }\n />\n </>\n )}\n </div>\n </>\n );\n};\n"],"names":["PreviewContainer","children","uiHeight","useSelectFromEditor","state","isDragging","useIsDragging"],"mappings":";;;AAQO,MAAMA,mBAAmB,CAAC,EAAEC,QAAQ,EAAyB;IAChE,MAAMC,WAAWC,oBAAoBC,CAAAA,QAASA,MAAM,eAAe,CAAC,MAAM;IAC1E,MAAMC,aAAaC;IAEnB,OAAO,WAAP,GACI,wDACI,oBAAC;QAAI,WAAW;qBACZ,oBAAC;QACG,IAAI;QACJ,OAAO;YAAE,QAAQ,CAAC,aAAa,EAAEJ,SAAS,GAAG,CAAC;QAAC;QAC/C,WACI;OAGHD,WAEJI,cAAc,WAAdA,GACG,wDACI,oBAAC;QACG,WACI;sBAGR,oBAAC;QACG,WACI;sBAGR,oBAAC;QACG,WACI;sBAGR,oBAAC;QACG,WACI;;AAQhC"}
|
|
@@ -4,6 +4,9 @@ import { TextInputRenderer } from "../../inputRenderers/TextInput.js";
|
|
|
4
4
|
import { NumberInputRenderer } from "../../inputRenderers/NumberInput.js";
|
|
5
5
|
import { BooleanInputRenderer } from "../../inputRenderers/BooleanInput.js";
|
|
6
6
|
import { TextareaInputRenderer } from "../../inputRenderers/TextareaInput.js";
|
|
7
|
+
import { TagsInputRenderer } from "../../inputRenderers/TagsInput.js";
|
|
8
|
+
import { DateTimeInputRenderer } from "../../inputRenderers/DateTimeInput.js";
|
|
9
|
+
import { RadioInputRenderer } from "../../inputRenderers/RadioInput.js";
|
|
7
10
|
import { LexicalInputRenderer } from "../../inputRenderers/LexicalInput/LexicalInput.js";
|
|
8
11
|
import { DefaultLexicalConfig } from "../../inputRenderers/LexicalInput/DefaultLexicalConfig.js";
|
|
9
12
|
import { SlotInputRenderer } from "../../inputRenderers/SlotInput.js";
|
|
@@ -22,9 +25,18 @@ const ElementInputRenderers = ()=>/*#__PURE__*/ react.createElement(react.Fragme
|
|
|
22
25
|
}), /*#__PURE__*/ react.createElement(EditorConfig.ElementInput.Renderer, {
|
|
23
26
|
name: "Webiny/Select",
|
|
24
27
|
component: SelectInputRenderer
|
|
28
|
+
}), /*#__PURE__*/ react.createElement(EditorConfig.ElementInput.Renderer, {
|
|
29
|
+
name: "Webiny/RadioGroup",
|
|
30
|
+
component: RadioInputRenderer
|
|
25
31
|
}), /*#__PURE__*/ react.createElement(EditorConfig.ElementInput.Renderer, {
|
|
26
32
|
name: "Webiny/Textarea",
|
|
27
33
|
component: TextareaInputRenderer
|
|
34
|
+
}), /*#__PURE__*/ react.createElement(EditorConfig.ElementInput.Renderer, {
|
|
35
|
+
name: "Webiny/Tags",
|
|
36
|
+
component: TagsInputRenderer
|
|
37
|
+
}), /*#__PURE__*/ react.createElement(EditorConfig.ElementInput.Renderer, {
|
|
38
|
+
name: "Webiny/DateTime",
|
|
39
|
+
component: DateTimeInputRenderer
|
|
28
40
|
}), /*#__PURE__*/ react.createElement(EditorConfig.ElementInput.Renderer, {
|
|
29
41
|
name: "Webiny/Number",
|
|
30
42
|
component: NumberInputRenderer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseEditor/defaultConfig/ElementInputRenderers.js","sources":["../../../src/BaseEditor/defaultConfig/ElementInputRenderers.tsx"],"sourcesContent":["import React from \"react\";\nimport { EditorConfig } from \"~/BaseEditor/index.js\";\nimport { TextInputRenderer } from \"~/inputRenderers/TextInput.js\";\nimport { NumberInputRenderer } from \"~/inputRenderers/NumberInput.js\";\nimport { BooleanInputRenderer } from \"~/inputRenderers/BooleanInput.js\";\nimport { TextareaInputRenderer } from \"~/inputRenderers/TextareaInput.js\";\nimport { LexicalInputRenderer } from \"~/inputRenderers/LexicalInput/LexicalInput.js\";\nimport { DefaultLexicalConfig } from \"~/inputRenderers/LexicalInput/DefaultLexicalConfig.js\";\nimport { SlotInputRenderer } from \"~/inputRenderers/SlotInput.js\";\nimport { GridLayoutInputRenderer } from \"~/inputRenderers/GridLayoutInput.js\";\nimport { SelectInputRenderer } from \"~/inputRenderers/SelectInput.js\";\nimport { FileInputRenderer } from \"~/inputRenderers/FileInput.js\";\nimport { FragmentSelectorInputRenderer } from \"~/inputRenderers/FragmentSelectorInput.js\";\nimport { ObjectInputRenderer } from \"~/inputRenderers/ObjectInput/ObjectInputRenderer.js\";\nimport { ContentEntryInputRenderer } from \"~/inputRenderers/ContentEntryInput.js\";\n\nexport const ElementInputRenderers = () => {\n return (\n <>\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Slot\"}\n component={SlotInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Input\"}\n component={TextInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Select\"}\n component={SelectInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Textarea\"}\n component={TextareaInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Number\"}\n component={NumberInputRenderer}\n />\n {/* Configure Lexical Editor*/}\n <DefaultLexicalConfig />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Lexical\"}\n component={LexicalInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Switch\"}\n component={BooleanInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/GridLayout\"}\n component={GridLayoutInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/FileManager\"}\n component={FileInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/FragmentSelector\"}\n component={FragmentSelectorInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Object\"}\n component={ObjectInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/ContentEntry\"}\n component={ContentEntryInputRenderer}\n />\n </>\n );\n};\n"],"names":["ElementInputRenderers","EditorConfig","SlotInputRenderer","TextInputRenderer","SelectInputRenderer","TextareaInputRenderer","NumberInputRenderer","DefaultLexicalConfig","LexicalInputRenderer","BooleanInputRenderer","GridLayoutInputRenderer","FileInputRenderer","FragmentSelectorInputRenderer","ObjectInputRenderer","ContentEntryInputRenderer"],"mappings":"
|
|
1
|
+
{"version":3,"file":"BaseEditor/defaultConfig/ElementInputRenderers.js","sources":["../../../src/BaseEditor/defaultConfig/ElementInputRenderers.tsx"],"sourcesContent":["import React from \"react\";\nimport { EditorConfig } from \"~/BaseEditor/index.js\";\nimport { TextInputRenderer } from \"~/inputRenderers/TextInput.js\";\nimport { NumberInputRenderer } from \"~/inputRenderers/NumberInput.js\";\nimport { BooleanInputRenderer } from \"~/inputRenderers/BooleanInput.js\";\nimport { TextareaInputRenderer } from \"~/inputRenderers/TextareaInput.js\";\nimport { TagsInputRenderer } from \"~/inputRenderers/TagsInput.js\";\nimport { DateTimeInputRenderer } from \"~/inputRenderers/DateTimeInput.js\";\nimport { RadioInputRenderer } from \"~/inputRenderers/RadioInput.js\";\nimport { LexicalInputRenderer } from \"~/inputRenderers/LexicalInput/LexicalInput.js\";\nimport { DefaultLexicalConfig } from \"~/inputRenderers/LexicalInput/DefaultLexicalConfig.js\";\nimport { SlotInputRenderer } from \"~/inputRenderers/SlotInput.js\";\nimport { GridLayoutInputRenderer } from \"~/inputRenderers/GridLayoutInput.js\";\nimport { SelectInputRenderer } from \"~/inputRenderers/SelectInput.js\";\nimport { FileInputRenderer } from \"~/inputRenderers/FileInput.js\";\nimport { FragmentSelectorInputRenderer } from \"~/inputRenderers/FragmentSelectorInput.js\";\nimport { ObjectInputRenderer } from \"~/inputRenderers/ObjectInput/ObjectInputRenderer.js\";\nimport { ContentEntryInputRenderer } from \"~/inputRenderers/ContentEntryInput.js\";\n\nexport const ElementInputRenderers = () => {\n return (\n <>\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Slot\"}\n component={SlotInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Input\"}\n component={TextInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Select\"}\n component={SelectInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/RadioGroup\"}\n component={RadioInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Textarea\"}\n component={TextareaInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Tags\"}\n component={TagsInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/DateTime\"}\n component={DateTimeInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Number\"}\n component={NumberInputRenderer}\n />\n {/* Configure Lexical Editor*/}\n <DefaultLexicalConfig />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Lexical\"}\n component={LexicalInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Switch\"}\n component={BooleanInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/GridLayout\"}\n component={GridLayoutInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/FileManager\"}\n component={FileInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/FragmentSelector\"}\n component={FragmentSelectorInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/Object\"}\n component={ObjectInputRenderer}\n />\n <EditorConfig.ElementInput.Renderer\n name={\"Webiny/ContentEntry\"}\n component={ContentEntryInputRenderer}\n />\n </>\n );\n};\n"],"names":["ElementInputRenderers","EditorConfig","SlotInputRenderer","TextInputRenderer","SelectInputRenderer","RadioInputRenderer","TextareaInputRenderer","TagsInputRenderer","DateTimeInputRenderer","NumberInputRenderer","DefaultLexicalConfig","LexicalInputRenderer","BooleanInputRenderer","GridLayoutInputRenderer","FileInputRenderer","FragmentSelectorInputRenderer","ObjectInputRenderer","ContentEntryInputRenderer"],"mappings":";;;;;;;;;;;;;;;;;;AAmBO,MAAMA,wBAAwB,IAC1B,WAAP,GACI,wDACI,oBAACC,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWC;sBAEf,oBAACD,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWE;sBAEf,oBAACF,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWG;sBAEf,oBAACH,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWI;sBAEf,oBAACJ,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWK;sBAEf,oBAACL,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWM;sBAEf,oBAACN,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWO;sBAEf,oBAACP,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWQ;sBAGf,oBAACC,sBAAoBA,OAAAA,WAAAA,GACrB,oBAACT,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWU;sBAEf,oBAACV,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWW;sBAEf,oBAACX,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWY;sBAEf,oBAACZ,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWa;sBAEf,oBAACb,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWc;sBAEf,oBAACd,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWe;sBAEf,oBAACf,aAAa,YAAY,CAAC,QAAQ;QAC/B,MAAM;QACN,WAAWgB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DocumentElementBindings, JsonPatchOperation } from "@webiny/website-builder-sdk";
|
|
2
|
+
interface IBindingsUpdate {
|
|
3
|
+
createJsonPatch(bindings: DocumentElementBindings): JsonPatchOperation[];
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Tracks what the preview currently shows for one element, so preview patches can be computed
|
|
7
|
+
* against it.
|
|
8
|
+
*
|
|
9
|
+
* The preview applies each patch on top of its own copy of the element's bindings. Computing a patch
|
|
10
|
+
* against the committed bindings instead goes wrong as soon as one preview patch has been applied:
|
|
11
|
+
* going back to the committed value (OS undo, or deleting what was just typed) diffs to an empty
|
|
12
|
+
* patch, and the preview keeps showing the last previewed value.
|
|
13
|
+
*
|
|
14
|
+
* The tracked copy is tied to the committed bindings it started from. Once those change, the editor
|
|
15
|
+
* has sent the preview the committed state, so tracking starts over from it.
|
|
16
|
+
*/
|
|
17
|
+
export declare class PreviewedBindings {
|
|
18
|
+
private source;
|
|
19
|
+
private bindings;
|
|
20
|
+
createPatch(update: IBindingsUpdate, committed: DocumentElementBindings): JsonPatchOperation[];
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsonPatch } from "@webiny/website-builder-sdk";
|
|
2
|
+
class PreviewedBindings {
|
|
3
|
+
createPatch(update, committed) {
|
|
4
|
+
const base = this.source === committed && this.bindings ? this.bindings : committed;
|
|
5
|
+
const patch = update.createJsonPatch(base);
|
|
6
|
+
this.source = committed;
|
|
7
|
+
this.bindings = jsonPatch.applyPatch(structuredClone(base), patch, false, true).newDocument;
|
|
8
|
+
return patch;
|
|
9
|
+
}
|
|
10
|
+
constructor(){
|
|
11
|
+
this.source = null;
|
|
12
|
+
this.bindings = null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export { PreviewedBindings };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=PreviewedBindings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.js","sources":["../../../../../src/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.ts"],"sourcesContent":["import { jsonPatch } from \"@webiny/website-builder-sdk\";\nimport type { DocumentElementBindings, JsonPatchOperation } from \"@webiny/website-builder-sdk\";\n\ninterface IBindingsUpdate {\n createJsonPatch(bindings: DocumentElementBindings): JsonPatchOperation[];\n}\n\n/**\n * Tracks what the preview currently shows for one element, so preview patches can be computed\n * against it.\n *\n * The preview applies each patch on top of its own copy of the element's bindings. Computing a patch\n * against the committed bindings instead goes wrong as soon as one preview patch has been applied:\n * going back to the committed value (OS undo, or deleting what was just typed) diffs to an empty\n * patch, and the preview keeps showing the last previewed value.\n *\n * The tracked copy is tied to the committed bindings it started from. Once those change, the editor\n * has sent the preview the committed state, so tracking starts over from it.\n */\nexport class PreviewedBindings {\n private source: DocumentElementBindings | null = null;\n private bindings: DocumentElementBindings | null = null;\n\n createPatch(update: IBindingsUpdate, committed: DocumentElementBindings): JsonPatchOperation[] {\n const base = this.source === committed && this.bindings ? this.bindings : committed;\n const patch = update.createJsonPatch(base);\n\n this.source = committed;\n this.bindings = jsonPatch.applyPatch(structuredClone(base), patch, false, true).newDocument;\n\n return patch;\n }\n}\n"],"names":["PreviewedBindings","update","committed","base","patch","jsonPatch","structuredClone"],"mappings":";AAmBO,MAAMA;IAIT,YAAYC,MAAuB,EAAEC,SAAkC,EAAwB;QAC3F,MAAMC,OAAO,IAAI,CAAC,MAAM,KAAKD,aAAa,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAGA;QAC1E,MAAME,QAAQH,OAAO,eAAe,CAACE;QAErC,IAAI,CAAC,MAAM,GAAGD;QACd,IAAI,CAAC,QAAQ,GAAGG,UAAU,UAAU,CAACC,gBAAgBH,OAAOC,OAAO,OAAO,MAAM,WAAW;QAE3F,OAAOA;IACX;;aAXQ,MAAM,GAAmC;aACzC,QAAQ,GAAmC;;AAWvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { jsonPatch } from "@webiny/website-builder-sdk";
|
|
3
|
+
import { PreviewedBindings } from "./PreviewedBindings.js";
|
|
4
|
+
const bindingsWithTitle = (title)=>({
|
|
5
|
+
inputs: {
|
|
6
|
+
title: {
|
|
7
|
+
id: "title",
|
|
8
|
+
type: "text",
|
|
9
|
+
static: title
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
const updateTo = (target)=>({
|
|
14
|
+
createJsonPatch: (bindings)=>jsonPatch.compare(bindings, target)
|
|
15
|
+
});
|
|
16
|
+
class FakePreview {
|
|
17
|
+
constructor(committed){
|
|
18
|
+
this.bindings = structuredClone(committed);
|
|
19
|
+
}
|
|
20
|
+
apply(patch) {
|
|
21
|
+
jsonPatch.applyPatch(this.bindings, patch, false, true);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
describe("PreviewedBindings", ()=>{
|
|
25
|
+
it("brings the preview back when the value returns to the committed one (undo)", ()=>{
|
|
26
|
+
const committed = bindingsWithTitle("abc");
|
|
27
|
+
const preview = new FakePreview(committed);
|
|
28
|
+
const previewed = new PreviewedBindings();
|
|
29
|
+
preview.apply(previewed.createPatch(updateTo(bindingsWithTitle("abcd")), committed));
|
|
30
|
+
expect(preview.bindings).toEqual(bindingsWithTitle("abcd"));
|
|
31
|
+
const patch = previewed.createPatch(updateTo(bindingsWithTitle("abc")), committed);
|
|
32
|
+
expect(patch).not.toEqual([]);
|
|
33
|
+
preview.apply(patch);
|
|
34
|
+
expect(preview.bindings).toEqual(bindingsWithTitle("abc"));
|
|
35
|
+
});
|
|
36
|
+
it("follows a run of edits", ()=>{
|
|
37
|
+
const committed = bindingsWithTitle("");
|
|
38
|
+
const preview = new FakePreview(committed);
|
|
39
|
+
const previewed = new PreviewedBindings();
|
|
40
|
+
for (const value of [
|
|
41
|
+
"a",
|
|
42
|
+
"ab",
|
|
43
|
+
"abc",
|
|
44
|
+
"ab",
|
|
45
|
+
"a",
|
|
46
|
+
""
|
|
47
|
+
]){
|
|
48
|
+
preview.apply(previewed.createPatch(updateTo(bindingsWithTitle(value)), committed));
|
|
49
|
+
expect(preview.bindings).toEqual(bindingsWithTitle(value));
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
it("starts over from the committed bindings once they change", ()=>{
|
|
53
|
+
const previewed = new PreviewedBindings();
|
|
54
|
+
const first = bindingsWithTitle("abc");
|
|
55
|
+
previewed.createPatch(updateTo(bindingsWithTitle("abcd")), first);
|
|
56
|
+
const second = bindingsWithTitle("xyz");
|
|
57
|
+
const preview = new FakePreview(second);
|
|
58
|
+
const patch = previewed.createPatch(updateTo(bindingsWithTitle("xyz!")), second);
|
|
59
|
+
preview.apply(patch);
|
|
60
|
+
expect(preview.bindings).toEqual(bindingsWithTitle("xyz!"));
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=PreviewedBindings.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.test.js","sources":["../../../../../src/BaseEditor/defaultConfig/Sidebar/ElementSettings/PreviewedBindings.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { jsonPatch } from \"@webiny/website-builder-sdk\";\nimport type { DocumentElementBindings } from \"@webiny/website-builder-sdk\";\nimport { PreviewedBindings } from \"./PreviewedBindings.js\";\n\nconst bindingsWithTitle = (title: string): DocumentElementBindings => ({\n inputs: { title: { id: \"title\", type: \"text\", static: title } }\n});\n\n// Stands in for InputsUpdater: the patch that turns `bindings` into the updated bindings.\nconst updateTo = (target: DocumentElementBindings) => ({\n createJsonPatch: (bindings: DocumentElementBindings) => jsonPatch.compare(bindings, target)\n});\n\n/**\n * The preview side: like EditingElementRenderer, it applies every patch on top of its own copy.\n */\nclass FakePreview {\n public bindings: DocumentElementBindings;\n\n constructor(committed: DocumentElementBindings) {\n this.bindings = structuredClone(committed);\n }\n\n apply(patch: any[]) {\n jsonPatch.applyPatch(this.bindings, patch, false, true);\n }\n}\n\ndescribe(\"PreviewedBindings\", () => {\n it(\"brings the preview back when the value returns to the committed one (undo)\", () => {\n const committed = bindingsWithTitle(\"abc\");\n const preview = new FakePreview(committed);\n const previewed = new PreviewedBindings();\n\n // Type \"d\".\n preview.apply(previewed.createPatch(updateTo(bindingsWithTitle(\"abcd\")), committed));\n expect(preview.bindings).toEqual(bindingsWithTitle(\"abcd\"));\n\n // Undo back to the committed \"abc\". Diffed against the committed bindings this patch was\n // empty, and the preview stayed on \"abcd\".\n const patch = previewed.createPatch(updateTo(bindingsWithTitle(\"abc\")), committed);\n expect(patch).not.toEqual([]);\n preview.apply(patch);\n expect(preview.bindings).toEqual(bindingsWithTitle(\"abc\"));\n });\n\n it(\"follows a run of edits\", () => {\n const committed = bindingsWithTitle(\"\");\n const preview = new FakePreview(committed);\n const previewed = new PreviewedBindings();\n\n for (const value of [\"a\", \"ab\", \"abc\", \"ab\", \"a\", \"\"]) {\n preview.apply(previewed.createPatch(updateTo(bindingsWithTitle(value)), committed));\n expect(preview.bindings).toEqual(bindingsWithTitle(value));\n }\n });\n\n it(\"starts over from the committed bindings once they change\", () => {\n const previewed = new PreviewedBindings();\n\n const first = bindingsWithTitle(\"abc\");\n previewed.createPatch(updateTo(bindingsWithTitle(\"abcd\")), first);\n\n // A commit (here of \"xyz\") reaches the preview as a document update, not through us.\n const second = bindingsWithTitle(\"xyz\");\n const preview = new FakePreview(second);\n\n const patch = previewed.createPatch(updateTo(bindingsWithTitle(\"xyz!\")), second);\n preview.apply(patch);\n expect(preview.bindings).toEqual(bindingsWithTitle(\"xyz!\"));\n });\n});\n"],"names":["bindingsWithTitle","title","updateTo","target","bindings","jsonPatch","FakePreview","committed","structuredClone","patch","describe","it","preview","previewed","PreviewedBindings","expect","value","first","second"],"mappings":";;;AAKA,MAAMA,oBAAoB,CAACC,QAA4C;QACnE,QAAQ;YAAE,OAAO;gBAAE,IAAI;gBAAS,MAAM;gBAAQ,QAAQA;YAAM;QAAE;IAClE;AAGA,MAAMC,WAAW,CAACC,SAAqC;QACnD,iBAAiB,CAACC,WAAsCC,UAAU,OAAO,CAACD,UAAUD;IACxF;AAKA,MAAMG;IAGF,YAAYC,SAAkC,CAAE;QAC5C,IAAI,CAAC,QAAQ,GAAGC,gBAAgBD;IACpC;IAEA,MAAME,KAAY,EAAE;QAChBJ,UAAU,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAEI,OAAO,OAAO;IACtD;AACJ;AAEAC,SAAS,qBAAqB;IAC1BC,GAAG,8EAA8E;QAC7E,MAAMJ,YAAYP,kBAAkB;QACpC,MAAMY,UAAU,IAAIN,YAAYC;QAChC,MAAMM,YAAY,IAAIC;QAGtBF,QAAQ,KAAK,CAACC,UAAU,WAAW,CAACX,SAASF,kBAAkB,UAAUO;QACzEQ,OAAOH,QAAQ,QAAQ,EAAE,OAAO,CAACZ,kBAAkB;QAInD,MAAMS,QAAQI,UAAU,WAAW,CAACX,SAASF,kBAAkB,SAASO;QACxEQ,OAAON,OAAO,GAAG,CAAC,OAAO,CAAC,EAAE;QAC5BG,QAAQ,KAAK,CAACH;QACdM,OAAOH,QAAQ,QAAQ,EAAE,OAAO,CAACZ,kBAAkB;IACvD;IAEAW,GAAG,0BAA0B;QACzB,MAAMJ,YAAYP,kBAAkB;QACpC,MAAMY,UAAU,IAAIN,YAAYC;QAChC,MAAMM,YAAY,IAAIC;QAEtB,KAAK,MAAME,SAAS;YAAC;YAAK;YAAM;YAAO;YAAM;YAAK;SAAG,CAAE;YACnDJ,QAAQ,KAAK,CAACC,UAAU,WAAW,CAACX,SAASF,kBAAkBgB,SAAST;YACxEQ,OAAOH,QAAQ,QAAQ,EAAE,OAAO,CAACZ,kBAAkBgB;QACvD;IACJ;IAEAL,GAAG,4DAA4D;QAC3D,MAAME,YAAY,IAAIC;QAEtB,MAAMG,QAAQjB,kBAAkB;QAChCa,UAAU,WAAW,CAACX,SAASF,kBAAkB,UAAUiB;QAG3D,MAAMC,SAASlB,kBAAkB;QACjC,MAAMY,UAAU,IAAIN,YAAYY;QAEhC,MAAMT,QAAQI,UAAU,WAAW,CAACX,SAASF,kBAAkB,UAAUkB;QACzEN,QAAQ,KAAK,CAACH;QACdM,OAAOH,QAAQ,QAAQ,EAAE,OAAO,CAACZ,kBAAkB;IACvD;AACJ"}
|
|
@@ -10,6 +10,7 @@ import { useBindingsForElement } from "./useBindingsForElement.js";
|
|
|
10
10
|
import { useElementInputsAst } from "../../../hooks/useElementInputsAst.js";
|
|
11
11
|
import { BreakpointElementMetadata, ElementMetadata, InputMetadata } from "../../../metadata/index.js";
|
|
12
12
|
import { useElementFactory } from "./useElementFactory.js";
|
|
13
|
+
import { PreviewedBindings } from "./PreviewedBindings.js";
|
|
13
14
|
class InputValueObject {
|
|
14
15
|
constructor(value){
|
|
15
16
|
this.value = value;
|
|
@@ -74,6 +75,9 @@ const useInputValue = (elementId, node)=>{
|
|
|
74
75
|
rawBindings
|
|
75
76
|
]);
|
|
76
77
|
const [localState, setLocalValue] = useState();
|
|
78
|
+
const previewedBindings = useMemo(()=>new PreviewedBindings(), [
|
|
79
|
+
elementId
|
|
80
|
+
]);
|
|
77
81
|
const onChange = useCallback(withTimeout((cb)=>{
|
|
78
82
|
const deepInputs = inputsProcessor.toDeepInputs(resolvedBindings.inputs);
|
|
79
83
|
const valueObject = new InputValueObject(value);
|
|
@@ -134,7 +138,7 @@ const useInputValue = (elementId, node)=>{
|
|
|
134
138
|
static: valueObject.get()
|
|
135
139
|
});
|
|
136
140
|
const updatedInputs = inputsProcessor.createUpdate(devFriendlyInputs, breakpoint.name);
|
|
137
|
-
const patch =
|
|
141
|
+
const patch = previewedBindings.createPatch(updatedInputs, rawBindings);
|
|
138
142
|
editor.executeCommand(Commands.PreviewPatchElement, {
|
|
139
143
|
elementId,
|
|
140
144
|
patch
|
|
@@ -142,7 +146,8 @@ const useInputValue = (elementId, node)=>{
|
|
|
142
146
|
}, [
|
|
143
147
|
elementId,
|
|
144
148
|
rawBindings,
|
|
145
|
-
localState
|
|
149
|
+
localState,
|
|
150
|
+
previewedBindings
|
|
146
151
|
]);
|
|
147
152
|
const setBindingType = useCallback((type)=>{
|
|
148
153
|
editor.updateDocument((state)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseEditor/defaultConfig/Sidebar/ElementSettings/useInputValue.js","sources":["../../../../../src/BaseEditor/defaultConfig/Sidebar/ElementSettings/useInputValue.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\nimport set from \"lodash/set.js\";\nimport { generateAlphaNumericLowerCaseId } from \"@webiny/utils/generateId.js\";\nimport { useDocumentEditor } from \"~/DocumentEditor/index.js\";\nimport type { ValueBinding, CreateElementParams } from \"@webiny/website-builder-sdk\";\nimport { Commands } from \"~/BaseEditor/index.js\";\nimport type { InputAstNode } from \"@webiny/website-builder-sdk\";\nimport {\n functionConverter,\n InputsBindingsProcessor,\n StylesBindingsProcessor,\n createElement\n} from \"@webiny/website-builder-sdk\";\nimport { executeOnChange, applyAncestorUpdates } from \"~/editorSdk/utils/executeOnChange.js\";\nimport { useBreakpoint } from \"~/BaseEditor/hooks/useBreakpoint.js\";\nimport { useBindingsForElement } from \"./useBindingsForElement.js\";\nimport { useElementInputsAst } from \"~/BaseEditor/hooks/useElementInputsAst.js\";\nimport {\n BreakpointElementMetadata,\n ElementMetadata,\n InputMetadata,\n type IMetadata\n} from \"~/BaseEditor/metadata/index.js\";\nimport { useElementFactory } from \"./useElementFactory.js\";\n\nexport type OnChangeParams = {\n value: InputValueObject;\n metadata: IMetadata;\n};\n\nexport type InputBindingOnChange = (cb: (params: OnChangeParams) => void) => void;\n\nexport class InputValueObject {\n private value: any;\n\n constructor(value: any) {\n this.value = value;\n }\n\n set(value: any) {\n this.value = value;\n }\n\n get() {\n return this.value;\n }\n\n unset() {\n this.value = undefined;\n }\n}\n\nfunction convertBracketPathToDotPath(path: string): string {\n // Flat binding paths use `/` as the segment separator (e.g. `items/0/label`, `address/city`).\n // lodash `set`/`get` expect `.`-delimited paths, and treat numeric segments as array indexes,\n // so a straight `/` -> `.` conversion handles both nested objects and list items.\n return path.replace(/\\//g, \".\");\n}\n\n/**\n * Reads a value from a deep inputs object using a flat `/`-delimited binding path.\n * Numeric segments are treated as array indexes (e.g. `items/0/label`).\n */\nfunction getDeepValueAtPath(obj: any, path: string): any {\n if (!path) {\n return obj;\n }\n\n const keys = path.split(\"/\").map(key => (/^\\d+$/.test(key) ? Number(key) : key));\n return keys.reduce((acc, key) => (acc == null ? undefined : acc[key]), obj);\n}\n\n/**\n * This makes UI interaction smoother (input blur in particular).\n */\nconst withTimeout = <T extends (...args: any[]) => unknown>(cb: T): T => {\n return ((...args: Parameters<T>) => {\n setTimeout(() => {\n cb(...args);\n }, 0);\n }) as unknown as T;\n};\n\nexport const useInputValue = (elementId: string, node: InputAstNode) => {\n const { breakpoint, breakpoints } = useBreakpoint();\n const editor = useDocumentEditor();\n const inputsAst = useElementInputsAst(elementId);\n const elementFactory = useElementFactory();\n\n const breakpointNames = useMemo(() => breakpoints.map(bp => bp.name), []);\n\n // These bindings already include per-breakpoint overrides.\n const { rawBindings, resolvedBindings, inheritanceMap } = useBindingsForElement(elementId);\n\n const stylesProcessor = useMemo(() => {\n return new StylesBindingsProcessor(elementId ?? \"\", breakpointNames, rawBindings);\n }, [elementId, rawBindings]);\n\n const inputsProcessor = useMemo(() => {\n return new InputsBindingsProcessor(\n elementId ?? \"\",\n inputsAst,\n breakpointNames,\n rawBindings,\n elementFactory\n );\n }, [elementId, rawBindings]);\n\n // This value is the final calculated breakpoint value.\n // Leaf inputs resolve directly from the flat bindings. Container inputs (object / object-list)\n // have no flat entry of their own, so we resolve their deep value (object / array) from the\n // processor - this is what list fields read to render items and to rewrite the whole array.\n const value = useMemo(() => {\n if (node.children.length > 0) {\n const deepInputs = inputsProcessor.toDeepInputs(resolvedBindings.inputs);\n return getDeepValueAtPath(deepInputs, node.path);\n }\n\n return resolvedBindings.inputs[node.path];\n }, [resolvedBindings, node.path, inputsProcessor]);\n\n const inputMetadata = useMemo((): IMetadata => {\n let elementMetadata: IMetadata = new ElementMetadata(elementId, rawBindings.metadata);\n\n if (node.input.responsive) {\n elementMetadata = new BreakpointElementMetadata(\n breakpointNames,\n breakpoint.name,\n elementMetadata\n );\n }\n\n const valueId = value?.id ?? generateAlphaNumericLowerCaseId();\n\n return new InputMetadata(valueId, elementMetadata);\n }, [elementId, breakpoint.name, rawBindings]);\n\n const [localState, setLocalValue] = useState<ValueBinding>();\n\n const onChange = useCallback(\n withTimeout((cb: (params: OnChangeParams) => void) => {\n const deepInputs = inputsProcessor.toDeepInputs(resolvedBindings.inputs);\n\n const valueObject = new InputValueObject(value);\n\n const updaterInput = {\n value: valueObject,\n metadata: inputMetadata\n };\n\n // Change the input value (and metadata).\n cb(updaterInput);\n\n const valuePath = convertBracketPathToDotPath(node.path);\n const devFriendlyInputs = set(\n JSON.parse(JSON.stringify(deepInputs)),\n valuePath,\n valueObject.get()\n );\n\n const devFriendlyStyles = stylesProcessor.toDeepStyles(rawBindings.styles ?? {});\n\n // Process input's `onChange`.\n if (node.input.onChange) {\n const callback = functionConverter.deserialize(\n // TODO: we know it's a string, but on the frontend it's a function. Fix types.\n node.input.onChange! as any as string\n );\n\n // Run onChange callback.\n const publicApi = {\n inputs: devFriendlyInputs,\n styles: devFriendlyStyles,\n createElement: (params: CreateElementParams) => {\n return createElement(params);\n }\n };\n\n // Run input's `onChange` callback.\n callback(publicApi, {\n breakpoint: breakpoint.name\n });\n }\n\n // Run manifest.onChange + onDescendantChange on ancestors\n const ancestorUpdates = executeOnChange({\n editor,\n elementId,\n deepInputs: devFriendlyInputs,\n action: \"update\",\n breakpointNames,\n baseBreakpoint: breakpoint.name,\n elementFactory,\n deepStyles: devFriendlyStyles\n });\n\n editor.updateDocument(document => {\n const inputs = inputsProcessor.createUpdate(devFriendlyInputs, breakpoint.name);\n const styles = stylesProcessor.createUpdate(devFriendlyStyles, breakpoint.name);\n\n inputs.applyToDocument(document);\n styles.applyToDocument(document);\n\n inputMetadata.applyToDocument(document);\n\n applyAncestorUpdates(\n document,\n ancestorUpdates,\n breakpointNames,\n breakpoint.name,\n elementFactory\n );\n });\n\n // Clear local value\n setLocalValue(undefined);\n }),\n [elementId, resolvedBindings, breakpoint]\n );\n\n /**\n * In preview, we do not update the editor document. Instead, we create a patch and send it to the preview app.\n */\n const onPreviewChange = useCallback(\n (cb: (params: OnChangeParams) => void) => {\n const deepInputs = inputsProcessor.toDeepInputs(resolvedBindings.inputs);\n\n const valueObject = new InputValueObject(localState ?? value);\n\n const updaterInput = {\n value: valueObject,\n metadata: inputMetadata\n };\n\n // Change the input value (and metadata).\n cb(updaterInput);\n\n const valuePath = convertBracketPathToDotPath(node.path);\n const devFriendlyInputs = set(\n JSON.parse(JSON.stringify(deepInputs)),\n valuePath,\n valueObject.get()\n );\n\n setLocalValue({ static: valueObject.get() });\n\n const updatedInputs = inputsProcessor.createUpdate(devFriendlyInputs, breakpoint.name);\n const patch = updatedInputs.createJsonPatch(rawBindings);\n\n editor.executeCommand(Commands.PreviewPatchElement, { elementId, patch });\n },\n [elementId, rawBindings, localState]\n );\n\n const setBindingType = useCallback(\n (type: \"static\" | \"expression\") => {\n editor.updateDocument(state => {\n const bindings = state.bindings[elementId];\n const valueBinding = bindings.inputs![node.path];\n\n if (type === \"static\") {\n // Switching to static bindings means we have to remove the expression binding.\n delete valueBinding.expression;\n } else {\n valueBinding.expression = \"$noop\";\n }\n\n state.bindings[elementId] = {\n ...bindings,\n inputs: {\n ...bindings.inputs,\n [node.path]: valueBinding\n }\n };\n });\n },\n [elementId]\n );\n\n const onReset = useCallback(() => {\n onChange(({ value, metadata }) => {\n value.unset();\n metadata.unset();\n });\n }, [onChange]);\n\n return {\n value: localState ?? value,\n metadata: inputMetadata,\n inheritanceMap: inheritanceMap.inputs[node.path],\n onReset,\n onChange,\n onPreviewChange,\n setBindingType\n };\n};\n"],"names":["InputValueObject","value","undefined","convertBracketPathToDotPath","path","getDeepValueAtPath","obj","keys","key","Number","acc","withTimeout","cb","args","setTimeout","useInputValue","elementId","node","breakpoint","breakpoints","useBreakpoint","editor","useDocumentEditor","inputsAst","useElementInputsAst","elementFactory","useElementFactory","breakpointNames","useMemo","bp","rawBindings","resolvedBindings","inheritanceMap","useBindingsForElement","stylesProcessor","StylesBindingsProcessor","inputsProcessor","InputsBindingsProcessor","deepInputs","inputMetadata","elementMetadata","ElementMetadata","BreakpointElementMetadata","valueId","generateAlphaNumericLowerCaseId","InputMetadata","localState","setLocalValue","useState","onChange","useCallback","valueObject","updaterInput","valuePath","devFriendlyInputs","set","JSON","devFriendlyStyles","callback","functionConverter","publicApi","params","createElement","ancestorUpdates","executeOnChange","document","inputs","styles","applyAncestorUpdates","onPreviewChange","updatedInputs","patch","Commands","setBindingType","type","state","bindings","valueBinding","onReset","metadata"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseEditor/defaultConfig/Sidebar/ElementSettings/useInputValue.js","sources":["../../../../../src/BaseEditor/defaultConfig/Sidebar/ElementSettings/useInputValue.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\nimport set from \"lodash/set.js\";\nimport { generateAlphaNumericLowerCaseId } from \"@webiny/utils/generateId.js\";\nimport { useDocumentEditor } from \"~/DocumentEditor/index.js\";\nimport type { ValueBinding, CreateElementParams } from \"@webiny/website-builder-sdk\";\nimport { Commands } from \"~/BaseEditor/index.js\";\nimport type { InputAstNode } from \"@webiny/website-builder-sdk\";\nimport {\n functionConverter,\n InputsBindingsProcessor,\n StylesBindingsProcessor,\n createElement\n} from \"@webiny/website-builder-sdk\";\nimport { executeOnChange, applyAncestorUpdates } from \"~/editorSdk/utils/executeOnChange.js\";\nimport { useBreakpoint } from \"~/BaseEditor/hooks/useBreakpoint.js\";\nimport { useBindingsForElement } from \"./useBindingsForElement.js\";\nimport { useElementInputsAst } from \"~/BaseEditor/hooks/useElementInputsAst.js\";\nimport {\n BreakpointElementMetadata,\n ElementMetadata,\n InputMetadata,\n type IMetadata\n} from \"~/BaseEditor/metadata/index.js\";\nimport { useElementFactory } from \"./useElementFactory.js\";\nimport { PreviewedBindings } from \"./PreviewedBindings.js\";\n\nexport type OnChangeParams = {\n value: InputValueObject;\n metadata: IMetadata;\n};\n\nexport type InputBindingOnChange = (cb: (params: OnChangeParams) => void) => void;\n\nexport class InputValueObject {\n private value: any;\n\n constructor(value: any) {\n this.value = value;\n }\n\n set(value: any) {\n this.value = value;\n }\n\n get() {\n return this.value;\n }\n\n unset() {\n this.value = undefined;\n }\n}\n\nfunction convertBracketPathToDotPath(path: string): string {\n // Flat binding paths use `/` as the segment separator (e.g. `items/0/label`, `address/city`).\n // lodash `set`/`get` expect `.`-delimited paths, and treat numeric segments as array indexes,\n // so a straight `/` -> `.` conversion handles both nested objects and list items.\n return path.replace(/\\//g, \".\");\n}\n\n/**\n * Reads a value from a deep inputs object using a flat `/`-delimited binding path.\n * Numeric segments are treated as array indexes (e.g. `items/0/label`).\n */\nfunction getDeepValueAtPath(obj: any, path: string): any {\n if (!path) {\n return obj;\n }\n\n const keys = path.split(\"/\").map(key => (/^\\d+$/.test(key) ? Number(key) : key));\n return keys.reduce((acc, key) => (acc == null ? undefined : acc[key]), obj);\n}\n\n/**\n * This makes UI interaction smoother (input blur in particular).\n */\nconst withTimeout = <T extends (...args: any[]) => unknown>(cb: T): T => {\n return ((...args: Parameters<T>) => {\n setTimeout(() => {\n cb(...args);\n }, 0);\n }) as unknown as T;\n};\n\nexport const useInputValue = (elementId: string, node: InputAstNode) => {\n const { breakpoint, breakpoints } = useBreakpoint();\n const editor = useDocumentEditor();\n const inputsAst = useElementInputsAst(elementId);\n const elementFactory = useElementFactory();\n\n const breakpointNames = useMemo(() => breakpoints.map(bp => bp.name), []);\n\n // These bindings already include per-breakpoint overrides.\n const { rawBindings, resolvedBindings, inheritanceMap } = useBindingsForElement(elementId);\n\n const stylesProcessor = useMemo(() => {\n return new StylesBindingsProcessor(elementId ?? \"\", breakpointNames, rawBindings);\n }, [elementId, rawBindings]);\n\n const inputsProcessor = useMemo(() => {\n return new InputsBindingsProcessor(\n elementId ?? \"\",\n inputsAst,\n breakpointNames,\n rawBindings,\n elementFactory\n );\n }, [elementId, rawBindings]);\n\n // This value is the final calculated breakpoint value.\n // Leaf inputs resolve directly from the flat bindings. Container inputs (object / object-list)\n // have no flat entry of their own, so we resolve their deep value (object / array) from the\n // processor - this is what list fields read to render items and to rewrite the whole array.\n const value = useMemo(() => {\n if (node.children.length > 0) {\n const deepInputs = inputsProcessor.toDeepInputs(resolvedBindings.inputs);\n return getDeepValueAtPath(deepInputs, node.path);\n }\n\n return resolvedBindings.inputs[node.path];\n }, [resolvedBindings, node.path, inputsProcessor]);\n\n const inputMetadata = useMemo((): IMetadata => {\n let elementMetadata: IMetadata = new ElementMetadata(elementId, rawBindings.metadata);\n\n if (node.input.responsive) {\n elementMetadata = new BreakpointElementMetadata(\n breakpointNames,\n breakpoint.name,\n elementMetadata\n );\n }\n\n const valueId = value?.id ?? generateAlphaNumericLowerCaseId();\n\n return new InputMetadata(valueId, elementMetadata);\n }, [elementId, breakpoint.name, rawBindings]);\n\n const [localState, setLocalValue] = useState<ValueBinding>();\n\n // See PreviewedBindings: preview patches are diffed against what the preview shows.\n const previewedBindings = useMemo(() => new PreviewedBindings(), [elementId]);\n\n const onChange = useCallback(\n withTimeout((cb: (params: OnChangeParams) => void) => {\n const deepInputs = inputsProcessor.toDeepInputs(resolvedBindings.inputs);\n\n const valueObject = new InputValueObject(value);\n\n const updaterInput = {\n value: valueObject,\n metadata: inputMetadata\n };\n\n // Change the input value (and metadata).\n cb(updaterInput);\n\n const valuePath = convertBracketPathToDotPath(node.path);\n const devFriendlyInputs = set(\n JSON.parse(JSON.stringify(deepInputs)),\n valuePath,\n valueObject.get()\n );\n\n const devFriendlyStyles = stylesProcessor.toDeepStyles(rawBindings.styles ?? {});\n\n // Process input's `onChange`.\n if (node.input.onChange) {\n const callback = functionConverter.deserialize(\n // TODO: we know it's a string, but on the frontend it's a function. Fix types.\n node.input.onChange! as any as string\n );\n\n // Run onChange callback.\n const publicApi = {\n inputs: devFriendlyInputs,\n styles: devFriendlyStyles,\n createElement: (params: CreateElementParams) => {\n return createElement(params);\n }\n };\n\n // Run input's `onChange` callback.\n callback(publicApi, {\n breakpoint: breakpoint.name\n });\n }\n\n // Run manifest.onChange + onDescendantChange on ancestors\n const ancestorUpdates = executeOnChange({\n editor,\n elementId,\n deepInputs: devFriendlyInputs,\n action: \"update\",\n breakpointNames,\n baseBreakpoint: breakpoint.name,\n elementFactory,\n deepStyles: devFriendlyStyles\n });\n\n editor.updateDocument(document => {\n const inputs = inputsProcessor.createUpdate(devFriendlyInputs, breakpoint.name);\n const styles = stylesProcessor.createUpdate(devFriendlyStyles, breakpoint.name);\n\n inputs.applyToDocument(document);\n styles.applyToDocument(document);\n\n inputMetadata.applyToDocument(document);\n\n applyAncestorUpdates(\n document,\n ancestorUpdates,\n breakpointNames,\n breakpoint.name,\n elementFactory\n );\n });\n\n // Clear local value\n setLocalValue(undefined);\n }),\n [elementId, resolvedBindings, breakpoint]\n );\n\n /**\n * In preview, we do not update the editor document. Instead, we create a patch and send it to the preview app.\n */\n const onPreviewChange = useCallback(\n (cb: (params: OnChangeParams) => void) => {\n const deepInputs = inputsProcessor.toDeepInputs(resolvedBindings.inputs);\n\n const valueObject = new InputValueObject(localState ?? value);\n\n const updaterInput = {\n value: valueObject,\n metadata: inputMetadata\n };\n\n // Change the input value (and metadata).\n cb(updaterInput);\n\n const valuePath = convertBracketPathToDotPath(node.path);\n const devFriendlyInputs = set(\n JSON.parse(JSON.stringify(deepInputs)),\n valuePath,\n valueObject.get()\n );\n\n setLocalValue({ static: valueObject.get() });\n\n const updatedInputs = inputsProcessor.createUpdate(devFriendlyInputs, breakpoint.name);\n\n const patch = previewedBindings.createPatch(updatedInputs, rawBindings);\n\n editor.executeCommand(Commands.PreviewPatchElement, { elementId, patch });\n },\n [elementId, rawBindings, localState, previewedBindings]\n );\n\n const setBindingType = useCallback(\n (type: \"static\" | \"expression\") => {\n editor.updateDocument(state => {\n const bindings = state.bindings[elementId];\n const valueBinding = bindings.inputs![node.path];\n\n if (type === \"static\") {\n // Switching to static bindings means we have to remove the expression binding.\n delete valueBinding.expression;\n } else {\n valueBinding.expression = \"$noop\";\n }\n\n state.bindings[elementId] = {\n ...bindings,\n inputs: {\n ...bindings.inputs,\n [node.path]: valueBinding\n }\n };\n });\n },\n [elementId]\n );\n\n const onReset = useCallback(() => {\n onChange(({ value, metadata }) => {\n value.unset();\n metadata.unset();\n });\n }, [onChange]);\n\n return {\n value: localState ?? value,\n metadata: inputMetadata,\n inheritanceMap: inheritanceMap.inputs[node.path],\n onReset,\n onChange,\n onPreviewChange,\n setBindingType\n };\n};\n"],"names":["InputValueObject","value","undefined","convertBracketPathToDotPath","path","getDeepValueAtPath","obj","keys","key","Number","acc","withTimeout","cb","args","setTimeout","useInputValue","elementId","node","breakpoint","breakpoints","useBreakpoint","editor","useDocumentEditor","inputsAst","useElementInputsAst","elementFactory","useElementFactory","breakpointNames","useMemo","bp","rawBindings","resolvedBindings","inheritanceMap","useBindingsForElement","stylesProcessor","StylesBindingsProcessor","inputsProcessor","InputsBindingsProcessor","deepInputs","inputMetadata","elementMetadata","ElementMetadata","BreakpointElementMetadata","valueId","generateAlphaNumericLowerCaseId","InputMetadata","localState","setLocalValue","useState","previewedBindings","PreviewedBindings","onChange","useCallback","valueObject","updaterInput","valuePath","devFriendlyInputs","set","JSON","devFriendlyStyles","callback","functionConverter","publicApi","params","createElement","ancestorUpdates","executeOnChange","document","inputs","styles","applyAncestorUpdates","onPreviewChange","updatedInputs","patch","Commands","setBindingType","type","state","bindings","valueBinding","onReset","metadata"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ElementInputRendererProps } from "../BaseEditor/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* The `dateTimeLocal` picker displays the stored ISO instant in local time, but emits the edited
|
|
5
|
+
* local wall-clock time with a `Z` suffix. Read that wall-clock time as local and convert it to a
|
|
6
|
+
* real UTC instant, so the stored value matches what the user picked.
|
|
7
|
+
*/
|
|
8
|
+
export declare const toUtcIsoString: (pickerValue: string | undefined) => string | undefined;
|
|
9
|
+
export declare const DateTimeInputRenderer: ({ value, onChange, input, label }: ElementInputRendererProps) => React.JSX.Element;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { DatePicker } from "@webiny/admin-ui";
|
|
3
|
+
const toUtcIsoString = (pickerValue)=>{
|
|
4
|
+
if (!pickerValue) return;
|
|
5
|
+
return new Date(pickerValue.replace(/Z$/, "")).toISOString();
|
|
6
|
+
};
|
|
7
|
+
const DateTimeInputRenderer = ({ value, onChange, input, label })=>/*#__PURE__*/ react.createElement(DatePicker, {
|
|
8
|
+
type: "dateTimeLocal",
|
|
9
|
+
value: value || void 0,
|
|
10
|
+
onChange: (newValue)=>{
|
|
11
|
+
onChange(({ value })=>{
|
|
12
|
+
value.set(toUtcIsoString(newValue));
|
|
13
|
+
});
|
|
14
|
+
},
|
|
15
|
+
label: label,
|
|
16
|
+
description: input.description,
|
|
17
|
+
note: input.helperText
|
|
18
|
+
});
|
|
19
|
+
export { DateTimeInputRenderer, toUtcIsoString };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=DateTimeInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputRenderers/DateTimeInput.js","sources":["../../src/inputRenderers/DateTimeInput.tsx"],"sourcesContent":["import React from \"react\";\nimport { DatePicker } from \"@webiny/admin-ui\";\nimport type { ElementInputRendererProps } from \"~/BaseEditor/index.js\";\n\n/**\n * The `dateTimeLocal` picker displays the stored ISO instant in local time, but emits the edited\n * local wall-clock time with a `Z` suffix. Read that wall-clock time as local and convert it to a\n * real UTC instant, so the stored value matches what the user picked.\n */\nexport const toUtcIsoString = (pickerValue: string | undefined) => {\n if (!pickerValue) {\n return undefined;\n }\n return new Date(pickerValue.replace(/Z$/, \"\")).toISOString();\n};\n\nexport const DateTimeInputRenderer = ({\n value,\n onChange,\n input,\n label\n}: ElementInputRendererProps) => {\n return (\n <DatePicker\n type={\"dateTimeLocal\"}\n value={value || undefined}\n onChange={(newValue: string | undefined) => {\n onChange(({ value }) => {\n value.set(toUtcIsoString(newValue));\n });\n }}\n label={label}\n description={input.description}\n note={input.helperText}\n />\n );\n};\n"],"names":["toUtcIsoString","pickerValue","Date","DateTimeInputRenderer","value","onChange","input","label","DatePicker","undefined","newValue"],"mappings":";;AASO,MAAMA,iBAAiB,CAACC;IAC3B,IAAI,CAACA,aACD;IAEJ,OAAO,IAAIC,KAAKD,YAAY,OAAO,CAAC,MAAM,KAAK,WAAW;AAC9D;AAEO,MAAME,wBAAwB,CAAC,EAClCC,KAAK,EACLC,QAAQ,EACRC,KAAK,EACLC,KAAK,EACmB,GACjB,WAAP,GACI,oBAACC,YAAUA;QACP,MAAM;QACN,OAAOJ,SAASK;QAChB,UAAU,CAACC;YACPL,SAAS,CAAC,EAAED,KAAK,EAAE;gBACfA,MAAM,GAAG,CAACJ,eAAeU;YAC7B;QACJ;QACA,OAAOH;QACP,aAAaD,MAAM,WAAW;QAC9B,MAAMA,MAAM,UAAU"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
2
|
+
import { toUtcIsoString } from "./DateTimeInput.js";
|
|
3
|
+
describe("toUtcIsoString", ()=>{
|
|
4
|
+
const originalTz = process.env.TZ;
|
|
5
|
+
beforeAll(()=>{
|
|
6
|
+
process.env.TZ = "America/New_York";
|
|
7
|
+
});
|
|
8
|
+
afterAll(()=>{
|
|
9
|
+
process.env.TZ = originalTz;
|
|
10
|
+
});
|
|
11
|
+
it("converts the picker's local wall-clock value to the matching UTC instant", ()=>{
|
|
12
|
+
expect(toUtcIsoString("2026-10-02T09:00:00.000Z")).toBe("2026-10-02T13:00:00.000Z");
|
|
13
|
+
});
|
|
14
|
+
it("round-trips: a stored instant shown in local time is saved back unchanged", ()=>{
|
|
15
|
+
const stored = "2026-10-02T14:00:00.000Z";
|
|
16
|
+
const shown = new Date(stored);
|
|
17
|
+
const pad = (n)=>String(n).padStart(2, "0");
|
|
18
|
+
const emitted = `${shown.getFullYear()}-${pad(shown.getMonth() + 1)}-${pad(shown.getDate())}T${pad(shown.getHours())}:${pad(shown.getMinutes())}:00.000Z`;
|
|
19
|
+
expect(toUtcIsoString(emitted)).toBe(stored);
|
|
20
|
+
});
|
|
21
|
+
it("keeps an empty value empty", ()=>{
|
|
22
|
+
expect(toUtcIsoString(void 0)).toBeUndefined();
|
|
23
|
+
expect(toUtcIsoString("")).toBeUndefined();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=DateTimeInput.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputRenderers/DateTimeInput.test.js","sources":["../../src/inputRenderers/DateTimeInput.test.ts"],"sourcesContent":["import { describe, it, expect, beforeAll, afterAll } from \"vitest\";\nimport { toUtcIsoString } from \"./DateTimeInput.js\";\n\ndescribe(\"toUtcIsoString\", () => {\n const originalTz = process.env.TZ;\n\n beforeAll(() => {\n // UTC-04:00 on the dates below (EDT).\n process.env.TZ = \"America/New_York\";\n });\n\n afterAll(() => {\n process.env.TZ = originalTz;\n });\n\n it(\"converts the picker's local wall-clock value to the matching UTC instant\", () => {\n // The user picks 09:00 local time; the picker emits it as \"09:00Z\".\n expect(toUtcIsoString(\"2026-10-02T09:00:00.000Z\")).toBe(\"2026-10-02T13:00:00.000Z\");\n });\n\n it(\"round-trips: a stored instant shown in local time is saved back unchanged\", () => {\n const stored = \"2026-10-02T14:00:00.000Z\";\n // What the picker displays (local) and emits back with a \"Z\" suffix.\n const shown = new Date(stored);\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const emitted = `${shown.getFullYear()}-${pad(shown.getMonth() + 1)}-${pad(\n shown.getDate()\n )}T${pad(shown.getHours())}:${pad(shown.getMinutes())}:00.000Z`;\n\n expect(toUtcIsoString(emitted)).toBe(stored);\n });\n\n it(\"keeps an empty value empty\", () => {\n expect(toUtcIsoString(undefined)).toBeUndefined();\n expect(toUtcIsoString(\"\")).toBeUndefined();\n });\n});\n"],"names":["describe","originalTz","process","beforeAll","afterAll","it","expect","toUtcIsoString","stored","shown","Date","pad","n","String","emitted","undefined"],"mappings":";;AAGAA,SAAS,kBAAkB;IACvB,MAAMC,aAAaC,QAAQ,GAAG,CAAC,EAAE;IAEjCC,UAAU;QAEND,QAAQ,GAAG,CAAC,EAAE,GAAG;IACrB;IAEAE,SAAS;QACLF,QAAQ,GAAG,CAAC,EAAE,GAAGD;IACrB;IAEAI,GAAG,4EAA4E;QAE3EC,OAAOC,eAAe,6BAA6B,IAAI,CAAC;IAC5D;IAEAF,GAAG,6EAA6E;QAC5E,MAAMG,SAAS;QAEf,MAAMC,QAAQ,IAAIC,KAAKF;QACvB,MAAMG,MAAM,CAACC,IAAcC,OAAOD,GAAG,QAAQ,CAAC,GAAG;QACjD,MAAME,UAAU,GAAGL,MAAM,WAAW,GAAG,CAAC,EAAEE,IAAIF,MAAM,QAAQ,KAAK,GAAG,CAAC,EAAEE,IACnEF,MAAM,OAAO,IACf,CAAC,EAAEE,IAAIF,MAAM,QAAQ,IAAI,CAAC,EAAEE,IAAIF,MAAM,UAAU,IAAI,QAAQ,CAAC;QAE/DH,OAAOC,eAAeO,UAAU,IAAI,CAACN;IACzC;IAEAH,GAAG,8BAA8B;QAC7BC,OAAOC,eAAeQ,SAAY,aAAa;QAC/CT,OAAOC,eAAe,KAAK,aAAa;IAC5C;AACJ"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { RadioGroup } from "@webiny/admin-ui";
|
|
3
|
+
const RadioInputRenderer = ({ value, onChange, label, ...props })=>{
|
|
4
|
+
const input = props.input;
|
|
5
|
+
return /*#__PURE__*/ react.createElement(RadioGroup, {
|
|
6
|
+
value: value,
|
|
7
|
+
onChange: (newValue)=>{
|
|
8
|
+
onChange(({ value })=>{
|
|
9
|
+
value.set(newValue);
|
|
10
|
+
});
|
|
11
|
+
},
|
|
12
|
+
items: input.options,
|
|
13
|
+
label: label,
|
|
14
|
+
description: input.description,
|
|
15
|
+
note: input.helperText
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
export { RadioInputRenderer };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=RadioInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputRenderers/RadioInput.js","sources":["../../src/inputRenderers/RadioInput.tsx"],"sourcesContent":["import React from \"react\";\nimport { RadioGroup } from \"@webiny/admin-ui\";\nimport type { ElementInputRendererProps } from \"~/BaseEditor/index.js\";\nimport type { RadioInput } from \"@webiny/website-builder-sdk\";\n\nexport const RadioInputRenderer = ({\n value,\n onChange,\n label,\n ...props\n}: ElementInputRendererProps) => {\n const input = props.input as RadioInput;\n return (\n <RadioGroup\n value={value}\n onChange={newValue => {\n onChange(({ value }) => {\n value.set(newValue);\n });\n }}\n items={input.options}\n label={label}\n description={input.description}\n note={input.helperText}\n />\n );\n};\n"],"names":["RadioInputRenderer","value","onChange","label","props","input","RadioGroup","newValue"],"mappings":";;AAKO,MAAMA,qBAAqB,CAAC,EAC/BC,KAAK,EACLC,QAAQ,EACRC,KAAK,EACL,GAAGC,OACqB;IACxB,MAAMC,QAAQD,MAAM,KAAK;IACzB,OAAO,WAAP,GACI,oBAACE,YAAUA;QACP,OAAOL;QACP,UAAUM,CAAAA;YACNL,SAAS,CAAC,EAAED,KAAK,EAAE;gBACfA,MAAM,GAAG,CAACM;YACd;QACJ;QACA,OAAOF,MAAM,OAAO;QACpB,OAAOF;QACP,aAAaE,MAAM,WAAW;QAC9B,MAAMA,MAAM,UAAU;;AAGlC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { Tags } from "@webiny/admin-ui";
|
|
3
|
+
const TagsInputRenderer = ({ value, onChange, input, label })=>{
|
|
4
|
+
const commitValue = (newValue)=>{
|
|
5
|
+
onChange(({ value })=>{
|
|
6
|
+
value.set(newValue);
|
|
7
|
+
});
|
|
8
|
+
};
|
|
9
|
+
return /*#__PURE__*/ react.createElement(Tags, {
|
|
10
|
+
size: "md",
|
|
11
|
+
variant: "secondary",
|
|
12
|
+
value: Array.isArray(value) ? value : [],
|
|
13
|
+
onChange: commitValue,
|
|
14
|
+
placeholder: "Add values",
|
|
15
|
+
label: label,
|
|
16
|
+
description: input.description,
|
|
17
|
+
note: input.helperText
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
export { TagsInputRenderer };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=TagsInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputRenderers/TagsInput.js","sources":["../../src/inputRenderers/TagsInput.tsx"],"sourcesContent":["import React from \"react\";\nimport { Tags } from \"@webiny/admin-ui\";\nimport type { ElementInputRendererProps } from \"~/BaseEditor/index.js\";\n\nexport const TagsInputRenderer = ({ value, onChange, input, label }: ElementInputRendererProps) => {\n const commitValue = (newValue: string[]) => {\n onChange(({ value }) => {\n value.set(newValue);\n });\n };\n\n return (\n <Tags\n size={\"md\"}\n variant={\"secondary\"}\n value={Array.isArray(value) ? value : []}\n onChange={commitValue}\n placeholder={\"Add values\"}\n label={label}\n description={input.description}\n note={input.helperText}\n />\n );\n};\n"],"names":["TagsInputRenderer","value","onChange","input","label","commitValue","newValue","Tags","Array"],"mappings":";;AAIO,MAAMA,oBAAoB,CAAC,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,KAAK,EAA6B;IAC1F,MAAMC,cAAc,CAACC;QACjBJ,SAAS,CAAC,EAAED,KAAK,EAAE;YACfA,MAAM,GAAG,CAACK;QACd;IACJ;IAEA,OAAO,WAAP,GACI,oBAACC,MAAIA;QACD,MAAM;QACN,SAAS;QACT,OAAOC,MAAM,OAAO,CAACP,SAASA,QAAQ,EAAE;QACxC,UAAUI;QACV,aAAa;QACb,OAAOD;QACP,aAAaD,MAAM,WAAW;QAC9B,MAAMA,MAAM,UAAU;;AAGlC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/app-website-builder",
|
|
3
|
-
"version": "6.5.0-beta.
|
|
3
|
+
"version": "6.5.0-beta.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
@@ -19,28 +19,28 @@
|
|
|
19
19
|
"@lexical/utils": "0.51.0",
|
|
20
20
|
"@monaco-editor/react": "4.7.0",
|
|
21
21
|
"@types/react": "18.3.31",
|
|
22
|
-
"@webiny/admin-ui": "6.5.0-beta.
|
|
23
|
-
"@webiny/app": "6.5.0-beta.
|
|
24
|
-
"@webiny/app-aco": "6.5.0-beta.
|
|
25
|
-
"@webiny/app-admin": "6.5.0-beta.
|
|
26
|
-
"@webiny/app-headless-cms": "6.5.0-beta.
|
|
27
|
-
"@webiny/app-headless-cms-common": "6.5.0-beta.
|
|
28
|
-
"@webiny/app-utils": "6.5.0-beta.
|
|
22
|
+
"@webiny/admin-ui": "6.5.0-beta.7",
|
|
23
|
+
"@webiny/app": "6.5.0-beta.7",
|
|
24
|
+
"@webiny/app-aco": "6.5.0-beta.7",
|
|
25
|
+
"@webiny/app-admin": "6.5.0-beta.7",
|
|
26
|
+
"@webiny/app-headless-cms": "6.5.0-beta.7",
|
|
27
|
+
"@webiny/app-headless-cms-common": "6.5.0-beta.7",
|
|
28
|
+
"@webiny/app-utils": "6.5.0-beta.7",
|
|
29
29
|
"@webiny/di": "1.1.0",
|
|
30
|
-
"@webiny/feature": "6.5.0-beta.
|
|
31
|
-
"@webiny/form": "6.5.0-beta.
|
|
32
|
-
"@webiny/frontend-settings": "6.5.0-beta.
|
|
33
|
-
"@webiny/icons": "6.5.0-beta.
|
|
34
|
-
"@webiny/languages": "6.5.0-beta.
|
|
35
|
-
"@webiny/lexical-converter": "6.5.0-beta.
|
|
36
|
-
"@webiny/lexical-editor": "6.5.0-beta.
|
|
37
|
-
"@webiny/lexical-nodes": "6.5.0-beta.
|
|
38
|
-
"@webiny/lexical-theme": "6.5.0-beta.
|
|
39
|
-
"@webiny/react-composition": "6.5.0-beta.
|
|
40
|
-
"@webiny/react-properties": "6.5.0-beta.
|
|
41
|
-
"@webiny/utils": "6.5.0-beta.
|
|
42
|
-
"@webiny/validation": "6.5.0-beta.
|
|
43
|
-
"@webiny/website-builder-sdk": "6.5.0-beta.
|
|
30
|
+
"@webiny/feature": "6.5.0-beta.7",
|
|
31
|
+
"@webiny/form": "6.5.0-beta.7",
|
|
32
|
+
"@webiny/frontend-settings": "6.5.0-beta.7",
|
|
33
|
+
"@webiny/icons": "6.5.0-beta.7",
|
|
34
|
+
"@webiny/languages": "6.5.0-beta.7",
|
|
35
|
+
"@webiny/lexical-converter": "6.5.0-beta.7",
|
|
36
|
+
"@webiny/lexical-editor": "6.5.0-beta.7",
|
|
37
|
+
"@webiny/lexical-nodes": "6.5.0-beta.7",
|
|
38
|
+
"@webiny/lexical-theme": "6.5.0-beta.7",
|
|
39
|
+
"@webiny/react-composition": "6.5.0-beta.7",
|
|
40
|
+
"@webiny/react-properties": "6.5.0-beta.7",
|
|
41
|
+
"@webiny/utils": "6.5.0-beta.7",
|
|
42
|
+
"@webiny/validation": "6.5.0-beta.7",
|
|
43
|
+
"@webiny/website-builder-sdk": "6.5.0-beta.7",
|
|
44
44
|
"classnames": "2.5.1",
|
|
45
45
|
"deep-equal": "2.2.3",
|
|
46
46
|
"graphql": "16.14.2",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@types/deep-equal": "1.0.4",
|
|
63
63
|
"@types/is-hotkey": "0.1.10",
|
|
64
|
-
"@webiny/build-tools": "6.5.0-beta.
|
|
64
|
+
"@webiny/build-tools": "6.5.0-beta.7",
|
|
65
65
|
"execa": "5.1.1",
|
|
66
66
|
"rimraf": "6.1.3",
|
|
67
67
|
"typescript": "7.0.2",
|