robobyte-front-builder 1.0.19 → 1.0.23

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