robobyte-front-builder 1.0.19 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (513) hide show
  1. package/README.md +211 -0
  2. package/next.config.js +19 -48
  3. package/package.json +39 -85
  4. package/src/context/BuilderContext.jsx +134 -6
  5. package/src/context/SystemContext.js +2 -2
  6. package/src/hooks/useGlobalStore.js +36 -0
  7. package/src/hooks/useTimerEngine.js +54 -0
  8. package/src/lib/index.js +11 -3
  9. package/src/lib/layouts/BlankLayout.jsx +13 -0
  10. package/src/lib/providers/RoboByteFrontBuilderProvider.jsx +61 -7
  11. package/src/lib/themes/builderTheme.js +41 -0
  12. package/src/pages/_app.js +32 -134
  13. package/src/pages/api/ai.js +87 -0
  14. package/src/pages/builders/report/index.js +1 -0
  15. package/src/pages/builders/report/list/index.js +1 -0
  16. package/src/pages/builders/report/viewer/index.js +1 -0
  17. package/src/pages/index.js +88 -37
  18. package/src/pages/printBuilder/index.jsx +263 -0
  19. package/src/pages/printBuilder/layouts/index.jsx +298 -0
  20. package/src/pages/reportModule/reportBuilder/index.js +8 -6
  21. package/src/pages/reportModule/reportBuilder/reportViewer/index.js +33 -22
  22. package/src/pages/reportModule/reportBuilder/reports/index.js +3 -5
  23. package/src/pages/reportModule/reportBuilder/reportsPermissions/index.js +2 -3
  24. package/src/pages/viewBuilder/index.jsx +117 -32
  25. package/src/pages/viewBuilder/views/index.js +3 -3
  26. package/src/pages/viewer/[id]/index.js +2 -1
  27. package/src/services/DeleteService.js +31 -60
  28. package/src/services/Endpoints/PrintLayoutEndpoints.js +42 -0
  29. package/src/services/Endpoints.js +2 -0
  30. package/src/services/GetService.js +33 -54
  31. package/src/services/PatchService.js +38 -65
  32. package/src/services/PostService.js +37 -63
  33. package/src/services/UpdateService.js +39 -65
  34. package/src/services/builderHelper/actionExecutor.js +141 -25
  35. package/src/services/builderHelper/builderHelper.js +92 -0
  36. package/src/services/builderHelper/colorSchema.js +95 -0
  37. package/src/services/builderHelper/iconResolver.js +50 -0
  38. package/src/services/builderHelper/jsExecutor.js +212 -46
  39. package/src/services/builderHelper/nodeFactory.js +32 -15
  40. package/src/services/builderHelper/numberFormat.js +123 -0
  41. package/src/services/builderHelper/resolveProps.js +73 -4
  42. package/src/services/builderHelper/thresholdEngine.js +77 -0
  43. package/src/services/builderHelper/tree.js +31 -0
  44. package/src/services/components/agGridAutoComplete.js +5 -9
  45. package/src/services/config.js +9 -1
  46. package/src/services/globalStore.js +80 -0
  47. package/src/services/helper/multiSelectEditor.js +5 -9
  48. package/src/services/helper/multiSelectEditorByBuilder.js +5 -9
  49. package/src/services/reportData/fetchReportData.js +69 -28
  50. package/src/services/routerRef.js +35 -0
  51. package/src/views/ConfirmDialog.js +2 -2
  52. package/src/views/builder/JSEditor.js +105 -107
  53. package/src/views/builder/inspector/Inspector.jsx +6 -9
  54. package/src/views/builder/inspector/Tabs/ComponentActionsTab.jsx +7 -13
  55. package/src/views/builder/inspector/Tabs/MainTab.jsx +143 -25
  56. package/src/views/builder/inspector/Tabs/RulesTab.jsx +9 -24
  57. package/src/views/builder/inspector/Tabs/StyleTab.jsx +9 -24
  58. package/src/views/builder/inspector/definitions/autocomplete/main.js +4 -6
  59. package/src/views/builder/inspector/definitions/banner/actions.js +7 -0
  60. package/src/views/builder/inspector/definitions/banner/main.js +22 -0
  61. package/src/views/builder/inspector/definitions/banner/rules.js +1 -0
  62. package/src/views/builder/inspector/definitions/banner/style.js +1 -0
  63. package/src/views/builder/inspector/definitions/breadcrumb/main.js +43 -6
  64. package/src/views/builder/inspector/definitions/button/main.js +11 -12
  65. package/src/views/builder/inspector/definitions/button/style.js +18 -30
  66. package/src/views/builder/inspector/definitions/checkbox/actions.js +3 -1
  67. package/src/views/builder/inspector/definitions/checkbox/main.js +4 -6
  68. package/src/views/builder/inspector/definitions/common/main.js +13 -2
  69. package/src/views/builder/inspector/definitions/dataGrid/main.js +23 -0
  70. package/src/views/builder/inspector/definitions/dataTableViewer/main.js +46 -0
  71. package/src/views/builder/inspector/definitions/datepicker/actions.js +3 -1
  72. package/src/views/builder/inspector/definitions/datepicker/main.js +6 -14
  73. package/src/views/builder/inspector/definitions/dialog/main.js +36 -0
  74. package/src/views/builder/inspector/definitions/dropdown/main.js +5 -8
  75. package/src/views/builder/inspector/definitions/excelUpload/actions.js +23 -0
  76. package/src/views/builder/inspector/definitions/excelUpload/main.js +17 -0
  77. package/src/views/builder/inspector/definitions/excelUpload/rules.js +1 -0
  78. package/src/views/builder/inspector/definitions/excelUpload/style.js +45 -0
  79. package/src/views/builder/inspector/definitions/header/main.js +10 -1
  80. package/src/views/builder/inspector/definitions/index.js +106 -19
  81. package/src/views/builder/inspector/definitions/input/actions.js +4 -1
  82. package/src/views/builder/inspector/definitions/input/main.js +20 -11
  83. package/src/views/builder/inspector/definitions/kpi/avatarGroup.js +22 -0
  84. package/src/views/builder/inspector/definitions/kpi/badge.js +17 -0
  85. package/src/views/builder/inspector/definitions/kpi/bulletChart.js +47 -0
  86. package/src/views/builder/inspector/definitions/kpi/chart.js +55 -0
  87. package/src/views/builder/inspector/definitions/kpi/colorScale.js +60 -0
  88. package/src/views/builder/inspector/definitions/kpi/comparisonBars.js +41 -0
  89. package/src/views/builder/inspector/definitions/kpi/countdown.js +46 -0
  90. package/src/views/builder/inspector/definitions/kpi/donut.js +51 -0
  91. package/src/views/builder/inspector/definitions/kpi/funnel.js +25 -0
  92. package/src/views/builder/inspector/definitions/kpi/gauge.js +39 -0
  93. package/src/views/builder/inspector/definitions/kpi/heatmapGrid.js +96 -0
  94. package/src/views/builder/inspector/definitions/kpi/iconBox.js +20 -0
  95. package/src/views/builder/inspector/definitions/kpi/metric.js +45 -0
  96. package/src/views/builder/inspector/definitions/kpi/rating.js +27 -0
  97. package/src/views/builder/inspector/definitions/kpi/statusDot.js +18 -0
  98. package/src/views/builder/inspector/definitions/kpi/stepStage.js +65 -0
  99. package/src/views/builder/inspector/definitions/kpi/tagList.js +32 -0
  100. package/src/views/builder/inspector/definitions/kpi/timeline.js +80 -0
  101. package/src/views/builder/inspector/definitions/kpi/trend.js +20 -0
  102. package/src/views/builder/inspector/definitions/label/main.js +10 -1
  103. package/src/views/builder/inspector/definitions/layout/main.js +27 -3
  104. package/src/views/builder/inspector/definitions/number/main.js +6 -14
  105. package/src/views/builder/inspector/definitions/pageNumber/main.js +21 -0
  106. package/src/views/builder/inspector/definitions/popover/main.js +71 -0
  107. package/src/views/builder/inspector/definitions/radio/main.js +5 -8
  108. package/src/views/builder/inspector/definitions/repeater/main.js +31 -0
  109. package/src/views/builder/inspector/definitions/reportViewer/main.js +15 -1
  110. package/src/views/builder/inspector/definitions/richtext/main.js +5 -8
  111. package/src/views/builder/inspector/definitions/signature/main.js +4 -1
  112. package/src/views/builder/inspector/definitions/tag/main.js +5 -8
  113. package/src/views/builder/inspector/definitions/textarea/actions.js +4 -1
  114. package/src/views/builder/inspector/definitions/textarea/main.js +5 -7
  115. package/src/views/builder/inspector/definitions/time/main.js +5 -8
  116. package/src/views/builder/inspector/definitions/toggle/main.js +5 -19
  117. package/src/views/builder/inspector/definitions/treeView/main.js +61 -0
  118. package/src/views/builder/inspector/definitions/viewRenderer/main.js +53 -0
  119. package/src/views/builder/inspector/definitions/wizard/main.js +68 -0
  120. package/src/views/builder/inspector/definitions/wizard-step/main.js +25 -0
  121. package/src/views/builder/inspector/fields/ActionsConfigEditor.jsx +426 -0
  122. package/src/views/builder/inspector/fields/ColorSchemaField.jsx +140 -0
  123. package/src/views/builder/inspector/fields/ColumnFunctionEditor.jsx +238 -0
  124. package/src/views/builder/inspector/fields/ColumnMappingEditor.jsx +105 -0
  125. package/src/views/builder/inspector/fields/ColumnsConfigEditor.jsx +506 -0
  126. package/src/views/builder/inspector/fields/DonutRingsEditorField.jsx +337 -0
  127. package/src/views/builder/inspector/fields/ExtraColsEditor.jsx +618 -0
  128. package/src/views/builder/inspector/fields/FunctionHelpPopover.jsx +295 -0
  129. package/src/views/builder/inspector/fields/IconEditor.jsx +64 -0
  130. package/src/views/builder/inspector/fields/KpiActionField.jsx +223 -0
  131. package/src/views/builder/inspector/fields/MarkersEditorField.jsx +173 -0
  132. package/src/views/builder/inspector/fields/SelectEditor.jsx +9 -5
  133. package/src/views/builder/inspector/fields/SeriesEditorField.jsx +363 -0
  134. package/src/views/builder/inspector/fields/TableColumnsEditor.jsx +104 -0
  135. package/src/views/builder/inspector/fields/ThresholdsEditor.jsx +247 -0
  136. package/src/views/builder/inspector/fields/ValueFunctionsRefPanel.jsx +217 -0
  137. package/src/views/builder/inspector/fields/columnEditorShared.jsx +217 -0
  138. package/src/views/builder/sidebar/Sidebar.jsx +4 -2
  139. package/src/views/builder/sidebar/SidebarTabs.jsx +28 -17
  140. package/src/views/builder/sidebar/tabs/ActionsTab.jsx +7 -3
  141. package/src/views/builder/sidebar/tabs/AiTab/AiPreviewDialog.jsx +193 -0
  142. package/src/views/builder/sidebar/tabs/AiTab/aiProvider.js +49 -0
  143. package/src/views/builder/sidebar/tabs/AiTab/index.jsx +409 -0
  144. package/src/views/builder/sidebar/tabs/AiTab/schemaTransformer.js +102 -0
  145. package/src/views/builder/sidebar/tabs/AiTab/schemaValidator.js +64 -0
  146. package/src/views/builder/sidebar/tabs/AiTab/systemPrompt.js +1151 -0
  147. package/src/views/builder/sidebar/tabs/Components/ComponentsTab.jsx +31 -31
  148. package/src/views/builder/sidebar/tabs/Components/componentCatalog.js +43 -21
  149. package/src/views/builder/sidebar/tabs/Components/printComponentCatalog.js +81 -0
  150. package/src/views/builder/sidebar/tabs/TimersTab.jsx +338 -0
  151. package/src/views/builder/sidebar/tabs/TreeTab.jsx +13 -4
  152. package/src/views/builder/sidebar/tabs/ViewTab.jsx +1 -1
  153. package/src/views/builder/viewer/AdornedLabel.jsx +82 -0
  154. package/src/views/builder/viewer/ComponentRenderer.jsx +98 -24
  155. package/src/views/builder/viewer/DialogsZone.jsx +259 -0
  156. package/src/views/builder/viewer/FieldLabel.jsx +106 -0
  157. package/src/views/builder/viewer/PrintDialog.jsx +481 -0
  158. package/src/views/builder/viewer/ProductionViewer.jsx +80 -5
  159. package/src/views/builder/viewer/Viewer.jsx +106 -8
  160. package/src/views/builder/viewer/ViewerComponentWrapper.jsx +61 -4
  161. package/src/views/builder/viewer/ViewerToolbar.jsx +273 -59
  162. package/src/views/builder/viewer/renderers/AutoCompleteRenderer.jsx +26 -22
  163. package/src/views/builder/viewer/renderers/AvatarGroupRenderer.jsx +112 -0
  164. package/src/views/builder/viewer/renderers/BadgeRenderer.jsx +79 -0
  165. package/src/views/builder/viewer/renderers/BannerRenderer.jsx +62 -0
  166. package/src/views/builder/viewer/renderers/BreadcrumbRenderer.jsx +203 -15
  167. package/src/views/builder/viewer/renderers/BulletChartRenderer.jsx +147 -0
  168. package/src/views/builder/viewer/renderers/ButtonRenderer.jsx +98 -39
  169. package/src/views/builder/viewer/renderers/CardRenderer.jsx +1 -1
  170. package/src/views/builder/viewer/renderers/ChartRenderer.jsx +388 -0
  171. package/src/views/builder/viewer/renderers/CheckboxRenderer.jsx +17 -9
  172. package/src/views/builder/viewer/renderers/ColorScaleRenderer.jsx +300 -0
  173. package/src/views/builder/viewer/renderers/ComparisonBarsRenderer.jsx +133 -0
  174. package/src/views/builder/viewer/renderers/ContainerRenderer.jsx +3 -1
  175. package/src/views/builder/viewer/renderers/CountdownRenderer.jsx +249 -0
  176. package/src/views/builder/viewer/renderers/DataGridRenderer.jsx +380 -0
  177. package/src/views/builder/viewer/renderers/DataTableViewerRenderer.jsx +240 -0
  178. package/src/views/builder/viewer/renderers/DatePickerRenderer.jsx +25 -24
  179. package/src/views/builder/viewer/renderers/DialogRenderer.jsx +327 -0
  180. package/src/views/builder/viewer/renderers/DividerRenderer.jsx +1 -1
  181. package/src/views/builder/viewer/renderers/DonutRenderer.jsx +294 -0
  182. package/src/views/builder/viewer/renderers/DropdownRenderer.jsx +36 -44
  183. package/src/views/builder/viewer/renderers/ExcelUploadRenderer.jsx +639 -0
  184. package/src/views/builder/viewer/renderers/FunnelRenderer.jsx +93 -0
  185. package/src/views/builder/viewer/renderers/GaugeRenderer.jsx +159 -0
  186. package/src/views/builder/viewer/renderers/HeaderRenderer.jsx +31 -9
  187. package/src/views/builder/viewer/renderers/HeatmapGridRenderer.jsx +432 -0
  188. package/src/views/builder/viewer/renderers/IconBoxRenderer.jsx +59 -0
  189. package/src/views/builder/viewer/renderers/ImageRenderer.jsx +1 -1
  190. package/src/views/builder/viewer/renderers/InputRenderer.jsx +75 -18
  191. package/src/views/builder/viewer/renderers/LabelRenderer.jsx +35 -9
  192. package/src/views/builder/viewer/renderers/LayoutCellRenderer.jsx +102 -40
  193. package/src/views/builder/viewer/renderers/LayoutContextMenu.jsx +8 -8
  194. package/src/views/builder/viewer/renderers/LayoutRenderer.jsx +48 -6
  195. package/src/views/builder/viewer/renderers/LinkRenderer.jsx +1 -1
  196. package/src/views/builder/viewer/renderers/MenuRenderer.jsx +2 -2
  197. package/src/views/builder/viewer/renderers/MetricRenderer.jsx +80 -0
  198. package/src/views/builder/viewer/renderers/NumberFormatRenderer.jsx +21 -30
  199. package/src/views/builder/viewer/renderers/PageNumberRenderer.jsx +76 -0
  200. package/src/views/builder/viewer/renderers/PopoverRenderer.jsx +350 -0
  201. package/src/views/builder/viewer/renderers/ProgressCircleRenderer.jsx +1 -1
  202. package/src/views/builder/viewer/renderers/ProgressLineRenderer.jsx +1 -1
  203. package/src/views/builder/viewer/renderers/RadioGroupRenderer.jsx +28 -39
  204. package/src/views/builder/viewer/renderers/RatingRenderer.jsx +80 -0
  205. package/src/views/builder/viewer/renderers/RepeaterRenderer.jsx +297 -38
  206. package/src/views/builder/viewer/renderers/ReportViewerRenderer.jsx +219 -5
  207. package/src/views/builder/viewer/renderers/RichTextRenderer.jsx +60 -66
  208. package/src/views/builder/viewer/renderers/RowActionsCell.jsx +308 -0
  209. package/src/views/builder/viewer/renderers/SignatureRenderer.jsx +33 -62
  210. package/src/views/builder/viewer/renderers/StatusDotRenderer.jsx +75 -0
  211. package/src/views/builder/viewer/renderers/StepStageRenderer.jsx +348 -0
  212. package/src/views/builder/viewer/renderers/TagListRenderer.jsx +115 -0
  213. package/src/views/builder/viewer/renderers/TagPickerRenderer.jsx +31 -45
  214. package/src/views/builder/viewer/renderers/TextAreaRenderer.jsx +25 -18
  215. package/src/views/builder/viewer/renderers/TextRenderer.jsx +7 -1
  216. package/src/views/builder/viewer/renderers/TimePickerRenderer.jsx +25 -24
  217. package/src/views/builder/viewer/renderers/TimelineRenderer.jsx +525 -0
  218. package/src/views/builder/viewer/renderers/ToggleRenderer.jsx +21 -27
  219. package/src/views/builder/viewer/renderers/TreeViewRenderer.jsx +832 -0
  220. package/src/views/builder/viewer/renderers/TrendRenderer.jsx +66 -0
  221. package/src/views/builder/viewer/renderers/ViewRendererRenderer.jsx +315 -0
  222. package/src/views/builder/viewer/renderers/WizardRenderer.jsx +380 -64
  223. package/src/views/builder/viewer/renderers/WizardStepRenderer.jsx +21 -12
  224. package/src/views/builder/viewer/renderers/dataGridComponents.jsx +824 -0
  225. package/src/views/customFilter/CustomFilterDialog.js +1023 -660
  226. package/src/views/customFilter/FixedFilterDialog.js +649 -0
  227. package/src/views/customFilter/SearchFilterDialog.js +248 -0
  228. package/src/views/genericTable/BuilderExpressionParams.js +3 -3
  229. package/src/views/genericTable/ColumnConfiguratorDialog.js +33 -24
  230. package/src/views/genericTable/FixedFilterDialog.js +3 -2
  231. package/src/views/genericTable/FormattingSettingsDialog.js +8 -3
  232. package/src/views/genericTable/SGrid.js +198 -97
  233. package/src/views/genericTable/SearchFilterDialog.js +3 -2
  234. package/src/views/genericTable/cellEditors/autocompleteEditor.js +5 -9
  235. package/src/views/genericTable/convertStringFunctions.js +274 -138
  236. package/src/views/genericTable/statusBar/rowCountStatusBar.js +3 -1
  237. package/src/views/genericTable/updateRefHelpers.js +9 -6
  238. package/src/views/printBuilder/PrintBuilderViewer.jsx +607 -0
  239. package/src/views/printBuilder/PrintPreviewCanvas.jsx +157 -0
  240. package/src/views/rolePermissions/UpdateReportPermissionDialog.js +3 -2
  241. package/src/@core/components/auth/AclGuard.js +0 -55
  242. package/src/@core/components/auth/AuthGuard.js +0 -40
  243. package/src/@core/components/auth/GuestGuard.js +0 -30
  244. package/src/@core/components/custom-inputs/Horizontal.jsx +0 -143
  245. package/src/@core/components/custom-inputs/Image.jsx +0 -78
  246. package/src/@core/components/custom-inputs/Vertical.jsx +0 -113
  247. package/src/@core/components/customizer/index.jsx +0 -470
  248. package/src/@core/components/customizer/styles.module.css +0 -169
  249. package/src/@core/components/mui/Avatar.jsx +0 -41
  250. package/src/@core/components/mui/Badge.jsx +0 -20
  251. package/src/@core/components/mui/IconButton.jsx +0 -74
  252. package/src/@core/components/mui/TabList.jsx +0 -60
  253. package/src/@core/components/option-menu/index.jsx +0 -137
  254. package/src/@core/components/scroll-to-top/index.jsx +0 -43
  255. package/src/@core/components/spinner/index.js +0 -26
  256. package/src/@core/components/window-wrapper/index.js +0 -27
  257. package/src/@core/contexts/settingsContext.jsx +0 -98
  258. package/src/@core/hooks/useBgColor.js +0 -63
  259. package/src/@core/hooks/useImageVariant.js +0 -27
  260. package/src/@core/hooks/useLayoutInit.js +0 -37
  261. package/src/@core/hooks/useObjectCookie.js +0 -18
  262. package/src/@core/hooks/useSettings.jsx +0 -15
  263. package/src/@core/layouts/BlankLayout.js +0 -37
  264. package/src/@core/layouts/BlankLayoutWithAppBar.js +0 -51
  265. package/src/@core/layouts/HorizontalLayout.jsx +0 -151
  266. package/src/@core/layouts/Layout.js +0 -39
  267. package/src/@core/layouts/VerticalLayout.jsx +0 -124
  268. package/src/@core/layouts/components/blank-layout-with-appBar/index.js +0 -115
  269. package/src/@core/layouts/components/horizontal/app-bar-content/index.js +0 -67
  270. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavGroup.js +0 -352
  271. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavItems.js +0 -21
  272. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavLink.js +0 -195
  273. package/src/@core/layouts/components/horizontal/navigation/index.js +0 -31
  274. package/src/@core/layouts/components/shared-components/LanguageDropdown.js +0 -96
  275. package/src/@core/layouts/components/shared-components/ModeToggler.js +0 -32
  276. package/src/@core/layouts/components/shared-components/NotificationDropdown.js +0 -226
  277. package/src/@core/layouts/components/shared-components/UserDropdown.js +0 -177
  278. package/src/@core/layouts/components/shared-components/footer/FooterContent.js +0 -46
  279. package/src/@core/layouts/components/shared-components/footer/index.js +0 -61
  280. package/src/@core/layouts/components/vertical/appBar/index.js +0 -74
  281. package/src/@core/layouts/components/vertical/navigation/Drawer.js +0 -122
  282. package/src/@core/layouts/components/vertical/navigation/VerticalNavGroup.js +0 -435
  283. package/src/@core/layouts/components/vertical/navigation/VerticalNavHeader.js +0 -180
  284. package/src/@core/layouts/components/vertical/navigation/VerticalNavItems.js +0 -26
  285. package/src/@core/layouts/components/vertical/navigation/VerticalNavLink.js +0 -258
  286. package/src/@core/layouts/components/vertical/navigation/VerticalNavSectionTitle.js +0 -102
  287. package/src/@core/layouts/components/vertical/navigation/index.js +0 -169
  288. package/src/@core/layouts/utils.js +0 -69
  289. package/src/@core/styles/Table.module.css +0 -93
  290. package/src/@core/styles/horizontal/menuItemStyles.js +0 -100
  291. package/src/@core/styles/horizontal/menuRootStyles.js +0 -19
  292. package/src/@core/styles/libs/fullcalendar/index.js +0 -461
  293. package/src/@core/styles/libs/keen-slider/index.js +0 -111
  294. package/src/@core/styles/libs/react-apexcharts/index.js +0 -107
  295. package/src/@core/styles/libs/react-cleave/index.js +0 -33
  296. package/src/@core/styles/libs/react-credit-cards/index.js +0 -11
  297. package/src/@core/styles/libs/react-datepicker/index.js +0 -388
  298. package/src/@core/styles/libs/react-draft-wysiwyg/index.js +0 -144
  299. package/src/@core/styles/libs/react-dropzone/index.js +0 -76
  300. package/src/@core/styles/libs/react-hot-toast/index.js +0 -37
  301. package/src/@core/styles/libs/recharts/index.js +0 -47
  302. package/src/@core/styles/stepper.js +0 -103
  303. package/src/@core/styles/vertical/menuItemStyles.js +0 -138
  304. package/src/@core/styles/vertical/menuSectionStyles.js +0 -54
  305. package/src/@core/styles/vertical/navigationCustomStyles.js +0 -62
  306. package/src/@core/svg/ContentCompact.jsx +0 -17
  307. package/src/@core/svg/ContentWide.jsx +0 -17
  308. package/src/@core/svg/DirectionLtr.jsx +0 -93
  309. package/src/@core/svg/DirectionRtl.jsx +0 -93
  310. package/src/@core/svg/LayoutCollapsed.jsx +0 -59
  311. package/src/@core/svg/LayoutHorizontal.jsx +0 -42
  312. package/src/@core/svg/LayoutVertical.jsx +0 -59
  313. package/src/@core/svg/Logo.jsx +0 -76
  314. package/src/@core/svg/SkinBordered.jsx +0 -54
  315. package/src/@core/svg/SkinDefault.jsx +0 -59
  316. package/src/@core/tailwind/plugin.js +0 -78
  317. package/src/@core/theme/ThemeComponent.js +0 -63
  318. package/src/@core/theme/ThemeOptions.js +0 -71
  319. package/src/@core/theme/breakpoints/index.js +0 -11
  320. package/src/@core/theme/colorSchemes.js +0 -326
  321. package/src/@core/theme/customShadows.js +0 -11
  322. package/src/@core/theme/globalStyles.js +0 -81
  323. package/src/@core/theme/index.js +0 -42
  324. package/src/@core/theme/overrides/accordion.js +0 -51
  325. package/src/@core/theme/overrides/accordion.jsx +0 -85
  326. package/src/@core/theme/overrides/alerts.js +0 -110
  327. package/src/@core/theme/overrides/alerts.jsx +0 -180
  328. package/src/@core/theme/overrides/autocomplete.js +0 -14
  329. package/src/@core/theme/overrides/autocomplete.jsx +0 -68
  330. package/src/@core/theme/overrides/avatar.js +0 -38
  331. package/src/@core/theme/overrides/avatars.js +0 -27
  332. package/src/@core/theme/overrides/backdrop.js +0 -22
  333. package/src/@core/theme/overrides/badges.js +0 -16
  334. package/src/@core/theme/overrides/breadcrumbs.js +0 -11
  335. package/src/@core/theme/overrides/button-group.js +0 -84
  336. package/src/@core/theme/overrides/button.js +0 -93
  337. package/src/@core/theme/overrides/buttonGroup.js +0 -9
  338. package/src/@core/theme/overrides/card.js +0 -83
  339. package/src/@core/theme/overrides/checkbox.jsx +0 -95
  340. package/src/@core/theme/overrides/chip.js +0 -72
  341. package/src/@core/theme/overrides/dataGrid.js +0 -114
  342. package/src/@core/theme/overrides/dateTimePicker.js +0 -65
  343. package/src/@core/theme/overrides/dialog.js +0 -120
  344. package/src/@core/theme/overrides/divider.js +0 -13
  345. package/src/@core/theme/overrides/drawer.js +0 -20
  346. package/src/@core/theme/overrides/fab.js +0 -13
  347. package/src/@core/theme/overrides/form-control-label.js +0 -19
  348. package/src/@core/theme/overrides/icon-button.js +0 -145
  349. package/src/@core/theme/overrides/index.js +0 -103
  350. package/src/@core/theme/overrides/input.js +0 -72
  351. package/src/@core/theme/overrides/link.js +0 -9
  352. package/src/@core/theme/overrides/list.js +0 -44
  353. package/src/@core/theme/overrides/menu.js +0 -25
  354. package/src/@core/theme/overrides/pagination.js +0 -41
  355. package/src/@core/theme/overrides/paper.js +0 -9
  356. package/src/@core/theme/overrides/popover.js +0 -16
  357. package/src/@core/theme/overrides/progress.js +0 -38
  358. package/src/@core/theme/overrides/radio.jsx +0 -80
  359. package/src/@core/theme/overrides/rating.js +0 -16
  360. package/src/@core/theme/overrides/rating.jsx +0 -32
  361. package/src/@core/theme/overrides/select.js +0 -19
  362. package/src/@core/theme/overrides/select.jsx +0 -52
  363. package/src/@core/theme/overrides/slider.js +0 -97
  364. package/src/@core/theme/overrides/snackbar.js +0 -19
  365. package/src/@core/theme/overrides/switch.js +0 -73
  366. package/src/@core/theme/overrides/switches.js +0 -25
  367. package/src/@core/theme/overrides/table-pagination.js +0 -39
  368. package/src/@core/theme/overrides/table.js +0 -81
  369. package/src/@core/theme/overrides/tabs.js +0 -30
  370. package/src/@core/theme/overrides/timeline.js +0 -80
  371. package/src/@core/theme/overrides/toggle-button.js +0 -33
  372. package/src/@core/theme/overrides/toggleButton.js +0 -16
  373. package/src/@core/theme/overrides/tooltip.js +0 -21
  374. package/src/@core/theme/overrides/typography.js +0 -13
  375. package/src/@core/theme/palette/index.js +0 -107
  376. package/src/@core/theme/shadows/index.js +0 -61
  377. package/src/@core/theme/shadows.js +0 -12
  378. package/src/@core/theme/spacing/index.js +0 -3
  379. package/src/@core/theme/spacing.js +0 -5
  380. package/src/@core/theme/typography/index.js +0 -65
  381. package/src/@core/theme/typography.js +0 -84
  382. package/src/@core/utils/create-emotion-cache.js +0 -5
  383. package/src/@core/utils/hex-to-rgba.js +0 -11
  384. package/src/@core/utils/serverHelpers.js +0 -45
  385. package/src/@menu/components/RouterLink.jsx +0 -18
  386. package/src/@menu/components/horizontal-menu/HorizontalNav.jsx +0 -88
  387. package/src/@menu/components/horizontal-menu/Menu.jsx +0 -83
  388. package/src/@menu/components/horizontal-menu/MenuButton.jsx +0 -100
  389. package/src/@menu/components/horizontal-menu/MenuItem.jsx +0 -183
  390. package/src/@menu/components/horizontal-menu/SubMenu.jsx +0 -418
  391. package/src/@menu/components/horizontal-menu/SubMenuContent.jsx +0 -41
  392. package/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.jsx +0 -20
  393. package/src/@menu/components/vertical-menu/Menu.jsx +0 -161
  394. package/src/@menu/components/vertical-menu/MenuButton.jsx +0 -95
  395. package/src/@menu/components/vertical-menu/MenuItem.jsx +0 -180
  396. package/src/@menu/components/vertical-menu/MenuSection.jsx +0 -124
  397. package/src/@menu/components/vertical-menu/NavCollapseIcons.jsx +0 -70
  398. package/src/@menu/components/vertical-menu/NavHeader.jsx +0 -39
  399. package/src/@menu/components/vertical-menu/SubMenu.jsx +0 -420
  400. package/src/@menu/components/vertical-menu/SubMenuContent.jsx +0 -101
  401. package/src/@menu/components/vertical-menu/VerticalNav.jsx +0 -216
  402. package/src/@menu/contexts/horizontalNavContext.jsx +0 -29
  403. package/src/@menu/contexts/verticalNavContext.jsx +0 -65
  404. package/src/@menu/defaultConfigs.js +0 -12
  405. package/src/@menu/hooks/useHorizontalMenu.jsx +0 -19
  406. package/src/@menu/hooks/useHorizontalNav.jsx +0 -19
  407. package/src/@menu/hooks/useMediaQuery.jsx +0 -29
  408. package/src/@menu/hooks/useVerticalMenu.jsx +0 -19
  409. package/src/@menu/hooks/useVerticalNav.jsx +0 -19
  410. package/src/@menu/horizontal-menu/index.jsx +0 -8
  411. package/src/@menu/styles/StyledBackdrop.jsx +0 -15
  412. package/src/@menu/styles/StyledMenuIcon.jsx +0 -12
  413. package/src/@menu/styles/StyledMenuLabel.jsx +0 -16
  414. package/src/@menu/styles/StyledMenuPrefix.jsx +0 -10
  415. package/src/@menu/styles/StyledMenuSectionLabel.jsx +0 -21
  416. package/src/@menu/styles/StyledMenuSuffix.jsx +0 -10
  417. package/src/@menu/styles/StyledSubMenuContent.jsx +0 -43
  418. package/src/@menu/styles/horizontal/StyledHorizontalMenu.jsx +0 -13
  419. package/src/@menu/styles/horizontal/StyledHorizontalMenuItem.jsx +0 -26
  420. package/src/@menu/styles/horizontal/StyledHorizontalNav.jsx +0 -11
  421. package/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.jsx +0 -33
  422. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.jsx +0 -18
  423. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.jsx +0 -10
  424. package/src/@menu/styles/horizontal/horizontalUl.module.css +0 -15
  425. package/src/@menu/styles/styles.module.css +0 -5
  426. package/src/@menu/styles/vertical/StyledVerticalMenu.jsx +0 -16
  427. package/src/@menu/styles/vertical/StyledVerticalMenuItem.jsx +0 -28
  428. package/src/@menu/styles/vertical/StyledVerticalMenuSection.jsx +0 -23
  429. package/src/@menu/styles/vertical/StyledVerticalNav.jsx +0 -67
  430. package/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.jsx +0 -15
  431. package/src/@menu/styles/vertical/StyledVerticalNavContainer.jsx +0 -23
  432. package/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.jsx +0 -25
  433. package/src/@menu/styles/vertical/verticalNavBgImage.module.css +0 -10
  434. package/src/@menu/svg/ChevronRight.jsx +0 -9
  435. package/src/@menu/svg/Close.jsx +0 -12
  436. package/src/@menu/svg/RadioCircle.jsx +0 -12
  437. package/src/@menu/svg/RadioCircleMarked.jsx +0 -13
  438. package/src/@menu/utils/menuClasses.js +0 -44
  439. package/src/@menu/utils/menuUtils.jsx +0 -145
  440. package/src/@menu/vertical-menu/index.jsx +0 -11
  441. package/src/configs/acl.js +0 -115
  442. package/src/configs/auth.js +0 -5
  443. package/src/configs/aws-exports.js +0 -30
  444. package/src/configs/firebase.js +0 -25
  445. package/src/configs/i18n.js +0 -34
  446. package/src/configs/primaryColorConfig.js +0 -35
  447. package/src/configs/themeConfig.js +0 -44
  448. package/src/layouts/UserLayout.js +0 -94
  449. package/src/layouts/UserThemeOptions.js +0 -191
  450. package/src/layouts/components/Direction.js +0 -30
  451. package/src/layouts/components/HtmlTooltip.js +0 -15
  452. package/src/layouts/components/Translations.js +0 -11
  453. package/src/layouts/components/UserDropdown.js +0 -217
  454. package/src/layouts/components/UserIcon.js +0 -40
  455. package/src/layouts/components/acl/Can.js +0 -6
  456. package/src/layouts/components/acl/CanViewNavGroup.js +0 -36
  457. package/src/layouts/components/acl/CanViewNavLink.js +0 -17
  458. package/src/layouts/components/acl/CanViewNavSectionTitle.js +0 -17
  459. package/src/layouts/components/horizontal/AppBarContent.js +0 -39
  460. package/src/layouts/components/horizontal/ServerSideNavItems.js +0 -44
  461. package/src/layouts/components/mui/StepperComps.js +0 -55
  462. package/src/layouts/components/vertical/AppBarContent.js +0 -35
  463. package/src/layouts/components/vertical/ServerSideNavItems.js +0 -44
  464. package/src/libs/ApexCharts.jsx +0 -5
  465. package/src/libs/ReactPlayer.jsx +0 -5
  466. package/src/libs/Recharts.jsx +0 -4
  467. package/src/libs/auth.js +0 -124
  468. package/src/libs/styles/AppFullCalendar.js +0 -505
  469. package/src/libs/styles/AppKeenSlider.js +0 -116
  470. package/src/libs/styles/AppReactApexCharts.jsx +0 -110
  471. package/src/libs/styles/AppReactDatepicker.jsx +0 -470
  472. package/src/libs/styles/AppReactDropzone.js +0 -76
  473. package/src/libs/styles/AppReactToastify.jsx +0 -108
  474. package/src/libs/styles/AppRecharts.js +0 -55
  475. package/src/libs/styles/inputOtp.module.css +0 -39
  476. package/src/libs/styles/tiptapEditor.css +0 -72
  477. package/src/navigation/horizontal/index.js +0 -246
  478. package/src/navigation/vertical/index.js +0 -253
  479. package/src/pages/401.js +0 -70
  480. package/src/pages/404.js +0 -67
  481. package/src/pages/500.js +0 -68
  482. package/src/pages/[slug].js +0 -115
  483. package/src/pages/_document.js +0 -72
  484. package/src/pages/api/navigation/regenerate-registry.js +0 -116
  485. package/src/pages/api/navigation/save.js +0 -218
  486. package/src/pages/authModule/acl/index.js +0 -48
  487. package/src/pages/authModule/forgot-password/index.js +0 -228
  488. package/src/pages/authModule/permissions/rolePermissions/[id]/rolePermissionsUser/index.js +0 -392
  489. package/src/pages/authModule/permissions/rolePermissions/index.js +0 -343
  490. package/src/pages/authModule/permissions/systemPermissions/index.js +0 -354
  491. package/src/pages/authModule/privacy/index.js +0 -721
  492. package/src/pages/authModule/users/index.js +0 -210
  493. package/src/pages/login/index.js +0 -328
  494. package/src/pages/mainHome/index.js +0 -181
  495. package/src/views/builder/inspector/definitions/cell/main.js +0 -4
  496. package/src/views/builder/inspector/definitions/column/main.js +0 -9
  497. package/src/views/builder/inspector/definitions/column-group/main.js +0 -18
  498. package/src/views/builder/inspector/definitions/header-cell/main.js +0 -5
  499. package/src/views/builder/inspector/definitions/table/main.js +0 -9
  500. package/src/views/builder/viewer/renderers/CellRenderer.jsx +0 -71
  501. package/src/views/builder/viewer/renderers/ColumnGroupRenderer.jsx +0 -96
  502. package/src/views/builder/viewer/renderers/ColumnRenderer.jsx +0 -71
  503. package/src/views/builder/viewer/renderers/HeaderCellRenderer.jsx +0 -78
  504. package/src/views/builder/viewer/renderers/TabRenderer.jsx +0 -82
  505. package/src/views/builder/viewer/renderers/TableRenderer.jsx +0 -92
  506. package/src/views/pages/auth/FooterIllustrationsV2.js +0 -40
  507. package/src/views/pages/misc/FooterIllustrations.js +0 -47
  508. package/src/views/pages/misc/muiTable/CustomPagination.js +0 -34
  509. package/src/views/pages/users/UserManageDialog.js +0 -283
  510. package/src/views/pages/users/UserViewPage.js +0 -199
  511. package/src/views/users/AddUserNameDialog.js +0 -162
  512. package/src/views/users/ContactManage.js +0 -449
  513. package/src/views/users/ResetPasswordDialog.js +0 -242
