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
@@ -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
  }