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,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
+ }