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

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 { createFeature } from "@webiny/feature/admin";
2
+ import { ExperimentsManagerPresenter } from "./abstractions/ExperimentsManagerPresenter.js";
3
+ import { ExperimentsManagerPresenter as external_ExperimentsManagerPresenter_js_ExperimentsManagerPresenter } from "./ExperimentsManagerPresenter.js";
4
+ const ExperimentsManagerPresenterFeature = createFeature({
5
+ name: "WebsiteBuilder/ExperimentsManagerPresenter",
6
+ register (container) {
7
+ container.register(external_ExperimentsManagerPresenter_js_ExperimentsManagerPresenter).inSingletonScope();
8
+ },
9
+ resolve (container) {
10
+ return {
11
+ presenter: container.resolve(ExperimentsManagerPresenter)
12
+ };
13
+ }
14
+ });
15
+ export { ExperimentsManagerPresenterFeature };
16
+
17
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/experiments/ExperimentsManager/feature.js","sources":["../../../../src/presentation/experiments/ExperimentsManager/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { ExperimentsManagerPresenter as PresenterAbstraction } from \"./abstractions/ExperimentsManagerPresenter.js\";\nimport { ExperimentsManagerPresenter } from \"./ExperimentsManagerPresenter.js\";\n\nexport const ExperimentsManagerPresenterFeature = createFeature({\n name: \"WebsiteBuilder/ExperimentsManagerPresenter\",\n register(container) {\n // The editor hub presenter (ExperimentsEditorPresenterFeature) is registered app/editor-wide\n // and resolved through the container's parent chain — the manager delegates to that same\n // singleton so drawer open/edit triggered from the editor toolbar are observed here.\n container.register(ExperimentsManagerPresenter).inSingletonScope();\n },\n resolve(container) {\n return { presenter: container.resolve(PresenterAbstraction) };\n }\n});\n"],"names":["ExperimentsManagerPresenterFeature","createFeature","container","ExperimentsManagerPresenter","PresenterAbstraction"],"mappings":";;;AAIO,MAAMA,qCAAqCC,cAAc;IAC5D,MAAM;IACN,UAASC,SAAS;QAIdA,UAAU,QAAQ,CAACC,qEAA6B,gBAAgB;IACpE;IACA,SAAQD,SAAS;QACb,OAAO;YAAE,WAAWA,UAAU,OAAO,CAACE;QAAsB;IAChE;AACJ"}
@@ -0,0 +1,4 @@
1
+ export { ExperimentsManagerPresenter } from "./abstractions/ExperimentsManagerPresenter.js";
2
+ export type { IExperimentsManagerPresenter, IExperimentsManagerViewModel, ExperimentsManagerView, ExperimentCardViewModel, ExperimentCardBucket } from "./abstractions/ExperimentsManagerPresenter.js";
3
+ export { ExperimentsManagerPresenterFeature } from "./feature.js";
4
+ export { ExperimentsDrawerView } from "./components/ExperimentsDrawerView.js";
@@ -0,0 +1,3 @@
1
+ export { ExperimentsManagerPresenter } from "./abstractions/ExperimentsManagerPresenter.js";
2
+ export { ExperimentsManagerPresenterFeature } from "./feature.js";
3
+ export { ExperimentsDrawerView } from "./components/ExperimentsDrawerView.js";
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ /**
3
+ * Editor config used when a variant is the edited document. It reuses the page editor scope (so the
4
+ * experiments switcher/toolbar still render) but swaps page-only chrome — publish, revisions,
5
+ * settings — for a variant-scoped autosave.
6
+ */
7
+ export declare const VariantPageEditorConfig: () => React.JSX.Element;
@@ -0,0 +1,26 @@
1
+ import react from "react";
2
+ import { InternalPageEditorConfig } from "../pages/PageEditor/PageEditorConfig.js";
3
+ import { BackButton } from "../pages/PageEditor/TopBar/BackButton.js";
4
+ import { Title } from "../pages/PageEditor/TopBar/Title.js";
5
+ import { TopBarOptionsMenu } from "../../BaseEditor/config/TopBar/Layout.js";
6
+ import { VariantAutoSave } from "./config/VariantAutoSave.js";
7
+ const { Ui: Ui } = InternalPageEditorConfig;
8
+ const VariantPageEditorConfig = ()=>/*#__PURE__*/ react.createElement(InternalPageEditorConfig, null, /*#__PURE__*/ react.createElement(Ui.TopBar.Element, {
9
+ name: "buttonBack",
10
+ group: "left",
11
+ element: /*#__PURE__*/ react.createElement(BackButton, null)
12
+ }), /*#__PURE__*/ react.createElement(Ui.TopBar.Element, {
13
+ name: "title",
14
+ group: "left",
15
+ element: /*#__PURE__*/ react.createElement(Title, null)
16
+ }), /*#__PURE__*/ react.createElement(Ui.TopBar.Action, {
17
+ name: "optionsMenu",
18
+ element: /*#__PURE__*/ react.createElement(TopBarOptionsMenu, null)
19
+ }), /*#__PURE__*/ react.createElement(Ui.TopBar.Element, {
20
+ group: "left",
21
+ name: "autoSave",
22
+ element: /*#__PURE__*/ react.createElement(VariantAutoSave, null)
23
+ }));
24
+ export { VariantPageEditorConfig };
25
+
26
+ //# sourceMappingURL=VariantPageEditorConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/experiments/VariantPageEditorConfig.js","sources":["../../../src/presentation/experiments/VariantPageEditorConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { InternalPageEditorConfig } from \"~/presentation/pages/PageEditor/PageEditorConfig.js\";\nimport { BackButton } from \"~/presentation/pages/PageEditor/TopBar/BackButton.js\";\nimport { Title } from \"~/presentation/pages/PageEditor/TopBar/Title.js\";\nimport { TopBarOptionsMenu } from \"~/BaseEditor/config/TopBar/Layout.js\";\nimport { VariantAutoSave } from \"./config/VariantAutoSave.js\";\n\nconst { Ui } = InternalPageEditorConfig;\n\n/**\n * Editor config used when a variant is the edited document. It reuses the page editor scope (so the\n * experiments switcher/toolbar still render) but swaps page-only chrome — publish, revisions,\n * settings — for a variant-scoped autosave.\n */\nexport const VariantPageEditorConfig = () => {\n return (\n <InternalPageEditorConfig>\n <Ui.TopBar.Element name={\"buttonBack\"} group={\"left\"} element={<BackButton />} />\n <Ui.TopBar.Element name={\"title\"} group={\"left\"} element={<Title />} />\n <Ui.TopBar.Action name={\"optionsMenu\"} element={<TopBarOptionsMenu />} />\n <Ui.TopBar.Element group={\"left\"} name={\"autoSave\"} element={<VariantAutoSave />} />\n </InternalPageEditorConfig>\n );\n};\n"],"names":["Ui","InternalPageEditorConfig","VariantPageEditorConfig","BackButton","Title","TopBarOptionsMenu","VariantAutoSave"],"mappings":";;;;;;AAOA,MAAM,EAAEA,IAAAA,EAAE,EAAE,GAAGC;AAOR,MAAMC,0BAA0B,IAC5B,WAAP,GACI,oBAACD,0BAAwBA,MAAAA,WAAAA,GACrB,oBAACD,GAAG,MAAM,CAAC,OAAO;QAAC,MAAM;QAAc,OAAO;QAAQ,uBAAS,oBAACG,YAAUA;sBAC1E,oBAACH,GAAG,MAAM,CAAC,OAAO;QAAC,MAAM;QAAS,OAAO;QAAQ,uBAAS,oBAACI,OAAKA;sBAChE,oBAACJ,GAAG,MAAM,CAAC,MAAM;QAAC,MAAM;QAAe,uBAAS,oBAACK,mBAAiBA;sBAClE,oBAACL,GAAG,MAAM,CAAC,OAAO;QAAC,OAAO;QAAQ,MAAM;QAAY,uBAAS,oBAACM,iBAAeA"}
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ /**
3
+ * Registers the Experiments button (top bar) and the in-preview experiment toolbar.
4
+ *
5
+ * The shared selection state lives in the ExperimentsEditor presenter, which PageEditor initializes
6
+ * around the editor so it can swap the edited document between the page and a variant.
7
+ */
8
+ export declare const ExperimentsEditorConfig: () => React.JSX.Element;
@@ -0,0 +1,21 @@
1
+ import react from "react";
2
+ import { PageEditorConfig } from "../../pages/PageEditor/PageEditorConfig.js";
3
+ import { ExperimentsButton } from "../ExperimentsEditor/components/ExperimentsButton.js";
4
+ import { ExperimentPreviewToolbar } from "../ExperimentsEditor/components/ExperimentPreviewToolbar.js";
5
+ const { Ui: Ui } = PageEditorConfig;
6
+ const ExperimentsEditorConfig = ()=>/*#__PURE__*/ react.createElement(PageEditorConfig, null, /*#__PURE__*/ react.createElement(Ui.IsNotReadOnly, null, /*#__PURE__*/ react.createElement(Ui.TopBar.Action, {
7
+ name: "experiments",
8
+ before: "buttonPublish",
9
+ element: /*#__PURE__*/ react.createElement(ExperimentsButton, null)
10
+ })), /*#__PURE__*/ react.createElement(Ui.IsReadOnly, null, /*#__PURE__*/ react.createElement(Ui.TopBar.Action, {
11
+ name: "experimentsStatus",
12
+ before: "revisionsMenu",
13
+ element: /*#__PURE__*/ react.createElement(ExperimentsButton, null)
14
+ })), /*#__PURE__*/ react.createElement(Ui.Content.Element, {
15
+ name: "experimentToolbar",
16
+ after: "addressBar",
17
+ element: /*#__PURE__*/ react.createElement(ExperimentPreviewToolbar, null)
18
+ }));
19
+ export { ExperimentsEditorConfig };
20
+
21
+ //# sourceMappingURL=ExperimentsEditorConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/experiments/config/ExperimentsEditorConfig.js","sources":["../../../../src/presentation/experiments/config/ExperimentsEditorConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { PageEditorConfig } from \"~/presentation/pages/PageEditor/PageEditorConfig.js\";\nimport { ExperimentsButton } from \"../ExperimentsEditor/components/ExperimentsButton.js\";\nimport { ExperimentPreviewToolbar } from \"../ExperimentsEditor/components/ExperimentPreviewToolbar.js\";\n\nconst { Ui } = PageEditorConfig;\n\n/**\n * Registers the Experiments button (top bar) and the in-preview experiment toolbar.\n *\n * The shared selection state lives in the ExperimentsEditor presenter, which PageEditor initializes\n * around the editor so it can swap the edited document between the page and a variant.\n */\nexport const ExperimentsEditorConfig = () => {\n return (\n <PageEditorConfig>\n {/* Draft page: the switcher, before the Publish button. */}\n <Ui.IsNotReadOnly>\n <Ui.TopBar.Action\n name={\"experiments\"}\n before={\"buttonPublish\"}\n element={<ExperimentsButton />}\n />\n </Ui.IsNotReadOnly>\n {/* Published page: the running-experiment indicator + kill-switch, before the version menu. */}\n <Ui.IsReadOnly>\n <Ui.TopBar.Action\n name={\"experimentsStatus\"}\n before={\"revisionsMenu\"}\n element={<ExperimentsButton />}\n />\n </Ui.IsReadOnly>\n <Ui.Content.Element\n name={\"experimentToolbar\"}\n after={\"addressBar\"}\n element={<ExperimentPreviewToolbar />}\n />\n </PageEditorConfig>\n );\n};\n"],"names":["Ui","PageEditorConfig","ExperimentsEditorConfig","ExperimentsButton","ExperimentPreviewToolbar"],"mappings":";;;;AAKA,MAAM,EAAEA,IAAAA,EAAE,EAAE,GAAGC;AAQR,MAAMC,0BAA0B,IAC5B,WAAP,GACI,oBAACD,kBAAgBA,MAAAA,WAAAA,GAEb,oBAACD,GAAG,aAAa,sBACb,oBAACA,GAAG,MAAM,CAAC,MAAM;QACb,MAAM;QACN,QAAQ;QACR,uBAAS,oBAACG,mBAAiBA;uBAInC,oBAACH,GAAG,UAAU,sBACV,oBAACA,GAAG,MAAM,CAAC,MAAM;QACb,MAAM;QACN,QAAQ;QACR,uBAAS,oBAACG,mBAAiBA;uBAGnC,oBAACH,GAAG,OAAO,CAAC,OAAO;QACf,MAAM;QACN,OAAO;QACP,uBAAS,oBAACI,0BAAwBA"}
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ /** Autosaves the edited document back to the selected variant (mirrors PageAutoSave for variants). */
3
+ export declare const VariantAutoSave: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
4
+ readonly type: () => React.JSX.Element | null;
5
+ };
@@ -0,0 +1,41 @@
1
+ import react, { useEffect, useMemo } from "react";
2
+ import { observer } from "mobx-react-lite";
3
+ import debounce from "lodash/debounce.js";
4
+ import { useFeature } from "@webiny/app";
5
+ import { useDocumentEditor } from "../../../DocumentEditor/index.js";
6
+ import { ExperimentsEditorPresenterFeature } from "../ExperimentsEditor/index.js";
7
+ import { editorDocumentToVariantUpdate } from "../shared/variantDocument.js";
8
+ const VariantAutoSaveAction = ({ variantRevisionId })=>{
9
+ const editor = useDocumentEditor();
10
+ const { presenter } = useFeature(ExperimentsEditorPresenterFeature);
11
+ const saveVariant = useMemo(()=>debounce((document)=>presenter.saveVariant(variantRevisionId, editorDocumentToVariantUpdate(document)), 500), [
12
+ presenter,
13
+ variantRevisionId
14
+ ]);
15
+ useEffect(()=>editor.onDocumentStateChange(async (event)=>{
16
+ if (editor.getEditorState().read().isReadOnly) return;
17
+ editor.updateEditor((state)=>{
18
+ state.autoSaving = true;
19
+ });
20
+ await saveVariant(event.state);
21
+ setTimeout(()=>{
22
+ editor.updateEditor((state)=>{
23
+ state.autoSaving = false;
24
+ });
25
+ }, 500);
26
+ }), [
27
+ saveVariant
28
+ ]);
29
+ return null;
30
+ };
31
+ const VariantAutoSave_VariantAutoSave = observer(function() {
32
+ const { presenter } = useFeature(ExperimentsEditorPresenterFeature);
33
+ const { selectedVariant } = presenter.vm;
34
+ if (!selectedVariant) return null;
35
+ return /*#__PURE__*/ react.createElement(VariantAutoSaveAction, {
36
+ variantRevisionId: selectedVariant.id
37
+ });
38
+ });
39
+ export { VariantAutoSave_VariantAutoSave as VariantAutoSave };
40
+
41
+ //# sourceMappingURL=VariantAutoSave.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/experiments/config/VariantAutoSave.js","sources":["../../../../src/presentation/experiments/config/VariantAutoSave.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport debounce from \"lodash/debounce.js\";\nimport { useFeature } from \"@webiny/app\";\nimport type { EditorPage } from \"@webiny/website-builder-sdk\";\nimport { useDocumentEditor } from \"~/DocumentEditor/index.js\";\nimport { ExperimentsEditorPresenterFeature } from \"../ExperimentsEditor/index.js\";\nimport { editorDocumentToVariantUpdate } from \"../shared/variantDocument.js\";\n\nconst VariantAutoSaveAction = ({ variantRevisionId }: { variantRevisionId: string }) => {\n const editor = useDocumentEditor<EditorPage>();\n const { presenter } = useFeature(ExperimentsEditorPresenterFeature);\n\n const saveVariant = useMemo(\n () =>\n debounce((document: EditorPage) => {\n return presenter.saveVariant(\n variantRevisionId,\n editorDocumentToVariantUpdate(document)\n );\n }, 500),\n [presenter, variantRevisionId]\n );\n\n useEffect(() => {\n return editor.onDocumentStateChange(async event => {\n if (editor.getEditorState().read().isReadOnly) {\n return;\n }\n editor.updateEditor(state => {\n state.autoSaving = true;\n });\n await saveVariant(event.state);\n setTimeout(() => {\n editor.updateEditor(state => {\n state.autoSaving = false;\n });\n }, 500);\n });\n }, [saveVariant]);\n\n return null;\n};\n\n/** Autosaves the edited document back to the selected variant (mirrors PageAutoSave for variants). */\nexport const VariantAutoSave = observer(function VariantAutoSave() {\n const { presenter } = useFeature(ExperimentsEditorPresenterFeature);\n const { selectedVariant } = presenter.vm;\n if (!selectedVariant) {\n return null;\n }\n return <VariantAutoSaveAction variantRevisionId={selectedVariant.id} />;\n});\n"],"names":["VariantAutoSaveAction","variantRevisionId","editor","useDocumentEditor","presenter","useFeature","ExperimentsEditorPresenterFeature","saveVariant","useMemo","debounce","document","editorDocumentToVariantUpdate","useEffect","event","state","setTimeout","VariantAutoSave","observer","selectedVariant"],"mappings":";;;;;;;AASA,MAAMA,wBAAwB,CAAC,EAAEC,iBAAiB,EAAiC;IAC/E,MAAMC,SAASC;IACf,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IAEjC,MAAMC,cAAcC,QAChB,IACIC,SAAS,CAACC,WACCN,UAAU,WAAW,CACxBH,mBACAU,8BAA8BD,YAEnC,MACP;QAACN;QAAWH;KAAkB;IAGlCW,UAAU,IACCV,OAAO,qBAAqB,CAAC,OAAMW;YACtC,IAAIX,OAAO,cAAc,GAAG,IAAI,GAAG,UAAU,EACzC;YAEJA,OAAO,YAAY,CAACY,CAAAA;gBAChBA,MAAM,UAAU,GAAG;YACvB;YACA,MAAMP,YAAYM,MAAM,KAAK;YAC7BE,WAAW;gBACPb,OAAO,YAAY,CAACY,CAAAA;oBAChBA,MAAM,UAAU,GAAG;gBACvB;YACJ,GAAG;QACP,IACD;QAACP;KAAY;IAEhB,OAAO;AACX;AAGO,MAAMS,kCAAkBC,SAAS;IACpC,MAAM,EAAEb,SAAS,EAAE,GAAGC,WAAWC;IACjC,MAAM,EAAEY,eAAe,EAAE,GAAGd,UAAU,EAAE;IACxC,IAAI,CAACc,iBACD,OAAO;IAEX,OAAO,WAAP,GAAO,oBAAClB,uBAAqBA;QAAC,mBAAmBkB,gBAAgB,EAAE;;AACvE"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Shared bucket colours for the A/B UI. The control is always neutral; variants cycle a fixed
3
+ * palette by their 0-based index. Used by the experiment form, the list cards, and the in-preview
4
+ * toolbar so a given variant shows the same colour everywhere.
5
+ */
6
+ export declare const CONTROL_COLOR = "#9ca3af";
7
+ export declare const VARIANT_COLORS: string[];
8
+ /** Colour for a variant by its 0-based index among the experiment's variants. */
9
+ export declare const variantColor: (variantIndex: number) => string;
10
+ /** Colour for a bucket: neutral for the control, otherwise the variant's palette colour. */
11
+ export declare const bucketColor: (isControl: boolean, variantIndex: number) => string;
@@ -0,0 +1,13 @@
1
+ const CONTROL_COLOR = "#9ca3af";
2
+ const VARIANT_COLORS = [
3
+ "#e2572a",
4
+ "#4285f4",
5
+ "#0f9d58",
6
+ "#a142f4",
7
+ "#f4b400"
8
+ ];
9
+ const variantColor = (variantIndex)=>VARIANT_COLORS[variantIndex % VARIANT_COLORS.length];
10
+ const bucketColor = (isControl, variantIndex)=>isControl ? CONTROL_COLOR : variantColor(variantIndex);
11
+ export { CONTROL_COLOR, VARIANT_COLORS, bucketColor, variantColor };
12
+
13
+ //# sourceMappingURL=variantColors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/experiments/shared/variantColors.js","sources":["../../../../src/presentation/experiments/shared/variantColors.ts"],"sourcesContent":["/**\n * Shared bucket colours for the A/B UI. The control is always neutral; variants cycle a fixed\n * palette by their 0-based index. Used by the experiment form, the list cards, and the in-preview\n * toolbar so a given variant shows the same colour everywhere.\n */\nexport const CONTROL_COLOR = \"#9ca3af\";\n\nexport const VARIANT_COLORS = [\"#e2572a\", \"#4285f4\", \"#0f9d58\", \"#a142f4\", \"#f4b400\"];\n\n/** Colour for a variant by its 0-based index among the experiment's variants. */\nexport const variantColor = (variantIndex: number): string =>\n VARIANT_COLORS[variantIndex % VARIANT_COLORS.length];\n\n/** Colour for a bucket: neutral for the control, otherwise the variant's palette colour. */\nexport const bucketColor = (isControl: boolean, variantIndex: number): string =>\n isControl ? CONTROL_COLOR : variantColor(variantIndex);\n"],"names":["CONTROL_COLOR","VARIANT_COLORS","variantColor","variantIndex","bucketColor","isControl"],"mappings":"AAKO,MAAMA,gBAAgB;AAEtB,MAAMC,iBAAiB;IAAC;IAAW;IAAW;IAAW;IAAW;CAAU;AAG9E,MAAMC,eAAe,CAACC,eACzBF,cAAc,CAACE,eAAeF,eAAe,MAAM,CAAC;AAGjD,MAAMG,cAAc,CAACC,WAAoBF,eAC5CE,YAAYL,gBAAgBE,aAAaC"}
@@ -0,0 +1,16 @@
1
+ import type { EditorPage } from "@webiny/website-builder-sdk";
2
+ import type { UpdateVariantInput, VariantContentDto } from "../../../features/experiments/index.js";
3
+ /**
4
+ * Map a variant's stored content onto an editor document that keeps the *page's* identity.
5
+ *
6
+ * The preview iframe is addressed by the document `id` and the canvas keys its store by `wb.id`
7
+ * (and renders by `properties.id`). The site resolves the server-side base by that id via
8
+ * `getPageById`, which only works for a real page — a variant id is not a page. So the document
9
+ * keeps the page's id/path/`properties.id` (a valid, resolvable base — the page draft), while its
10
+ * content (elements, bindings, properties, …) is the variant's. The editor streams this content
11
+ * over the base, and autosave targets the actual variant separately (see VariantAutoSave). This is
12
+ * why control and variant share the same `wb.id`; the switch is handled by re-mounting the editor.
13
+ */
14
+ export declare const variantToEditorDocument: (variant: VariantContentDto, page: EditorPage) => EditorPage;
15
+ /** Extract the persistable content fields from an edited variant document. */
16
+ export declare const editorDocumentToVariantUpdate: (document: EditorPage) => UpdateVariantInput;
@@ -0,0 +1,31 @@
1
+ const variantToEditorDocument = (variant, page)=>({
2
+ ...page,
3
+ properties: {
4
+ ...page.properties,
5
+ ...variant.properties ?? {},
6
+ id: page.properties.id ?? page.id,
7
+ path: page.properties.path
8
+ },
9
+ metadata: {
10
+ ...page.metadata,
11
+ ...variant.metadata ?? {},
12
+ documentType: page.metadata.documentType ?? "page",
13
+ wbVariantPreviewId: variant.id
14
+ },
15
+ bindings: variant.bindings ?? page.bindings,
16
+ elements: variant.elements ?? page.elements,
17
+ extensions: variant.extensions ?? page.extensions ?? {}
18
+ });
19
+ const editorDocumentToVariantUpdate = (document)=>{
20
+ const { wbVariantPreviewId, ...metadata } = document.metadata;
21
+ return {
22
+ properties: document.properties,
23
+ metadata,
24
+ bindings: document.bindings,
25
+ elements: document.elements,
26
+ extensions: document.extensions
27
+ };
28
+ };
29
+ export { editorDocumentToVariantUpdate, variantToEditorDocument };
30
+
31
+ //# sourceMappingURL=variantDocument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/experiments/shared/variantDocument.js","sources":["../../../../src/presentation/experiments/shared/variantDocument.ts"],"sourcesContent":["import type { EditorPage } from \"@webiny/website-builder-sdk\";\nimport type { UpdateVariantInput, VariantContentDto } from \"~/features/experiments/index.js\";\n\n/**\n * Map a variant's stored content onto an editor document that keeps the *page's* identity.\n *\n * The preview iframe is addressed by the document `id` and the canvas keys its store by `wb.id`\n * (and renders by `properties.id`). The site resolves the server-side base by that id via\n * `getPageById`, which only works for a real page — a variant id is not a page. So the document\n * keeps the page's id/path/`properties.id` (a valid, resolvable base — the page draft), while its\n * content (elements, bindings, properties, …) is the variant's. The editor streams this content\n * over the base, and autosave targets the actual variant separately (see VariantAutoSave). This is\n * why control and variant share the same `wb.id`; the switch is handled by re-mounting the editor.\n */\nexport const variantToEditorDocument = (\n variant: VariantContentDto,\n page: EditorPage\n): EditorPage => ({\n ...page,\n // Variant content, but the page's identity (id/path) so the preview base resolves.\n properties: {\n ...page.properties,\n ...(variant.properties ?? {}),\n id: (page.properties as Record<string, any>).id ?? page.id,\n path: page.properties.path\n } as EditorPage[\"properties\"],\n metadata: {\n ...page.metadata,\n ...(variant.metadata ?? {}),\n documentType: (page.metadata as Record<string, any>).documentType ?? \"page\",\n // Marker so the address-bar \"preview in new tab\" opens this variant's draft (see\n // usePreviewLink). Stripped before persisting — see editorDocumentToVariantUpdate.\n wbVariantPreviewId: variant.id\n } as EditorPage[\"metadata\"],\n bindings: (variant.bindings ?? page.bindings) as EditorPage[\"bindings\"],\n elements: (variant.elements ?? page.elements) as EditorPage[\"elements\"],\n extensions: variant.extensions ?? page.extensions ?? {}\n});\n\n/** Extract the persistable content fields from an edited variant document. */\nexport const editorDocumentToVariantUpdate = (document: EditorPage): UpdateVariantInput => {\n // Drop the editor-only preview marker so it's not persisted onto the variant.\n const { wbVariantPreviewId, ...metadata } = document.metadata as Record<string, any>;\n void wbVariantPreviewId;\n return {\n properties: document.properties,\n metadata,\n bindings: document.bindings,\n elements: document.elements,\n extensions: document.extensions\n };\n};\n"],"names":["variantToEditorDocument","variant","page","editorDocumentToVariantUpdate","document","wbVariantPreviewId","metadata"],"mappings":"AAcO,MAAMA,0BAA0B,CACnCC,SACAC,OACc;QACd,GAAGA,IAAI;QAEP,YAAY;YACR,GAAGA,KAAK,UAAU;YAClB,GAAID,QAAQ,UAAU,IAAI,CAAC,CAAC;YAC5B,IAAKC,KAAK,UAAU,CAAyB,EAAE,IAAIA,KAAK,EAAE;YAC1D,MAAMA,KAAK,UAAU,CAAC,IAAI;QAC9B;QACA,UAAU;YACN,GAAGA,KAAK,QAAQ;YAChB,GAAID,QAAQ,QAAQ,IAAI,CAAC,CAAC;YAC1B,cAAeC,KAAK,QAAQ,CAAyB,YAAY,IAAI;YAGrE,oBAAoBD,QAAQ,EAAE;QAClC;QACA,UAAWA,QAAQ,QAAQ,IAAIC,KAAK,QAAQ;QAC5C,UAAWD,QAAQ,QAAQ,IAAIC,KAAK,QAAQ;QAC5C,YAAYD,QAAQ,UAAU,IAAIC,KAAK,UAAU,IAAI,CAAC;IAC1D;AAGO,MAAMC,gCAAgC,CAACC;IAE1C,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,UAAU,GAAGF,SAAS,QAAQ;IAE7D,OAAO;QACH,YAAYA,SAAS,UAAU;QAC/BE;QACA,UAAUF,SAAS,QAAQ;QAC3B,UAAUA,SAAS,QAAQ;QAC3B,YAAYA,SAAS,UAAU;IACnC;AACJ"}
@@ -1,5 +1,6 @@
1
1
  import react from "react";
