robobyte-front-builder 1.0.19 → 1.0.23

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 (520) hide show
  1. package/INTEGRATION.md +1586 -0
  2. package/README.md +928 -0
  3. package/RoboByteBuilder_User_Manual.docx +0 -0
  4. package/next.config.js +19 -48
  5. package/package.json +42 -86
  6. package/src/context/BuilderContext.jsx +191 -7
  7. package/src/context/SystemContext.js +2 -2
  8. package/src/hooks/useGlobalStore.js +36 -0
  9. package/src/hooks/useTimerEngine.js +54 -0
  10. package/src/lib/index.js +11 -3
  11. package/src/lib/layouts/BlankLayout.jsx +13 -0
  12. package/src/lib/providers/RoboByteFrontBuilderProvider.jsx +61 -7
  13. package/src/lib/themes/builderTheme.js +41 -0
  14. package/src/pages/_app.js +32 -134
  15. package/src/pages/api/ai.js +107 -0
  16. package/src/pages/builders/report/index.js +1 -0
  17. package/src/pages/builders/report/list/index.js +1 -0
  18. package/src/pages/builders/report/viewer/index.js +1 -0
  19. package/src/pages/index.js +88 -37
  20. package/src/pages/printBuilder/index.jsx +263 -0
  21. package/src/pages/printBuilder/layouts/index.jsx +298 -0
  22. package/src/pages/reportModule/reportBuilder/index.js +8 -6
  23. package/src/pages/reportModule/reportBuilder/reportViewer/index.js +92 -25
  24. package/src/pages/reportModule/reportBuilder/reports/index.js +3 -5
  25. package/src/pages/reportModule/reportBuilder/reportsPermissions/index.js +2 -3
  26. package/src/pages/viewBuilder/index.jsx +117 -32
  27. package/src/pages/viewBuilder/views/index.js +3 -3
  28. package/src/pages/viewer/[id]/index.js +2 -1
  29. package/src/services/DeleteService.js +31 -60
  30. package/src/services/Endpoints/PrintLayoutEndpoints.js +42 -0
  31. package/src/services/Endpoints/ReportBuilderEndpoints.js +7 -7
  32. package/src/services/Endpoints.js +2 -0
  33. package/src/services/GetService.js +33 -54
  34. package/src/services/PatchService.js +38 -65
  35. package/src/services/PostService.js +37 -63
  36. package/src/services/UpdateService.js +39 -65
  37. package/src/services/builderHelper/actionExecutor.js +141 -25
  38. package/src/services/builderHelper/builderHelper.js +92 -0
  39. package/src/services/builderHelper/colorSchema.js +95 -0
  40. package/src/services/builderHelper/iconResolver.js +50 -0
  41. package/src/services/builderHelper/jsExecutor.js +212 -46
  42. package/src/services/builderHelper/nodeFactory.js +32 -15
  43. package/src/services/builderHelper/numberFormat.js +123 -0
  44. package/src/services/builderHelper/resolveProps.js +73 -4
  45. package/src/services/builderHelper/thresholdEngine.js +77 -0
  46. package/src/services/builderHelper/tree.js +31 -0
  47. package/src/services/components/agGridAutoComplete.js +5 -9
  48. package/src/services/config.js +9 -1
  49. package/src/services/globalStore.js +80 -0
  50. package/src/services/helper/multiSelectEditor.js +5 -9
  51. package/src/services/helper/multiSelectEditorByBuilder.js +5 -9
  52. package/src/services/reportData/fetchReportData.js +69 -28
  53. package/src/services/routerRef.js +35 -0
  54. package/src/services/sessionLog.js +171 -0
  55. package/src/views/ConfirmDialog.js +2 -2
  56. package/src/views/builder/JSEditor.js +105 -107
  57. package/src/views/builder/SessionLogDialog.jsx +350 -0
  58. package/src/views/builder/UnsavedChangesGuard.jsx +103 -0
  59. package/src/views/builder/inspector/Inspector.jsx +6 -9
  60. package/src/views/builder/inspector/Tabs/ComponentActionsTab.jsx +7 -13
  61. package/src/views/builder/inspector/Tabs/MainTab.jsx +143 -25
  62. package/src/views/builder/inspector/Tabs/RulesTab.jsx +9 -24
  63. package/src/views/builder/inspector/Tabs/StyleTab.jsx +9 -24
  64. package/src/views/builder/inspector/definitions/autocomplete/main.js +4 -6
  65. package/src/views/builder/inspector/definitions/banner/actions.js +7 -0
  66. package/src/views/builder/inspector/definitions/banner/main.js +22 -0
  67. package/src/views/builder/inspector/definitions/banner/rules.js +1 -0
  68. package/src/views/builder/inspector/definitions/banner/style.js +1 -0
  69. package/src/views/builder/inspector/definitions/breadcrumb/main.js +43 -6
  70. package/src/views/builder/inspector/definitions/button/main.js +11 -12
  71. package/src/views/builder/inspector/definitions/button/style.js +18 -30
  72. package/src/views/builder/inspector/definitions/checkbox/actions.js +3 -1
  73. package/src/views/builder/inspector/definitions/checkbox/main.js +4 -6
  74. package/src/views/builder/inspector/definitions/common/main.js +13 -2
  75. package/src/views/builder/inspector/definitions/dataGrid/main.js +23 -0
  76. package/src/views/builder/inspector/definitions/dataTableViewer/main.js +46 -0
  77. package/src/views/builder/inspector/definitions/datepicker/actions.js +3 -1
  78. package/src/views/builder/inspector/definitions/datepicker/main.js +6 -14
  79. package/src/views/builder/inspector/definitions/dialog/main.js +36 -0
  80. package/src/views/builder/inspector/definitions/dropdown/main.js +5 -8
  81. package/src/views/builder/inspector/definitions/excelUpload/actions.js +23 -0
  82. package/src/views/builder/inspector/definitions/excelUpload/main.js +17 -0
  83. package/src/views/builder/inspector/definitions/excelUpload/rules.js +1 -0
  84. package/src/views/builder/inspector/definitions/excelUpload/style.js +45 -0
  85. package/src/views/builder/inspector/definitions/header/main.js +10 -1
  86. package/src/views/builder/inspector/definitions/index.js +106 -19
  87. package/src/views/builder/inspector/definitions/input/actions.js +4 -1
  88. package/src/views/builder/inspector/definitions/input/main.js +20 -11
  89. package/src/views/builder/inspector/definitions/kpi/avatarGroup.js +22 -0
  90. package/src/views/builder/inspector/definitions/kpi/badge.js +17 -0
  91. package/src/views/builder/inspector/definitions/kpi/bulletChart.js +47 -0
  92. package/src/views/builder/inspector/definitions/kpi/chart.js +55 -0
  93. package/src/views/builder/inspector/definitions/kpi/colorScale.js +60 -0
  94. package/src/views/builder/inspector/definitions/kpi/comparisonBars.js +41 -0
  95. package/src/views/builder/inspector/definitions/kpi/countdown.js +46 -0
  96. package/src/views/builder/inspector/definitions/kpi/donut.js +51 -0
  97. package/src/views/builder/inspector/definitions/kpi/funnel.js +25 -0
  98. package/src/views/builder/inspector/definitions/kpi/gauge.js +39 -0
  99. package/src/views/builder/inspector/definitions/kpi/heatmapGrid.js +96 -0
  100. package/src/views/builder/inspector/definitions/kpi/iconBox.js +20 -0
  101. package/src/views/builder/inspector/definitions/kpi/metric.js +45 -0
  102. package/src/views/builder/inspector/definitions/kpi/rating.js +27 -0
  103. package/src/views/builder/inspector/definitions/kpi/statusDot.js +18 -0
  104. package/src/views/builder/inspector/definitions/kpi/stepStage.js +65 -0
  105. package/src/views/builder/inspector/definitions/kpi/tagList.js +32 -0
  106. package/src/views/builder/inspector/definitions/kpi/timeline.js +80 -0
  107. package/src/views/builder/inspector/definitions/kpi/trend.js +20 -0
  108. package/src/views/builder/inspector/definitions/label/main.js +10 -1
  109. package/src/views/builder/inspector/definitions/layout/main.js +27 -3
  110. package/src/views/builder/inspector/definitions/number/main.js +6 -14
  111. package/src/views/builder/inspector/definitions/pageNumber/main.js +21 -0
  112. package/src/views/builder/inspector/definitions/popover/main.js +71 -0
  113. package/src/views/builder/inspector/definitions/radio/main.js +5 -8
  114. package/src/views/builder/inspector/definitions/repeater/main.js +31 -0
  115. package/src/views/builder/inspector/definitions/reportViewer/main.js +28 -1
  116. package/src/views/builder/inspector/definitions/richtext/main.js +5 -8
  117. package/src/views/builder/inspector/definitions/signature/main.js +4 -1
  118. package/src/views/builder/inspector/definitions/tag/main.js +5 -8
  119. package/src/views/builder/inspector/definitions/textarea/actions.js +4 -1
  120. package/src/views/builder/inspector/definitions/textarea/main.js +5 -7
  121. package/src/views/builder/inspector/definitions/time/main.js +5 -8
  122. package/src/views/builder/inspector/definitions/toggle/main.js +5 -19
  123. package/src/views/builder/inspector/definitions/treeView/main.js +61 -0
  124. package/src/views/builder/inspector/definitions/viewRenderer/main.js +53 -0
  125. package/src/views/builder/inspector/definitions/wizard/main.js +68 -0
  126. package/src/views/builder/inspector/definitions/wizard-step/main.js +25 -0
  127. package/src/views/builder/inspector/fields/ActionsConfigEditor.jsx +426 -0
  128. package/src/views/builder/inspector/fields/ColorSchemaField.jsx +140 -0
  129. package/src/views/builder/inspector/fields/ColumnFunctionEditor.jsx +238 -0
  130. package/src/views/builder/inspector/fields/ColumnMappingEditor.jsx +105 -0
  131. package/src/views/builder/inspector/fields/ColumnsConfigEditor.jsx +506 -0
  132. package/src/views/builder/inspector/fields/DonutRingsEditorField.jsx +337 -0
  133. package/src/views/builder/inspector/fields/ExtraColsEditor.jsx +618 -0
  134. package/src/views/builder/inspector/fields/FunctionHelpPopover.jsx +295 -0
  135. package/src/views/builder/inspector/fields/IconEditor.jsx +64 -0
  136. package/src/views/builder/inspector/fields/KpiActionField.jsx +223 -0
  137. package/src/views/builder/inspector/fields/MarkersEditorField.jsx +173 -0
  138. package/src/views/builder/inspector/fields/SelectEditor.jsx +9 -5
  139. package/src/views/builder/inspector/fields/SeriesEditorField.jsx +363 -0
  140. package/src/views/builder/inspector/fields/TableColumnsEditor.jsx +104 -0
  141. package/src/views/builder/inspector/fields/ThresholdsEditor.jsx +247 -0
  142. package/src/views/builder/inspector/fields/ValueFunctionsRefPanel.jsx +217 -0
  143. package/src/views/builder/inspector/fields/columnEditorShared.jsx +217 -0
  144. package/src/views/builder/sidebar/Sidebar.jsx +4 -2
  145. package/src/views/builder/sidebar/SidebarTabs.jsx +28 -17
  146. package/src/views/builder/sidebar/tabs/ActionsTab.jsx +7 -3
  147. package/src/views/builder/sidebar/tabs/AiTab/AiPreviewDialog.jsx +193 -0
  148. package/src/views/builder/sidebar/tabs/AiTab/aiProvider.js +53 -0
  149. package/src/views/builder/sidebar/tabs/AiTab/index.jsx +409 -0
  150. package/src/views/builder/sidebar/tabs/AiTab/schemaTransformer.js +167 -0
  151. package/src/views/builder/sidebar/tabs/AiTab/schemaValidator.js +64 -0
  152. package/src/views/builder/sidebar/tabs/AiTab/systemPrompt.js +1151 -0
  153. package/src/views/builder/sidebar/tabs/AiTab/trainingExport.js +131 -0
  154. package/src/views/builder/sidebar/tabs/Components/ComponentsTab.jsx +31 -31
  155. package/src/views/builder/sidebar/tabs/Components/componentCatalog.js +43 -21
  156. package/src/views/builder/sidebar/tabs/Components/printComponentCatalog.js +81 -0
  157. package/src/views/builder/sidebar/tabs/TimersTab.jsx +338 -0
  158. package/src/views/builder/sidebar/tabs/TreeTab.jsx +13 -4
  159. package/src/views/builder/sidebar/tabs/ViewTab.jsx +173 -13
  160. package/src/views/builder/viewer/AdornedLabel.jsx +82 -0
  161. package/src/views/builder/viewer/ComponentRenderer.jsx +98 -24
  162. package/src/views/builder/viewer/DialogsZone.jsx +259 -0
  163. package/src/views/builder/viewer/FieldLabel.jsx +106 -0
  164. package/src/views/builder/viewer/PrintDialog.jsx +481 -0
  165. package/src/views/builder/viewer/ProductionViewer.jsx +80 -5
  166. package/src/views/builder/viewer/Viewer.jsx +106 -8
  167. package/src/views/builder/viewer/ViewerComponentWrapper.jsx +70 -9
  168. package/src/views/builder/viewer/ViewerToolbar.jsx +285 -56
  169. package/src/views/builder/viewer/renderers/AutoCompleteRenderer.jsx +26 -22
  170. package/src/views/builder/viewer/renderers/AvatarGroupRenderer.jsx +112 -0
  171. package/src/views/builder/viewer/renderers/BadgeRenderer.jsx +79 -0
  172. package/src/views/builder/viewer/renderers/BannerRenderer.jsx +62 -0
  173. package/src/views/builder/viewer/renderers/BreadcrumbRenderer.jsx +203 -15
  174. package/src/views/builder/viewer/renderers/BulletChartRenderer.jsx +147 -0
  175. package/src/views/builder/viewer/renderers/ButtonRenderer.jsx +98 -39
  176. package/src/views/builder/viewer/renderers/CardRenderer.jsx +1 -1
  177. package/src/views/builder/viewer/renderers/ChartRenderer.jsx +388 -0
  178. package/src/views/builder/viewer/renderers/CheckboxRenderer.jsx +17 -9
  179. package/src/views/builder/viewer/renderers/ColorScaleRenderer.jsx +300 -0
  180. package/src/views/builder/viewer/renderers/ComparisonBarsRenderer.jsx +133 -0
  181. package/src/views/builder/viewer/renderers/ContainerRenderer.jsx +3 -1
  182. package/src/views/builder/viewer/renderers/CountdownRenderer.jsx +249 -0
  183. package/src/views/builder/viewer/renderers/DataGridRenderer.jsx +380 -0
  184. package/src/views/builder/viewer/renderers/DataTableViewerRenderer.jsx +240 -0
  185. package/src/views/builder/viewer/renderers/DatePickerRenderer.jsx +25 -24
  186. package/src/views/builder/viewer/renderers/DialogRenderer.jsx +327 -0
  187. package/src/views/builder/viewer/renderers/DividerRenderer.jsx +1 -1
  188. package/src/views/builder/viewer/renderers/DonutRenderer.jsx +294 -0
  189. package/src/views/builder/viewer/renderers/DropdownRenderer.jsx +36 -44
  190. package/src/views/builder/viewer/renderers/ExcelUploadRenderer.jsx +639 -0
  191. package/src/views/builder/viewer/renderers/FunnelRenderer.jsx +93 -0
  192. package/src/views/builder/viewer/renderers/GaugeRenderer.jsx +159 -0
  193. package/src/views/builder/viewer/renderers/HeaderRenderer.jsx +31 -9
  194. package/src/views/builder/viewer/renderers/HeatmapGridRenderer.jsx +432 -0
  195. package/src/views/builder/viewer/renderers/IconBoxRenderer.jsx +59 -0
  196. package/src/views/builder/viewer/renderers/ImageRenderer.jsx +1 -1
  197. package/src/views/builder/viewer/renderers/InputRenderer.jsx +75 -18
  198. package/src/views/builder/viewer/renderers/LabelRenderer.jsx +35 -9
  199. package/src/views/builder/viewer/renderers/LayoutCellRenderer.jsx +102 -40
  200. package/src/views/builder/viewer/renderers/LayoutContextMenu.jsx +8 -8
  201. package/src/views/builder/viewer/renderers/LayoutRenderer.jsx +48 -6
  202. package/src/views/builder/viewer/renderers/LinkRenderer.jsx +1 -1
  203. package/src/views/builder/viewer/renderers/MenuRenderer.jsx +2 -2
  204. package/src/views/builder/viewer/renderers/MetricRenderer.jsx +80 -0
  205. package/src/views/builder/viewer/renderers/NumberFormatRenderer.jsx +21 -30
  206. package/src/views/builder/viewer/renderers/PageNumberRenderer.jsx +76 -0
  207. package/src/views/builder/viewer/renderers/PopoverRenderer.jsx +350 -0
  208. package/src/views/builder/viewer/renderers/ProgressCircleRenderer.jsx +1 -1
  209. package/src/views/builder/viewer/renderers/ProgressLineRenderer.jsx +1 -1
  210. package/src/views/builder/viewer/renderers/RadioGroupRenderer.jsx +28 -39
  211. package/src/views/builder/viewer/renderers/RatingRenderer.jsx +80 -0
  212. package/src/views/builder/viewer/renderers/RepeaterRenderer.jsx +297 -38
  213. package/src/views/builder/viewer/renderers/ReportViewerRenderer.jsx +263 -5
  214. package/src/views/builder/viewer/renderers/RichTextRenderer.jsx +60 -66
  215. package/src/views/builder/viewer/renderers/RowActionsCell.jsx +308 -0
  216. package/src/views/builder/viewer/renderers/SignatureRenderer.jsx +33 -62
  217. package/src/views/builder/viewer/renderers/StatusDotRenderer.jsx +75 -0
  218. package/src/views/builder/viewer/renderers/StepStageRenderer.jsx +348 -0
  219. package/src/views/builder/viewer/renderers/TagListRenderer.jsx +115 -0
  220. package/src/views/builder/viewer/renderers/TagPickerRenderer.jsx +31 -45
  221. package/src/views/builder/viewer/renderers/TextAreaRenderer.jsx +25 -18
  222. package/src/views/builder/viewer/renderers/TextRenderer.jsx +7 -1
  223. package/src/views/builder/viewer/renderers/TimePickerRenderer.jsx +25 -24
  224. package/src/views/builder/viewer/renderers/TimelineRenderer.jsx +525 -0
  225. package/src/views/builder/viewer/renderers/ToggleRenderer.jsx +21 -27
  226. package/src/views/builder/viewer/renderers/TreeViewRenderer.jsx +832 -0
  227. package/src/views/builder/viewer/renderers/TrendRenderer.jsx +66 -0
  228. package/src/views/builder/viewer/renderers/ViewRendererRenderer.jsx +315 -0
  229. package/src/views/builder/viewer/renderers/WizardRenderer.jsx +380 -64
  230. package/src/views/builder/viewer/renderers/WizardStepRenderer.jsx +21 -12
  231. package/src/views/builder/viewer/renderers/dataGridComponents.jsx +824 -0
  232. package/src/views/customFilter/CustomFilterDialog.js +1023 -660
  233. package/src/views/customFilter/FixedFilterDialog.js +649 -0
  234. package/src/views/customFilter/SearchFilterDialog.js +248 -0
  235. package/src/views/genericTable/BuilderExpressionParams.js +3 -3
  236. package/src/views/genericTable/ColumnConfiguratorDialog.js +33 -24
  237. package/src/views/genericTable/FixedFilterDialog.js +3 -2
  238. package/src/views/genericTable/FormattingSettingsDialog.js +8 -3
  239. package/src/views/genericTable/SGrid.js +821 -448
  240. package/src/views/genericTable/SearchFilterDialog.js +3 -2
  241. package/src/views/genericTable/cellEditors/autocompleteEditor.js +5 -9
  242. package/src/views/genericTable/convertStringFunctions.js +274 -138
  243. package/src/views/genericTable/statusBar/rowCountStatusBar.js +3 -1
  244. package/src/views/genericTable/updateRefHelpers.js +9 -6
  245. package/src/views/printBuilder/PrintBuilderViewer.jsx +627 -0
  246. package/src/views/printBuilder/PrintPreviewCanvas.jsx +157 -0
  247. package/src/views/rolePermissions/UpdateReportPermissionDialog.js +3 -2
  248. package/src/@core/components/auth/AclGuard.js +0 -55
  249. package/src/@core/components/auth/AuthGuard.js +0 -40
  250. package/src/@core/components/auth/GuestGuard.js +0 -30
  251. package/src/@core/components/custom-inputs/Horizontal.jsx +0 -143
  252. package/src/@core/components/custom-inputs/Image.jsx +0 -78
  253. package/src/@core/components/custom-inputs/Vertical.jsx +0 -113
  254. package/src/@core/components/customizer/index.jsx +0 -470
  255. package/src/@core/components/customizer/styles.module.css +0 -169
  256. package/src/@core/components/mui/Avatar.jsx +0 -41
  257. package/src/@core/components/mui/Badge.jsx +0 -20
  258. package/src/@core/components/mui/IconButton.jsx +0 -74
  259. package/src/@core/components/mui/TabList.jsx +0 -60
  260. package/src/@core/components/option-menu/index.jsx +0 -137
  261. package/src/@core/components/scroll-to-top/index.jsx +0 -43
  262. package/src/@core/components/spinner/index.js +0 -26
  263. package/src/@core/components/window-wrapper/index.js +0 -27
  264. package/src/@core/contexts/settingsContext.jsx +0 -98
  265. package/src/@core/hooks/useBgColor.js +0 -63
  266. package/src/@core/hooks/useImageVariant.js +0 -27
  267. package/src/@core/hooks/useLayoutInit.js +0 -37
  268. package/src/@core/hooks/useObjectCookie.js +0 -18
  269. package/src/@core/hooks/useSettings.jsx +0 -15
  270. package/src/@core/layouts/BlankLayout.js +0 -37
  271. package/src/@core/layouts/BlankLayoutWithAppBar.js +0 -51
  272. package/src/@core/layouts/HorizontalLayout.jsx +0 -151
  273. package/src/@core/layouts/Layout.js +0 -39
  274. package/src/@core/layouts/VerticalLayout.jsx +0 -124
  275. package/src/@core/layouts/components/blank-layout-with-appBar/index.js +0 -115
  276. package/src/@core/layouts/components/horizontal/app-bar-content/index.js +0 -67
  277. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavGroup.js +0 -352
  278. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavItems.js +0 -21
  279. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavLink.js +0 -195
  280. package/src/@core/layouts/components/horizontal/navigation/index.js +0 -31
  281. package/src/@core/layouts/components/shared-components/LanguageDropdown.js +0 -96
  282. package/src/@core/layouts/components/shared-components/ModeToggler.js +0 -32
  283. package/src/@core/layouts/components/shared-components/NotificationDropdown.js +0 -226
  284. package/src/@core/layouts/components/shared-components/UserDropdown.js +0 -177
  285. package/src/@core/layouts/components/shared-components/footer/FooterContent.js +0 -46
  286. package/src/@core/layouts/components/shared-components/footer/index.js +0 -61
  287. package/src/@core/layouts/components/vertical/appBar/index.js +0 -74
  288. package/src/@core/layouts/components/vertical/navigation/Drawer.js +0 -122
  289. package/src/@core/layouts/components/vertical/navigation/VerticalNavGroup.js +0 -435
  290. package/src/@core/layouts/components/vertical/navigation/VerticalNavHeader.js +0 -180
  291. package/src/@core/layouts/components/vertical/navigation/VerticalNavItems.js +0 -26
  292. package/src/@core/layouts/components/vertical/navigation/VerticalNavLink.js +0 -258
  293. package/src/@core/layouts/components/vertical/navigation/VerticalNavSectionTitle.js +0 -102
  294. package/src/@core/layouts/components/vertical/navigation/index.js +0 -169
  295. package/src/@core/layouts/utils.js +0 -69
  296. package/src/@core/styles/Table.module.css +0 -93
  297. package/src/@core/styles/horizontal/menuItemStyles.js +0 -100
  298. package/src/@core/styles/horizontal/menuRootStyles.js +0 -19
  299. package/src/@core/styles/libs/fullcalendar/index.js +0 -461
  300. package/src/@core/styles/libs/keen-slider/index.js +0 -111
  301. package/src/@core/styles/libs/react-apexcharts/index.js +0 -107
  302. package/src/@core/styles/libs/react-cleave/index.js +0 -33
  303. package/src/@core/styles/libs/react-credit-cards/index.js +0 -11
  304. package/src/@core/styles/libs/react-datepicker/index.js +0 -388
  305. package/src/@core/styles/libs/react-draft-wysiwyg/index.js +0 -144
  306. package/src/@core/styles/libs/react-dropzone/index.js +0 -76
  307. package/src/@core/styles/libs/react-hot-toast/index.js +0 -37
  308. package/src/@core/styles/libs/recharts/index.js +0 -47
  309. package/src/@core/styles/stepper.js +0 -103
  310. package/src/@core/styles/vertical/menuItemStyles.js +0 -138
  311. package/src/@core/styles/vertical/menuSectionStyles.js +0 -54
  312. package/src/@core/styles/vertical/navigationCustomStyles.js +0 -62
  313. package/src/@core/svg/ContentCompact.jsx +0 -17
  314. package/src/@core/svg/ContentWide.jsx +0 -17
  315. package/src/@core/svg/DirectionLtr.jsx +0 -93
  316. package/src/@core/svg/DirectionRtl.jsx +0 -93
  317. package/src/@core/svg/LayoutCollapsed.jsx +0 -59
  318. package/src/@core/svg/LayoutHorizontal.jsx +0 -42
  319. package/src/@core/svg/LayoutVertical.jsx +0 -59
  320. package/src/@core/svg/Logo.jsx +0 -76
  321. package/src/@core/svg/SkinBordered.jsx +0 -54
  322. package/src/@core/svg/SkinDefault.jsx +0 -59
  323. package/src/@core/tailwind/plugin.js +0 -78
  324. package/src/@core/theme/ThemeComponent.js +0 -63
  325. package/src/@core/theme/ThemeOptions.js +0 -71
  326. package/src/@core/theme/breakpoints/index.js +0 -11
  327. package/src/@core/theme/colorSchemes.js +0 -326
  328. package/src/@core/theme/customShadows.js +0 -11
  329. package/src/@core/theme/globalStyles.js +0 -81
  330. package/src/@core/theme/index.js +0 -42
  331. package/src/@core/theme/overrides/accordion.js +0 -51
  332. package/src/@core/theme/overrides/accordion.jsx +0 -85
  333. package/src/@core/theme/overrides/alerts.js +0 -110
  334. package/src/@core/theme/overrides/alerts.jsx +0 -180
  335. package/src/@core/theme/overrides/autocomplete.js +0 -14
  336. package/src/@core/theme/overrides/autocomplete.jsx +0 -68
  337. package/src/@core/theme/overrides/avatar.js +0 -38
  338. package/src/@core/theme/overrides/avatars.js +0 -27
  339. package/src/@core/theme/overrides/backdrop.js +0 -22
  340. package/src/@core/theme/overrides/badges.js +0 -16
  341. package/src/@core/theme/overrides/breadcrumbs.js +0 -11
  342. package/src/@core/theme/overrides/button-group.js +0 -84
  343. package/src/@core/theme/overrides/button.js +0 -93
  344. package/src/@core/theme/overrides/buttonGroup.js +0 -9
  345. package/src/@core/theme/overrides/card.js +0 -83
  346. package/src/@core/theme/overrides/checkbox.jsx +0 -95
  347. package/src/@core/theme/overrides/chip.js +0 -72
  348. package/src/@core/theme/overrides/dataGrid.js +0 -114
  349. package/src/@core/theme/overrides/dateTimePicker.js +0 -65
  350. package/src/@core/theme/overrides/dialog.js +0 -120
  351. package/src/@core/theme/overrides/divider.js +0 -13
  352. package/src/@core/theme/overrides/drawer.js +0 -20
  353. package/src/@core/theme/overrides/fab.js +0 -13
  354. package/src/@core/theme/overrides/form-control-label.js +0 -19
  355. package/src/@core/theme/overrides/icon-button.js +0 -145
  356. package/src/@core/theme/overrides/index.js +0 -103
  357. package/src/@core/theme/overrides/input.js +0 -72
  358. package/src/@core/theme/overrides/link.js +0 -9
  359. package/src/@core/theme/overrides/list.js +0 -44
  360. package/src/@core/theme/overrides/menu.js +0 -25
  361. package/src/@core/theme/overrides/pagination.js +0 -41
  362. package/src/@core/theme/overrides/paper.js +0 -9
  363. package/src/@core/theme/overrides/popover.js +0 -16
  364. package/src/@core/theme/overrides/progress.js +0 -38
  365. package/src/@core/theme/overrides/radio.jsx +0 -80
  366. package/src/@core/theme/overrides/rating.js +0 -16
  367. package/src/@core/theme/overrides/rating.jsx +0 -32
  368. package/src/@core/theme/overrides/select.js +0 -19
  369. package/src/@core/theme/overrides/select.jsx +0 -52
  370. package/src/@core/theme/overrides/slider.js +0 -97
  371. package/src/@core/theme/overrides/snackbar.js +0 -19
  372. package/src/@core/theme/overrides/switch.js +0 -73
  373. package/src/@core/theme/overrides/switches.js +0 -25
  374. package/src/@core/theme/overrides/table-pagination.js +0 -39
  375. package/src/@core/theme/overrides/table.js +0 -81
  376. package/src/@core/theme/overrides/tabs.js +0 -30
  377. package/src/@core/theme/overrides/timeline.js +0 -80
  378. package/src/@core/theme/overrides/toggle-button.js +0 -33
  379. package/src/@core/theme/overrides/toggleButton.js +0 -16
  380. package/src/@core/theme/overrides/tooltip.js +0 -21
  381. package/src/@core/theme/overrides/typography.js +0 -13
  382. package/src/@core/theme/palette/index.js +0 -107
  383. package/src/@core/theme/shadows/index.js +0 -61
  384. package/src/@core/theme/shadows.js +0 -12
  385. package/src/@core/theme/spacing/index.js +0 -3
  386. package/src/@core/theme/spacing.js +0 -5
  387. package/src/@core/theme/typography/index.js +0 -65
  388. package/src/@core/theme/typography.js +0 -84
  389. package/src/@core/utils/create-emotion-cache.js +0 -5
  390. package/src/@core/utils/hex-to-rgba.js +0 -11
  391. package/src/@core/utils/serverHelpers.js +0 -45
  392. package/src/@menu/components/RouterLink.jsx +0 -18
  393. package/src/@menu/components/horizontal-menu/HorizontalNav.jsx +0 -88
  394. package/src/@menu/components/horizontal-menu/Menu.jsx +0 -83
  395. package/src/@menu/components/horizontal-menu/MenuButton.jsx +0 -100
  396. package/src/@menu/components/horizontal-menu/MenuItem.jsx +0 -183
  397. package/src/@menu/components/horizontal-menu/SubMenu.jsx +0 -418
  398. package/src/@menu/components/horizontal-menu/SubMenuContent.jsx +0 -41
  399. package/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.jsx +0 -20
  400. package/src/@menu/components/vertical-menu/Menu.jsx +0 -161
  401. package/src/@menu/components/vertical-menu/MenuButton.jsx +0 -95
  402. package/src/@menu/components/vertical-menu/MenuItem.jsx +0 -180
  403. package/src/@menu/components/vertical-menu/MenuSection.jsx +0 -124
  404. package/src/@menu/components/vertical-menu/NavCollapseIcons.jsx +0 -70
  405. package/src/@menu/components/vertical-menu/NavHeader.jsx +0 -39
  406. package/src/@menu/components/vertical-menu/SubMenu.jsx +0 -420
  407. package/src/@menu/components/vertical-menu/SubMenuContent.jsx +0 -101
  408. package/src/@menu/components/vertical-menu/VerticalNav.jsx +0 -216
  409. package/src/@menu/contexts/horizontalNavContext.jsx +0 -29
  410. package/src/@menu/contexts/verticalNavContext.jsx +0 -65
  411. package/src/@menu/defaultConfigs.js +0 -12
  412. package/src/@menu/hooks/useHorizontalMenu.jsx +0 -19
  413. package/src/@menu/hooks/useHorizontalNav.jsx +0 -19
  414. package/src/@menu/hooks/useMediaQuery.jsx +0 -29
  415. package/src/@menu/hooks/useVerticalMenu.jsx +0 -19
  416. package/src/@menu/hooks/useVerticalNav.jsx +0 -19
  417. package/src/@menu/horizontal-menu/index.jsx +0 -8
  418. package/src/@menu/styles/StyledBackdrop.jsx +0 -15
  419. package/src/@menu/styles/StyledMenuIcon.jsx +0 -12
  420. package/src/@menu/styles/StyledMenuLabel.jsx +0 -16
  421. package/src/@menu/styles/StyledMenuPrefix.jsx +0 -10
  422. package/src/@menu/styles/StyledMenuSectionLabel.jsx +0 -21
  423. package/src/@menu/styles/StyledMenuSuffix.jsx +0 -10
  424. package/src/@menu/styles/StyledSubMenuContent.jsx +0 -43
  425. package/src/@menu/styles/horizontal/StyledHorizontalMenu.jsx +0 -13
  426. package/src/@menu/styles/horizontal/StyledHorizontalMenuItem.jsx +0 -26
  427. package/src/@menu/styles/horizontal/StyledHorizontalNav.jsx +0 -11
  428. package/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.jsx +0 -33
  429. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.jsx +0 -18
  430. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.jsx +0 -10
  431. package/src/@menu/styles/horizontal/horizontalUl.module.css +0 -15
  432. package/src/@menu/styles/styles.module.css +0 -5
  433. package/src/@menu/styles/vertical/StyledVerticalMenu.jsx +0 -16
  434. package/src/@menu/styles/vertical/StyledVerticalMenuItem.jsx +0 -28
  435. package/src/@menu/styles/vertical/StyledVerticalMenuSection.jsx +0 -23
  436. package/src/@menu/styles/vertical/StyledVerticalNav.jsx +0 -67
  437. package/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.jsx +0 -15
  438. package/src/@menu/styles/vertical/StyledVerticalNavContainer.jsx +0 -23
  439. package/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.jsx +0 -25
  440. package/src/@menu/styles/vertical/verticalNavBgImage.module.css +0 -10
  441. package/src/@menu/svg/ChevronRight.jsx +0 -9
  442. package/src/@menu/svg/Close.jsx +0 -12
  443. package/src/@menu/svg/RadioCircle.jsx +0 -12
  444. package/src/@menu/svg/RadioCircleMarked.jsx +0 -13
  445. package/src/@menu/utils/menuClasses.js +0 -44
  446. package/src/@menu/utils/menuUtils.jsx +0 -145
  447. package/src/@menu/vertical-menu/index.jsx +0 -11
  448. package/src/configs/acl.js +0 -115
  449. package/src/configs/auth.js +0 -5
  450. package/src/configs/aws-exports.js +0 -30
  451. package/src/configs/firebase.js +0 -25
  452. package/src/configs/i18n.js +0 -34
  453. package/src/configs/primaryColorConfig.js +0 -35
  454. package/src/configs/themeConfig.js +0 -44
  455. package/src/layouts/UserLayout.js +0 -94
  456. package/src/layouts/UserThemeOptions.js +0 -191
  457. package/src/layouts/components/Direction.js +0 -30
  458. package/src/layouts/components/HtmlTooltip.js +0 -15
  459. package/src/layouts/components/Translations.js +0 -11
  460. package/src/layouts/components/UserDropdown.js +0 -217
  461. package/src/layouts/components/UserIcon.js +0 -40
  462. package/src/layouts/components/acl/Can.js +0 -6
  463. package/src/layouts/components/acl/CanViewNavGroup.js +0 -36
  464. package/src/layouts/components/acl/CanViewNavLink.js +0 -17
  465. package/src/layouts/components/acl/CanViewNavSectionTitle.js +0 -17
  466. package/src/layouts/components/horizontal/AppBarContent.js +0 -39
  467. package/src/layouts/components/horizontal/ServerSideNavItems.js +0 -44
  468. package/src/layouts/components/mui/StepperComps.js +0 -55
  469. package/src/layouts/components/vertical/AppBarContent.js +0 -35
  470. package/src/layouts/components/vertical/ServerSideNavItems.js +0 -44
  471. package/src/libs/ApexCharts.jsx +0 -5
  472. package/src/libs/ReactPlayer.jsx +0 -5
  473. package/src/libs/Recharts.jsx +0 -4
  474. package/src/libs/auth.js +0 -124
  475. package/src/libs/styles/AppFullCalendar.js +0 -505
  476. package/src/libs/styles/AppKeenSlider.js +0 -116
  477. package/src/libs/styles/AppReactApexCharts.jsx +0 -110
  478. package/src/libs/styles/AppReactDatepicker.jsx +0 -470
  479. package/src/libs/styles/AppReactDropzone.js +0 -76
  480. package/src/libs/styles/AppReactToastify.jsx +0 -108
  481. package/src/libs/styles/AppRecharts.js +0 -55
  482. package/src/libs/styles/inputOtp.module.css +0 -39
  483. package/src/libs/styles/tiptapEditor.css +0 -72
  484. package/src/navigation/horizontal/index.js +0 -246
  485. package/src/navigation/vertical/index.js +0 -253
  486. package/src/pages/401.js +0 -70
  487. package/src/pages/404.js +0 -67
  488. package/src/pages/500.js +0 -68
  489. package/src/pages/[slug].js +0 -115
  490. package/src/pages/_document.js +0 -72
  491. package/src/pages/api/navigation/regenerate-registry.js +0 -116
  492. package/src/pages/api/navigation/save.js +0 -218
  493. package/src/pages/authModule/acl/index.js +0 -48
  494. package/src/pages/authModule/forgot-password/index.js +0 -228
  495. package/src/pages/authModule/permissions/rolePermissions/[id]/rolePermissionsUser/index.js +0 -392
  496. package/src/pages/authModule/permissions/rolePermissions/index.js +0 -343
  497. package/src/pages/authModule/permissions/systemPermissions/index.js +0 -354
  498. package/src/pages/authModule/privacy/index.js +0 -721
  499. package/src/pages/authModule/users/index.js +0 -210
  500. package/src/pages/login/index.js +0 -328
  501. package/src/pages/mainHome/index.js +0 -181
  502. package/src/views/builder/inspector/definitions/cell/main.js +0 -4
  503. package/src/views/builder/inspector/definitions/column/main.js +0 -9
  504. package/src/views/builder/inspector/definitions/column-group/main.js +0 -18
  505. package/src/views/builder/inspector/definitions/header-cell/main.js +0 -5
  506. package/src/views/builder/inspector/definitions/table/main.js +0 -9
  507. package/src/views/builder/viewer/renderers/CellRenderer.jsx +0 -71
  508. package/src/views/builder/viewer/renderers/ColumnGroupRenderer.jsx +0 -96
  509. package/src/views/builder/viewer/renderers/ColumnRenderer.jsx +0 -71
  510. package/src/views/builder/viewer/renderers/HeaderCellRenderer.jsx +0 -78
  511. package/src/views/builder/viewer/renderers/TabRenderer.jsx +0 -82
  512. package/src/views/builder/viewer/renderers/TableRenderer.jsx +0 -92
  513. package/src/views/pages/auth/FooterIllustrationsV2.js +0 -40
  514. package/src/views/pages/misc/FooterIllustrations.js +0 -47
  515. package/src/views/pages/misc/muiTable/CustomPagination.js +0 -34
  516. package/src/views/pages/users/UserManageDialog.js +0 -283
  517. package/src/views/pages/users/UserViewPage.js +0 -199
  518. package/src/views/users/AddUserNameDialog.js +0 -162
  519. package/src/views/users/ContactManage.js +0 -449
  520. package/src/views/users/ResetPasswordDialog.js +0 -242
