@alpaca-editor/core 1.0.3762-mono

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 (460) hide show
  1. package/.prettierrc +3 -0
  2. package/dist/client-components/api.js +6 -0
  3. package/dist/client-components/index.js +36 -0
  4. package/dist/components/ActionButton.js +9 -0
  5. package/dist/components/Error.js +28 -0
  6. package/dist/config/config.js +654 -0
  7. package/dist/config/types.js +2 -0
  8. package/dist/editor/ComponentInfo.js +31 -0
  9. package/dist/editor/ConfirmationDialog.js +32 -0
  10. package/dist/editor/ContentTree.js +406 -0
  11. package/dist/editor/ContextMenu.js +117 -0
  12. package/dist/editor/Editor.js +55 -0
  13. package/dist/editor/EditorWarning.js +13 -0
  14. package/dist/editor/EditorWarnings.js +24 -0
  15. package/dist/editor/FieldEditorPopup.js +24 -0
  16. package/dist/editor/FieldHistory.js +40 -0
  17. package/dist/editor/FieldList.js +63 -0
  18. package/dist/editor/FieldListField.js +164 -0
  19. package/dist/editor/FieldListFieldWithFallbacks.js +114 -0
  20. package/dist/editor/FloatingToolbar.js +92 -0
  21. package/dist/editor/ImageEditor.js +55 -0
  22. package/dist/editor/InsertMenu.js +164 -0
  23. package/dist/editor/ItemInfo.js +30 -0
  24. package/dist/editor/LinkEditorDialog.js +89 -0
  25. package/dist/editor/MainLayout.js +46 -0
  26. package/dist/editor/NewEditorClient.js +9 -0
  27. package/dist/editor/PictureCropper.js +332 -0
  28. package/dist/editor/PictureEditor.js +104 -0
  29. package/dist/editor/PictureEditorDialog.js +194 -0
  30. package/dist/editor/ScrollingContentTree.js +30 -0
  31. package/dist/editor/Terminal.js +109 -0
  32. package/dist/editor/Titlebar.js +11 -0
  33. package/dist/editor/ai/AiPopup.js +25 -0
  34. package/dist/editor/ai/AiResponseMessage.js +24 -0
  35. package/dist/editor/ai/AiTerminal.js +241 -0
  36. package/dist/editor/ai/AiToolCall.js +18 -0
  37. package/dist/editor/ai/EditorAiTerminal.js +9 -0
  38. package/dist/editor/ai/editorAiContext.js +14 -0
  39. package/dist/editor/client/DialogContext.js +29 -0
  40. package/dist/editor/client/EditorClient.js +1336 -0
  41. package/dist/editor/client/GenericDialog.js +27 -0
  42. package/dist/editor/client/editContext.js +59 -0
  43. package/dist/editor/client/helpers.js +31 -0
  44. package/dist/editor/client/itemsRepository.js +255 -0
  45. package/dist/editor/client/operations.js +398 -0
  46. package/dist/editor/client/pageModelBuilder.js +129 -0
  47. package/dist/editor/commands/commands.js +2 -0
  48. package/dist/editor/commands/componentCommands.js +277 -0
  49. package/dist/editor/commands/createVersionCommand.js +26 -0
  50. package/dist/editor/commands/deleteVersionCommand.js +55 -0
  51. package/dist/editor/commands/itemCommands.js +134 -0
  52. package/dist/editor/commands/localizeItem/LocalizeItemDialog.js +94 -0
  53. package/dist/editor/commands/undo.js +32 -0
  54. package/dist/editor/component-designer/ComponentDesigner.js +58 -0
  55. package/dist/editor/component-designer/ComponentDesignerAiTerminal.js +9 -0
  56. package/dist/editor/component-designer/ComponentDesignerMenu.js +67 -0
  57. package/dist/editor/component-designer/ComponentEditor.js +59 -0
  58. package/dist/editor/component-designer/ComponentRenderingCodeEditor.js +16 -0
  59. package/dist/editor/component-designer/ComponentRenderingEditor.js +71 -0
  60. package/dist/editor/component-designer/ComponentsDropdown.js +22 -0
  61. package/dist/editor/component-designer/PlaceholdersEditor.js +70 -0
  62. package/dist/editor/component-designer/RenderingsDropdown.js +25 -0
  63. package/dist/editor/component-designer/TemplateEditor.js +144 -0
  64. package/dist/editor/component-designer/aiContext.js +18 -0
  65. package/dist/editor/componentTreeHelper.js +97 -0
  66. package/dist/editor/control-center/ControlCenterMenu.js +59 -0
  67. package/dist/editor/control-center/IndexOverview.js +27 -0
  68. package/dist/editor/control-center/IndexSettings.js +106 -0
  69. package/dist/editor/control-center/Status.js +7 -0
  70. package/dist/editor/editor-warnings/ItemLocked.js +40 -0
  71. package/dist/editor/editor-warnings/NoLanguageWriteAccess.js +16 -0
  72. package/dist/editor/editor-warnings/NoWorkflowWriteAccess.js +16 -0
  73. package/dist/editor/editor-warnings/NoWriteAccess.js +14 -0
  74. package/dist/editor/editor-warnings/ValidationErrors.js +27 -0
  75. package/dist/editor/field-types/AttachmentEditor.js +7 -0
  76. package/dist/editor/field-types/CheckboxEditor.js +32 -0
  77. package/dist/editor/field-types/DropLinkEditor.js +51 -0
  78. package/dist/editor/field-types/DropListEditor.js +58 -0
  79. package/dist/editor/field-types/ImageFieldEditor.js +36 -0
  80. package/dist/editor/field-types/InternalLinkFieldEditor.js +64 -0
  81. package/dist/editor/field-types/LinkFieldEditor.js +58 -0
  82. package/dist/editor/field-types/MultiLineText.js +35 -0
  83. package/dist/editor/field-types/PictureFieldEditor.js +59 -0
  84. package/dist/editor/field-types/RawEditor.js +33 -0
  85. package/dist/editor/field-types/ReactQuill.js +366 -0
  86. package/dist/editor/field-types/RichTextEditor.js +46 -0
  87. package/dist/editor/field-types/RichTextEditorComponent.js +72 -0
  88. package/dist/editor/field-types/SingleLineText.js +92 -0
  89. package/dist/editor/field-types/TreeListEditor.js +137 -0
  90. package/dist/editor/fieldTypes.js +2 -0
  91. package/dist/editor/media-selector/AiImageSearch.js +110 -0
  92. package/dist/editor/media-selector/AiImageSearchPrompt.js +58 -0
  93. package/dist/editor/media-selector/MediaSelector.js +11 -0
  94. package/dist/editor/media-selector/Preview.js +9 -0
  95. package/dist/editor/media-selector/Thumbnails.js +11 -0
  96. package/dist/editor/media-selector/TreeSelector.js +171 -0
  97. package/dist/editor/media-selector/UploadZone.js +80 -0
  98. package/dist/editor/menubar/ActionsMenu.js +33 -0
  99. package/dist/editor/menubar/ActiveUsers.js +13 -0
  100. package/dist/editor/menubar/ApproveAndPublish.js +13 -0
  101. package/dist/editor/menubar/BrowseHistory.js +14 -0
  102. package/dist/editor/menubar/ItemLanguageVersion.js +36 -0
  103. package/dist/editor/menubar/LanguageSelector.js +33 -0
  104. package/dist/editor/menubar/Menu.js +65 -0
  105. package/dist/editor/menubar/NavButtons.js +43 -0
  106. package/dist/editor/menubar/PageSelector.js +50 -0
  107. package/dist/editor/menubar/PageViewerControls.js +37 -0
  108. package/dist/editor/menubar/Separator.js +8 -0
  109. package/dist/editor/menubar/SiteInfo.js +26 -0
  110. package/dist/editor/menubar/User.js +18 -0
  111. package/dist/editor/menubar/VersionSelector.js +49 -0
  112. package/dist/editor/page-editor-chrome/CommentHighlighting.js +214 -0
  113. package/dist/editor/page-editor-chrome/CommentHighlightings.js +17 -0
  114. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +27 -0
  115. package/dist/editor/page-editor-chrome/FieldActionIndicators.js +15 -0
  116. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +27 -0
  117. package/dist/editor/page-editor-chrome/FieldEditedIndicators.js +15 -0
  118. package/dist/editor/page-editor-chrome/FrameMenu.js +178 -0
  119. package/dist/editor/page-editor-chrome/FrameMenus.js +24 -0
  120. package/dist/editor/page-editor-chrome/InlineEditor.js +101 -0
  121. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +35 -0
  122. package/dist/editor/page-editor-chrome/NoLayout.js +21 -0
  123. package/dist/editor/page-editor-chrome/PageEditorChrome.js +65 -0
  124. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +109 -0
  125. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +82 -0
  126. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +147 -0
  127. package/dist/editor/page-viewer/DeviceToolbar.js +21 -0
  128. package/dist/editor/page-viewer/EditorForm.js +130 -0
  129. package/dist/editor/page-viewer/MiniMap.js +257 -0
  130. package/dist/editor/page-viewer/PageViewer.js +64 -0
  131. package/dist/editor/page-viewer/PageViewerFrame.js +696 -0
  132. package/dist/editor/page-viewer/pageViewContext.js +117 -0
  133. package/dist/editor/pageModel.js +2 -0
  134. package/dist/editor/picture-shared.js +28 -0
  135. package/dist/editor/reviews/Comment.js +112 -0
  136. package/dist/editor/reviews/Comments.js +24 -0
  137. package/dist/editor/reviews/PreviewInfo.js +13 -0
  138. package/dist/editor/reviews/Reviews.js +165 -0
  139. package/dist/editor/reviews/reviewCommands.js +44 -0
  140. package/dist/editor/reviews/useReviews.js +48 -0
  141. package/dist/editor/services/aiService.js +99 -0
  142. package/dist/editor/services/componentDesignerService.js +79 -0
  143. package/dist/editor/services/contentService.js +104 -0
  144. package/dist/editor/services/editService.js +322 -0
  145. package/dist/editor/services/indexService.js +25 -0
  146. package/dist/editor/services/reviewsService.js +43 -0
  147. package/dist/editor/services/serviceHelper.js +67 -0
  148. package/dist/editor/services/systemService.js +7 -0
  149. package/dist/editor/services/translationService.js +15 -0
  150. package/dist/editor/services-server/api.js +119 -0
  151. package/dist/editor/services-server/graphQL.js +56 -0
  152. package/dist/editor/sidebar/ComponentPalette.js +55 -0
  153. package/dist/editor/sidebar/ComponentTree.js +362 -0
  154. package/dist/editor/sidebar/Debug.js +60 -0
  155. package/dist/editor/sidebar/DictionaryEditor.js +160 -0
  156. package/dist/editor/sidebar/EditHistory.js +74 -0
  157. package/dist/editor/sidebar/GraphQL.js +115 -0
  158. package/dist/editor/sidebar/Insert.js +24 -0
  159. package/dist/editor/sidebar/MainContentTree.js +52 -0
  160. package/dist/editor/sidebar/Performance.js +34 -0
  161. package/dist/editor/sidebar/Sessions.js +31 -0
  162. package/dist/editor/sidebar/Sidebar.js +15 -0
  163. package/dist/editor/sidebar/SidebarView.js +76 -0
  164. package/dist/editor/sidebar/Translations.js +160 -0
  165. package/dist/editor/sidebar/Validation.js +52 -0
  166. package/dist/editor/sidebar/ViewSelector.js +15 -0
  167. package/dist/editor/sidebar/Workbox.js +80 -0
  168. package/dist/editor/ui/CenteredMessage.js +7 -0
  169. package/dist/editor/ui/CopyToClipboardButton.js +17 -0
  170. package/dist/editor/ui/DialogButtons.js +7 -0
  171. package/dist/editor/ui/Icons.js +75 -0
  172. package/dist/editor/ui/ItemNameDialog.js +45 -0
  173. package/dist/editor/ui/ItemNameDialogNew.js +61 -0
  174. package/dist/editor/ui/ItemSearch.js +93 -0
  175. package/dist/editor/ui/PerfectTree.js +223 -0
  176. package/dist/editor/ui/Section.js +12 -0
  177. package/dist/editor/ui/SimpleIconButton.js +11 -0
  178. package/dist/editor/ui/SimpleMenu.js +9 -0
  179. package/dist/editor/ui/SimpleTable.js +11 -0
  180. package/dist/editor/ui/SimpleTabs.js +21 -0
  181. package/dist/editor/ui/SimpleToolbar.js +7 -0
  182. package/dist/editor/ui/Spinner.js +7 -0
  183. package/dist/editor/ui/Splitter.js +187 -0
  184. package/dist/editor/ui/StackedPanels.js +69 -0
  185. package/dist/editor/ui/Toolbar.js +7 -0
  186. package/dist/editor/utils/id-helper.js +7 -0
  187. package/dist/editor/utils/insertOptions.js +45 -0
  188. package/dist/editor/utils/itemutils.js +25 -0
  189. package/dist/editor/utils/useMemoDebug.js +20 -0
  190. package/dist/editor/utils.js +328 -0
  191. package/dist/editor/views/CompareView.js +147 -0
  192. package/dist/editor/views/EditView.js +17 -0
  193. package/dist/editor/views/ItemEditor.js +24 -0
  194. package/dist/editor/views/SingleEditView.js +25 -0
  195. package/dist/index.js +22 -0
  196. package/dist/page-wizard/PageWizard.js +62 -0
  197. package/dist/page-wizard/SelectWizard.js +43 -0
  198. package/dist/page-wizard/WizardSteps.js +71 -0
  199. package/dist/page-wizard/service.js +26 -0
  200. package/dist/page-wizard/startPageWizardCommand.js +23 -0
  201. package/dist/page-wizard/steps/BuildPageStep.js +138 -0
  202. package/dist/page-wizard/steps/CollectStep.js +124 -0
  203. package/dist/page-wizard/steps/ComponentTypesSelector.js +211 -0
  204. package/dist/page-wizard/steps/Components.js +94 -0
  205. package/dist/page-wizard/steps/CreatePage.js +142 -0
  206. package/dist/page-wizard/steps/CreatePageAndLayoutStep.js +230 -0
  207. package/dist/page-wizard/steps/EditButton.js +7 -0
  208. package/dist/page-wizard/steps/FieldEditor.js +30 -0
  209. package/dist/page-wizard/steps/Generate.js +11 -0
  210. package/dist/page-wizard/steps/ImagesStep.js +159 -0
  211. package/dist/page-wizard/steps/LayoutStep.js +120 -0
  212. package/dist/page-wizard/steps/SelectStep.js +150 -0
  213. package/dist/page-wizard/steps/schema.js +140 -0
  214. package/dist/page-wizard/steps/usePageCreator.js +194 -0
  215. package/dist/splash-screen/NewPage.js +131 -0
  216. package/dist/splash-screen/SectionHeadline.js +9 -0
  217. package/dist/splash-screen/SplashScreen.js +81 -0
  218. package/dist/tour/Tour.js +321 -0
  219. package/dist/tour/default-tour.js +231 -0
  220. package/dist/tour/preview-tour.js +93 -0
  221. package/dist/tsconfig.build.tsbuildinfo +1 -0
  222. package/dist/types.js +2 -0
  223. package/eslint.config.mjs +4 -0
  224. package/images/bg-shape-black.webp +0 -0
  225. package/package.json +52 -0
  226. package/src/client-components/api.ts +6 -0
  227. package/src/client-components/index.ts +19 -0
  228. package/src/components/ActionButton.tsx +43 -0
  229. package/src/components/Error.tsx +57 -0
  230. package/src/config/config.tsx +737 -0
  231. package/src/config/types.ts +263 -0
  232. package/src/editor/ComponentInfo.tsx +77 -0
  233. package/src/editor/ConfirmationDialog.tsx +103 -0
  234. package/src/editor/ContentTree.tsx +654 -0
  235. package/src/editor/ContextMenu.tsx +155 -0
  236. package/src/editor/Editor.tsx +91 -0
  237. package/src/editor/EditorWarning.tsx +34 -0
  238. package/src/editor/EditorWarnings.tsx +33 -0
  239. package/src/editor/FieldEditorPopup.tsx +65 -0
  240. package/src/editor/FieldHistory.tsx +74 -0
  241. package/src/editor/FieldList.tsx +190 -0
  242. package/src/editor/FieldListField.tsx +387 -0
  243. package/src/editor/FieldListFieldWithFallbacks.tsx +211 -0
  244. package/src/editor/FloatingToolbar.tsx +163 -0
  245. package/src/editor/ImageEditor.tsx +129 -0
  246. package/src/editor/InsertMenu.tsx +332 -0
  247. package/src/editor/ItemInfo.tsx +90 -0
  248. package/src/editor/LinkEditorDialog.tsx +192 -0
  249. package/src/editor/MainLayout.tsx +94 -0
  250. package/src/editor/NewEditorClient.tsx +11 -0
  251. package/src/editor/PictureCropper.tsx +505 -0
  252. package/src/editor/PictureEditor.tsx +206 -0
  253. package/src/editor/PictureEditorDialog.tsx +381 -0
  254. package/src/editor/PublishDialog.ignore +74 -0
  255. package/src/editor/ScrollingContentTree.tsx +47 -0
  256. package/src/editor/Terminal.tsx +215 -0
  257. package/src/editor/Titlebar.tsx +23 -0
  258. package/src/editor/ai/AiPopup.tsx +59 -0
  259. package/src/editor/ai/AiResponseMessage.tsx +82 -0
  260. package/src/editor/ai/AiTerminal.tsx +450 -0
  261. package/src/editor/ai/AiToolCall.tsx +46 -0
  262. package/src/editor/ai/EditorAiTerminal.tsx +20 -0
  263. package/src/editor/ai/editorAiContext.ts +18 -0
  264. package/src/editor/client/DialogContext.tsx +49 -0
  265. package/src/editor/client/EditorClient.tsx +1831 -0
  266. package/src/editor/client/GenericDialog.tsx +50 -0
  267. package/src/editor/client/editContext.ts +330 -0
  268. package/src/editor/client/helpers.ts +44 -0
  269. package/src/editor/client/itemsRepository.ts +391 -0
  270. package/src/editor/client/operations.ts +610 -0
  271. package/src/editor/client/pageModelBuilder.ts +182 -0
  272. package/src/editor/commands/commands.ts +23 -0
  273. package/src/editor/commands/componentCommands.tsx +408 -0
  274. package/src/editor/commands/createVersionCommand.ts +33 -0
  275. package/src/editor/commands/deleteVersionCommand.ts +71 -0
  276. package/src/editor/commands/itemCommands.tsx +186 -0
  277. package/src/editor/commands/localizeItem/LocalizeItemDialog.tsx +201 -0
  278. package/src/editor/commands/undo.ts +39 -0
  279. package/src/editor/component-designer/ComponentDesigner.tsx +70 -0
  280. package/src/editor/component-designer/ComponentDesignerAiTerminal.tsx +11 -0
  281. package/src/editor/component-designer/ComponentDesignerMenu.tsx +91 -0
  282. package/src/editor/component-designer/ComponentEditor.tsx +97 -0
  283. package/src/editor/component-designer/ComponentRenderingCodeEditor.tsx +31 -0
  284. package/src/editor/component-designer/ComponentRenderingEditor.tsx +104 -0
  285. package/src/editor/component-designer/ComponentsDropdown.tsx +39 -0
  286. package/src/editor/component-designer/PlaceholdersEditor.tsx +183 -0
  287. package/src/editor/component-designer/RenderingsDropdown.tsx +36 -0
  288. package/src/editor/component-designer/TemplateEditor.tsx +236 -0
  289. package/src/editor/component-designer/aiContext.ts +23 -0
  290. package/src/editor/componentTreeHelper.tsx +114 -0
  291. package/src/editor/control-center/ControlCenterMenu.tsx +71 -0
  292. package/src/editor/control-center/IndexOverview.tsx +50 -0
  293. package/src/editor/control-center/IndexSettings.tsx +266 -0
  294. package/src/editor/control-center/Status.tsx +7 -0
  295. package/src/editor/editor-warnings/ItemLocked.tsx +63 -0
  296. package/src/editor/editor-warnings/NoLanguageWriteAccess.tsx +22 -0
  297. package/src/editor/editor-warnings/NoWorkflowWriteAccess.tsx +23 -0
  298. package/src/editor/editor-warnings/NoWriteAccess.tsx +15 -0
  299. package/src/editor/editor-warnings/ValidationErrors.tsx +54 -0
  300. package/src/editor/field-types/AttachmentEditor.tsx +9 -0
  301. package/src/editor/field-types/CheckboxEditor.tsx +47 -0
  302. package/src/editor/field-types/DropLinkEditor.tsx +75 -0
  303. package/src/editor/field-types/DropListEditor.tsx +84 -0
  304. package/src/editor/field-types/ImageFieldEditor.tsx +65 -0
  305. package/src/editor/field-types/InternalLinkFieldEditor.tsx +112 -0
  306. package/src/editor/field-types/LinkFieldEditor.tsx +85 -0
  307. package/src/editor/field-types/MultiLineText.tsx +63 -0
  308. package/src/editor/field-types/PictureFieldEditor.tsx +121 -0
  309. package/src/editor/field-types/RawEditor.tsx +53 -0
  310. package/src/editor/field-types/ReactQuill.tsx +580 -0
  311. package/src/editor/field-types/RichTextEditor.tsx +22 -0
  312. package/src/editor/field-types/RichTextEditorComponent.tsx +108 -0
  313. package/src/editor/field-types/SingleLineText.tsx +150 -0
  314. package/src/editor/field-types/TreeListEditor.tsx +261 -0
  315. package/src/editor/fieldTypes.ts +140 -0
  316. package/src/editor/media-selector/AiImageSearch.tsx +186 -0
  317. package/src/editor/media-selector/AiImageSearchPrompt.tsx +95 -0
  318. package/src/editor/media-selector/MediaSelector.tsx +42 -0
  319. package/src/editor/media-selector/Preview.tsx +14 -0
  320. package/src/editor/media-selector/Thumbnails.tsx +48 -0
  321. package/src/editor/media-selector/TreeSelector.tsx +292 -0
  322. package/src/editor/media-selector/UploadZone.tsx +137 -0
  323. package/src/editor/menubar/ActionsMenu.tsx +47 -0
  324. package/src/editor/menubar/ActiveUsers.tsx +17 -0
  325. package/src/editor/menubar/ApproveAndPublish.tsx +18 -0
  326. package/src/editor/menubar/BrowseHistory.tsx +37 -0
  327. package/src/editor/menubar/ItemLanguageVersion.tsx +52 -0
  328. package/src/editor/menubar/LanguageSelector.tsx +152 -0
  329. package/src/editor/menubar/Menu.tsx +83 -0
  330. package/src/editor/menubar/NavButtons.tsx +74 -0
  331. package/src/editor/menubar/PageSelector.tsx +139 -0
  332. package/src/editor/menubar/PageViewerControls.tsx +99 -0
  333. package/src/editor/menubar/Separator.tsx +12 -0
  334. package/src/editor/menubar/SiteInfo.tsx +53 -0
  335. package/src/editor/menubar/User.tsx +27 -0
  336. package/src/editor/menubar/VersionSelector.tsx +143 -0
  337. package/src/editor/page-editor-chrome/CommentHighlighting.tsx +287 -0
  338. package/src/editor/page-editor-chrome/CommentHighlightings.tsx +35 -0
  339. package/src/editor/page-editor-chrome/FieldActionIndicator.tsx +44 -0
  340. package/src/editor/page-editor-chrome/FieldActionIndicators.tsx +23 -0
  341. package/src/editor/page-editor-chrome/FieldEditedIndicator.tsx +64 -0
  342. package/src/editor/page-editor-chrome/FieldEditedIndicators.tsx +35 -0
  343. package/src/editor/page-editor-chrome/FrameMenu.tsx +263 -0
  344. package/src/editor/page-editor-chrome/FrameMenus.tsx +48 -0
  345. package/src/editor/page-editor-chrome/InlineEditor.tsx +147 -0
  346. package/src/editor/page-editor-chrome/LockedFieldIndicator.tsx +61 -0
  347. package/src/editor/page-editor-chrome/NoLayout.tsx +36 -0
  348. package/src/editor/page-editor-chrome/PageEditorChrome.tsx +119 -0
  349. package/src/editor/page-editor-chrome/PictureEditorOverlay.tsx +154 -0
  350. package/src/editor/page-editor-chrome/PlaceholderDropZone.tsx +171 -0
  351. package/src/editor/page-editor-chrome/PlaceholderDropZones.tsx +233 -0
  352. package/src/editor/page-viewer/DeviceToolbar.tsx +70 -0
  353. package/src/editor/page-viewer/EditorForm.tsx +247 -0
  354. package/src/editor/page-viewer/MiniMap.tsx +351 -0
  355. package/src/editor/page-viewer/PageViewer.tsx +127 -0
  356. package/src/editor/page-viewer/PageViewerFrame.tsx +1030 -0
  357. package/src/editor/page-viewer/pageViewContext.ts +186 -0
  358. package/src/editor/pageModel.ts +191 -0
  359. package/src/editor/picture-shared.tsx +53 -0
  360. package/src/editor/reviews/Comment.tsx +265 -0
  361. package/src/editor/reviews/Comments.tsx +50 -0
  362. package/src/editor/reviews/PreviewInfo.tsx +35 -0
  363. package/src/editor/reviews/Reviews.tsx +280 -0
  364. package/src/editor/reviews/reviewCommands.tsx +47 -0
  365. package/src/editor/reviews/useReviews.tsx +70 -0
  366. package/src/editor/services/aiService.ts +155 -0
  367. package/src/editor/services/componentDesignerService.ts +151 -0
  368. package/src/editor/services/contentService.ts +159 -0
  369. package/src/editor/services/editService.ts +462 -0
  370. package/src/editor/services/indexService.ts +24 -0
  371. package/src/editor/services/reviewsService.ts +45 -0
  372. package/src/editor/services/serviceHelper.ts +95 -0
  373. package/src/editor/services/systemService.ts +5 -0
  374. package/src/editor/services/translationService.ts +21 -0
  375. package/src/editor/services-server/api.ts +150 -0
  376. package/src/editor/services-server/graphQL.ts +106 -0
  377. package/src/editor/sidebar/ComponentPalette.tsx +146 -0
  378. package/src/editor/sidebar/ComponentTree.tsx +512 -0
  379. package/src/editor/sidebar/ComponentTree2.tsxx +490 -0
  380. package/src/editor/sidebar/Debug.tsx +105 -0
  381. package/src/editor/sidebar/DictionaryEditor.tsx +261 -0
  382. package/src/editor/sidebar/EditHistory.tsx +134 -0
  383. package/src/editor/sidebar/GraphQL.tsx +164 -0
  384. package/src/editor/sidebar/Insert.tsx +35 -0
  385. package/src/editor/sidebar/MainContentTree.tsx +95 -0
  386. package/src/editor/sidebar/Performance.tsx +53 -0
  387. package/src/editor/sidebar/Sessions.tsx +35 -0
  388. package/src/editor/sidebar/Sidebar.tsx +20 -0
  389. package/src/editor/sidebar/SidebarView.tsx +150 -0
  390. package/src/editor/sidebar/Translations.tsx +276 -0
  391. package/src/editor/sidebar/Validation.tsx +102 -0
  392. package/src/editor/sidebar/ViewSelector.tsx +49 -0
  393. package/src/editor/sidebar/Workbox.tsx +209 -0
  394. package/src/editor/ui/CenteredMessage.tsx +7 -0
  395. package/src/editor/ui/CopyToClipboardButton.tsx +23 -0
  396. package/src/editor/ui/DialogButtons.tsx +11 -0
  397. package/src/editor/ui/Icons.tsx +585 -0
  398. package/src/editor/ui/ItemNameDialog.tsx +94 -0
  399. package/src/editor/ui/ItemNameDialogNew.tsx +118 -0
  400. package/src/editor/ui/ItemSearch.tsx +173 -0
  401. package/src/editor/ui/PerfectTree.tsx +550 -0
  402. package/src/editor/ui/Section.tsx +35 -0
  403. package/src/editor/ui/SimpleIconButton.tsx +43 -0
  404. package/src/editor/ui/SimpleMenu.tsx +48 -0
  405. package/src/editor/ui/SimpleTable.tsx +63 -0
  406. package/src/editor/ui/SimpleTabs.tsx +55 -0
  407. package/src/editor/ui/SimpleToolbar.tsx +7 -0
  408. package/src/editor/ui/Spinner.tsx +7 -0
  409. package/src/editor/ui/Splitter.tsx +247 -0
  410. package/src/editor/ui/StackedPanels.tsx +134 -0
  411. package/src/editor/ui/Toolbar.tsx +7 -0
  412. package/src/editor/utils/id-helper.ts +3 -0
  413. package/src/editor/utils/insertOptions.ts +69 -0
  414. package/src/editor/utils/itemutils.ts +29 -0
  415. package/src/editor/utils/useMemoDebug.ts +28 -0
  416. package/src/editor/utils.ts +435 -0
  417. package/src/editor/views/CompareView.tsx +256 -0
  418. package/src/editor/views/EditView.tsx +27 -0
  419. package/src/editor/views/ItemEditor.tsx +58 -0
  420. package/src/editor/views/SingleEditView.tsx +44 -0
  421. package/src/fonts/Geist-Black.woff2 +0 -0
  422. package/src/fonts/Geist-Bold.woff2 +0 -0
  423. package/src/fonts/Geist-ExtraBold.woff2 +0 -0
  424. package/src/fonts/Geist-ExtraLight.woff2 +0 -0
  425. package/src/fonts/Geist-Light.woff2 +0 -0
  426. package/src/fonts/Geist-Medium.woff2 +0 -0
  427. package/src/fonts/Geist-Regular.woff2 +0 -0
  428. package/src/fonts/Geist-SemiBold.woff2 +0 -0
  429. package/src/fonts/Geist-Thin.woff2 +0 -0
  430. package/src/fonts/Geist[wght].woff2 +0 -0
  431. package/src/index.ts +7 -0
  432. package/src/page-wizard/PageWizard.tsx +163 -0
  433. package/src/page-wizard/SelectWizard.tsx +109 -0
  434. package/src/page-wizard/WizardSteps.tsx +207 -0
  435. package/src/page-wizard/service.ts +35 -0
  436. package/src/page-wizard/startPageWizardCommand.ts +27 -0
  437. package/src/page-wizard/steps/BuildPageStep.tsx +266 -0
  438. package/src/page-wizard/steps/CollectStep.tsx +233 -0
  439. package/src/page-wizard/steps/ComponentTypesSelector.tsx +443 -0
  440. package/src/page-wizard/steps/Components.tsx +193 -0
  441. package/src/page-wizard/steps/CreatePage.tsx +285 -0
  442. package/src/page-wizard/steps/CreatePageAndLayoutStep.tsx +384 -0
  443. package/src/page-wizard/steps/EditButton.tsx +34 -0
  444. package/src/page-wizard/steps/FieldEditor.tsx +102 -0
  445. package/src/page-wizard/steps/Generate.tsx +32 -0
  446. package/src/page-wizard/steps/ImagesStep.tsx +318 -0
  447. package/src/page-wizard/steps/LayoutStep.tsx +228 -0
  448. package/src/page-wizard/steps/SelectStep.tsx +256 -0
  449. package/src/page-wizard/steps/schema.ts +180 -0
  450. package/src/page-wizard/steps/usePageCreator.ts +279 -0
  451. package/src/splash-screen/NewPage.tsx +232 -0
  452. package/src/splash-screen/SectionHeadline.tsx +21 -0
  453. package/src/splash-screen/SplashScreen.tsx +156 -0
  454. package/src/tour/Tour.tsx +558 -0
  455. package/src/tour/default-tour.tsx +300 -0
  456. package/src/tour/preview-tour.tsx +127 -0
  457. package/src/types.ts +302 -0
  458. package/styles.css +476 -0
  459. package/tsconfig.build.json +21 -0
  460. package/tsconfig.json +11 -0
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SelectStep = SelectStep;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
9
+ const editContext_1 = require("../../editor/client/editContext");
10
+ const aiService_1 = require("../../editor/services/aiService");
11
+ const service_1 = require("../service");
12
+ const utils_1 = require("primereact/utils");
13
+ const Splitter_1 = require("../../editor/ui/Splitter");
14
+ const inputtextarea_1 = require("primereact/inputtextarea");
15
+ const ActionButton_1 = require("../../components/ActionButton");
16
+ const Generate_1 = __importDefault(require("./Generate"));
17
+ function SelectStep({ step, data, setData, setStepCompleted, internalState, setInternalState, }) {
18
+ const editContext = (0, editContext_1.useEditContext)();
19
+ const [options, setOptions] = (0, react_1.useState)([]);
20
+ const [loading, setLoading] = (0, react_1.useState)(false);
21
+ const [error, setError] = (0, react_1.useState)(null);
22
+ const [selectedOptions, setSelectedOptions] = (0, react_1.useState)([]);
23
+ const [instructions, setInstructions] = (0, react_1.useState)(step.instructions);
24
+ // Get the property name from the step or use "choice" as default
25
+ const propertyName = step.propertyName || "selectedOptions";
26
+ (0, react_1.useEffect)(() => {
27
+ if (data[propertyName]?.length) {
28
+ setStepCompleted(true);
29
+ }
30
+ }, [data]);
31
+ // Initialize the property in data
32
+ (0, react_1.useEffect)(() => {
33
+ if (!data[propertyName]) {
34
+ setData((prevData) => ({
35
+ ...prevData,
36
+ [propertyName]: [],
37
+ }));
38
+ }
39
+ }, [propertyName, setData]);
40
+ const generateOptions = async () => {
41
+ if (!editContext)
42
+ return;
43
+ setLoading(true);
44
+ setError(null);
45
+ try {
46
+ // Create a prompt based on step instructions and data
47
+ const prompt = `${instructions}\n\nCurrent data: ${JSON.stringify(data, null, 2)}`;
48
+ // Call the executePrompt function with the prompt
49
+ const result = await (0, aiService_1.executePrompt)([
50
+ {
51
+ content: `You are a helpful assistant that generates options for a wizard select step.
52
+ Generate a JSON array of options based on the instructions and current data.
53
+ ONLY respond with a valid JSON array without any explanation or additional text.
54
+ JSON format: {options: {title: string, description: string}[] }`,
55
+ name: "system",
56
+ role: "system",
57
+ },
58
+ {
59
+ content: prompt,
60
+ name: "user",
61
+ role: "user",
62
+ },
63
+ ], editContext, service_1.createWizardAiContext, [""], true, undefined, step.aiModel || "o3-mini-low");
64
+ // Parse the result and set options
65
+ if (result && result.content) {
66
+ try {
67
+ const generatedOptions = JSON.parse(result.content);
68
+ for (let i = 0; i < generatedOptions.options.length; i++) {
69
+ generatedOptions.options[i].id = i.toString();
70
+ }
71
+ setOptions(generatedOptions.options);
72
+ setInternalState((state) => ({
73
+ ...state,
74
+ [step.id + "options"]: generatedOptions.options,
75
+ }));
76
+ }
77
+ catch (parseError) {
78
+ console.error("Error parsing options:", parseError);
79
+ setError("Failed to parse options. The response was not in the expected format.");
80
+ }
81
+ }
82
+ else {
83
+ setError("No options were generated. Please try again.");
84
+ }
85
+ }
86
+ catch (err) {
87
+ setError("Failed to generate options. Please try again.");
88
+ console.error("Error generating options:", err);
89
+ }
90
+ finally {
91
+ setLoading(false);
92
+ }
93
+ };
94
+ // Generate options on component mount
95
+ (0, react_1.useEffect)(() => {
96
+ if (internalState[step.id + "options"]?.length > 0) {
97
+ setOptions(internalState[step.id + "options"]);
98
+ return;
99
+ }
100
+ generateOptions();
101
+ }, [editContext, step.instructions, internalState]);
102
+ // Sync data[propertyName] with selectedOptions state
103
+ (0, react_1.useEffect)(() => {
104
+ const currentSelections = data[propertyName] || [];
105
+ setSelectedOptions(currentSelections.map((option) => option.id));
106
+ }, [data, propertyName]);
107
+ // Handle option selection
108
+ const handleOptionSelect = (option) => {
109
+ setData((prevData) => {
110
+ const currentData = [
111
+ ...(prevData[propertyName] || []),
112
+ ];
113
+ const isSelected = currentData.some((o) => o.id === option.id);
114
+ let updatedData;
115
+ if (isSelected) {
116
+ // Remove option if already selected
117
+ updatedData = currentData.filter((o) => o.id !== option.id);
118
+ }
119
+ else {
120
+ // Add option if not selected
121
+ updatedData = [...currentData, option];
122
+ }
123
+ return {
124
+ ...prevData,
125
+ [propertyName]: updatedData,
126
+ };
127
+ });
128
+ };
129
+ if (error) {
130
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "text-red-500 p-4", children: [error, (0, jsx_runtime_1.jsx)("button", { className: "ml-4 px-2 py-1 bg-blue-500 text-white rounded", onClick: () => window.location.reload(), children: "Retry" })] }));
131
+ }
132
+ const optionsPanel = {
133
+ name: "options",
134
+ defaultSize: "auto",
135
+ content: ((0, jsx_runtime_1.jsxs)("div", { className: "p-4 h-full", children: [loading && ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-center h-full", children: (0, jsx_runtime_1.jsx)(Generate_1.default, { title: "Generating options..." }) })), !loading && ((0, jsx_runtime_1.jsx)("div", { children: options.length === 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "text-gray-500 p-4", children: "No options available. Try refreshing the page." })) : (options.map((option, index) => {
136
+ const isSelected = selectedOptions.includes(option.id);
137
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.classNames)("mb-3 flex items-center p-3 rounded bg-white border-2", index % 2 === 0
138
+ ? "animate-fadeRight"
139
+ : "animate-fadeLeft", isSelected
140
+ ? "text-canvas-pink border-canvas-pink"
141
+ : "text-gray-600 border-gray-300"), onClick: () => handleOptionSelect(option), children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col flex-1 cursor-pointer", children: [(0, jsx_runtime_1.jsx)("div", { className: "font-medium", children: option.title }), (0, jsx_runtime_1.jsx)("div", { className: "text-xs text-gray-600", children: option.description })] }), isSelected && ((0, jsx_runtime_1.jsx)("div", { className: "text-canvas-pink ml-2", children: "\u2713" }))] }, option.id));
142
+ })) }))] })),
143
+ };
144
+ const settingsPanel = {
145
+ name: "settings",
146
+ defaultSize: 400,
147
+ content: ((0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-2 pr-6", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-sm font-bold", children: "Instructions" }), (0, jsx_runtime_1.jsx)(inputtextarea_1.InputTextarea, { className: "h-48 text-sm", value: instructions, onChange: (e) => setInstructions(e.target.value), placeholder: "Enter instructions for the options" }), (0, jsx_runtime_1.jsx)(ActionButton_1.ActionButton, { onClick: generateOptions, isLoading: loading, disabled: loading, loadingText: "Thinking...", children: "Regenerate Options" })] })),
148
+ };
149
+ return (0, jsx_runtime_1.jsx)(Splitter_1.Splitter, { panels: [settingsPanel, optionsPanel] });
150
+ }
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertPageSchemaToWizardComponents = convertPageSchemaToWizardComponents;
4
+ exports.getPlaceholder = getPlaceholder;
5
+ function convertPageSchemaToWizardComponents(pageSchema, whitelist) {
6
+ const componentMap = new Map();
7
+ /**
8
+ * Recursively processes a SchemaComponent.
9
+ *
10
+ * @param component - The current SchemaComponent to process.
11
+ * @param parentPlaceholder - The name of the placeholder where the component appears.
12
+ * @param isRoot - True if the component is at the root level.
13
+ * @param parentAccumulator - The accumulator of the parent component (if the parent is allowed).
14
+ */
15
+ function processComponent(component, parentPlaceholder, isRoot, parentAccumulator) {
16
+ const isAllowed = whitelist.includes(component.type);
17
+ let currentAccumulator = undefined;
18
+ if (isAllowed) {
19
+ // If a parent accumulator exists (and is allowed), record the child's type as a valid child type.
20
+ if (parentAccumulator) {
21
+ parentAccumulator.validChildComponentTypes.add(component.type);
22
+ }
23
+ if (componentMap.has(component.typeId)) {
24
+ currentAccumulator = componentMap.get(component.typeId);
25
+ currentAccumulator.validParentPlaceholders.add(parentPlaceholder);
26
+ // Mark as allowed on root if encountered at the root level in any instance.
27
+ if (isRoot) {
28
+ currentAccumulator.allowedOnRoot = true;
29
+ }
30
+ }
31
+ else {
32
+ currentAccumulator = {
33
+ name: component.typeId, // using typeId as the wizard component name
34
+ type: component.type,
35
+ fields: component.fields.map((field) => ({
36
+ name: field.name,
37
+ type: field.type,
38
+ })),
39
+ validParentPlaceholders: new Set([parentPlaceholder]),
40
+ validChildComponentTypes: new Set(),
41
+ allowedOnRoot: isRoot,
42
+ };
43
+ componentMap.set(component.typeId, currentAccumulator);
44
+ }
45
+ }
46
+ // Process child components regardless of whether the current component is allowed.
47
+ for (const placeholder of component.placeholders) {
48
+ for (const child of placeholder.components) {
49
+ processComponent(child, placeholder.name, false, currentAccumulator);
50
+ }
51
+ }
52
+ }
53
+ // Process each top-level component in the PageSchema.
54
+ for (const placeholder of pageSchema) {
55
+ for (const component of placeholder.components) {
56
+ processComponent(component, placeholder.name, true);
57
+ }
58
+ }
59
+ // Convert accumulators to final WizardSchemaComponent objects.
60
+ const wizardComponents = [];
61
+ for (const acc of componentMap.values()) {
62
+ const wizardComponent = {
63
+ type: acc.type,
64
+ fields: acc.fields,
65
+ allowedChildrenComponentTypes: Array.from(acc.validChildComponentTypes),
66
+ allowedOnRoot: acc.allowedOnRoot,
67
+ };
68
+ // Only include validParentPlaceholders if there is more than one.
69
+ if (acc.validParentPlaceholders.size > 1) {
70
+ wizardComponent.availableParentPlaceholders = Array.from(acc.validParentPlaceholders);
71
+ }
72
+ wizardComponents.push(wizardComponent);
73
+ }
74
+ return wizardComponents;
75
+ }
76
+ /**
77
+ * Finds a placeholder (by its name) where a child component of type `childComponentType`
78
+ * can be placed inside a parent of type `parentComponentType`. For a parentComponentType
79
+ * equal to "root" (case‑insensitive), the function searches among top‑level placeholders.
80
+ *
81
+ * @param schema - The PageSchema (an array of SchemaPlaceholders).
82
+ * @param parentComponentType - The type of the parent component, or "root" to indicate top‑level.
83
+ * @param childComponentType - The type of the child component to place.
84
+ * @returns The name of a valid placeholder or undefined if none is found.
85
+ */
86
+ function getPlaceholder(schema, parentComponentType, childComponentType) {
87
+ // Check for the special case where we want to place at the root level.
88
+ if (parentComponentType.toLowerCase() === "root") {
89
+ // First, look for a top-level placeholder that already contains a component
90
+ // of the given childComponentType.
91
+ for (const topPlaceholder of schema) {
92
+ if (topPlaceholder.components.some((c) => c.type === childComponentType)) {
93
+ return topPlaceholder.name;
94
+ }
95
+ }
96
+ // If not found, return the first top-level placeholder that is empty.
97
+ for (const topPlaceholder of schema) {
98
+ if (topPlaceholder.components.length === 0) {
99
+ return topPlaceholder.name;
100
+ }
101
+ }
102
+ return undefined;
103
+ }
104
+ // Recursive helper to search through nested SchemaComponents.
105
+ function searchComponents(components) {
106
+ for (const component of components) {
107
+ // If this component matches the desired parent type, check its placeholders.
108
+ if (component.type === parentComponentType) {
109
+ // First, try to find a placeholder that already has a child of the desired type.
110
+ for (const placeholder of component.placeholders) {
111
+ if (placeholder.components.some((child) => child.type === childComponentType)) {
112
+ return placeholder.name;
113
+ }
114
+ }
115
+ // Otherwise, pick an empty placeholder.
116
+ for (const placeholder of component.placeholders) {
117
+ if (placeholder.components.length === 0) {
118
+ return placeholder.name;
119
+ }
120
+ }
121
+ }
122
+ // Recurse into any placeholders in the current component.
123
+ for (const placeholder of component.placeholders) {
124
+ const result = searchComponents(placeholder.components);
125
+ if (result) {
126
+ return result;
127
+ }
128
+ }
129
+ }
130
+ return undefined;
131
+ }
132
+ // Search through all top-level placeholders' components.
133
+ for (const topPlaceholder of schema) {
134
+ const result = searchComponents(topPlaceholder.components);
135
+ if (result) {
136
+ return result;
137
+ }
138
+ }
139
+ return undefined;
140
+ }
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.usePageCreator = usePageCreator;
4
+ const react_1 = require("react");
5
+ const editContext_1 = require("../../editor/client/editContext");
6
+ const editContext_2 = require("../../editor/client/editContext");
7
+ const componentTreeHelper_1 = require("../../editor/componentTreeHelper");
8
+ const schema_1 = require("./schema");
9
+ const utils_1 = require("../../editor/utils");
10
+ function usePageCreator(pageItem, wizard, setPageModel) {
11
+ const editContext = (0, editContext_2.useEditContext)();
12
+ const editContextRef = (0, editContext_1.useEditContextRef)();
13
+ // Function to build a map of all components from wizard schema
14
+ const buildComponentTypeMap = () => {
15
+ const componentMap = new Map();
16
+ const fieldIdsMap = new Map();
17
+ const placeholderMap = new Map();
18
+ const processComponentsRecursively = (components) => {
19
+ for (const component of components) {
20
+ // Store the mapping from component type to typeId
21
+ componentMap.set(component.type, component.typeId);
22
+ placeholderMap.set(component.typeId, component.type);
23
+ // Process nested components in placeholders
24
+ if (component.placeholders && component.placeholders.length > 0) {
25
+ for (const placeholder of component.placeholders) {
26
+ if (placeholder.components && placeholder.components.length > 0) {
27
+ processComponentsRecursively(placeholder.components);
28
+ }
29
+ }
30
+ }
31
+ if (component.fields && component.fields.length > 0) {
32
+ for (const field of component.fields) {
33
+ fieldIdsMap.set(component.typeId + "_" + field.name, field.id);
34
+ }
35
+ }
36
+ }
37
+ };
38
+ // Start processing from the root level of the schema
39
+ if (wizard.schema && wizard.schema.length > 0) {
40
+ for (const placeholder of wizard.schema) {
41
+ if (placeholder.components && placeholder.components.length > 0) {
42
+ processComponentsRecursively(placeholder.components);
43
+ }
44
+ }
45
+ }
46
+ return { componentMap, fieldIdsMap };
47
+ };
48
+ // Build the component type to typeId map
49
+ const mappings = (0, react_1.useMemo)(() => buildComponentTypeMap(), [wizard.schema]);
50
+ const createNewComponent = async (component, parentComponentType, index, parentComponentId) => {
51
+ if (!editContext)
52
+ return undefined;
53
+ const { componentMap } = mappings;
54
+ // Get the typeId from the map using the component type
55
+ const typeId = componentMap.get(component.type) || component.type;
56
+ // 1. Add the component to the placeholder
57
+ console.log(`Adding component ${component.type} (typeId: ${typeId}) to placeholder ${parentComponentId} at index ${index}`);
58
+ const placeholderKey = component.placeholder ||
59
+ (0, schema_1.getPlaceholder)(wizard.schema, parentComponentType, component.type);
60
+ const placeholderId = parentComponentId
61
+ ? placeholderKey + "_" + (0, utils_1.normalizeGuid)(parentComponentId)
62
+ : placeholderKey;
63
+ if (!placeholderId) {
64
+ console.error("Placeholder ID not found", component);
65
+ return undefined;
66
+ }
67
+ const addComponentOp = await editContext.operations.addComponent(typeId, // Use typeId instead of just type
68
+ placeholderId, index);
69
+ if (!addComponentOp?.componentId) {
70
+ console.error("Failed to add component", component, "Result Op:", addComponentOp);
71
+ return undefined;
72
+ }
73
+ // Wait for the component to be created
74
+ const componentId = addComponentOp.componentId;
75
+ console.log("Waiting for component to be created", componentId);
76
+ let createdComponent;
77
+ let attempts = 0;
78
+ const maxAttempts = 40;
79
+ while (!createdComponent && attempts < maxAttempts) {
80
+ if (editContextRef.current?.page) {
81
+ createdComponent = (0, componentTreeHelper_1.getComponentById)(componentId, editContextRef.current?.page);
82
+ if (createdComponent) {
83
+ break;
84
+ }
85
+ }
86
+ if (createdComponent)
87
+ break;
88
+ await new Promise((resolve) => setTimeout(resolve, 1000)); // Wait 100ms between attempts
89
+ attempts++;
90
+ }
91
+ if (!createdComponent) {
92
+ console.error("Timeout waiting for component to appear in page model", componentId);
93
+ }
94
+ const componentDescriptor = {
95
+ ...addComponentOp.mainItem,
96
+ id: addComponentOp.componentId,
97
+ };
98
+ console.log("Component created:", componentDescriptor);
99
+ return componentDescriptor;
100
+ };
101
+ const findComponent = (components, path) => {
102
+ const child = components[path[0]];
103
+ if (!child)
104
+ return null;
105
+ if (path.length === 1)
106
+ return child;
107
+ return findComponent(child.children || [], path.slice(1));
108
+ };
109
+ // Function to recursively create components from the page model
110
+ const createComponentsRecursively = async (components, parentComponentType, parentComponentId, parentPath) => {
111
+ if (!editContext || !pageItem)
112
+ return;
113
+ const { fieldIdsMap, componentMap } = mappings;
114
+ // Process each component in the array
115
+ for (let i = 0; i < components.length; i++) {
116
+ const component = components[i];
117
+ const componentPath = [...(parentPath || []), i];
118
+ if (!component?.id) {
119
+ if (!component?.type || !component?.fields) {
120
+ continue;
121
+ }
122
+ const descriptor = await createNewComponent(component, parentComponentType, i, parentComponentId);
123
+ if (!descriptor)
124
+ continue;
125
+ component.id = descriptor.id;
126
+ setPageModel((prev) => {
127
+ const component = findComponent(prev.components, componentPath);
128
+ if (component) {
129
+ component.id = descriptor.id;
130
+ }
131
+ return {
132
+ ...prev,
133
+ };
134
+ });
135
+ }
136
+ if (component.fields && component.fields.length > 0) {
137
+ const typeId = componentMap.get(component.type) || component.type;
138
+ // 2. Edit fields of the component
139
+ for (const field of component.fields) {
140
+ if (!field.name ||
141
+ !field.value ||
142
+ field.value + field.type === field.writtenValue) {
143
+ continue;
144
+ }
145
+ const fieldId = fieldIdsMap.get(typeId + "_" + field.name);
146
+ if (!fieldId) {
147
+ console.error("Field not found", field);
148
+ continue;
149
+ }
150
+ const fieldDescriptor = {
151
+ fieldId: fieldId.toLowerCase().replace(/[{}]/g, ""),
152
+ item: {
153
+ id: component.id,
154
+ language: pageItem.language,
155
+ version: pageItem.version,
156
+ },
157
+ };
158
+ console.log(`Editing field ${field.name} of component ${component.id} with value ${field.value}`);
159
+ let rawValue = field.value;
160
+ let value = field.value;
161
+ if (field.type === "Picture") {
162
+ value = {
163
+ Variants: [{ Name: "Landscape", MediaId: field.value }],
164
+ };
165
+ rawValue = JSON.stringify(value);
166
+ }
167
+ await editContext.operations.editField({
168
+ field: fieldDescriptor,
169
+ value: value,
170
+ rawValue: rawValue,
171
+ refresh: "none",
172
+ });
173
+ setPageModel((prev) => {
174
+ const component = findComponent(prev.components, componentPath);
175
+ if (component) {
176
+ const prevField = component.fields.find((f) => f.name === field.name);
177
+ if (prevField) {
178
+ prevField.writtenValue = field.value + field.type;
179
+ }
180
+ }
181
+ return {
182
+ ...prev,
183
+ };
184
+ });
185
+ }
186
+ }
187
+ // 3. Recursively process placeholders
188
+ if (component.children && component.children.length > 0) {
189
+ await createComponentsRecursively(component.children, component.type, component.id, componentPath);
190
+ }
191
+ }
192
+ };
193
+ return { createComponentsRecursively };
194
+ }
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NewPage = NewPage;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const ScrollingContentTree_1 = require("../editor/ScrollingContentTree");
7
+ const contentService_1 = require("../editor/services/contentService");
8
+ const editService_1 = require("../editor/services/editService");
9
+ const inputtext_1 = require("primereact/inputtext");
10
+ const button_1 = require("primereact/button");
11
+ const utils_1 = require("../editor/utils");
12
+ const utils_2 = require("primereact/utils");
13
+ const client_components_1 = require("../client-components");
14
+ const SectionHeadline_1 = require("./SectionHeadline");
15
+ const use_debounce_1 = require("use-debounce");
16
+ const service_1 = require("../page-wizard/service");
17
+ function NewPage({ selectedItemId }) {
18
+ const [selectedItem, setSelectedItem] = (0, react_1.useState)(null);
19
+ const [isValid, setIsValid] = (0, react_1.useState)(false);
20
+ const [insertOptions, setInsertOptions] = (0, react_1.useState)(null);
21
+ const [validationMessage, setValidationMessage] = (0, react_1.useState)(null);
22
+ const [selectedTemplate, setSelectedTemplate] = (0, react_1.useState)();
23
+ const [name, setName] = (0, react_1.useState)("");
24
+ const editContext = (0, client_components_1.useEditContext)();
25
+ const [wizards, setWizards] = (0, react_1.useState)([]);
26
+ const insertOptionsAndWizards = (0, react_1.useMemo)(() => {
27
+ return [...(insertOptions || []), ...(wizards || [])];
28
+ }, [insertOptions, wizards]);
29
+ (0, react_1.useEffect)(() => {
30
+ const loadOptions = async () => {
31
+ if (!selectedItem)
32
+ return;
33
+ const item = (0, utils_1.getItemDescriptor)(selectedItem);
34
+ const insertOptions = await (0, editService_1.loadInsertOptions)(item);
35
+ const pageInsertOptions = insertOptions?.filter((x) => x.hasLayout);
36
+ setInsertOptions(pageInsertOptions);
37
+ setSelectedTemplate(pageInsertOptions?.[0]?.id);
38
+ };
39
+ const loadWizards = async () => {
40
+ if (!selectedItem)
41
+ return;
42
+ const item = (0, utils_1.getItemDescriptor)(selectedItem);
43
+ const wizards = await (0, service_1.getWizards)(item);
44
+ setWizards(wizards);
45
+ };
46
+ loadOptions();
47
+ loadWizards();
48
+ }, [selectedItem]);
49
+ (0, react_1.useEffect)(() => {
50
+ const loadItem = async () => {
51
+ const itemId = selectedItemId ||
52
+ editContext?.configuration.editor.dialogs.newPage.expandTreeNode;
53
+ if (!itemId)
54
+ return;
55
+ const item = await editContext.itemsRepository.getItem({
56
+ id: itemId,
57
+ language: "en",
58
+ version: 0,
59
+ });
60
+ if (item)
61
+ setSelectedItem(item);
62
+ };
63
+ loadItem();
64
+ }, [selectedItemId]);
65
+ const isValidDebounced = (0, use_debounce_1.useDebouncedCallback)(async () => {
66
+ if (!selectedItem)
67
+ return;
68
+ let valid = !!selectedTemplate && name.trim().length >= 3;
69
+ if (valid) {
70
+ const children = await (0, contentService_1.getChildren)(selectedItem.id, editContext?.sessionId ?? "", [], false, editContext?.contentEditorItem?.language || "en");
71
+ if (children.find((x) => x.name.toLocaleLowerCase() === name.trim().toLocaleLowerCase())) {
72
+ valid = false;
73
+ setValidationMessage("A page with this name already exists.");
74
+ }
75
+ }
76
+ else {
77
+ if (name.trim().length > 0 && name.trim().length < 3)
78
+ setValidationMessage("Name is too short.");
79
+ else
80
+ setValidationMessage(null);
81
+ }
82
+ if (valid)
83
+ setValidationMessage(null);
84
+ setIsValid(valid);
85
+ }, 500);
86
+ (0, react_1.useEffect)(() => {
87
+ isValidDebounced();
88
+ }, [name]);
89
+ const handleOk = async () => {
90
+ if (!selectedItem || !selectedTemplate)
91
+ return;
92
+ const result = await (0, editService_1.executeCreateItem)((0, utils_1.getItemDescriptor)(selectedItem), selectedTemplate, name);
93
+ if (result.response.ok) {
94
+ editContext?.switchView("page-editor");
95
+ if (result.data)
96
+ editContext?.loadItem(result.data);
97
+ }
98
+ else {
99
+ editContext.showToast({
100
+ severity: "error",
101
+ summary: "Error",
102
+ detail: "Failed to create item",
103
+ });
104
+ }
105
+ };
106
+ const launchWizard = (ev) => {
107
+ const wizard = wizards?.find((x) => x.id === selectedTemplate);
108
+ if (!wizard || !selectedItem)
109
+ return;
110
+ editContext?.executeCommand({
111
+ command: editContext?.configuration.pageWizard.startWizardCommand,
112
+ data: {
113
+ wizard,
114
+ item: selectedItem,
115
+ },
116
+ event: ev,
117
+ });
118
+ };
119
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "flex h-full gap-3", children: [(0, jsx_runtime_1.jsxs)("div", { className: "tour-pick-location flex w-1/2 flex-col", children: [(0, jsx_runtime_1.jsx)(SectionHeadline_1.SectionHeadline, { children: "1. Pick Location" }), (0, jsx_runtime_1.jsx)("div", { className: "relative flex-1", children: (0, jsx_runtime_1.jsx)("div", { className: "absolute inset-0 overflow-auto", children: (0, jsx_runtime_1.jsx)(ScrollingContentTree_1.ScrollingContentTree, { selectedItemId: selectedItem?.id || selectedItemId, onSelectionChange: (selection) => {
120
+ const selected = selection[0];
121
+ if (selected)
122
+ setSelectedItem(selected);
123
+ } }) }) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "w-1/2 border-l pl-7", children: [(0, jsx_runtime_1.jsx)(SectionHeadline_1.SectionHeadline, { className: "tour-choose-template", children: "2. Choose a Template or Wizard" }), (0, jsx_runtime_1.jsxs)("div", { className: "mt-1 flex min-h-12 flex-wrap gap-3", children: [!insertOptions?.length && ((0, jsx_runtime_1.jsx)("div", { children: "No page templates available here." })), insertOptionsAndWizards?.map((option) => ((0, jsx_runtime_1.jsxs)("div", { onClick: () => setSelectedTemplate(option.id), className: (0, utils_2.classNames)("mb-2 flex cursor-pointer flex-col items-center bg-gray-100 p-2 text-sm", selectedTemplate === option.id
124
+ ? "tour-selected-template bg-gray-200 outline outline-2 outline-offset-2 outline-gray-200"
125
+ : "bg-gray-100"), children: [(0, jsx_runtime_1.jsx)("img", { src: (0, utils_1.getAbsoluteIconUrl)(option.icon), width: "32", height: "32" }), option.name] }, option.id)))] }), selectedTemplate &&
126
+ wizards?.find((x) => x.id === selectedTemplate) && ((0, jsx_runtime_1.jsx)("div", { className: "mt-4", children: (0, jsx_runtime_1.jsx)(button_1.Button, { onClick: launchWizard, label: "Start Wizard", id: "launch-wizard-button" }) })), selectedTemplate &&
127
+ insertOptions?.find((x) => x.id === selectedTemplate) && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SectionHeadline_1.SectionHeadline, { children: "3. Name Your Page" }), (0, jsx_runtime_1.jsx)(inputtext_1.InputText, { className: "w-full", value: name, id: "new-page-name", onChange: (e) => setName(e.target.value), onKeyDown: (ev) => {
128
+ if (ev.key === "Enter" && isValid)
129
+ handleOk();
130
+ }, "data-testid": "new-page-name" }), validationMessage && ((0, jsx_runtime_1.jsx)("div", { className: "mt-2 text-red-500", children: validationMessage })), (0, jsx_runtime_1.jsx)("div", { className: "mt-4", children: (0, jsx_runtime_1.jsx)(button_1.Button, { onClick: handleOk, label: "Create", disabled: !isValid, id: "create-new-page-button" }) })] }))] })] }));
131
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SectionHeadline = SectionHeadline;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const utils_1 = require("primereact/utils");
6
+ const Icons_1 = require("../editor/ui/Icons");
7
+ function SectionHeadline({ children, className, }) {
8
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.classNames)("mt-2 mb-2 font-bold flex gap-2 items-center w-fit", className), children: [(0, jsx_runtime_1.jsx)(Icons_1.ArrowRightIcon, {}), " ", children] }));
9
+ }