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,627 @@
1
+ import { Box, Button, Dialog, IconButton, Tooltip, TextField, MenuItem, ToggleButton, ToggleButtonGroup } from '@mui/material'
2
+ import { useState, useRef } from 'react'
3
+ import {
4
+ DataObjectOutlined, FullscreenExitOutlined, SaveOutlined,
5
+ AddOutlined, DeleteOutlined, PrintOutlined,
6
+ DarkModeOutlined, LightModeOutlined, HistoryOutlined,
7
+ } from '@mui/icons-material'
8
+ import Editor from '@monaco-editor/react'
9
+ import ComponentRenderer from 'views/builder/viewer/ComponentRenderer'
10
+ import { useBuilder } from 'context/BuilderContext'
11
+ import { Endpoints, Services } from 'services/Endpoints'
12
+ import toast from 'react-hot-toast'
13
+ import { createEmptyNode } from 'src/pages/printBuilder/index'
14
+ import PrintDialog from 'views/builder/viewer/PrintDialog'
15
+ import PrintPreviewCanvas from 'views/printBuilder/PrintPreviewCanvas'
16
+
17
+ // ── Page-size lookup ──────────────────────────────────────────────────────────
18
+ const PAGE_SIZES = {
19
+ A4: { label: 'A4', portrait: { w: 794, h: 1123 }, landscape: { w: 1123, h: 794 } },
20
+ Letter: { label: 'US Letter', portrait: { w: 816, h: 1056 }, landscape: { w: 1056, h: 816 } },
21
+ Legal: { label: 'US Legal', portrait: { w: 816, h: 1344 }, landscape: { w: 1344, h: 816 } },
22
+ }
23
+ const mmToPx = (mm) => Math.round((mm ?? 0) * 3.7795)
24
+
25
+ // ── Zone colours ──────────────────────────────────────────────────────────────
26
+ export const ZONE_COLORS = {
27
+ header: '#1565c0',
28
+ footer: '#6a1b9a',
29
+ body: '#1b5e20',
30
+ }
31
+
32
+ // ── Save dialog ───────────────────────────────────────────────────────────────
33
+ function SaveDialog({ open, onClose, onSave, isSaving, defaultTitle }) {
34
+ const [title, setTitle] = useState(defaultTitle || '')
35
+ return (
36
+ <Dialog open={open} onClose={onClose} maxWidth='xs' fullWidth>
37
+ <Box sx={{ p: 3, display: 'flex', flexDirection: 'column', gap: 2 }}>
38
+ <Box sx={{ fontWeight: 600, fontSize: 16 }}>Save Print Layout</Box>
39
+ <TextField label='Name' value={title} onChange={e => setTitle(e.target.value)}
40
+ size='small' fullWidth autoFocus
41
+ onKeyDown={e => { if (e.key === 'Enter' && title.trim()) onSave(title.trim()) }} />
42
+ <Box sx={{ display: 'flex', gap: 1, justifyContent: 'flex-end' }}>
43
+ <Button onClick={onClose} size='small'>Cancel</Button>
44
+ <Button onClick={() => onSave(title.trim())} variant='contained' size='small'
45
+ disabled={!title.trim() || isSaving}>
46
+ {isSaving ? 'Saving…' : 'Save'}
47
+ </Button>
48
+ </Box>
49
+ </Box>
50
+ </Dialog>
51
+ )
52
+ }
53
+
54
+ // ── Zone frame (edit mode only) ────────────────────────────────────────────────
55
+ function ZoneFrame({ label, color, height, isActive, onClick, children, onDelete, canDelete }) {
56
+ return (
57
+ <Box sx={{ mb: 2, cursor: 'pointer' }} onClick={onClick}>
58
+ <Box sx={{
59
+ display: 'flex', alignItems: 'center', gap: 1,
60
+ px: 1, py: 0.5,
61
+ bgcolor: isActive ? color : '#555',
62
+ borderRadius: '4px 4px 0 0',
63
+ transition: 'background 0.15s',
64
+ }}>
65
+ <Box sx={{ fontSize: 11, fontWeight: 700, color: '#fff', letterSpacing: 0.5, flex: 1 }}>
66
+ {label}
67
+ </Box>
68
+ {isActive && (
69
+ <Box sx={{ fontSize: 9, color: 'rgba(255,255,255,0.85)', bgcolor: 'rgba(255,255,255,0.2)',
70
+ borderRadius: 0.5, px: 0.75, py: 0.25, fontWeight: 700 }}>
71
+ ACTIVE
72
+ </Box>
73
+ )}
74
+ {canDelete && onDelete && (
75
+ <Tooltip title='Delete page'>
76
+ <IconButton size='small' onClick={e => { e.stopPropagation(); onDelete() }}
77
+ sx={{ color: 'rgba(255,255,255,0.7)', p: 0.25, '&:hover': { color: '#fff' } }}>
78
+ <DeleteOutlined sx={{ fontSize: 14 }} />
79
+ </IconButton>
80
+ </Tooltip>
81
+ )}
82
+ </Box>
83
+ <Box sx={{
84
+ bgcolor: 'white',
85
+ minHeight: height ?? 80,
86
+ border: '2px solid',
87
+ borderTop: 'none',
88
+ borderColor: isActive ? color : 'transparent',
89
+ borderRadius: '0 0 4px 4px',
90
+ transition: 'border-color 0.15s',
91
+ overflow: 'hidden',
92
+ position: 'relative',
93
+ }}>
94
+ {children}
95
+ </Box>
96
+ </Box>
97
+ )
98
+ }
99
+
100
+ // ── Settings tab (exported — used by the left sidebar) ────────────────────────
101
+ export function PrintSettingsTab() {
102
+ const { schema, setSchema } = useBuilder()
103
+ const s = schema?.settings ?? {}
104
+
105
+ const set = (patch) => setSchema(prev => ({ ...prev, settings: { ...(prev.settings ?? {}), ...patch } }))
106
+ const setMargin = (k, v) => setSchema(prev => ({
107
+ ...prev,
108
+ settings: { ...(prev.settings ?? {}), margins: { ...(prev.settings?.margins ?? {}), [k]: Number(v) || 0 } },
109
+ }))
110
+ const setHeader = (patch) => setSchema(prev => ({
111
+ ...prev,
112
+ settings: { ...(prev.settings ?? {}), header: { ...(prev.settings?.header ?? {}), ...patch } },
113
+ }))
114
+ const setFooter = (patch) => setSchema(prev => ({
115
+ ...prev,
116
+ settings: { ...(prev.settings ?? {}), footer: { ...(prev.settings?.footer ?? {}), ...patch } },
117
+ }))
118
+ const setWatermark = (patch) => setSchema(prev => ({
119
+ ...prev,
120
+ settings: {
121
+ ...(prev.settings ?? {}),
122
+ watermark: { ...(prev.settings?.watermark ?? {}), ...patch },
123
+ },
124
+ }))
125
+ const setHeaderMargin = (k, v) => setSchema(prev => ({
126
+ ...prev,
127
+ settings: {
128
+ ...(prev.settings ?? {}),
129
+ header: {
130
+ ...(prev.settings?.header ?? {}),
131
+ margins: { ...(prev.settings?.header?.margins ?? { top: 0, right: 0, bottom: 0, left: 0 }), [k]: Number(v) || 0 },
132
+ },
133
+ },
134
+ }))
135
+ const setFooterMargin = (k, v) => setSchema(prev => ({
136
+ ...prev,
137
+ settings: {
138
+ ...(prev.settings ?? {}),
139
+ footer: {
140
+ ...(prev.settings?.footer ?? {}),
141
+ margins: { ...(prev.settings?.footer?.margins ?? { top: 0, right: 0, bottom: 0, left: 0 }), [k]: Number(v) || 0 },
142
+ },
143
+ },
144
+ }))
145
+
146
+ return (
147
+ <Box sx={{ p: 2, overflowY: 'auto', height: '100%', display: 'flex', flexDirection: 'column', gap: 2 }}>
148
+ <Box sx={{ fontWeight: 600, fontSize: 13 }}>Page Settings</Box>
149
+
150
+ <TextField select label='Page Size' size='small' value={s.pageSize ?? 'A4'}
151
+ onChange={e => set({ pageSize: e.target.value })}>
152
+ {Object.entries(PAGE_SIZES).map(([k, v]) => <MenuItem key={k} value={k}>{v.label}</MenuItem>)}
153
+ </TextField>
154
+
155
+ <TextField select label='Orientation' size='small' value={s.orientation ?? 'portrait'}
156
+ onChange={e => set({ orientation: e.target.value })}>
157
+ <MenuItem value='portrait'>Portrait</MenuItem>
158
+ <MenuItem value='landscape'>Landscape</MenuItem>
159
+ </TextField>
160
+
161
+ <Box sx={{ fontSize: 12, color: 'text.secondary', fontWeight: 600 }}>Body Margins (mm)</Box>
162
+ <Box sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 1 }}>
163
+ {['top', 'right', 'bottom', 'left'].map(side => (
164
+ <TextField key={side} label={side.charAt(0).toUpperCase() + side.slice(1)}
165
+ size='small' type='number' value={s.margins?.[side] ?? 0}
166
+ onChange={e => setMargin(side, e.target.value)} />
167
+ ))}
168
+ </Box>
169
+
170
+ <Box sx={{ fontSize: 12, color: ZONE_COLORS.header, fontWeight: 600 }}>Header</Box>
171
+ <Box sx={{ display: 'flex', gap: 1 }}>
172
+ <TextField select label='Enabled' size='small' sx={{ flex: 1 }}
173
+ value={s.header?.enabled ? 'yes' : 'no'}
174
+ onChange={e => setHeader({ enabled: e.target.value === 'yes' })}>
175
+ <MenuItem value='yes'>Yes</MenuItem>
176
+ <MenuItem value='no'>No</MenuItem>
177
+ </TextField>
178
+ <TextField label='Height (mm)' size='small' type='number' sx={{ flex: 1 }}
179
+ value={s.header?.height ?? 10}
180
+ onChange={e => setHeader({ height: Number(e.target.value) || 0 })} />
181
+ </Box>
182
+ <Box sx={{ fontSize: 11, color: 'text.secondary', fontWeight: 500 }}>Header Margins (mm)</Box>
183
+ <Box sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 1 }}>
184
+ {['top', 'right', 'bottom', 'left'].map(side => (
185
+ <TextField key={side} label={side.charAt(0).toUpperCase() + side.slice(1)}
186
+ size='small' type='number'
187
+ value={s.header?.margins?.[side] ?? 0}
188
+ onChange={e => setHeaderMargin(side, e.target.value)} />
189
+ ))}
190
+ </Box>
191
+
192
+ <Box sx={{ fontSize: 12, color: ZONE_COLORS.footer, fontWeight: 600 }}>Footer</Box>
193
+ <Box sx={{ display: 'flex', gap: 1 }}>
194
+ <TextField select label='Enabled' size='small' sx={{ flex: 1 }}
195
+ value={s.footer?.enabled ? 'yes' : 'no'}
196
+ onChange={e => setFooter({ enabled: e.target.value === 'yes' })}>
197
+ <MenuItem value='yes'>Yes</MenuItem>
198
+ <MenuItem value='no'>No</MenuItem>
199
+ </TextField>
200
+ <TextField label='Height (mm)' size='small' type='number' sx={{ flex: 1 }}
201
+ value={s.footer?.height ?? 10}
202
+ onChange={e => setFooter({ height: Number(e.target.value) || 0 })} />
203
+ </Box>
204
+ <Box sx={{ fontSize: 11, color: 'text.secondary', fontWeight: 500 }}>Footer Margins (mm)</Box>
205
+ <Box sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 1 }}>
206
+ {['top', 'right', 'bottom', 'left'].map(side => (
207
+ <TextField key={side} label={side.charAt(0).toUpperCase() + side.slice(1)}
208
+ size='small' type='number'
209
+ value={s.footer?.margins?.[side] ?? 0}
210
+ onChange={e => setFooterMargin(side, e.target.value)} />
211
+ ))}
212
+ </Box>
213
+
214
+ <TextField select label='Page Numbers' size='small'
215
+ value={s.footer?.showPageNumbers ? 'yes' : 'no'}
216
+ onChange={e => setFooter({ showPageNumbers: e.target.value === 'yes' })}>
217
+ <MenuItem value='yes'>Show</MenuItem>
218
+ <MenuItem value='no'>Hide</MenuItem>
219
+ </TextField>
220
+
221
+ {s.footer?.showPageNumbers && (
222
+ <>
223
+ <TextField select label='Alignment' size='small'
224
+ value={s.footer?.pageNumberAlign ?? 'center'}
225
+ onChange={e => setFooter({ pageNumberAlign: e.target.value })}>
226
+ <MenuItem value='left'>Left</MenuItem>
227
+ <MenuItem value='center'>Center</MenuItem>
228
+ <MenuItem value='right'>Right</MenuItem>
229
+ </TextField>
230
+ <TextField label='Format' size='small'
231
+ value={s.footer?.pageNumberFormat ?? 'Page {page} of {pages}'}
232
+ onChange={e => setFooter({ pageNumberFormat: e.target.value })}
233
+ helperText='Use {page} and {pages}' />
234
+ </>
235
+ )}
236
+
237
+ {/* ── Watermark ─────────────────────────────────────────────────── */}
238
+ <Box sx={{ fontSize: 12, color: 'text.secondary', fontWeight: 600, mt: 1 }}>Watermark</Box>
239
+ <TextField select label='Enabled' size='small'
240
+ value={s.watermark?.enabled ? 'yes' : 'no'}
241
+ onChange={e => setWatermark({ enabled: e.target.value === 'yes' })}>
242
+ <MenuItem value='yes'>Yes</MenuItem>
243
+ <MenuItem value='no'>No</MenuItem>
244
+ </TextField>
245
+
246
+ {s.watermark?.enabled && (
247
+ <>
248
+ <TextField label='Text' size='small'
249
+ value={s.watermark?.text ?? ''}
250
+ onChange={e => setWatermark({ text: e.target.value })}
251
+ placeholder='e.g. DRAFT, CONFIDENTIAL' />
252
+ <Box sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 1 }}>
253
+ <TextField label='Font Size (pt)' size='small' type='number'
254
+ value={s.watermark?.fontSize ?? 60}
255
+ onChange={e => setWatermark({ fontSize: Number(e.target.value) || 60 })} />
256
+ <TextField label='Angle (°)' size='small' type='number'
257
+ value={s.watermark?.angle ?? -45}
258
+ onChange={e => setWatermark({ angle: Number(e.target.value) })} />
259
+ <TextField label='Opacity (0–1)' size='small' type='number'
260
+ inputProps={{ step: 0.05, min: 0, max: 1 }}
261
+ value={s.watermark?.opacity ?? 0.1}
262
+ onChange={e => setWatermark({ opacity: Math.min(1, Math.max(0, Number(e.target.value))) })} />
263
+ <TextField label='Color' size='small'
264
+ value={s.watermark?.color ?? '#000000'}
265
+ onChange={e => setWatermark({ color: e.target.value })}
266
+ placeholder='#000000 or rgba(...)' />
267
+ </Box>
268
+ </>
269
+ )}
270
+
271
+ {/* ── Test Data ─────────────────────────────────────────────────── */}
272
+ <Box sx={{ fontSize: 12, color: 'text.secondary', fontWeight: 600, mt: 1 }}>Test Data (JSON)</Box>
273
+ <Box sx={{ fontSize: 11, color: 'text.disabled', mb: -1 }}>
274
+ Used by the Test Print button to simulate real data.
275
+ </Box>
276
+ <Box sx={{ height: 200, border: '1px solid', borderColor: 'divider', borderRadius: 1, overflow: 'hidden' }}>
277
+ <Editor
278
+ height='200px'
279
+ defaultLanguage='json'
280
+ theme='vs-dark'
281
+ value={schema?.testData ?? '{}'}
282
+ onChange={val => setSchema(prev => ({ ...prev, testData: val }))}
283
+ options={{ minimap: { enabled: false }, fontSize: 12, scrollBeyondLastLine: false }}
284
+ />
285
+ </Box>
286
+ </Box>
287
+ )
288
+ }
289
+
290
+ // ── Main viewer ───────────────────────────────────────────────────────────────
291
+ export default function PrintBuilderViewer({ metaData, onSaved, isDark, onToggleTheme }) {
292
+ const {
293
+ schema, setSchema,
294
+ selectedId, setSelectedId,
295
+ draggingNodeId, setDraggingNodeId,
296
+ data, setData, form, setForm, updateFormValue,
297
+ validationErrors, setValidationErrors,
298
+ dataRef, reportRefs, dialogRefs,
299
+ openDialog, closeDialog,
300
+ markClean,
301
+ logSchema, openSessionLog,
302
+ } = useBuilder()
303
+
304
+ const [saveOpen, setSaveOpen] = useState(false)
305
+ const [isSaving, setIsSaving] = useState(false)
306
+ const [schemaOpen, setSchemaOpen] = useState(false)
307
+ const [mode, setMode] = useState('edit')
308
+ const printDialogRef = useRef(null)
309
+
310
+ const settings = schema?.settings ?? {}
311
+ const activeZone = schema?.activeZone ?? 'body-page-0'
312
+ const pageOrder = schema?.pageOrder ?? ['body-page-0']
313
+ const zones = schema?.zones ?? {}
314
+ const m = settings.margins ?? { top: 0, right: 0, bottom: 0, left: 0 }
315
+
316
+ // ── Page dimensions ───────────────────────────────────────────────────────
317
+ const sizeConf = PAGE_SIZES[settings.pageSize] ?? PAGE_SIZES.A4
318
+ const dimConf = sizeConf[settings.orientation] ?? sizeConf.portrait
319
+ const pageW = dimConf.w
320
+ const pageH = dimConf.h
321
+ const headerH = settings.header?.enabled ? mmToPx(settings.header?.height ?? 10) : 0
322
+ const footerH = settings.footer?.enabled ? mmToPx(settings.footer?.height ?? 10) : 0
323
+ const bodyH = pageH - headerH - footerH
324
+
325
+ // ── Zone switch ───────────────────────────────────────────────────────────
326
+ // Clicking a zone frame: switch to it if not active, then always select the
327
+ // zone's root container so the Inspector opens and the user can stylize it.
328
+ const switchZone = (zoneKey) => {
329
+ if (mode === 'preview') return
330
+
331
+ // Compute the new root BEFORE the schema update (needed for setSelectedId)
332
+ const newRoot = zoneKey === activeZone
333
+ ? (schema?.root ?? createEmptyNode(zoneKey))
334
+ : (zones[zoneKey] ?? createEmptyNode(zoneKey))
335
+
336
+ if (zoneKey !== activeZone) {
337
+ setSchema(prev => ({
338
+ ...prev,
339
+ zones: { ...prev.zones, [prev.activeZone ?? zoneKey]: prev.root },
340
+ root: prev.zones?.[zoneKey] ?? createEmptyNode(zoneKey),
341
+ activeZone: zoneKey,
342
+ }))
343
+ }
344
+
345
+ // Select the zone root so the Inspector shows its Style/Main tabs immediately
346
+ setSelectedId(newRoot?.id ?? null)
347
+ }
348
+
349
+ // ── Add page ──────────────────────────────────────────────────────────────
350
+ const addPage = () => {
351
+ const newId = `body-page-${Date.now()}`
352
+ setSchema(prev => ({
353
+ ...prev,
354
+ pageOrder: [...(prev.pageOrder ?? []), newId],
355
+ zones: {
356
+ ...prev.zones,
357
+ [prev.activeZone ?? newId]: prev.root,
358
+ [newId]: createEmptyNode(newId),
359
+ },
360
+ }))
361
+ }
362
+
363
+ // ── Delete page ───────────────────────────────────────────────────────────
364
+ const deletePage = (pageId) => {
365
+ setSchema(prev => {
366
+ const order = (prev.pageOrder ?? []).filter(id => id !== pageId)
367
+ const newZones = { ...prev.zones }
368
+ delete newZones[pageId]
369
+
370
+ let newRoot = prev.root
371
+ let newActive = prev.activeZone
372
+ if (prev.activeZone === pageId) {
373
+ newActive = order[0] ?? 'body-page-0'
374
+ newRoot = newZones[newActive] ?? createEmptyNode(newActive)
375
+ }
376
+ return { ...prev, pageOrder: order, zones: newZones, root: newRoot, activeZone: newActive }
377
+ })
378
+ }
379
+
380
+ // ── viewerContext factory ─────────────────────────────────────────────────
381
+ // isPrintBuilder: true signals ReportViewerRenderer to swap to placeholder/table
382
+ const makeZoneViewerContext = (zoneKey) => ({
383
+ schema: { ...schema, root: getZoneRoot(zoneKey) },
384
+ mode,
385
+ isEditMode: mode === 'edit',
386
+ isPreviewMode: mode === 'preview',
387
+ isPrintBuilder: true,
388
+ data, setData, form, setForm, updateFormValue,
389
+ validationErrors, setValidationErrors,
390
+ submitForm: async () => {},
391
+ resetForm: () => {},
392
+ dataRef, reportRefs, dialogRefs,
393
+ openDialog, closeDialog,
394
+ builderContext: (mode === 'edit' && zoneKey === activeZone) ? {
395
+ selectedId, setSelectedId,
396
+ setSchema: (updater) => {
397
+ setSchema(prev => {
398
+ const updated = typeof updater === 'function' ? updater(prev) : updater
399
+ return {
400
+ ...prev,
401
+ zones: { ...prev.zones, [zoneKey]: updated.root },
402
+ root: updated.root,
403
+ }
404
+ })
405
+ },
406
+ draggingNodeId, setDraggingNodeId,
407
+ } : null,
408
+ })
409
+
410
+ // ── Get zone root node ────────────────────────────────────────────────────
411
+ const getZoneRoot = (zoneKey) =>
412
+ zoneKey === activeZone
413
+ ? (schema?.root ?? createEmptyNode(zoneKey))
414
+ : (zones[zoneKey] ?? createEmptyNode(zoneKey))
415
+
416
+ // ── Save ──────────────────────────────────────────────────────────────────
417
+ const handleSave = async (title) => {
418
+ if (!schema?.root) return
419
+ setIsSaving(true)
420
+ try {
421
+ const fullSchema = {
422
+ ...schema,
423
+ zones: { ...schema.zones, [activeZone]: schema.root },
424
+ }
425
+ const value = JSON.stringify(fullSchema)
426
+ const response = metaData?.id
427
+ ? await Services.UpdateService(Endpoints.PrintLayout.Put.Update, true, { id: metaData.id, title, value })
428
+ : await Services.PostService(Endpoints.PrintLayout.Post.Add, true, { title, value })
429
+ if (response) {
430
+ setSaveOpen(false); markClean(); onSaved?.(response)
431
+ // Capture this save as a future training example. Prompt left empty —
432
+ // developers fill it in via the Session Logs dialog.
433
+ try {
434
+ logSchema({
435
+ builder: 'print',
436
+ trigger: 'save',
437
+ title,
438
+ viewMetaData: { id: metaData?.id ?? response?.data?.id, title },
439
+ schema: fullSchema
440
+ })
441
+ } catch (e) { console.warn('[sessionLog] log on save failed:', e) }
442
+ }
443
+ } catch { toast.error('Failed to save') }
444
+ finally { setIsSaving(false) }
445
+ }
446
+
447
+ if (!schema?.root) return null
448
+
449
+ const headerRoot = getZoneRoot('header')
450
+ const footerRoot = getZoneRoot('footer')
451
+
452
+ return (
453
+ <Box sx={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
454
+
455
+ {/* ── Toolbar ───────────────────────────────────────────────────────── */}
456
+ <Box sx={{
457
+ p: 1, borderBottom: '1px solid', borderColor: 'divider',
458
+ bgcolor: 'background.paper', display: 'flex', alignItems: 'center', gap: 1,
459
+ position: 'relative', flexShrink: 0,
460
+ }}>
461
+ <Box sx={{ fontSize: 13, fontWeight: 600, color: 'text.secondary' }}>
462
+ Print Layout Builder
463
+ </Box>
464
+ <Box sx={{ flex: 1 }} />
465
+
466
+ {/* Edit / Preview toggle */}
467
+ <ToggleButtonGroup value={mode} exclusive size='small'
468
+ onChange={(_, v) => { if (v) { setMode(v); setSelectedId(null) } }}>
469
+ <ToggleButton value='edit'>Edit</ToggleButton>
470
+ <ToggleButton value='preview'>Preview</ToggleButton>
471
+ </ToggleButtonGroup>
472
+
473
+ {/* Theme toggle */}
474
+ {onToggleTheme && (
475
+ <Tooltip title={isDark ? 'Switch to light mode' : 'Switch to dark mode'}>
476
+ <IconButton size='small' onClick={onToggleTheme} sx={{ color: 'text.secondary' }}>
477
+ {isDark ? <LightModeOutlined fontSize='small' /> : <DarkModeOutlined fontSize='small' />}
478
+ </IconButton>
479
+ </Tooltip>
480
+ )}
481
+
482
+ <Tooltip title='Session Logs (training data)'>
483
+ <IconButton size='small' onClick={openSessionLog} sx={{ color: 'text.secondary' }}>
484
+ <HistoryOutlined fontSize='small' />
485
+ </IconButton>
486
+ </Tooltip>
487
+ <Tooltip title='Preview Schema (JSON)'>
488
+ <IconButton size='small' onClick={() => setSchemaOpen(true)}>
489
+ <DataObjectOutlined fontSize='small' />
490
+ </IconButton>
491
+ </Tooltip>
492
+ <Tooltip title='Test Print — uses Test Data from Settings tab'>
493
+ <Button size='small' variant='outlined' startIcon={<PrintOutlined />}
494
+ onClick={() => {
495
+ // Persist active zone first, then open dialog with the full schema inline
496
+ const fullSchema = {
497
+ ...schema,
498
+ zones: { ...schema.zones, [activeZone]: schema.root },
499
+ }
500
+ let testData = {}
501
+ try { testData = JSON.parse(schema?.testData ?? '{}') } catch { /* ignore */ }
502
+ // Feed the schema directly into the dialog via a synthetic load
503
+ if (printDialogRef.current) {
504
+ printDialogRef.current.openWithSchema(fullSchema, testData)
505
+ }
506
+ }}>
507
+ Test Print
508
+ </Button>
509
+ </Tooltip>
510
+ <Button size='small' variant='contained' startIcon={<SaveOutlined />}
511
+ onClick={() => setSaveOpen(true)}>
512
+ Save
513
+ </Button>
514
+ </Box>
515
+
516
+ {/* ── Canvas ────────────────────────────────────────────────────────── */}
517
+ <Box sx={{ flex: 1, overflow: 'auto', bgcolor: isDark ? '#2a2d32' : '#888', py: 4, px: 3 }}>
518
+
519
+ {/* ── EDIT MODE ── zone frames with labels ── */}
520
+ {mode === 'edit' && (
521
+ <Box sx={{ width: pageW, mx: 'auto' }}>
522
+
523
+ {settings.header?.enabled && (
524
+ <ZoneFrame
525
+ label={`Header — ${settings.header?.height ?? 10} mm`}
526
+ color={ZONE_COLORS.header}
527
+ height={Math.max(headerH, 60)}
528
+ isActive={activeZone === 'header'}
529
+ onClick={() => switchZone('header')}
530
+ >
531
+ {(() => {
532
+ const hm = settings.header?.margins ?? { top: 0, right: 0, bottom: 0, left: 0 }
533
+ return (
534
+ <Box sx={{ pt: `${mmToPx(hm.top)}px`, pr: `${mmToPx(hm.right)}px`, pb: `${mmToPx(hm.bottom)}px`, pl: `${mmToPx(hm.left)}px` }}>
535
+ <ComponentRenderer node={headerRoot} viewerContext={makeZoneViewerContext('header')} />
536
+ </Box>
537
+ )
538
+ })()}
539
+ </ZoneFrame>
540
+ )}
541
+
542
+ {pageOrder.map((pageId, idx) => {
543
+ const pageRoot = getZoneRoot(pageId)
544
+ return (
545
+ <ZoneFrame key={pageId}
546
+ label={`Page ${idx + 1}`}
547
+ color={ZONE_COLORS.body}
548
+ height={Math.max(bodyH, 120)}
549
+ isActive={activeZone === pageId}
550
+ onClick={() => switchZone(pageId)}
551
+ canDelete={pageOrder.length > 1}
552
+ onDelete={() => deletePage(pageId)}
553
+ >
554
+ <Box sx={{ p: `${mmToPx(m.top)}px ${mmToPx(m.right)}px ${mmToPx(m.bottom)}px ${mmToPx(m.left)}px` }}>
555
+ <ComponentRenderer
556
+ node={pageRoot}
557
+ viewerContext={makeZoneViewerContext(pageId)}
558
+ />
559
+ </Box>
560
+ </ZoneFrame>
561
+ )
562
+ })}
563
+
564
+ <Box sx={{ display: 'flex', justifyContent: 'center', mb: 2 }}>
565
+ <Button size='small' startIcon={<AddOutlined />} onClick={addPage} variant='outlined'
566
+ sx={{ borderColor: '#aaa', color: '#fff', '&:hover': { borderColor: '#fff' } }}>
567
+ Add Page
568
+ </Button>
569
+ </Box>
570
+
571
+ {settings.footer?.enabled && (
572
+ <ZoneFrame
573
+ label={`Footer — ${settings.footer?.height ?? 10} mm${settings.footer?.showPageNumbers ? ' · Page numbers ON' : ''}`}
574
+ color={ZONE_COLORS.footer}
575
+ height={Math.max(footerH, 60)}
576
+ isActive={activeZone === 'footer'}
577
+ onClick={() => switchZone('footer')}
578
+ >
579
+ {(() => {
580
+ const fm = settings.footer?.margins ?? { top: 0, right: 0, bottom: 0, left: 0 }
581
+ return (
582
+ <Box sx={{ pt: `${mmToPx(fm.top)}px`, pr: `${mmToPx(fm.right)}px`, pb: `${mmToPx(fm.bottom)}px`, pl: `${mmToPx(fm.left)}px` }}>
583
+ <ComponentRenderer node={footerRoot} viewerContext={makeZoneViewerContext('footer')} />
584
+ </Box>
585
+ )
586
+ })()}
587
+ </ZoneFrame>
588
+ )}
589
+ </Box>
590
+ )}
591
+
592
+ {/* ── PREVIEW MODE ── identical to the PrintDialog screen preview ── */}
593
+ {mode === 'preview' && (
594
+ <PrintPreviewCanvas schema={schema} makeViewerCtx={makeZoneViewerContext} />
595
+ )}
596
+ </Box>
597
+
598
+ {/* ── Dialogs ───────────────────────────────────────────────────────── */}
599
+ <SaveDialog open={saveOpen} onClose={() => setSaveOpen(false)}
600
+ onSave={handleSave} isSaving={isSaving} defaultTitle={metaData?.title || ''} />
601
+
602
+ {/* PrintDialog mounted here for Test Print — receives a special viewerContext with the ref */}
603
+ <PrintDialog viewerContext={{ printDialogRef, data: {}, setData: () => {}, form: {}, setForm: () => {}, mode: 'preview', isEditMode: false, isPreviewMode: true, isPrintContext: true }} />
604
+
605
+ <Dialog open={schemaOpen} onClose={() => setSchemaOpen(false)} fullScreen
606
+ PaperProps={{ sx: { bgcolor: '#1e1e1e' } }}>
607
+ <Box sx={{ display: 'flex', alignItems: 'center', bgcolor: '#252526',
608
+ borderBottom: '1px solid #1a1a1a', px: 1.5, py: 0.5, gap: 1 }}>
609
+ <Box sx={{ color: '#ccc', fontSize: 13, fontFamily: 'monospace', flex: 1 }}>
610
+ printLayout.json
611
+ </Box>
612
+ <Tooltip title='Close'>
613
+ <IconButton size='small' onClick={() => setSchemaOpen(false)}
614
+ sx={{ color: '#aaa', '&:hover': { color: '#fff' } }}>
615
+ <FullscreenExitOutlined fontSize='small' />
616
+ </IconButton>
617
+ </Tooltip>
618
+ </Box>
619
+ <Box sx={{ flex: 1, minHeight: 0, height: 'calc(100vh - 40px)' }}>
620
+ <Editor height='100%' defaultLanguage='json' theme='vs-dark'
621
+ value={schema ? JSON.stringify({ ...schema, zones: { ...schema.zones, [activeZone]: schema.root } }, null, 2) : '{}'}
622
+ options={{ readOnly: true, minimap: { enabled: true } }} />
623
+ </Box>
624
+ </Dialog>
625
+ </Box>
626
+ )
627
+ }