robobyte-front-builder 1.0.17 → 1.0.21

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 (516) hide show
  1. package/README.md +211 -0
  2. package/next.config.js +19 -48
  3. package/package.json +39 -85
  4. package/src/context/BuilderContext.jsx +134 -6
  5. package/src/context/SystemContext.js +2 -2
  6. package/src/hooks/useGlobalStore.js +36 -0
  7. package/src/hooks/useTimerEngine.js +54 -0
  8. package/src/lib/index.js +11 -3
  9. package/src/lib/layouts/BlankLayout.jsx +13 -0
  10. package/src/lib/providers/RoboByteFrontBuilderProvider.jsx +59 -1
  11. package/src/lib/themes/builderTheme.js +41 -0
  12. package/src/pages/_app.js +32 -134
  13. package/src/pages/api/ai.js +87 -0
  14. package/src/pages/builders/report/index.js +1 -0
  15. package/src/pages/builders/report/list/index.js +1 -0
  16. package/src/pages/builders/report/viewer/index.js +1 -0
  17. package/src/pages/index.js +88 -37
  18. package/src/pages/printBuilder/index.jsx +263 -0
  19. package/src/pages/printBuilder/layouts/index.jsx +298 -0
  20. package/src/pages/reportModule/reportBuilder/index.js +723 -563
  21. package/src/pages/reportModule/reportBuilder/reportViewer/index.js +137 -71
  22. package/src/pages/reportModule/reportBuilder/reports/index.js +51 -13
  23. package/src/pages/reportModule/reportBuilder/reportsPermissions/index.js +126 -0
  24. package/src/pages/viewBuilder/index.jsx +117 -32
  25. package/src/pages/viewBuilder/views/index.js +3 -3
  26. package/src/pages/viewer/[id]/index.js +2 -1
  27. package/src/services/DeleteService.js +31 -60
  28. package/src/services/Endpoints/PrintLayoutEndpoints.js +42 -0
  29. package/src/services/Endpoints.js +2 -0
  30. package/src/services/GetService.js +33 -54
  31. package/src/services/PatchService.js +38 -65
  32. package/src/services/PostService.js +37 -63
  33. package/src/services/UpdateService.js +39 -65
  34. package/src/services/builderHelper/actionExecutor.js +141 -25
  35. package/src/services/builderHelper/builderHelper.js +92 -0
  36. package/src/services/builderHelper/colorSchema.js +95 -0
  37. package/src/services/builderHelper/iconResolver.js +50 -0
  38. package/src/services/builderHelper/jsExecutor.js +212 -46
  39. package/src/services/builderHelper/nodeFactory.js +32 -15
  40. package/src/services/builderHelper/numberFormat.js +123 -0
  41. package/src/services/builderHelper/resolveProps.js +73 -4
  42. package/src/services/builderHelper/thresholdEngine.js +77 -0
  43. package/src/services/builderHelper/tree.js +31 -0
  44. package/src/services/components/agGridAutoComplete.js +5 -9
  45. package/src/services/config.js +9 -1
  46. package/src/services/globalStore.js +80 -0
  47. package/src/services/helper/multiSelectEditor.js +5 -9
  48. package/src/services/helper/multiSelectEditorByBuilder.js +241 -0
  49. package/src/services/helper/reportSessionHelper.js +83 -0
  50. package/src/services/reportData/fetchReportData.js +69 -28
  51. package/src/services/routerRef.js +35 -0
  52. package/src/views/ConfirmDialog.js +2 -2
  53. package/src/views/builder/JSEditor.js +105 -107
  54. package/src/views/builder/inspector/Inspector.jsx +6 -9
  55. package/src/views/builder/inspector/Tabs/ComponentActionsTab.jsx +7 -13
  56. package/src/views/builder/inspector/Tabs/MainTab.jsx +143 -25
  57. package/src/views/builder/inspector/Tabs/RulesTab.jsx +9 -24
  58. package/src/views/builder/inspector/Tabs/StyleTab.jsx +9 -24
  59. package/src/views/builder/inspector/definitions/autocomplete/main.js +4 -6
  60. package/src/views/builder/inspector/definitions/banner/actions.js +7 -0
  61. package/src/views/builder/inspector/definitions/banner/main.js +22 -0
  62. package/src/views/builder/inspector/definitions/banner/rules.js +1 -0
  63. package/src/views/builder/inspector/definitions/banner/style.js +1 -0
  64. package/src/views/builder/inspector/definitions/breadcrumb/main.js +43 -6
  65. package/src/views/builder/inspector/definitions/button/main.js +11 -12
  66. package/src/views/builder/inspector/definitions/button/style.js +18 -30
  67. package/src/views/builder/inspector/definitions/checkbox/actions.js +3 -1
  68. package/src/views/builder/inspector/definitions/checkbox/main.js +4 -6
  69. package/src/views/builder/inspector/definitions/common/main.js +13 -2
  70. package/src/views/builder/inspector/definitions/dataGrid/main.js +23 -0
  71. package/src/views/builder/inspector/definitions/dataTableViewer/main.js +46 -0
  72. package/src/views/builder/inspector/definitions/datepicker/actions.js +3 -1
  73. package/src/views/builder/inspector/definitions/datepicker/main.js +6 -14
  74. package/src/views/builder/inspector/definitions/dialog/main.js +36 -0
  75. package/src/views/builder/inspector/definitions/dropdown/main.js +5 -8
  76. package/src/views/builder/inspector/definitions/excelUpload/actions.js +23 -0
  77. package/src/views/builder/inspector/definitions/excelUpload/main.js +17 -0
  78. package/src/views/builder/inspector/definitions/excelUpload/rules.js +1 -0
  79. package/src/views/builder/inspector/definitions/excelUpload/style.js +45 -0
  80. package/src/views/builder/inspector/definitions/header/main.js +10 -1
  81. package/src/views/builder/inspector/definitions/index.js +106 -19
  82. package/src/views/builder/inspector/definitions/input/actions.js +4 -1
  83. package/src/views/builder/inspector/definitions/input/main.js +20 -11
  84. package/src/views/builder/inspector/definitions/kpi/avatarGroup.js +22 -0
  85. package/src/views/builder/inspector/definitions/kpi/badge.js +17 -0
  86. package/src/views/builder/inspector/definitions/kpi/bulletChart.js +47 -0
  87. package/src/views/builder/inspector/definitions/kpi/chart.js +55 -0
  88. package/src/views/builder/inspector/definitions/kpi/colorScale.js +60 -0
  89. package/src/views/builder/inspector/definitions/kpi/comparisonBars.js +41 -0
  90. package/src/views/builder/inspector/definitions/kpi/countdown.js +46 -0
  91. package/src/views/builder/inspector/definitions/kpi/donut.js +51 -0
  92. package/src/views/builder/inspector/definitions/kpi/funnel.js +25 -0
  93. package/src/views/builder/inspector/definitions/kpi/gauge.js +39 -0
  94. package/src/views/builder/inspector/definitions/kpi/heatmapGrid.js +96 -0
  95. package/src/views/builder/inspector/definitions/kpi/iconBox.js +20 -0
  96. package/src/views/builder/inspector/definitions/kpi/metric.js +45 -0
  97. package/src/views/builder/inspector/definitions/kpi/rating.js +27 -0
  98. package/src/views/builder/inspector/definitions/kpi/statusDot.js +18 -0
  99. package/src/views/builder/inspector/definitions/kpi/stepStage.js +65 -0
  100. package/src/views/builder/inspector/definitions/kpi/tagList.js +32 -0
  101. package/src/views/builder/inspector/definitions/kpi/timeline.js +80 -0
  102. package/src/views/builder/inspector/definitions/kpi/trend.js +20 -0
  103. package/src/views/builder/inspector/definitions/label/main.js +10 -1
  104. package/src/views/builder/inspector/definitions/layout/main.js +27 -3
  105. package/src/views/builder/inspector/definitions/number/main.js +6 -14
  106. package/src/views/builder/inspector/definitions/pageNumber/main.js +21 -0
  107. package/src/views/builder/inspector/definitions/popover/main.js +71 -0
  108. package/src/views/builder/inspector/definitions/radio/main.js +5 -8
  109. package/src/views/builder/inspector/definitions/repeater/main.js +31 -0
  110. package/src/views/builder/inspector/definitions/reportViewer/main.js +15 -1
  111. package/src/views/builder/inspector/definitions/richtext/main.js +5 -8
  112. package/src/views/builder/inspector/definitions/signature/main.js +4 -1
  113. package/src/views/builder/inspector/definitions/tag/main.js +5 -8
  114. package/src/views/builder/inspector/definitions/textarea/actions.js +4 -1
  115. package/src/views/builder/inspector/definitions/textarea/main.js +5 -7
  116. package/src/views/builder/inspector/definitions/time/main.js +5 -8
  117. package/src/views/builder/inspector/definitions/toggle/main.js +5 -19
  118. package/src/views/builder/inspector/definitions/treeView/main.js +61 -0
  119. package/src/views/builder/inspector/definitions/viewRenderer/main.js +53 -0
  120. package/src/views/builder/inspector/definitions/wizard/main.js +68 -0
  121. package/src/views/builder/inspector/definitions/wizard-step/main.js +25 -0
  122. package/src/views/builder/inspector/fields/ActionsConfigEditor.jsx +426 -0
  123. package/src/views/builder/inspector/fields/ColorSchemaField.jsx +140 -0
  124. package/src/views/builder/inspector/fields/ColumnFunctionEditor.jsx +238 -0
  125. package/src/views/builder/inspector/fields/ColumnMappingEditor.jsx +105 -0
  126. package/src/views/builder/inspector/fields/ColumnsConfigEditor.jsx +506 -0
  127. package/src/views/builder/inspector/fields/DonutRingsEditorField.jsx +337 -0
  128. package/src/views/builder/inspector/fields/ExtraColsEditor.jsx +618 -0
  129. package/src/views/builder/inspector/fields/FunctionHelpPopover.jsx +295 -0
  130. package/src/views/builder/inspector/fields/IconEditor.jsx +64 -0
  131. package/src/views/builder/inspector/fields/KpiActionField.jsx +223 -0
  132. package/src/views/builder/inspector/fields/MarkersEditorField.jsx +173 -0
  133. package/src/views/builder/inspector/fields/SelectEditor.jsx +9 -5
  134. package/src/views/builder/inspector/fields/SeriesEditorField.jsx +363 -0
  135. package/src/views/builder/inspector/fields/TableColumnsEditor.jsx +104 -0
  136. package/src/views/builder/inspector/fields/ThresholdsEditor.jsx +247 -0
  137. package/src/views/builder/inspector/fields/ValueFunctionsRefPanel.jsx +217 -0
  138. package/src/views/builder/inspector/fields/columnEditorShared.jsx +217 -0
  139. package/src/views/builder/sidebar/Sidebar.jsx +4 -2
  140. package/src/views/builder/sidebar/SidebarTabs.jsx +28 -17
  141. package/src/views/builder/sidebar/tabs/ActionsTab.jsx +7 -3
  142. package/src/views/builder/sidebar/tabs/AiTab/AiPreviewDialog.jsx +193 -0
  143. package/src/views/builder/sidebar/tabs/AiTab/aiProvider.js +49 -0
  144. package/src/views/builder/sidebar/tabs/AiTab/index.jsx +409 -0
  145. package/src/views/builder/sidebar/tabs/AiTab/schemaTransformer.js +102 -0
  146. package/src/views/builder/sidebar/tabs/AiTab/schemaValidator.js +64 -0
  147. package/src/views/builder/sidebar/tabs/AiTab/systemPrompt.js +1151 -0
  148. package/src/views/builder/sidebar/tabs/Components/ComponentsTab.jsx +31 -31
  149. package/src/views/builder/sidebar/tabs/Components/componentCatalog.js +43 -21
  150. package/src/views/builder/sidebar/tabs/Components/printComponentCatalog.js +81 -0
  151. package/src/views/builder/sidebar/tabs/TimersTab.jsx +338 -0
  152. package/src/views/builder/sidebar/tabs/TreeTab.jsx +13 -4
  153. package/src/views/builder/sidebar/tabs/ViewTab.jsx +1 -1
  154. package/src/views/builder/viewer/AdornedLabel.jsx +82 -0
  155. package/src/views/builder/viewer/ComponentRenderer.jsx +98 -24
  156. package/src/views/builder/viewer/DialogsZone.jsx +259 -0
  157. package/src/views/builder/viewer/FieldLabel.jsx +106 -0
  158. package/src/views/builder/viewer/PrintDialog.jsx +481 -0
  159. package/src/views/builder/viewer/ProductionViewer.jsx +80 -5
  160. package/src/views/builder/viewer/Viewer.jsx +106 -8
  161. package/src/views/builder/viewer/ViewerComponentWrapper.jsx +61 -4
  162. package/src/views/builder/viewer/ViewerToolbar.jsx +273 -59
  163. package/src/views/builder/viewer/renderers/AutoCompleteRenderer.jsx +26 -22
  164. package/src/views/builder/viewer/renderers/AvatarGroupRenderer.jsx +112 -0
  165. package/src/views/builder/viewer/renderers/BadgeRenderer.jsx +79 -0
  166. package/src/views/builder/viewer/renderers/BannerRenderer.jsx +62 -0
  167. package/src/views/builder/viewer/renderers/BreadcrumbRenderer.jsx +203 -15
  168. package/src/views/builder/viewer/renderers/BulletChartRenderer.jsx +147 -0
  169. package/src/views/builder/viewer/renderers/ButtonRenderer.jsx +98 -39
  170. package/src/views/builder/viewer/renderers/CardRenderer.jsx +1 -1
  171. package/src/views/builder/viewer/renderers/ChartRenderer.jsx +388 -0
  172. package/src/views/builder/viewer/renderers/CheckboxRenderer.jsx +17 -9
  173. package/src/views/builder/viewer/renderers/ColorScaleRenderer.jsx +300 -0
  174. package/src/views/builder/viewer/renderers/ComparisonBarsRenderer.jsx +133 -0
  175. package/src/views/builder/viewer/renderers/ContainerRenderer.jsx +3 -1
  176. package/src/views/builder/viewer/renderers/CountdownRenderer.jsx +249 -0
  177. package/src/views/builder/viewer/renderers/DataGridRenderer.jsx +380 -0
  178. package/src/views/builder/viewer/renderers/DataTableViewerRenderer.jsx +240 -0
  179. package/src/views/builder/viewer/renderers/DatePickerRenderer.jsx +25 -24
  180. package/src/views/builder/viewer/renderers/DialogRenderer.jsx +327 -0
  181. package/src/views/builder/viewer/renderers/DividerRenderer.jsx +1 -1
  182. package/src/views/builder/viewer/renderers/DonutRenderer.jsx +294 -0
  183. package/src/views/builder/viewer/renderers/DropdownRenderer.jsx +36 -44
  184. package/src/views/builder/viewer/renderers/ExcelUploadRenderer.jsx +639 -0
  185. package/src/views/builder/viewer/renderers/FunnelRenderer.jsx +93 -0
  186. package/src/views/builder/viewer/renderers/GaugeRenderer.jsx +159 -0
  187. package/src/views/builder/viewer/renderers/HeaderRenderer.jsx +31 -9
  188. package/src/views/builder/viewer/renderers/HeatmapGridRenderer.jsx +432 -0
  189. package/src/views/builder/viewer/renderers/IconBoxRenderer.jsx +59 -0
  190. package/src/views/builder/viewer/renderers/ImageRenderer.jsx +1 -1
  191. package/src/views/builder/viewer/renderers/InputRenderer.jsx +75 -18
  192. package/src/views/builder/viewer/renderers/LabelRenderer.jsx +35 -9
  193. package/src/views/builder/viewer/renderers/LayoutCellRenderer.jsx +102 -40
  194. package/src/views/builder/viewer/renderers/LayoutContextMenu.jsx +8 -8
  195. package/src/views/builder/viewer/renderers/LayoutRenderer.jsx +48 -6
  196. package/src/views/builder/viewer/renderers/LinkRenderer.jsx +1 -1
  197. package/src/views/builder/viewer/renderers/MenuRenderer.jsx +2 -2
  198. package/src/views/builder/viewer/renderers/MetricRenderer.jsx +80 -0
  199. package/src/views/builder/viewer/renderers/NumberFormatRenderer.jsx +21 -30
  200. package/src/views/builder/viewer/renderers/PageNumberRenderer.jsx +76 -0
  201. package/src/views/builder/viewer/renderers/PopoverRenderer.jsx +350 -0
  202. package/src/views/builder/viewer/renderers/ProgressCircleRenderer.jsx +1 -1
  203. package/src/views/builder/viewer/renderers/ProgressLineRenderer.jsx +1 -1
  204. package/src/views/builder/viewer/renderers/RadioGroupRenderer.jsx +28 -39
  205. package/src/views/builder/viewer/renderers/RatingRenderer.jsx +80 -0
  206. package/src/views/builder/viewer/renderers/RepeaterRenderer.jsx +297 -38
  207. package/src/views/builder/viewer/renderers/ReportViewerRenderer.jsx +219 -5
  208. package/src/views/builder/viewer/renderers/RichTextRenderer.jsx +60 -66
  209. package/src/views/builder/viewer/renderers/RowActionsCell.jsx +308 -0
  210. package/src/views/builder/viewer/renderers/SignatureRenderer.jsx +33 -62
  211. package/src/views/builder/viewer/renderers/StatusDotRenderer.jsx +75 -0
  212. package/src/views/builder/viewer/renderers/StepStageRenderer.jsx +348 -0
  213. package/src/views/builder/viewer/renderers/TagListRenderer.jsx +115 -0
  214. package/src/views/builder/viewer/renderers/TagPickerRenderer.jsx +31 -45
  215. package/src/views/builder/viewer/renderers/TextAreaRenderer.jsx +25 -18
  216. package/src/views/builder/viewer/renderers/TextRenderer.jsx +7 -1
  217. package/src/views/builder/viewer/renderers/TimePickerRenderer.jsx +25 -24
  218. package/src/views/builder/viewer/renderers/TimelineRenderer.jsx +525 -0
  219. package/src/views/builder/viewer/renderers/ToggleRenderer.jsx +21 -27
  220. package/src/views/builder/viewer/renderers/TreeViewRenderer.jsx +832 -0
  221. package/src/views/builder/viewer/renderers/TrendRenderer.jsx +66 -0
  222. package/src/views/builder/viewer/renderers/ViewRendererRenderer.jsx +315 -0
  223. package/src/views/builder/viewer/renderers/WizardRenderer.jsx +380 -64
  224. package/src/views/builder/viewer/renderers/WizardStepRenderer.jsx +21 -12
  225. package/src/views/builder/viewer/renderers/dataGridComponents.jsx +824 -0
  226. package/src/views/customFilter/CustomFilterDialog.js +1023 -660
  227. package/src/views/customFilter/FixedFilterDialog.js +649 -0
  228. package/src/views/customFilter/SearchFilterDialog.js +248 -0
  229. package/src/views/genericTable/BuilderExpressionParams.js +3 -3
  230. package/src/views/genericTable/ColumnConfiguratorDialog.js +771 -0
  231. package/src/views/genericTable/FixedFilterDialog.js +3 -2
  232. package/src/views/genericTable/FormattingSettingsDialog.js +551 -0
  233. package/src/views/genericTable/ReportSettingsDialog.js +151 -0
  234. package/src/views/genericTable/SGrid.js +1061 -247
  235. package/src/views/genericTable/SearchFilterDialog.js +3 -2
  236. package/src/views/genericTable/TAGGrid.js +83 -69
  237. package/src/views/genericTable/cellEditors/autocompleteEditor.js +5 -9
  238. package/src/views/genericTable/convertStringFunctions.js +336 -0
  239. package/src/views/genericTable/statusBar/rowCountStatusBar.js +3 -1
  240. package/src/views/genericTable/updateRefHelpers.js +424 -0
  241. package/src/views/printBuilder/PrintBuilderViewer.jsx +607 -0
  242. package/src/views/printBuilder/PrintPreviewCanvas.jsx +157 -0
  243. package/src/views/rolePermissions/UpdateReportPermissionDialog.js +316 -0
  244. package/src/@core/components/auth/AclGuard.js +0 -55
  245. package/src/@core/components/auth/AuthGuard.js +0 -40
  246. package/src/@core/components/auth/GuestGuard.js +0 -30
  247. package/src/@core/components/custom-inputs/Horizontal.jsx +0 -143
  248. package/src/@core/components/custom-inputs/Image.jsx +0 -78
  249. package/src/@core/components/custom-inputs/Vertical.jsx +0 -113
  250. package/src/@core/components/customizer/index.jsx +0 -470
  251. package/src/@core/components/customizer/styles.module.css +0 -169
  252. package/src/@core/components/mui/Avatar.jsx +0 -41
  253. package/src/@core/components/mui/Badge.jsx +0 -20
  254. package/src/@core/components/mui/IconButton.jsx +0 -74
  255. package/src/@core/components/mui/TabList.jsx +0 -60
  256. package/src/@core/components/option-menu/index.jsx +0 -137
  257. package/src/@core/components/scroll-to-top/index.jsx +0 -43
  258. package/src/@core/components/spinner/index.js +0 -26
  259. package/src/@core/components/window-wrapper/index.js +0 -27
  260. package/src/@core/contexts/settingsContext.jsx +0 -98
  261. package/src/@core/hooks/useBgColor.js +0 -63
  262. package/src/@core/hooks/useImageVariant.js +0 -27
  263. package/src/@core/hooks/useLayoutInit.js +0 -37
  264. package/src/@core/hooks/useObjectCookie.js +0 -18
  265. package/src/@core/hooks/useSettings.jsx +0 -15
  266. package/src/@core/layouts/BlankLayout.js +0 -37
  267. package/src/@core/layouts/BlankLayoutWithAppBar.js +0 -51
  268. package/src/@core/layouts/HorizontalLayout.jsx +0 -151
  269. package/src/@core/layouts/Layout.js +0 -39
  270. package/src/@core/layouts/VerticalLayout.jsx +0 -124
  271. package/src/@core/layouts/components/blank-layout-with-appBar/index.js +0 -115
  272. package/src/@core/layouts/components/horizontal/app-bar-content/index.js +0 -67
  273. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavGroup.js +0 -352
  274. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavItems.js +0 -21
  275. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavLink.js +0 -195
  276. package/src/@core/layouts/components/horizontal/navigation/index.js +0 -31
  277. package/src/@core/layouts/components/shared-components/LanguageDropdown.js +0 -96
  278. package/src/@core/layouts/components/shared-components/ModeToggler.js +0 -32
  279. package/src/@core/layouts/components/shared-components/NotificationDropdown.js +0 -226
  280. package/src/@core/layouts/components/shared-components/UserDropdown.js +0 -177
  281. package/src/@core/layouts/components/shared-components/footer/FooterContent.js +0 -46
  282. package/src/@core/layouts/components/shared-components/footer/index.js +0 -61
  283. package/src/@core/layouts/components/vertical/appBar/index.js +0 -74
  284. package/src/@core/layouts/components/vertical/navigation/Drawer.js +0 -122
  285. package/src/@core/layouts/components/vertical/navigation/VerticalNavGroup.js +0 -435
  286. package/src/@core/layouts/components/vertical/navigation/VerticalNavHeader.js +0 -180
  287. package/src/@core/layouts/components/vertical/navigation/VerticalNavItems.js +0 -26
  288. package/src/@core/layouts/components/vertical/navigation/VerticalNavLink.js +0 -258
  289. package/src/@core/layouts/components/vertical/navigation/VerticalNavSectionTitle.js +0 -102
  290. package/src/@core/layouts/components/vertical/navigation/index.js +0 -169
  291. package/src/@core/layouts/utils.js +0 -69
  292. package/src/@core/styles/Table.module.css +0 -93
  293. package/src/@core/styles/horizontal/menuItemStyles.js +0 -100
  294. package/src/@core/styles/horizontal/menuRootStyles.js +0 -19
  295. package/src/@core/styles/libs/fullcalendar/index.js +0 -461
  296. package/src/@core/styles/libs/keen-slider/index.js +0 -111
  297. package/src/@core/styles/libs/react-apexcharts/index.js +0 -107
  298. package/src/@core/styles/libs/react-cleave/index.js +0 -33
  299. package/src/@core/styles/libs/react-credit-cards/index.js +0 -11
  300. package/src/@core/styles/libs/react-datepicker/index.js +0 -388
  301. package/src/@core/styles/libs/react-draft-wysiwyg/index.js +0 -144
  302. package/src/@core/styles/libs/react-dropzone/index.js +0 -76
  303. package/src/@core/styles/libs/react-hot-toast/index.js +0 -37
  304. package/src/@core/styles/libs/recharts/index.js +0 -47
  305. package/src/@core/styles/stepper.js +0 -103
  306. package/src/@core/styles/vertical/menuItemStyles.js +0 -138
  307. package/src/@core/styles/vertical/menuSectionStyles.js +0 -54
  308. package/src/@core/styles/vertical/navigationCustomStyles.js +0 -62
  309. package/src/@core/svg/ContentCompact.jsx +0 -17
  310. package/src/@core/svg/ContentWide.jsx +0 -17
  311. package/src/@core/svg/DirectionLtr.jsx +0 -93
  312. package/src/@core/svg/DirectionRtl.jsx +0 -93
  313. package/src/@core/svg/LayoutCollapsed.jsx +0 -59
  314. package/src/@core/svg/LayoutHorizontal.jsx +0 -42
  315. package/src/@core/svg/LayoutVertical.jsx +0 -59
  316. package/src/@core/svg/Logo.jsx +0 -76
  317. package/src/@core/svg/SkinBordered.jsx +0 -54
  318. package/src/@core/svg/SkinDefault.jsx +0 -59
  319. package/src/@core/tailwind/plugin.js +0 -78
  320. package/src/@core/theme/ThemeComponent.js +0 -63
  321. package/src/@core/theme/ThemeOptions.js +0 -71
  322. package/src/@core/theme/breakpoints/index.js +0 -11
  323. package/src/@core/theme/colorSchemes.js +0 -326
  324. package/src/@core/theme/customShadows.js +0 -11
  325. package/src/@core/theme/globalStyles.js +0 -81
  326. package/src/@core/theme/index.js +0 -42
  327. package/src/@core/theme/overrides/accordion.js +0 -51
  328. package/src/@core/theme/overrides/accordion.jsx +0 -85
  329. package/src/@core/theme/overrides/alerts.js +0 -110
  330. package/src/@core/theme/overrides/alerts.jsx +0 -180
  331. package/src/@core/theme/overrides/autocomplete.js +0 -14
  332. package/src/@core/theme/overrides/autocomplete.jsx +0 -68
  333. package/src/@core/theme/overrides/avatar.js +0 -38
  334. package/src/@core/theme/overrides/avatars.js +0 -27
  335. package/src/@core/theme/overrides/backdrop.js +0 -22
  336. package/src/@core/theme/overrides/badges.js +0 -16
  337. package/src/@core/theme/overrides/breadcrumbs.js +0 -11
  338. package/src/@core/theme/overrides/button-group.js +0 -84
  339. package/src/@core/theme/overrides/button.js +0 -93
  340. package/src/@core/theme/overrides/buttonGroup.js +0 -9
  341. package/src/@core/theme/overrides/card.js +0 -83
  342. package/src/@core/theme/overrides/checkbox.jsx +0 -95
  343. package/src/@core/theme/overrides/chip.js +0 -72
  344. package/src/@core/theme/overrides/dataGrid.js +0 -114
  345. package/src/@core/theme/overrides/dateTimePicker.js +0 -65
  346. package/src/@core/theme/overrides/dialog.js +0 -120
  347. package/src/@core/theme/overrides/divider.js +0 -13
  348. package/src/@core/theme/overrides/drawer.js +0 -20
  349. package/src/@core/theme/overrides/fab.js +0 -13
  350. package/src/@core/theme/overrides/form-control-label.js +0 -19
  351. package/src/@core/theme/overrides/icon-button.js +0 -145
  352. package/src/@core/theme/overrides/index.js +0 -103
  353. package/src/@core/theme/overrides/input.js +0 -72
  354. package/src/@core/theme/overrides/link.js +0 -9
  355. package/src/@core/theme/overrides/list.js +0 -44
  356. package/src/@core/theme/overrides/menu.js +0 -25
  357. package/src/@core/theme/overrides/pagination.js +0 -41
  358. package/src/@core/theme/overrides/paper.js +0 -9
  359. package/src/@core/theme/overrides/popover.js +0 -16
  360. package/src/@core/theme/overrides/progress.js +0 -38
  361. package/src/@core/theme/overrides/radio.jsx +0 -80
  362. package/src/@core/theme/overrides/rating.js +0 -16
  363. package/src/@core/theme/overrides/rating.jsx +0 -32
  364. package/src/@core/theme/overrides/select.js +0 -19
  365. package/src/@core/theme/overrides/select.jsx +0 -52
  366. package/src/@core/theme/overrides/slider.js +0 -97
  367. package/src/@core/theme/overrides/snackbar.js +0 -19
  368. package/src/@core/theme/overrides/switch.js +0 -73
  369. package/src/@core/theme/overrides/switches.js +0 -25
  370. package/src/@core/theme/overrides/table-pagination.js +0 -39
  371. package/src/@core/theme/overrides/table.js +0 -81
  372. package/src/@core/theme/overrides/tabs.js +0 -30
  373. package/src/@core/theme/overrides/timeline.js +0 -80
  374. package/src/@core/theme/overrides/toggle-button.js +0 -33
  375. package/src/@core/theme/overrides/toggleButton.js +0 -16
  376. package/src/@core/theme/overrides/tooltip.js +0 -21
  377. package/src/@core/theme/overrides/typography.js +0 -13
  378. package/src/@core/theme/palette/index.js +0 -107
  379. package/src/@core/theme/shadows/index.js +0 -61
  380. package/src/@core/theme/shadows.js +0 -12
  381. package/src/@core/theme/spacing/index.js +0 -3
  382. package/src/@core/theme/spacing.js +0 -5
  383. package/src/@core/theme/typography/index.js +0 -65
  384. package/src/@core/theme/typography.js +0 -84
  385. package/src/@core/utils/create-emotion-cache.js +0 -5
  386. package/src/@core/utils/hex-to-rgba.js +0 -11
  387. package/src/@core/utils/serverHelpers.js +0 -45
  388. package/src/@menu/components/RouterLink.jsx +0 -18
  389. package/src/@menu/components/horizontal-menu/HorizontalNav.jsx +0 -88
  390. package/src/@menu/components/horizontal-menu/Menu.jsx +0 -83
  391. package/src/@menu/components/horizontal-menu/MenuButton.jsx +0 -100
  392. package/src/@menu/components/horizontal-menu/MenuItem.jsx +0 -183
  393. package/src/@menu/components/horizontal-menu/SubMenu.jsx +0 -418
  394. package/src/@menu/components/horizontal-menu/SubMenuContent.jsx +0 -41
  395. package/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.jsx +0 -20
  396. package/src/@menu/components/vertical-menu/Menu.jsx +0 -161
  397. package/src/@menu/components/vertical-menu/MenuButton.jsx +0 -95
  398. package/src/@menu/components/vertical-menu/MenuItem.jsx +0 -180
  399. package/src/@menu/components/vertical-menu/MenuSection.jsx +0 -124
  400. package/src/@menu/components/vertical-menu/NavCollapseIcons.jsx +0 -70
  401. package/src/@menu/components/vertical-menu/NavHeader.jsx +0 -39
  402. package/src/@menu/components/vertical-menu/SubMenu.jsx +0 -420
  403. package/src/@menu/components/vertical-menu/SubMenuContent.jsx +0 -101
  404. package/src/@menu/components/vertical-menu/VerticalNav.jsx +0 -216
  405. package/src/@menu/contexts/horizontalNavContext.jsx +0 -29
  406. package/src/@menu/contexts/verticalNavContext.jsx +0 -65
  407. package/src/@menu/defaultConfigs.js +0 -12
  408. package/src/@menu/hooks/useHorizontalMenu.jsx +0 -19
  409. package/src/@menu/hooks/useHorizontalNav.jsx +0 -19
  410. package/src/@menu/hooks/useMediaQuery.jsx +0 -29
  411. package/src/@menu/hooks/useVerticalMenu.jsx +0 -19
  412. package/src/@menu/hooks/useVerticalNav.jsx +0 -19
  413. package/src/@menu/horizontal-menu/index.jsx +0 -8
  414. package/src/@menu/styles/StyledBackdrop.jsx +0 -15
  415. package/src/@menu/styles/StyledMenuIcon.jsx +0 -12
  416. package/src/@menu/styles/StyledMenuLabel.jsx +0 -16
  417. package/src/@menu/styles/StyledMenuPrefix.jsx +0 -10
  418. package/src/@menu/styles/StyledMenuSectionLabel.jsx +0 -21
  419. package/src/@menu/styles/StyledMenuSuffix.jsx +0 -10
  420. package/src/@menu/styles/StyledSubMenuContent.jsx +0 -43
  421. package/src/@menu/styles/horizontal/StyledHorizontalMenu.jsx +0 -13
  422. package/src/@menu/styles/horizontal/StyledHorizontalMenuItem.jsx +0 -26
  423. package/src/@menu/styles/horizontal/StyledHorizontalNav.jsx +0 -11
  424. package/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.jsx +0 -33
  425. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.jsx +0 -18
  426. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.jsx +0 -10
  427. package/src/@menu/styles/horizontal/horizontalUl.module.css +0 -15
  428. package/src/@menu/styles/styles.module.css +0 -5
  429. package/src/@menu/styles/vertical/StyledVerticalMenu.jsx +0 -16
  430. package/src/@menu/styles/vertical/StyledVerticalMenuItem.jsx +0 -28
  431. package/src/@menu/styles/vertical/StyledVerticalMenuSection.jsx +0 -23
  432. package/src/@menu/styles/vertical/StyledVerticalNav.jsx +0 -67
  433. package/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.jsx +0 -15
  434. package/src/@menu/styles/vertical/StyledVerticalNavContainer.jsx +0 -23
  435. package/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.jsx +0 -25
  436. package/src/@menu/styles/vertical/verticalNavBgImage.module.css +0 -10
  437. package/src/@menu/svg/ChevronRight.jsx +0 -9
  438. package/src/@menu/svg/Close.jsx +0 -12
  439. package/src/@menu/svg/RadioCircle.jsx +0 -12
  440. package/src/@menu/svg/RadioCircleMarked.jsx +0 -13
  441. package/src/@menu/utils/menuClasses.js +0 -44
  442. package/src/@menu/utils/menuUtils.jsx +0 -145
  443. package/src/@menu/vertical-menu/index.jsx +0 -11
  444. package/src/configs/acl.js +0 -115
  445. package/src/configs/auth.js +0 -5
  446. package/src/configs/aws-exports.js +0 -30
  447. package/src/configs/firebase.js +0 -25
  448. package/src/configs/i18n.js +0 -34
  449. package/src/configs/primaryColorConfig.js +0 -35
  450. package/src/configs/themeConfig.js +0 -44
  451. package/src/layouts/UserLayout.js +0 -94
  452. package/src/layouts/UserThemeOptions.js +0 -191
  453. package/src/layouts/components/Direction.js +0 -30
  454. package/src/layouts/components/HtmlTooltip.js +0 -15
  455. package/src/layouts/components/Translations.js +0 -11
  456. package/src/layouts/components/UserDropdown.js +0 -217
  457. package/src/layouts/components/UserIcon.js +0 -40
  458. package/src/layouts/components/acl/Can.js +0 -6
  459. package/src/layouts/components/acl/CanViewNavGroup.js +0 -36
  460. package/src/layouts/components/acl/CanViewNavLink.js +0 -17
  461. package/src/layouts/components/acl/CanViewNavSectionTitle.js +0 -17
  462. package/src/layouts/components/horizontal/AppBarContent.js +0 -39
  463. package/src/layouts/components/horizontal/ServerSideNavItems.js +0 -44
  464. package/src/layouts/components/mui/StepperComps.js +0 -55
  465. package/src/layouts/components/vertical/AppBarContent.js +0 -35
  466. package/src/layouts/components/vertical/ServerSideNavItems.js +0 -44
  467. package/src/libs/ApexCharts.jsx +0 -5
  468. package/src/libs/ReactPlayer.jsx +0 -5
  469. package/src/libs/Recharts.jsx +0 -4
  470. package/src/libs/auth.js +0 -124
  471. package/src/libs/styles/AppFullCalendar.js +0 -505
  472. package/src/libs/styles/AppKeenSlider.js +0 -116
  473. package/src/libs/styles/AppReactApexCharts.jsx +0 -110
  474. package/src/libs/styles/AppReactDatepicker.jsx +0 -470
  475. package/src/libs/styles/AppReactDropzone.js +0 -76
  476. package/src/libs/styles/AppReactToastify.jsx +0 -108
  477. package/src/libs/styles/AppRecharts.js +0 -55
  478. package/src/libs/styles/inputOtp.module.css +0 -39
  479. package/src/libs/styles/tiptapEditor.css +0 -72
  480. package/src/navigation/horizontal/index.js +0 -246
  481. package/src/navigation/vertical/index.js +0 -253
  482. package/src/pages/401.js +0 -70
  483. package/src/pages/404.js +0 -67
  484. package/src/pages/500.js +0 -68
  485. package/src/pages/[slug].js +0 -115
  486. package/src/pages/_document.js +0 -72
  487. package/src/pages/api/navigation/regenerate-registry.js +0 -116
  488. package/src/pages/api/navigation/save.js +0 -218
  489. package/src/pages/authModule/acl/index.js +0 -48
  490. package/src/pages/authModule/forgot-password/index.js +0 -228
  491. package/src/pages/authModule/permissions/rolePermissions/[id]/rolePermissionsUser/index.js +0 -392
  492. package/src/pages/authModule/permissions/rolePermissions/index.js +0 -343
  493. package/src/pages/authModule/permissions/systemPermissions/index.js +0 -354
  494. package/src/pages/authModule/privacy/index.js +0 -721
  495. package/src/pages/authModule/users/index.js +0 -210
  496. package/src/pages/login/index.js +0 -328
  497. package/src/pages/mainHome/index.js +0 -181
  498. package/src/views/builder/inspector/definitions/cell/main.js +0 -4
  499. package/src/views/builder/inspector/definitions/column/main.js +0 -9
  500. package/src/views/builder/inspector/definitions/column-group/main.js +0 -18
  501. package/src/views/builder/inspector/definitions/header-cell/main.js +0 -5
  502. package/src/views/builder/inspector/definitions/table/main.js +0 -9
  503. package/src/views/builder/viewer/renderers/CellRenderer.jsx +0 -71
  504. package/src/views/builder/viewer/renderers/ColumnGroupRenderer.jsx +0 -96
  505. package/src/views/builder/viewer/renderers/ColumnRenderer.jsx +0 -71
  506. package/src/views/builder/viewer/renderers/HeaderCellRenderer.jsx +0 -78
  507. package/src/views/builder/viewer/renderers/TabRenderer.jsx +0 -82
  508. package/src/views/builder/viewer/renderers/TableRenderer.jsx +0 -92
  509. package/src/views/pages/auth/FooterIllustrationsV2.js +0 -40
  510. package/src/views/pages/misc/FooterIllustrations.js +0 -47
  511. package/src/views/pages/misc/muiTable/CustomPagination.js +0 -34
  512. package/src/views/pages/users/UserManageDialog.js +0 -283
  513. package/src/views/pages/users/UserViewPage.js +0 -199
  514. package/src/views/users/AddUserNameDialog.js +0 -162
  515. package/src/views/users/ContactManage.js +0 -449
  516. 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
