robobyte-front-builder 1.0.19 → 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 (513) 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 +61 -7
  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 +8 -6
  21. package/src/pages/reportModule/reportBuilder/reportViewer/index.js +33 -22
  22. package/src/pages/reportModule/reportBuilder/reports/index.js +3 -5
  23. package/src/pages/reportModule/reportBuilder/reportsPermissions/index.js +2 -3
  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 +5 -9
  49. package/src/services/reportData/fetchReportData.js +69 -28
  50. package/src/services/routerRef.js +35 -0
  51. package/src/views/ConfirmDialog.js +2 -2
  52. package/src/views/builder/JSEditor.js +105 -107
  53. package/src/views/builder/inspector/Inspector.jsx +6 -9
  54. package/src/views/builder/inspector/Tabs/ComponentActionsTab.jsx +7 -13
  55. package/src/views/builder/inspector/Tabs/MainTab.jsx +143 -25
  56. package/src/views/builder/inspector/Tabs/RulesTab.jsx +9 -24
  57. package/src/views/builder/inspector/Tabs/StyleTab.jsx +9 -24
  58. package/src/views/builder/inspector/definitions/autocomplete/main.js +4 -6
  59. package/src/views/builder/inspector/definitions/banner/actions.js +7 -0
  60. package/src/views/builder/inspector/definitions/banner/main.js +22 -0
  61. package/src/views/builder/inspector/definitions/banner/rules.js +1 -0
  62. package/src/views/builder/inspector/definitions/banner/style.js +1 -0
  63. package/src/views/builder/inspector/definitions/breadcrumb/main.js +43 -6
  64. package/src/views/builder/inspector/definitions/button/main.js +11 -12
  65. package/src/views/builder/inspector/definitions/button/style.js +18 -30
  66. package/src/views/builder/inspector/definitions/checkbox/actions.js +3 -1
  67. package/src/views/builder/inspector/definitions/checkbox/main.js +4 -6
  68. package/src/views/builder/inspector/definitions/common/main.js +13 -2
  69. package/src/views/builder/inspector/definitions/dataGrid/main.js +23 -0
  70. package/src/views/builder/inspector/definitions/dataTableViewer/main.js +46 -0
  71. package/src/views/builder/inspector/definitions/datepicker/actions.js +3 -1
  72. package/src/views/builder/inspector/definitions/datepicker/main.js +6 -14
  73. package/src/views/builder/inspector/definitions/dialog/main.js +36 -0
  74. package/src/views/builder/inspector/definitions/dropdown/main.js +5 -8
  75. package/src/views/builder/inspector/definitions/excelUpload/actions.js +23 -0
  76. package/src/views/builder/inspector/definitions/excelUpload/main.js +17 -0
  77. package/src/views/builder/inspector/definitions/excelUpload/rules.js +1 -0
  78. package/src/views/builder/inspector/definitions/excelUpload/style.js +45 -0
  79. package/src/views/builder/inspector/definitions/header/main.js +10 -1
  80. package/src/views/builder/inspector/definitions/index.js +106 -19
  81. package/src/views/builder/inspector/definitions/input/actions.js +4 -1
  82. package/src/views/builder/inspector/definitions/input/main.js +20 -11
  83. package/src/views/builder/inspector/definitions/kpi/avatarGroup.js +22 -0
  84. package/src/views/builder/inspector/definitions/kpi/badge.js +17 -0
  85. package/src/views/builder/inspector/definitions/kpi/bulletChart.js +47 -0
  86. package/src/views/builder/inspector/definitions/kpi/chart.js +55 -0
  87. package/src/views/builder/inspector/definitions/kpi/colorScale.js +60 -0
  88. package/src/views/builder/inspector/definitions/kpi/comparisonBars.js +41 -0
  89. package/src/views/builder/inspector/definitions/kpi/countdown.js +46 -0
  90. package/src/views/builder/inspector/definitions/kpi/donut.js +51 -0
  91. package/src/views/builder/inspector/definitions/kpi/funnel.js +25 -0
  92. package/src/views/builder/inspector/definitions/kpi/gauge.js +39 -0
  93. package/src/views/builder/inspector/definitions/kpi/heatmapGrid.js +96 -0
  94. package/src/views/builder/inspector/definitions/kpi/iconBox.js +20 -0
  95. package/src/views/builder/inspector/definitions/kpi/metric.js +45 -0
  96. package/src/views/builder/inspector/definitions/kpi/rating.js +27 -0
  97. package/src/views/builder/inspector/definitions/kpi/statusDot.js +18 -0
  98. package/src/views/builder/inspector/definitions/kpi/stepStage.js +65 -0
  99. package/src/views/builder/inspector/definitions/kpi/tagList.js +32 -0
  100. package/src/views/builder/inspector/definitions/kpi/timeline.js +80 -0
  101. package/src/views/builder/inspector/definitions/kpi/trend.js +20 -0
  102. package/src/views/builder/inspector/definitions/label/main.js +10 -1
  103. package/src/views/builder/inspector/definitions/layout/main.js +27 -3
  104. package/src/views/builder/inspector/definitions/number/main.js +6 -14
  105. package/src/views/builder/inspector/definitions/pageNumber/main.js +21 -0
  106. package/src/views/builder/inspector/definitions/popover/main.js +71 -0
  107. package/src/views/builder/inspector/definitions/radio/main.js +5 -8
  108. package/src/views/builder/inspector/definitions/repeater/main.js +31 -0
  109. package/src/views/builder/inspector/definitions/reportViewer/main.js +15 -1
  110. package/src/views/builder/inspector/definitions/richtext/main.js +5 -8
  111. package/src/views/builder/inspector/definitions/signature/main.js +4 -1
  112. package/src/views/builder/inspector/definitions/tag/main.js +5 -8
  113. package/src/views/builder/inspector/definitions/textarea/actions.js +4 -1
  114. package/src/views/builder/inspector/definitions/textarea/main.js +5 -7
  115. package/src/views/builder/inspector/definitions/time/main.js +5 -8
  116. package/src/views/builder/inspector/definitions/toggle/main.js +5 -19
  117. package/src/views/builder/inspector/definitions/treeView/main.js +61 -0
  118. package/src/views/builder/inspector/definitions/viewRenderer/main.js +53 -0
  119. package/src/views/builder/inspector/definitions/wizard/main.js +68 -0
  120. package/src/views/builder/inspector/definitions/wizard-step/main.js +25 -0
  121. package/src/views/builder/inspector/fields/ActionsConfigEditor.jsx +426 -0
  122. package/src/views/builder/inspector/fields/ColorSchemaField.jsx +140 -0
  123. package/src/views/builder/inspector/fields/ColumnFunctionEditor.jsx +238 -0
  124. package/src/views/builder/inspector/fields/ColumnMappingEditor.jsx +105 -0
  125. package/src/views/builder/inspector/fields/ColumnsConfigEditor.jsx +506 -0
  126. package/src/views/builder/inspector/fields/DonutRingsEditorField.jsx +337 -0
  127. package/src/views/builder/inspector/fields/ExtraColsEditor.jsx +618 -0
  128. package/src/views/builder/inspector/fields/FunctionHelpPopover.jsx +295 -0
  129. package/src/views/builder/inspector/fields/IconEditor.jsx +64 -0
  130. package/src/views/builder/inspector/fields/KpiActionField.jsx +223 -0
  131. package/src/views/builder/inspector/fields/MarkersEditorField.jsx +173 -0
  132. package/src/views/builder/inspector/fields/SelectEditor.jsx +9 -5
  133. package/src/views/builder/inspector/fields/SeriesEditorField.jsx +363 -0
  134. package/src/views/builder/inspector/fields/TableColumnsEditor.jsx +104 -0
  135. package/src/views/builder/inspector/fields/ThresholdsEditor.jsx +247 -0
  136. package/src/views/builder/inspector/fields/ValueFunctionsRefPanel.jsx +217 -0
  137. package/src/views/builder/inspector/fields/columnEditorShared.jsx +217 -0
  138. package/src/views/builder/sidebar/Sidebar.jsx +4 -2
  139. package/src/views/builder/sidebar/SidebarTabs.jsx +28 -17
  140. package/src/views/builder/sidebar/tabs/ActionsTab.jsx +7 -3
  141. package/src/views/builder/sidebar/tabs/AiTab/AiPreviewDialog.jsx +193 -0
  142. package/src/views/builder/sidebar/tabs/AiTab/aiProvider.js +49 -0
  143. package/src/views/builder/sidebar/tabs/AiTab/index.jsx +409 -0
  144. package/src/views/builder/sidebar/tabs/AiTab/schemaTransformer.js +102 -0
  145. package/src/views/builder/sidebar/tabs/AiTab/schemaValidator.js +64 -0
  146. package/src/views/builder/sidebar/tabs/AiTab/systemPrompt.js +1151 -0
  147. package/src/views/builder/sidebar/tabs/Components/ComponentsTab.jsx +31 -31
  148. package/src/views/builder/sidebar/tabs/Components/componentCatalog.js +43 -21
  149. package/src/views/builder/sidebar/tabs/Components/printComponentCatalog.js +81 -0
  150. package/src/views/builder/sidebar/tabs/TimersTab.jsx +338 -0
  151. package/src/views/builder/sidebar/tabs/TreeTab.jsx +13 -4
  152. package/src/views/builder/sidebar/tabs/ViewTab.jsx +1 -1
  153. package/src/views/builder/viewer/AdornedLabel.jsx +82 -0
  154. package/src/views/builder/viewer/ComponentRenderer.jsx +98 -24
  155. package/src/views/builder/viewer/DialogsZone.jsx +259 -0
  156. package/src/views/builder/viewer/FieldLabel.jsx +106 -0
  157. package/src/views/builder/viewer/PrintDialog.jsx +481 -0
  158. package/src/views/builder/viewer/ProductionViewer.jsx +80 -5
  159. package/src/views/builder/viewer/Viewer.jsx +106 -8
  160. package/src/views/builder/viewer/ViewerComponentWrapper.jsx +61 -4
  161. package/src/views/builder/viewer/ViewerToolbar.jsx +273 -59
  162. package/src/views/builder/viewer/renderers/AutoCompleteRenderer.jsx +26 -22
  163. package/src/views/builder/viewer/renderers/AvatarGroupRenderer.jsx +112 -0
  164. package/src/views/builder/viewer/renderers/BadgeRenderer.jsx +79 -0
  165. package/src/views/builder/viewer/renderers/BannerRenderer.jsx +62 -0
  166. package/src/views/builder/viewer/renderers/BreadcrumbRenderer.jsx +203 -15
  167. package/src/views/builder/viewer/renderers/BulletChartRenderer.jsx +147 -0
  168. package/src/views/builder/viewer/renderers/ButtonRenderer.jsx +98 -39
  169. package/src/views/builder/viewer/renderers/CardRenderer.jsx +1 -1
  170. package/src/views/builder/viewer/renderers/ChartRenderer.jsx +388 -0
  171. package/src/views/builder/viewer/renderers/CheckboxRenderer.jsx +17 -9
  172. package/src/views/builder/viewer/renderers/ColorScaleRenderer.jsx +300 -0
  173. package/src/views/builder/viewer/renderers/ComparisonBarsRenderer.jsx +133 -0
  174. package/src/views/builder/viewer/renderers/ContainerRenderer.jsx +3 -1
  175. package/src/views/builder/viewer/renderers/CountdownRenderer.jsx +249 -0
  176. package/src/views/builder/viewer/renderers/DataGridRenderer.jsx +380 -0
  177. package/src/views/builder/viewer/renderers/DataTableViewerRenderer.jsx +240 -0
  178. package/src/views/builder/viewer/renderers/DatePickerRenderer.jsx +25 -24
  179. package/src/views/builder/viewer/renderers/DialogRenderer.jsx +327 -0
  180. package/src/views/builder/viewer/renderers/DividerRenderer.jsx +1 -1
  181. package/src/views/builder/viewer/renderers/DonutRenderer.jsx +294 -0
  182. package/src/views/builder/viewer/renderers/DropdownRenderer.jsx +36 -44
  183. package/src/views/builder/viewer/renderers/ExcelUploadRenderer.jsx +639 -0
  184. package/src/views/builder/viewer/renderers/FunnelRenderer.jsx +93 -0
  185. package/src/views/builder/viewer/renderers/GaugeRenderer.jsx +159 -0
  186. package/src/views/builder/viewer/renderers/HeaderRenderer.jsx +31 -9
  187. package/src/views/builder/viewer/renderers/HeatmapGridRenderer.jsx +432 -0
  188. package/src/views/builder/viewer/renderers/IconBoxRenderer.jsx +59 -0
  189. package/src/views/builder/viewer/renderers/ImageRenderer.jsx +1 -1
  190. package/src/views/builder/viewer/renderers/InputRenderer.jsx +75 -18
  191. package/src/views/builder/viewer/renderers/LabelRenderer.jsx +35 -9
  192. package/src/views/builder/viewer/renderers/LayoutCellRenderer.jsx +102 -40
  193. package/src/views/builder/viewer/renderers/LayoutContextMenu.jsx +8 -8
  194. package/src/views/builder/viewer/renderers/LayoutRenderer.jsx +48 -6
  195. package/src/views/builder/viewer/renderers/LinkRenderer.jsx +1 -1
  196. package/src/views/builder/viewer/renderers/MenuRenderer.jsx +2 -2
  197. package/src/views/builder/viewer/renderers/MetricRenderer.jsx +80 -0
  198. package/src/views/builder/viewer/renderers/NumberFormatRenderer.jsx +21 -30
  199. package/src/views/builder/viewer/renderers/PageNumberRenderer.jsx +76 -0
  200. package/src/views/builder/viewer/renderers/PopoverRenderer.jsx +350 -0
  201. package/src/views/builder/viewer/renderers/ProgressCircleRenderer.jsx +1 -1
  202. package/src/views/builder/viewer/renderers/ProgressLineRenderer.jsx +1 -1
  203. package/src/views/builder/viewer/renderers/RadioGroupRenderer.jsx +28 -39
  204. package/src/views/builder/viewer/renderers/RatingRenderer.jsx +80 -0
  205. package/src/views/builder/viewer/renderers/RepeaterRenderer.jsx +297 -38
  206. package/src/views/builder/viewer/renderers/ReportViewerRenderer.jsx +219 -5
  207. package/src/views/builder/viewer/renderers/RichTextRenderer.jsx +60 -66
  208. package/src/views/builder/viewer/renderers/RowActionsCell.jsx +308 -0
  209. package/src/views/builder/viewer/renderers/SignatureRenderer.jsx +33 -62
  210. package/src/views/builder/viewer/renderers/StatusDotRenderer.jsx +75 -0
  211. package/src/views/builder/viewer/renderers/StepStageRenderer.jsx +348 -0
  212. package/src/views/builder/viewer/renderers/TagListRenderer.jsx +115 -0
  213. package/src/views/builder/viewer/renderers/TagPickerRenderer.jsx +31 -45
  214. package/src/views/builder/viewer/renderers/TextAreaRenderer.jsx +25 -18
  215. package/src/views/builder/viewer/renderers/TextRenderer.jsx +7 -1
  216. package/src/views/builder/viewer/renderers/TimePickerRenderer.jsx +25 -24
  217. package/src/views/builder/viewer/renderers/TimelineRenderer.jsx +525 -0
  218. package/src/views/builder/viewer/renderers/ToggleRenderer.jsx +21 -27
  219. package/src/views/builder/viewer/renderers/TreeViewRenderer.jsx +832 -0
  220. package/src/views/builder/viewer/renderers/TrendRenderer.jsx +66 -0
  221. package/src/views/builder/viewer/renderers/ViewRendererRenderer.jsx +315 -0
  222. package/src/views/builder/viewer/renderers/WizardRenderer.jsx +380 -64
  223. package/src/views/builder/viewer/renderers/WizardStepRenderer.jsx +21 -12
  224. package/src/views/builder/viewer/renderers/dataGridComponents.jsx +824 -0
  225. package/src/views/customFilter/CustomFilterDialog.js +1023 -660
  226. package/src/views/customFilter/FixedFilterDialog.js +649 -0
  227. package/src/views/customFilter/SearchFilterDialog.js +248 -0
  228. package/src/views/genericTable/BuilderExpressionParams.js +3 -3
  229. package/src/views/genericTable/ColumnConfiguratorDialog.js +33 -24
  230. package/src/views/genericTable/FixedFilterDialog.js +3 -2
  231. package/src/views/genericTable/FormattingSettingsDialog.js +8 -3
  232. package/src/views/genericTable/SGrid.js +198 -97
  233. package/src/views/genericTable/SearchFilterDialog.js +3 -2
  234. package/src/views/genericTable/cellEditors/autocompleteEditor.js +5 -9
  235. package/src/views/genericTable/convertStringFunctions.js +274 -138
  236. package/src/views/genericTable/statusBar/rowCountStatusBar.js +3 -1
  237. package/src/views/genericTable/updateRefHelpers.js +9 -6
  238. package/src/views/printBuilder/PrintBuilderViewer.jsx +607 -0
  239. package/src/views/printBuilder/PrintPreviewCanvas.jsx +157 -0
  240. package/src/views/rolePermissions/UpdateReportPermissionDialog.js +3 -2
  241. package/src/@core/components/auth/AclGuard.js +0 -55
  242. package/src/@core/components/auth/AuthGuard.js +0 -40
  243. package/src/@core/components/auth/GuestGuard.js +0 -30
  244. package/src/@core/components/custom-inputs/Horizontal.jsx +0 -143
  245. package/src/@core/components/custom-inputs/Image.jsx +0 -78
  246. package/src/@core/components/custom-inputs/Vertical.jsx +0 -113
  247. package/src/@core/components/customizer/index.jsx +0 -470
  248. package/src/@core/components/customizer/styles.module.css +0 -169
  249. package/src/@core/components/mui/Avatar.jsx +0 -41
  250. package/src/@core/components/mui/Badge.jsx +0 -20
  251. package/src/@core/components/mui/IconButton.jsx +0 -74
  252. package/src/@core/components/mui/TabList.jsx +0 -60
  253. package/src/@core/components/option-menu/index.jsx +0 -137
  254. package/src/@core/components/scroll-to-top/index.jsx +0 -43
  255. package/src/@core/components/spinner/index.js +0 -26
  256. package/src/@core/components/window-wrapper/index.js +0 -27
  257. package/src/@core/contexts/settingsContext.jsx +0 -98
  258. package/src/@core/hooks/useBgColor.js +0 -63
  259. package/src/@core/hooks/useImageVariant.js +0 -27
  260. package/src/@core/hooks/useLayoutInit.js +0 -37
  261. package/src/@core/hooks/useObjectCookie.js +0 -18
  262. package/src/@core/hooks/useSettings.jsx +0 -15
  263. package/src/@core/layouts/BlankLayout.js +0 -37
  264. package/src/@core/layouts/BlankLayoutWithAppBar.js +0 -51
  265. package/src/@core/layouts/HorizontalLayout.jsx +0 -151
  266. package/src/@core/layouts/Layout.js +0 -39
  267. package/src/@core/layouts/VerticalLayout.jsx +0 -124
  268. package/src/@core/layouts/components/blank-layout-with-appBar/index.js +0 -115
  269. package/src/@core/layouts/components/horizontal/app-bar-content/index.js +0 -67
  270. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavGroup.js +0 -352
  271. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavItems.js +0 -21
  272. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavLink.js +0 -195
  273. package/src/@core/layouts/components/horizontal/navigation/index.js +0 -31
  274. package/src/@core/layouts/components/shared-components/LanguageDropdown.js +0 -96
  275. package/src/@core/layouts/components/shared-components/ModeToggler.js +0 -32
  276. package/src/@core/layouts/components/shared-components/NotificationDropdown.js +0 -226
  277. package/src/@core/layouts/components/shared-components/UserDropdown.js +0 -177
  278. package/src/@core/layouts/components/shared-components/footer/FooterContent.js +0 -46
  279. package/src/@core/layouts/components/shared-components/footer/index.js +0 -61
  280. package/src/@core/layouts/components/vertical/appBar/index.js +0 -74
  281. package/src/@core/layouts/components/vertical/navigation/Drawer.js +0 -122
  282. package/src/@core/layouts/components/vertical/navigation/VerticalNavGroup.js +0 -435
  283. package/src/@core/layouts/components/vertical/navigation/VerticalNavHeader.js +0 -180
  284. package/src/@core/layouts/components/vertical/navigation/VerticalNavItems.js +0 -26
  285. package/src/@core/layouts/components/vertical/navigation/VerticalNavLink.js +0 -258
  286. package/src/@core/layouts/components/vertical/navigation/VerticalNavSectionTitle.js +0 -102
  287. package/src/@core/layouts/components/vertical/navigation/index.js +0 -169
  288. package/src/@core/layouts/utils.js +0 -69
  289. package/src/@core/styles/Table.module.css +0 -93
  290. package/src/@core/styles/horizontal/menuItemStyles.js +0 -100
  291. package/src/@core/styles/horizontal/menuRootStyles.js +0 -19
  292. package/src/@core/styles/libs/fullcalendar/index.js +0 -461
  293. package/src/@core/styles/libs/keen-slider/index.js +0 -111
  294. package/src/@core/styles/libs/react-apexcharts/index.js +0 -107
  295. package/src/@core/styles/libs/react-cleave/index.js +0 -33
  296. package/src/@core/styles/libs/react-credit-cards/index.js +0 -11
  297. package/src/@core/styles/libs/react-datepicker/index.js +0 -388
  298. package/src/@core/styles/libs/react-draft-wysiwyg/index.js +0 -144
  299. package/src/@core/styles/libs/react-dropzone/index.js +0 -76
  300. package/src/@core/styles/libs/react-hot-toast/index.js +0 -37
  301. package/src/@core/styles/libs/recharts/index.js +0 -47
  302. package/src/@core/styles/stepper.js +0 -103
  303. package/src/@core/styles/vertical/menuItemStyles.js +0 -138
  304. package/src/@core/styles/vertical/menuSectionStyles.js +0 -54
  305. package/src/@core/styles/vertical/navigationCustomStyles.js +0 -62
  306. package/src/@core/svg/ContentCompact.jsx +0 -17
  307. package/src/@core/svg/ContentWide.jsx +0 -17
  308. package/src/@core/svg/DirectionLtr.jsx +0 -93
  309. package/src/@core/svg/DirectionRtl.jsx +0 -93
  310. package/src/@core/svg/LayoutCollapsed.jsx +0 -59
  311. package/src/@core/svg/LayoutHorizontal.jsx +0 -42
  312. package/src/@core/svg/LayoutVertical.jsx +0 -59
  313. package/src/@core/svg/Logo.jsx +0 -76
  314. package/src/@core/svg/SkinBordered.jsx +0 -54
  315. package/src/@core/svg/SkinDefault.jsx +0 -59
  316. package/src/@core/tailwind/plugin.js +0 -78
  317. package/src/@core/theme/ThemeComponent.js +0 -63
  318. package/src/@core/theme/ThemeOptions.js +0 -71
  319. package/src/@core/theme/breakpoints/index.js +0 -11
  320. package/src/@core/theme/colorSchemes.js +0 -326
  321. package/src/@core/theme/customShadows.js +0 -11
  322. package/src/@core/theme/globalStyles.js +0 -81
  323. package/src/@core/theme/index.js +0 -42
  324. package/src/@core/theme/overrides/accordion.js +0 -51
  325. package/src/@core/theme/overrides/accordion.jsx +0 -85
  326. package/src/@core/theme/overrides/alerts.js +0 -110
  327. package/src/@core/theme/overrides/alerts.jsx +0 -180
  328. package/src/@core/theme/overrides/autocomplete.js +0 -14
  329. package/src/@core/theme/overrides/autocomplete.jsx +0 -68
  330. package/src/@core/theme/overrides/avatar.js +0 -38
  331. package/src/@core/theme/overrides/avatars.js +0 -27
  332. package/src/@core/theme/overrides/backdrop.js +0 -22
  333. package/src/@core/theme/overrides/badges.js +0 -16
  334. package/src/@core/theme/overrides/breadcrumbs.js +0 -11
  335. package/src/@core/theme/overrides/button-group.js +0 -84
  336. package/src/@core/theme/overrides/button.js +0 -93
  337. package/src/@core/theme/overrides/buttonGroup.js +0 -9
  338. package/src/@core/theme/overrides/card.js +0 -83
  339. package/src/@core/theme/overrides/checkbox.jsx +0 -95
  340. package/src/@core/theme/overrides/chip.js +0 -72
  341. package/src/@core/theme/overrides/dataGrid.js +0 -114
  342. package/src/@core/theme/overrides/dateTimePicker.js +0 -65
  343. package/src/@core/theme/overrides/dialog.js +0 -120
  344. package/src/@core/theme/overrides/divider.js +0 -13
  345. package/src/@core/theme/overrides/drawer.js +0 -20
  346. package/src/@core/theme/overrides/fab.js +0 -13
  347. package/src/@core/theme/overrides/form-control-label.js +0 -19
  348. package/src/@core/theme/overrides/icon-button.js +0 -145
  349. package/src/@core/theme/overrides/index.js +0 -103
  350. package/src/@core/theme/overrides/input.js +0 -72
  351. package/src/@core/theme/overrides/link.js +0 -9
  352. package/src/@core/theme/overrides/list.js +0 -44
  353. package/src/@core/theme/overrides/menu.js +0 -25
  354. package/src/@core/theme/overrides/pagination.js +0 -41
  355. package/src/@core/theme/overrides/paper.js +0 -9
  356. package/src/@core/theme/overrides/popover.js +0 -16
  357. package/src/@core/theme/overrides/progress.js +0 -38
  358. package/src/@core/theme/overrides/radio.jsx +0 -80
  359. package/src/@core/theme/overrides/rating.js +0 -16
  360. package/src/@core/theme/overrides/rating.jsx +0 -32
  361. package/src/@core/theme/overrides/select.js +0 -19
  362. package/src/@core/theme/overrides/select.jsx +0 -52
  363. package/src/@core/theme/overrides/slider.js +0 -97
  364. package/src/@core/theme/overrides/snackbar.js +0 -19
  365. package/src/@core/theme/overrides/switch.js +0 -73
  366. package/src/@core/theme/overrides/switches.js +0 -25
  367. package/src/@core/theme/overrides/table-pagination.js +0 -39
  368. package/src/@core/theme/overrides/table.js +0 -81
  369. package/src/@core/theme/overrides/tabs.js +0 -30
  370. package/src/@core/theme/overrides/timeline.js +0 -80
  371. package/src/@core/theme/overrides/toggle-button.js +0 -33
  372. package/src/@core/theme/overrides/toggleButton.js +0 -16
  373. package/src/@core/theme/overrides/tooltip.js +0 -21
  374. package/src/@core/theme/overrides/typography.js +0 -13
  375. package/src/@core/theme/palette/index.js +0 -107
  376. package/src/@core/theme/shadows/index.js +0 -61
  377. package/src/@core/theme/shadows.js +0 -12
  378. package/src/@core/theme/spacing/index.js +0 -3
  379. package/src/@core/theme/spacing.js +0 -5
  380. package/src/@core/theme/typography/index.js +0 -65
  381. package/src/@core/theme/typography.js +0 -84
  382. package/src/@core/utils/create-emotion-cache.js +0 -5
  383. package/src/@core/utils/hex-to-rgba.js +0 -11
  384. package/src/@core/utils/serverHelpers.js +0 -45
  385. package/src/@menu/components/RouterLink.jsx +0 -18
  386. package/src/@menu/components/horizontal-menu/HorizontalNav.jsx +0 -88
  387. package/src/@menu/components/horizontal-menu/Menu.jsx +0 -83
  388. package/src/@menu/components/horizontal-menu/MenuButton.jsx +0 -100
  389. package/src/@menu/components/horizontal-menu/MenuItem.jsx +0 -183
  390. package/src/@menu/components/horizontal-menu/SubMenu.jsx +0 -418
  391. package/src/@menu/components/horizontal-menu/SubMenuContent.jsx +0 -41
  392. package/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.jsx +0 -20
  393. package/src/@menu/components/vertical-menu/Menu.jsx +0 -161
  394. package/src/@menu/components/vertical-menu/MenuButton.jsx +0 -95
  395. package/src/@menu/components/vertical-menu/MenuItem.jsx +0 -180
  396. package/src/@menu/components/vertical-menu/MenuSection.jsx +0 -124
  397. package/src/@menu/components/vertical-menu/NavCollapseIcons.jsx +0 -70
  398. package/src/@menu/components/vertical-menu/NavHeader.jsx +0 -39
  399. package/src/@menu/components/vertical-menu/SubMenu.jsx +0 -420
  400. package/src/@menu/components/vertical-menu/SubMenuContent.jsx +0 -101
  401. package/src/@menu/components/vertical-menu/VerticalNav.jsx +0 -216
  402. package/src/@menu/contexts/horizontalNavContext.jsx +0 -29
  403. package/src/@menu/contexts/verticalNavContext.jsx +0 -65
  404. package/src/@menu/defaultConfigs.js +0 -12
  405. package/src/@menu/hooks/useHorizontalMenu.jsx +0 -19
  406. package/src/@menu/hooks/useHorizontalNav.jsx +0 -19
  407. package/src/@menu/hooks/useMediaQuery.jsx +0 -29
  408. package/src/@menu/hooks/useVerticalMenu.jsx +0 -19
  409. package/src/@menu/hooks/useVerticalNav.jsx +0 -19
  410. package/src/@menu/horizontal-menu/index.jsx +0 -8
  411. package/src/@menu/styles/StyledBackdrop.jsx +0 -15
  412. package/src/@menu/styles/StyledMenuIcon.jsx +0 -12
  413. package/src/@menu/styles/StyledMenuLabel.jsx +0 -16
  414. package/src/@menu/styles/StyledMenuPrefix.jsx +0 -10
  415. package/src/@menu/styles/StyledMenuSectionLabel.jsx +0 -21
  416. package/src/@menu/styles/StyledMenuSuffix.jsx +0 -10
  417. package/src/@menu/styles/StyledSubMenuContent.jsx +0 -43
  418. package/src/@menu/styles/horizontal/StyledHorizontalMenu.jsx +0 -13
  419. package/src/@menu/styles/horizontal/StyledHorizontalMenuItem.jsx +0 -26
  420. package/src/@menu/styles/horizontal/StyledHorizontalNav.jsx +0 -11
  421. package/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.jsx +0 -33
  422. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.jsx +0 -18
  423. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.jsx +0 -10
  424. package/src/@menu/styles/horizontal/horizontalUl.module.css +0 -15
  425. package/src/@menu/styles/styles.module.css +0 -5
  426. package/src/@menu/styles/vertical/StyledVerticalMenu.jsx +0 -16
  427. package/src/@menu/styles/vertical/StyledVerticalMenuItem.jsx +0 -28
  428. package/src/@menu/styles/vertical/StyledVerticalMenuSection.jsx +0 -23
  429. package/src/@menu/styles/vertical/StyledVerticalNav.jsx +0 -67
  430. package/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.jsx +0 -15
  431. package/src/@menu/styles/vertical/StyledVerticalNavContainer.jsx +0 -23
  432. package/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.jsx +0 -25
  433. package/src/@menu/styles/vertical/verticalNavBgImage.module.css +0 -10
  434. package/src/@menu/svg/ChevronRight.jsx +0 -9
  435. package/src/@menu/svg/Close.jsx +0 -12
  436. package/src/@menu/svg/RadioCircle.jsx +0 -12
  437. package/src/@menu/svg/RadioCircleMarked.jsx +0 -13
  438. package/src/@menu/utils/menuClasses.js +0 -44
  439. package/src/@menu/utils/menuUtils.jsx +0 -145
  440. package/src/@menu/vertical-menu/index.jsx +0 -11
  441. package/src/configs/acl.js +0 -115
  442. package/src/configs/auth.js +0 -5
  443. package/src/configs/aws-exports.js +0 -30
  444. package/src/configs/firebase.js +0 -25
  445. package/src/configs/i18n.js +0 -34
  446. package/src/configs/primaryColorConfig.js +0 -35
  447. package/src/configs/themeConfig.js +0 -44
  448. package/src/layouts/UserLayout.js +0 -94
  449. package/src/layouts/UserThemeOptions.js +0 -191
  450. package/src/layouts/components/Direction.js +0 -30
  451. package/src/layouts/components/HtmlTooltip.js +0 -15
  452. package/src/layouts/components/Translations.js +0 -11
  453. package/src/layouts/components/UserDropdown.js +0 -217
  454. package/src/layouts/components/UserIcon.js +0 -40
  455. package/src/layouts/components/acl/Can.js +0 -6
  456. package/src/layouts/components/acl/CanViewNavGroup.js +0 -36
  457. package/src/layouts/components/acl/CanViewNavLink.js +0 -17
  458. package/src/layouts/components/acl/CanViewNavSectionTitle.js +0 -17
  459. package/src/layouts/components/horizontal/AppBarContent.js +0 -39
  460. package/src/layouts/components/horizontal/ServerSideNavItems.js +0 -44
  461. package/src/layouts/components/mui/StepperComps.js +0 -55
  462. package/src/layouts/components/vertical/AppBarContent.js +0 -35
  463. package/src/layouts/components/vertical/ServerSideNavItems.js +0 -44
  464. package/src/libs/ApexCharts.jsx +0 -5
  465. package/src/libs/ReactPlayer.jsx +0 -5
  466. package/src/libs/Recharts.jsx +0 -4
  467. package/src/libs/auth.js +0 -124
  468. package/src/libs/styles/AppFullCalendar.js +0 -505
  469. package/src/libs/styles/AppKeenSlider.js +0 -116
  470. package/src/libs/styles/AppReactApexCharts.jsx +0 -110
  471. package/src/libs/styles/AppReactDatepicker.jsx +0 -470
  472. package/src/libs/styles/AppReactDropzone.js +0 -76
  473. package/src/libs/styles/AppReactToastify.jsx +0 -108
  474. package/src/libs/styles/AppRecharts.js +0 -55
  475. package/src/libs/styles/inputOtp.module.css +0 -39
  476. package/src/libs/styles/tiptapEditor.css +0 -72
  477. package/src/navigation/horizontal/index.js +0 -246
  478. package/src/navigation/vertical/index.js +0 -253
  479. package/src/pages/401.js +0 -70
  480. package/src/pages/404.js +0 -67
  481. package/src/pages/500.js +0 -68
  482. package/src/pages/[slug].js +0 -115
  483. package/src/pages/_document.js +0 -72
  484. package/src/pages/api/navigation/regenerate-registry.js +0 -116
  485. package/src/pages/api/navigation/save.js +0 -218
  486. package/src/pages/authModule/acl/index.js +0 -48
  487. package/src/pages/authModule/forgot-password/index.js +0 -228
  488. package/src/pages/authModule/permissions/rolePermissions/[id]/rolePermissionsUser/index.js +0 -392
  489. package/src/pages/authModule/permissions/rolePermissions/index.js +0 -343
  490. package/src/pages/authModule/permissions/systemPermissions/index.js +0 -354
  491. package/src/pages/authModule/privacy/index.js +0 -721
  492. package/src/pages/authModule/users/index.js +0 -210
  493. package/src/pages/login/index.js +0 -328
  494. package/src/pages/mainHome/index.js +0 -181
  495. package/src/views/builder/inspector/definitions/cell/main.js +0 -4
  496. package/src/views/builder/inspector/definitions/column/main.js +0 -9
  497. package/src/views/builder/inspector/definitions/column-group/main.js +0 -18
  498. package/src/views/builder/inspector/definitions/header-cell/main.js +0 -5
  499. package/src/views/builder/inspector/definitions/table/main.js +0 -9
  500. package/src/views/builder/viewer/renderers/CellRenderer.jsx +0 -71
  501. package/src/views/builder/viewer/renderers/ColumnGroupRenderer.jsx +0 -96
  502. package/src/views/builder/viewer/renderers/ColumnRenderer.jsx +0 -71
  503. package/src/views/builder/viewer/renderers/HeaderCellRenderer.jsx +0 -78
  504. package/src/views/builder/viewer/renderers/TabRenderer.jsx +0 -82
  505. package/src/views/builder/viewer/renderers/TableRenderer.jsx +0 -92
  506. package/src/views/pages/auth/FooterIllustrationsV2.js +0 -40
  507. package/src/views/pages/misc/FooterIllustrations.js +0 -47
  508. package/src/views/pages/misc/muiTable/CustomPagination.js +0 -34
  509. package/src/views/pages/users/UserManageDialog.js +0 -283
  510. package/src/views/pages/users/UserViewPage.js +0 -199
  511. package/src/views/users/AddUserNameDialog.js +0 -162
  512. package/src/views/users/ContactManage.js +0 -449
  513. 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
  }