2
2
  import { AdminConfig, useToggler } from "@webiny/app-admin";
3
+ import { ReactComponent } from "@webiny/icons/integration_instructions.svg";
3
4
  import { StarterKitConfigDialog } from "./StarterKitConfigDialog.js";
4
5
  const { Menu: Menu } = AdminConfig;
5
6
  const Extension = /*#__PURE__*/ react.memo(()=>{
@@ -8,12 +9,15 @@ const Extension = /*#__PURE__*/ react.memo(()=>{
8
9
  open: on,
9
10
  onClose: toggleOff
10
11
  }), /*#__PURE__*/ react.createElement(Menu, {
11
- name: "wb.starterKit",
12
- parent: "wb",
13
- pin: "end",
12
+ name: "dev-tools.frontend",
13
+ parent: "dev-tools",
14
14
  element: /*#__PURE__*/ react.createElement(Menu.Item, {
15
- text: "Configure Starter Kit",
16
- onClick: toggleOn
15
+ text: "Configure Frontend",
16
+ onClick: toggleOn,
17
+ icon: /*#__PURE__*/ react.createElement(Menu.Link.Icon, {
18
+ label: "Configure Integrations",
19
+ element: /*#__PURE__*/ react.createElement(ReactComponent, null)
20
+ })
17
21
  })
18
22
  }));
19
23
  });
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/navigation/Extension.js","sources":["../../../src/presentation/navigation/Extension.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig, useToggler } from \"@webiny/app-admin\";\nimport { StarterKitConfigDialog } from \"./StarterKitConfigDialog.js\";\n\nconst { Menu } = AdminConfig;\n\nexport const Extension = React.memo(() => {\n const { on, toggleOn, toggleOff } = useToggler(false);\n\n return (\n <>\n <StarterKitConfigDialog open={on} onClose={toggleOff} />\n <Menu\n name={\"wb.starterKit\"}\n parent={\"wb\"}\n pin={\"end\"}\n element={<Menu.Item text={\"Configure Starter Kit\"} onClick={toggleOn} />}\n />\n </>\n );\n});\n\nExtension.displayName = \"NavigationExtension\";\n"],"names":["Menu","AdminConfig","Extension","React","on","toggleOn","toggleOff","useToggler","StarterKitConfigDialog"],"mappings":";;;AAIA,MAAM,EAAEA,MAAAA,IAAI,EAAE,GAAGC;AAEV,MAAMC,YAAY,WAAHA,GAAGC,MAAAA,IAAU,CAAC;IAChC,MAAM,EAAEC,EAAE,EAAEC,QAAQ,EAAEC,SAAS,EAAE,GAAGC,WAAW;IAE/C,OAAO,WAAP,GACI,wDACI,oBAACC,wBAAsBA;QAAC,MAAMJ;QAAI,SAASE;sBAC3C,oBAACN,MAAIA;QACD,MAAM;QACN,QAAQ;QACR,KAAK;QACL,uBAAS,oBAACA,KAAK,IAAI;YAAC,MAAM;YAAyB,SAASK;;;AAI5E;AAEAH,UAAU,WAAW,GAAG"}
1
+ {"version":3,"file":"presentation/navigation/Extension.js","sources":["../../../src/presentation/navigation/Extension.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig, useToggler } from \"@webiny/app-admin\";\nimport { ReactComponent as IntegrationIcon } from \"@webiny/icons/integration_instructions.svg\";\nimport { StarterKitConfigDialog } from \"./StarterKitConfigDialog.js\";\n\nconst { Menu } = AdminConfig;\n\nexport const Extension = React.memo(() => {\n const { on, toggleOn, toggleOff } = useToggler(false);\n\n return (\n <>\n <StarterKitConfigDialog open={on} onClose={toggleOff} />\n <Menu\n name={\"dev-tools.frontend\"}\n parent={\"dev-tools\"}\n element={\n <Menu.Item\n text={\"Configure Frontend\"}\n onClick={toggleOn}\n icon={\n <Menu.Link.Icon\n label={\"Configure Integrations\"}\n element={<IntegrationIcon />}\n />\n }\n />\n }\n />\n </>\n );\n});\n\nExtension.displayName = \"NavigationExtension\";\n"],"names":["Menu","AdminConfig","Extension","React","on","toggleOn","toggleOff","useToggler","StarterKitConfigDialog","IntegrationIcon"],"mappings":";;;;AAKA,MAAM,EAAEA,MAAAA,IAAI,EAAE,GAAGC;AAEV,MAAMC,YAAY,WAAHA,GAAGC,MAAAA,IAAU,CAAC;IAChC,MAAM,EAAEC,EAAE,EAAEC,QAAQ,EAAEC,SAAS,EAAE,GAAGC,WAAW;IAE/C,OAAO,WAAP,GACI,wDACI,oBAACC,wBAAsBA;QAAC,MAAMJ;QAAI,SAASE;sBAC3C,oBAACN,MAAIA;QACD,MAAM;QACN,QAAQ;QACR,uBACI,oBAACA,KAAK,IAAI;YACN,MAAM;YACN,SAASK;YACT,oBACI,oBAACL,KAAK,IAAI,CAAC,IAAI;gBACX,OAAO;gBACP,uBAAS,oBAACS,gBAAeA;;;;AAQzD;AAEAP,UAAU,WAAW,GAAG"}
@@ -3,7 +3,7 @@ interface IStartDialogProps {
3
3
  open: boolean;
4
4
  onClose: () => void;
5
5
  }