@@ -89,6 +90,48 @@ export default function ViewerComponentWrapper({ node, children, viewerContext }
89
90
  }
90
91
  }
91
92
 
93
+ // Clipboard helpers from builderContext
94
+ const clipboard = builderContext?.clipboard
95
+ const setClipboard = builderContext?.setClipboard
96
+
97
+ // Handle cut — copy to system + React clipboard, then remove (one undo step)
98
+ const handleCut = e => {
99
+ e.stopPropagation()
100
+ if (canEdit) {
101
+ if (setClipboard) setClipboard(node)
102
+ writeNodeToClipboard(node) // system clipboard (cross-tab)
103
+ if (builderContext.setSchema) {
104
+ builderContext.setSchema(prev => ({ ...prev, root: removeFromTree(prev.root, node.id) }))
105
+ builderContext.setSelectedId(null)
106
+ }
107
+ }
108
+ }
109
+
110
+ // Handle copy — store in React state AND system clipboard
111
+ const handleCopy = e => {
112
+ e.stopPropagation()
113
+ if (canEdit) {
114
+ if (setClipboard) setClipboard(node)
115
+ writeNodeToClipboard(node) // system clipboard (cross-tab)
116
+ }
117
+ }
118
+
119
+ // Handle paste — prefer system clipboard so cross-tab paste works
120
+ const handlePaste = async e => {
121
+ e.stopPropagation()
122
+ if (!canEdit || !builderContext.setSchema) return
123
+
124
+ const systemNode = await readNodeFromClipboard()
125
+ const nodeToUse = systemNode ?? clipboard
126
+ if (systemNode && setClipboard) setClipboard(systemNode) // keep React state in sync
127
+ if (!nodeToUse) return
128
+
129
+ builderContext.setSchema(prev => {
130
+ const asChild = CONTAINER_TYPES.has(node.type)
131
+ return { ...prev, root: pasteIntoTree(prev.root, node.id, nodeToUse, asChild) }
132
+ })
133
+ }
134
+
92
135
  // Handle duplicate action