@@ -0,0 +1,607 @@
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,
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
+ } = useBuilder()
301
+
302
+ const [saveOpen, setSaveOpen] = useState(false)
303
+ const [isSaving, setIsSaving] = useState(false)
304
+ const [schemaOpen, setSchemaOpen] = useState(false)
305
+ const [mode, setMode] = useState('edit')
306
+ const printDialogRef = useRef(null)
307
+
308
+ const settings = schema?.settings ?? {}
309
+ const activeZone = schema?.activeZone ?? 'body-page-0'
310
+ const pageOrder = schema?.pageOrder ?? ['body-page-0']
311
+ const zones = schema?.zones ?? {}
312
+ const m = settings.margins ?? { top: 0, right: 0, bottom: 0, left: 0 }
313
+
314
+ // ── Page dimensions ───────────────────────────────────────────────────────
315
+ const sizeConf = PAGE_SIZES[settings.pageSize] ?? PAGE_SIZES.A4
316
+ const dimConf = sizeConf[settings.orientation] ?? sizeConf.portrait
317
+ const pageW = dimConf.w
318
+ const pageH = dimConf.h
319
+ const headerH = settings.header?.enabled ? mmToPx(settings.header?.height ?? 10) : 0
320
+ const footerH = settings.footer?.enabled ? mmToPx(settings.footer?.height ?? 10) : 0
321
+ const bodyH = pageH - headerH - footerH
322
+
323
+ // ── Zone switch ───────────────────────────────────────────────────────────
324
+ // Clicking a zone frame: switch to it if not active, then always select the
325
+ // zone's root container so the Inspector opens and the user can stylize it.
326
+ const switchZone = (zoneKey) => {
327
+ if (mode === 'preview') return
328
+
329
+ // Compute the new root BEFORE the schema update (needed for setSelectedId)
330
+ const newRoot = zoneKey === activeZone
331
+ ? (schema?.root ?? createEmptyNode(zoneKey))
332
+ : (zones[zoneKey] ?? createEmptyNode(zoneKey))
333
+
334
+ if (zoneKey !== activeZone) {
335
+ setSchema(prev => ({
336
+ ...prev,
337
+ zones: { ...prev.zones, [prev.activeZone ?? zoneKey]: prev.root },
338
+ root: prev.zones?.[zoneKey] ?? createEmptyNode(zoneKey),
339
+ activeZone: zoneKey,
340
+ }))
341
+ }
342
+
343
+ // Select the zone root so the Inspector shows its Style/Main tabs immediately
344
+ setSelectedId(newRoot?.id ?? null)
345
+ }
346
+
347
+ // ── Add page ──────────────────────────────────────────────────────────────
348
+ const addPage = () => {
349
+ const newId = `body-page-${Date.now()}`
350
+ setSchema(prev => ({
351
+ ...prev,
352
+ pageOrder: [...(prev.pageOrder ?? []), newId],
353
+ zones: {
354
+ ...prev.zones,
355
+ [prev.activeZone ?? newId]: prev.root,
356
+ [newId]: createEmptyNode(newId),
357
+ },
358
+ }))
359
+ }
360
+
361
+ // ── Delete page ───────────────────────────────────────────────────────────
362
+ const deletePage = (pageId) => {
363
+ setSchema(prev => {
364
+ const order = (prev.pageOrder ?? []).filter(id => id !== pageId)
365
+ const newZones = { ...prev.zones }
366
+ delete newZones[pageId]
367
+
368
+ let newRoot = prev.root
369
+ let newActive = prev.activeZone
370
+ if (prev.activeZone === pageId) {
371
+ newActive = order[0] ?? 'body-page-0'
372
+ newRoot = newZones[newActive] ?? createEmptyNode(newActive)
373
+ }
374
+ return { ...prev, pageOrder: order, zones: newZones, root: newRoot, activeZone: newActive }
375
+ })
376
+ }
377
+
378
+ // ── viewerContext factory ─────────────────────────────────────────────────
379
+ // isPrintBuilder: true signals ReportViewerRenderer to swap to placeholder/table
380
+ const makeZoneViewerContext = (zoneKey) => ({
381
+ schema: { ...schema, root: getZoneRoot(zoneKey) },
382
+ mode,
383
+ isEditMode: mode === 'edit',
384
+ isPreviewMode: mode === 'preview',
385
+ isPrintBuilder: true,
386
+ data, setData, form, setForm, updateFormValue,
387
+ validationErrors, setValidationErrors,
388
+ submitForm: async () => {},
389
+ resetForm: () => {},
390
+ dataRef, reportRefs, dialogRefs,
391
+ openDialog, closeDialog,
392
+ builderContext: (mode === 'edit' && zoneKey === activeZone) ? {
393
+ selectedId, setSelectedId,
394
+ setSchema: (updater) => {
395
+ setSchema(prev => {
396
+ const updated = typeof updater === 'function' ? updater(prev) : updater
397
+ return {
398
+ ...prev,
399
+ zones: { ...prev.zones, [zoneKey]: updated.root },
400
+ root: updated.root,
401
+ }
402
+ })
403
+ },
404
+ draggingNodeId, setDraggingNodeId,
405
+ } : null,
406
+ })
407
+
408
+ // ── Get zone root node ────────────────────────────────────────────────────
409
+ const getZoneRoot = (zoneKey) =>
410
+ zoneKey === activeZone
411
+ ? (schema?.root ?? createEmptyNode(zoneKey))
412
+ : (zones[zoneKey] ?? createEmptyNode(zoneKey))
413
+
414
+ // ── Save ──────────────────────────────────────────────────────────────────
415
+ const handleSave = async (title) => {
416
+ if (!schema?.root) return
417
+ setIsSaving(true)
418
+ try {
419
+ const fullSchema = {
420
+ ...schema,
421
+ zones: { ...schema.zones, [activeZone]: schema.root },
422
+ }
423
+ const value = JSON.stringify(fullSchema)
424
+ const response = metaData?.id
425
+ ? await Services.UpdateService(Endpoints.PrintLayout.Put.Update, true, { id: metaData.id, title, value })
426
+ : await Services.PostService(Endpoints.PrintLayout.Post.Add, true, { title, value })
427
+ if (response) { setSaveOpen(false); onSaved?.(response) }
428
+ } catch { toast.error('Failed to save') }
429
+ finally { setIsSaving(false) }
430
+ }
431
+
432
+ if (!schema?.root) return null
433
+
434
+ const headerRoot = getZoneRoot('header')
435
+ const footerRoot = getZoneRoot('footer')
436
+
437
+ return (
438
+ <Box sx={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
439
+
440
+ {/* ── Toolbar ───────────────────────────────────────────────────────── */}
441
+ <Box sx={{
442
+ p: 1, borderBottom: '1px solid', borderColor: 'divider',
443
+ bgcolor: 'background.paper', display: 'flex', alignItems: 'center', gap: 1,
444
+ position: 'relative', flexShrink: 0,
445
+ }}>
446
+ <Box sx={{ fontSize: 13, fontWeight: 600, color: 'text.secondary' }}>
447
+ Print Layout Builder
448
+ </Box>
449
+ <Box sx={{ flex: 1 }} />
450
+
451
+ {/* Edit / Preview toggle */}
452
+ <ToggleButtonGroup value={mode} exclusive size='small'
453
+ onChange={(_, v) => { if (v) { setMode(v); setSelectedId(null) } }}>
454
+ <ToggleButton value='edit'>Edit</ToggleButton>
455
+ <ToggleButton value='preview'>Preview</ToggleButton>
456
+ </ToggleButtonGroup>
457
+
458
+ {/* Theme toggle */}
459
+ {onToggleTheme && (
460
+ <Tooltip title={isDark ? 'Switch to light mode' : 'Switch to dark mode'}>
461
+ <IconButton size='small' onClick={onToggleTheme} sx={{ color: 'text.secondary' }}>
462
+ {isDark ? <LightModeOutlined fontSize='small' /> : <DarkModeOutlined fontSize='small' />}
463
+ </IconButton>
464
+ </Tooltip>
465
+ )}
466
+
467
+ <Tooltip title='Preview Schema (JSON)'>
468
+ <IconButton size='small' onClick={() => setSchemaOpen(true)}>
469
+ <DataObjectOutlined fontSize='small' />
470
+ </IconButton>
471
+ </Tooltip>
472
+ <Tooltip title='Test Print — uses Test Data from Settings tab'>
473
+ <Button size='small' variant='outlined' startIcon={<PrintOutlined />}
474
+ onClick={() => {
475
+ // Persist active zone first, then open dialog with the full schema inline
476
+ const fullSchema = {
477
+ ...schema,
478
+ zones: { ...schema.zones, [activeZone]: schema.root },
479
+ }
480
+ let testData = {}
481
+ try { testData = JSON.parse(schema?.testData ?? '{}') } catch { /* ignore */ }
482
+ // Feed the schema directly into the dialog via a synthetic load
483
+ if (printDialogRef.current) {
484
+ printDialogRef.current.openWithSchema(fullSchema, testData)
485
+ }
486
+ }}>
487
+ Test Print
488
+ </Button>
489
+ </Tooltip>
490
+ <Button size='small' variant='contained' startIcon={<SaveOutlined />}
491
+ onClick={() => setSaveOpen(true)}>
492
+ Save
493
+ </Button>
494
+ </Box>
495
+
496
+ {/* ── Canvas ────────────────────────────────────────────────────────── */}
497
+ <Box sx={{ flex: 1, overflow: 'auto', bgcolor: isDark ? '#2a2d32' : '#888', py: 4, px: 3 }}>
498
+
499
+ {/* ── EDIT MODE ── zone frames with labels ── */}
500
+ {mode === 'edit' && (
501
+ <Box sx={{ width: pageW, mx: 'auto' }}>
502
+
503
+ {settings.header?.enabled && (
504
+ <ZoneFrame
505
+ label={`Header — ${settings.header?.height ?? 10} mm`}
506
+ color={ZONE_COLORS.header}
507
+ height={Math.max(headerH, 60)}
508
+ isActive={activeZone === 'header'}
509
+ onClick={() => switchZone('header')}
510
+ >
511
+ {(() => {
512
+ const hm = settings.header?.margins ?? { top: 0, right: 0, bottom: 0, left: 0 }
513
+ return (
514
+ <Box sx={{ pt: `${mmToPx(hm.top)}px`, pr: `${mmToPx(hm.right)}px`, pb: `${mmToPx(hm.bottom)}px`, pl: `${mmToPx(hm.left)}px` }}>
515
+ <ComponentRenderer node={headerRoot} viewerContext={makeZoneViewerContext('header')} />
516
+ </Box>
517
+ )
518
+ })()}
519
+ </ZoneFrame>
520
+ )}
521
+
522
+ {pageOrder.map((pageId, idx) => {
523
+ const pageRoot = getZoneRoot(pageId)
524
+ return (
525
+ <ZoneFrame key={pageId}
526
+ label={`Page ${idx + 1}`}
527
+ color={ZONE_COLORS.body}
528
+ height={Math.max(bodyH, 120)}
529
+ isActive={activeZone === pageId}
530
+ onClick={() => switchZone(pageId)}
531
+ canDelete={pageOrder.length > 1}
532
+ onDelete={() => deletePage(pageId)}
533
+ >
534
+ <Box sx={{ p: `${mmToPx(m.top)}px ${mmToPx(m.right)}px ${mmToPx(m.bottom)}px ${mmToPx(m.left)}px` }}>
535
+ <ComponentRenderer
536
+ node={pageRoot}
537
+ viewerContext={makeZoneViewerContext(pageId)}
538
+ />
539
+ </Box>
540
+ </ZoneFrame>
541
+ )
542
+ })}
543
+
544
+ <Box sx={{ display: 'flex', justifyContent: 'center', mb: 2 }}>
545
+ <Button size='small' startIcon={<AddOutlined />} onClick={addPage} variant='outlined'
546
+ sx={{ borderColor: '#aaa', color: '#fff', '&:hover': { borderColor: '#fff' } }}>
547
+ Add Page
548
+ </Button>
549
+ </Box>
550
+
551
+ {settings.footer?.enabled && (
552
+ <ZoneFrame
553
+ label={`Footer — ${settings.footer?.height ?? 10} mm${settings.footer?.showPageNumbers ? ' · Page numbers ON' : ''}`}
554
+ color={ZONE_COLORS.footer}
555
+ height={Math.max(footerH, 60)}
556
+ isActive={activeZone === 'footer'}
557
+ onClick={() => switchZone('footer')}
558
+ >
559
+ {(() => {
560
+ const fm = settings.footer?.margins ?? { top: 0, right: 0, bottom: 0, left: 0 }
561
+ return (
562
+ <Box sx={{ pt: `${mmToPx(fm.top)}px`, pr: `${mmToPx(fm.right)}px`, pb: `${mmToPx(fm.bottom)}px`, pl: `${mmToPx(fm.left)}px` }}>
563
+ <ComponentRenderer node={footerRoot} viewerContext={makeZoneViewerContext('footer')} />
564
+ </Box>
565
+ )
566
+ })()}
567
+ </ZoneFrame>
568
+ )}
569
+ </Box>
570
+ )}
571
+
572
+ {/* ── PREVIEW MODE ── identical to the PrintDialog screen preview ── */}
573
+ {mode === 'preview' && (
574
+ <PrintPreviewCanvas schema={schema} makeViewerCtx={makeZoneViewerContext} />
575
+ )}
576
+ </Box>
577
+
578
+ {/* ── Dialogs ───────────────────────────────────────────────────────── */}
579
+ <SaveDialog open={saveOpen} onClose={() => setSaveOpen(false)}
580
+ onSave={handleSave} isSaving={isSaving} defaultTitle={metaData?.title || ''} />
581
+
582
+ {/* PrintDialog mounted here for Test Print — receives a special viewerContext with the ref */}
583
+ <PrintDialog viewerContext={{ printDialogRef, data: {}, setData: () => {}, form: {}, setForm: () => {}, mode: 'preview', isEditMode: false, isPreviewMode: true, isPrintContext: true }} />
584
+
585
+ <Dialog open={schemaOpen} onClose={() => setSchemaOpen(false)} fullScreen
586
+ PaperProps={{ sx: { bgcolor: '#1e1e1e' } }}>
587
+ <Box sx={{ display: 'flex', alignItems: 'center', bgcolor: '#252526',
588
+ borderBottom: '1px solid #1a1a1a', px: 1.5, py: 0.5, gap: 1 }}>
589
+ <Box sx={{ color: '#ccc', fontSize: 13, fontFamily: 'monospace', flex: 1 }}>
590
+ printLayout.json
591
+ </Box>
592
+ <Tooltip title='Close'>
593
+ <IconButton size='small' onClick={() => setSchemaOpen(false)}
594
+ sx={{ color: '#aaa', '&:hover': { color: '#fff' } }}>
595
+ <FullscreenExitOutlined fontSize='small' />
596
+ </IconButton>
597
+ </Tooltip>
598
+ </Box>
599
+ <Box sx={{ flex: 1, minHeight: 0, height: 'calc(100vh - 40px)' }}>
600
+ <Editor height='100%' defaultLanguage='json' theme='vs-dark'
601
+ value={schema ? JSON.stringify({ ...schema, zones: { ...schema.zones, [activeZone]: schema.root } }, null, 2) : '{}'}
602
+ options={{ readOnly: true, minimap: { enabled: true } }} />
603
+ </Box>
604
+ </Dialog>
605
+ </Box>
606
+ )
607
+ }