@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.
- package/BaseEditor/commandHandlers/CloneElement.d.ts +1 -0
- package/BaseEditor/commandHandlers/CloneElement.js +17 -0
- package/BaseEditor/commandHandlers/CloneElement.js.map +1 -0
- package/BaseEditor/commandHandlers/index.js +2 -1
- package/BaseEditor/commandHandlers/index.js.map +1 -1
- package/BaseEditor/commands.d.ts +3 -0
- package/BaseEditor/commands.js +2 -0
- package/BaseEditor/commands.js.map +1 -1
- package/BaseEditor/defaultConfig/Content/AddressBar/usePreviewLink.js +4 -1
- package/BaseEditor/defaultConfig/Content/AddressBar/usePreviewLink.js.map +1 -1
- package/BaseEditor/defaultConfig/Content/Preview/DropZoneManager.js.map +1 -1
- package/BaseEditor/defaultConfig/Content/Preview/Iframe.d.ts +2 -2
- package/BaseEditor/defaultConfig/Content/Preview/Overlays/ElementOverlays.d.ts +2 -2
- package/BaseEditor/defaultConfig/DefaultEditorConfig.js +9 -0
- package/BaseEditor/defaultConfig/DefaultEditorConfig.js.map +1 -1
- package/BaseEditor/defaultConfig/DocumentStateEditor/DocumentStateEditor.d.ts +2 -2
- package/BaseEditor/defaultConfig/ElementInputRenderers.js +4 -0
- package/BaseEditor/defaultConfig/ElementInputRenderers.js.map +1 -1
- package/BaseEditor/defaultConfig/Sidebar/ElementActions/CloneElementAction.d.ts +2 -0
- package/BaseEditor/defaultConfig/Sidebar/ElementActions/CloneElementAction.js +25 -0
- package/BaseEditor/defaultConfig/Sidebar/ElementActions/CloneElementAction.js.map +1 -0
- package/BaseEditor/defaultConfig/Sidebar/ElementActions/DeleteElementAction.d.ts +2 -0
- package/BaseEditor/defaultConfig/Sidebar/ElementActions/DeleteElementAction.js +26 -0
- package/BaseEditor/defaultConfig/Sidebar/ElementActions/DeleteElementAction.js.map +1 -0
- package/BaseEditor/defaultConfig/Sidebar/ElementPreview.js +12 -2
- package/BaseEditor/defaultConfig/Sidebar/ElementPreview.js.map +1 -1
- package/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementInputs.js +1 -6
- package/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementInputs.js.map +1 -1
- package/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementSettings.js +11 -2
- package/BaseEditor/defaultConfig/Sidebar/ElementSettings/ElementSettings.js.map +1 -1
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundColor.d.ts +6 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundImage.d.ts +6 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundPosition.d.ts +6 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Background/BackgroundScaling.d.ts +6 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderColor.d.ts +2 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderRadius.d.ts +2 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderStyle.d.ts +2 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Border/BorderWidth.d.ts +2 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Layout/Alignment.d.ts +6 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Layout/LengthWithUnitInput.d.ts +2 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/MarginPadding/Margin.d.ts +2 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/MarginPadding/Padding.d.ts +2 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/Groups/Visibility/Visibility.d.ts +2 -2
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/StyleProperties.js +7 -7
- package/BaseEditor/defaultConfig/Sidebar/StyleSettings/StyleProperties.js.map +1 -1
- package/BaseEditor/defaultConfig/Toolbar/Navigator/Navigator.d.ts +2 -2
- package/DocumentEditor/DocumentEditor.d.ts +14 -5
- package/DocumentEditor/DocumentEditor.js +10 -6
- package/DocumentEditor/DocumentEditor.js.map +1 -1
- package/DocumentEditor/StateInspector.d.ts +4 -2
- package/Extension.js +7 -1
- package/Extension.js.map +1 -1
- package/ecommerce/components/ResourcePage.d.ts +6 -2
- package/ecommerce/components/ResourcesList.d.ts +4 -4
- package/ecommerce/components/ResourcesPicker.d.ts +9 -4
- package/editorSdk/CommandBus.js.map +1 -1
- package/editorSdk/utils/$cloneElement.d.ts +2 -0
- package/editorSdk/utils/$cloneElement.js +112 -0
- package/editorSdk/utils/$cloneElement.js.map +1 -0
- package/editorSdk/utils/index.d.ts +1 -0
- package/editorSdk/utils/index.js +1 -0
- package/features/experiments/ExperimentsGateway.d.ts +30 -0
- package/features/experiments/ExperimentsGateway.js +326 -0
- package/features/experiments/ExperimentsGateway.js.map +1 -0
- package/features/experiments/abstractions.d.ts +25 -0
- package/features/experiments/abstractions.js +5 -0
- package/features/experiments/abstractions.js.map +1 -0
- package/features/experiments/feature.d.ts +3 -0
- package/features/experiments/feature.js +17 -0
- package/features/experiments/feature.js.map +1 -0
- package/features/experiments/index.d.ts +3 -0
- package/features/experiments/index.js +2 -0
- package/features/experiments/types.d.ts +61 -0
- package/features/experiments/types.js +0 -0
- package/inputRenderers/ColorPickerInput.d.ts +3 -0
- package/inputRenderers/ColorPickerInput.js +29 -0
- package/inputRenderers/ColorPickerInput.js.map +1 -0
- package/inputRenderers/FileInput.js +93 -8
- package/inputRenderers/FileInput.js.map +1 -1
- package/inputRenderers/LexicalInput/LexicalEditor.js +15 -8
- package/inputRenderers/LexicalInput/LexicalEditor.js.map +1 -1
- package/inputRenderers/LexicalInput/TypographyDropDown.js +3 -2
- package/inputRenderers/LexicalInput/TypographyDropDown.js.map +1 -1
- package/inputRenderers/LexicalInput/wbStaticToolbar.css +72 -103
- package/modules/AbTesting.d.ts +2 -0
- package/modules/AbTesting.js +19 -0
- package/modules/AbTesting.js.map +1 -0
- package/package.json +28 -28
- package/presentation/components/LanguageCodeTag.js +5 -4
- package/presentation/components/LanguageCodeTag.js.map +1 -1
- package/presentation/experiments/ExperimentForm/ExperimentFormPresenter.d.ts +30 -0
- package/presentation/experiments/ExperimentForm/ExperimentFormPresenter.js +202 -0
- package/presentation/experiments/ExperimentForm/ExperimentFormPresenter.js.map +1 -0
- package/presentation/experiments/ExperimentForm/abstractions/ExperimentFormPresenter.d.ts +65 -0
- package/presentation/experiments/ExperimentForm/abstractions/ExperimentFormPresenter.js +5 -0
- package/presentation/experiments/ExperimentForm/abstractions/ExperimentFormPresenter.js.map +1 -0
- package/presentation/experiments/ExperimentForm/components/ExperimentFormView.d.ts +12 -0
- package/presentation/experiments/ExperimentForm/components/ExperimentFormView.js +149 -0
- package/presentation/experiments/ExperimentForm/components/ExperimentFormView.js.map +1 -0
- package/presentation/experiments/ExperimentForm/components/VariantSplitRow.d.ts +17 -0
- package/presentation/experiments/ExperimentForm/components/VariantSplitRow.js +122 -0
- package/presentation/experiments/ExperimentForm/components/VariantSplitRow.js.map +1 -0
- package/presentation/experiments/ExperimentForm/feature.d.ts +3 -0
- package/presentation/experiments/ExperimentForm/feature.js +17 -0
- package/presentation/experiments/ExperimentForm/feature.js.map +1 -0
- package/presentation/experiments/ExperimentForm/index.d.ts +3 -0
- package/presentation/experiments/ExperimentForm/index.js +3 -0
- package/presentation/experiments/ExperimentsEditor/ExperimentsEditorDataSource.d.ts +18 -0
- package/presentation/experiments/ExperimentsEditor/ExperimentsEditorDataSource.js +25 -0
- package/presentation/experiments/ExperimentsEditor/ExperimentsEditorDataSource.js.map +1 -0
- package/presentation/experiments/ExperimentsEditor/ExperimentsEditorPresenter.d.ts +67 -0
- package/presentation/experiments/ExperimentsEditor/ExperimentsEditorPresenter.js +224 -0
- package/presentation/experiments/ExperimentsEditor/ExperimentsEditorPresenter.js.map +1 -0
- package/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorDataSource.d.ts +10 -0
- package/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorDataSource.js +5 -0
- package/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorDataSource.js.map +1 -0
- package/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorPresenter.d.ts +58 -0
- package/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorPresenter.js +5 -0
- package/presentation/experiments/ExperimentsEditor/abstractions/ExperimentsEditorPresenter.js.map +1 -0
- package/presentation/experiments/ExperimentsEditor/components/ExperimentIndicator.d.ts +15 -0
- package/presentation/experiments/ExperimentsEditor/components/ExperimentIndicator.js +110 -0
- package/presentation/experiments/ExperimentsEditor/components/ExperimentIndicator.js.map +1 -0
- package/presentation/experiments/ExperimentsEditor/components/ExperimentPreviewToolbar.d.ts +9 -0
- package/presentation/experiments/ExperimentsEditor/components/ExperimentPreviewToolbar.js +178 -0
- package/presentation/experiments/ExperimentsEditor/components/ExperimentPreviewToolbar.js.map +1 -0
- package/presentation/experiments/ExperimentsEditor/components/ExperimentsButton.d.ts +11 -0
- package/presentation/experiments/ExperimentsEditor/components/ExperimentsButton.js +51 -0
- package/presentation/experiments/ExperimentsEditor/components/ExperimentsButton.js.map +1 -0
- package/presentation/experiments/ExperimentsEditor/components/ExperimentsSwitcher.d.ts +14 -0
- package/presentation/experiments/ExperimentsEditor/components/ExperimentsSwitcher.js +147 -0
- package/presentation/experiments/ExperimentsEditor/components/ExperimentsSwitcher.js.map +1 -0
- package/presentation/experiments/ExperimentsEditor/feature.d.ts +3 -0
- package/presentation/experiments/ExperimentsEditor/feature.js +21 -0
- package/presentation/experiments/ExperimentsEditor/feature.js.map +1 -0
- package/presentation/experiments/ExperimentsEditor/index.d.ts +4 -0
- package/presentation/experiments/ExperimentsEditor/index.js +3 -0
- package/presentation/experiments/ExperimentsManager/ExperimentsManagerPresenter.d.ts +39 -0
- package/presentation/experiments/ExperimentsManager/ExperimentsManagerPresenter.js +219 -0
- package/presentation/experiments/ExperimentsManager/ExperimentsManagerPresenter.js.map +1 -0
- package/presentation/experiments/ExperimentsManager/abstractions/ExperimentsManagerPresenter.d.ts +52 -0
- package/presentation/experiments/ExperimentsManager/abstractions/ExperimentsManagerPresenter.js +5 -0
- package/presentation/experiments/ExperimentsManager/abstractions/ExperimentsManagerPresenter.js.map +1 -0
- package/presentation/experiments/ExperimentsManager/components/ExperimentCard.d.ts +10 -0
- package/presentation/experiments/ExperimentsManager/components/ExperimentCard.js +296 -0
- package/presentation/experiments/ExperimentsManager/components/ExperimentCard.js.map +1 -0
- package/presentation/experiments/ExperimentsManager/components/ExperimentsDrawerView.d.ts +2 -0
- package/presentation/experiments/ExperimentsManager/components/ExperimentsDrawerView.js +92 -0
- package/presentation/experiments/ExperimentsManager/components/ExperimentsDrawerView.js.map +1 -0
- package/presentation/experiments/ExperimentsManager/components/ExperimentsEmptyState.d.ts +6 -0
- package/presentation/experiments/ExperimentsManager/components/ExperimentsEmptyState.js +103 -0
- package/presentation/experiments/ExperimentsManager/components/ExperimentsEmptyState.js.map +1 -0
- package/presentation/experiments/ExperimentsManager/components/ExperimentsListView.d.ts +9 -0
- package/presentation/experiments/ExperimentsManager/components/ExperimentsListView.js +58 -0
- package/presentation/experiments/ExperimentsManager/components/ExperimentsListView.js.map +1 -0
- package/presentation/experiments/ExperimentsManager/feature.d.ts +3 -0
- package/presentation/experiments/ExperimentsManager/feature.js +17 -0
- package/presentation/experiments/ExperimentsManager/feature.js.map +1 -0
- package/presentation/experiments/ExperimentsManager/index.d.ts +4 -0
- package/presentation/experiments/ExperimentsManager/index.js +3 -0
- package/presentation/experiments/VariantPageEditorConfig.d.ts +7 -0
- package/presentation/experiments/VariantPageEditorConfig.js +26 -0
- package/presentation/experiments/VariantPageEditorConfig.js.map +1 -0
- package/presentation/experiments/config/ExperimentsEditorConfig.d.ts +8 -0
- package/presentation/experiments/config/ExperimentsEditorConfig.js +21 -0
- package/presentation/experiments/config/ExperimentsEditorConfig.js.map +1 -0
- package/presentation/experiments/config/VariantAutoSave.d.ts +5 -0
- package/presentation/experiments/config/VariantAutoSave.js +41 -0
- package/presentation/experiments/config/VariantAutoSave.js.map +1 -0
- package/presentation/experiments/shared/variantColors.d.ts +11 -0
- package/presentation/experiments/shared/variantColors.js +13 -0
- package/presentation/experiments/shared/variantColors.js.map +1 -0
- package/presentation/experiments/shared/variantDocument.d.ts +16 -0
- package/presentation/experiments/shared/variantDocument.js +31 -0
- package/presentation/experiments/shared/variantDocument.js.map +1 -0
- package/presentation/navigation/Extension.js +9 -5
- package/presentation/navigation/Extension.js.map +1 -1
- package/presentation/navigation/NextjsConfig/NextjsConfigDialog.d.ts +2 -2
- package/presentation/navigation/StarterKitConfigDialog.js +1 -1
- package/presentation/navigation/StarterKitConfigDialog.js.map +1 -1
- package/presentation/pages/CreatePage/CreatePageDialog.d.ts +2 -2
- package/presentation/pages/CreatePage/CreatePagePresenter.js +1 -1
- package/presentation/pages/CreatePage/CreatePagePresenter.js.map +1 -1
- package/presentation/pages/CreatePage/WithLanguageSelector.js +3 -3
- package/presentation/pages/CreatePage/WithLanguageSelector.js.map +1 -1
- package/presentation/pages/CreatePage/feature.js +3 -3
- package/presentation/pages/CreatePage/feature.js.map +1 -1
- package/presentation/pages/PageEditor/PageEditor.experiments.d.ts +2 -0
- package/presentation/pages/PageEditor/PageEditor.experiments.js +54 -0
- package/presentation/pages/PageEditor/PageEditor.experiments.js.map +1 -0
- package/presentation/pages/PageEditor/PageEditorSurface.d.ts +15 -0
- package/presentation/pages/PageEditor/PageEditorSurface.js +63 -0
- package/presentation/pages/PageEditor/PageEditorSurface.js.map +1 -0
- package/presentation/pages/PageEditor/TopBar/PageSettingsDrawer.d.ts +2 -2
- package/presentation/pages/PageEditor/pageDocument.d.ts +4 -0
- package/presentation/pages/PageEditor/pageDocument.js +15 -0
- package/presentation/pages/PageEditor/pageDocument.js.map +1 -0
- package/presentation/pages/PageList/components/BulkActions/BulkActionDelete.d.ts +2 -2
- package/presentation/pages/PageList/components/BulkActions/BulkActionDuplicate.d.ts +2 -2
- package/presentation/pages/PageList/components/BulkActions/BulkActionMovePage.d.ts +2 -2
- package/presentation/pages/PageList/components/BulkActions/BulkActionPublish.d.ts +2 -2
- package/presentation/pages/PageList/components/BulkActions/BulkActionUnpublish.d.ts +2 -2
- package/presentation/pages/PageList/components/DocumentList.d.ts +2 -2
- package/presentation/pages/PageList/components/PagesList.js +2 -1
- package/presentation/pages/PageList/components/PagesList.js.map +1 -1
- package/presentation/pages/PageList/components/Table/Table.d.ts +2 -2
- package/presentation/pages/PageList/components/WbPagesBreadcrumbs.d.ts +9 -0
- package/presentation/pages/PageList/components/WbPagesBreadcrumbs.js +40 -0
- package/presentation/pages/PageList/components/WbPagesBreadcrumbs.js.map +1 -0
- package/presentation/pages/TranslatePage/TranslatePageConfig.d.ts +1 -1
- package/presentation/pages/TranslatePage/TranslatePageConfig.js +6 -2
- package/presentation/pages/TranslatePage/TranslatePageConfig.js.map +1 -1
- package/presentation/pages/TranslatePage/TranslatePageDialog.js +22 -10
- package/presentation/pages/TranslatePage/TranslatePageDialog.js.map +1 -1
- package/presentation/pages/TranslatePage/translatePageSchema.d.ts +1 -1
- package/presentation/pages/TranslatePage/translatePageSchema.js +1 -1
- package/presentation/pages/TranslatePage/translatePageSchema.js.map +1 -1
- package/presentation/pages/TrashBin/WbTrashBin.d.ts +2 -2
- package/presentation/redirects/RedirectList/components/BulkActionDelete.d.ts +2 -2
- package/presentation/redirects/RedirectList/components/BulkActionMove.d.ts +2 -2
- package/presentation/redirects/RedirectList/components/CreateRedirectDialog.d.ts +2 -2
- package/presentation/redirects/RedirectList/components/DocumentList.d.ts +2 -2
- package/presentation/redirects/RedirectList/components/EditRedirectDialog.d.ts +2 -2
- package/presentation/redirects/RedirectList/components/Table/Table.d.ts +2 -2
- package/shared/fileManagerItemToValue.d.ts +8 -9
- package/shared/fileManagerItemToValue.js +22 -7
- package/shared/fileManagerItemToValue.js.map +1 -1
- package/inputRenderers/LexicalInput/icons/list-ol.js +0 -20
- package/inputRenderers/LexicalInput/icons/list-ol.js.map +0 -1
- package/inputRenderers/LexicalInput/icons/list-ol.svg +0 -1
- package/inputRenderers/LexicalInput/icons/list-ul.js +0 -18
- package/inputRenderers/LexicalInput/icons/list-ul.js.map +0 -1
- package/inputRenderers/LexicalInput/icons/list-ul.svg +0 -1
- package/static/svg/list-ol.d64946f3.svg +0 -1
- package/static/svg/list-ul.1d54da3f.svg +0 -1
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { observer } from "mobx-react-lite";
|
|
3
|
+
import { Button, Text } from "@webiny/admin-ui";
|
|
4
|
+
import { useConfirmationDialog, useSnackbar } from "@webiny/app-admin";
|
|
5
|
+
import { ReactComponent } from "@webiny/icons/play_arrow.svg";
|
|
6
|
+
import { ReactComponent as pause_svg_ReactComponent } from "@webiny/icons/pause.svg";
|
|
7
|
+
import { ReactComponent as edit_svg_ReactComponent } from "@webiny/icons/edit.svg";
|
|
8
|
+
import { ReactComponent as delete_svg_ReactComponent } from "@webiny/icons/delete.svg";
|
|
9
|
+
const Dot = ({ color })=>/*#__PURE__*/ react.createElement("span", {
|
|
10
|
+
style: {
|
|
11
|
+
width: 8,
|
|
12
|
+
height: 8,
|
|
13
|
+
borderRadius: "50%",
|
|
14
|
+
background: color,
|
|
15
|
+
flexShrink: 0
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const Thumbnail = ({ band })=>/*#__PURE__*/ react.createElement("div", {
|
|
19
|
+
style: {
|
|
20
|
+
border: "1px solid #e5e7eb",
|
|
21
|
+
borderRadius: 6,
|
|
22
|
+
overflow: "hidden",
|
|
23
|
+
background: "#fff"
|
|
24
|
+
}
|
|
25
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
26
|
+
style: {
|
|
27
|
+
height: 18,
|
|
28
|
+
background: "#000"
|
|
29
|
+
}
|
|
30
|
+
}), /*#__PURE__*/ react.createElement("div", {
|
|
31
|
+
style: {
|
|
32
|
+
padding: "8px 8px 0"
|
|
33
|
+
}
|
|
34
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
35
|
+
style: {
|
|
36
|
+
height: 4,
|
|
37
|
+
borderRadius: 2,
|
|
38
|
+
background: "#e5e7eb",
|
|
39
|
+
width: "70%"
|
|
40
|
+
}
|
|
41
|
+
}), /*#__PURE__*/ react.createElement("div", {
|
|
42
|
+
style: {
|
|
43
|
+
height: 4,
|
|
44
|
+
borderRadius: 2,
|
|
45
|
+
background: "#eef0f2",
|
|
46
|
+
width: "45%",
|
|
47
|
+
marginTop: 4
|
|
48
|
+
}
|
|
49
|
+
})), /*#__PURE__*/ react.createElement("div", {
|
|
50
|
+
style: {
|
|
51
|
+
height: 14,
|
|
52
|
+
background: band,
|
|
53
|
+
marginTop: 8
|
|
54
|
+
}
|
|
55
|
+
}));
|
|
56
|
+
const ExperimentCard_ExperimentCard = observer(function({ presenter, card }) {
|
|
57
|
+
const { experiment, active, buckets, variantCount } = card;
|
|
58
|
+
const { showSnackbar } = useSnackbar();
|
|
59
|
+
const { showConfirmation } = useConfirmationDialog({
|
|
60
|
+
title: "Delete experiment",
|
|
61
|
+
loading: "Deleting experiment...",
|
|
62
|
+
message: /*#__PURE__*/ react.createElement(Text, null, "You are about to permanently delete this experiment and all of its variants. This cannot be undone.")
|
|
63
|
+
});
|
|
64
|
+
const activate = async ()=>{
|
|
65
|
+
try {
|
|
66
|
+
await presenter.activateExperiment(experiment);
|
|
67
|
+
showSnackbar(`"${experiment.name}" is now active.`);
|
|
68
|
+
} catch (ex) {
|
|
69
|
+
showSnackbar(ex.message || "Could not activate the experiment.");
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const deactivate = async ()=>{
|
|
73
|
+
try {
|
|
74
|
+
await presenter.deactivateExperiment(experiment);
|
|
75
|
+
showSnackbar(`"${experiment.name}" was deactivated.`);
|
|
76
|
+
} catch (ex) {
|
|
77
|
+
showSnackbar(ex.message || "Could not deactivate the experiment.");
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const remove = ()=>showConfirmation(async ()=>{
|
|
81
|
+
try {
|
|
82
|
+
await presenter.deleteExperiment(experiment);
|
|
83
|
+
showSnackbar(`"${experiment.name}" was deleted.`);
|
|
84
|
+
} catch (ex) {
|
|
85
|
+
showSnackbar(ex.message || "Could not delete the experiment.");
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
89
|
+
style: {
|
|
90
|
+
border: active ? "1px solid #b7e4c7" : "1px solid #e5e7eb",
|
|
91
|
+
background: active ? "#f4fbf6" : "#fff",
|
|
92
|
+
borderRadius: 12,
|
|
93
|
+
padding: 16,
|
|
94
|
+
marginBottom: 16
|
|
95
|
+
}
|
|
96
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
97
|
+
style: {
|
|
98
|
+
display: "flex",
|
|
99
|
+
alignItems: "flex-start",
|
|
100
|
+
justifyContent: "space-between",
|
|
101
|
+
gap: 8
|
|
102
|
+
}
|
|
103
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
104
|
+
style: {
|
|
105
|
+
minWidth: 0
|
|
106
|
+
}
|
|
107
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
108
|
+
style: {
|
|
109
|
+
display: "flex",
|
|
110
|
+
alignItems: "center",
|
|
111
|
+
gap: 10
|
|
112
|
+
}
|
|
113
|
+
}, /*#__PURE__*/ react.createElement("span", {
|
|
114
|
+
style: {
|
|
115
|
+
fontWeight: 600,
|
|
116
|
+
fontSize: 15,
|
|
117
|
+
whiteSpace: "nowrap",
|
|
118
|
+
overflow: "hidden",
|
|
119
|
+
textOverflow: "ellipsis"
|
|
120
|
+
}
|
|
121
|
+
}, experiment.name), /*#__PURE__*/ react.createElement("span", {
|
|
122
|
+
style: {
|
|
123
|
+
display: "inline-flex",
|
|
124
|
+
alignItems: "center",
|
|
125
|
+
gap: 5,
|
|
126
|
+
fontSize: 12,
|
|
127
|
+
fontWeight: 500,
|
|
128
|
+
color: active ? "#0f9d58" : "#6b7280",
|
|
129
|
+
background: active ? "transparent" : "#f2f2f2",
|
|
130
|
+
borderRadius: 6,
|
|
131
|
+
padding: active ? 0 : "1px 8px",
|
|
132
|
+
whiteSpace: "nowrap"
|
|
133
|
+
}
|
|
134
|
+
}, active ? /*#__PURE__*/ react.createElement(Dot, {
|
|
135
|
+
color: "#10b981"
|
|
136
|
+
}) : null, active ? "Active" : "Inactive")), /*#__PURE__*/ react.createElement("div", {
|
|
137
|
+
style: {
|
|
138
|
+
fontSize: 13,
|
|
139
|
+
color: "#6b7280",
|
|
140
|
+
marginTop: 4
|
|
141
|
+
}
|
|
142
|
+
}, variantCount, " variant", 1 === variantCount ? "" : "s", " \xb7 splitting traffic")), active ? /*#__PURE__*/ react.createElement(Button, {
|
|
143
|
+
variant: "secondary",
|
|
144
|
+
icon: /*#__PURE__*/ react.createElement(pause_svg_ReactComponent, null),
|
|
145
|
+
text: "Deactivate",
|
|
146
|
+
onClick: deactivate
|
|
147
|
+
}) : /*#__PURE__*/ react.createElement("button", {
|
|
148
|
+
type: "button",
|
|
149
|
+
onClick: activate,
|
|
150
|
+
style: {
|
|
151
|
+
display: "inline-flex",
|
|
152
|
+
alignItems: "center",
|
|
153
|
+
gap: 6,
|
|
154
|
+
border: "none",
|
|
155
|
+
background: "#10b981",
|
|
156
|
+
color: "#fff",
|
|
157
|
+
borderRadius: 8,
|
|
158
|
+
padding: "7px 14px",
|
|
159
|
+
fontWeight: 600,
|
|
160
|
+
fontSize: 13,
|
|
161
|
+
cursor: "pointer",
|
|
162
|
+
whiteSpace: "nowrap"
|
|
163
|
+
}
|
|
164
|
+
}, /*#__PURE__*/ react.createElement(ReactComponent, {
|
|
165
|
+
style: {
|
|
166
|
+
width: 18,
|
|
167
|
+
height: 18,
|
|
168
|
+
fill: "currentColor"
|
|
169
|
+
}
|
|
170
|
+
}), "Activate")), /*#__PURE__*/ react.createElement("div", {
|
|
171
|
+
style: {
|
|
172
|
+
display: "grid",
|
|
173
|
+
gridTemplateColumns: `repeat(${buckets.length}, 1fr)`,
|
|
174
|
+
gap: 10,
|
|
175
|
+
marginTop: 16
|
|
176
|
+
}
|
|
177
|
+
}, buckets.map((bucket)=>/*#__PURE__*/ react.createElement("div", {
|
|
178
|
+
key: bucket.key
|
|
179
|
+
}, /*#__PURE__*/ react.createElement(Thumbnail, {
|
|
180
|
+
band: bucket.band
|
|
181
|
+
}), /*#__PURE__*/ react.createElement("div", {
|
|
182
|
+
style: {
|
|
183
|
+
display: "flex",
|
|
184
|
+
alignItems: "center",
|
|
185
|
+
justifyContent: "space-between",
|
|
186
|
+
gap: 6,
|
|
187
|
+
marginTop: 8
|
|
188
|
+
}
|
|
189
|
+
}, /*#__PURE__*/ react.createElement("span", {
|
|
190
|
+
style: {
|
|
191
|
+
display: "flex",
|
|
192
|
+
alignItems: "center",
|
|
193
|
+
gap: 6,
|
|
194
|
+
minWidth: 0
|
|
195
|
+
}
|
|
196
|
+
}, /*#__PURE__*/ react.createElement(Dot, {
|
|
197
|
+
color: bucket.dot
|
|
198
|
+
}), /*#__PURE__*/ react.createElement("span", {
|
|
199
|
+
style: {
|
|
200
|
+
fontSize: 13,
|
|
201
|
+
fontWeight: 600,
|
|
202
|
+
whiteSpace: "nowrap",
|
|
203
|
+
overflow: "hidden",
|
|
204
|
+
textOverflow: "ellipsis"
|
|
205
|
+
}
|
|
206
|
+
}, bucket.name)), /*#__PURE__*/ react.createElement("span", {
|
|
207
|
+
style: {
|
|
208
|
+
fontSize: 13,
|
|
209
|
+
color: "#6b7280"
|
|
210
|
+
}
|
|
211
|
+
}, bucket.weight, "%"))))), /*#__PURE__*/ react.createElement("div", {
|
|
212
|
+
style: {
|
|
213
|
+
display: "flex",
|
|
214
|
+
height: 8,
|
|
215
|
+
borderRadius: 4,
|
|
216
|
+
overflow: "hidden",
|
|
217
|
+
marginTop: 16,
|
|
218
|
+
background: "#eef0f2"
|
|
219
|
+
}
|
|
220
|
+
}, buckets.map((bucket)=>/*#__PURE__*/ react.createElement("div", {
|
|
221
|
+
key: bucket.key,
|
|
222
|
+
style: {
|
|
223
|
+
width: `${bucket.weight}%`,
|
|
224
|
+
background: bucket.dot
|
|
225
|
+
}
|
|
226
|
+
}))), /*#__PURE__*/ react.createElement("div", {
|
|
227
|
+
style: {
|
|
228
|
+
display: "flex",
|
|
229
|
+
flexWrap: "wrap",
|
|
230
|
+
alignItems: "center",
|
|
231
|
+
gap: 16,
|
|
232
|
+
marginTop: 12
|
|
233
|
+
}
|
|
234
|
+
}, buckets.map((bucket)=>/*#__PURE__*/ react.createElement("span", {
|
|
235
|
+
key: bucket.key,
|
|
236
|
+
style: {
|
|
237
|
+
display: "flex",
|
|
238
|
+
alignItems: "center",
|
|
239
|
+
gap: 6,
|
|
240
|
+
fontSize: 13
|
|
241
|
+
}
|
|
242
|
+
}, /*#__PURE__*/ react.createElement(Dot, {
|
|
243
|
+
color: bucket.dot
|
|
244
|
+
}), /*#__PURE__*/ react.createElement("span", {
|
|
245
|
+
style: {
|
|
246
|
+
color: "#374151"
|
|
247
|
+
}
|
|
248
|
+
}, bucket.name), /*#__PURE__*/ react.createElement("span", {
|
|
249
|
+
style: {
|
|
250
|
+
color: "#9ca3af"
|
|
251
|
+
}
|
|
252
|
+
}, "\xb7"), /*#__PURE__*/ react.createElement("span", {
|
|
253
|
+
style: {
|
|
254
|
+
fontWeight: 600
|
|
255
|
+
}
|
|
256
|
+
}, bucket.weight, "%")))), /*#__PURE__*/ react.createElement("div", {
|
|
257
|
+
style: {
|
|
258
|
+
display: "flex",
|
|
259
|
+
alignItems: "center",
|
|
260
|
+
justifyContent: "space-between",
|
|
261
|
+
marginTop: 16,
|
|
262
|
+
paddingTop: 14,
|
|
263
|
+
borderTop: "1px solid #eef0f2"
|
|
264
|
+
}
|
|
265
|
+
}, /*#__PURE__*/ react.createElement(Button, {
|
|
266
|
+
variant: "secondary",
|
|
267
|
+
icon: /*#__PURE__*/ react.createElement(edit_svg_ReactComponent, null),
|
|
268
|
+
text: "Edit",
|
|
269
|
+
onClick: ()=>presenter.startEdit(experiment)
|
|
270
|
+
}), /*#__PURE__*/ react.createElement("button", {
|
|
271
|
+
type: "button",
|
|
272
|
+
onClick: remove,
|
|
273
|
+
style: {
|
|
274
|
+
display: "inline-flex",
|
|
275
|
+
alignItems: "center",
|
|
276
|
+
gap: 6,
|
|
277
|
+
border: "1px solid #f0d0cb",
|
|
278
|
+
background: "#fff",
|
|
279
|
+
color: "#d93025",
|
|
280
|
+
borderRadius: 8,
|
|
281
|
+
padding: "7px 14px",
|
|
282
|
+
fontWeight: 600,
|
|
283
|
+
fontSize: 13,
|
|
284
|
+
cursor: "pointer"
|
|
285
|
+
}
|
|
286
|
+
}, /*#__PURE__*/ react.createElement(delete_svg_ReactComponent, {
|
|
287
|
+
style: {
|
|
288
|
+
width: 18,
|
|
289
|
+
height: 18,
|
|
290
|
+
fill: "currentColor"
|
|
291
|
+
}
|
|
292
|
+
}), "Delete")));
|
|
293
|
+
});
|
|
294
|
+
export { ExperimentCard_ExperimentCard as ExperimentCard };
|
|
295
|
+
|
|
296
|
+
//# sourceMappingURL=ExperimentCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/experiments/ExperimentsManager/components/ExperimentCard.js","sources":["../../../../../src/presentation/experiments/ExperimentsManager/components/ExperimentCard.tsx"],"sourcesContent":["import React from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Button, Text } from \"@webiny/admin-ui\";\nimport { useConfirmationDialog, useSnackbar } from \"@webiny/app-admin\";\nimport { ReactComponent as PlayIcon } from \"@webiny/icons/play_arrow.svg\";\nimport { ReactComponent as PauseIcon } from \"@webiny/icons/pause.svg\";\nimport { ReactComponent as EditIcon } from \"@webiny/icons/edit.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete.svg\";\nimport type {\n ExperimentCardViewModel,\n IExperimentsManagerPresenter\n} from \"../abstractions/ExperimentsManagerPresenter.js\";\n\ninterface Props {\n presenter: IExperimentsManagerPresenter;\n card: ExperimentCardViewModel;\n}\n\nconst Dot = ({ color }: { color: string }) => (\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: color, flexShrink: 0 }} />\n);\n\n/** A single page thumbnail — a black header, a couple of placeholder lines and a coloured band. */\nconst Thumbnail = ({ band }: { band: string }) => (\n <div\n style={{\n border: \"1px solid #e5e7eb\",\n borderRadius: 6,\n overflow: \"hidden\",\n background: \"#fff\"\n }}\n >\n <div style={{ height: 18, background: \"#000\" }} />\n <div style={{ padding: \"8px 8px 0\" }}>\n <div style={{ height: 4, borderRadius: 2, background: \"#e5e7eb\", width: \"70%\" }} />\n <div\n style={{\n height: 4,\n borderRadius: 2,\n background: \"#eef0f2\",\n width: \"45%\",\n marginTop: 4\n }}\n />\n </div>\n <div style={{ height: 14, background: band, marginTop: 8 }} />\n </div>\n);\n\nexport const ExperimentCard = observer(function ExperimentCard({ presenter, card }: Props) {\n const { experiment, active, buckets, variantCount } = card;\n const { showSnackbar } = useSnackbar();\n const { showConfirmation } = useConfirmationDialog({\n title: \"Delete experiment\",\n loading: \"Deleting experiment...\",\n message: (\n <Text>\n You are about to permanently delete this experiment and all of its variants. This\n cannot be undone.\n </Text>\n )\n });\n\n const activate = async () => {\n try {\n await presenter.activateExperiment(experiment);\n showSnackbar(`\"${experiment.name}\" is now active.`);\n } catch (ex: any) {\n showSnackbar(ex.message || \"Could not activate the experiment.\");\n }\n };\n\n const deactivate = async () => {\n try {\n await presenter.deactivateExperiment(experiment);\n showSnackbar(`\"${experiment.name}\" was deactivated.`);\n } catch (ex: any) {\n showSnackbar(ex.message || \"Could not deactivate the experiment.\");\n }\n };\n\n const remove = () =>\n showConfirmation(async () => {\n try {\n await presenter.deleteExperiment(experiment);\n showSnackbar(`\"${experiment.name}\" was deleted.`);\n } catch (ex: any) {\n showSnackbar(ex.message || \"Could not delete the experiment.\");\n }\n });\n\n return (\n <div\n style={{\n border: active ? \"1px solid #b7e4c7\" : \"1px solid #e5e7eb\",\n background: active ? \"#f4fbf6\" : \"#fff\",\n borderRadius: 12,\n padding: 16,\n marginBottom: 16\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n gap: 8\n }}\n >\n <div style={{ minWidth: 0 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n <span\n style={{\n fontWeight: 600,\n fontSize: 15,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\"\n }}\n >\n {experiment.name}\n </span>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 5,\n fontSize: 12,\n fontWeight: 500,\n color: active ? \"#0f9d58\" : \"#6b7280\",\n background: active ? \"transparent\" : \"#f2f2f2\",\n borderRadius: 6,\n padding: active ? 0 : \"1px 8px\",\n whiteSpace: \"nowrap\"\n }}\n >\n {active ? <Dot color=\"#10b981\" /> : null}\n {active ? \"Active\" : \"Inactive\"}\n </span>\n </div>\n <div style={{ fontSize: 13, color: \"#6b7280\", marginTop: 4 }}>\n {variantCount} variant{variantCount === 1 ? \"\" : \"s\"} · splitting traffic\n </div>\n </div>\n {active ? (\n <Button\n variant=\"secondary\"\n icon={<PauseIcon />}\n text=\"Deactivate\"\n onClick={deactivate}\n />\n ) : (\n <button\n type=\"button\"\n onClick={activate}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n border: \"none\",\n background: \"#10b981\",\n color: \"#fff\",\n borderRadius: 8,\n padding: \"7px 14px\",\n fontWeight: 600,\n fontSize: 13,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\"\n }}\n >\n <PlayIcon style={{ width: 18, height: 18, fill: \"currentColor\" }} />\n Activate\n </button>\n )}\n </div>\n\n {/* Thumbnails */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: `repeat(${buckets.length}, 1fr)`,\n gap: 10,\n marginTop: 16\n }}\n >\n {buckets.map(bucket => (\n <div key={bucket.key}>\n <Thumbnail band={bucket.band} />\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 6,\n marginTop: 8\n }}\n >\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n minWidth: 0\n }}\n >\n <Dot color={bucket.dot} />\n <span\n style={{\n fontSize: 13,\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\"\n }}\n >\n {bucket.name}\n </span>\n </span>\n <span style={{ fontSize: 13, color: \"#6b7280\" }}>{bucket.weight}%</span>\n </div>\n </div>\n ))}\n </div>\n\n {/* Traffic bar */}\n <div\n style={{\n display: \"flex\",\n height: 8,\n borderRadius: 4,\n overflow: \"hidden\",\n marginTop: 16,\n background: \"#eef0f2\"\n }}\n >\n {buckets.map(bucket => (\n <div\n key={bucket.key}\n style={{ width: `${bucket.weight}%`, background: bucket.dot }}\n />\n ))}\n </div>\n\n {/* Legend */}\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: 16,\n marginTop: 12\n }}\n >\n {buckets.map(bucket => (\n <span\n key={bucket.key}\n style={{ display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 13 }}\n >\n <Dot color={bucket.dot} />\n <span style={{ color: \"#374151\" }}>{bucket.name}</span>\n <span style={{ color: \"#9ca3af\" }}>·</span>\n <span style={{ fontWeight: 600 }}>{bucket.weight}%</span>\n </span>\n ))}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginTop: 16,\n paddingTop: 14,\n borderTop: \"1px solid #eef0f2\"\n }}\n >\n <Button\n variant=\"secondary\"\n icon={<EditIcon />}\n text=\"Edit\"\n onClick={() => presenter.startEdit(experiment)}\n />\n <button\n type=\"button\"\n onClick={remove}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n border: \"1px solid #f0d0cb\",\n background: \"#fff\",\n color: \"#d93025\",\n borderRadius: 8,\n padding: \"7px 14px\",\n fontWeight: 600,\n fontSize: 13,\n cursor: \"pointer\"\n }}\n >\n <DeleteIcon style={{ width: 18, height: 18, fill: \"currentColor\" }} />\n Delete\n </button>\n </div>\n </div>\n );\n});\n"],"names":["Dot","color","Thumbnail","band","ExperimentCard","observer","presenter","card","experiment","active","buckets","variantCount","showSnackbar","useSnackbar","showConfirmation","useConfirmationDialog","Text","activate","ex","deactivate","remove","Button","PauseIcon","PlayIcon","bucket","EditIcon","DeleteIcon"],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import react, { useEffect, useMemo } from "react";
|
|
2
|
+
import { observer } from "mobx-react-lite";
|
|
3
|
+
import { DiContainerProvider, useContainer, useFeature } from "@webiny/app";
|
|
4
|
+
import { Drawer, IconButton } from "@webiny/admin-ui";
|
|
5
|
+
import { ReactComponent } from "@webiny/icons/science.svg";
|
|
6
|
+
import { ReactComponent as arrow_back_svg_ReactComponent } from "@webiny/icons/arrow_back.svg";
|
|
7
|
+
import { ExperimentFormView } from "../../ExperimentForm/index.js";
|
|
8
|
+
import { ExperimentsManagerPresenterFeature } from "../feature.js";
|
|
9
|
+
import { ExperimentsListView } from "./ExperimentsListView.js";
|
|
10
|
+
const ExperimentsDrawerView_ExperimentsDrawerViewInner = observer(function() {
|
|
11
|
+
const { presenter } = useFeature(ExperimentsManagerPresenterFeature);
|
|
12
|
+
useEffect(()=>{
|
|
13
|
+
presenter.init();
|
|
14
|
+
return ()=>presenter.dispose();
|
|
15
|
+
}, [
|
|
16
|
+
presenter
|
|
17
|
+
]);
|
|
18
|
+
const { open, view, editInitial } = presenter.vm;
|
|
19
|
+
const flask = /*#__PURE__*/ react.createElement(ReactComponent, {
|
|
20
|
+
style: {
|
|
21
|
+
width: 20,
|
|
22
|
+
height: 20
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
const back = /*#__PURE__*/ react.createElement(IconButton, {
|
|
26
|
+
variant: "ghost",
|
|
27
|
+
size: "sm",
|
|
28
|
+
icon: /*#__PURE__*/ react.createElement(arrow_back_svg_ReactComponent, {
|
|
29
|
+
style: {
|
|
30
|
+
width: 18,
|
|
31
|
+
height: 18
|
|
32
|
+
}
|
|
33
|
+
}),
|
|
34
|
+
onClick: ()=>presenter.showList()
|
|
35
|
+
});
|
|
36
|
+
let title;
|
|
37
|
+
title = "create" === view ? /*#__PURE__*/ react.createElement("span", {
|
|
38
|
+
style: {
|
|
39
|
+
display: "flex",
|
|
40
|
+
alignItems: "center",
|
|
41
|
+
gap: 8
|
|
42
|
+
}
|
|
43
|
+
}, back, flask, "New experiment") : "edit" === view ? /*#__PURE__*/ react.createElement("span", {
|
|
44
|
+
style: {
|
|
45
|
+
display: "flex",
|
|
46
|
+
alignItems: "center",
|
|
47
|
+
gap: 8
|
|
48
|
+
}
|
|
49
|
+
}, back, flask, "Edit experiment") : /*#__PURE__*/ react.createElement("span", {
|
|
50
|
+
style: {
|
|
51
|
+
display: "flex",
|
|
52
|
+
alignItems: "center",
|
|
53
|
+
gap: 8
|
|
54
|
+
}
|
|
55
|
+
}, flask, "Experiments");
|
|
56
|
+
return /*#__PURE__*/ react.createElement(Drawer, {
|
|
57
|
+
open: open,
|
|
58
|
+
onClose: ()=>presenter.close(),
|
|
59
|
+
modal: true,
|
|
60
|
+
width: 520,
|
|
61
|
+
title: title,
|
|
62
|
+
headerSeparator: true,
|
|
63
|
+
bodyPadding: false,
|
|
64
|
+
className: "flex flex-col"
|
|
65
|
+
}, "list" === view ? /*#__PURE__*/ react.createElement(ExperimentsListView, {
|
|
66
|
+
presenter: presenter
|
|
67
|
+
}) : null, "create" === view ? /*#__PURE__*/ react.createElement(ExperimentFormView, {
|
|
68
|
+
onCancel: ()=>presenter.showList(),
|
|
69
|
+
onSubmit: (payload)=>presenter.createExperiment(payload),
|
|
70
|
+
submitLabel: "Create experiment"
|
|
71
|
+
}) : null, "edit" === view && editInitial ? /*#__PURE__*/ react.createElement(ExperimentFormView, {
|
|
72
|
+
initial: editInitial,
|
|
73
|
+
allowStructureChange: false,
|
|
74
|
+
submitLabel: "Save changes",
|
|
75
|
+
onCancel: ()=>presenter.showList(),
|
|
76
|
+
onSubmit: (payload)=>presenter.updateExperiment(payload)
|
|
77
|
+
}) : null);
|
|
78
|
+
});
|
|
79
|
+
const ExperimentsDrawerView = ()=>{
|
|
80
|
+
const container = useContainer();
|
|
81
|
+
const scopedContainer = useMemo(()=>{
|
|
82
|
+
const child = container.createChildContainer();
|
|
83
|
+
ExperimentsManagerPresenterFeature.register(child);
|
|
84
|
+
return child;
|
|
85
|
+
}, []);
|
|
86
|
+
return /*#__PURE__*/ react.createElement(DiContainerProvider, {
|
|
87
|
+
container: scopedContainer
|
|
88
|
+
}, /*#__PURE__*/ react.createElement(ExperimentsDrawerView_ExperimentsDrawerViewInner, null));
|
|
89
|
+
};
|
|
90
|
+
export { ExperimentsDrawerView };
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=ExperimentsDrawerView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/experiments/ExperimentsManager/components/ExperimentsDrawerView.js","sources":["../../../../../src/presentation/experiments/ExperimentsManager/components/ExperimentsDrawerView.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport { Drawer, IconButton } from \"@webiny/admin-ui\";\nimport { ReactComponent as ScienceIcon } from \"@webiny/icons/science.svg\";\nimport { ReactComponent as BackIcon } from \"@webiny/icons/arrow_back.svg\";\nimport { ExperimentFormView } from \"../../ExperimentForm/index.js\";\nimport { ExperimentsManagerPresenterFeature } from \"../feature.js\";\nimport { ExperimentsListView } from \"./ExperimentsListView.js\";\n\nconst ExperimentsDrawerViewInner = observer(function ExperimentsDrawerViewInner() {\n const { presenter } = useFeature(ExperimentsManagerPresenterFeature);\n\n useEffect(() => {\n presenter.init();\n return () => presenter.dispose();\n }, [presenter]);\n\n const { open, view, editInitial } = presenter.vm;\n\n const flask = <ScienceIcon style={{ width: 20, height: 20 }} />;\n const back = (\n <IconButton\n variant=\"ghost\"\n size=\"sm\"\n icon={<BackIcon style={{ width: 18, height: 18 }} />}\n onClick={() => presenter.showList()}\n />\n );\n\n let title: React.ReactNode;\n if (view === \"create\") {\n title = (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {back}\n {flask}\n New experiment\n </span>\n );\n } else if (view === \"edit\") {\n title = (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {back}\n {flask}\n Edit experiment\n </span>\n );\n } else {\n title = (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {flask}\n Experiments\n </span>\n );\n }\n\n return (\n <Drawer\n open={open}\n onClose={() => presenter.close()}\n modal={true}\n width={520}\n title={title}\n headerSeparator={true}\n bodyPadding={false}\n className={\"flex flex-col\"}\n >\n {view === \"list\" ? <ExperimentsListView presenter={presenter} /> : null}\n {view === \"create\" ? (\n <ExperimentFormView\n onCancel={() => presenter.showList()}\n onSubmit={payload => presenter.createExperiment(payload)}\n submitLabel=\"Create experiment\"\n />\n ) : null}\n {view === \"edit\" && editInitial ? (\n <ExperimentFormView\n initial={editInitial}\n allowStructureChange={false}\n submitLabel=\"Save changes\"\n onCancel={() => presenter.showList()}\n onSubmit={payload => presenter.updateExperiment(payload)}\n />\n ) : null}\n </Drawer>\n );\n});\n\nexport const ExperimentsDrawerView = () => {\n const container = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = container.createChildContainer();\n ExperimentsManagerPresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <ExperimentsDrawerViewInner />\n </DiContainerProvider>\n );\n};\n"],"names":["ExperimentsDrawerViewInner","observer","presenter","useFeature","ExperimentsManagerPresenterFeature","useEffect","open","view","editInitial","flask","ScienceIcon","back","IconButton","BackIcon","title","Drawer","ExperimentsListView","ExperimentFormView","payload","ExperimentsDrawerView","container","useContainer","scopedContainer","useMemo","child","DiContainerProvider"],"mappings":";;;;;;;;;AAUA,MAAMA,mDAA6BC,SAAS;IACxC,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IAEjCC,UAAU;QACNH,UAAU,IAAI;QACd,OAAO,IAAMA,UAAU,OAAO;IAClC,GAAG;QAACA;KAAU;IAEd,MAAM,EAAEI,IAAI,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGN,UAAU,EAAE;IAEhD,MAAMO,QAAQ,WAARA,GAAQ,oBAACC,gBAAWA;QAAC,OAAO;YAAE,OAAO;YAAI,QAAQ;QAAG;;IAC1D,MAAMC,OAAO,WAAPA,GACF,oBAACC,YAAUA;QACP,SAAQ;QACR,MAAK;QACL,oBAAM,oBAACC,+BAAQA;YAAC,OAAO;gBAAE,OAAO;gBAAI,QAAQ;YAAG;;QAC/C,SAAS,IAAMX,UAAU,QAAQ;;IAIzC,IAAIY;IAEAA,QADAP,AAAS,aAATA,OACQ,WAARO,GACI,oBAAC;QAAK,OAAO;YAAE,SAAS;YAAQ,YAAY;YAAU,KAAK;QAAE;OACxDH,MACAF,OAAM,oBAIRF,AAAS,WAATA,OACC,WAARO,GACI,oBAAC;QAAK,OAAO;YAAE,SAAS;YAAQ,YAAY;YAAU,KAAK;QAAE;OACxDH,MACAF,OAAM,qBAKP,WAARK,GACI,oBAAC;QAAK,OAAO;YAAE,SAAS;YAAQ,YAAY;YAAU,KAAK;QAAE;OACxDL,OAAM;IAMnB,OAAO,WAAP,GACI,oBAACM,QAAMA;QACH,MAAMT;QACN,SAAS,IAAMJ,UAAU,KAAK;QAC9B,OAAO;QACP,OAAO;QACP,OAAOY;QACP,iBAAiB;QACjB,aAAa;QACb,WAAW;OAEVP,AAAS,WAATA,OAAkB,WAAT,GAAS,oBAACS,qBAAmBA;QAAC,WAAWd;SAAgB,MAClEK,AAAS,aAATA,OAAoB,WAAX,GACN,oBAACU,oBAAkBA;QACf,UAAU,IAAMf,UAAU,QAAQ;QAClC,UAAUgB,CAAAA,UAAWhB,UAAU,gBAAgB,CAACgB;QAChD,aAAY;SAEhB,MACHX,AAAS,WAATA,QAAmBC,cAAc,WAAdA,GAChB,oBAACS,oBAAkBA;QACf,SAAST;QACT,sBAAsB;QACtB,aAAY;QACZ,UAAU,IAAMN,UAAU,QAAQ;QAClC,UAAUgB,CAAAA,UAAWhB,UAAU,gBAAgB,CAACgB;SAEpD;AAGhB;AAEO,MAAMC,wBAAwB;IACjC,MAAMC,YAAYC;IAElB,MAAMC,kBAAkBC,QAAQ;QAC5B,MAAMC,QAAQJ,UAAU,oBAAoB;QAC5ChB,mCAAmC,QAAQ,CAACoB;QAC5C,OAAOA;IACX,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACC,qBAAmBA;QAAC,WAAWH;qBAC5B,oBAACtB,kDAA0BA;AAGvC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { Button, Heading, Link, Text } from "@webiny/admin-ui";
|
|
3
|
+
import { ReactComponent } from "@webiny/icons/add.svg";
|
|
4
|
+
const Illustration = ()=>{
|
|
5
|
+
const card = {
|
|
6
|
+
width: 96,
|
|
7
|
+
height: 64,
|
|
8
|
+
borderRadius: 8,
|
|
9
|
+
border: "1px solid var(--wby-color-neutral-muted, #e0e0e0)",
|
|
10
|
+
overflow: "hidden",
|
|
11
|
+
background: "#fff"
|
|
12
|
+
};
|
|
13
|
+
const bar = {
|
|
14
|
+
height: 16,
|
|
15
|
+
background: "#1a1a1a"
|
|
16
|
+
};
|
|
17
|
+
const line = {
|
|
18
|
+
height: 4,
|
|
19
|
+
width: 48,
|
|
20
|
+
margin: 8,
|
|
21
|
+
borderRadius: 4,
|
|
22
|
+
background: "#d5d5d5"
|
|
23
|
+
};
|
|
24
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
25
|
+
style: {
|
|
26
|
+
position: "relative",
|
|
27
|
+
display: "flex",
|
|
28
|
+
alignItems: "center",
|
|
29
|
+
justifyContent: "center",
|
|
30
|
+
gap: 24,
|
|
31
|
+
marginBottom: 24
|
|
32
|
+
}
|
|
33
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
34
|
+
style: card
|
|
35
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
36
|
+
style: bar
|
|
37
|
+
}), /*#__PURE__*/ react.createElement("div", {
|
|
38
|
+
style: line
|
|
39
|
+
})), /*#__PURE__*/ react.createElement("div", {
|
|
40
|
+
style: card
|
|
41
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
42
|
+
style: bar
|
|
43
|
+
}), /*#__PURE__*/ react.createElement("div", {
|
|
44
|
+
style: line
|
|
45
|
+
}), /*#__PURE__*/ react.createElement("div", {
|
|
46
|
+
style: {
|
|
47
|
+
height: 12,
|
|
48
|
+
background: "#ffb59b",
|
|
49
|
+
margin: "4px 8px",
|
|
50
|
+
borderRadius: 4
|
|
51
|
+
}
|
|
52
|
+
})), /*#__PURE__*/ react.createElement("div", {
|
|
53
|
+
style: {
|
|
54
|
+
position: "absolute",
|
|
55
|
+
left: "50%",
|
|
56
|
+
transform: "translateX(-50%)",
|
|
57
|
+
width: 38,
|
|
58
|
+
height: 38,
|
|
59
|
+
borderRadius: "50%",
|
|
60
|
+
background: "#ffe9e1",
|
|
61
|
+
color: "#e2572a",
|
|
62
|
+
display: "flex",
|
|
63
|
+
alignItems: "center",
|
|
64
|
+
justifyContent: "center",
|
|
65
|
+
fontSize: 12,
|
|
66
|
+
fontWeight: 600
|
|
67
|
+
}
|
|
68
|
+
}, "A/B"));
|
|
69
|
+
};
|
|
70
|
+
const ExperimentsEmptyState = ({ onCreateExperiment })=>/*#__PURE__*/ react.createElement("div", {
|
|
71
|
+
style: {
|
|
72
|
+
display: "flex",
|
|
73
|
+
flexDirection: "column",
|
|
74
|
+
alignItems: "center",
|
|
75
|
+
textAlign: "center",
|
|
76
|
+
padding: 32,
|
|
77
|
+
maxWidth: 420,
|
|
78
|
+
margin: "48px auto 0"
|
|
79
|
+
}
|
|
80
|
+
}, /*#__PURE__*/ react.createElement(Illustration, null), /*#__PURE__*/ react.createElement(Heading, {
|
|
81
|
+
level: 5
|
|
82
|
+
}, "No experiments on this page"), /*#__PURE__*/ react.createElement("div", {
|
|
83
|
+
style: {
|
|
84
|
+
margin: "12px 0 24px"
|
|
85
|
+
}
|
|
86
|
+
}, /*#__PURE__*/ react.createElement(Text, {
|
|
87
|
+
size: "sm"
|
|
88
|
+
}, "Create an A/B experiment to test variants of this page against each other. Split traffic across full-page variants and run one experiment live at a time.")), /*#__PURE__*/ react.createElement(Button, {
|
|
89
|
+
variant: "primary",
|
|
90
|
+
icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
|
|
91
|
+
text: "Create experiment",
|
|
92
|
+
onClick: onCreateExperiment
|
|
93
|
+
}), /*#__PURE__*/ react.createElement("div", {
|
|
94
|
+
style: {
|
|
95
|
+
marginTop: 16
|
|
96
|
+
}
|
|
97
|
+
}, /*#__PURE__*/ react.createElement(Link, {
|
|
98
|
+
to: "https://www.webiny.com/docs",
|
|
99
|
+
target: "_blank"
|
|
100
|
+
}, "Learn about A/B testing")));
|
|
101
|
+
export { ExperimentsEmptyState };
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=ExperimentsEmptyState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/experiments/ExperimentsManager/components/ExperimentsEmptyState.js","sources":["../../../../../src/presentation/experiments/ExperimentsManager/components/ExperimentsEmptyState.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button, Heading, Text, Link } from \"@webiny/admin-ui\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\n\ninterface Props {\n onCreateExperiment: () => void;\n}\n\n/** A/B illustration for the empty state — two page thumbnails with an A/B badge between them. */\nconst Illustration = () => {\n const card: React.CSSProperties = {\n width: 96,\n height: 64,\n borderRadius: 8,\n border: \"1px solid var(--wby-color-neutral-muted, #e0e0e0)\",\n overflow: \"hidden\",\n background: \"#fff\"\n };\n const bar: React.CSSProperties = { height: 16, background: \"#1a1a1a\" };\n const line: React.CSSProperties = {\n height: 4,\n width: 48,\n margin: 8,\n borderRadius: 4,\n background: \"#d5d5d5\"\n };\n\n return (\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 24,\n marginBottom: 24\n }}\n >\n <div style={card}>\n <div style={bar} />\n <div style={line} />\n </div>\n <div style={card}>\n <div style={bar} />\n <div style={line} />\n <div\n style={{\n height: 12,\n background: \"#ffb59b\",\n margin: \"4px 8px\",\n borderRadius: 4\n }}\n />\n </div>\n <div\n style={{\n position: \"absolute\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: 38,\n height: 38,\n borderRadius: \"50%\",\n background: \"#ffe9e1\",\n color: \"#e2572a\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 12,\n fontWeight: 600\n }}\n >\n A/B\n </div>\n </div>\n );\n};\n\nexport const ExperimentsEmptyState = ({ onCreateExperiment }: Props) => {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n textAlign: \"center\",\n padding: 32,\n maxWidth: 420,\n margin: \"48px auto 0\"\n }}\n >\n <Illustration />\n <Heading level={5}>No experiments on this page</Heading>\n <div style={{ margin: \"12px 0 24px\" }}>\n <Text size=\"sm\">\n Create an A/B experiment to test variants of this page against each other. Split\n traffic across full-page variants and run one experiment live at a time.\n </Text>\n </div>\n <Button\n variant=\"primary\"\n icon={<AddIcon />}\n text=\"Create experiment\"\n onClick={onCreateExperiment}\n />\n <div style={{ marginTop: 16 }}>\n <Link to=\"https://www.webiny.com/docs\" target=\"_blank\">\n Learn about A/B testing\n </Link>\n </div>\n </div>\n );\n};\n"],"names":["Illustration","card","bar","line","ExperimentsEmptyState","onCreateExperiment","Heading","Text","Button","AddIcon","Link"],"mappings":";;;AASA,MAAMA,eAAe;IACjB,MAAMC,OAA4B;QAC9B,OAAO;QACP,QAAQ;QACR,cAAc;QACd,QAAQ;QACR,UAAU;QACV,YAAY;IAChB;IACA,MAAMC,MAA2B;QAAE,QAAQ;QAAI,YAAY;IAAU;IACrE,MAAMC,OAA4B;QAC9B,QAAQ;QACR,OAAO;QACP,QAAQ;QACR,cAAc;QACd,YAAY;IAChB;IAEA,OAAO,WAAP,GACI,oBAAC;QACG,OAAO;YACH,UAAU;YACV,SAAS;YACT,YAAY;YACZ,gBAAgB;YAChB,KAAK;YACL,cAAc;QAClB;qBAEA,oBAAC;QAAI,OAAOF;qBACR,oBAAC;QAAI,OAAOC;sBACZ,oBAAC;QAAI,OAAOC;uBAEhB,oBAAC;QAAI,OAAOF;qBACR,oBAAC;QAAI,OAAOC;sBACZ,oBAAC;QAAI,OAAOC;sBACZ,oBAAC;QACG,OAAO;YACH,QAAQ;YACR,YAAY;YACZ,QAAQ;YACR,cAAc;QAClB;uBAGR,oBAAC;QACG,OAAO;YACH,UAAU;YACV,MAAM;YACN,WAAW;YACX,OAAO;YACP,QAAQ;YACR,cAAc;YACd,YAAY;YACZ,OAAO;YACP,SAAS;YACT,YAAY;YACZ,gBAAgB;YAChB,UAAU;YACV,YAAY;QAChB;OACH;AAKb;AAEO,MAAMC,wBAAwB,CAAC,EAAEC,kBAAkB,EAAS,GACxD,WAAP,GACI,oBAAC;QACG,OAAO;YACH,SAAS;YACT,eAAe;YACf,YAAY;YACZ,WAAW;YACX,SAAS;YACT,UAAU;YACV,QAAQ;QACZ;qBAEA,oBAACL,cAAYA,OAAAA,WAAAA,GACb,oBAACM,SAAOA;QAAC,OAAO;OAAG,8CACnB,oBAAC;QAAI,OAAO;YAAE,QAAQ;QAAc;qBAChC,oBAACC,MAAIA;QAAC,MAAK;OAAK,6KAKpB,oBAACC,QAAMA;QACH,SAAQ;QACR,oBAAM,oBAACC,gBAAOA;QACd,MAAK;QACL,SAASJ;sBAEb,oBAAC;QAAI,OAAO;YAAE,WAAW;QAAG;qBACxB,oBAACK,MAAIA;QAAC,IAAG;QAA8B,QAAO;OAAS"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { IExperimentsManagerPresenter } from "../abstractions/ExperimentsManagerPresenter.js";
|
|
3
|
+
interface Props {
|
|
4
|
+
presenter: IExperimentsManagerPresenter;
|
|
5
|
+
}
|
|
6
|
+
export declare const ExperimentsListView: (({ presenter }: Props) => React.JSX.Element) & React.NamedExoticComponent<Props> & {
|
|
7
|
+
readonly type: ({ presenter }: Props) => React.JSX.Element;
|
|
8
|
+
};
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { observer } from "mobx-react-lite";
|
|
3
|
+
import { Text } from "@webiny/admin-ui";
|
|
4
|
+
import { ReactComponent } from "@webiny/icons/add.svg";
|
|
5
|
+
import { ExperimentsEmptyState } from "./ExperimentsEmptyState.js";
|
|
6
|
+
import { ExperimentCard } from "./ExperimentCard.js";
|
|
7
|
+
const ExperimentsListView_ExperimentsListView = observer(function({ presenter }) {
|
|
8
|
+
const { cards } = presenter.vm;
|
|
9
|
+
if (0 === cards.length) return /*#__PURE__*/ react.createElement(ExperimentsEmptyState, {
|
|
10
|
+
onCreateExperiment: ()=>presenter.showCreate()
|
|
11
|
+
});
|
|
12
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
13
|
+
style: {
|
|
14
|
+
padding: 24
|
|
15
|
+
}
|
|
16
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
17
|
+
style: {
|
|
18
|
+
display: "flex",
|
|
19
|
+
alignItems: "flex-start",
|
|
20
|
+
justifyContent: "space-between",
|
|
21
|
+
gap: 16,
|
|
22
|
+
marginBottom: 20
|
|
23
|
+
}
|
|
24
|
+
}, /*#__PURE__*/ react.createElement(Text, {
|
|
25
|
+
size: "sm"
|
|
26
|
+
}, "Only one experiment can be active at a time. Activating one deactivates the currently active experiment."), /*#__PURE__*/ react.createElement("button", {
|
|
27
|
+
type: "button",
|
|
28
|
+
onClick: ()=>presenter.showCreate(),
|
|
29
|
+
style: {
|
|
30
|
+
display: "inline-flex",
|
|
31
|
+
alignItems: "center",
|
|
32
|
+
gap: 6,
|
|
33
|
+
border: "none",
|
|
34
|
+
background: "#e2572a",
|
|
35
|
+
color: "#fff",
|
|
36
|
+
borderRadius: 8,
|
|
37
|
+
padding: "7px 14px",
|
|
38
|
+
fontWeight: 600,
|
|
39
|
+
fontSize: 13,
|
|
40
|
+
cursor: "pointer",
|
|
41
|
+
whiteSpace: "nowrap",
|
|
42
|
+
flexShrink: 0
|
|
43
|
+
}
|
|
44
|
+
}, /*#__PURE__*/ react.createElement(ReactComponent, {
|
|
45
|
+
style: {
|
|
46
|
+
width: 18,
|
|
47
|
+
height: 18,
|
|
48
|
+
fill: "currentColor"
|
|
49
|
+
}
|
|
50
|
+
}), "New")), cards.map((card)=>/*#__PURE__*/ react.createElement(ExperimentCard, {
|
|
51
|
+
key: card.experiment.id,
|
|
52
|
+
presenter: presenter,
|
|
53
|
+
card: card
|
|
54
|
+
})));
|
|
55
|
+
});
|
|
56
|
+
export { ExperimentsListView_ExperimentsListView as ExperimentsListView };
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=ExperimentsListView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/experiments/ExperimentsManager/components/ExperimentsListView.js","sources":["../../../../../src/presentation/experiments/ExperimentsManager/components/ExperimentsListView.tsx"],"sourcesContent":["import React from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Text } from \"@webiny/admin-ui\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\nimport { ExperimentsEmptyState } from \"./ExperimentsEmptyState.js\";\nimport { ExperimentCard } from \"./ExperimentCard.js\";\nimport type { IExperimentsManagerPresenter } from \"../abstractions/ExperimentsManagerPresenter.js\";\n\ninterface Props {\n presenter: IExperimentsManagerPresenter;\n}\n\nexport const ExperimentsListView = observer(function ExperimentsListView({ presenter }: Props) {\n const { cards } = presenter.vm;\n\n if (cards.length === 0) {\n return <ExperimentsEmptyState onCreateExperiment={() => presenter.showCreate()} />;\n }\n\n return (\n <div style={{ padding: 24 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n gap: 16,\n marginBottom: 20\n }}\n >\n <Text size=\"sm\">\n Only one experiment can be active at a time. Activating one deactivates the\n currently active experiment.\n </Text>\n <button\n type=\"button\"\n onClick={() => presenter.showCreate()}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n border: \"none\",\n background: \"#e2572a\",\n color: \"#fff\",\n borderRadius: 8,\n padding: \"7px 14px\",\n fontWeight: 600,\n fontSize: 13,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n flexShrink: 0\n }}\n >\n <AddIcon style={{ width: 18, height: 18, fill: \"currentColor\" }} />\n New\n </button>\n </div>\n\n {cards.map(card => (\n <ExperimentCard key={card.experiment.id} presenter={presenter} card={card} />\n ))}\n </div>\n );\n});\n"],"names":["ExperimentsListView","observer","presenter","cards","ExperimentsEmptyState","Text","AddIcon","card","ExperimentCard"],"mappings":";;;;;;AAYO,MAAMA,0CAAsBC,SAAS,SAA6B,EAAEC,SAAS,EAAS;IACzF,MAAM,EAAEC,KAAK,EAAE,GAAGD,UAAU,EAAE;IAE9B,IAAIC,AAAiB,MAAjBA,MAAM,MAAM,EACZ,OAAO,WAAP,GAAO,oBAACC,uBAAqBA;QAAC,oBAAoB,IAAMF,UAAU,UAAU;;IAGhF,OAAO,WAAP,GACI,oBAAC;QAAI,OAAO;YAAE,SAAS;QAAG;qBACtB,oBAAC;QACG,OAAO;YACH,SAAS;YACT,YAAY;YACZ,gBAAgB;YAChB,KAAK;YACL,cAAc;QAClB;qBAEA,oBAACG,MAAIA;QAAC,MAAK;OAAK,2HAIhB,oBAAC;QACG,MAAK;QACL,SAAS,IAAMH,UAAU,UAAU;QACnC,OAAO;YACH,SAAS;YACT,YAAY;YACZ,KAAK;YACL,QAAQ;YACR,YAAY;YACZ,OAAO;YACP,cAAc;YACd,SAAS;YACT,YAAY;YACZ,UAAU;YACV,QAAQ;YACR,YAAY;YACZ,YAAY;QAChB;qBAEA,oBAACI,gBAAOA;QAAC,OAAO;YAAE,OAAO;YAAI,QAAQ;YAAI,MAAM;QAAe;QAAK,SAK1EH,MAAM,GAAG,CAACI,CAAAA,OAAAA,WAAAA,GACP,oBAACC,gBAAcA;YAAC,KAAKD,KAAK,UAAU,CAAC,EAAE;YAAE,WAAWL;YAAW,MAAMK;;AAIrF"}
|