93
136
  const handleDuplicate = e => {
94
137
  e.stopPropagation()
@@ -217,8 +260,22 @@ export default function ViewerComponentWrapper({ node, children, viewerContext }
217
260
  anchorReference='anchorPosition'
218
261
  anchorPosition={contextMenu ? { top: contextMenu.mouseY, left: contextMenu.mouseX } : undefined}
219
262
  >
220
- <MenuItem onClick={e => { handleDuplicate(e); handleCloseMenu() }} dense>
263
+ <MenuItem onClick={e => { handleCut(e); handleCloseMenu() }} dense>
264
+ <ListItemIcon><ContentCut fontSize='small' /></ListItemIcon>
265
+ <ListItemText>Cut</ListItemText>
266
+ </MenuItem>
267
+ <MenuItem onClick={e => { handleCopy(e); handleCloseMenu() }} dense>
221
268
  <ListItemIcon><ContentCopy fontSize='small' /></ListItemIcon>
269
+ <ListItemText>Copy</ListItemText>
270
+ </MenuItem>
271
+ {clipboard && (
272
+ <MenuItem onClick={e => { handleCloseMenu(); handlePaste(e) }} dense>
273
+ <ListItemIcon><ContentPaste fontSize='small' /></ListItemIcon>
274
+ <ListItemText>Paste</ListItemText>
275
+ </MenuItem>
276
+ )}
277
+ <MenuItem onClick={e => { handleDuplicate(e); handleCloseMenu() }} dense>
278
+ <ListItemIcon><ContentCopy fontSize='small' sx={{ opacity: 0.6 }} /></ListItemIcon>
222
279
  <ListItemText>Duplicate</ListItemText>
223
280
  </MenuItem>
224
281
  <MenuItem onClick={handleSaveClick} dense>
@@ -1,38 +1,203 @@
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 } 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
 
33
- if (response) {
34
- setSaveDialogOpen(false)
35
- }
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 } = 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) })
200
+ if (response) setSaveDialogOpen(false)
36
201
  } catch (error) {
37
202
  console.error('Error saving view:', error)
38
203
  } finally {
@@ -42,48 +207,97 @@ export default function ViewerToolbar({ mode, setMode }) {
42
207
 
43
208
  return (
44
209
  <>
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>
210
+ <Box sx={{ p: 1, borderBottom: '1px solid', borderColor: 'divider', bgcolor: 'background.paper', display: 'flex', alignItems: 'center', gap: 1 }}>
211
+ <ToggleButtonGroup value={mode} exclusive size='small' onChange={(_, v) => { if (v) setMode(v) }}>
212
+ <ToggleButton value='edit'>Edit</ToggleButton>
213
+ <ToggleButton value='preview'>Preview</ToggleButton>
67
214
  </ToggleButtonGroup>
68
215
 
216
+ {/* Undo / Redo — edit mode only */}
217
+ {mode === 'edit' && (
218
+ <>
219
+ <Tooltip title='Undo (Ctrl+Z)'>
220
+ <span>
221
+ <IconButton size='small' onClick={undo} disabled={!canUndo} sx={{ color: canUndo ? 'text.secondary' : 'action.disabled' }}>
222
+ <UndoOutlined fontSize='small' />
223
+ </IconButton>
224
+ </span>
225
+ </Tooltip>
226
+ <Tooltip title='Redo (Ctrl+Shift+Z)'>
227
+ <span>
228
+ <IconButton size='small' onClick={redo} disabled={!canRedo} sx={{ color: canRedo ? 'text.secondary' : 'action.disabled' }}>
229
+ <RedoOutlined fontSize='small' />
230
+ </IconButton>
231
+ </span>
232
+ </Tooltip>
233
+ </>
234
+ )}
235
+
69
236
  <Box sx={{ flex: 1 }} />
70
237
 
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>
238
+ {/* Theme toggle */}
239
+ {onToggleTheme && (
240
+ <Tooltip title={isDark ? 'Switch to light mode' : 'Switch to dark mode'}>
241
+ <IconButton size='small' onClick={onToggleTheme} sx={{ color: 'text.secondary' }}>
242
+ {isDark ? <LightModeOutlined fontSize='small' /> : <DarkModeOutlined fontSize='small' />}
243
+ </IconButton>
244
+ </Tooltip>
245
+ )}
246
+
247
+ {/* State Inspector */}
248
+ <Tooltip title='State Inspector'>
249
+ <IconButton
250
+ size='small'
251
+ onClick={() => setDebugOpen(o => !o)}
252
+ sx={{ color: debugOpen ? 'warning.main' : 'text.secondary' }}
253
+ >
254
+ <BugReportOutlined fontSize='small' />
255
+ </IconButton>
256
+ </Tooltip>
257
+
258
+ {/* Schema Preview — edit mode only */}
259
+ {mode === 'edit' && (
260
+ <Tooltip title='Preview Schema'>
261
+ <IconButton size='small' onClick={() => setSchemaOpen(true)}>
262
+ <DataObjectOutlined fontSize='small' />
263
+ </IconButton>
264
+ </Tooltip>
265
+ )}
80
266
  </Box>
81
267
 
82
- <SaveViewDialog
83
- open={saveDialogOpen}
84
- onClose={() => setSaveDialogOpen(false)}
85
- onSave={handleSave}
268
+ {/* ── State Inspector Panel ── */}
269
+ <DebugPanel
270
+ open={debugOpen}
271
+ onClose={() => setDebugOpen(false)}
272
+ getState={() =>
273
+ mode === 'preview' && previewStateRef
274
+ ? previewStateRef.current
275
+ : { data, form, dataRef, reportRefs }
276
+ }
86
277
  />
278
+
279
+ {/* ── Schema Preview ── */}
280
+ <Dialog open={schemaOpen} onClose={() => setSchemaOpen(false)} fullScreen PaperProps={{ sx: { bgcolor: '#1e1e1e' } }}>
281
+ <Box sx={{ display: 'flex', alignItems: 'center', bgcolor: '#252526', borderBottom: '1px solid #1a1a1a', px: 1.5, py: 0.5, gap: 1 }}>
282
+ <Box sx={{ color: '#ccc', fontSize: 13, fontFamily: 'monospace', flex: 1 }}>schema.json</Box>
283
+ <Tooltip title='Close (Esc)'>
284
+ <IconButton size='small' onClick={() => setSchemaOpen(false)} sx={{ color: '#aaa', '&:hover': { color: '#fff' } }}>
285
+ <FullscreenExitOutlined fontSize='small' />
286
+ </IconButton>
287
+ </Tooltip>
288
+ </Box>
289
+ <Box sx={{ flex: 1, minHeight: 0, height: 'calc(100vh - 40px)' }}>
290
+ <Editor
291
+ height='100%'
292
+ defaultLanguage='json'
293
+ theme='vs-dark'
294
+ value={schema ? JSON.stringify(schema, null, 2) : '{}'}
295
+ options={{ ...EDITOR_OPTS, minimap: { enabled: true } }}
296
+ />
297
+ </Box>
298
+ </Dialog>
299
+
300
+ <SaveViewDialog open={saveDialogOpen} onClose={() => setSaveDialogOpen(false)} onSave={handleSave} />
87
301
  </>
88
302
  )
89
303
  }