robobyte-front-builder 1.0.17 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. package/README.md +211 -0
  2. package/next.config.js +19 -48
  3. package/package.json +39 -85
  4. package/src/context/BuilderContext.jsx +134 -6
  5. package/src/context/SystemContext.js +2 -2
  6. package/src/hooks/useGlobalStore.js +36 -0
  7. package/src/hooks/useTimerEngine.js +54 -0
  8. package/src/lib/index.js +11 -3
  9. package/src/lib/layouts/BlankLayout.jsx +13 -0
  10. package/src/lib/providers/RoboByteFrontBuilderProvider.jsx +59 -1
  11. package/src/lib/themes/builderTheme.js +41 -0
  12. package/src/pages/_app.js +32 -134
  13. package/src/pages/api/ai.js +87 -0
  14. package/src/pages/builders/report/index.js +1 -0
  15. package/src/pages/builders/report/list/index.js +1 -0
  16. package/src/pages/builders/report/viewer/index.js +1 -0
  17. package/src/pages/index.js +88 -37
  18. package/src/pages/printBuilder/index.jsx +263 -0
  19. package/src/pages/printBuilder/layouts/index.jsx +298 -0
  20. package/src/pages/reportModule/reportBuilder/index.js +723 -563
  21. package/src/pages/reportModule/reportBuilder/reportViewer/index.js +137 -71
  22. package/src/pages/reportModule/reportBuilder/reports/index.js +51 -13
  23. package/src/pages/reportModule/reportBuilder/reportsPermissions/index.js +126 -0
  24. package/src/pages/viewBuilder/index.jsx +117 -32
  25. package/src/pages/viewBuilder/views/index.js +3 -3
  26. package/src/pages/viewer/[id]/index.js +2 -1
  27. package/src/services/DeleteService.js +31 -60
  28. package/src/services/Endpoints/PrintLayoutEndpoints.js +42 -0
  29. package/src/services/Endpoints.js +2 -0
  30. package/src/services/GetService.js +33 -54
  31. package/src/services/PatchService.js +38 -65
  32. package/src/services/PostService.js +37 -63
  33. package/src/services/UpdateService.js +39 -65
  34. package/src/services/builderHelper/actionExecutor.js +141 -25
  35. package/src/services/builderHelper/builderHelper.js +92 -0
  36. package/src/services/builderHelper/colorSchema.js +95 -0
  37. package/src/services/builderHelper/iconResolver.js +50 -0
  38. package/src/services/builderHelper/jsExecutor.js +212 -46
  39. package/src/services/builderHelper/nodeFactory.js +32 -15
  40. package/src/services/builderHelper/numberFormat.js +123 -0
  41. package/src/services/builderHelper/resolveProps.js +73 -4
  42. package/src/services/builderHelper/thresholdEngine.js +77 -0
  43. package/src/services/builderHelper/tree.js +31 -0
  44. package/src/services/components/agGridAutoComplete.js +5 -9
  45. package/src/services/config.js +9 -1
  46. package/src/services/globalStore.js +80 -0
  47. package/src/services/helper/multiSelectEditor.js +5 -9
  48. package/src/services/helper/multiSelectEditorByBuilder.js +241 -0
  49. package/src/services/helper/reportSessionHelper.js +83 -0
  50. package/src/services/reportData/fetchReportData.js +69 -28
  51. package/src/services/routerRef.js +35 -0
  52. package/src/views/ConfirmDialog.js +2 -2
  53. package/src/views/builder/JSEditor.js +105 -107
  54. package/src/views/builder/inspector/Inspector.jsx +6 -9
  55. package/src/views/builder/inspector/Tabs/ComponentActionsTab.jsx +7 -13
  56. package/src/views/builder/inspector/Tabs/MainTab.jsx +143 -25
  57. package/src/views/builder/inspector/Tabs/RulesTab.jsx +9 -24
  58. package/src/views/builder/inspector/Tabs/StyleTab.jsx +9 -24
  59. package/src/views/builder/inspector/definitions/autocomplete/main.js +4 -6
  60. package/src/views/builder/inspector/definitions/banner/actions.js +7 -0
  61. package/src/views/builder/inspector/definitions/banner/main.js +22 -0
  62. package/src/views/builder/inspector/definitions/banner/rules.js +1 -0
  63. package/src/views/builder/inspector/definitions/banner/style.js +1 -0
  64. package/src/views/builder/inspector/definitions/breadcrumb/main.js +43 -6
  65. package/src/views/builder/inspector/definitions/button/main.js +11 -12
  66. package/src/views/builder/inspector/definitions/button/style.js +18 -30
  67. package/src/views/builder/inspector/definitions/checkbox/actions.js +3 -1
  68. package/src/views/builder/inspector/definitions/checkbox/main.js +4 -6
  69. package/src/views/builder/inspector/definitions/common/main.js +13 -2
  70. package/src/views/builder/inspector/definitions/dataGrid/main.js +23 -0
  71. package/src/views/builder/inspector/definitions/dataTableViewer/main.js +46 -0
  72. package/src/views/builder/inspector/definitions/datepicker/actions.js +3 -1
  73. package/src/views/builder/inspector/definitions/datepicker/main.js +6 -14
  74. package/src/views/builder/inspector/definitions/dialog/main.js +36 -0
  75. package/src/views/builder/inspector/definitions/dropdown/main.js +5 -8
  76. package/src/views/builder/inspector/definitions/excelUpload/actions.js +23 -0
  77. package/src/views/builder/inspector/definitions/excelUpload/main.js +17 -0
  78. package/src/views/builder/inspector/definitions/excelUpload/rules.js +1 -0
  79. package/src/views/builder/inspector/definitions/excelUpload/style.js +45 -0
  80. package/src/views/builder/inspector/definitions/header/main.js +10 -1
  81. package/src/views/builder/inspector/definitions/index.js +106 -19
  82. package/src/views/builder/inspector/definitions/input/actions.js +4 -1
  83. package/src/views/builder/inspector/definitions/input/main.js +20 -11
  84. package/src/views/builder/inspector/definitions/kpi/avatarGroup.js +22 -0
  85. package/src/views/builder/inspector/definitions/kpi/badge.js +17 -0
  86. package/src/views/builder/inspector/definitions/kpi/bulletChart.js +47 -0
  87. package/src/views/builder/inspector/definitions/kpi/chart.js +55 -0
  88. package/src/views/builder/inspector/definitions/kpi/colorScale.js +60 -0
  89. package/src/views/builder/inspector/definitions/kpi/comparisonBars.js +41 -0
  90. package/src/views/builder/inspector/definitions/kpi/countdown.js +46 -0
  91. package/src/views/builder/inspector/definitions/kpi/donut.js +51 -0
  92. package/src/views/builder/inspector/definitions/kpi/funnel.js +25 -0
  93. package/src/views/builder/inspector/definitions/kpi/gauge.js +39 -0
  94. package/src/views/builder/inspector/definitions/kpi/heatmapGrid.js +96 -0
  95. package/src/views/builder/inspector/definitions/kpi/iconBox.js +20 -0
  96. package/src/views/builder/inspector/definitions/kpi/metric.js +45 -0
  97. package/src/views/builder/inspector/definitions/kpi/rating.js +27 -0
  98. package/src/views/builder/inspector/definitions/kpi/statusDot.js +18 -0
  99. package/src/views/builder/inspector/definitions/kpi/stepStage.js +65 -0
  100. package/src/views/builder/inspector/definitions/kpi/tagList.js +32 -0
  101. package/src/views/builder/inspector/definitions/kpi/timeline.js +80 -0
  102. package/src/views/builder/inspector/definitions/kpi/trend.js +20 -0
  103. package/src/views/builder/inspector/definitions/label/main.js +10 -1
  104. package/src/views/builder/inspector/definitions/layout/main.js +27 -3
  105. package/src/views/builder/inspector/definitions/number/main.js +6 -14
  106. package/src/views/builder/inspector/definitions/pageNumber/main.js +21 -0
  107. package/src/views/builder/inspector/definitions/popover/main.js +71 -0
  108. package/src/views/builder/inspector/definitions/radio/main.js +5 -8
  109. package/src/views/builder/inspector/definitions/repeater/main.js +31 -0
  110. package/src/views/builder/inspector/definitions/reportViewer/main.js +15 -1
  111. package/src/views/builder/inspector/definitions/richtext/main.js +5 -8
  112. package/src/views/builder/inspector/definitions/signature/main.js +4 -1
  113. package/src/views/builder/inspector/definitions/tag/main.js +5 -8
  114. package/src/views/builder/inspector/definitions/textarea/actions.js +4 -1
  115. package/src/views/builder/inspector/definitions/textarea/main.js +5 -7
  116. package/src/views/builder/inspector/definitions/time/main.js +5 -8
  117. package/src/views/builder/inspector/definitions/toggle/main.js +5 -19
  118. package/src/views/builder/inspector/definitions/treeView/main.js +61 -0
  119. package/src/views/builder/inspector/definitions/viewRenderer/main.js +53 -0
  120. package/src/views/builder/inspector/definitions/wizard/main.js +68 -0
  121. package/src/views/builder/inspector/definitions/wizard-step/main.js +25 -0
  122. package/src/views/builder/inspector/fields/ActionsConfigEditor.jsx +426 -0
  123. package/src/views/builder/inspector/fields/ColorSchemaField.jsx +140 -0
  124. package/src/views/builder/inspector/fields/ColumnFunctionEditor.jsx +238 -0
  125. package/src/views/builder/inspector/fields/ColumnMappingEditor.jsx +105 -0
  126. package/src/views/builder/inspector/fields/ColumnsConfigEditor.jsx +506 -0
  127. package/src/views/builder/inspector/fields/DonutRingsEditorField.jsx +337 -0
  128. package/src/views/builder/inspector/fields/ExtraColsEditor.jsx +618 -0
  129. package/src/views/builder/inspector/fields/FunctionHelpPopover.jsx +295 -0
  130. package/src/views/builder/inspector/fields/IconEditor.jsx +64 -0
  131. package/src/views/builder/inspector/fields/KpiActionField.jsx +223 -0
  132. package/src/views/builder/inspector/fields/MarkersEditorField.jsx +173 -0
  133. package/src/views/builder/inspector/fields/SelectEditor.jsx +9 -5
  134. package/src/views/builder/inspector/fields/SeriesEditorField.jsx +363 -0
  135. package/src/views/builder/inspector/fields/TableColumnsEditor.jsx +104 -0
  136. package/src/views/builder/inspector/fields/ThresholdsEditor.jsx +247 -0
  137. package/src/views/builder/inspector/fields/ValueFunctionsRefPanel.jsx +217 -0
  138. package/src/views/builder/inspector/fields/columnEditorShared.jsx +217 -0
  139. package/src/views/builder/sidebar/Sidebar.jsx +4 -2
  140. package/src/views/builder/sidebar/SidebarTabs.jsx +28 -17
  141. package/src/views/builder/sidebar/tabs/ActionsTab.jsx +7 -3
  142. package/src/views/builder/sidebar/tabs/AiTab/AiPreviewDialog.jsx +193 -0
  143. package/src/views/builder/sidebar/tabs/AiTab/aiProvider.js +49 -0
  144. package/src/views/builder/sidebar/tabs/AiTab/index.jsx +409 -0
  145. package/src/views/builder/sidebar/tabs/AiTab/schemaTransformer.js +102 -0
  146. package/src/views/builder/sidebar/tabs/AiTab/schemaValidator.js +64 -0
  147. package/src/views/builder/sidebar/tabs/AiTab/systemPrompt.js +1151 -0
  148. package/src/views/builder/sidebar/tabs/Components/ComponentsTab.jsx +31 -31
  149. package/src/views/builder/sidebar/tabs/Components/componentCatalog.js +43 -21
  150. package/src/views/builder/sidebar/tabs/Components/printComponentCatalog.js +81 -0
  151. package/src/views/builder/sidebar/tabs/TimersTab.jsx +338 -0
  152. package/src/views/builder/sidebar/tabs/TreeTab.jsx +13 -4
  153. package/src/views/builder/sidebar/tabs/ViewTab.jsx +1 -1
  154. package/src/views/builder/viewer/AdornedLabel.jsx +82 -0
  155. package/src/views/builder/viewer/ComponentRenderer.jsx +98 -24
  156. package/src/views/builder/viewer/DialogsZone.jsx +259 -0
  157. package/src/views/builder/viewer/FieldLabel.jsx +106 -0
  158. package/src/views/builder/viewer/PrintDialog.jsx +481 -0
  159. package/src/views/builder/viewer/ProductionViewer.jsx +80 -5
  160. package/src/views/builder/viewer/Viewer.jsx +106 -8
  161. package/src/views/builder/viewer/ViewerComponentWrapper.jsx +61 -4
  162. package/src/views/builder/viewer/ViewerToolbar.jsx +273 -59
  163. package/src/views/builder/viewer/renderers/AutoCompleteRenderer.jsx +26 -22
  164. package/src/views/builder/viewer/renderers/AvatarGroupRenderer.jsx +112 -0
  165. package/src/views/builder/viewer/renderers/BadgeRenderer.jsx +79 -0
  166. package/src/views/builder/viewer/renderers/BannerRenderer.jsx +62 -0
  167. package/src/views/builder/viewer/renderers/BreadcrumbRenderer.jsx +203 -15
  168. package/src/views/builder/viewer/renderers/BulletChartRenderer.jsx +147 -0
  169. package/src/views/builder/viewer/renderers/ButtonRenderer.jsx +98 -39
  170. package/src/views/builder/viewer/renderers/CardRenderer.jsx +1 -1
  171. package/src/views/builder/viewer/renderers/ChartRenderer.jsx +388 -0
  172. package/src/views/builder/viewer/renderers/CheckboxRenderer.jsx +17 -9
  173. package/src/views/builder/viewer/renderers/ColorScaleRenderer.jsx +300 -0
  174. package/src/views/builder/viewer/renderers/ComparisonBarsRenderer.jsx +133 -0
  175. package/src/views/builder/viewer/renderers/ContainerRenderer.jsx +3 -1
  176. package/src/views/builder/viewer/renderers/CountdownRenderer.jsx +249 -0
  177. package/src/views/builder/viewer/renderers/DataGridRenderer.jsx +380 -0
  178. package/src/views/builder/viewer/renderers/DataTableViewerRenderer.jsx +240 -0
  179. package/src/views/builder/viewer/renderers/DatePickerRenderer.jsx +25 -24
  180. package/src/views/builder/viewer/renderers/DialogRenderer.jsx +327 -0
  181. package/src/views/builder/viewer/renderers/DividerRenderer.jsx +1 -1
  182. package/src/views/builder/viewer/renderers/DonutRenderer.jsx +294 -0
  183. package/src/views/builder/viewer/renderers/DropdownRenderer.jsx +36 -44
  184. package/src/views/builder/viewer/renderers/ExcelUploadRenderer.jsx +639 -0
  185. package/src/views/builder/viewer/renderers/FunnelRenderer.jsx +93 -0
  186. package/src/views/builder/viewer/renderers/GaugeRenderer.jsx +159 -0
  187. package/src/views/builder/viewer/renderers/HeaderRenderer.jsx +31 -9
  188. package/src/views/builder/viewer/renderers/HeatmapGridRenderer.jsx +432 -0
  189. package/src/views/builder/viewer/renderers/IconBoxRenderer.jsx +59 -0
  190. package/src/views/builder/viewer/renderers/ImageRenderer.jsx +1 -1
  191. package/src/views/builder/viewer/renderers/InputRenderer.jsx +75 -18
  192. package/src/views/builder/viewer/renderers/LabelRenderer.jsx +35 -9
  193. package/src/views/builder/viewer/renderers/LayoutCellRenderer.jsx +102 -40
  194. package/src/views/builder/viewer/renderers/LayoutContextMenu.jsx +8 -8
  195. package/src/views/builder/viewer/renderers/LayoutRenderer.jsx +48 -6
  196. package/src/views/builder/viewer/renderers/LinkRenderer.jsx +1 -1
  197. package/src/views/builder/viewer/renderers/MenuRenderer.jsx +2 -2
  198. package/src/views/builder/viewer/renderers/MetricRenderer.jsx +80 -0
  199. package/src/views/builder/viewer/renderers/NumberFormatRenderer.jsx +21 -30
  200. package/src/views/builder/viewer/renderers/PageNumberRenderer.jsx +76 -0
  201. package/src/views/builder/viewer/renderers/PopoverRenderer.jsx +350 -0
  202. package/src/views/builder/viewer/renderers/ProgressCircleRenderer.jsx +1 -1
  203. package/src/views/builder/viewer/renderers/ProgressLineRenderer.jsx +1 -1
  204. package/src/views/builder/viewer/renderers/RadioGroupRenderer.jsx +28 -39
  205. package/src/views/builder/viewer/renderers/RatingRenderer.jsx +80 -0
  206. package/src/views/builder/viewer/renderers/RepeaterRenderer.jsx +297 -38
  207. package/src/views/builder/viewer/renderers/ReportViewerRenderer.jsx +219 -5
  208. package/src/views/builder/viewer/renderers/RichTextRenderer.jsx +60 -66
  209. package/src/views/builder/viewer/renderers/RowActionsCell.jsx +308 -0
  210. package/src/views/builder/viewer/renderers/SignatureRenderer.jsx +33 -62
  211. package/src/views/builder/viewer/renderers/StatusDotRenderer.jsx +75 -0
  212. package/src/views/builder/viewer/renderers/StepStageRenderer.jsx +348 -0
  213. package/src/views/builder/viewer/renderers/TagListRenderer.jsx +115 -0
  214. package/src/views/builder/viewer/renderers/TagPickerRenderer.jsx +31 -45
  215. package/src/views/builder/viewer/renderers/TextAreaRenderer.jsx +25 -18
  216. package/src/views/builder/viewer/renderers/TextRenderer.jsx +7 -1
  217. package/src/views/builder/viewer/renderers/TimePickerRenderer.jsx +25 -24
  218. package/src/views/builder/viewer/renderers/TimelineRenderer.jsx +525 -0
  219. package/src/views/builder/viewer/renderers/ToggleRenderer.jsx +21 -27
  220. package/src/views/builder/viewer/renderers/TreeViewRenderer.jsx +832 -0
  221. package/src/views/builder/viewer/renderers/TrendRenderer.jsx +66 -0
  222. package/src/views/builder/viewer/renderers/ViewRendererRenderer.jsx +315 -0
  223. package/src/views/builder/viewer/renderers/WizardRenderer.jsx +380 -64
  224. package/src/views/builder/viewer/renderers/WizardStepRenderer.jsx +21 -12
  225. package/src/views/builder/viewer/renderers/dataGridComponents.jsx +824 -0
  226. package/src/views/customFilter/CustomFilterDialog.js +1023 -660
  227. package/src/views/customFilter/FixedFilterDialog.js +649 -0
  228. package/src/views/customFilter/SearchFilterDialog.js +248 -0
  229. package/src/views/genericTable/BuilderExpressionParams.js +3 -3
  230. package/src/views/genericTable/ColumnConfiguratorDialog.js +771 -0
  231. package/src/views/genericTable/FixedFilterDialog.js +3 -2
  232. package/src/views/genericTable/FormattingSettingsDialog.js +551 -0
  233. package/src/views/genericTable/ReportSettingsDialog.js +151 -0
  234. package/src/views/genericTable/SGrid.js +1061 -247
  235. package/src/views/genericTable/SearchFilterDialog.js +3 -2
  236. package/src/views/genericTable/TAGGrid.js +83 -69
  237. package/src/views/genericTable/cellEditors/autocompleteEditor.js +5 -9
  238. package/src/views/genericTable/convertStringFunctions.js +336 -0
  239. package/src/views/genericTable/statusBar/rowCountStatusBar.js +3 -1
  240. package/src/views/genericTable/updateRefHelpers.js +424 -0
  241. package/src/views/printBuilder/PrintBuilderViewer.jsx +607 -0
  242. package/src/views/printBuilder/PrintPreviewCanvas.jsx +157 -0
  243. package/src/views/rolePermissions/UpdateReportPermissionDialog.js +316 -0
  244. package/src/@core/components/auth/AclGuard.js +0 -55
  245. package/src/@core/components/auth/AuthGuard.js +0 -40
  246. package/src/@core/components/auth/GuestGuard.js +0 -30
  247. package/src/@core/components/custom-inputs/Horizontal.jsx +0 -143
  248. package/src/@core/components/custom-inputs/Image.jsx +0 -78
  249. package/src/@core/components/custom-inputs/Vertical.jsx +0 -113
  250. package/src/@core/components/customizer/index.jsx +0 -470
  251. package/src/@core/components/customizer/styles.module.css +0 -169
  252. package/src/@core/components/mui/Avatar.jsx +0 -41
  253. package/src/@core/components/mui/Badge.jsx +0 -20
  254. package/src/@core/components/mui/IconButton.jsx +0 -74
  255. package/src/@core/components/mui/TabList.jsx +0 -60
  256. package/src/@core/components/option-menu/index.jsx +0 -137
  257. package/src/@core/components/scroll-to-top/index.jsx +0 -43
  258. package/src/@core/components/spinner/index.js +0 -26
  259. package/src/@core/components/window-wrapper/index.js +0 -27
  260. package/src/@core/contexts/settingsContext.jsx +0 -98
  261. package/src/@core/hooks/useBgColor.js +0 -63
  262. package/src/@core/hooks/useImageVariant.js +0 -27
  263. package/src/@core/hooks/useLayoutInit.js +0 -37
  264. package/src/@core/hooks/useObjectCookie.js +0 -18
  265. package/src/@core/hooks/useSettings.jsx +0 -15
  266. package/src/@core/layouts/BlankLayout.js +0 -37
  267. package/src/@core/layouts/BlankLayoutWithAppBar.js +0 -51
  268. package/src/@core/layouts/HorizontalLayout.jsx +0 -151
  269. package/src/@core/layouts/Layout.js +0 -39
  270. package/src/@core/layouts/VerticalLayout.jsx +0 -124
  271. package/src/@core/layouts/components/blank-layout-with-appBar/index.js +0 -115
  272. package/src/@core/layouts/components/horizontal/app-bar-content/index.js +0 -67
  273. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavGroup.js +0 -352
  274. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavItems.js +0 -21
  275. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavLink.js +0 -195
  276. package/src/@core/layouts/components/horizontal/navigation/index.js +0 -31
  277. package/src/@core/layouts/components/shared-components/LanguageDropdown.js +0 -96
  278. package/src/@core/layouts/components/shared-components/ModeToggler.js +0 -32
  279. package/src/@core/layouts/components/shared-components/NotificationDropdown.js +0 -226
  280. package/src/@core/layouts/components/shared-components/UserDropdown.js +0 -177
  281. package/src/@core/layouts/components/shared-components/footer/FooterContent.js +0 -46
  282. package/src/@core/layouts/components/shared-components/footer/index.js +0 -61
  283. package/src/@core/layouts/components/vertical/appBar/index.js +0 -74
  284. package/src/@core/layouts/components/vertical/navigation/Drawer.js +0 -122
  285. package/src/@core/layouts/components/vertical/navigation/VerticalNavGroup.js +0 -435
  286. package/src/@core/layouts/components/vertical/navigation/VerticalNavHeader.js +0 -180
  287. package/src/@core/layouts/components/vertical/navigation/VerticalNavItems.js +0 -26
  288. package/src/@core/layouts/components/vertical/navigation/VerticalNavLink.js +0 -258
  289. package/src/@core/layouts/components/vertical/navigation/VerticalNavSectionTitle.js +0 -102
  290. package/src/@core/layouts/components/vertical/navigation/index.js +0 -169
  291. package/src/@core/layouts/utils.js +0 -69
  292. package/src/@core/styles/Table.module.css +0 -93
  293. package/src/@core/styles/horizontal/menuItemStyles.js +0 -100
  294. package/src/@core/styles/horizontal/menuRootStyles.js +0 -19
  295. package/src/@core/styles/libs/fullcalendar/index.js +0 -461
  296. package/src/@core/styles/libs/keen-slider/index.js +0 -111
  297. package/src/@core/styles/libs/react-apexcharts/index.js +0 -107
  298. package/src/@core/styles/libs/react-cleave/index.js +0 -33
  299. package/src/@core/styles/libs/react-credit-cards/index.js +0 -11
  300. package/src/@core/styles/libs/react-datepicker/index.js +0 -388
  301. package/src/@core/styles/libs/react-draft-wysiwyg/index.js +0 -144
  302. package/src/@core/styles/libs/react-dropzone/index.js +0 -76
  303. package/src/@core/styles/libs/react-hot-toast/index.js +0 -37
  304. package/src/@core/styles/libs/recharts/index.js +0 -47
  305. package/src/@core/styles/stepper.js +0 -103
  306. package/src/@core/styles/vertical/menuItemStyles.js +0 -138
  307. package/src/@core/styles/vertical/menuSectionStyles.js +0 -54
  308. package/src/@core/styles/vertical/navigationCustomStyles.js +0 -62
  309. package/src/@core/svg/ContentCompact.jsx +0 -17
  310. package/src/@core/svg/ContentWide.jsx +0 -17
  311. package/src/@core/svg/DirectionLtr.jsx +0 -93
  312. package/src/@core/svg/DirectionRtl.jsx +0 -93
  313. package/src/@core/svg/LayoutCollapsed.jsx +0 -59
  314. package/src/@core/svg/LayoutHorizontal.jsx +0 -42
  315. package/src/@core/svg/LayoutVertical.jsx +0 -59
  316. package/src/@core/svg/Logo.jsx +0 -76
  317. package/src/@core/svg/SkinBordered.jsx +0 -54
  318. package/src/@core/svg/SkinDefault.jsx +0 -59
  319. package/src/@core/tailwind/plugin.js +0 -78
  320. package/src/@core/theme/ThemeComponent.js +0 -63
  321. package/src/@core/theme/ThemeOptions.js +0 -71
  322. package/src/@core/theme/breakpoints/index.js +0 -11
  323. package/src/@core/theme/colorSchemes.js +0 -326
  324. package/src/@core/theme/customShadows.js +0 -11
  325. package/src/@core/theme/globalStyles.js +0 -81
  326. package/src/@core/theme/index.js +0 -42
  327. package/src/@core/theme/overrides/accordion.js +0 -51
  328. package/src/@core/theme/overrides/accordion.jsx +0 -85
  329. package/src/@core/theme/overrides/alerts.js +0 -110
  330. package/src/@core/theme/overrides/alerts.jsx +0 -180
  331. package/src/@core/theme/overrides/autocomplete.js +0 -14
  332. package/src/@core/theme/overrides/autocomplete.jsx +0 -68
  333. package/src/@core/theme/overrides/avatar.js +0 -38
  334. package/src/@core/theme/overrides/avatars.js +0 -27
  335. package/src/@core/theme/overrides/backdrop.js +0 -22
  336. package/src/@core/theme/overrides/badges.js +0 -16
  337. package/src/@core/theme/overrides/breadcrumbs.js +0 -11
  338. package/src/@core/theme/overrides/button-group.js +0 -84
  339. package/src/@core/theme/overrides/button.js +0 -93
  340. package/src/@core/theme/overrides/buttonGroup.js +0 -9
  341. package/src/@core/theme/overrides/card.js +0 -83
  342. package/src/@core/theme/overrides/checkbox.jsx +0 -95
  343. package/src/@core/theme/overrides/chip.js +0 -72
  344. package/src/@core/theme/overrides/dataGrid.js +0 -114
  345. package/src/@core/theme/overrides/dateTimePicker.js +0 -65
  346. package/src/@core/theme/overrides/dialog.js +0 -120
  347. package/src/@core/theme/overrides/divider.js +0 -13
  348. package/src/@core/theme/overrides/drawer.js +0 -20
  349. package/src/@core/theme/overrides/fab.js +0 -13
  350. package/src/@core/theme/overrides/form-control-label.js +0 -19
  351. package/src/@core/theme/overrides/icon-button.js +0 -145
  352. package/src/@core/theme/overrides/index.js +0 -103
  353. package/src/@core/theme/overrides/input.js +0 -72
  354. package/src/@core/theme/overrides/link.js +0 -9
  355. package/src/@core/theme/overrides/list.js +0 -44
  356. package/src/@core/theme/overrides/menu.js +0 -25
  357. package/src/@core/theme/overrides/pagination.js +0 -41
  358. package/src/@core/theme/overrides/paper.js +0 -9
  359. package/src/@core/theme/overrides/popover.js +0 -16
  360. package/src/@core/theme/overrides/progress.js +0 -38
  361. package/src/@core/theme/overrides/radio.jsx +0 -80
  362. package/src/@core/theme/overrides/rating.js +0 -16
  363. package/src/@core/theme/overrides/rating.jsx +0 -32
  364. package/src/@core/theme/overrides/select.js +0 -19
  365. package/src/@core/theme/overrides/select.jsx +0 -52
  366. package/src/@core/theme/overrides/slider.js +0 -97
  367. package/src/@core/theme/overrides/snackbar.js +0 -19
  368. package/src/@core/theme/overrides/switch.js +0 -73
  369. package/src/@core/theme/overrides/switches.js +0 -25
  370. package/src/@core/theme/overrides/table-pagination.js +0 -39
  371. package/src/@core/theme/overrides/table.js +0 -81
  372. package/src/@core/theme/overrides/tabs.js +0 -30
  373. package/src/@core/theme/overrides/timeline.js +0 -80
  374. package/src/@core/theme/overrides/toggle-button.js +0 -33
  375. package/src/@core/theme/overrides/toggleButton.js +0 -16
  376. package/src/@core/theme/overrides/tooltip.js +0 -21
  377. package/src/@core/theme/overrides/typography.js +0 -13
  378. package/src/@core/theme/palette/index.js +0 -107
  379. package/src/@core/theme/shadows/index.js +0 -61
  380. package/src/@core/theme/shadows.js +0 -12
  381. package/src/@core/theme/spacing/index.js +0 -3
  382. package/src/@core/theme/spacing.js +0 -5
  383. package/src/@core/theme/typography/index.js +0 -65
  384. package/src/@core/theme/typography.js +0 -84
  385. package/src/@core/utils/create-emotion-cache.js +0 -5
  386. package/src/@core/utils/hex-to-rgba.js +0 -11
  387. package/src/@core/utils/serverHelpers.js +0 -45
  388. package/src/@menu/components/RouterLink.jsx +0 -18
  389. package/src/@menu/components/horizontal-menu/HorizontalNav.jsx +0 -88
  390. package/src/@menu/components/horizontal-menu/Menu.jsx +0 -83
  391. package/src/@menu/components/horizontal-menu/MenuButton.jsx +0 -100
  392. package/src/@menu/components/horizontal-menu/MenuItem.jsx +0 -183
  393. package/src/@menu/components/horizontal-menu/SubMenu.jsx +0 -418
  394. package/src/@menu/components/horizontal-menu/SubMenuContent.jsx +0 -41
  395. package/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.jsx +0 -20
  396. package/src/@menu/components/vertical-menu/Menu.jsx +0 -161
  397. package/src/@menu/components/vertical-menu/MenuButton.jsx +0 -95
  398. package/src/@menu/components/vertical-menu/MenuItem.jsx +0 -180
  399. package/src/@menu/components/vertical-menu/MenuSection.jsx +0 -124
  400. package/src/@menu/components/vertical-menu/NavCollapseIcons.jsx +0 -70
  401. package/src/@menu/components/vertical-menu/NavHeader.jsx +0 -39
  402. package/src/@menu/components/vertical-menu/SubMenu.jsx +0 -420
  403. package/src/@menu/components/vertical-menu/SubMenuContent.jsx +0 -101
  404. package/src/@menu/components/vertical-menu/VerticalNav.jsx +0 -216
  405. package/src/@menu/contexts/horizontalNavContext.jsx +0 -29
  406. package/src/@menu/contexts/verticalNavContext.jsx +0 -65
  407. package/src/@menu/defaultConfigs.js +0 -12
  408. package/src/@menu/hooks/useHorizontalMenu.jsx +0 -19
  409. package/src/@menu/hooks/useHorizontalNav.jsx +0 -19
  410. package/src/@menu/hooks/useMediaQuery.jsx +0 -29
  411. package/src/@menu/hooks/useVerticalMenu.jsx +0 -19
  412. package/src/@menu/hooks/useVerticalNav.jsx +0 -19
  413. package/src/@menu/horizontal-menu/index.jsx +0 -8
  414. package/src/@menu/styles/StyledBackdrop.jsx +0 -15
  415. package/src/@menu/styles/StyledMenuIcon.jsx +0 -12
  416. package/src/@menu/styles/StyledMenuLabel.jsx +0 -16
  417. package/src/@menu/styles/StyledMenuPrefix.jsx +0 -10
  418. package/src/@menu/styles/StyledMenuSectionLabel.jsx +0 -21
  419. package/src/@menu/styles/StyledMenuSuffix.jsx +0 -10
  420. package/src/@menu/styles/StyledSubMenuContent.jsx +0 -43
  421. package/src/@menu/styles/horizontal/StyledHorizontalMenu.jsx +0 -13
  422. package/src/@menu/styles/horizontal/StyledHorizontalMenuItem.jsx +0 -26
  423. package/src/@menu/styles/horizontal/StyledHorizontalNav.jsx +0 -11
  424. package/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.jsx +0 -33
  425. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.jsx +0 -18
  426. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.jsx +0 -10
  427. package/src/@menu/styles/horizontal/horizontalUl.module.css +0 -15
  428. package/src/@menu/styles/styles.module.css +0 -5
  429. package/src/@menu/styles/vertical/StyledVerticalMenu.jsx +0 -16
  430. package/src/@menu/styles/vertical/StyledVerticalMenuItem.jsx +0 -28
  431. package/src/@menu/styles/vertical/StyledVerticalMenuSection.jsx +0 -23
  432. package/src/@menu/styles/vertical/StyledVerticalNav.jsx +0 -67
  433. package/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.jsx +0 -15
  434. package/src/@menu/styles/vertical/StyledVerticalNavContainer.jsx +0 -23
  435. package/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.jsx +0 -25
  436. package/src/@menu/styles/vertical/verticalNavBgImage.module.css +0 -10
  437. package/src/@menu/svg/ChevronRight.jsx +0 -9
  438. package/src/@menu/svg/Close.jsx +0 -12
  439. package/src/@menu/svg/RadioCircle.jsx +0 -12
  440. package/src/@menu/svg/RadioCircleMarked.jsx +0 -13
  441. package/src/@menu/utils/menuClasses.js +0 -44
  442. package/src/@menu/utils/menuUtils.jsx +0 -145
  443. package/src/@menu/vertical-menu/index.jsx +0 -11
  444. package/src/configs/acl.js +0 -115
  445. package/src/configs/auth.js +0 -5
  446. package/src/configs/aws-exports.js +0 -30
  447. package/src/configs/firebase.js +0 -25
  448. package/src/configs/i18n.js +0 -34
  449. package/src/configs/primaryColorConfig.js +0 -35
  450. package/src/configs/themeConfig.js +0 -44
  451. package/src/layouts/UserLayout.js +0 -94
  452. package/src/layouts/UserThemeOptions.js +0 -191
  453. package/src/layouts/components/Direction.js +0 -30
  454. package/src/layouts/components/HtmlTooltip.js +0 -15
  455. package/src/layouts/components/Translations.js +0 -11
  456. package/src/layouts/components/UserDropdown.js +0 -217
  457. package/src/layouts/components/UserIcon.js +0 -40
  458. package/src/layouts/components/acl/Can.js +0 -6
  459. package/src/layouts/components/acl/CanViewNavGroup.js +0 -36
  460. package/src/layouts/components/acl/CanViewNavLink.js +0 -17
  461. package/src/layouts/components/acl/CanViewNavSectionTitle.js +0 -17
  462. package/src/layouts/components/horizontal/AppBarContent.js +0 -39
  463. package/src/layouts/components/horizontal/ServerSideNavItems.js +0 -44
  464. package/src/layouts/components/mui/StepperComps.js +0 -55
  465. package/src/layouts/components/vertical/AppBarContent.js +0 -35
  466. package/src/layouts/components/vertical/ServerSideNavItems.js +0 -44
  467. package/src/libs/ApexCharts.jsx +0 -5
  468. package/src/libs/ReactPlayer.jsx +0 -5
  469. package/src/libs/Recharts.jsx +0 -4
  470. package/src/libs/auth.js +0 -124
  471. package/src/libs/styles/AppFullCalendar.js +0 -505
  472. package/src/libs/styles/AppKeenSlider.js +0 -116
  473. package/src/libs/styles/AppReactApexCharts.jsx +0 -110
  474. package/src/libs/styles/AppReactDatepicker.jsx +0 -470
  475. package/src/libs/styles/AppReactDropzone.js +0 -76
  476. package/src/libs/styles/AppReactToastify.jsx +0 -108
  477. package/src/libs/styles/AppRecharts.js +0 -55
  478. package/src/libs/styles/inputOtp.module.css +0 -39
  479. package/src/libs/styles/tiptapEditor.css +0 -72
  480. package/src/navigation/horizontal/index.js +0 -246
  481. package/src/navigation/vertical/index.js +0 -253
  482. package/src/pages/401.js +0 -70
  483. package/src/pages/404.js +0 -67
  484. package/src/pages/500.js +0 -68
  485. package/src/pages/[slug].js +0 -115
  486. package/src/pages/_document.js +0 -72
  487. package/src/pages/api/navigation/regenerate-registry.js +0 -116
  488. package/src/pages/api/navigation/save.js +0 -218
  489. package/src/pages/authModule/acl/index.js +0 -48
  490. package/src/pages/authModule/forgot-password/index.js +0 -228
  491. package/src/pages/authModule/permissions/rolePermissions/[id]/rolePermissionsUser/index.js +0 -392
  492. package/src/pages/authModule/permissions/rolePermissions/index.js +0 -343
  493. package/src/pages/authModule/permissions/systemPermissions/index.js +0 -354
  494. package/src/pages/authModule/privacy/index.js +0 -721
  495. package/src/pages/authModule/users/index.js +0 -210
  496. package/src/pages/login/index.js +0 -328
  497. package/src/pages/mainHome/index.js +0 -181
  498. package/src/views/builder/inspector/definitions/cell/main.js +0 -4
  499. package/src/views/builder/inspector/definitions/column/main.js +0 -9
  500. package/src/views/builder/inspector/definitions/column-group/main.js +0 -18
  501. package/src/views/builder/inspector/definitions/header-cell/main.js +0 -5
  502. package/src/views/builder/inspector/definitions/table/main.js +0 -9
  503. package/src/views/builder/viewer/renderers/CellRenderer.jsx +0 -71
  504. package/src/views/builder/viewer/renderers/ColumnGroupRenderer.jsx +0 -96
  505. package/src/views/builder/viewer/renderers/ColumnRenderer.jsx +0 -71
  506. package/src/views/builder/viewer/renderers/HeaderCellRenderer.jsx +0 -78
  507. package/src/views/builder/viewer/renderers/TabRenderer.jsx +0 -82
  508. package/src/views/builder/viewer/renderers/TableRenderer.jsx +0 -92
  509. package/src/views/pages/auth/FooterIllustrationsV2.js +0 -40
  510. package/src/views/pages/misc/FooterIllustrations.js +0 -47
  511. package/src/views/pages/misc/muiTable/CustomPagination.js +0 -34
  512. package/src/views/pages/users/UserManageDialog.js +0 -283
  513. package/src/views/pages/users/UserViewPage.js +0 -199
  514. package/src/views/users/AddUserNameDialog.js +0 -162
  515. package/src/views/users/ContactManage.js +0 -449
  516. package/src/views/users/ResetPasswordDialog.js +0 -242
