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
@@ -0,0 +1,481 @@
1
+ import { useEffect, useState } from 'react'
2
+ import { createPortal } from 'react-dom'
3
+ import { Box, Dialog, DialogContent, IconButton, Tooltip, Button, CircularProgress } from '@mui/material'
4
+ import { CloseOutlined, PrintOutlined } from '@mui/icons-material'
5
+ import ComponentRenderer from './ComponentRenderer'
6
+ import { Endpoints, Services } from 'services/Endpoints'
7
+ import PrintPreviewCanvas from 'views/printBuilder/PrintPreviewCanvas'
8
+
9
+ const PRINT_STYLE_ID = '__rbb_print_style__'
10
+
11
+ const PAGE_SIZE_NAMES = { A4: 'A4', Letter: 'letter', Legal: 'legal' }
12
+
13
+
14
+ // ── CSS injected when print schema is available ───────────────────────────────
15
+ //
16
+ // Strategy (table-based, cross-browser):
17
+ // • @page — paper size + body margins only (NO header/footer height added)
18
+ // • <thead> — repeats automatically at the top of every printed page
19
+ // • <tfoot> — repeats automatically at the bottom of every printed page
20
+ // • <tbody> <tr>s — body pages that paginate naturally
21
+ // • #__rbb_print_portal__ is a Portal appended directly to <body>.
22
+ // On screen it is hidden via CSS; on print the Dialog is hidden and the
23
+ // portal is revealed — this also covers Ctrl+P (no JS needed).
24
+ //
25
+ function buildPrintCSS(settings = {}) {
26
+ const pageSize = PAGE_SIZE_NAMES[settings.pageSize] ?? 'A4'
27
+ const orient = settings.orientation ?? 'portrait'
28
+ const m = settings.margins ?? { top: 0, right: 0, bottom: 0, left: 0 }
29
+ const hEnabled = settings.header?.enabled
30
+ const fEnabled = settings.footer?.enabled
31
+ const hH = hEnabled ? (settings.header?.height ?? 10) : 0 // mm
32
+ const fH = fEnabled ? (settings.footer?.height ?? 10) : 0 // mm
33
+
34
+ // ── Watermark ─────────────────────────────────────────────────────────────
35
+ const wm = settings.watermark ?? {}
36
+ const wmEnabled = wm.enabled && wm.text
37
+ const wmFontSize = wm.fontSize ?? 60
38
+ const wmAngle = wm.angle ?? -45
39
+ const wmOpacity = wm.opacity ?? 0.1
40
+ const wmColor = wm.color ?? '#000000'
41
+
42
+ // ── Print CSS strategy ────────────────────────────────────────────────────
43
+ // @page margin = 0. Zones are full-paper-edge (top/bottom/left/right = 0).
44
+ // Page margins (m.*) are expressed as PADDING inside each zone container —
45
+ // they are NOT added to the zone's height or position offset.
46
+ //
47
+ // Header top:0 left:0 right:0 height=hH mm (exact configured height)
48
+ // padding: m.top m.right 0 m.left → margins live inside the zone
49
+ //
50
+ // Footer bottom:0 left:0 right:0 height=fH mm
51
+ // padding: 0 m.right m.bottom m.left
52
+ //
53
+ // Body page padding-top=hH padding-bottom=fH (push content past zones)
54
+ // padding-left/right = m.left/right (side margins inside body)
55
+ // min-height:100vh = one full paper per zone
56
+ // ─────────────────────────────────────────────────────────────────────────
57
+ return `
58
+ @page {
59
+ size: ${pageSize} ${orient};
60
+ margin: 0;
61
+ }
62
+
63
+ /* ── Screen: keep the portal invisible ── */
64
+ #__rbb_print_portal__ { display: none; }
65
+
66
+ @media print {
67
+ /* ── Hide everything except the portal ── */
68
+ .MuiModal-root,
69
+ .MuiModal-backdrop,
70
+ body > *:not(#__rbb_print_portal__) { display: none !important; }
71
+
72
+ body {
73
+ background: white !important;
74
+ margin: 0 !important; padding: 0 !important;
75
+ }
76
+ #__rbb_print_portal__ {
77
+ display: block !important;
78
+ width: 100%;
79
+ margin: 0 !important; padding: 0 !important;
80
+ }
81
+
82
+ /* ── Header — full paper edge, exact configured height, margins as padding ── */
83
+ .rbb-print-header {
84
+ position: fixed;
85
+ top: 0; left: 0; right: 0;
86
+ height: ${hH}mm;
87
+ padding: ${m.top}mm ${m.right}mm 0 ${m.left}mm;
88
+ box-sizing: border-box;
89
+ overflow: hidden;
90
+ border-bottom: ${hEnabled ? '1px solid #e0e0e0' : 'none'};
91
+ background: white;
92
+ z-index: 1;
93
+ }
94
+
95
+ /* ── Footer — full paper edge, exact configured height, margins as padding ── */
96
+ .rbb-print-footer {
97
+ position: fixed;
98
+ bottom: 0; left: 0; right: 0;
99
+ height: ${fH}mm;
100
+ padding: 0 ${m.right}mm ${m.bottom}mm ${m.left}mm;
101
+ box-sizing: border-box;
102
+ overflow: hidden;
103
+ border-top: ${fEnabled ? '1px solid #e0e0e0' : 'none'};
104
+ background: white;
105
+ z-index: 1;
106
+ }
107
+
108
+ /* ── Body container ── */
109
+ .rbb-print-body { margin: 0; padding: 0; }
110
+
111
+ /* ── Individual page zones ── */
112
+ /* padding-top/bottom = exact zone heights so body content clears the zones.
113
+ padding-left/right = page side margins expressed as body padding.
114
+ min-height:100vh = one full paper page per zone. */
115
+ .rbb-print-page {
116
+ box-sizing: border-box;
117
+ min-height: 100vh;
118
+ padding-top: ${hH}mm;
119
+ padding-bottom: ${fH}mm;
120
+ padding-left: ${m.left}mm;
121
+ padding-right: ${m.right}mm;
122
+ page-break-inside: avoid;
123
+ break-inside: avoid;
124
+ }
125
+ /* Each zone → its own physical page; skip last to avoid a blank trailing page */
126
+ .rbb-print-page:not(:last-child) {
127
+ page-break-after: always;
128
+ break-after: page;
129
+ }
130
+
131
+ /* ── Watermark ── */
132
+ ${wmEnabled ? `
133
+ .rbb-watermark {
134
+ position: fixed;
135
+ top: 50%; left: 50%;
136
+ transform: translate(-50%, -50%) rotate(${wmAngle}deg);
137
+ font-size: ${wmFontSize}pt;
138
+ color: ${wmColor};
139
+ opacity: ${wmOpacity};
140
+ pointer-events: none;
141
+ white-space: nowrap;
142
+ user-select: none;
143
+ z-index: 9999;
144
+ font-weight: 700;
145
+ }` : ''}
146
+ }
147
+ `
148
+ }
149
+
150
+ function injectPrintStyle(settings) {
151
+ document.getElementById(PRINT_STYLE_ID)?.remove()
152
+ const style = document.createElement('style')
153
+ style.id = PRINT_STYLE_ID
154
+ style.innerHTML = buildPrintCSS(settings)
155
+ document.head.appendChild(style)
156
+ }
157
+
158
+ function removePrintStyle() {
159
+ document.getElementById(PRINT_STYLE_ID)?.remove()
160
+ }
161
+
162
+ // ── Plain HTML table (used by ReportViewer in print context) ─────────────────
163
+ function printCellText(value) {
164
+ if (value === null || value === undefined) return ''
165
+ if (typeof value === 'object') {
166
+ try { return JSON.stringify(value) } catch { return String(value) }
167
+ }
168
+ return String(value)
169
+ }
170
+
171
+ export function PrintTable({ columns = [], rows = [] }) {
172
+ return (
173
+ <Box component='table' sx={{
174
+ width: '100%', borderCollapse: 'collapse', fontSize: 12, fontFamily: 'inherit',
175
+ }}>
176
+ <thead>
177
+ <tr>
178
+ {columns.map((col, i) => (
179
+ <th key={i} style={{ border: '1px solid #ccc', padding: '6px 8px',
180
+ textAlign: 'left', backgroundColor: '#f0f0f0', fontWeight: 600 }}>
181
+ {col.headerName || col.field || col.label || ''}
182
+ </th>
183
+ ))}
184
+ </tr>
185
+ </thead>
186
+ <tbody>
187
+ {rows.map((row, ri) => (
188
+ <tr key={ri}>
189
+ {columns.map((col, ci) => (
190
+ <td key={ci} style={{ border: '1px solid #ccc', padding: '5px 8px' }}>
191
+ {printCellText(row[col.field])}
192
+ </td>
193
+ ))}
194
+ </tr>
195
+ ))}
196
+ </tbody>
197
+ </Box>
198
+ )
199
+ }
200
+
201
+ // ── PrintDialog ───────────────────────────────────────────────────────────────
202
+ export default function PrintDialog({ viewerContext }) {
203
+ const [open, setOpen] = useState(false)
204
+ const [loading, setLoading] = useState(false)
205
+ const [printSchema, setPrintSchema] = useState(null)
206
+ const [printData, setPrintData] = useState({})
207
+
208
+ const { printDialogRef } = viewerContext
209
+
210
+ useEffect(() => {
211
+ if (!printDialogRef) return
212
+ printDialogRef.current = {
213
+ // Normal usage: fetch layout by ID then open
214
+ open: (layoutId, data = {}) => {
215
+ setPrintData(data)
216
+ setOpen(true)
217
+ loadLayout(layoutId)
218
+ },
219
+ // Test Print / builder usage: schema already in memory, skip the API fetch
220
+ openWithSchema: (schema, data = {}) => {
221
+ setPrintData(data)
222
+ setPrintSchema(schema)
223
+ setLoading(false)
224
+ setOpen(true)
225
+ },
226
+ close: () => setOpen(false),
227
+ }
228
+ return () => { if (printDialogRef.current) printDialogRef.current = null }
229
+ }, [printDialogRef])
230
+
231
+ const loadLayout = async (layoutId) => {
232
+ if (!layoutId) return
233
+ setLoading(true)
234
+ setPrintSchema(null)
235
+ try {
236
+ const response = await Services.GetService(
237
+ Endpoints.PrintLayout.Get.GetById, false, { id: layoutId }
238
+ )
239
+ if (response?.data?.value) setPrintSchema(JSON.parse(response.data.value))
240
+ } catch (err) {
241
+ console.error('[PrintDialog] Failed to load layout:', err)
242
+ } finally {
243
+ setLoading(false)
244
+ }
245
+ }
246
+
247
+ // Inject print CSS as soon as schema is ready so Ctrl+P also works correctly.
248
+ // CSS hides the portal on screen and hides the Dialog on print.
249
+ useEffect(() => {
250
+ if (printSchema) {
251
+ injectPrintStyle(printSchema.settings)
252
+ } else {
253
+ removePrintStyle()
254
+ }
255
+ return () => removePrintStyle()
256
+ }, [printSchema])
257
+
258
+ // ── Fill .rbb-page-number spans with real numbers before window.print() ──
259
+ //
260
+ // Strategy for fixed header/footer with page numbers:
261
+ // position:fixed elements are painted once and shown identically on every
262
+ // physical page — the browser never rerenders them per-page. So we:
263
+ // 1. Clone the fixed zone once per body-page, each with the correct number.
264
+ // 2. Position each clone absolutely inside its body-page div (which already
265
+ // has the correct padding-top/bottom so it fills one full printed page).
266
+ // 3. Inject a temporary <style> that hides the global fixed zone during print.
267
+ // 4. Restore everything via the afterprint event.
268
+ //
269
+ function injectPageNumbers() {
270
+ const portal = document.getElementById('__rbb_print_portal__')
271
+ if (!portal) return
272
+
273
+ const pages = [...portal.querySelectorAll('.rbb-print-page')]
274
+ const total = pages.length
275
+
276
+ // ── 1. Body pages — straightforward, index is known ──────────────────────
277
+ pages.forEach((pageEl, idx) => {
278
+ pageEl.querySelectorAll('.rbb-page-number').forEach(span => {
279
+ const fmt = span.dataset.format ?? 'Page {page} of {pages}'
280
+ span.textContent = fmt
281
+ .replace('{page}', String(idx + 1))
282
+ .replace('{pages}', String(total))
283
+ })
284
+ })
285
+
286
+ // ── 2. Fixed header / footer — clone per page ─────────────────────────────
287
+ const headerEl = portal.querySelector('.rbb-print-header')
288
+ const footerEl = portal.querySelector('.rbb-print-footer')
289
+ const headerHasPN = !!headerEl?.querySelector('.rbb-page-number')
290
+ const footerHasPN = !!footerEl?.querySelector('.rbb-page-number')
291
+
292
+ if (!headerHasPN && !footerHasPN) return // nothing to do
293
+
294
+ // Mark the originals with a unique hide-class so the temp style targets ONLY
295
+ // the global fixed zone — not the clones (which also carry the zone class).
296
+ const HIDE_HEADER = '__rbb_hide_header__'
297
+ const HIDE_FOOTER = '__rbb_hide_footer__'
298
+ if (headerHasPN) headerEl.classList.add(HIDE_HEADER)
299
+ if (footerHasPN) footerEl.classList.add(HIDE_FOOTER)
300
+
301
+ const tmpStyle = document.createElement('style')
302
+ tmpStyle.id = '__rbb_pn_tmp_style__'
303
+ let hideCss = '@media print {\n'
304
+ if (headerHasPN) hideCss += ` .${HIDE_HEADER} { display: none !important; }\n`
305
+ if (footerHasPN) hideCss += ` .${HIDE_FOOTER} { display: none !important; }\n`
306
+ hideCss += '}'
307
+ tmpStyle.textContent = hideCss
308
+ document.head.appendChild(tmpStyle)
309
+
310
+ // Clone into each page with the correct page number.
311
+ // Clones do NOT carry the hide-class so they remain visible in print.
312
+ pages.forEach((pageEl, idx) => {
313
+ pageEl.style.position = 'relative' // needed for absolute child positioning
314
+
315
+ if (headerHasPN) {
316
+ const clone = headerEl.cloneNode(true)
317
+ clone.classList.remove(HIDE_HEADER) // must NOT be hidden
318
+ clone.classList.add('__rbb_pn_clone__')
319
+ Object.assign(clone.style, {
320
+ position: 'absolute', top: '0', left: '0', right: '0',
321
+ display: 'block',
322
+ })
323
+ clone.querySelectorAll('.rbb-page-number').forEach(span => {
324
+ const fmt = span.dataset.format ?? 'Page {page} of {pages}'
325
+ span.textContent = fmt.replace('{page}', idx + 1).replace('{pages}', total)
326
+ })
327
+ pageEl.prepend(clone)
328
+ }
329
+
330
+ if (footerHasPN) {
331
+ const clone = footerEl.cloneNode(true)
332
+ clone.classList.remove(HIDE_FOOTER) // must NOT be hidden
333
+ clone.classList.add('__rbb_pn_clone__')
334
+ Object.assign(clone.style, {
335
+ position: 'absolute', bottom: '0', left: '0', right: '0',
336
+ display: 'block',
337
+ })
338
+ clone.querySelectorAll('.rbb-page-number').forEach(span => {
339
+ const fmt = span.dataset.format ?? 'Page {page} of {pages}'
340
+ span.textContent = fmt.replace('{page}', idx + 1).replace('{pages}', total)
341
+ })
342
+ pageEl.appendChild(clone)
343
+ }
344
+ })
345
+
346
+ // ── 3. Restore after print ────────────────────────────────────────────────
347
+ const cleanup = () => {
348
+ document.getElementById('__rbb_pn_tmp_style__')?.remove()
349
+ portal.querySelectorAll('.__rbb_pn_clone__').forEach(el => el.remove())
350
+ headerEl?.classList.remove('__rbb_hide_header__')
351
+ footerEl?.classList.remove('__rbb_hide_footer__')
352
+ pages.forEach(p => p.style.removeProperty('position'))
353
+ window.removeEventListener('afterprint', cleanup)
354
+ }
355
+ window.addEventListener('afterprint', cleanup)
356
+ }
357
+
358
+ const handlePrint = () => {
359
+ // Re-inject with latest settings, close the dialog so it leaves the DOM,
360
+ // then fire window.print() after the MUI exit animation (~300 ms).
361
+ injectPrintStyle(printSchema?.settings)
362
+ setOpen(false)
363
+ setTimeout(() => {
364
+ injectPageNumbers()
365
+ window.print()
366
+ }, 350)
367
+ }
368
+
369
+ // ── Shared viewerContext for all rendered zones ────────────────────────────
370
+ const makePrintViewerCtx = () => ({
371
+ ...viewerContext,
372
+ data: printData,
373
+ setData: () => {},
374
+ form: {},
375
+ setForm: () => {},
376
+ mode: 'preview',
377
+ isEditMode: false,
378
+ isPreviewMode: true,
379
+ isPrintContext: true,
380
+ isPrintBuilder: false,
381
+ builderContext: null,
382
+ })
383
+
384
+ const settings = printSchema?.settings ?? {}
385
+ const hEnabled = settings.header?.enabled
386
+ const fEnabled = settings.footer?.enabled
387
+ const pageOrder = printSchema?.pageOrder ?? []
388
+ const zones = printSchema?.zones ?? {}
389
+
390
+ const printCtx = makePrintViewerCtx()
391
+
392
+ return (
393
+ <>
394
+ {/* ── Screen-preview Dialog — only mounted while open ──────────────── */}
395
+ {open && (
396
+ <Dialog open onClose={() => setOpen(false)} fullScreen
397
+ PaperProps={{ sx: { bgcolor: '#888' } }}>
398
+
399
+ {/* Toolbar */}
400
+ <Box sx={{
401
+ display: 'flex', alignItems: 'center', gap: 1,
402
+ px: 2, py: 1, bgcolor: 'background.paper',
403
+ borderBottom: '1px solid', borderColor: 'divider',
404
+ '@media print': { display: 'none' },
405
+ }}>
406
+ <Box sx={{ flex: 1, fontWeight: 600, fontSize: 14 }}>Print Preview</Box>
407
+ <Button variant='contained' startIcon={<PrintOutlined />}
408
+ onClick={handlePrint} disabled={loading || !printSchema} size='small'>
409
+ Print
410
+ </Button>
411
+ <Tooltip title='Close'>
412
+ <IconButton size='small' onClick={() => setOpen(false)}>
413
+ <CloseOutlined fontSize='small' />
414
+ </IconButton>
415
+ </Tooltip>
416
+ </Box>
417
+
418
+ {/* Screen preview */}
419
+ <DialogContent sx={{ p: 4, display: 'flex', justifyContent: 'center', overflow: 'auto', bgcolor: '#888' }}>
420
+ {loading && (
421
+ <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: 400 }}>
422
+ <CircularProgress />
423
+ </Box>
424
+ )}
425
+
426
+ {!loading && printSchema && (
427
+ <PrintPreviewCanvas
428
+ schema={printSchema}
429
+ makeViewerCtx={() => printCtx}
430
+ />
431
+ )}
432
+
433
+ {!loading && !printSchema && (
434
+ <Box sx={{ color: 'white', mt: 8 }}>Failed to load print layout.</Box>
435
+ )}
436
+ </DialogContent>
437
+ </Dialog>
438
+ )}
439
+
440
+ {/* ── Print portal — appended directly to <body>, used by window.print() ──
441
+ Hidden on screen (display:none); the @media print CSS reveals it.
442
+ position:fixed header/footer repeat on every printed page reliably. */}
443
+ {printSchema && typeof document !== 'undefined' && createPortal(
444
+ <div id='__rbb_print_portal__'>
445
+ {/* Watermark — position:fixed repeats on every printed page */}
446
+ {settings.watermark?.enabled && settings.watermark?.text && (
447
+ <div className='rbb-watermark'>{settings.watermark.text}</div>
448
+ )}
449
+
450
+ {/* Header — fixed to top of every page */}
451
+ {hEnabled && zones.header && (
452
+ <div className='rbb-print-header'>
453
+ <ComponentRenderer node={zones.header} viewerContext={printCtx} />
454
+ </div>
455
+ )}
456
+
457
+ {/* Footer — fixed to bottom of every page */}
458
+ {fEnabled && zones.footer && (
459
+ <div className='rbb-print-footer'>
460
+ <ComponentRenderer node={zones.footer} viewerContext={printCtx} />
461
+ </div>
462
+ )}
463
+
464
+ {/* Body pages — margin offset keeps content clear of fixed header/footer */}
465
+ <div className='rbb-print-body'>
466
+ {pageOrder.map((pageId) => {
467
+ const pageNode = zones[pageId]
468
+ if (!pageNode) return null
469
+ return (
470
+ <div key={pageId} className='rbb-print-page'>
471
+ <ComponentRenderer node={pageNode} viewerContext={printCtx} />
472
+ </div>
473
+ )
474
+ })}
475
+ </div>
476
+ </div>,
477
+ document.body
478
+ )}
479
+ </>
480
+ )
481
+ }
@@ -1,8 +1,11 @@
1
1
  import { Box } from '@mui/material'
