robobyte-front-builder 1.0.19 → 1.0.23

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