@@ -0,0 +1,249 @@
1
+ import { useState, useEffect, useRef } from 'react'
2
+ import { Box, Typography } from '@mui/material'
3
+ import ViewerComponentWrapper from '../ViewerComponentWrapper'
4
+ import { resolveProps, resolveValue } from 'services/builderHelper/resolveProps'
5
+ import { thresholdColors } from 'services/builderHelper/thresholdEngine'
6
+ import { executeJSCode } from 'services/builderHelper/jsExecutor'
7
+
8
+ /**
9
+ * Robustly convert many date representations to a Unix-ms timestamp.
10
+ *
11
+ * Accepts:
12
+ * • JS Date object → new Date() from an expression
13
+ * • ISO string → "2025-12-31T23:59:59" / "2025-12-31"
14
+ * • Epoch milliseconds → 1735689600000
15
+ * • Epoch seconds → 1735689600 (detected as < 1e11)
16
+ * • Any other string → attempted via new Date()
17
+ *
18
+ * Returns null when the value cannot be parsed.
19
+ */
20
+ function toEpochMs(val) {
21
+ if (val == null || val === '') return null
22
+
23
+ // JS Date object (e.g. from expression: new Date())
24
+ if (val instanceof Date) {
25
+ return isNaN(val.getTime()) ? null : val.getTime()
26
+ }
27
+
28
+ // Numeric epoch — distinguish seconds vs milliseconds
29
+ if (typeof val === 'number') {
30
+ if (!isFinite(val)) return null
31
+ // Epoch seconds heuristic: < 1e11 (year ~5138 in ms, but year ~1973 in sec)
32
+ return val < 1e11 ? val * 1000 : val
33
+ }
34
+
35
+ // String
36
+ const str = String(val).trim()
37
+ if (!str) return null
38
+
39
+ // Date-only strings ("2025-12-31") are parsed as UTC midnight by the spec,
40
+ // which can shift the day in negative-UTC-offset zones.
41
+ // Normalise to local midnight by replacing the separator so it parses as local.
42
+ const dateOnly = /^\d{4}-\d{2}-\d{2}$/.test(str)
43
+ const d = dateOnly ? new Date(`${str}T00:00:00`) : new Date(str)
44
+ return isNaN(d.getTime()) ? null : d.getTime()
45
+ }
46
+
47
+ function calcRemaining(epochMs) {
48
+ const diff = Math.max(0, epochMs - Date.now())
49
+ const totalSec = Math.floor(diff / 1000)
50
+ return {
51
+ days: Math.floor(totalSec / 86400),
52
+ hours: Math.floor((totalSec % 86400) / 3600),
53
+ minutes: Math.floor((totalSec % 3600) / 60),
54
+ seconds: totalSec % 60,
55
+ total: totalSec,
56
+ done: totalSec <= 0,
57
+ }
58
+ }
59
+
60
+ export default function CountdownRenderer({ node, viewerContext }) {
61
+ const main = resolveProps(node, 'main', viewerContext)
62
+ const { data, setData, isEditMode } = viewerContext ?? {}
63
+
64
+ const {
65
+ // data binding — targetDateKey is the data key; targetDate is a static fallback
66
+ targetDateKey,
67
+ targetDate,
68
+
69
+ // segments
70
+ showDays = true,
71
+ showHours = true,
72
+ showMinutes = true,
73
+ showSeconds = true,
74
+
75
+ // labels
76
+ label,
77
+ doneLabel = 'Done!',
78
+
79
+ // unit label overrides (default: days / hrs / min / sec)
80
+ labelDays = 'days',
81
+ labelHours = 'hrs',
82
+ labelMinutes = 'min',
83
+ labelSeconds = 'sec',
84
+
85
+ // thresholds against total remaining seconds
86
+ thresholds = [],
87
+
88
+ // layout
89
+ size = 'medium',
90
+ align = 'center',
91
+ separator = ':',
92
+
93
+ // coloring
94
+ color, // explicit digit color (overrides threshold)
95
+ unitColor, // unit label color (default: text.disabled)
96
+ separatorColor, // separator color (default: text.disabled)
97
+ doneLabelColor = 'success.main',
98
+
99
+ // digit styling
100
+ numberFontWeight = 800,
101
+
102
+ // top label styling
103
+ labelFontSize,
104
+ labelFontWeight = 400,
105
+ labelColor = 'text.secondary',
106
+
107
+ // on-done action
108
+ onDoneCode,
109
+ } = main
110
+
111
+ // Resolve the target key as either a data-key string or a direct value (e.g. new Date())
112
+ const rawTarget = resolveValue(targetDateKey, data) ?? targetDate
113
+ const epochMs = toEpochMs(rawTarget)
114
+
115
+ const [remaining, setRemaining] = useState(() =>
116
+ epochMs != null ? calcRemaining(epochMs) : null
117
+ )
118
+
119
+ // Track whether onDoneCode has already fired for the current epochMs
120
+ // so it only triggers once per countdown target, not on every re-render.
121
+ const firedDoneRef = useRef(false)
122
+
123
+ useEffect(() => {
124
+ // Reset the "fired" flag whenever the target changes
125
+ firedDoneRef.current = false
126
+ }, [epochMs])
127
+
128
+ useEffect(() => {
129
+ if (epochMs == null || isEditMode) {
130
+ setRemaining(epochMs != null ? calcRemaining(epochMs) : null)
131
+ return
132
+ }
133
+ const tick = () => setRemaining(calcRemaining(epochMs))
134
+ tick()
135
+ const id = setInterval(tick, 1000)
136
+ return () => clearInterval(id)
137
+ }, [epochMs, isEditMode])
138
+
139
+ // Fire onDoneCode exactly once when the countdown transitions to done
140
+ useEffect(() => {
141
+ if (!remaining?.done || !onDoneCode || isEditMode || firedDoneRef.current) return
142
+ firedDoneRef.current = true
143
+ executeJSCode(onDoneCode, {
144
+ data: data ?? {},
145
+ form: {},
146
+ setData: setData ?? (() => {}),
147
+ }).catch(e => console.error('[Countdown] onDone error:', e))
148
+ }, [remaining?.done, onDoneCode, isEditMode, data, setData])
149
+
150
+ // Threshold color (based on remaining seconds)
151
+ const { color: threshColor } = thresholdColors(remaining?.total ?? 0, thresholds)
152
+ const digitColor = color
153
+ || (thresholds.length && threshColor !== 'inherit' ? threshColor : 'text.primary')
154
+
155
+ const numSz = size === 'small' ? 22 : size === 'large' ? 42 : 30
156
+ const lblSz = size === 'small' ? 9 : size === 'large' ? 13 : 11
157
+ const sepSz = numSz * 0.7
158
+
159
+ // ── No target bound ──
160
+ if (epochMs == null) {
161
+ return (
162
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
163
+ <Box sx={{ border: '1px dashed', borderColor: 'divider', borderRadius: 1, p: 1.5, textAlign: 'center' }}>
164
+ <Typography variant='caption' color='text.disabled'>
165
+ Countdown — bind targetDateKey or set targetDate
166
+ </Typography>
167
+ </Box>
168
+ </ViewerComponentWrapper>
169
+ )
170
+ }
171
+
172
+ // ── Done state ──
173
+ if (remaining?.done) {
174
+ return (
175
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
176
+ <Box sx={{ textAlign: align }}>
177
+ <Typography sx={{ fontSize: numSz * 0.6, fontWeight: 700, color: doneLabelColor }}>
178
+ {doneLabel}
179
+ </Typography>
180
+ </Box>
181
+ </ViewerComponentWrapper>
182
+ )
183
+ }
184
+
185
+ // ── Ticking ──
186
+ const segments = [
187
+ { value: remaining?.days, label: labelDays, show: showDays },
188
+ { value: remaining?.hours, label: labelHours, show: showHours },
189
+ { value: remaining?.minutes, label: labelMinutes, show: showMinutes },
190
+ { value: remaining?.seconds, label: labelSeconds, show: showSeconds },
191
+ ].filter(s => s.show)
192
+
193
+ return (
194
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
195
+ <Box sx={{ textAlign: align }}>
196
+ {label && (
197
+ <Typography sx={{
198
+ fontSize: labelFontSize != null ? Number(labelFontSize) : lblSz + 1,
199
+ fontWeight: labelFontWeight,
200
+ color: labelColor,
201
+ mb: 0.5,
202
+ lineHeight: 1.3,
203
+ }}>
204
+ {label}
205
+ </Typography>
206
+ )}
207
+
208
+ <Box sx={{ display: 'inline-flex', alignItems: 'flex-end', gap: 0.5 }}>
209
+ {segments.map((seg, i) => (
210
+ <Box key={seg.label} sx={{ display: 'inline-flex', alignItems: 'flex-end', gap: 0.25 }}>
211
+ <Box sx={{ textAlign: 'center' }}>
212
+ <Typography sx={{
213
+ fontSize: numSz,
214
+ fontWeight: numberFontWeight,
215
+ lineHeight: 1,
216
+ color: digitColor,
217
+ fontVariantNumeric: 'tabular-nums',
218
+ minWidth: numSz,
219
+ transition: 'color .3s',
220
+ }}>
221
+ {String(seg.value ?? 0).padStart(2, '0')}
222
+ </Typography>
223
+ <Typography sx={{
224
+ fontSize: lblSz,
225
+ color: unitColor || 'text.disabled',
226
+ lineHeight: 1.2,
227
+ }}>
228
+ {seg.label}
229
+ </Typography>
230
+ </Box>
231
+
232
+ {i < segments.length - 1 && (
233
+ <Typography sx={{
234
+ fontSize: sepSz,
235
+ fontWeight: 300,
236
+ color: separatorColor || 'text.disabled',
237
+ lineHeight: 1,
238
+ mb: lblSz * 0.12,
239
+ }}>
240
+ {separator}
241
+ </Typography>
242
+ )}
243
+ </Box>
244
+ ))}
245
+ </Box>
246
+ </Box>
247
+ </ViewerComponentWrapper>
248
+ )
249
+ }
@@ -0,0 +1,380 @@
1
+ import { Box, Button, IconButton, Tooltip, Typography } from '@mui/material'
2
+ import { useRef, useMemo, useCallback, useEffect } from 'react'
3
+ import { AgGridReact } from 'ag-grid-react'
4
+ import { themeQuartz } from 'ag-grid-community'
5
+ import { AddOutlined, DeleteOutlined, TableChartOutlined } from '@mui/icons-material'
6
+ import ViewerComponentWrapper from '../ViewerComponentWrapper'
7
+ import RowActionsCell from './RowActionsCell'
8
+ import { resolveProps } from 'services/builderHelper/resolveProps'
9
+ import { executeJSCode } from 'services/builderHelper/jsExecutor'
10
+ import { processColumnDefinitions, processColumnsConfig } from 'views/genericTable/convertStringFunctions'
11
+ import { AG_COMPONENTS } from './dataGridComponents'
12
+
13
+ // ── Shared AG Grid theme (same as SGrid) ──────────────────────────────────────
14
+ const agTheme = themeQuartz.withParams({ accentColor: '#FF1185' })
15
+
16
+ // ── Delete-column cell renderer ───────────────────────────────────────────────
17
+ // Defined at module level so AG Grid never receives a new component reference.
18
+ // Receives `context.onDelete` via the grid's context prop.
19
+ function DeleteCellRenderer({ data: rowData, context }) {
20
+ return (
21
+ <Box sx={{ display: 'flex', alignItems: 'center', height: '100%' }}>
22
+ <Tooltip title='Remove row'>
23
+ <IconButton
24
+ size='small'
25
+ onClick={() => context?.onDelete?.(rowData)}
26
+ sx={{ color: 'error.light', p: 0.5 }}
27
+ >
28
+ <DeleteOutlined sx={{ fontSize: 16 }} />
29
+ </IconButton>
30
+ </Tooltip>
31
+ </Box>
32
+ )
33
+ }
34
+
35
+ // ── Default colDef applied to every column ────────────────────────────────────
36
+ const DEFAULT_COL_DEF = { resizable: true, sortable: true, filter: true, minWidth: 80 }
37
+
38
+ // ── Helper: generate a stable row ID ─────────────────────────────────────────
39
+ function genId() {
40
+ return (typeof crypto !== 'undefined' && crypto.randomUUID)
41
+ ? crypto.randomUUID()
42
+ : `${Date.now()}-${Math.random().toString(36).slice(2)}`
43
+ }
44
+
45
+ // ─────────────────────────────────────────────────────────────────────────────
46
+
47
+ export default function DataGridRenderer({ node, viewerContext }) {
48
+ const {
49
+ form, data, setData, dataRef, reportRefs, openDialog, closeDialog, isEditMode,
50
+ } = viewerContext
51
+
52
+ const main = resolveProps(node, 'main', viewerContext)
53
+
54
+ const {
55
+ key: nodeKey,
56
+ dataKey,
57
+ columns: columnsProp, // expression → array of AG Grid colDef objects
58
+ extraCols, // extra-cols-editor
59
+ columnsConfig, // columns-config-editor
60
+ actionsConfig, // actions-config-editor
61
+ addLabel,
62
+ addRow: addRowCode, // code field → JS that returns a new row object
63
+ readOnly = false,
64
+ showAddBtn = true,
65
+ showDeleteCol = true,
66
+ height,
67
+ rowSelection, // 'single' | 'multiple'
68
+ pagination,
69
+ pageSize,
70
+ } = main
71
+
72
+ const nodeName = nodeKey || node.id
73
+ const storageKey = dataKey || `__dg_${node.id}`
74
+
75
+ // ── Rows live in data[storageKey] ─────────────────────────────────────────
76
+ const rows = useMemo(() => {
77
+ const arr = data?.[storageKey]
78
+ return Array.isArray(arr) ? arr : []
79
+ }, [data, storageKey])
80
+
81
+ // Auto-stamp __id on any rows that arrive without one (e.g. fetched from DB).
82
+ // Runs only when there are actually rows missing __id, so it won't loop.
83
+ useEffect(() => {
84
+ const arr = data?.[storageKey]
85
+ if (!Array.isArray(arr) || arr.length === 0) return
86
+ if (arr.every(r => r.__id)) return // all good — nothing to do
87
+ setData(prev => ({
88
+ ...prev,
89
+ [storageKey]: (Array.isArray(prev?.[storageKey]) ? prev[storageKey] : [])
90
+ .map(r => r.__id ? r : { ...r, __id: genId() }),
91
+ }))
92
+ }, [data, storageKey, setData])
93
+
94
+ // Keep a stable context snapshot so actionsConfig renderer always sees fresh state
95
+ const ctxRef = useRef(viewerContext)
96
+ ctxRef.current = viewerContext
97
+
98
+ // Stable refs so registered functions always call the latest setData / storageKey
99
+ // without needing to re-register on every render.
100
+ const setDataRef = useRef(setData)
101
+ const storageKeyRef = useRef(storageKey)
102
+ const rowsRef = useRef(rows)
103
+ setDataRef.current = setData
104
+ storageKeyRef.current = storageKey
105
+ rowsRef.current = rows
106
+
107
+ useEffect(() => {
108
+ if (!reportRefs?.current) return
109
+
110
+ const entry = {
111
+ get rows() { return rowsRef.current },
112
+ get storageKey() { return storageKeyRef.current },
113
+ setRows(arr) {
114
+ const stamped = (Array.isArray(arr) ? arr : []).map(r => r.__id ? r : { ...r, __id: genId() })
115
+ const key = storageKeyRef.current
116
+ setDataRef.current(prev => ({ ...prev, [key]: stamped }))
117
+ },
118
+ addRow(obj = {}) {
119
+ const row = { ...obj, __id: obj.__id ?? genId() }
120
+ const key = storageKeyRef.current
121
+ setDataRef.current(prev => ({
122
+ ...prev,
123
+ [key]: [...(Array.isArray(prev?.[key]) ? prev[key] : []), row],
124
+ }))
125
+ },
126
+ deleteRow(id) {
127
+ const key = storageKeyRef.current
128
+ setDataRef.current(prev => ({
129
+ ...prev,
130
+ [key]: (Array.isArray(prev?.[key]) ? prev[key] : []).filter(r => r.__id !== id),
131
+ }))
132
+ },
133
+ }
134
+
135
+ reportRefs.current[nodeName] = entry
136
+ return () => { if (reportRefs?.current) delete reportRefs.current[nodeName] }
137
+ // Only re-register if the node name or the refs object changes — not on every render
138
+ // eslint-disable-next-line react-hooks/exhaustive-deps
139
+ }, [nodeName, reportRefs])
140
+
141
+ // ── Actions column renderer (stable) ────────────────────────────────────────
142
+ const actionsArr = Array.isArray(actionsConfig) && actionsConfig.length > 0 ? actionsConfig : null
143
+
144
+ const actionsRenderer = useCallback(
145
+ actionsArr
146
+ ? (params) => (
147
+ <RowActionsCell
148
+ params={params}
149
+ actionsConfig={actionsArr}
150
+ viewerContext={ctxRef.current}
151
+ nodeName={nodeName}
152
+ />
153
+ )
154
+ : null,
155
+ // Recreate only when config shape or nodeName changes
156
+ // eslint-disable-next-line react-hooks/exhaustive-deps
157
+ [JSON.stringify(actionsArr), nodeName]
158
+ )
159
+
160
+ // ── Column definitions ───────────────────────────────────────────────────────
161
+ const colDefs = useMemo(() => {
162
+ const ctx = {
163
+ reportRefs: reportRefs?.current ?? {},
164
+ nodeName,
165
+ data,
166
+ openDialog: openDialog ?? (() => {}),
167
+ closeDialog: closeDialog ?? (() => {}),
168
+ }
169
+
170
+ // 1. Base columns from expression prop
171
+ let cols = Array.isArray(columnsProp)
172
+ ? processColumnDefinitions([...columnsProp], ctx)
173
+ : []
174
+
175
+ // 2. Extra columns (from ExtraColsEditor)
176
+ if (Array.isArray(extraCols) && extraCols.length > 0) {
177
+ cols = [...cols, ...processColumnDefinitions([...extraCols], ctx)]
178
+ }
179
+
180
+ // 3. Apply columnsConfig overrides (from ColumnsConfigEditor)
181
+ if (Array.isArray(columnsConfig) && columnsConfig.length > 0) {
182
+ const processed = processColumnsConfig(columnsConfig, ctx)
183
+ const overrideMap = {}
184
+ processed.forEach(item => { if (item?.field) overrideMap[item.field] = item.config })
185
+ cols = cols.map(col => overrideMap[col.field] ? { ...col, ...overrideMap[col.field] } : col)
186
+ }
187
+
188
+ // 4. Actions column (pinned right)
189
+ if (actionsRenderer) {
190
+ cols.push({
191
+ field: '__actions',
192
+ headerName: 'Actions',
193
+ width: 110,
194
+ minWidth: 80,
195
+ pinned: 'right',
196
+ sortable: false,
197
+ filter: false,
198
+ resizable: false,
199
+ cellRenderer: actionsRenderer,
200
+ })
201
+ }
202
+
203
+ // 5. Delete column (pinned right, always last) — hidden in read-only mode
204
+ if (!readOnly && showDeleteCol) {
205
+ cols.push({
206
+ field: '__delete',
207
+ headerName: '',
208
+ width: 48,
209
+ minWidth: 48,
210
+ maxWidth: 48,
211
+ pinned: 'right',
212
+ sortable: false,
213
+ filter: false,
214
+ resizable: false,
215
+ cellRenderer: DeleteCellRenderer,
216
+ })
217
+ }
218
+
219
+ return cols
220
+ }, [columnsProp, extraCols, columnsConfig, actionsRenderer, readOnly, showDeleteCol, nodeName, data, openDialog, closeDialog, reportRefs])
221
+
222
+ // ── Row manipulation ─────────────────────────────────────────────────────────
223
+
224
+ const handleAddRow = useCallback(async () => {
225
+ let newRow = {}
226
+ if (addRowCode) {
227
+ try {
228
+ const result = await executeJSCode(addRowCode, {
229
+ form, data, setData,
230
+ dataRef: dataRef?.current ?? {},
231
+ reportRefs: reportRefs?.current ?? {},
232
+ openDialog, closeDialog,
233
+ })
234
+ if (result && typeof result === 'object' && !Array.isArray(result)) newRow = result
235
+ } catch (e) {
236
+ console.error('[DataGrid] addRow error:', e)
237
+ }
238
+ }
239
+ // Always stamp a stable __id so getRowId and delete work correctly
240
+ if (!newRow.__id) newRow.__id = genId()
241
+
242
+ setData(prev => ({
243
+ ...prev,
244
+ [storageKey]: [...(Array.isArray(prev?.[storageKey]) ? prev[storageKey] : []), newRow],
245
+ }))
246
+ }, [addRowCode, form, data, setData, dataRef, reportRefs, openDialog, closeDialog, storageKey])
247
+
248
+ const handleDeleteRow = useCallback((rowData) => {
249
+ setData(prev => ({
250
+ ...prev,
251
+ [storageKey]: (Array.isArray(prev?.[storageKey]) ? prev[storageKey] : [])
252
+ .filter(r => r.__id !== rowData.__id),
253
+ }))
254
+ }, [setData, storageKey])
255
+
256
+ const onCellValueChanged = useCallback((params) => {
257
+ const { field } = params.colDef
258
+ console.log(`[DataGrid] onCellValueChanged field="${field}" newValue=`, params.newValue, 'rowId=', params.data?.__id)
259
+ if (!field || field.startsWith('__')) return
260
+ // Guard: if newValue is undefined this is a phantom revert from the MultiSelectEditor
261
+ // cancel path — the real value was already committed via setDataValue above.
262
+ if (params.newValue === undefined && params.colDef?.cellEditor === 'MultiSelectEditor') {
263
+ console.log('[DataGrid] onCellValueChanged — skipping phantom revert for MultiSelectEditor')
264
+ return
265
+ }
266
+ setData(prev => {
267
+ const arr = [...(Array.isArray(prev?.[storageKey]) ? prev[storageKey] : [])]
268
+ const idx = arr.findIndex(r => r.__id === params.data.__id)
269
+ if (idx !== -1) arr[idx] = { ...arr[idx], [field]: params.newValue }
270
+ return { ...prev, [storageKey]: arr }
271
+ })
272
+ }, [setData, storageKey])
273
+
274
+ // Provide an updateRef compatible with setRefValue/getRefValue helpers used in valueSetters.
275
+ // DataGrid manages state via React (onCellValueChanged), but the updateRef lets valueSetter
276
+ // code call setRefValue/getRefValue without throwing — the ref tracks in-flight edits.
277
+ const updateRef = useRef([])
278
+
279
+ // Stable grid context so DeleteCellRenderer doesn't remount on every render
280
+ const gridContext = useMemo(() => ({
281
+ onDelete: handleDeleteRow,
282
+ updateRef, // exposed as context.updateRef inside valueSetter / valueGetter functions
283
+ nodeName, // exposed as context.nodeId for cross-table helpers
284
+ // Returns the LATEST viewerContext snapshot — safe to call from inside editors
285
+ // without adding viewerContext as a dependency (avoids remounting on every data change)
286
+ getViewerContext: () => ctxRef.current,
287
+ }), [handleDeleteRow, nodeName])
288
+
289
+ const getRowId = useCallback(
290
+ params => params.data.__id ?? String(params.node.rowIndex),
291
+ []
292
+ )
293
+
294
+ // Memoised so AG Grid only sees a new object when readOnly actually changes,
295
+ // not on every parent render (which would cause a full column re-initialisation).
296
+ const defaultColDef = useMemo(
297
+ () => ({ ...DEFAULT_COL_DEF, ...(readOnly ? { editable: false } : {}) }),
298
+ [readOnly]
299
+ )
300
+
301
+ // ── Edit-mode placeholder ────────────────────────────────────────────────────
302
+ if (isEditMode) {
303
+ return (
304
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
305
+ <Box
306
+ sx={{
307
+ border: '1px dashed',
308
+ borderColor: 'primary.light',
309
+ borderRadius: 1,
310
+ p: 2,
311
+ bgcolor: 'action.hover',
312
+ minHeight: 80,
313
+ display: 'flex',
314
+ flexDirection: 'column',
315
+ gap: 1,
316
+ }}
317
+ >
318
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>
319
+ <TableChartOutlined sx={{ fontSize: 14, color: 'text.disabled' }} />
320
+ <Typography sx={{ fontSize: 10, color: 'text.secondary', textTransform: 'uppercase', letterSpacing: 0.5 }}>
321
+ Data Grid
322
+ {storageKey ? ` · ${storageKey}` : ''}
323
+ {Array.isArray(columnsProp) ? ` · ${columnsProp.length} col${columnsProp.length !== 1 ? 's' : ''}` : ''}
324
+ {Array.isArray(extraCols) && extraCols.length > 0 ? ` + ${extraCols.length} extra` : ''}
325
+ </Typography>
326
+ </Box>
327
+ {(Array.isArray(actionsConfig) && actionsConfig.length > 0) && (
328
+ <Typography sx={{ fontSize: 9, color: 'text.disabled' }}>
329
+ {actionsConfig.length} action{actionsConfig.length !== 1 ? 's' : ''} configured
330
+ </Typography>
331
+ )}
332
+ </Box>
333
+ </ViewerComponentWrapper>
334
+ )
335
+ }
336
+
337
+ // ── Preview / production ─────────────────────────────────────────────────────
338
+ return (
339
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
340
+
341
+ {/* Toolbar */}
342
+ {!readOnly && showAddBtn !== false && (
343
+ <Box sx={{ display: 'flex', alignItems: 'center', mb: 1, gap: 1 }}>
344
+ <Button
345
+ size='small'
346
+ variant='outlined'
347
+ startIcon={<AddOutlined fontSize='small' />}
348
+ onClick={handleAddRow}
349
+ >
350
+ {addLabel || 'Add Row'}
351
+ </Button>
352
+ <Typography variant='caption' sx={{ color: 'text.disabled', ml: 'auto' }}>
353
+ {rows.length} row{rows.length !== 1 ? 's' : ''}
354
+ </Typography>
355
+ </Box>
356
+ )}
357
+
358
+ {/* AG Grid */}
359
+ <Box style={{ height: height ?? 400, width: '100%' }}>
360
+ <AgGridReact
361
+ theme={agTheme}
362
+ rowData={rows}
363
+ columnDefs={colDefs}
364
+ defaultColDef={defaultColDef}
365
+ getRowId={getRowId}
366
+ context={gridContext}
367
+ components={AG_COMPONENTS}
368
+ onCellValueChanged={onCellValueChanged}
369
+ rowSelection={rowSelection && rowSelection !== 'none' ? { mode: rowSelection === 'multiple' ? 'multiRow' : 'singleRow' } : undefined}
370
+ pagination={!!pagination}
371
+ paginationPageSize={pageSize ?? 20}
372
+ suppressRowTransform
373
+ suppressMovableColumns={false}
374
+ readOnlyEdit={readOnly}
375
+ />
376
+ </Box>
377
+
378
+ </ViewerComponentWrapper>
379
+ )
380
+ }