2
- import { useState, useEffect } from 'react'
2
+ import { useState, useEffect, useRef, useCallback } from 'react'
3
3
  import ComponentRenderer from './ComponentRenderer'
4
+ import DialogsZone from './DialogsZone'
5
+ import PrintDialog from './PrintDialog'
4
6
  import { executeActionsByEvent } from 'services/builderHelper/actionExecutor'
5
7
  import { executeJSCode } from 'services/builderHelper/jsExecutor'
8
+ import { useTimerEngine } from 'src/hooks/useTimerEngine'
6
9
 
7
10
  /**
8
11
  * Validate form based on component validation rules
@@ -68,11 +71,41 @@ async function validateForm(root, formData) {
68
71
  *
69
72
  * @param {object} schema - The form schema
70
73
  */
71
- export default function ProductionViewer({ schema }) {
74
+ export default function ProductionViewer({ schema, stateRef }) {
72
75
  const [data, setData] = useState({})
73
76
  const [form, setForm] = useState({})
74
77
  const [validationErrors, setValidationErrors] = useState({})
75
78
 
79
+ // ── Unified ref storage ──────────────────────────────────────────────────
80
+ // dataRef : mutable non-reactive store — mutate via dataRef.current.x = y
81
+ // reportRefs : { [nodeId]: updateRef } registry; populated by ReportViewerRenderer
82
+ // dialogRefs : { [key]: { open, close } } registry; populated by DialogRenderer
83
+ const dataRef = useRef({})
84
+ const reportRefs = useRef({})
85
+ const dialogRefs = useRef({})
86
+ const printDialogRef = useRef(null)
87
+
88
+ const openDialog = useCallback((key, data) => {
89
+ const ref = dialogRefs.current[key]
90
+ if (ref) ref.open(data)
91
+ else console.warn(`[openDialog] No dialog registered with key "${key}"`)
92
+ }, [])
93
+
94
+ const closeDialog = useCallback((key) => {
95
+ const ref = dialogRefs.current[key]
96
+ if (ref) ref.close()
97
+ else console.warn(`[closeDialog] No dialog registered with key "${key}"`)
98
+ }, [])
99
+
100
+ const openPrintLayout = useCallback((layoutId, data) => {
101
+ if (printDialogRef.current) printDialogRef.current.open(layoutId, data)
102
+ else console.warn('[openPrintLayout] PrintDialog is not mounted')
103
+ }, [])
104
+
105
+ const closePrintLayout = useCallback(() => {
106
+ if (printDialogRef.current) printDialogRef.current.close()
107
+ }, [])
108
+
76
109
  // Execute onLoad actions when component mounts or schema changes
77
110
  useEffect(() => {
78
111
  // Reset form and data for fresh execution
@@ -82,12 +115,32 @@ export default function ProductionViewer({ schema }) {
82
115
 
83
116
  // Execute onLoad actions with fresh context
84
117
  if (schema?.actions && schema.actions.length > 0) {
85
- executeActionsByEvent(schema.actions, 'onLoad', { form: {}, data: {} }, setData).catch(err => {
118
+ executeActionsByEvent(schema.actions, 'onLoad', {
119
+ form: {}, data: {}, setData,
120
+ dataRef: dataRef.current, reportRefs: reportRefs.current,
121
+ }).catch(err => {
86
122
  console.error('onLoad actions error:', err)
87
123
  })
88
124
  }
89
125
  }, [schema])
90
126
 
127
+ // ── Timer engine ────────────────────────────────────────────────────────────
128
+ // Build a stable execution context object and update it on every render.
129
+ // useTimerEngine reads through a ref so timers always use fresh state without
130
+ // triggering re-registration on every data/form update.
131
+ const timerContext = {
132
+ data,
133
+ setData,
134
+ form,
135
+ dataRef: dataRef.current,
136
+ reportRefs: reportRefs.current,
137
+ openDialog,
138
+ closeDialog,
139
+ openPrintLayout,
140
+ closePrintLayout,
141
+ }
142
+ useTimerEngine({ timers: schema?.timers, context: timerContext })
143
+
91
144
  // Update form field value
92
145
  const updateFormValue = (key, value) => {
93
146
  setForm(prev => ({
@@ -104,7 +157,10 @@ export default function ProductionViewer({ schema }) {
104
157
 
105
158
  // If validation passes, execute onSubmit actions
106
159
  if (Object.keys(errors).length === 0) {
107
- await executeActionsByEvent(schema.actions, 'onSubmit', { form, data }, setData)
160
+ await executeActionsByEvent(schema.actions, 'onSubmit', {
161
+ form, data, setData,
162
+ dataRef: dataRef.current, reportRefs: reportRefs.current,
163
+ })
108
164
  return true
109
165
  }
110
166
  return false
@@ -132,7 +188,21 @@ export default function ProductionViewer({ schema }) {
132
188
  setValidationErrors,
133
189
  submitForm,
134
190
  resetForm,
135
- builderContext: null // No builder context in production
191
+ builderContext: null, // No builder context in production
192
+ // ── Unified ref storage ────────────────────────────────────────────────
193
+ dataRef, // useRef({}) — mutate via dataRef.current.x = value
194
+ reportRefs, // useRef({}) — { [nodeId]: updateRef } per ReportViewer
195
+ dialogRefs, // useRef({}) — { [key]: { open, close } } per Dialog
196
+ printDialogRef, // useRef(null) — { open(layoutId, data), close() }
197
+ openDialog,
198
+ closeDialog,
199
+ openPrintLayout,
200
+ closePrintLayout,
201
+ }
202
+
203
+ // Expose live state to the debug panel (toolbar reads this via stateRef)
204
+ if (stateRef) {
205
+ stateRef.current = { data, form, dataRef, reportRefs }
136
206
  }
137
207
 
138
208
  if (!schema?.root) {
@@ -150,6 +220,11 @@ export default function ProductionViewer({ schema }) {
150
220
  <Box sx={{ flex: 1, overflow: 'auto', p: 2 }}>
151
221
  <ComponentRenderer node={schema.root} viewerContext={viewerContext} />
152
222
  </Box>
223
+ {/* Dialogs — mounted but hidden; opened via openDialog(key) */}
224
+ <DialogsZone dialogs={schema.dialogs ?? []} viewerContext={viewerContext} />
225
+
226
+ {/* Print — mounted but hidden; opened via openPrintLayout(layoutId, data) */}
227
+ <PrintDialog viewerContext={viewerContext} />
153
228
  </Box>
154
229
  )
155
230
  }