6
- export declare const NexjsConfigDialog: ((props: IStartDialogProps) => React.JSX.Element) & {
7
- displayName: string;
6
+ export declare const NexjsConfigDialog: ((props: IStartDialogProps) => React.JSX.Element) & React.NamedExoticComponent<IStartDialogProps> & {
7
+ readonly type: (props: IStartDialogProps) => React.JSX.Element;
8
8
  };
9
9
  export {};
@@ -70,7 +70,7 @@ const StarterKitConfigDialog = ({ open, onClose })=>{
70
70
  size: "xl",
71
71
  bodyPadding: false,
72
72
  onOpenChange: onClose,
73
- title: "Configure Starter Kit",
73
+ title: "Configure Frontend",
74
74
  actions: /*#__PURE__*/ react.createElement(Dialog.CancelAction, {
75
75
  text: "Close"
76
76
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/navigation/StarterKitConfigDialog.js","sources":["../../../src/presentation/navigation/StarterKitConfigDialog.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { compiler } from \"markdown-to-jsx/react\";\nimport { Dialog, OverlayLoader, Tabs } from \"@webiny/admin-ui\";\nimport { useFeature } from \"@webiny/app\";\nimport { NextjsConfigFeature } from \"~/presentation/navigation/NextjsConfig/feature.js\";\nimport { NuxtConfigFeature } from \"~/presentation/navigation/NuxtConfig/feature.js\";\nimport { markdownComponents } from \"~/presentation/navigation/NextjsConfig/markdownComponents.js\";\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n}\n\nconst NextjsTabContent = observer(({ open }: { open: boolean }) => {\n const { presenter } = useFeature(NextjsConfigFeature);\n\n useEffect(() => {\n if (open) {\n presenter.init();\n }\n }, [open]);\n\n const { loading, config } = presenter.vm;\n\n if (loading) {\n return (\n <div className={\"relative\"} style={{ height: 80 }}>\n <OverlayLoader text={\"Loading config...\"} />\n </div>\n );\n }\n\n return <>{compiler(config, { overrides: markdownComponents })}</>;\n});\n\nconst NuxtTabContent = observer(({ open }: { open: boolean }) => {\n const { presenter } = useFeature(NuxtConfigFeature);\n\n useEffect(() => {\n if (open) {\n presenter.init();\n }\n }, [open]);\n\n const { loading, config } = presenter.vm;\n\n if (loading) {\n return (\n <div className={\"relative\"} style={{ height: 80 }}>\n <OverlayLoader text={\"Loading config...\"} />\n </div>\n );\n }\n\n return <>{compiler(config, { overrides: markdownComponents })}</>;\n});\n\nexport const StarterKitConfigDialog = ({ open, onClose }: Props) => {\n const tabs = [\n <Tabs.Tab\n key={\"nextjs\"}\n trigger={\"Next.js\"}\n value={\"nextjs\"}\n content={<NextjsTabContent open={open} />}\n />,\n <Tabs.Tab\n key={\"nuxt\"}\n trigger={\"Nuxt\"}\n value={\"nuxt\"}\n content={<NuxtTabContent open={open} />}\n />\n ];\n\n return (\n <Dialog\n open={open}\n size={\"xl\"}\n bodyPadding={false}\n onOpenChange={onClose}\n title={\"Configure Starter Kit\"}\n actions={<Dialog.CancelAction text={\"Close\"} />}\n showCloseButton={true}\n dismissible={true}\n >\n <Tabs tabs={tabs} size={\"md\"} spacing={\"lg\"} separator={true} />\n </Dialog>\n );\n};\n"],"names":["NextjsTabContent","observer","open","presenter","useFeature","NextjsConfigFeature","useEffect","loading","config","OverlayLoader","compiler","markdownComponents","NuxtTabContent","NuxtConfigFeature","StarterKitConfigDialog","onClose","tabs","Tabs","Dialog"],"mappings":";;;;;;;;AAcA,MAAMA,mBAAmBC,SAAS,CAAC,EAAEC,IAAI,EAAqB;IAC1D,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IAEjCC,UAAU;QACN,IAAIJ,MACAC,UAAU,IAAI;IAEtB,GAAG;QAACD;KAAK;IAET,MAAM,EAAEK,OAAO,EAAEC,MAAM,EAAE,GAAGL,UAAU,EAAE;IAExC,IAAII,SACA,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;QAAY,OAAO;YAAE,QAAQ;QAAG;qBAC5C,oBAACE,eAAaA;QAAC,MAAM;;IAKjC,OAAO,WAAP,GAAO,0CAAGC,SAASF,QAAQ;QAAE,WAAWG;IAAmB;AAC/D;AAEA,MAAMC,iBAAiBX,SAAS,CAAC,EAAEC,IAAI,EAAqB;IACxD,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWS;IAEjCP,UAAU;QACN,IAAIJ,MACAC,UAAU,IAAI;IAEtB,GAAG;QAACD;KAAK;IAET,MAAM,EAAEK,OAAO,EAAEC,MAAM,EAAE,GAAGL,UAAU,EAAE;IAExC,IAAII,SACA,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;QAAY,OAAO;YAAE,QAAQ;QAAG;qBAC5C,oBAACE,eAAaA;QAAC,MAAM;;IAKjC,OAAO,WAAP,GAAO,0CAAGC,SAASF,QAAQ;QAAE,WAAWG;IAAmB;AAC/D;AAEO,MAAMG,yBAAyB,CAAC,EAAEZ,IAAI,EAAEa,OAAO,EAAS;IAC3D,MAAMC,OAAO;sBACT,oBAACC,KAAK,GAAG;YACL,KAAK;YACL,SAAS;YACT,OAAO;YACP,uBAAS,oBAACjB,kBAAgBA;gBAAC,MAAME;;;sBAErC,oBAACe,KAAK,GAAG;YACL,KAAK;YACL,SAAS;YACT,OAAO;YACP,uBAAS,oBAACL,gBAAcA;gBAAC,MAAMV;;;KAEtC;IAED,OAAO,WAAP,GACI,oBAACgB,QAAMA;QACH,MAAMhB;QACN,MAAM;QACN,aAAa;QACb,cAAca;QACd,OAAO;QACP,uBAAS,oBAACG,OAAO,YAAY;YAAC,MAAM;;QACpC,iBAAiB;QACjB,aAAa;qBAEb,oBAACD,MAAIA;QAAC,MAAMD;QAAM,MAAM;QAAM,SAAS;QAAM,WAAW;;AAGpE"}
1
+ {"version":3,"file":"presentation/navigation/StarterKitConfigDialog.js","sources":["../../../src/presentation/navigation/StarterKitConfigDialog.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { compiler } from \"markdown-to-jsx/react\";\nimport { Dialog, OverlayLoader, Tabs } from \"@webiny/admin-ui\";\nimport { useFeature } from \"@webiny/app\";\nimport { NextjsConfigFeature } from \"~/presentation/navigation/NextjsConfig/feature.js\";\nimport { NuxtConfigFeature } from \"~/presentation/navigation/NuxtConfig/feature.js\";\nimport { markdownComponents } from \"~/presentation/navigation/NextjsConfig/markdownComponents.js\";\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n}\n\nconst NextjsTabContent = observer(({ open }: { open: boolean }) => {\n const { presenter } = useFeature(NextjsConfigFeature);\n\n useEffect(() => {\n if (open) {\n presenter.init();\n }\n }, [open]);\n\n const { loading, config } = presenter.vm;\n\n if (loading) {\n return (\n <div className={\"relative\"} style={{ height: 80 }}>\n <OverlayLoader text={\"Loading config...\"} />\n </div>\n );\n }\n\n return <>{compiler(config, { overrides: markdownComponents })}</>;\n});\n\nconst NuxtTabContent = observer(({ open }: { open: boolean }) => {\n const { presenter } = useFeature(NuxtConfigFeature);\n\n useEffect(() => {\n if (open) {\n presenter.init();\n }\n }, [open]);\n\n const { loading, config } = presenter.vm;\n\n if (loading) {\n return (\n <div className={\"relative\"} style={{ height: 80 }}>\n <OverlayLoader text={\"Loading config...\"} />\n </div>\n );\n }\n\n return <>{compiler(config, { overrides: markdownComponents })}</>;\n});\n\nexport const StarterKitConfigDialog = ({ open, onClose }: Props) => {\n const tabs = [\n <Tabs.Tab\n key={\"nextjs\"}\n trigger={\"Next.js\"}\n value={\"nextjs\"}\n content={<NextjsTabContent open={open} />}\n />,\n <Tabs.Tab\n key={\"nuxt\"}\n trigger={\"Nuxt\"}\n value={\"nuxt\"}\n content={<NuxtTabContent open={open} />}\n />\n ];\n\n return (\n <Dialog\n open={open}\n size={\"xl\"}\n bodyPadding={false}\n onOpenChange={onClose}\n title={\"Configure Frontend\"}\n actions={<Dialog.CancelAction text={\"Close\"} />}\n showCloseButton={true}\n dismissible={true}\n >\n <Tabs tabs={tabs} size={\"md\"} spacing={\"lg\"} separator={true} />\n </Dialog>\n );\n};\n"],"names":["NextjsTabContent","observer","open","presenter","useFeature","NextjsConfigFeature","useEffect","loading","config","OverlayLoader","compiler","markdownComponents","NuxtTabContent","NuxtConfigFeature","StarterKitConfigDialog","onClose","tabs","Tabs","Dialog"],"mappings":";;;;;;;;AAcA,MAAMA,mBAAmBC,SAAS,CAAC,EAAEC,IAAI,EAAqB;IAC1D,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IAEjCC,UAAU;QACN,IAAIJ,MACAC,UAAU,IAAI;IAEtB,GAAG;QAACD;KAAK;IAET,MAAM,EAAEK,OAAO,EAAEC,MAAM,EAAE,GAAGL,UAAU,EAAE;IAExC,IAAII,SACA,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;QAAY,OAAO;YAAE,QAAQ;QAAG;qBAC5C,oBAACE,eAAaA;QAAC,MAAM;;IAKjC,OAAO,WAAP,GAAO,0CAAGC,SAASF,QAAQ;QAAE,WAAWG;IAAmB;AAC/D;AAEA,MAAMC,iBAAiBX,SAAS,CAAC,EAAEC,IAAI,EAAqB;IACxD,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWS;IAEjCP,UAAU;QACN,IAAIJ,MACAC,UAAU,IAAI;IAEtB,GAAG;QAACD;KAAK;IAET,MAAM,EAAEK,OAAO,EAAEC,MAAM,EAAE,GAAGL,UAAU,EAAE;IAExC,IAAII,SACA,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;QAAY,OAAO;YAAE,QAAQ;QAAG;qBAC5C,oBAACE,eAAaA;QAAC,MAAM;;IAKjC,OAAO,WAAP,GAAO,0CAAGC,SAASF,QAAQ;QAAE,WAAWG;IAAmB;AAC/D;AAEO,MAAMG,yBAAyB,CAAC,EAAEZ,IAAI,EAAEa,OAAO,EAAS;IAC3D,MAAMC,OAAO;sBACT,oBAACC,KAAK,GAAG;YACL,KAAK;YACL,SAAS;YACT,OAAO;YACP,uBAAS,oBAACjB,kBAAgBA;gBAAC,MAAME;;;sBAErC,oBAACe,KAAK,GAAG;YACL,KAAK;YACL,SAAS;YACT,OAAO;YACP,uBAAS,oBAACL,gBAAcA;gBAAC,MAAMV;;;KAEtC;IAED,OAAO,WAAP,GACI,oBAACgB,QAAMA;QACH,MAAMhB;QACN,MAAM;QACN,aAAa;QACb,cAAca;QACd,OAAO;QACP,uBAAS,oBAACG,OAAO,YAAY;YAAC,MAAM;;QACpC,iBAAiB;QACjB,aAAa;qBAEb,oBAACD,MAAIA;QAAC,MAAMD;QAAM,MAAM;QAAM,SAAS;QAAM,WAAW;;AAGpE"}
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  export declare const CREATE_PAGE_DIALOG = "createPage";
3
3
  export declare const useCreatePageDialog: () => (folderId: string) => void;
4
- export declare const CreatePageDialog: (() => React.JSX.Element) & {
5
- displayName: string;
4
+ export declare const CreatePageDialog: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
5
+ readonly type: () => React.JSX.Element;
6
6
  };
@@ -81,7 +81,7 @@ class CreatePagePresenterImpl {
81
81
  buildForm() {
82
82
  const form = this.factory.create({
83
83
  fields: (fields)=>({
84
- title: fields.text().label("Title").required("Title is required").onBlur((value, { form })=>{
84
+ title: fields.text().label("Title").required("Title is required").autoFocus().onBlur((value, { form })=>{
85
85
  const currentPath = form.field("path").as("text").getValue() ?? "";
86
86
  if (!PagePath.create(currentPath).isEmpty()) return;
87
87
  const newPath = PagePath.fromTitle(String(value)).toString();
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/pages/CreatePage/CreatePagePresenter.js","sources":["../../../../src/presentation/pages/CreatePage/CreatePagePresenter.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport type { IFormModel, IFormModelFactory } from \"@webiny/app-admin\";\nimport { FormModelFactory } from \"@webiny/app-admin\";\nimport { CreatePageUseCase } from \"~/features/pages/createPage/abstractions.js\";\nimport type { CreatePageParams } from \"~/features/pages/createPage/abstractions.js\";\nimport {\n CreatePagePresenter as PresenterAbstraction,\n PageTypeProvider,\n CreatePageFormModifier\n} from \"./abstractions.js\";\nimport { PagePath } from \"~/shared/PagePath.js\";\n\nclass CreatePagePresenterImpl implements PresenterAbstraction.Interface {\n private readonly pageTypes;\n private form: IFormModel;\n private selectedPageType = \"\";\n private folderId = \"\";\n private loading = false;\n\n constructor(\n private factory: IFormModelFactory,\n pageTypeProvider: PageTypeProvider.Interface,\n private modifiers: CreatePageFormModifier.Interface[],\n private createPage: CreatePageUseCase.Interface\n ) {\n this.pageTypes = pageTypeProvider.getPageTypes();\n this.form = this.buildForm();\n\n makeAutoObservable(this, { vm: computed }, { autoBind: true });\n }\n\n get vm(): PresenterAbstraction.ViewModel {\n return {\n form: this.form.vm,\n pageTypes: this.pageTypes,\n selectedPageType: this.selectedPageType,\n loading: this.loading\n };\n }\n\n init(folderId: string): void {\n this.folderId = folderId;\n const staticPage = this.pageTypes.find(p => p.name === \"static\");\n this.selectedPageType = staticPage ? \"static\" : this.pageTypes[0]?.name;\n this.form = this.buildForm();\n }\n\n changePageType(pageType: string): void {\n const previousData = this.form.getData();\n this.selectedPageType = pageType;\n this.form = this.buildForm();\n this.form.setData(previousData);\n }\n\n async submit() {\n const data = await this.form.submit();\n if (!data) {\n return null;\n }\n\n const input: CreatePageParams = {\n location: {\n folderId: String(data.folderId)\n },\n properties: {\n title: data.title,\n path: data.path\n },\n metadata: {\n documentType: \"page\",\n pageType: data.pageType\n },\n elements: {\n root: {\n type: \"Webiny/Element\",\n id: \"root\",\n component: {\n name: \"Webiny/Root\"\n }\n }\n }\n };\n\n // Let the active page type map its form data.\n const pageType = this.pageTypes.find(pt => pt.name === this.selectedPageType);\n if (pageType?.mapFromForm) {\n pageType.mapFromForm(data, input);\n }\n\n // Let cross-cutting modifiers map their form data.\n for (const modifier of this.modifiers) {\n if (modifier.mapFromForm) {\n modifier.mapFromForm(data, input);\n }\n }\n\n runInAction(() => {\n this.loading = true;\n });\n try {\n return await this.createPage.execute(input);\n } finally {\n runInAction(() => {\n this.loading = false;\n });\n }\n }\n\n private buildForm(): IFormModel {\n // Layer 1: Base form — always present regardless of page type\n const form = this.factory.create({\n fields: fields => ({\n title: fields\n .text()\n .label(\"Title\")\n .required(\"Title is required\")\n .onBlur((value, { form }) => {\n const currentPath = form.field(\"path\").as(\"text\").getValue() ?? \"\";\n if (!PagePath.create(currentPath).isEmpty()) {\n return;\n }\n const newPath = PagePath.fromTitle(String(value)).toString();\n form.field(\"path\").setValue(newPath);\n }),\n path: fields\n .text()\n .label(\"Path\")\n .required(\"Path is required\")\n .beforeChange(value => {\n return PagePath.create(String(value)).slugify().toString();\n }),\n pageType: fields\n .text()\n .hidden()\n .defaultValue(this.selectedPageType || \"static\"),\n folderId: fields.text().hidden().defaultValue(this.folderId)\n }),\n layout: layout => [layout.row(\"title\"), layout.row(\"path\")]\n });\n\n // Layer 2: Apply the selected page type's modifications\n const pageType = this.pageTypes.find(pt => pt.name === this.selectedPageType);\n if (pageType && typeof pageType.modifyForm === \"function\") {\n pageType.modifyForm(form);\n }\n\n // Layer 3: Apply cross-cutting modifiers (Language, etc.)\n for (const modifier of this.modifiers) {\n modifier.modifyForm(form);\n }\n\n return form;\n }\n}\n\nexport const CreatePagePresenter = PresenterAbstraction.createImplementation({\n implementation: CreatePagePresenterImpl,\n dependencies: [\n FormModelFactory,\n PageTypeProvider,\n [CreatePageFormModifier, { multiple: true }],\n CreatePageUseCase\n ]\n});\n"],"names":["CreatePagePresenterImpl","factory","pageTypeProvider","modifiers","createPage","makeAutoObservable","computed","folderId","staticPage","p","pageType","previousData","data","input","String","pt","modifier","runInAction","form","fields","value","currentPath","PagePath","newPath","layout","CreatePagePresenter","PresenterAbstraction","FormModelFactory","PageTypeProvider","CreatePageFormModifier","CreatePageUseCase"],"mappings":";;;;;AAYA,MAAMA;IAOF,YACYC,OAA0B,EAClCC,gBAA4C,EACpCC,SAA6C,EAC7CC,UAAuC,CACjD;aAJUH,OAAO,GAAPA;aAEAE,SAAS,GAATA;aACAC,UAAU,GAAVA;aARJ,gBAAgB,GAAG;aACnB,QAAQ,GAAG;aACX,OAAO,GAAG;QAQd,IAAI,CAAC,SAAS,GAAGF,iBAAiB,YAAY;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS;QAE1BG,mBAAmB,IAAI,EAAE;YAAE,IAAIC;QAAS,GAAG;YAAE,UAAU;QAAK;IAChE;IAEA,IAAI,KAAqC;QACrC,OAAO;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE;YAClB,WAAW,IAAI,CAAC,SAAS;YACzB,kBAAkB,IAAI,CAAC,gBAAgB;YACvC,SAAS,IAAI,CAAC,OAAO;QACzB;IACJ;IAEA,KAAKC,QAAgB,EAAQ;QACzB,IAAI,CAAC,QAAQ,GAAGA;QAChB,MAAMC,aAAa,IAAI,CAAC,SAAS,CAAC,IAAI,CAACC,CAAAA,IAAKA,AAAW,aAAXA,EAAE,IAAI;QAClD,IAAI,CAAC,gBAAgB,GAAGD,aAAa,WAAW,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE;QACnE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS;IAC9B;IAEA,eAAeE,QAAgB,EAAQ;QACnC,MAAMC,eAAe,IAAI,CAAC,IAAI,CAAC,OAAO;QACtC,IAAI,CAAC,gBAAgB,GAAGD;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAACC;IACtB;IAEA,MAAM,SAAS;QACX,MAAMC,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM;QACnC,IAAI,CAACA,MACD,OAAO;QAGX,MAAMC,QAA0B;YAC5B,UAAU;gBACN,UAAUC,OAAOF,KAAK,QAAQ;YAClC;YACA,YAAY;gBACR,OAAOA,KAAK,KAAK;gBACjB,MAAMA,KAAK,IAAI;YACnB;YACA,UAAU;gBACN,cAAc;gBACd,UAAUA,KAAK,QAAQ;YAC3B;YACA,UAAU;gBACN,MAAM;oBACF,MAAM;oBACN,IAAI;oBACJ,WAAW;wBACP,MAAM;oBACV;gBACJ;YACJ;QACJ;QAGA,MAAMF,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAACK,CAAAA,KAAMA,GAAG,IAAI,KAAK,IAAI,CAAC,gBAAgB;QAC5E,IAAIL,UAAU,aACVA,SAAS,WAAW,CAACE,MAAMC;QAI/B,KAAK,MAAMG,YAAY,IAAI,CAAC,SAAS,CACjC,IAAIA,SAAS,WAAW,EACpBA,SAAS,WAAW,CAACJ,MAAMC;QAInCI,YAAY;YACR,IAAI,CAAC,OAAO,GAAG;QACnB;QACA,IAAI;YACA,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACJ;QACzC,SAAU;YACNI,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;YACnB;QACJ;IACJ;IAEQ,YAAwB;QAE5B,MAAMC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAC7B,QAAQC,CAAAA,SAAW;oBACf,OAAOA,OACF,IAAI,GACJ,KAAK,CAAC,SACN,QAAQ,CAAC,qBACT,MAAM,CAAC,CAACC,OAAO,EAAEF,IAAI,EAAE;wBACpB,MAAMG,cAAcH,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,QAAQ,MAAM;wBAChE,IAAI,CAACI,SAAS,MAAM,CAACD,aAAa,OAAO,IACrC;wBAEJ,MAAME,UAAUD,SAAS,SAAS,CAACR,OAAOM,QAAQ,QAAQ;wBAC1DF,KAAK,KAAK,CAAC,QAAQ,QAAQ,CAACK;oBAChC;oBACJ,MAAMJ,OACD,IAAI,GACJ,KAAK,CAAC,QACN,QAAQ,CAAC,oBACT,YAAY,CAACC,CAAAA,QACHE,SAAS,MAAM,CAACR,OAAOM,QAAQ,OAAO,GAAG,QAAQ;oBAEhE,UAAUD,OACL,IAAI,GACJ,MAAM,GACN,YAAY,CAAC,IAAI,CAAC,gBAAgB,IAAI;oBAC3C,UAAUA,OAAO,IAAI,GAAG,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ;gBAC/D;YACA,QAAQK,CAAAA,SAAU;oBAACA,OAAO,GAAG,CAAC;oBAAUA,OAAO,GAAG,CAAC;iBAAQ;QAC/D;QAGA,MAAMd,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAACK,CAAAA,KAAMA,GAAG,IAAI,KAAK,IAAI,CAAC,gBAAgB;QAC5E,IAAIL,YAAY,AAA+B,cAA/B,OAAOA,SAAS,UAAU,EACtCA,SAAS,UAAU,CAACQ;QAIxB,KAAK,MAAMF,YAAY,IAAI,CAAC,SAAS,CACjCA,SAAS,UAAU,CAACE;QAGxB,OAAOA;IACX;AACJ;AAEO,MAAMO,0CAAsBC,oBAAAA,oBAAyC,CAAC;IACzE,gBAAgB1B;IAChB,cAAc;QACV2B;QACAC;QACA;YAACC;YAAwB;gBAAE,UAAU;YAAK;SAAE;QAC5CC;KACH;AACL"}
1
+ {"version":3,"file":"presentation/pages/CreatePage/CreatePagePresenter.js","sources":["../../../../src/presentation/pages/CreatePage/CreatePagePresenter.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport type { IFormModel, IFormModelFactory } from \"@webiny/app-admin\";\nimport { FormModelFactory } from \"@webiny/app-admin\";\nimport { CreatePageUseCase } from \"~/features/pages/createPage/abstractions.js\";\nimport type { CreatePageParams } from \"~/features/pages/createPage/abstractions.js\";\nimport {\n CreatePagePresenter as PresenterAbstraction,\n PageTypeProvider,\n CreatePageFormModifier\n} from \"./abstractions.js\";\nimport { PagePath } from \"~/shared/PagePath.js\";\n\nclass CreatePagePresenterImpl implements PresenterAbstraction.Interface {\n private readonly pageTypes;\n private form: IFormModel;\n private selectedPageType = \"\";\n private folderId = \"\";\n private loading = false;\n\n constructor(\n private factory: IFormModelFactory,\n pageTypeProvider: PageTypeProvider.Interface,\n private modifiers: CreatePageFormModifier.Interface[],\n private createPage: CreatePageUseCase.Interface\n ) {\n this.pageTypes = pageTypeProvider.getPageTypes();\n this.form = this.buildForm();\n\n makeAutoObservable(this, { vm: computed }, { autoBind: true });\n }\n\n get vm(): PresenterAbstraction.ViewModel {\n return {\n form: this.form.vm,\n pageTypes: this.pageTypes,\n selectedPageType: this.selectedPageType,\n loading: this.loading\n };\n }\n\n init(folderId: string): void {\n this.folderId = folderId;\n const staticPage = this.pageTypes.find(p => p.name === \"static\");\n this.selectedPageType = staticPage ? \"static\" : this.pageTypes[0]?.name;\n this.form = this.buildForm();\n }\n\n changePageType(pageType: string): void {\n const previousData = this.form.getData();\n this.selectedPageType = pageType;\n this.form = this.buildForm();\n this.form.setData(previousData);\n }\n\n async submit() {\n const data = await this.form.submit();\n if (!data) {\n return null;\n }\n\n const input: CreatePageParams = {\n location: {\n folderId: String(data.folderId)\n },\n properties: {\n title: data.title,\n path: data.path\n },\n metadata: {\n documentType: \"page\",\n pageType: data.pageType\n },\n elements: {\n root: {\n type: \"Webiny/Element\",\n id: \"root\",\n component: {\n name: \"Webiny/Root\"\n }\n }\n }\n };\n\n // Let the active page type map its form data.\n const pageType = this.pageTypes.find(pt => pt.name === this.selectedPageType);\n if (pageType?.mapFromForm) {\n pageType.mapFromForm(data, input);\n }\n\n // Let cross-cutting modifiers map their form data.\n for (const modifier of this.modifiers) {\n if (modifier.mapFromForm) {\n modifier.mapFromForm(data, input);\n }\n }\n\n runInAction(() => {\n this.loading = true;\n });\n try {\n return await this.createPage.execute(input);\n } finally {\n runInAction(() => {\n this.loading = false;\n });\n }\n }\n\n private buildForm(): IFormModel {\n // Layer 1: Base form — always present regardless of page type\n const form = this.factory.create({\n fields: fields => ({\n title: fields\n .text()\n .label(\"Title\")\n .required(\"Title is required\")\n .autoFocus()\n .onBlur((value, { form }) => {\n const currentPath = form.field(\"path\").as(\"text\").getValue() ?? \"\";\n if (!PagePath.create(currentPath).isEmpty()) {\n return;\n }\n const newPath = PagePath.fromTitle(String(value)).toString();\n form.field(\"path\").setValue(newPath);\n }),\n path: fields\n .text()\n .label(\"Path\")\n .required(\"Path is required\")\n .beforeChange(value => {\n return PagePath.create(String(value)).slugify().toString();\n }),\n pageType: fields\n .text()\n .hidden()\n .defaultValue(this.selectedPageType || \"static\"),\n folderId: fields.text().hidden().defaultValue(this.folderId)\n }),\n layout: layout => [layout.row(\"title\"), layout.row(\"path\")]\n });\n\n // Layer 2: Apply the selected page type's modifications\n const pageType = this.pageTypes.find(pt => pt.name === this.selectedPageType);\n if (pageType && typeof pageType.modifyForm === \"function\") {\n pageType.modifyForm(form);\n }\n\n // Layer 3: Apply cross-cutting modifiers (Language, etc.)\n for (const modifier of this.modifiers) {\n modifier.modifyForm(form);\n }\n\n return form;\n }\n}\n\nexport const CreatePagePresenter = PresenterAbstraction.createImplementation({\n implementation: CreatePagePresenterImpl,\n dependencies: [\n FormModelFactory,\n PageTypeProvider,\n [CreatePageFormModifier, { multiple: true }],\n CreatePageUseCase\n ]\n});\n"],"names":["CreatePagePresenterImpl","factory","pageTypeProvider","modifiers","createPage","makeAutoObservable","computed","folderId","staticPage","p","pageType","previousData","data","input","String","pt","modifier","runInAction","form","fields","value","currentPath","PagePath","newPath","layout","CreatePagePresenter","PresenterAbstraction","FormModelFactory","PageTypeProvider","CreatePageFormModifier","CreatePageUseCase"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import react from "react";
2
- import { useWcp } from "@webiny/app-admin";
2
+ import { useFeatureFlags } from "@webiny/app-admin";
3
3
  import { Grid } from "@webiny/admin-ui";
4
4
  import { Bind } from "@webiny/form";
5
5
  import { LanguageSelector } from "../../components/LanguageSelector.js";
6
6
  const WithLanguageSelector = ({ languages, children })=>{
7
- const wcp = useWcp();
8
- if (!wcp.canUseFeature("multiTenancy")) return /*#__PURE__*/ react.createElement(react.Fragment, null, children);
7
+ const featureFlags = useFeatureFlags();
8
+ if (!featureFlags.isEnabled("multiTenancy")) return /*#__PURE__*/ react.createElement(react.Fragment, null, children);
9
9
  if (languages.length > 1) {
10
10
  const defaultLanguage = languages.find((l)=>l.isDefault);
11
11
  return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Grid.Column, {
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/pages/CreatePage/WithLanguageSelector.js","sources":["../../../../src/presentation/pages/CreatePage/WithLanguageSelector.tsx"],"sourcesContent":["import React from \"react\";\nimport { type LanguageDto } from \"@webiny/languages/exports/admin/languages.js\";\nimport { useWcp } from \"@webiny/app-admin\";\nimport { Grid } from \"@webiny/admin-ui\";\nimport { Bind } from \"@webiny/form\";\nimport { LanguageSelector } from \"~/presentation/components/LanguageSelector.js\";\n\nexport interface WithLanguageSelectorProps {\n languages: LanguageDto[];\n children: React.ReactNode;\n}\n\n// 1) no language exists\n// - no dropdown\n// - don’t store language info\n// 2) one language exists\n// - no dropdown\n// - auto-assign the default language\n// - DO NOT prepend the language code to the page path\n// 3) two or more languages exist\n// - dropdown\n// - preselect default language\n// - append the language code to the page path\n\nexport const WithLanguageSelector = ({ languages, children }: WithLanguageSelectorProps) => {\n const wcp = useWcp();\n\n if (!wcp.canUseFeature(\"multiTenancy\")) {\n return <>{children}</>;\n }\n\n if (languages.length > 1) {\n const defaultLanguage = languages.find(l => l.isDefault);\n\n return (\n <>\n <Grid.Column span={12}>\n <Bind name={\"properties.language\"} defaultValue={defaultLanguage?.code}>\n {({ value, onChange }) => (\n <LanguageSelector\n value={value}\n onChange={onChange}\n label={\"Language\"}\n languages={languages}\n displayResetAction={true}\n />\n )}\n </Bind>\n </Grid.Column>\n {children}\n </>\n );\n }\n\n if (languages.length === 1) {\n return <Bind name={\"properties.language\"} defaultValue={languages[0].code} />;\n }\n\n /* Default output */\n return <>{children}</>;\n};\n"],"names":["WithLanguageSelector","languages","children","wcp","useWcp","defaultLanguage","l","Grid","Bind","value","onChange","LanguageSelector"],"mappings":";;;;;AAwBO,MAAMA,uBAAuB,CAAC,EAAEC,SAAS,EAAEC,QAAQ,EAA6B;IACnF,MAAMC,MAAMC;IAEZ,IAAI,CAACD,IAAI,aAAa,CAAC,iBACnB,OAAO,WAAP,GAAO,0CAAGD;IAGd,IAAID,UAAU,MAAM,GAAG,GAAG;QACtB,MAAMI,kBAAkBJ,UAAU,IAAI,CAACK,CAAAA,IAAKA,EAAE,SAAS;QAEvD,OAAO,WAAP,GACI,wDACI,oBAACC,KAAK,MAAM;YAAC,MAAM;yBACf,oBAACC,MAAIA;YAAC,MAAM;YAAuB,cAAcH,iBAAiB;WAC7D,CAAC,EAAEI,KAAK,EAAEC,QAAQ,EAAE,iBACjB,oBAACC,kBAAgBA;gBACb,OAAOF;gBACP,UAAUC;gBACV,OAAO;gBACP,WAAWT;gBACX,oBAAoB;kBAKnCC;IAGb;IAEA,IAAID,AAAqB,MAArBA,UAAU,MAAM,EAChB,OAAO,WAAP,GAAO,oBAACO,MAAIA;QAAC,MAAM;QAAuB,cAAcP,SAAS,CAAC,EAAE,CAAC,IAAI;;IAI7E,OAAO,WAAP,GAAO,0CAAGC;AACd"}
1
+ {"version":3,"file":"presentation/pages/CreatePage/WithLanguageSelector.js","sources":["../../../../src/presentation/pages/CreatePage/WithLanguageSelector.tsx"],"sourcesContent":["import React from \"react\";\nimport { type LanguageDto } from \"@webiny/languages/exports/admin/languages.js\";\nimport { useFeatureFlags } from \"@webiny/app-admin\";\nimport { Grid } from \"@webiny/admin-ui\";\nimport { Bind } from \"@webiny/form\";\nimport { LanguageSelector } from \"~/presentation/components/LanguageSelector.js\";\n\nexport interface WithLanguageSelectorProps {\n languages: LanguageDto[];\n children: React.ReactNode;\n}\n\n// 1) no language exists\n// - no dropdown\n// - don’t store language info\n// 2) one language exists\n// - no dropdown\n// - auto-assign the default language\n// - DO NOT prepend the language code to the page path\n// 3) two or more languages exist\n// - dropdown\n// - preselect default language\n// - append the language code to the page path\n\nexport const WithLanguageSelector = ({ languages, children }: WithLanguageSelectorProps) => {\n const featureFlags = useFeatureFlags();\n\n if (!featureFlags.isEnabled(\"multiTenancy\")) {\n return <>{children}</>;\n }\n\n if (languages.length > 1) {\n const defaultLanguage = languages.find(l => l.isDefault);\n\n return (\n <>\n <Grid.Column span={12}>\n <Bind name={\"properties.language\"} defaultValue={defaultLanguage?.code}>\n {({ value, onChange }) => (\n <LanguageSelector\n value={value}\n onChange={onChange}\n label={\"Language\"}\n languages={languages}\n displayResetAction={true}\n />\n )}\n </Bind>\n </Grid.Column>\n {children}\n </>\n );\n }\n\n if (languages.length === 1) {\n return <Bind name={\"properties.language\"} defaultValue={languages[0].code} />;\n }\n\n /* Default output */\n return <>{children}</>;\n};\n"],"names":["WithLanguageSelector","languages","children","featureFlags","useFeatureFlags","defaultLanguage","l","Grid","Bind","value","onChange","LanguageSelector"],"mappings":";;;;;AAwBO,MAAMA,uBAAuB,CAAC,EAAEC,SAAS,EAAEC,QAAQ,EAA6B;IACnF,MAAMC,eAAeC;IAErB,IAAI,CAACD,aAAa,SAAS,CAAC,iBACxB,OAAO,WAAP,GAAO,0CAAGD;IAGd,IAAID,UAAU,MAAM,GAAG,GAAG;QACtB,MAAMI,kBAAkBJ,UAAU,IAAI,CAACK,CAAAA,IAAKA,EAAE,SAAS;QAEvD,OAAO,WAAP,GACI,wDACI,oBAACC,KAAK,MAAM;YAAC,MAAM;yBACf,oBAACC,MAAIA;YAAC,MAAM;YAAuB,cAAcH,iBAAiB;WAC7D,CAAC,EAAEI,KAAK,EAAEC,QAAQ,EAAE,iBACjB,oBAACC,kBAAgBA;gBACb,OAAOF;gBACP,UAAUC;gBACV,OAAO;gBACP,WAAWT;gBACX,oBAAoB;kBAKnCC;IAGb;IAEA,IAAID,AAAqB,MAArBA,UAAU,MAAM,EAChB,OAAO,WAAP,GAAO,oBAACO,MAAIA;QAAC,MAAM;QAAuB,cAAcP,SAAS,CAAC,EAAE,CAAC,IAAI;;IAI7E,OAAO,WAAP,GAAO,0CAAGC;AACd"}
@@ -1,5 +1,5 @@
1
1
  import { createFeature } from "@webiny/feature/admin";
2
- import { WcpService } from "@webiny/app-admin/features/wcp/abstractions.js";
2
+ import { FeatureFlagsService } from "@webiny/app-admin/features/featureFlags/abstractions.js";
3
3
  import { CreatePagePresenter } from "./abstractions.js";
4
4
  import { CreatePagePresenter as external_CreatePagePresenter_js_CreatePagePresenter } from "./CreatePagePresenter.js";
5
5
  import { PageTypeProvider } from "./PageTypeProvider.js";
@@ -11,8 +11,8 @@ const CreatePageFeature = createFeature({
11
11
  container.register(StaticPageType);
12
12
  container.register(PageTypeProvider);
13
13
  container.register(external_CreatePagePresenter_js_CreatePagePresenter);
14
- const wcp = container.resolve(WcpService);
15
- if (wcp.canUseFeature("multiTenancy")) container.register(AddLanguageModifier);
14
+ const featureFlagsService = container.resolve(FeatureFlagsService);
15
+ if (featureFlagsService.getFlags().isEnabled("multiTenancy")) container.register(AddLanguageModifier);
16
16
  },
17
17
  resolve (container) {
18
18
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/pages/CreatePage/feature.js","sources":["../../../../src/presentation/pages/CreatePage/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { WcpService } from \"@webiny/app-admin/features/wcp/abstractions.js\";\nimport { CreatePagePresenter as PresenterAbstraction } from \"./abstractions.js\";\nimport { CreatePagePresenter } from \"./CreatePagePresenter.js\";\nimport { PageTypeProvider } from \"./PageTypeProvider.js\";\nimport { StaticPageType } from \"./StaticPageType.js\";\nimport { AddLanguageModifier } from \"./AddLanguageModifier.js\";\n\nexport const CreatePageFeature = createFeature({\n name: \"CreatePage\",\n register(container) {\n container.register(StaticPageType);\n container.register(PageTypeProvider);\n container.register(CreatePagePresenter);\n\n // Languages are behind a feature flag\n const wcp = container.resolve(WcpService);\n if (wcp.canUseFeature(\"multiTenancy\")) {\n container.register(AddLanguageModifier);\n }\n },\n resolve(container) {\n return {\n presenter: container.resolve(PresenterAbstraction)\n };\n }\n});\n"],"names":["CreatePageFeature","createFeature","container","StaticPageType","PageTypeProvider","CreatePagePresenter","wcp","WcpService","AddLanguageModifier","PresenterAbstraction"],"mappings":";;;;;;;AAQO,MAAMA,oBAAoBC,cAAc;IAC3C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QAGnB,MAAMC,MAAMJ,UAAU,OAAO,CAACK;QAC9B,IAAID,IAAI,aAAa,CAAC,iBAClBJ,UAAU,QAAQ,CAACM;IAE3B;IACA,SAAQN,SAAS;QACb,OAAO;YACH,WAAWA,UAAU,OAAO,CAACO;QACjC;IACJ;AACJ"}
1
+ {"version":3,"file":"presentation/pages/CreatePage/feature.js","sources":["../../../../src/presentation/pages/CreatePage/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { FeatureFlagsService } from \"@webiny/app-admin/features/featureFlags/abstractions.js\";\nimport { CreatePagePresenter as PresenterAbstraction } from \"./abstractions.js\";\nimport { CreatePagePresenter } from \"./CreatePagePresenter.js\";\nimport { PageTypeProvider } from \"./PageTypeProvider.js\";\nimport { StaticPageType } from \"./StaticPageType.js\";\nimport { AddLanguageModifier } from \"./AddLanguageModifier.js\";\n\nexport const CreatePageFeature = createFeature({\n name: \"CreatePage\",\n register(container) {\n container.register(StaticPageType);\n container.register(PageTypeProvider);\n container.register(CreatePagePresenter);\n\n // Languages are behind a feature flag\n const featureFlagsService = container.resolve(FeatureFlagsService);\n if (featureFlagsService.getFlags().isEnabled(\"multiTenancy\")) {\n container.register(AddLanguageModifier);\n }\n },\n resolve(container) {\n return {\n presenter: container.resolve(PresenterAbstraction)\n };\n }\n});\n"],"names":["CreatePageFeature","createFeature","container","StaticPageType","PageTypeProvider","CreatePagePresenter","featureFlagsService","FeatureFlagsService","AddLanguageModifier","PresenterAbstraction"],"mappings":";;;;;;;AAQO,MAAMA,oBAAoBC,cAAc;IAC3C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QAGnB,MAAMC,sBAAsBJ,UAAU,OAAO,CAACK;QAC9C,IAAID,oBAAoB,QAAQ,GAAG,SAAS,CAAC,iBACzCJ,UAAU,QAAQ,CAACM;IAE3B;IACA,SAAQN,SAAS;QACb,OAAO;YACH,WAAWA,UAAU,OAAO,CAACO;QACjC;IACJ;AACJ"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const PageEditor: () => React.JSX.Element;
@@ -0,0 +1,54 @@
1
+ import react, { useEffect, useState } from "react";
2
+ import { useRoute } from "@webiny/app-admin";
3
+ import { useFeature } from "@webiny/app";
4
+ import { OverlayLoader } from "@webiny/admin-ui";
5
+ import { GetSettingsFeature } from "../../../features/settings/getSettings/index.js";
6
+ import { useGetPage } from "../../../features/pages/index.js";
7
+ import { Routes } from "../../../routes.js";
8
+ import { PageEditorDrawerProvider } from "./Revisions/usePageEditorDrawer.js";
9
+ import { PageEditorSurface } from "./PageEditorSurface.js";
10
+ import { pageToEditorDocument } from "./pageDocument.js";
11
+ import { ExperimentsEditorPresenterFeature } from "../../experiments/ExperimentsEditor/index.js";
12
+ import { ExperimentsDrawerView } from "../../experiments/ExperimentsManager/index.js";
13
+ const PageEditor = ()=>{
14
+ const { useCase: getSettings } = useFeature(GetSettingsFeature);
15
+ const [loading, setLoading] = useState(true);
16
+ const [page, setPage] = useState(null);
17
+ const [isRevisionListOpen, openRevisionList] = useState(false);
18
+ const { route } = useRoute(Routes.Pages.Editor);
19
+ const { getPage } = useGetPage();
20
+ const { presenter } = useFeature(ExperimentsEditorPresenterFeature);
21
+ useEffect(()=>{
22
+ setLoading(true);
23
+ Promise.all([
24
+ getSettings.execute(),
25
+ getPage({
26
+ id: route.params.id
27
+ }).then((page)=>{
28
+ setPage(pageToEditorDocument(page));
29
+ })
30
+ ]).then(()=>{
31
+ setLoading(false);
32
+ });
33
+ }, [
34
+ route.params.id
35
+ ]);
36
+ useEffect(()=>{
37
+ if (page) presenter.init(page.id);
38
+ }, [
39
+ presenter,
40
+ page?.id
41
+ ]);
42
+ if (loading || !page) return /*#__PURE__*/ react.createElement(OverlayLoader, {
43
+ text: "Loading page..."
44
+ });
45
+ return /*#__PURE__*/ react.createElement(PageEditorDrawerProvider, {
46
+ openRevisionList: openRevisionList,
47
+ isRevisionListOpen: isRevisionListOpen
48
+ }, /*#__PURE__*/ react.createElement(PageEditorSurface, {
49
+ page: page
50
+ }), /*#__PURE__*/ react.createElement(ExperimentsDrawerView, null));
51
+ };
52
+ export { PageEditor };
53
+
54
+ //# sourceMappingURL=PageEditor.experiments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/pages/PageEditor/PageEditor.experiments.js","sources":["../../../../src/presentation/pages/PageEditor/PageEditor.experiments.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { useRoute } from \"@webiny/app-admin\";\nimport { useFeature } from \"@webiny/app\";\nimport { OverlayLoader } from \"@webiny/admin-ui\";\nimport { GetSettingsFeature } from \"~/features/settings/getSettings/index.js\";\nimport type { EditorPage } from \"@webiny/website-builder-sdk\";\nimport { useGetPage } from \"~/features/pages/index.js\";\nimport { Routes } from \"~/routes.js\";\nimport { PageEditorDrawerProvider } from \"./Revisions/usePageEditorDrawer.js\";\nimport { PageEditorSurface } from \"./PageEditorSurface.js\";\nimport { pageToEditorDocument } from \"./pageDocument.js\";\nimport { ExperimentsEditorPresenterFeature } from \"~/presentation/experiments/ExperimentsEditor/index.js\";\nimport { ExperimentsDrawerView } from \"~/presentation/experiments/ExperimentsManager/index.js\";\n\nexport const PageEditor = () => {\n const { useCase: getSettings } = useFeature(GetSettingsFeature);\n const [loading, setLoading] = useState(true);\n const [page, setPage] = useState<EditorPage | null>(null);\n\n const [isRevisionListOpen, openRevisionList] = useState(false);\n\n const { route } = useRoute(Routes.Pages.Editor);\n\n const { getPage } = useGetPage();\n\n const { presenter } = useFeature(ExperimentsEditorPresenterFeature);\n\n useEffect(() => {\n setLoading(true);\n Promise.all([\n getSettings.execute(),\n getPage({ id: route.params.id }).then(page => {\n setPage(pageToEditorDocument(page));\n })\n ]).then(() => {\n setLoading(false);\n });\n }, [route.params.id]);\n\n // Initialize the experiments hub presenter with the page being edited; it owns the shared\n // selection state so the toolbar and editor surface can swap between the page and a variant.\n useEffect(() => {\n if (page) {\n presenter.init(page.id);\n }\n }, [presenter, page?.id]);\n\n if (loading || !page) {\n return <OverlayLoader text={\"Loading page...\"} />;\n }\n\n return (\n <PageEditorDrawerProvider\n openRevisionList={openRevisionList}\n isRevisionListOpen={isRevisionListOpen}\n >\n <PageEditorSurface page={page} />\n <ExperimentsDrawerView />\n </PageEditorDrawerProvider>\n );\n};\n"],"names":["PageEditor","getSettings","useFeature","GetSettingsFeature","loading","setLoading","useState","page","setPage","isRevisionListOpen","openRevisionList","route","useRoute","Routes","getPage","useGetPage","presenter","ExperimentsEditorPresenterFeature","useEffect","Promise","pageToEditorDocument","OverlayLoader","PageEditorDrawerProvider","PageEditorSurface","ExperimentsDrawerView"],"mappings":";;;;;;;;;;;;AAcO,MAAMA,aAAa;IACtB,MAAM,EAAE,SAASC,WAAW,EAAE,GAAGC,WAAWC;IAC5C,MAAM,CAACC,SAASC,WAAW,GAAGC,SAAS;IACvC,MAAM,CAACC,MAAMC,QAAQ,GAAGF,SAA4B;IAEpD,MAAM,CAACG,oBAAoBC,iBAAiB,GAAGJ,SAAS;IAExD,MAAM,EAAEK,KAAK,EAAE,GAAGC,SAASC,OAAO,KAAK,CAAC,MAAM;IAE9C,MAAM,EAAEC,OAAO,EAAE,GAAGC;IAEpB,MAAM,EAAEC,SAAS,EAAE,GAAGd,WAAWe;IAEjCC,UAAU;QACNb,WAAW;QACXc,QAAQ,GAAG,CAAC;YACRlB,YAAY,OAAO;YACnBa,QAAQ;gBAAE,IAAIH,MAAM,MAAM,CAAC,EAAE;YAAC,GAAG,IAAI,CAACJ,CAAAA;gBAClCC,QAAQY,qBAAqBb;YACjC;SACH,EAAE,IAAI,CAAC;YACJF,WAAW;QACf;IACJ,GAAG;QAACM,MAAM,MAAM,CAAC,EAAE;KAAC;IAIpBO,UAAU;QACN,IAAIX,MACAS,UAAU,IAAI,CAACT,KAAK,EAAE;IAE9B,GAAG;QAACS;QAAWT,MAAM;KAAG;IAExB,IAAIH,WAAW,CAACG,MACZ,OAAO,WAAP,GAAO,oBAACc,eAAaA;QAAC,MAAM;;IAGhC,OAAO,WAAP,GACI,oBAACC,0BAAwBA;QACrB,kBAAkBZ;QAClB,oBAAoBD;qBAEpB,oBAACc,mBAAiBA;QAAC,MAAMhB;sBACzB,oBAACiB,uBAAqBA;AAGlC"}
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ import type { EditorPage } from "@webiny/website-builder-sdk";
3
+ interface Props {
4
+ page: EditorPage;
5
+ }
6
+ /**
7
+ * Renders the editor for the bucket currently selected in the experiments toolbar: the page itself
8
+ * (control), or a variant loaded as an equivalent document. Switching buckets re-mounts the editor
9
+ * with the matching document and autosave; content is (re)fetched on each switch so returning to a
10
+ * bucket always shows its latest saved state.
11
+ */
12
+ export declare const PageEditorSurface: (({ page }: Props) => React.JSX.Element) & React.NamedExoticComponent<Props> & {
13
+ readonly type: ({ page }: Props) => React.JSX.Element;
14
+ };
15
+ export {};