@webiny/app-website-builder 6.6.0-alpha.0 → 6.6.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/BaseEditor/commandHandlers/CloneElement.d.ts +1 -0
  2. package/BaseEditor/commandHandlers/CloneElement.js +17 -0
  3. package/BaseEditor/commandHandlers/CloneElement.js.map +1 -0
  4. package/BaseEditor/commandHandlers/index.js +2 -1
  5. package/BaseEditor/commandHandlers/index.js.map +1 -1
  6. package/BaseEditor/commands.d.ts +3 -0
  7. package/BaseEditor/commands.js +2 -0
  8. package/BaseEditor/commands.js.map +1 -1
  9. package/BaseEditor/defaultConfig/Content/AddressBar/usePreviewLink.js +4 -1
  10. package/BaseEditor/defaultConfig/Content/AddressBar/usePreviewLink.js.map +1 -1
  11. package/BaseEditor/defaultConfig/Content/Preview/DropZoneManager.js.map +1 -1
  12. package/BaseEditor/defaultConfig/Content/Preview/Iframe.d.ts +2 -2
  13. package/BaseEditor/defaultConfig/Content/Preview/Overlays/ElementOverlays.d.ts +2 -2
  14. package/BaseEditor/defaultConfig/DefaultEditorConfig.js +9 -0
  15. package/BaseEditor/defaultConfig/DefaultEditorConfig.js.map +1 -1
  16. package/BaseEditor/defaultConfig/DocumentStateEditor/DocumentStateEditor.d.ts +2 -2
  17. package/BaseEditor/defaultConfig/ElementInputRenderers.js +4 -0
  18. package/BaseEditor/defaultConfig/ElementInputRenderers.js.map +1 -1
  19. package/BaseEditor/defaultConfig/Sidebar/ElementActions/CloneElementAction.d.ts +2 -0
  20. package/BaseEditor/defaultConfig/Sidebar/ElementActions/CloneElementAction.js +25 -0
  21. package/BaseEditor/defaultConfig/Sidebar/ElementActions/CloneElementAction.js.map +1 -0
  22. package/BaseEditor/defaultConfig/Sidebar/ElementActions/DeleteElementAction.d.ts +2 -0
  23. package/BaseEditor/defaultConfig/Sidebar/ElementActions/DeleteElementAction.js +26 -0
  24. package/BaseEditor/defaultConfig/Sidebar/ElementActions/DeleteElementAction.js.map +1 -0
  25. package/BaseEditor/defaultConfig/Sidebar/ElementPreview.js +12 -2
  26. package/BaseEditor/defaultConfig/Sidebar/ElementPreview.js.map +1 -1
  27. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementInputs.js +1 -6
  28. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementInputs.js.map +1 -1
  29. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementSettings.js +11 -2
  30. package/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementSettings.js.map +1 -1
  31. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundColor.d.ts +6 -2
  32. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundImage.d.ts +6 -2
  33. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundPosition.d.ts +6 -2
  34. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundScaling.d.ts +6 -2
  35. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderColor.d.ts +2 -2
  36. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderRadius.d.ts +2 -2
  37. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderStyle.d.ts +2 -2
  38. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderWidth.d.ts +2 -2
  39. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Layout/Alignment.d.ts +6 -2
  40. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Layout/LengthWithUnitInput.d.ts +2 -2
  41. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/MarginPadding/Margin.d.ts +2 -2
  42. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/MarginPadding/Padding.d.ts +2 -2
  43. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Visibility/Visibility.d.ts +2 -2
  44. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/StyleProperties.js +7 -7
  45. package/BaseEditor/defaultConfig/Sidebar/StyleSettings/StyleProperties.js.map +1 -1
  46. package/BaseEditor/defaultConfig/Toolbar/Navigator/Navigator.d.ts +2 -2
  47. package/DocumentEditor/DocumentEditor.d.ts +14 -5
  48. package/DocumentEditor/DocumentEditor.js +10 -6
  49. package/DocumentEditor/DocumentEditor.js.map +1 -1
  50. package/DocumentEditor/StateInspector.d.ts +4 -2
  51. package/Extension.js +7 -1
  52. package/Extension.js.map +1 -1
  53. package/ecommerce/components/ResourcePage.d.ts +6 -2
  54. package/ecommerce/components/ResourcesList.d.ts +4 -4
  55. package/ecommerce/components/ResourcesPicker.d.ts +9 -4
  56. package/editorSdk/CommandBus.js.map +1 -1
  57. package/editorSdk/utils/$cloneElement.d.ts +2 -0
  58. package/editorSdk/utils/$cloneElement.js +112 -0
  59. package/editorSdk/utils/$cloneElement.js.map +1 -0
  60. package/editorSdk/utils/index.d.ts +1 -0
  61. package/editorSdk/utils/index.js +1 -0
  62. package/features/experiments/ExperimentsGateway.d.ts +30 -0
  63. package/features/experiments/ExperimentsGateway.js +326 -0
  64. package/features/experiments/ExperimentsGateway.js.map +1 -0
  65. package/features/experiments/abstractions.d.ts +25 -0
  66. package/features/experiments/abstractions.js +5 -0
  67. package/features/experiments/abstractions.js.map +1 -0
  68. package/features/experiments/feature.d.ts +3 -0
  69. package/features/experiments/feature.js +17 -0
  70. package/features/experiments/feature.js.map +1 -0
  71. package/features/experiments/index.d.ts +3 -0
  72. package/features/experiments/index.js +2 -0
  73. package/features/experiments/types.d.ts +61 -0
  74. package/features/experiments/types.js +0 -0
  75. package/inputRenderers/ColorPickerInput.d.ts +3 -0
  76. package/inputRenderers/ColorPickerInput.js +29 -0
  77. package/inputRenderers/ColorPickerInput.js.map +1 -0
  78. package/inputRenderers/FileInput.js +93 -8
  79. package/inputRenderers/FileInput.js.map +1 -1
  80. package/inputRenderers/LexicalInput/LexicalEditor.js +15 -8
  81. package/inputRenderers/LexicalInput/LexicalEditor.js.map +1 -1
  82. package/inputRenderers/LexicalInput/TypographyDropDown.js +3 -2
  83. package/inputRenderers/LexicalInput/TypographyDropDown.js.map +1 -1
  84. package/inputRenderers/LexicalInput/wbStaticToolbar.css +72 -103
  85. package/modules/AbTesting.d.ts +2 -0
  86. package/modules/AbTesting.js +19 -0
  87. package/modules/AbTesting.js.map +1 -0
  88. package/package.json +28 -28
  89. package/presentation/components/LanguageCodeTag.js +5 -4
  90. package/presentation/components/LanguageCodeTag.js.map +1 -1
  91. package/presentation/experiments/ExperimentForm/ExperimentFormPresenter.d.ts +30 -0
  92. package/presentation/experiments/ExperimentForm/ExperimentFormPresenter.js +202 -0
  93. package/presentation/experiments/ExperimentForm/ExperimentFormPresenter.js.map +1 -0
  94. package/presentation/experiments/ExperimentForm/abstractions/ExperimentFormPresenter.d.ts +65 -0
  95. package/presentation/experiments/ExperimentForm/abstractions/ExperimentFormPresenter.js +5 -0
  96. package/presentation/experiments/ExperimentForm/abstractions/ExperimentFormPresenter.js.map +1 -0
  97. package/presentation/experiments/ExperimentForm/components/ExperimentFormView.d.ts +12 -0
  98. package/presentation/experiments/ExperimentForm/components/ExperimentFormView.js +149 -0
  99. package/presentation/experiments/ExperimentForm/components/ExperimentFormView.js.map +1 -0
  100. package/presentation/experiments/ExperimentForm/components/VariantSplitRow.d.ts +17 -0
  101. package/presentation/experiments/ExperimentForm/components/VariantSplitRow.js +122 -0
  102. package/presentation/experiments/ExperimentForm/components/VariantSplitRow.js.map +1 -0
  103. package/presentation/experiments/ExperimentForm/feature.d.ts +3 -0
  104. package/presentation/experiments/ExperimentForm/feature.js +17 -0
  105. package/presentation/experiments/ExperimentForm/feature.js.map +1 -0
  106. package/presentation/experiments/ExperimentForm/index.d.ts +3 -0
  107. package/presentation/experiments/ExperimentForm/index.js +3 -0
  108. package/presentation/experiments/ExperimentsEditor/ExperimentsEditorDataSource.d.ts +18 -0
  109. package/presentation/experiments/ExperimentsEditor/ExperimentsEditorDataSource.js +25 -0
  110. package/presentation/experiments/ExperimentsEditor/ExperimentsEditorDataSource.js.map +1 -0
  111. package/presentation/experiments/ExperimentsEditor/ExperimentsEditorPresenter.d.ts +67 -0
  112. package/presentation/experiments/ExperimentsEditor/ExperimentsEditorPresenter.js +224 -0
  113. package/presentation/experiments/ExperimentsEditor/ExperimentsEditorPresenter.js.map +1 -0
  114. package/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorDataSource.d.ts +10 -0
  115. package/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorDataSource.js +5 -0
  116. package/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorDataSource.js.map +1 -0
  117. package/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorPresenter.d.ts +58 -0
  118. package/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorPresenter.js +5 -0
  119. package/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorPresenter.js.map +1 -0
  120. package/presentation/experiments/ExperimentsEditor/components/ExperimentIndicator.d.ts +15 -0
  121. package/presentation/experiments/ExperimentsEditor/components/ExperimentIndicator.js +110 -0
  122. package/presentation/experiments/ExperimentsEditor/components/ExperimentIndicator.js.map +1 -0
  123. package/presentation/experiments/ExperimentsEditor/components/ExperimentPreviewToolbar.d.ts +9 -0
  124. package/presentation/experiments/ExperimentsEditor/components/ExperimentPreviewToolbar.js +178 -0
  125. package/presentation/experiments/ExperimentsEditor/components/ExperimentPreviewToolbar.js.map +1 -0
  126. package/presentation/experiments/ExperimentsEditor/components/ExperimentsButton.d.ts +11 -0
  127. package/presentation/experiments/ExperimentsEditor/components/ExperimentsButton.js +51 -0
  128. package/presentation/experiments/ExperimentsEditor/components/ExperimentsButton.js.map +1 -0
  129. package/presentation/experiments/ExperimentsEditor/components/ExperimentsSwitcher.d.ts +14 -0
  130. package/presentation/experiments/ExperimentsEditor/components/ExperimentsSwitcher.js +147 -0
  131. package/presentation/experiments/ExperimentsEditor/components/ExperimentsSwitcher.js.map +1 -0
  132. package/presentation/experiments/ExperimentsEditor/feature.d.ts +3 -0
  133. package/presentation/experiments/ExperimentsEditor/feature.js +21 -0
  134. package/presentation/experiments/ExperimentsEditor/feature.js.map +1 -0
  135. package/presentation/experiments/ExperimentsEditor/index.d.ts +4 -0
  136. package/presentation/experiments/ExperimentsEditor/index.js +3 -0
  137. package/presentation/experiments/ExperimentsManager/ExperimentsManagerPresenter.d.ts +39 -0
  138. package/presentation/experiments/ExperimentsManager/ExperimentsManagerPresenter.js +219 -0
  139. package/presentation/experiments/ExperimentsManager/ExperimentsManagerPresenter.js.map +1 -0
  140. package/presentation/experiments/ExperimentsManager/abstractions/ExperimentsManagerPresenter.d.ts +52 -0
  141. package/presentation/experiments/ExperimentsManager/abstractions/ExperimentsManagerPresenter.js +5 -0
  142. package/presentation/experiments/ExperimentsManager/abstractions/ExperimentsManagerPresenter.js.map +1 -0
  143. package/presentation/experiments/ExperimentsManager/components/ExperimentCard.d.ts +10 -0
  144. package/presentation/experiments/ExperimentsManager/components/ExperimentCard.js +296 -0
  145. package/presentation/experiments/ExperimentsManager/components/ExperimentCard.js.map +1 -0
  146. package/presentation/experiments/ExperimentsManager/components/ExperimentsDrawerView.d.ts +2 -0
  147. package/presentation/experiments/ExperimentsManager/components/ExperimentsDrawerView.js +92 -0
  148. package/presentation/experiments/ExperimentsManager/components/ExperimentsDrawerView.js.map +1 -0
  149. package/presentation/experiments/ExperimentsManager/components/ExperimentsEmptyState.d.ts +6 -0
  150. package/presentation/experiments/ExperimentsManager/components/ExperimentsEmptyState.js +103 -0
  151. package/presentation/experiments/ExperimentsManager/components/ExperimentsEmptyState.js.map +1 -0
  152. package/presentation/experiments/ExperimentsManager/components/ExperimentsListView.d.ts +9 -0
  153. package/presentation/experiments/ExperimentsManager/components/ExperimentsListView.js +58 -0
  154. package/presentation/experiments/ExperimentsManager/components/ExperimentsListView.js.map +1 -0
  155. package/presentation/experiments/ExperimentsManager/feature.d.ts +3 -0
  156. package/presentation/experiments/ExperimentsManager/feature.js +17 -0
  157. package/presentation/experiments/ExperimentsManager/feature.js.map +1 -0
  158. package/presentation/experiments/ExperimentsManager/index.d.ts +4 -0
  159. package/presentation/experiments/ExperimentsManager/index.js +3 -0
  160. package/presentation/experiments/VariantPageEditorConfig.d.ts +7 -0
  161. package/presentation/experiments/VariantPageEditorConfig.js +26 -0
  162. package/presentation/experiments/VariantPageEditorConfig.js.map +1 -0
  163. package/presentation/experiments/config/ExperimentsEditorConfig.d.ts +8 -0
  164. package/presentation/experiments/config/ExperimentsEditorConfig.js +21 -0
  165. package/presentation/experiments/config/ExperimentsEditorConfig.js.map +1 -0
  166. package/presentation/experiments/config/VariantAutoSave.d.ts +5 -0
  167. package/presentation/experiments/config/VariantAutoSave.js +41 -0
  168. package/presentation/experiments/config/VariantAutoSave.js.map +1 -0
  169. package/presentation/experiments/shared/variantColors.d.ts +11 -0
  170. package/presentation/experiments/shared/variantColors.js +13 -0
  171. package/presentation/experiments/shared/variantColors.js.map +1 -0
  172. package/presentation/experiments/shared/variantDocument.d.ts +16 -0
  173. package/presentation/experiments/shared/variantDocument.js +31 -0
  174. package/presentation/experiments/shared/variantDocument.js.map +1 -0
  175. package/presentation/navigation/Extension.js +9 -5
  176. package/presentation/navigation/Extension.js.map +1 -1
  177. package/presentation/navigation/NextjsConfig/NextjsConfigDialog.d.ts +2 -2
  178. package/presentation/navigation/StarterKitConfigDialog.js +1 -1
  179. package/presentation/navigation/StarterKitConfigDialog.js.map +1 -1
  180. package/presentation/pages/CreatePage/CreatePageDialog.d.ts +2 -2
  181. package/presentation/pages/CreatePage/CreatePagePresenter.js +1 -1
  182. package/presentation/pages/CreatePage/CreatePagePresenter.js.map +1 -1
  183. package/presentation/pages/CreatePage/WithLanguageSelector.js +3 -3
  184. package/presentation/pages/CreatePage/WithLanguageSelector.js.map +1 -1
  185. package/presentation/pages/CreatePage/feature.js +3 -3
  186. package/presentation/pages/CreatePage/feature.js.map +1 -1
  187. package/presentation/pages/PageEditor/PageEditor.experiments.d.ts +2 -0
  188. package/presentation/pages/PageEditor/PageEditor.experiments.js +54 -0
  189. package/presentation/pages/PageEditor/PageEditor.experiments.js.map +1 -0
  190. package/presentation/pages/PageEditor/PageEditorSurface.d.ts +15 -0
  191. package/presentation/pages/PageEditor/PageEditorSurface.js +63 -0
  192. package/presentation/pages/PageEditor/PageEditorSurface.js.map +1 -0
  193. package/presentation/pages/PageEditor/TopBar/PageSettingsDrawer.d.ts +2 -2
  194. package/presentation/pages/PageEditor/pageDocument.d.ts +4 -0
  195. package/presentation/pages/PageEditor/pageDocument.js +15 -0
  196. package/presentation/pages/PageEditor/pageDocument.js.map +1 -0
  197. package/presentation/pages/PageList/components/BulkActions/BulkActionDelete.d.ts +2 -2
  198. package/presentation/pages/PageList/components/BulkActions/BulkActionDuplicate.d.ts +2 -2
  199. package/presentation/pages/PageList/components/BulkActions/BulkActionMovePage.d.ts +2 -2
  200. package/presentation/pages/PageList/components/BulkActions/BulkActionPublish.d.ts +2 -2
  201. package/presentation/pages/PageList/components/BulkActions/BulkActionUnpublish.d.ts +2 -2
  202. package/presentation/pages/PageList/components/DocumentList.d.ts +2 -2
  203. package/presentation/pages/PageList/components/PagesList.js +2 -1
  204. package/presentation/pages/PageList/components/PagesList.js.map +1 -1
  205. package/presentation/pages/PageList/components/Table/Table.d.ts +2 -2
  206. package/presentation/pages/PageList/components/WbPagesBreadcrumbs.d.ts +9 -0
  207. package/presentation/pages/PageList/components/WbPagesBreadcrumbs.js +40 -0
  208. package/presentation/pages/PageList/components/WbPagesBreadcrumbs.js.map +1 -0
  209. package/presentation/pages/TranslatePage/TranslatePageConfig.d.ts +1 -1
  210. package/presentation/pages/TranslatePage/TranslatePageConfig.js +6 -2
  211. package/presentation/pages/TranslatePage/TranslatePageConfig.js.map +1 -1
  212. package/presentation/pages/TranslatePage/TranslatePageDialog.js +22 -10
  213. package/presentation/pages/TranslatePage/TranslatePageDialog.js.map +1 -1
  214. package/presentation/pages/TranslatePage/translatePageSchema.d.ts +1 -1
  215. package/presentation/pages/TranslatePage/translatePageSchema.js +1 -1
  216. package/presentation/pages/TranslatePage/translatePageSchema.js.map +1 -1
  217. package/presentation/pages/TrashBin/WbTrashBin.d.ts +2 -2
  218. package/presentation/redirects/RedirectList/components/BulkActionDelete.d.ts +2 -2
  219. package/presentation/redirects/RedirectList/components/BulkActionMove.d.ts +2 -2
  220. package/presentation/redirects/RedirectList/components/CreateRedirectDialog.d.ts +2 -2
  221. package/presentation/redirects/RedirectList/components/DocumentList.d.ts +2 -2
  222. package/presentation/redirects/RedirectList/components/EditRedirectDialog.d.ts +2 -2
  223. package/presentation/redirects/RedirectList/components/Table/Table.d.ts +2 -2
  224. package/shared/fileManagerItemToValue.d.ts +8 -9
  225. package/shared/fileManagerItemToValue.js +22 -7
  226. package/shared/fileManagerItemToValue.js.map +1 -1
  227. package/inputRenderers/LexicalInput/icons/list-ol.js +0 -20
  228. package/inputRenderers/LexicalInput/icons/list-ol.js.map +0 -1
  229. package/inputRenderers/LexicalInput/icons/list-ol.svg +0 -1
  230. package/inputRenderers/LexicalInput/icons/list-ul.js +0 -18
  231. package/inputRenderers/LexicalInput/icons/list-ul.js.map +0 -1
  232. package/inputRenderers/LexicalInput/icons/list-ul.svg +0 -1
  233. package/static/svg/list-ol.d64946f3.svg +0 -1
  234. package/static/svg/list-ul.1d54da3f.svg +0 -1
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ interface Props {
3
+ name: string;
4
+ variantKey: string;
5
+ description: string;
6
+ isControl: boolean;
7
+ weight: number;
8
+ variantIndex: number;
9
+ onNameChange: (value: string) => void;
10
+ onKeyChange: (value: string) => void;
11
+ onDescriptionChange: (value: string) => void;
12
+ onChange: (value: number) => void;
13
+ onRemove?: () => void;
14
+ removeIcon: React.ReactNode;
15
+ }
16
+ export declare const VariantSplitRow: ({ name, variantKey, description, isControl, weight, variantIndex, onNameChange, onKeyChange, onDescriptionChange, onChange, onRemove, removeIcon }: Props) => React.JSX.Element;
17
+ export {};
@@ -0,0 +1,122 @@
1
+ import react from "react";
2
+ import { IconButton, Input } from "@webiny/admin-ui";
3
+ import { bucketColor } from "../../shared/variantColors.js";
4
+ const Field = ({ label, children })=>/*#__PURE__*/ react.createElement("div", {
5
+ style: {
6
+ marginTop: 12
7
+ }
8
+ }, /*#__PURE__*/ react.createElement("div", {
9
+ style: {
10
+ fontSize: 11,
11
+ fontWeight: 600,
12
+ letterSpacing: 0.5,
13
+ textTransform: "uppercase",
14
+ color: "#6b7280",
15
+ marginBottom: 6
16
+ }
17
+ }, label), children);
18
+ const VariantSplitRow = ({ name, variantKey, description, isControl, weight, variantIndex, onNameChange, onKeyChange, onDescriptionChange, onChange, onRemove, removeIcon })=>{
19
+ const color = bucketColor(isControl, variantIndex);
20
+ return /*#__PURE__*/ react.createElement("div", {
21
+ style: {
22
+ border: "1px solid #eee",
23
+ borderRadius: 10,
24
+ padding: 16,
25
+ marginBottom: 12
26
+ }
27
+ }, /*#__PURE__*/ react.createElement("div", {
28
+ style: {
29
+ display: "flex",
30
+ alignItems: "center",
31
+ justifyContent: "space-between",
32
+ gap: 8
33
+ }
34
+ }, /*#__PURE__*/ react.createElement("div", {
35
+ style: {
36
+ display: "flex",
37
+ alignItems: "center",
38
+ gap: 8
39
+ }
40
+ }, /*#__PURE__*/ react.createElement("span", {
41
+ style: {
42
+ width: 10,
43
+ height: 10,
44
+ borderRadius: "50%",
45
+ background: color,
46
+ flexShrink: 0
47
+ }
48
+ }), /*#__PURE__*/ react.createElement("span", {
49
+ style: {
50
+ fontWeight: 600
51
+ }
52
+ }, isControl ? "Control" : name || "Variant")), isControl ? /*#__PURE__*/ react.createElement("span", {
53
+ style: {
54
+ fontSize: 12,
55
+ color: "#6b7280",
56
+ background: "#f2f2f2",
57
+ borderRadius: 6,
58
+ padding: "2px 8px",
59
+ whiteSpace: "nowrap"
60
+ }
61
+ }, "Current page") : onRemove ? /*#__PURE__*/ react.createElement(IconButton, {
62
+ variant: "ghost",
63
+ size: "sm",
64
+ icon: removeIcon,
65
+ onClick: onRemove
66
+ }) : null), /*#__PURE__*/ react.createElement(Field, {
67
+ label: "Name"
68
+ }, /*#__PURE__*/ react.createElement(Input, {
69
+ value: name,
70
+ onChange: onNameChange,
71
+ disabled: isControl,
72
+ placeholder: "Variant name"
73
+ })), /*#__PURE__*/ react.createElement(Field, {
74
+ label: "Key"
75
+ }, /*#__PURE__*/ react.createElement(Input, {
76
+ value: variantKey,
77
+ onChange: onKeyChange,
78
+ placeholder: "variant-key"
79
+ })), /*#__PURE__*/ react.createElement(Field, {
80
+ label: "Description"
81
+ }, /*#__PURE__*/ react.createElement(Input, {
82
+ value: description,
83
+ onChange: onDescriptionChange,
84
+ placeholder: "Optional"
85
+ })), /*#__PURE__*/ react.createElement("div", {
86
+ style: {
87
+ display: "flex",
88
+ alignItems: "center",
89
+ gap: 12,
90
+ marginTop: 16
91
+ }
92
+ }, /*#__PURE__*/ react.createElement("span", {
93
+ style: {
94
+ fontSize: 11,
95
+ fontWeight: 600,
96
+ letterSpacing: 0.5,
97
+ textTransform: "uppercase",
98
+ color: "#6b7280"
99
+ }
100
+ }, "Traffic"), /*#__PURE__*/ react.createElement("input", {
101
+ type: "range",
102
+ min: 0,
103
+ max: 100,
104
+ step: 1,
105
+ value: weight,
106
+ onChange: (event)=>onChange(Number(event.target.value)),
107
+ style: {
108
+ flex: 1,
109
+ accentColor: color
110
+ }
111
+ }), /*#__PURE__*/ react.createElement("span", {
112
+ style: {
113
+ width: 44,
114
+ textAlign: "right",
115
+ fontWeight: 600,
116
+ fontSize: 14
117
+ }
118
+ }, weight, "%")));
119
+ };
120
+ export { VariantSplitRow };
121
+
122
+ //# sourceMappingURL=VariantSplitRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/experiments/ExperimentForm/components/VariantSplitRow.js","sources":["../../../../../src/presentation/experiments/ExperimentForm/components/VariantSplitRow.tsx"],"sourcesContent":["import React from \"react\";\nimport { IconButton, Input } from \"@webiny/admin-ui\";\nimport { bucketColor } from \"../../shared/variantColors.js\";\n\ninterface FieldProps {\n label: string;\n children: React.ReactNode;\n}\n\nconst Field = ({ label, children }: FieldProps) => {\n return (\n <div style={{ marginTop: 12 }}>\n <div\n style={{\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: 0.5,\n textTransform: \"uppercase\",\n color: \"#6b7280\",\n marginBottom: 6\n }}\n >\n {label}\n </div>\n {children}\n </div>\n );\n};\n\ninterface Props {\n name: string;\n variantKey: string;\n description: string;\n isControl: boolean;\n weight: number;\n variantIndex: number;\n onNameChange: (value: string) => void;\n onKeyChange: (value: string) => void;\n onDescriptionChange: (value: string) => void;\n onChange: (value: number) => void;\n onRemove?: () => void;\n removeIcon: React.ReactNode;\n}\n\nexport const VariantSplitRow = ({\n name,\n variantKey,\n description,\n isControl,\n weight,\n variantIndex,\n onNameChange,\n onKeyChange,\n onDescriptionChange,\n onChange,\n onRemove,\n removeIcon\n}: Props) => {\n const color = bucketColor(isControl, variantIndex);\n\n return (\n <div\n style={{\n border: \"1px solid #eee\",\n borderRadius: 10,\n padding: 16,\n marginBottom: 12\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span\n style={{\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0\n }}\n />\n <span style={{ fontWeight: 600 }}>\n {isControl ? \"Control\" : name || \"Variant\"}\n </span>\n </div>\n {isControl ? (\n <span\n style={{\n fontSize: 12,\n color: \"#6b7280\",\n background: \"#f2f2f2\",\n borderRadius: 6,\n padding: \"2px 8px\",\n whiteSpace: \"nowrap\"\n }}\n >\n Current page\n </span>\n ) : onRemove ? (\n <IconButton variant=\"ghost\" size=\"sm\" icon={removeIcon} onClick={onRemove} />\n ) : null}\n </div>\n\n <Field label=\"Name\">\n <Input\n value={name}\n onChange={onNameChange}\n disabled={isControl}\n placeholder=\"Variant name\"\n />\n </Field>\n\n <Field label=\"Key\">\n <Input value={variantKey} onChange={onKeyChange} placeholder=\"variant-key\" />\n </Field>\n\n <Field label=\"Description\">\n <Input value={description} onChange={onDescriptionChange} placeholder=\"Optional\" />\n </Field>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12, marginTop: 16 }}>\n <span\n style={{\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: 0.5,\n textTransform: \"uppercase\",\n color: \"#6b7280\"\n }}\n >\n Traffic\n </span>\n <input\n type=\"range\"\n min={0}\n max={100}\n step={1}\n value={weight}\n onChange={event => onChange(Number(event.target.value))}\n style={{ flex: 1, accentColor: color }}\n />\n <span style={{ width: 44, textAlign: \"right\", fontWeight: 600, fontSize: 14 }}>\n {weight}%\n </span>\n </div>\n </div>\n );\n};\n"],"names":["Field","label","children","VariantSplitRow","name","variantKey","description","isControl","weight","variantIndex","onNameChange","onKeyChange","onDescriptionChange","onChange","onRemove","removeIcon","color","bucketColor","IconButton","Input","event","Number"],"mappings":";;;AASA,MAAMA,QAAQ,CAAC,EAAEC,KAAK,EAAEC,QAAQ,EAAc,GACnC,WAAP,GACI,oBAAC;QAAI,OAAO;YAAE,WAAW;QAAG;qBACxB,oBAAC;QACG,OAAO;YACH,UAAU;YACV,YAAY;YACZ,eAAe;YACf,eAAe;YACf,OAAO;YACP,cAAc;QAClB;OAECD,QAEJC;AAoBN,MAAMC,kBAAkB,CAAC,EAC5BC,IAAI,EACJC,UAAU,EACVC,WAAW,EACXC,SAAS,EACTC,MAAM,EACNC,YAAY,EACZC,YAAY,EACZC,WAAW,EACXC,mBAAmB,EACnBC,QAAQ,EACRC,QAAQ,EACRC,UAAU,EACN;IACJ,MAAMC,QAAQC,YAAYV,WAAWE;IAErC,OAAO,WAAP,GACI,oBAAC;QACG,OAAO;YACH,QAAQ;YACR,cAAc;YACd,SAAS;YACT,cAAc;QAClB;qBAEA,oBAAC;QACG,OAAO;YACH,SAAS;YACT,YAAY;YACZ,gBAAgB;YAChB,KAAK;QACT;qBAEA,oBAAC;QAAI,OAAO;YAAE,SAAS;YAAQ,YAAY;YAAU,KAAK;QAAE;qBACxD,oBAAC;QACG,OAAO;YACH,OAAO;YACP,QAAQ;YACR,cAAc;YACd,YAAYO;YACZ,YAAY;QAChB;sBAEJ,oBAAC;QAAK,OAAO;YAAE,YAAY;QAAI;OAC1BT,YAAY,YAAYH,QAAQ,aAGxCG,YAAY,WAAZA,GACG,oBAAC;QACG,OAAO;YACH,UAAU;YACV,OAAO;YACP,YAAY;YACZ,cAAc;YACd,SAAS;YACT,YAAY;QAChB;OACH,kBAGDO,WAAW,WAAXA,GACA,oBAACI,YAAUA;QAAC,SAAQ;QAAQ,MAAK;QAAK,MAAMH;QAAY,SAASD;SACjE,qBAGR,oBAACd,OAAKA;QAAC,OAAM;qBACT,oBAACmB,OAAKA;QACF,OAAOf;QACP,UAAUM;QACV,UAAUH;QACV,aAAY;uBAIpB,oBAACP,OAAKA;QAAC,OAAM;qBACT,oBAACmB,OAAKA;QAAC,OAAOd;QAAY,UAAUM;QAAa,aAAY;uBAGjE,oBAACX,OAAKA;QAAC,OAAM;qBACT,oBAACmB,OAAKA;QAAC,OAAOb;QAAa,UAAUM;QAAqB,aAAY;uBAG1E,oBAAC;QAAI,OAAO;YAAE,SAAS;YAAQ,YAAY;YAAU,KAAK;YAAI,WAAW;QAAG;qBACxE,oBAAC;QACG,OAAO;YACH,UAAU;YACV,YAAY;YACZ,eAAe;YACf,eAAe;YACf,OAAO;QACX;OACH,0BAGD,oBAAC;QACG,MAAK;QACL,KAAK;QACL,KAAK;QACL,MAAM;QACN,OAAOJ;QACP,UAAUY,CAAAA,QAASP,SAASQ,OAAOD,MAAM,MAAM,CAAC,KAAK;QACrD,OAAO;YAAE,MAAM;YAAG,aAAaJ;QAAM;sBAEzC,oBAAC;QAAK,OAAO;YAAE,OAAO;YAAI,WAAW;YAAS,YAAY;YAAK,UAAU;QAAG;OACvER,QAAO;AAK5B"}
@@ -0,0 +1,3 @@
1
+ export declare const ExperimentFormPresenterFeature: import("@webiny/feature/admin").FeatureDefinition<{
2
+ presenter: import("./abstractions/ExperimentFormPresenter.js").IExperimentFormPresenter;
3
+ }, []>;
@@ -0,0 +1,17 @@
1
+ import { createFeature } from "@webiny/feature/admin";
2
+ import { ExperimentFormPresenter } from "./abstractions/ExperimentFormPresenter.js";
3
+ import { ExperimentFormPresenter as external_ExperimentFormPresenter_js_ExperimentFormPresenter } from "./ExperimentFormPresenter.js";
4
+ const ExperimentFormPresenterFeature = createFeature({
5
+ name: "WebsiteBuilder/ExperimentFormPresenter",
6
+ register (container) {
7
+ container.register(external_ExperimentFormPresenter_js_ExperimentFormPresenter).inSingletonScope();
8
+ },
9
+ resolve (container) {
10
+ return {
11
+ presenter: container.resolve(ExperimentFormPresenter)
12
+ };
13
+ }
14
+ });
15
+ export { ExperimentFormPresenterFeature };
16
+
17
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/experiments/ExperimentForm/feature.js","sources":["../../../../src/presentation/experiments/ExperimentForm/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { ExperimentFormPresenter as PresenterAbstraction } from \"./abstractions/ExperimentFormPresenter.js\";\nimport { ExperimentFormPresenter } from \"./ExperimentFormPresenter.js\";\n\nexport const ExperimentFormPresenterFeature = createFeature({\n name: \"WebsiteBuilder/ExperimentFormPresenter\",\n register(container) {\n container.register(ExperimentFormPresenter).inSingletonScope();\n },\n resolve(container) {\n return {\n presenter: container.resolve(PresenterAbstraction)\n };\n }\n});\n"],"names":["ExperimentFormPresenterFeature","createFeature","container","ExperimentFormPresenter","PresenterAbstraction"],"mappings":";;;AAIO,MAAMA,iCAAiCC,cAAc;IACxD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,6DAAyB,gBAAgB;IAChE;IACA,SAAQD,SAAS;QACb,OAAO;YACH,WAAWA,UAAU,OAAO,CAACE;QACjC;IACJ;AACJ"}
@@ -0,0 +1,3 @@
1
+ export { ExperimentFormView } from "./components/ExperimentFormView.js";
2
+ export { ExperimentFormPresenter } from "./abstractions/ExperimentFormPresenter.js";
3
+ export { ExperimentFormPresenterFeature } from "./feature.js";
@@ -0,0 +1,3 @@
1
+ export { ExperimentFormView } from "./components/ExperimentFormView.js";
2
+ export { ExperimentFormPresenter } from "./abstractions/ExperimentFormPresenter.js";
3
+ export { ExperimentFormPresenterFeature } from "./feature.js";
@@ -0,0 +1,18 @@
1
+ import { ExperimentsGateway } from "../../../features/experiments/index.js";
2
+ import type { ExperimentDto, VariantDto } from "../../../features/experiments/index.js";
3
+ import { type IExperimentsEditorDataSource } from "./abstractions/ExperimentsEditorDataSource.js";
4
+ /**
5
+ * Thin gateway-orchestration data source for the editor-embedded experiments UI: loads a page's
6
+ * experiments, a single experiment's variants, and the runtime kill-switch state.
7
+ */
8
+ declare class ExperimentsEditorDataSourceImpl implements IExperimentsEditorDataSource {
9
+ private readonly gateway;
10
+ constructor(gateway: ExperimentsGateway.Interface);
11
+ listExperiments(pageEntryId: string): Promise<ExperimentDto[]>;
12
+ listVariants(experimentId: string): Promise<VariantDto[]>;
13
+ getExperimentPaused(experimentEntryId: string): Promise<boolean>;
14
+ }
15
+ export declare const ExperimentsEditorDataSource: typeof ExperimentsEditorDataSourceImpl & {
16
+ __abstraction: import("@webiny/di").Abstraction<IExperimentsEditorDataSource>;
17
+ };
18
+ export {};
@@ -0,0 +1,25 @@
1
+ import { ExperimentsGateway } from "../../../features/experiments/index.js";
2
+ import { ExperimentsEditorDataSource } from "./abstractions/ExperimentsEditorDataSource.js";
3
+ class ExperimentsEditorDataSourceImpl {
4
+ constructor(gateway){
5
+ this.gateway = gateway;
6
+ }
7
+ async listExperiments(pageEntryId) {
8
+ return this.gateway.listExperiments(pageEntryId).catch(()=>[]);
9
+ }
10
+ async listVariants(experimentId) {
11
+ return this.gateway.listVariants(experimentId).catch(()=>[]);
12
+ }
13
+ async getExperimentPaused(experimentEntryId) {
14
+ return this.gateway.getExperimentPaused(experimentEntryId).catch(()=>false);
15
+ }
16
+ }
17
+ const ExperimentsEditorDataSource_ExperimentsEditorDataSource = ExperimentsEditorDataSource.createImplementation({
18
+ implementation: ExperimentsEditorDataSourceImpl,
19
+ dependencies: [
20
+ ExperimentsGateway
21
+ ]
22
+ });
23
+ export { ExperimentsEditorDataSource_ExperimentsEditorDataSource as ExperimentsEditorDataSource };
24
+
25
+ //# sourceMappingURL=ExperimentsEditorDataSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/experiments/ExperimentsEditor/ExperimentsEditorDataSource.js","sources":["../../../../src/presentation/experiments/ExperimentsEditor/ExperimentsEditorDataSource.ts"],"sourcesContent":["import { ExperimentsGateway } from \"~/features/experiments/index.js\";\nimport type { ExperimentDto, VariantDto } from \"~/features/experiments/index.js\";\nimport {\n ExperimentsEditorDataSource as Abstraction,\n type IExperimentsEditorDataSource\n} from \"./abstractions/ExperimentsEditorDataSource.js\";\n\n/**\n * Thin gateway-orchestration data source for the editor-embedded experiments UI: loads a page's\n * experiments, a single experiment's variants, and the runtime kill-switch state.\n */\nclass ExperimentsEditorDataSourceImpl implements IExperimentsEditorDataSource {\n constructor(private readonly gateway: ExperimentsGateway.Interface) {}\n\n async listExperiments(pageEntryId: string): Promise<ExperimentDto[]> {\n return this.gateway.listExperiments(pageEntryId).catch(() => [] as ExperimentDto[]);\n }\n\n async listVariants(experimentId: string): Promise<VariantDto[]> {\n return this.gateway.listVariants(experimentId).catch(() => [] as VariantDto[]);\n }\n\n async getExperimentPaused(experimentEntryId: string): Promise<boolean> {\n return this.gateway.getExperimentPaused(experimentEntryId).catch(() => false);\n }\n}\n\nexport const ExperimentsEditorDataSource = Abstraction.createImplementation({\n implementation: ExperimentsEditorDataSourceImpl,\n dependencies: [ExperimentsGateway]\n});\n"],"names":["ExperimentsEditorDataSourceImpl","gateway","pageEntryId","experimentId","experimentEntryId","ExperimentsEditorDataSource","Abstraction","ExperimentsGateway"],"mappings":";;AAWA,MAAMA;IACF,YAA6BC,OAAqC,CAAE;aAAvCA,OAAO,GAAPA;IAAwC;IAErE,MAAM,gBAAgBC,WAAmB,EAA4B;QACjE,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAACA,aAAa,KAAK,CAAC,IAAM,EAAE;IACnE;IAEA,MAAM,aAAaC,YAAoB,EAAyB;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAACA,cAAc,KAAK,CAAC,IAAM,EAAE;IACjE;IAEA,MAAM,oBAAoBC,iBAAyB,EAAoB;QACnE,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAACA,mBAAmB,KAAK,CAAC,IAAM;IAC3E;AACJ;AAEO,MAAMC,0DAA8BC,4BAAAA,oBAAgC,CAAC;IACxE,gBAAgBN;IAChB,cAAc;QAACO;KAAmB;AACtC"}
@@ -0,0 +1,67 @@
1
+ import { ExperimentsGateway } from "../../../features/experiments/index.js";
2
+ import type { ExperimentDto, UpdateExperimentInput, VariantContentDto, VariantDto } from "../../../features/experiments/index.js";
3
+ import type { NewExperimentPayload } from "../ExperimentForm/abstractions/ExperimentFormPresenter.js";
4
+ import { type IExperimentsEditorPresenter, type IExperimentsEditorViewModel } from "./abstractions/ExperimentsEditorPresenter.js";
5
+ import { ExperimentsEditorDataSource } from "./abstractions/ExperimentsEditorDataSource.js";
6
+ declare class ExperimentsEditorPresenterImpl implements IExperimentsEditorPresenter {
7
+ private readonly gateway;
8
+ private readonly dataSource;
9
+ private baselineRevisionId;
10
+ private pageEntryId;
11
+ private experiments;
12
+ private selectedExperimentId;
13
+ private selectedVariantId;
14
+ private variants;
15
+ private paused;
16
+ private drawerOpen;
17
+ private editTarget;
18
+ private loadToken;
19
+ constructor(gateway: ExperimentsGateway.Interface, dataSource: ExperimentsEditorDataSource.Interface);
20
+ private get selectedExperiment();
21
+ private get selectedVariant();
22
+ private get variantOptions();
23
+ private get currentBucket();
24
+ private get runningExperiment();
25
+ private get switcherItems();
26
+ get vm(): IExperimentsEditorViewModel;
27
+ init(pageRevisionId: string): void;
28
+ reload(): Promise<void>;
29
+ selectExperiment(id: string | null): void;
30
+ selectVariant(variantId: string | null): void;
31
+ /**
32
+ * On the published (read-only) view, surface the running experiment and keep it selected so the
33
+ * preview toolbar tracks it. Mirrors the old read-only auto-select effect.
34
+ */
35
+ syncReadOnlySelection(isReadOnly: boolean): void;
36
+ openManage(): void;
37
+ editExperiment(experiment: ExperimentDto): void;
38
+ closeDrawer(): void;
39
+ /**
40
+ * Load the variants and kill-switch state for the currently selected experiment. A load token
41
+ * guards against a stale response overwriting a newer selection.
42
+ */
43
+ private loadSelectedExperiment;
44
+ pause(): Promise<void>;
45
+ resume(): Promise<void>;
46
+ /**
47
+ * Activate an experiment. Only one experiment can run on a page at a time, so any other running
48
+ * experiment (from the same page) is stopped first.
49
+ */
50
+ activate(experimentId: string): Promise<ExperimentDto>;
51
+ deactivate(experimentId: string): Promise<ExperimentDto>;
52
+ /**
53
+ * Persist a new experiment: create the experiment, then each variant (whose content the API
54
+ * copies from the baseline) marked ready, then write the traffic split now that we have the
55
+ * variant ids. The experiment key is carried in the analytics config.
56
+ */
57
+ createExperiment(payload: NewExperimentPayload): Promise<ExperimentDto>;
58
+ updateExperiment(id: string, input: UpdateExperimentInput): Promise<ExperimentDto>;
59
+ /** Delete an experiment along with its variants. */
60
+ deleteExperiment(experimentId: string): Promise<boolean>;
61
+ getVariant(id: string): Promise<VariantContentDto | null>;
62
+ saveVariant(revisionId: string, doc: Record<string, any>): Promise<VariantDto>;
63
+ }
64
+ export declare const ExperimentsEditorPresenter: typeof ExperimentsEditorPresenterImpl & {
65
+ __abstraction: import("@webiny/di").Abstraction<IExperimentsEditorPresenter>;
66
+ };
67
+ export {};
@@ -0,0 +1,224 @@
1
+ import { computed, makeAutoObservable, runInAction } from "mobx";
2
+ import { ExperimentsGateway } from "../../../features/experiments/index.js";
3
+ import { ExperimentsEditorPresenter } from "./abstractions/ExperimentsEditorPresenter.js";
4
+ import { ExperimentsEditorDataSource } from "./abstractions/ExperimentsEditorDataSource.js";
5
+ import { bucketColor } from "../shared/variantColors.js";
6
+ class ExperimentsEditorPresenterImpl {
7
+ constructor(gateway, dataSource){
8
+ this.gateway = gateway;
9
+ this.dataSource = dataSource;
10
+ this.baselineRevisionId = "";
11
+ this.pageEntryId = "";
12
+ this.experiments = [];
13
+ this.selectedExperimentId = null;
14
+ this.selectedVariantId = null;
15
+ this.variants = [];
16
+ this.paused = false;
17
+ this.drawerOpen = false;
18
+ this.editTarget = null;
19
+ this.loadToken = 0;
20
+ makeAutoObservable(this, {
21
+ vm: computed
22
+ });
23
+ }
24
+ get selectedExperiment() {
25
+ return this.experiments.find((experiment)=>experiment.id === this.selectedExperimentId) ?? null;
26
+ }
27
+ get selectedVariant() {
28
+ return this.variants.find((variant)=>variant.entryId === this.selectedVariantId) ?? null;
29
+ }
30
+ get variantOptions() {
31
+ const split = this.selectedExperiment?.trafficSplit ?? {
32
+ control: 0,
33
+ variants: {}
34
+ };
35
+ return [
36
+ {
37
+ id: null,
38
+ name: "Control",
39
+ weight: split.control ?? 0,
40
+ isControl: true,
41
+ color: bucketColor(true, 0)
42
+ },
43
+ ...this.variants.map((variant, index)=>({
44
+ id: variant.entryId,
45
+ name: variant.name,
46
+ weight: split.variants?.[variant.entryId] ?? 0,
47
+ isControl: false,
48
+ color: bucketColor(false, index)
49
+ }))
50
+ ];
51
+ }
52
+ get currentBucket() {
53
+ const options = this.variantOptions;
54
+ return options.find((option)=>option.id === this.selectedVariantId) ?? options[0] ?? null;
55
+ }
56
+ get runningExperiment() {
57
+ return this.experiments.find((experiment)=>"running" === experiment.status) ?? null;
58
+ }
59
+ get switcherItems() {
60
+ return this.experiments.map((experiment)=>({
61
+ id: experiment.id,
62
+ name: experiment.name,
63
+ status: "running" === experiment.status ? "active" : "inactive"
64
+ }));
65
+ }
66
+ get vm() {
67
+ return {
68
+ baselineRevisionId: this.baselineRevisionId,
69
+ pageEntryId: this.pageEntryId,
70
+ experiments: this.experiments,
71
+ selectedExperimentId: this.selectedExperimentId,
72
+ selectedExperiment: this.selectedExperiment,
73
+ selectedVariantId: this.selectedVariantId,
74
+ selectedVariant: this.selectedVariant,
75
+ variantOptions: this.variantOptions,
76
+ currentBucket: this.currentBucket,
77
+ runningExperiment: this.runningExperiment,
78
+ switcherItems: this.switcherItems,
79
+ paused: this.paused,
80
+ drawerOpen: this.drawerOpen,
81
+ editTarget: this.editTarget
82
+ };
83
+ }
84
+ init(pageRevisionId) {
85
+ this.baselineRevisionId = pageRevisionId;
86
+ this.pageEntryId = pageRevisionId.split("#")[0];
87
+ this.reload();
88
+ }
89
+ async reload() {
90
+ const list = await this.dataSource.listExperiments(this.pageEntryId);
91
+ runInAction(()=>{
92
+ this.experiments = list;
93
+ if (this.selectedExperimentId && !list.some((experiment)=>experiment.id === this.selectedExperimentId)) this.selectedExperimentId = null;
94
+ });
95
+ }
96
+ selectExperiment(id) {
97
+ this.selectedExperimentId = id;
98
+ this.selectedVariantId = null;
99
+ this.loadSelectedExperiment();
100
+ }
101
+ selectVariant(variantId) {
102
+ this.selectedVariantId = variantId;
103
+ }
104
+ syncReadOnlySelection(isReadOnly) {
105
+ if (!isReadOnly) return;
106
+ const running = this.experiments.find((experiment)=>"running" === experiment.status) ?? null;
107
+ if (running && this.selectedExperimentId !== running.id) this.selectExperiment(running.id);
108
+ }
109
+ openManage() {
110
+ this.editTarget = null;
111
+ this.drawerOpen = true;
112
+ }
113
+ editExperiment(experiment) {
114
+ this.editTarget = experiment;
115
+ this.drawerOpen = true;
116
+ }
117
+ closeDrawer() {
118
+ this.drawerOpen = false;
119
+ }
120
+ loadSelectedExperiment() {
121
+ const token = ++this.loadToken;
122
+ const experimentId = this.selectedExperimentId;
123
+ if (!experimentId) {
124
+ this.variants = [];
125
+ this.paused = false;
126
+ return;
127
+ }
128
+ this.dataSource.listVariants(experimentId).then((list)=>{
129
+ if (token === this.loadToken) runInAction(()=>{
130
+ this.variants = list;
131
+ });
132
+ });
133
+ const experiment = this.experiments.find((item)=>item.id === experimentId) ?? null;
134
+ if (experiment && "running" === experiment.status) this.dataSource.getExperimentPaused(experiment.entryId).then((value)=>{
135
+ if (token === this.loadToken) runInAction(()=>{
136
+ this.paused = value;
137
+ });
138
+ });
139
+ else this.paused = false;
140
+ }
141
+ async pause() {
142
+ const experiment = this.selectedExperiment;
143
+ if (!experiment) return;
144
+ await this.gateway.pauseExperiment(experiment.entryId);
145
+ runInAction(()=>{
146
+ this.paused = true;
147
+ });
148
+ }
149
+ async resume() {
150
+ const experiment = this.selectedExperiment;
151
+ if (!experiment) return;
152
+ await this.gateway.resumeExperiment(experiment.entryId);
153
+ runInAction(()=>{
154
+ this.paused = false;
155
+ });
156
+ }
157
+ async activate(experimentId) {
158
+ const active = this.experiments.find((experiment)=>"running" === experiment.status && experiment.id !== experimentId);
159
+ if (active) await this.gateway.stopExperiment(active.id);
160
+ return this.gateway.startExperiment(experimentId);
161
+ }
162
+ deactivate(experimentId) {
163
+ return this.gateway.stopExperiment(experimentId);
164
+ }
165
+ async createExperiment(payload) {
166
+ const experiment = await this.gateway.createExperiment({
167
+ pageEntryId: this.pageEntryId,
168
+ baselineRevisionId: this.baselineRevisionId,
169
+ name: payload.name,
170
+ targeting: {
171
+ trafficPercentage: 100
172
+ },
173
+ analytics: {
174
+ provider: "posthog",
175
+ experimentKey: payload.key
176
+ },
177
+ trafficSplit: {
178
+ control: payload.control.weight,
179
+ variants: {}
180
+ }
181
+ });
182
+ const variantSplit = {};
183
+ for (const variant of payload.variants){
184
+ const created = await this.gateway.createVariant({
185
+ experimentId: experiment.id,
186
+ name: variant.name
187
+ });
188
+ await this.gateway.updateVariant(created.id, {
189
+ status: "ready"
190
+ });
191
+ variantSplit[created.entryId] = variant.weight;
192
+ }
193
+ return this.gateway.updateExperiment(experiment.id, {
194
+ trafficSplit: {
195
+ control: payload.control.weight,
196
+ variants: variantSplit
197
+ }
198
+ });
199
+ }
200
+ updateExperiment(id, input) {
201
+ return this.gateway.updateExperiment(id, input);
202
+ }
203
+ async deleteExperiment(experimentId) {
204
+ const variants = await this.gateway.listVariants(experimentId).catch(()=>[]);
205
+ for (const variant of variants)await this.gateway.deleteVariant(variant.id).catch(()=>void 0);
206
+ return this.gateway.deleteExperiment(experimentId);
207
+ }
208
+ getVariant(id) {
209
+ return this.gateway.getVariant(id);
210
+ }
211
+ saveVariant(revisionId, doc) {
212
+ return this.gateway.updateVariant(revisionId, doc);
213
+ }
214
+ }
215
+ const ExperimentsEditorPresenter_ExperimentsEditorPresenter = ExperimentsEditorPresenter.createImplementation({
216
+ implementation: ExperimentsEditorPresenterImpl,
217
+ dependencies: [
218
+ ExperimentsGateway,
219
+ ExperimentsEditorDataSource
220
+ ]
221
+ });
222
+ export { ExperimentsEditorPresenter_ExperimentsEditorPresenter as ExperimentsEditorPresenter };
223
+
224
+ //# sourceMappingURL=ExperimentsEditorPresenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/experiments/ExperimentsEditor/ExperimentsEditorPresenter.js","sources":["../../../../src/presentation/experiments/ExperimentsEditor/ExperimentsEditorPresenter.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport { ExperimentsGateway } from \"~/features/experiments/index.js\";\nimport type {\n ExperimentDto,\n UpdateExperimentInput,\n VariantContentDto,\n VariantDto\n} from \"~/features/experiments/index.js\";\nimport type { NewExperimentPayload } from \"../ExperimentForm/abstractions/ExperimentFormPresenter.js\";\nimport {\n ExperimentsEditorPresenter as Abstraction,\n type IExperimentsEditorPresenter,\n type IExperimentsEditorViewModel,\n type SwitcherItem,\n type VariantOption\n} from \"./abstractions/ExperimentsEditorPresenter.js\";\nimport { ExperimentsEditorDataSource } from \"./abstractions/ExperimentsEditorDataSource.js\";\nimport { bucketColor } from \"../shared/variantColors.js\";\n\nclass ExperimentsEditorPresenterImpl implements IExperimentsEditorPresenter {\n // Revision id of the page being edited (e.g. \"<entryId>#0001\"); the baseline for its experiments.\n private baselineRevisionId = \"\";\n private pageEntryId = \"\";\n private experiments: ExperimentDto[] = [];\n private selectedExperimentId: string | null = null;\n // Currently edited bucket: `null` = control, otherwise a variant entry id.\n private selectedVariantId: string | null = null;\n private variants: VariantDto[] = [];\n private paused = false;\n private drawerOpen = false;\n private editTarget: ExperimentDto | null = null;\n // Guards async variant/paused loads against out-of-order responses when the selection changes.\n private loadToken = 0;\n\n constructor(\n private readonly gateway: ExperimentsGateway.Interface,\n private readonly dataSource: ExperimentsEditorDataSource.Interface\n ) {\n makeAutoObservable(this, { vm: computed });\n }\n\n private get selectedExperiment(): ExperimentDto | null {\n return (\n this.experiments.find(experiment => experiment.id === this.selectedExperimentId) ?? null\n );\n }\n\n private get selectedVariant(): VariantDto | null {\n return this.variants.find(variant => variant.entryId === this.selectedVariantId) ?? null;\n }\n\n private get variantOptions(): VariantOption[] {\n const split = this.selectedExperiment?.trafficSplit ?? { control: 0, variants: {} };\n return [\n {\n id: null,\n name: \"Control\",\n weight: split.control ?? 0,\n isControl: true,\n color: bucketColor(true, 0)\n },\n ...this.variants.map((variant, index) => ({\n id: variant.entryId,\n name: variant.name,\n weight: split.variants?.[variant.entryId] ?? 0,\n isControl: false,\n color: bucketColor(false, index)\n }))\n ];\n }\n\n private get currentBucket(): VariantOption | null {\n const options = this.variantOptions;\n return options.find(option => option.id === this.selectedVariantId) ?? options[0] ?? null;\n }\n\n private get runningExperiment(): ExperimentDto | null {\n return this.experiments.find(experiment => experiment.status === \"running\") ?? null;\n }\n\n private get switcherItems(): SwitcherItem[] {\n return this.experiments.map((experiment): SwitcherItem => ({\n id: experiment.id,\n name: experiment.name,\n status: experiment.status === \"running\" ? \"active\" : \"inactive\"\n }));\n }\n\n get vm(): IExperimentsEditorViewModel {\n return {\n baselineRevisionId: this.baselineRevisionId,\n pageEntryId: this.pageEntryId,\n experiments: this.experiments,\n selectedExperimentId: this.selectedExperimentId,\n selectedExperiment: this.selectedExperiment,\n selectedVariantId: this.selectedVariantId,\n selectedVariant: this.selectedVariant,\n variantOptions: this.variantOptions,\n currentBucket: this.currentBucket,\n runningExperiment: this.runningExperiment,\n switcherItems: this.switcherItems,\n paused: this.paused,\n drawerOpen: this.drawerOpen,\n editTarget: this.editTarget\n };\n }\n\n init(pageRevisionId: string): void {\n this.baselineRevisionId = pageRevisionId;\n this.pageEntryId = pageRevisionId.split(\"#\")[0];\n this.reload();\n }\n\n async reload(): Promise<void> {\n const list = await this.dataSource.listExperiments(this.pageEntryId);\n runInAction(() => {\n this.experiments = list;\n // Drop the selection if the experiment no longer exists.\n if (\n this.selectedExperimentId &&\n !list.some(experiment => experiment.id === this.selectedExperimentId)\n ) {\n this.selectedExperimentId = null;\n }\n });\n }\n\n selectExperiment(id: string | null): void {\n this.selectedExperimentId = id;\n // Reset the edited bucket to the control whenever the experiment changes.\n this.selectedVariantId = null;\n this.loadSelectedExperiment();\n }\n\n selectVariant(variantId: string | null): void {\n this.selectedVariantId = variantId;\n }\n\n /**\n * On the published (read-only) view, surface the running experiment and keep it selected so the\n * preview toolbar tracks it. Mirrors the old read-only auto-select effect.\n */\n syncReadOnlySelection(isReadOnly: boolean): void {\n if (!isReadOnly) {\n return;\n }\n const running =\n this.experiments.find(experiment => experiment.status === \"running\") ?? null;\n if (running && this.selectedExperimentId !== running.id) {\n this.selectExperiment(running.id);\n }\n }\n\n openManage(): void {\n this.editTarget = null;\n this.drawerOpen = true;\n }\n\n editExperiment(experiment: ExperimentDto): void {\n this.editTarget = experiment;\n this.drawerOpen = true;\n }\n\n closeDrawer(): void {\n this.drawerOpen = false;\n }\n\n /**\n * Load the variants and kill-switch state for the currently selected experiment. A load token\n * guards against a stale response overwriting a newer selection.\n */\n private loadSelectedExperiment(): void {\n const token = ++this.loadToken;\n const experimentId = this.selectedExperimentId;\n\n if (!experimentId) {\n this.variants = [];\n this.paused = false;\n return;\n }\n\n this.dataSource.listVariants(experimentId).then(list => {\n if (token === this.loadToken) {\n runInAction(() => {\n this.variants = list;\n });\n }\n });\n\n // Load the kill-switch state only for a running experiment (keyed on its entryId).\n const experiment = this.experiments.find(item => item.id === experimentId) ?? null;\n if (experiment && experiment.status === \"running\") {\n this.dataSource.getExperimentPaused(experiment.entryId).then(value => {\n if (token === this.loadToken) {\n runInAction(() => {\n this.paused = value;\n });\n }\n });\n } else {\n this.paused = false;\n }\n }\n\n async pause(): Promise<void> {\n const experiment = this.selectedExperiment;\n if (!experiment) {\n return;\n }\n await this.gateway.pauseExperiment(experiment.entryId);\n runInAction(() => {\n this.paused = true;\n });\n }\n\n async resume(): Promise<void> {\n const experiment = this.selectedExperiment;\n if (!experiment) {\n return;\n }\n await this.gateway.resumeExperiment(experiment.entryId);\n runInAction(() => {\n this.paused = false;\n });\n }\n\n /**\n * Activate an experiment. Only one experiment can run on a page at a time, so any other running\n * experiment (from the same page) is stopped first.\n */\n async activate(experimentId: string): Promise<ExperimentDto> {\n const active = this.experiments.find(\n experiment => experiment.status === \"running\" && experiment.id !== experimentId\n );\n if (active) {\n await this.gateway.stopExperiment(active.id);\n }\n return this.gateway.startExperiment(experimentId);\n }\n\n deactivate(experimentId: string): Promise<ExperimentDto> {\n return this.gateway.stopExperiment(experimentId);\n }\n\n /**\n * Persist a new experiment: create the experiment, then each variant (whose content the API\n * copies from the baseline) marked ready, then write the traffic split now that we have the\n * variant ids. The experiment key is carried in the analytics config.\n */\n async createExperiment(payload: NewExperimentPayload): Promise<ExperimentDto> {\n const experiment = await this.gateway.createExperiment({\n pageEntryId: this.pageEntryId,\n baselineRevisionId: this.baselineRevisionId,\n name: payload.name,\n targeting: { trafficPercentage: 100 },\n analytics: { provider: \"posthog\", experimentKey: payload.key },\n trafficSplit: { control: payload.control.weight, variants: {} }\n });\n\n const variantSplit: Record<string, number> = {};\n for (const variant of payload.variants) {\n const created = await this.gateway.createVariant({\n experimentId: experiment.id,\n name: variant.name\n });\n await this.gateway.updateVariant(created.id, { status: \"ready\" });\n variantSplit[created.entryId] = variant.weight;\n }\n\n return this.gateway.updateExperiment(experiment.id, {\n trafficSplit: { control: payload.control.weight, variants: variantSplit }\n });\n }\n\n updateExperiment(id: string, input: UpdateExperimentInput): Promise<ExperimentDto> {\n return this.gateway.updateExperiment(id, input);\n }\n\n /** Delete an experiment along with its variants. */\n async deleteExperiment(experimentId: string): Promise<boolean> {\n const variants = await this.gateway.listVariants(experimentId).catch(() => []);\n for (const variant of variants) {\n await this.gateway.deleteVariant(variant.id).catch(() => undefined);\n }\n return this.gateway.deleteExperiment(experimentId);\n }\n\n getVariant(id: string): Promise<VariantContentDto | null> {\n return this.gateway.getVariant(id);\n }\n\n saveVariant(revisionId: string, doc: Record<string, any>): Promise<VariantDto> {\n return this.gateway.updateVariant(revisionId, doc);\n }\n}\n\nexport const ExperimentsEditorPresenter = Abstraction.createImplementation({\n implementation: ExperimentsEditorPresenterImpl,\n dependencies: [ExperimentsGateway, ExperimentsEditorDataSource]\n});\n"],"names":["ExperimentsEditorPresenterImpl","gateway","dataSource","makeAutoObservable","computed","experiment","variant","split","bucketColor","index","options","option","pageRevisionId","list","runInAction","id","variantId","isReadOnly","running","token","experimentId","item","value","active","payload","variantSplit","created","input","variants","undefined","revisionId","doc","ExperimentsEditorPresenter","Abstraction","ExperimentsGateway","ExperimentsEditorDataSource"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ExperimentDto, VariantDto } from "../../../../features/experiments/index.js";
2
+ export interface IExperimentsEditorDataSource {
3
+ listExperiments(pageEntryId: string): Promise<ExperimentDto[]>;
4
+ listVariants(experimentId: string): Promise<VariantDto[]>;
5
+ getExperimentPaused(experimentEntryId: string): Promise<boolean>;
6
+ }
7
+ export declare const ExperimentsEditorDataSource: import("@webiny/di").Abstraction<IExperimentsEditorDataSource>;
8
+ export declare namespace ExperimentsEditorDataSource {
9
+ type Interface = IExperimentsEditorDataSource;
10
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/admin";
2
+ const ExperimentsEditorDataSource = createAbstraction("WebsiteBuilder/ExperimentsEditor/DataSource");
3
+ export { ExperimentsEditorDataSource };
4
+
5
+ //# sourceMappingURL=ExperimentsEditorDataSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorDataSource.js","sources":["../../../../../src/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorDataSource.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { ExperimentDto, VariantDto } from \"~/features/experiments/index.js\";\n\nexport interface IExperimentsEditorDataSource {\n // Load all experiments for a page (by its entry id).\n listExperiments(pageEntryId: string): Promise<ExperimentDto[]>;\n // Load the variants of a single experiment.\n listVariants(experimentId: string): Promise<VariantDto[]>;\n // Read the runtime kill-switch state for an experiment (keyed on its entryId).\n getExperimentPaused(experimentEntryId: string): Promise<boolean>;\n}\n\nexport const ExperimentsEditorDataSource = createAbstraction<IExperimentsEditorDataSource>(\n \"WebsiteBuilder/ExperimentsEditor/DataSource\"\n);\n\nexport namespace ExperimentsEditorDataSource {\n export type Interface = IExperimentsEditorDataSource;\n}\n"],"names":["ExperimentsEditorDataSource","createAbstraction"],"mappings":";AAYO,MAAMA,8BAA8BC,kBACvC"}