@@ -1,15 +1,19 @@
1
1
  import { Box } from '@mui/material'
2
+ import { useRef, useEffect } from 'react'
2
3
  import ViewerToolbar from './ViewerToolbar'
3
4
  import ComponentRenderer from './ComponentRenderer'
4
5
  import ProductionViewer from './ProductionViewer'
6
+ import DialogsZone from './DialogsZone'
5
7
  import { useBuilder } from 'src/context/BuilderContext'
8
+ import { findNode, removeFromTree } from 'services/builderHelper'
9
+ import { duplicateInTree, pasteIntoTree, CONTAINER_TYPES, writeNodeToClipboard, readNodeFromClipboard } from 'services/builderHelper/builderHelper'
6
10
 
7
11
  /**
8
12
  * Viewer component for the builder - integrated with BuilderContext
9
13
  * Used within the builder for edit and preview modes
10
14
  * Preview mode now uses ProductionViewer component
11
15
  */
12
- export default function Viewer() {
16
+ export default function Viewer({ isDark, onToggleTheme }) {
13
17
  const {
14
18
  schema,
15
19
  mode,
@@ -29,7 +33,16 @@ export default function Viewer() {
29
33
  setSelectedId,
30
34
  setSchema,
31
35
  draggingNodeId,
32
- setDraggingNodeId
36
+ setDraggingNodeId,
37
+ clipboard,
38
+ setClipboard,
39
+ undo,
40
+ redo,
41
+ dataRef,
42
+ reportRefs,
43
+ dialogRefs,
44
+ openDialog,
45
+ closeDialog,
33
46
  } = useBuilder()
34
47
 
35
48
  // Create viewer context object to pass down (for edit mode)
@@ -48,16 +61,98 @@ export default function Viewer() {
48
61
  setValidationErrors,
49
62
  submitForm,
50
63
  resetForm,
64
+ // ── Unified ref storage ──────────────────────────────────────────────
65
+ dataRef, // useRef({}) — mutable non-reactive store
66
+ reportRefs, // useRef({}) — { [nodeId]: updateRef } per ReportViewer
67
+ dialogRefs, // useRef({}) — { [key]: { open, close } } per Dialog
68
+ openDialog,
69
+ closeDialog,
51
70
  // Builder context for edit mode features
52
71
  builderContext: {
53
72
  selectedId,
54
73
  setSelectedId,
55
74
  setSchema,
56
75
  draggingNodeId,
57
- setDraggingNodeId
76
+ setDraggingNodeId,
77
+ clipboard,
78
+ setClipboard,
58
79
  }
59
80
  }
60
81
 
82
+ // ── Keyboard shortcuts: Ctrl/Cmd + C (copy), V (paste), D (duplicate) ──────
83
+ useEffect(() => {
84
+ if (!isEditMode) return
85
+
86
+ // Async so we can await the system clipboard on paste.
87
+ // e.preventDefault() is always called synchronously (before any await)
88
+ // so browser default suppression is not affected.
89
+ const handleKeyDown = async e => {
90
+ // Don't intercept while the user is typing
91
+ const tag = document.activeElement?.tagName
92
+ if (['INPUT', 'TEXTAREA', 'SELECT'].includes(tag)) return
93
+ if (document.activeElement?.isContentEditable) return
94
+
95
+ if (e.ctrlKey || e.metaKey) {
96
+ if (e.key === 'c' && selectedId) {
97
+ // ── Copy ──────────────────────────────────────────────────────────
98
+ e.preventDefault()
99
+ const node = findNode(schema.root, selectedId)
100
+ if (node) {
101
+ setClipboard(node) // fast same-tab path
102
+ writeNodeToClipboard(node) // cross-tab system clipboard
103
+ }
104
+ } else if (e.key === 'x' && selectedId) {
105
+ // ── Cut — copy then delete (single undo step) ─────────────────────
106
+ e.preventDefault()
107
+ const node = findNode(schema.root, selectedId)
108
+ if (node) {
109
+ setClipboard(node)
110
+ writeNodeToClipboard(node)
111
+ setSchema(prev => ({ ...prev, root: removeFromTree(prev.root, selectedId) }))
112
+ setSelectedId(null)
113
+ }
114
+ } else if (e.key === 'v') {
115
+ // ── Paste — prefer system clipboard (enables cross-tab paste) ─────
116
+ e.preventDefault() // call before await
117
+ const systemNode = await readNodeFromClipboard()
118
+ const nodeToUse = systemNode ?? clipboard
119
+ if (systemNode) setClipboard(systemNode) // keep React state in sync
120
+ if (nodeToUse) {
121
+ setSchema(prev => {
122
+ const targetNode = selectedId ? findNode(prev.root, selectedId) : null
123
+ const asChild = targetNode ? CONTAINER_TYPES.has(targetNode.type) : false
124
+ return { ...prev, root: pasteIntoTree(prev.root, selectedId, nodeToUse, asChild) }
125
+ })
126
+ }
127
+ } else if (e.key === 'd' && selectedId) {
128
+ // ── Duplicate ─────────────────────────────────────────────────────
129
+ e.preventDefault()
130
+ setSchema(prev => ({ ...prev, root: duplicateInTree(prev.root, selectedId) }))
131
+ } else if (e.key === 'z' && !e.shiftKey) {
132
+ // ── Undo ──────────────────────────────────────────────────────────
133
+ e.preventDefault()
134
+ undo()
135
+ } else if ((e.key === 'z' && e.shiftKey) || e.key === 'y') {
136
+ // ── Redo (Ctrl+Shift+Z or Ctrl+Y) ─────────────────────────────────
137
+ e.preventDefault()
138
+ redo()
139
+ }
140
+ } else if ((e.key === 'Delete' || e.key === 'Backspace') && selectedId) {
141
+ // ── Delete selected node ───────────────────────────────────────────────
142
+ e.preventDefault()
143
+ setSchema(prev => ({ ...prev, root: removeFromTree(prev.root, selectedId) }))
144
+ setSelectedId(null)
145
+ }
146
+ }
147
+
148
+ window.addEventListener('keydown', handleKeyDown)
149
+ return () => window.removeEventListener('keydown', handleKeyDown)
150
+ }, [isEditMode, selectedId, clipboard, schema, setClipboard, setSchema, undo, redo])
151
+
152
+ // Ref populated by ProductionViewer on every render so the debug panel
153
+ // can read preview-mode state even though it lives outside useBuilder().
154
+ const previewStateRef = useRef({})
155
+
61
156
  if (!schema?.root) {
62
157
  return (
63
158
  <Box sx={{ height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
@@ -70,13 +165,16 @@ export default function Viewer() {
70
165
 
71
166
  return (
72
167
  <Box sx={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
73
- <ViewerToolbar mode={mode} setMode={setMode} />
168
+ <ViewerToolbar mode={mode} setMode={setMode} previewStateRef={previewStateRef} isDark={isDark} onToggleTheme={onToggleTheme} />
74
169
  {isPreviewMode ? (
75
- <ProductionViewer schema={schema} />
170
+ <ProductionViewer schema={schema} stateRef={previewStateRef} />
76
171
  ) : (
77
- <Box sx={{ flex: 1, overflow: 'auto', p: 2 }}>
78
- <ComponentRenderer node={schema.root} viewerContext={viewerContext} />
79
- </Box>
172
+ <>
173
+ <Box sx={{ flex: 1, overflow: 'auto', p: 2 }}>
174
+ <ComponentRenderer node={schema.root} viewerContext={viewerContext} />
175
+ </Box>
176
+ <DialogsZone dialogs={schema.dialogs ?? []} viewerContext={viewerContext} />
177
+ </>
80
178
  )}
81
179
  </Box>
82
180
  )
@@ -2,7 +2,8 @@ import { Box, Menu, MenuItem, ListItemIcon, ListItemText, Divider } from '@mui/m
2
2
  import { resolveProps } from 'services/builderHelper/resolveProps'
3
3
  import { removeFromTree } from 'services/builderHelper'
4
4
  import { duplicateInTree } from 'services/builderHelper/builderHelper'
5
- import { Delete, ContentCopy, Save } from '@mui/icons-material'
5
+ import { Delete, ContentCopy, ContentCut, ContentPaste, Save } from '@mui/icons-material'
6
+ import { pasteIntoTree, CONTAINER_TYPES, writeNodeToClipboard, readNodeFromClipboard } from 'services/builderHelper/builderHelper'
6
7
  import SaveWidgetDialog from 'views/builder/viewer/SaveWidgetDialog'
7
8
  import { useState } from 'react'
8
9
  import PostService from 'services/PostService'
@@ -52,7 +53,7 @@ export default function ViewerComponentWrapper({ node, children, viewerContext }
52
53
  const { data, form, isEditMode, builderContext } = viewerContext
53
54
 
54
55
  // Resolve style and advanced props
55
- const styleProps = resolveProps(node, 'style', { form, data })
56
+ const styleProps = resolveProps(node, 'style', viewerContext)
56
57
  const elementStyle = resolveElementStyle(styleProps.elementStyle)
57
58
  const elementCss = resolveElementCss(styleProps.elementCss)
58
59
  const resolvedStyleProps = {
@@ -60,7 +61,7 @@ export default function ViewerComponentWrapper({ node, children, viewerContext }
60
61
  elementStyle: undefined,
61
62
  elementCss: undefined
62
63
  }
63
- const advancedProps = resolveProps(node, 'advanced', { form, data })
64
+ const advancedProps = resolveProps(node, 'advanced', viewerContext)
64
65
 
65
66
  // Check visibility from advanced props
66
67
  const isVisible = advancedProps.visible !== false
@@ -68,6 +69,8 @@ export default function ViewerComponentWrapper({ node, children, viewerContext }
68
69
  // Get selection state from builder context (only available in edit mode)
69
70
  const isSelected = builderContext?.selectedId === node.id
70
71
  const canEdit = isEditMode && (builderContext != null)
72
+ const isRoot = node.id === 'root'
73
+ const canDrag = canEdit && !isRoot
71
74
  const isDraggingThis = builderContext?.draggingNodeId === node.id
72
75
  // Handle component selection
73
76
  const handleClick = e => {
@@ -89,6 +92,48 @@ export default function ViewerComponentWrapper({ node, children, viewerContext }
89
92
  }
90
93
  }
91
94
 
95
+ // Clipboard helpers from builderContext
96
+ const clipboard = builderContext?.clipboard
97
+ const setClipboard = builderContext?.setClipboard
98
+
99
+ // Handle cut — copy to system + React clipboard, then remove (one undo step)
100
+ const handleCut = e => {
101
+ e.stopPropagation()
102
+ if (canEdit) {
103
+ if (setClipboard) setClipboard(node)
104
+ writeNodeToClipboard(node) // system clipboard (cross-tab)
105
+ if (builderContext.setSchema) {
106
+ builderContext.setSchema(prev => ({ ...prev, root: removeFromTree(prev.root, node.id) }))
107
+ builderContext.setSelectedId(null)
108
+ }
109
+ }
110
+ }
111
+
112
+ // Handle copy — store in React state AND system clipboard
113
+ const handleCopy = e => {
114
+ e.stopPropagation()
115
+ if (canEdit) {
116
+ if (setClipboard) setClipboard(node)
117
+ writeNodeToClipboard(node) // system clipboard (cross-tab)
118
+ }
119
+ }
120
+
121
+ // Handle paste — prefer system clipboard so cross-tab paste works
122
+ const handlePaste = async e => {
123
+ e.stopPropagation()
124
+ if (!canEdit || !builderContext.setSchema) return
125
+
126
+ const systemNode = await readNodeFromClipboard()
127
+ const nodeToUse = systemNode ?? clipboard
128
+ if (systemNode && setClipboard) setClipboard(systemNode) // keep React state in sync
129
+ if (!nodeToUse) return
130
+
131
+ builderContext.setSchema(prev => {
132
+ const asChild = CONTAINER_TYPES.has(node.type)
133
+ return { ...prev, root: pasteIntoTree(prev.root, node.id, nodeToUse, asChild) }
134
+ })
135
+ }
136
+
92
137
  // Handle duplicate action
93
138
  const handleDuplicate = e => {
94
139
  e.stopPropagation()
@@ -170,7 +215,7 @@ export default function ViewerComponentWrapper({ node, children, viewerContext }
170
215
  <Box
171
216
  className={node.className}
172
217
  style={elementCss}
173
- draggable={canEdit}
218
+ draggable={canDrag}
174
219
  onDragStart={handleDragStart}
175
220
  onDragEnd={handleDragEnd}
176
221
  onClick={handleClick}
@@ -183,15 +228,17 @@ export default function ViewerComponentWrapper({ node, children, viewerContext }
183
228
  ...elementStyle,
184
229
  // Edit mode styling
185
230
  ...(canEdit && {
186
- cursor: 'grab',
231
+ cursor: canDrag ? 'grab' : 'default',
187
232
  outline: isSelected ? '2px solid #1976d2' : '1px solid transparent',
188
233
  outlineOffset: '2px',
189
234
  '&:hover': {
190
235
  outline: isSelected ? '2px solid #1976d2' : '1px solid #90caf9'
191
236
  },
192
- '&:active': {
193
- cursor: 'grabbing'
194
- }
237
+ ...(canDrag && {
238
+ '&:active': {
239
+ cursor: 'grabbing'
240
+ }
241
+ })
195
242
  }),
196
243
  // Show hidden components with opacity in edit mode
197
244
  ...(isEditMode &&
@@ -217,8 +264,22 @@ export default function ViewerComponentWrapper({ node, children, viewerContext }
217
264
  anchorReference='anchorPosition'
218
265
  anchorPosition={contextMenu ? { top: contextMenu.mouseY, left: contextMenu.mouseX } : undefined}
219
266
  >
220
- <MenuItem onClick={e => { handleDuplicate(e); handleCloseMenu() }} dense>
267
+ <MenuItem onClick={e => { handleCut(e); handleCloseMenu() }} dense>
268
+ <ListItemIcon><ContentCut fontSize='small' /></ListItemIcon>
269
+ <ListItemText>Cut</ListItemText>
270
+ </MenuItem>
271
+ <MenuItem onClick={e => { handleCopy(e); handleCloseMenu() }} dense>
221
272
  <ListItemIcon><ContentCopy fontSize='small' /></ListItemIcon>
273
+ <ListItemText>Copy</ListItemText>
274
+ </MenuItem>
275
+ {clipboard && (
276
+ <MenuItem onClick={e => { handleCloseMenu(); handlePaste(e) }} dense>
277
+ <ListItemIcon><ContentPaste fontSize='small' /></ListItemIcon>
278
+ <ListItemText>Paste</ListItemText>
279
+ </MenuItem>
280
+ )}
281
+ <MenuItem onClick={e => { handleDuplicate(e); handleCloseMenu() }} dense>
282
+ <ListItemIcon><ContentCopy fontSize='small' sx={{ opacity: 0.6 }} /></ListItemIcon>
222
283
  <ListItemText>Duplicate</ListItemText>
223
284
  </MenuItem>
224
285
  <MenuItem onClick={handleSaveClick} dense>
@@ -1,37 +1,210 @@
1
- import { Box, ToggleButton, ToggleButtonGroup, Button } from '@mui/material'
2
- import { ContentSave } from 'mdi-material-ui'
3
- import { useState } from 'react'
1
+ import { Box, ToggleButton, ToggleButtonGroup, IconButton, Tooltip, Dialog, Tabs, Tab, Chip } from '@mui/material'
2
+ import { useState, useCallback, useEffect } from 'react'
3
+ import { DataObjectOutlined, FullscreenExitOutlined, FullscreenOutlined, CloseOutlined, BugReportOutlined, RefreshOutlined, DarkModeOutlined, LightModeOutlined, UndoOutlined, RedoOutlined, HistoryOutlined } from '@mui/icons-material'
4
+ import Editor from '@monaco-editor/react'
4
5
  import SaveViewDialog from './SaveViewDialog'
5
6
  import { useBuilder } from 'src/context/BuilderContext'
6
7
  import PostService from 'src/services/PostService'
7
8
  import { Endpoints } from 'src/services/Endpoints'
8
9
 
9
- export default function ViewerToolbar({ mode, setMode }) {
10
- const { schema } = useBuilder()
11
- const [saveDialogOpen, setSaveDialogOpen] = useState(false)
12
- const [isSaving, setIsSaving] = useState(false)
13
-
14
- const handleSaveClick = () => {
15
- setSaveDialogOpen(true)
10
+ // ── Safe serialise — handles circular refs, undefined, functions ──────────────
11
+ function safeStringify(value) {
12
+ try {
13
+ return JSON.stringify(
14
+ value,
15
+ (_, v) => {
16
+ if (typeof v === 'function') return '[Function]'
17
+ if (typeof v === 'undefined') return null
18
+ return v
19
+ },
20
+ 2
21
+ )
22
+ } catch {
23
+ return '"[Unserializable]"'
16
24
  }
25
+ }
17
26
 
18
- const handleSave = async (title) => {
19
- if (!schema || !schema.root) {
20
- console.error('No schema to save')
21
- return
27
+ const EDITOR_OPTS = {
28
+ readOnly: true,
29
+ minimap: { enabled: false },
30
+ fontFamily: "Menlo, Monaco, 'Courier New', monospace",
31
+ fontSize: 13,
32
+ lineNumbers: 'on',
33
+ wordWrap: 'off',
34
+ scrollBeyondLastLine: false,
35
+ automaticLayout: true,
36
+ }
37
+
38
+ // ── Debug panel tabs ──────────────────────────────────────────────────────────
39
+
40
+ const TABS = [
41
+ { key: 'data', label: 'data' },
42
+ { key: 'form', label: 'form' },
43
+ { key: 'dataRef', label: 'dataRef' },
44
+ { key: 'reportRefs', label: 'reportRefs' },
45
+ ]
46
+
47
+ function DebugPanel({ open, onClose, getState }) {
48
+ const [tab, setTab] = useState(0)
49
+ const [rev, setRev] = useState(0)
50
+ const [fullscreen, setFullscreen] = useState(false)
51
+
52
+ // Esc — exit fullscreen first, then close panel (same pattern as JSEditor)
53
+ useEffect(() => {
54
+ if (!open) return
55
+ const onKey = e => {
56
+ if (e.key !== 'Escape') return
57
+ if (fullscreen) setFullscreen(false)
58
+ else { setFullscreen(false); onClose() }
22
59
  }
60
+ window.addEventListener('keydown', onKey)
61
+ return () => window.removeEventListener('keydown', onKey)
62
+ }, [open, fullscreen, onClose])
23
63
 
24
- setIsSaving(true)
25
- try {
26
- const data = {
27
- title: title,
28
- value: JSON.stringify(schema)
29
- }
64
+ // Call getState() fresh on every render so Refresh (which bumps rev) always
65
+ // picks up the latest values from refs/state without needing the parent to
66
+ // re-render first.
67
+ const { data, form, dataRef, reportRefs } = getState()
68
+
69
+ const snapshots = {
70
+ data,
71
+ form,
72
+ dataRef: dataRef?.current,
73
+ reportRefs: reportRefs?.current
74
+ ? Object.fromEntries(
75
+ Object.entries(reportRefs.current).map(([k, v]) => {
76
+ // DataGrid entry — has setRows/addRow functions and a rows getter.
77
+ // Resolve eagerly so the inspector shows the actual array.
78
+ if (v && typeof v === 'object' && typeof v.setRows === 'function') {
79
+ return [k, { __type: 'DataGrid', storageKey: v.storageKey, rows: v.rows }]
80
+ }
81
+ // ReportViewer entry — v is a React ref { current: updateArray }
82
+ return [k, v?.current ?? v]
83
+ })
84
+ )
85
+ : {},
86
+ }
87
+
88
+ const current = TABS[tab]
89
+ const value = safeStringify(snapshots[current.key] ?? null)
90
+
91
+ const entryCount = (obj) => {
92
+ if (!obj || typeof obj !== 'object') return 0
93
+ return Object.keys(obj).length
94
+ }
95
+
96
+ const panelSx = fullscreen
97
+ ? { position: 'fixed', inset: 0, width: '100%', height: '100%', border: 'none' }
98
+ : { position: 'fixed', bottom: 0, right: 0, width: 480, height: '50vh', borderTop: '1px solid #333', borderLeft: '1px solid #333' }
99
+
100
+ return (
101
+ <Box
102
+ sx={{
103
+ ...panelSx,
104
+ bgcolor: '#1e1e1e',
105
+ zIndex: 1400,
106
+ display: open ? 'flex' : 'none',
107
+ flexDirection: 'column',
108
+ transition: 'width 0.15s ease, height 0.15s ease',
109
+ }}
110
+ >
111
+ {/* Header */}
112
+ <Box sx={{ display: 'flex', alignItems: 'center', bgcolor: '#252526', borderBottom: '1px solid #1a1a1a', px: 1, py: 0.5, gap: 0.5 }}>
113
+ <BugReportOutlined sx={{ fontSize: 14, color: '#e5c07b', mr: 0.5 }} />
114
+ <Box sx={{ color: '#ccc', fontSize: 12, fontFamily: 'monospace', flex: 1 }}>State Inspector</Box>
115
+ <Tooltip title='Refresh snapshot'>
116
+ <IconButton size='small' onClick={() => setRev(r => r + 1)} sx={{ color: '#aaa', '&:hover': { color: '#fff' } }}>
117
+ <RefreshOutlined sx={{ fontSize: 14 }} />
118
+ </IconButton>
119
+ </Tooltip>
120
+ <Tooltip title={fullscreen ? 'Exit fullscreen (Esc)' : 'Fullscreen'}>
121
+ <IconButton size='small' onClick={() => setFullscreen(f => !f)} sx={{ color: '#aaa', '&:hover': { color: '#fff' } }}>
122
+ {fullscreen
123
+ ? <FullscreenExitOutlined sx={{ fontSize: 14 }} />
124
+ : <FullscreenOutlined sx={{ fontSize: 14 }} />}
125
+ </IconButton>
126
+ </Tooltip>
127
+ <Tooltip title='Close'>
128
+ <IconButton size='small' onClick={() => { setFullscreen(false); onClose() }} sx={{ color: '#aaa', '&:hover': { color: '#fff' } }}>
129
+ <CloseOutlined sx={{ fontSize: 14 }} />
130
+ </IconButton>
131
+ </Tooltip>
132
+ </Box>
133
+
134
+ {/* Tabs */}
135
+ <Box sx={{ bgcolor: '#252526', borderBottom: '1px solid #1a1a1a' }}>
136
+ <Tabs
137
+ value={tab}
138
+ onChange={(_, v) => setTab(v)}
139
+ sx={{
140
+ minHeight: 32,
141
+ '.MuiTab-root': { minHeight: 32, py: 0, px: 1.5, fontSize: 11, fontFamily: 'monospace', color: '#666', textTransform: 'none' },
142
+ '.Mui-selected': { color: '#fff !important', fontWeight: 600 },
143
+ '.MuiTabs-indicator': { bgcolor: '#4ec9b0', height: 2 },
144
+ }}
145
+ >
146
+ {TABS.map((t, i) => {
147
+ const count = entryCount(snapshots[t.key])
148
+ return (
149
+ <Tab
150
+ key={t.key}
151
+ label={
152
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>
153
+ {t.label}
154
+ {count > 0 && (
155
+ <Chip
156
+ label={count}
157
+ size='small'
158
+ sx={{ height: 14, fontSize: 9, bgcolor: '#3a3a3a', color: '#888',
159
+ '.MuiChip-label': { px: 0.5 } }}
160
+ />
161
+ )}
162
+ </Box>
163
+ }
164
+ />
165
+ )
166
+ })}
167
+ </Tabs>
168
+ </Box>
30
169
 
31
- const response = await PostService(Endpoints.View.Post.Add, true, data)
170
+ {/* Editor */}
171
+ <Box sx={{ flex: 1, minHeight: 0 }}>
172
+ <Editor
173
+ key={`${tab}-${rev}`}
174
+ height='100%'
175
+ defaultLanguage='json'
176
+ theme='vs-dark'
177
+ value={value}
178
+ options={EDITOR_OPTS}
179
+ />
180
+ </Box>
181
+ </Box>
182
+ )
183
+ }
32
184
 
185
+ // ── Main toolbar ──────────────────────────────────────────────────────────────
186
+
187
+ export default function ViewerToolbar({ mode, setMode, previewStateRef, isDark, onToggleTheme }) {
188
+ const { schema, data, form, dataRef, reportRefs, undo, redo, canUndo, canRedo, markClean, logSchema, openSessionLog, viewMetaData } = useBuilder()
189
+ const [saveDialogOpen, setSaveDialogOpen] = useState(false)
190
+ const [isSaving, setIsSaving] = useState(false)
191
+ const [schemaOpen, setSchemaOpen] = useState(false)
192
+ const [debugOpen, setDebugOpen] = useState(false)
193
+
194
+
195
+ const handleSave = async (title) => {
196
+ if (!schema?.root) { console.error('No schema to save'); return }
197
+ setIsSaving(true)
198
+ try {
199
+ const response = await PostService(Endpoints.View.Post.Add, true, { title, value: JSON.stringify(schema) })
33
200
  if (response) {
34
201
  setSaveDialogOpen(false)
202
+ markClean()
203
+ // Capture this save as a future training example. Prompt is left
204
+ // empty — developers fill it in via the Session Logs dialog.
205
+ try {
206
+ logSchema({ builder: 'ui', trigger: 'save', title, viewMetaData, schema })
207
+ } catch (e) { console.warn('[sessionLog] log on save failed:', e) }
35
208
  }
36
209
  } catch (error) {
37
210
  console.error('Error saving view:', error)
@@ -42,48 +215,104 @@ export default function ViewerToolbar({ mode, setMode }) {
42
215
 
43
216
  return (
44
217
  <>
45
- <Box
46
- sx={{
47
- p: 1,
48
- borderBottom: '1px solid',
49
- borderColor: 'divider',
50
- bgcolor: 'background.paper',
51
- display: 'flex',
52
- alignItems: 'center',
53
- gap: 1
54
- }}
55
- >
56
- <ToggleButtonGroup
57
- value={mode}
58
- exclusive
59
- size="small"
60
- onChange={(e, v) => {
61
- if (!v) return
62
- setMode(v)
63
- }}
64
- >
65
- <ToggleButton value="edit">Edit</ToggleButton>
66
- <ToggleButton value="preview">Preview</ToggleButton>
218
+ <Box sx={{ p: 1, borderBottom: '1px solid', borderColor: 'divider', bgcolor: 'background.paper', display: 'flex', alignItems: 'center', gap: 1 }}>
219
+ <ToggleButtonGroup value={mode} exclusive size='small' onChange={(_, v) => { if (v) setMode(v) }}>
220
+ <ToggleButton value='edit'>Edit</ToggleButton>
221
+ <ToggleButton value='preview'>Preview</ToggleButton>
67
222
  </ToggleButtonGroup>
68
223
 
224
+ {/* Undo / Redo — edit mode only */}
225
+ {mode === 'edit' && (
226
+ <>
227
+ <Tooltip title='Undo (Ctrl+Z)'>
228
+ <span>
229
+ <IconButton size='small' onClick={undo} disabled={!canUndo} sx={{ color: canUndo ? 'text.secondary' : 'action.disabled' }}>
230
+ <UndoOutlined fontSize='small' />
231
+ </IconButton>
232
+ </span>
233
+ </Tooltip>
234
+ <Tooltip title='Redo (Ctrl+Shift+Z)'>
235
+ <span>
236
+ <IconButton size='small' onClick={redo} disabled={!canRedo} sx={{ color: canRedo ? 'text.secondary' : 'action.disabled' }}>
237
+ <RedoOutlined fontSize='small' />
238
+ </IconButton>
239
+ </span>
240
+ </Tooltip>
241
+ </>
242
+ )}
243
+
69
244
  <Box sx={{ flex: 1 }} />
70
245
 
71
- <Button
72
- variant="contained"
73
- size="small"
74
- startIcon={<ContentSave />}
75
- onClick={handleSaveClick}
76
- disabled={isSaving || !schema?.root}
77
- >
78
- {isSaving ? 'Saving...' : 'Save View'}
79
- </Button>
246
+ {/* Theme toggle */}
247
+ {onToggleTheme && (
248
+ <Tooltip title={isDark ? 'Switch to light mode' : 'Switch to dark mode'}>
249
+ <IconButton size='small' onClick={onToggleTheme} sx={{ color: 'text.secondary' }}>
250
+ {isDark ? <LightModeOutlined fontSize='small' /> : <DarkModeOutlined fontSize='small' />}
251
+ </IconButton>
252
+ </Tooltip>
253
+ )}
254
+
255
+ {/* Session Logs */}
256
+ <Tooltip title='Session Logs (training data)'>
257
+ <IconButton size='small' onClick={openSessionLog} sx={{ color: 'text.secondary' }}>
258
+ <HistoryOutlined fontSize='small' />
259
+ </IconButton>
260
+ </Tooltip>
261
+
262
+ {/* State Inspector */}
263
+ <Tooltip title='State Inspector'>
264
+ <IconButton
265
+ size='small'
266
+ onClick={() => setDebugOpen(o => !o)}
267
+ sx={{ color: debugOpen ? 'warning.main' : 'text.secondary' }}
268
+ >
269
+ <BugReportOutlined fontSize='small' />
270
+ </IconButton>
271
+ </Tooltip>
272
+
273
+ {/* Schema Preview — edit mode only */}
274
+ {mode === 'edit' && (
275
+ <Tooltip title='Preview Schema'>
276
+ <IconButton size='small' onClick={() => setSchemaOpen(true)}>
277
+ <DataObjectOutlined fontSize='small' />
278
+ </IconButton>
279
+ </Tooltip>
280
+ )}
80
281
  </Box>
81
282
 
82
- <SaveViewDialog
83
- open={saveDialogOpen}
84
- onClose={() => setSaveDialogOpen(false)}
85
- onSave={handleSave}
283
+ {/* ── State Inspector Panel ── */}
284
+ <DebugPanel
285
+ open={debugOpen}
286
+ onClose={() => setDebugOpen(false)}
287
+ getState={() =>
288
+ mode === 'preview' && previewStateRef
289
+ ? previewStateRef.current
290
+ : { data, form, dataRef, reportRefs }
291
+ }
86
292
  />
293
+
294
+ {/* ── Schema Preview ── */}
295
+ <Dialog open={schemaOpen} onClose={() => setSchemaOpen(false)} fullScreen PaperProps={{ sx: { bgcolor: '#1e1e1e' } }}>
296
+ <Box sx={{ display: 'flex', alignItems: 'center', bgcolor: '#252526', borderBottom: '1px solid #1a1a1a', px: 1.5, py: 0.5, gap: 1 }}>
297
+ <Box sx={{ color: '#ccc', fontSize: 13, fontFamily: 'monospace', flex: 1 }}>schema.json</Box>
298
+ <Tooltip title='Close (Esc)'>
299
+ <IconButton size='small' onClick={() => setSchemaOpen(false)} sx={{ color: '#aaa', '&:hover': { color: '#fff' } }}>
300
+ <FullscreenExitOutlined fontSize='small' />
301
+ </IconButton>
302
+ </Tooltip>
303
+ </Box>
304
+ <Box sx={{ flex: 1, minHeight: 0, height: 'calc(100vh - 40px)' }}>
305
+ <Editor
306
+ height='100%'
307
+ defaultLanguage='json'
308
+ theme='vs-dark'
309
+ value={schema ? JSON.stringify(schema, null, 2) : '{}'}
310
+ options={{ ...EDITOR_OPTS, minimap: { enabled: true } }}
311
+ />
312
+ </Box>
313
+ </Dialog>
314
+
315
+ <SaveViewDialog open={saveDialogOpen} onClose={() => setSaveDialogOpen(false)} onSave={handleSave} />
87
316
  </>
88
317
  )
89
318
  }