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
@@ -4,46 +4,47 @@ import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'
4
4
  import { TextField } from '@mui/material'
5
5
  import dayjs from 'dayjs'
6
6
  import ViewerComponentWrapper from '../ViewerComponentWrapper'
7
+ import FieldLabel from '../FieldLabel'
7
8
  import { resolveProps } from 'services/builderHelper/resolveProps'
9
+ import { runFieldAction } from 'services/builderHelper/actionExecutor'
8
10
 
9
11
  export default function TimePickerRenderer({ node, viewerContext }) {
10
12
  const { data, form, updateFormValue, validationErrors } = viewerContext
11
- const main = resolveProps(node, 'main', { form, data })
13
+ const main = resolveProps(node, 'main', viewerContext)
12
14
 
13
- // Get component key
14
15
  const key = node.props?.main?.key?.value || node.props?.main?.key || node.id
15
-
16
- // Get value from form state
17
16
  const value = form[key] || null
17
+ const error = validationErrors?.[key]
18
18
 
19
- // Get validation error
20
- const error = validationErrors[key]
19
+ const { label, labelPosition, required, helperText, ...pickerProps } = main
21
20
 
22
21
  const handleChange = (newValue) => {
23
- // Store as dayjs object or ISO string depending on preference
24
- updateFormValue(key, newValue ? newValue.toISOString() : null)
22
+ const iso = newValue ? newValue.toISOString() : null
23
+ updateFormValue(key, iso)
24
+ runFieldAction(node, viewerContext, 'onChange', iso)
25
25
  }
26
26
 
27
- // Convert value to dayjs if it exists
28
27
  const dayjsValue = value ? dayjs(value) : null
29
28
 
30
29
  return (
31
30
  <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
32
- <LocalizationProvider dateAdapter={AdapterDayjs}>
33
- <TimePicker
34
- {...main}
35
- value={dayjsValue}
36
- onChange={handleChange}
37
- renderInput={(params) => (
38
- <TextField
39
- {...params}
40
- fullWidth
41
- error={!!error}
42
- helperText={error || main.helperText}
43
- />
44
- )}
45
- />
46
- </LocalizationProvider>
31
+ <FieldLabel label={label} required={required} labelPosition={labelPosition} error={!!error}>
32
+ <LocalizationProvider dateAdapter={AdapterDayjs}>
33
+ <TimePicker
34
+ {...pickerProps}
35
+ value={dayjsValue}
36
+ onChange={handleChange}
37
+ renderInput={(params) => (
38
+ <TextField
39
+ {...params}
40
+ fullWidth
41
+ error={!!error}
42
+ helperText={error || helperText}
43
+ />
44
+ )}
45
+ />
46
+ </LocalizationProvider>
47
+ </FieldLabel>
47
48
  </ViewerComponentWrapper>
48
49
  )
49
50
  }
@@ -0,0 +1,525 @@
1
+ import { Box, Typography } from '@mui/material'
2
+ import ViewerComponentWrapper from '../ViewerComponentWrapper'
3
+ import { resolveProps, resolveValue } from 'services/builderHelper/resolveProps'
4
+ import { evaluateThreshold, resolveMuiColor } from 'services/builderHelper/thresholdEngine'
5
+ import { schemaColor, DEFAULT_PALETTE } from 'services/builderHelper/colorSchema'
6
+ import { formatNumber } from 'services/builderHelper/numberFormat'
7
+ import { runKpiAction } from 'services/builderHelper/actionExecutor'
8
+
9
+ // ── Status helpers ────────────────────────────────────────────────────────────
10
+
11
+ const DONE_STATUSES = new Set(['done', 'success', 'completed', 'approved', 'closed', 'resolved'])
12
+ const ACTIVE_STATUSES = new Set(['active', 'current', 'in-progress', 'inprogress', 'running', 'open'])
13
+ const WARNING_STATUSES = new Set(['warning', 'warn', 'at-risk', 'atrisk', 'delayed'])
14
+ const ERROR_STATUSES = new Set(['error', 'failed', 'rejected', 'cancelled', 'blocked'])
15
+ const PENDING_STATUSES = new Set(['pending', 'todo', 'future', 'upcoming', 'planned', 'not-started'])
16
+
17
+ function classifyStatus(s) {
18
+ const v = (s || '').toLowerCase()
19
+ if (DONE_STATUSES.has(v)) return 'done'
20
+ if (ACTIVE_STATUSES.has(v)) return 'active'
21
+ if (WARNING_STATUSES.has(v)) return 'warning'
22
+ if (ERROR_STATUSES.has(v)) return 'error'
23
+ if (PENDING_STATUSES.has(v)) return 'pending'
24
+ return 'default'
25
+ }
26
+
27
+ // Default color per status class
28
+ const CLASS_COLORS = {
29
+ done: '#4caf50',
30
+ active: '#1976d2',
31
+ warning: '#ff9800',
32
+ error: '#f44336',
33
+ pending: '#bdbdbd',
34
+ default: '#bdbdbd',
35
+ }
36
+
37
+ // Badge colors (bg / text)
38
+ const BADGE_STYLES = {
39
+ done: { bg: '#e8f5e9', color: '#2e7d32' },
40
+ active: { bg: '#e3f2fd', color: '#1565c0' },
41
+ warning: { bg: '#fff8e1', color: '#e65100' },
42
+ error: { bg: '#ffebee', color: '#c62828' },
43
+ pending: { bg: '#f5f5f5', color: '#757575' },
44
+ default: { bg: '#f5f5f5', color: '#757575' },
45
+ }
46
+
47
+ // ── Sample data ───────────────────────────────────────────────────────────────
48
+
49
+ const SAMPLE_EVENTS = [
50
+ {
51
+ label: 'Project kickoff',
52
+ date: 'Jan 12, 2025',
53
+ status: 'done',
54
+ description: 'Stakeholders aligned. Scope and budget finalized.',
55
+ value: '100%',
56
+ },
57
+ {
58
+ label: 'Design review',
59
+ date: 'Jan 28, 2025',
60
+ status: 'done',
61
+ description: 'UI/UX designs approved by product team.',
62
+ value: '100%',
63
+ },
64
+ {
65
+ label: 'Development sprint',
66
+ date: 'Feb 10, 2025',
67
+ status: 'active',
68
+ description: 'Backend APIs complete. Frontend 60% done.',
69
+ value: '60%',
70
+ },
71
+ {
72
+ label: 'QA & testing',
73
+ date: 'Feb 24, 2025',
74
+ status: 'pending',
75
+ description: 'Regression suite and UAT sessions planned.',
76
+ value: '—',
77
+ },
78
+ {
79
+ label: 'Production release',
80
+ date: 'Mar 5, 2025',
81
+ status: 'pending',
82
+ description: '',
83
+ value: '—',
84
+ },
85
+ ]
86
+
87
+ // ── Dot component ─────────────────────────────────────────────────────────────
88
+
89
+ function TimelineDot({ sz, color, statusClass, dotStyle, icon }) {
90
+ const isPending = statusClass === 'pending' || dotStyle === 'ring'
91
+ const isDone = statusClass === 'done'
92
+ const isActive = statusClass === 'active'
93
+ const isWarning = statusClass === 'warning'
94
+ const isError = statusClass === 'error'
95
+ const isAuto = !dotStyle || dotStyle === 'auto'
96
+
97
+ // Inner glyph
98
+ const glyph = icon
99
+ ? icon
100
+ : isAuto
101
+ ? (isDone ? '✓' : isError ? '✕' : isWarning ? '!' : null)
102
+ : null
103
+
104
+ const useRing = isAuto ? isPending : dotStyle === 'ring'
105
+
106
+ return (
107
+ <Box sx={{ position: 'relative', flexShrink: 0 }}>
108
+ {/* Pulse ring for active */}
109
+ {isActive && (
110
+ <Box sx={{
111
+ position: 'absolute',
112
+ inset: -4,
113
+ borderRadius: '50%',
114
+ border: `2px solid ${color}`,
115
+ opacity: 0.35,
116
+ animation: 'none',
117
+ }} />
118
+ )}
119
+ <Box sx={{
120
+ width: sz,
121
+ height: sz,
122
+ borderRadius: '50%',
123
+ bgcolor: useRing ? 'transparent' : color,
124
+ border: useRing ? `2px solid ${color}` : 'none',
125
+ display: 'flex',
126
+ alignItems: 'center',
127
+ justifyContent: 'center',
128
+ flexShrink: 0,
129
+ boxShadow: isActive ? `0 0 0 3px ${color}28` : 'none',
130
+ transition: 'all .2s',
131
+ }}>
132
+ {glyph && (
133
+ <Typography sx={{
134
+ fontSize: Math.max(8, sz * 0.52),
135
+ color: useRing ? color : '#fff',
136
+ fontWeight: 800,
137
+ lineHeight: 1,
138
+ userSelect: 'none',
139
+ }}>
140
+ {glyph}
141
+ </Typography>
142
+ )}
143
+ </Box>
144
+ </Box>
145
+ )
146
+ }
147
+
148
+ // ── Connector line ────────────────────────────────────────────────────────────
149
+
150
+ function Connector({ lineColor, lineWidth, lineStyle, filled, filledColor }) {
151
+ return (
152
+ <Box sx={{
153
+ flex: 1,
154
+ width: lineWidth,
155
+ minHeight: 16,
156
+ mx: 'auto',
157
+ my: '3px',
158
+ borderLeft: `${lineWidth}px ${lineStyle} ${filled ? filledColor : lineColor}`,
159
+ opacity: filled ? 0.9 : 0.45,
160
+ }} />
161
+ )
162
+ }
163
+
164
+ // ── Badge pill ────────────────────────────────────────────────────────────────
165
+
166
+ function StatusBadge({ text, statusClass, fontSize }) {
167
+ const { bg, color } = BADGE_STYLES[statusClass] ?? BADGE_STYLES.default
168
+ return (
169
+ <Box sx={{
170
+ display: 'inline-flex',
171
+ alignItems: 'center',
172
+ px: 0.75,
173
+ py: '1px',
174
+ borderRadius: 10,
175
+ bgcolor: bg,
176
+ flexShrink: 0,
177
+ }}>
178
+ <Typography sx={{ fontSize: fontSize ?? 10, fontWeight: 600, color, lineHeight: 1.6, textTransform: 'capitalize' }}>
179
+ {text}
180
+ </Typography>
181
+ </Box>
182
+ )
183
+ }
184
+
185
+ // ── Content card ──────────────────────────────────────────────────────────────
186
+
187
+ function EventContent({ item, labelField, dateField, descField, statusField, valueField,
188
+ showDate, showBadge, showValue, density, dotColor, statusClass, format, prefix, suffix }) {
189
+
190
+ const label = item[labelField] ?? '—'
191
+ const date = item[dateField]
192
+ const desc = item[descField]
193
+ const status = item[statusField]
194
+ const value = valueField ? item[valueField] : null
195
+
196
+ const titleSz = density === 'compact' ? 12 : 13
197
+ const descSz = density === 'compact' ? 11 : 12
198
+ const dateSz = density === 'compact' ? 10 : 11
199
+
200
+ const formattedValue = value != null && typeof value === 'number'
201
+ ? formatNumber(value, { format, prefix, suffix })
202
+ : value
203
+
204
+ return (
205
+ <Box sx={{ flex: 1, minWidth: 0 }}>
206
+ {/* Title row */}
207
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.75, flexWrap: 'wrap' }}>
208
+ <Typography sx={{ fontSize: titleSz, fontWeight: 600, color: 'text.primary', lineHeight: 1.35 }}>
209
+ {label}
210
+ </Typography>
211
+ {showBadge && status && (
212
+ <StatusBadge text={status} statusClass={statusClass} fontSize={dateSz - 1} />
213
+ )}
214
+ {showValue && formattedValue != null && (
215
+ <Box sx={{ ml: 'auto', flexShrink: 0 }}>
216
+ <Typography sx={{ fontSize: dateSz, fontWeight: 700, color: dotColor }}>
217
+ {formattedValue}
218
+ </Typography>
219
+ </Box>
220
+ )}
221
+ </Box>
222
+
223
+ {/* Date */}
224
+ {showDate && date && (
225
+ <Typography sx={{ fontSize: dateSz, color: 'text.disabled', mt: 0.15, lineHeight: 1.3 }}>
226
+ {date}
227
+ </Typography>
228
+ )}
229
+
230
+ {/* Description */}
231
+ {desc && (
232
+ <Typography sx={{ fontSize: descSz, color: 'text.secondary', mt: 0.35, lineHeight: 1.45 }}>
233
+ {desc}
234
+ </Typography>
235
+ )}
236
+ </Box>
237
+ )
238
+ }
239
+
240
+ // ── Main renderer ─────────────────────────────────────────────────────────────
241
+
242
+ export default function TimelineRenderer({ node, viewerContext }) {
243
+ const main = resolveProps(node, 'main', viewerContext)
244
+ const { data, isEditMode } = viewerContext ?? {}
245
+ const inBuilder = isEditMode !== false
246
+
247
+ const {
248
+ // data
249
+ dataKey,
250
+ labelField = 'label',
251
+ dateField = 'date',
252
+ statusField = 'status',
253
+ descField = 'description',
254
+ valueField,
255
+ iconField,
256
+
257
+ // coloring
258
+ colorSchema,
259
+ thresholds = [],
260
+ colorMap = {},
261
+ defaultColor = '#bdbdbd',
262
+
263
+ // layout
264
+ layout = 'left', // 'left' | 'right' | 'alternate'
265
+ density = 'comfortable', // 'comfortable' | 'compact'
266
+ maxItems,
267
+
268
+ // dot
269
+ dotSize = 10,
270
+ dotStyle = 'auto', // 'auto' | 'filled' | 'ring'
271
+
272
+ // connector line
273
+ lineColor = '#e0e0e0',
274
+ lineWidth = 2,
275
+ lineStyle = 'solid', // 'solid' | 'dashed'
276
+ filledLine = true, // done→done transitions show colored line
277
+
278
+ // active item indicator
279
+ activeKey, // data key whose value identifies the active item
280
+ activeField, // field on each item to match against activeKey value
281
+ activeColor = '#1976d2', // highlight color for active card
282
+ showActiveLine = true, // draw left accent bar on active item
283
+
284
+ // display toggles
285
+ showDate = true,
286
+ showBadge = false,
287
+ showValue = false,
288
+
289
+ // format (for valueField if numeric)
290
+ format = 'number',
291
+ prefix = '',
292
+ suffix = '',
293
+ } = main
294
+
295
+ // Resolve active item identifier
296
+ const activeMatchValue = resolveValue(activeKey, data)
297
+
298
+ const rawItems = resolveValue(dataKey, data) ?? []
299
+ const sourceItems = Array.isArray(rawItems)
300
+ ? (maxItems ? rawItems.slice(0, Number(maxItems)) : rawItems)
301
+ : []
302
+ const items = (inBuilder && sourceItems.length === 0) ? SAMPLE_EVENTS : sourceItems
303
+
304
+ if (!inBuilder && items.length === 0) return null
305
+
306
+ const sz = Math.max(6, Number(dotSize) || 10)
307
+ const lw = Math.max(1, Number(lineWidth) || 2)
308
+
309
+ // Determine whether an item is "active" via activeKey/activeField binding,
310
+ // falling back to status classification when no explicit binding is set.
311
+ const isItemActive = (item) => {
312
+ if (activeMatchValue != null && activeField) {
313
+ return String(item[activeField]) === String(activeMatchValue)
314
+ }
315
+ if (activeMatchValue != null) {
316
+ // Match against label or id field if no activeField specified
317
+ return String(item['id'] ?? item[labelField] ?? '') === String(activeMatchValue)
318
+ }
319
+ // Fallback: treat status 'active'/'current' items as active
320
+ return classifyStatus(item[statusField]) === 'active'
321
+ }
322
+
323
+ // Safe-parse colorMap — it may arrive as a JSON string from expression fields
324
+ const safeColorMap = typeof colorMap === 'string'
325
+ ? (() => { try { return JSON.parse(colorMap) } catch { return {} } })()
326
+ : (colorMap && typeof colorMap === 'object' ? colorMap : {})
327
+
328
+ const resolveColor = (item, index) => {
329
+ const status = item[statusField]
330
+
331
+ // 1. Explicit colorMap override (e.g. {"done":"#4caf50","pending":"warning"})
332
+ if (status && safeColorMap[status]) return resolveMuiColor(safeColorMap[status]).color
333
+
334
+ // 2. colorSchema takes priority when explicitly configured
335
+ if (colorSchema?.mode) {
336
+ const c = schemaColor(colorSchema, index, item['color'] || null, items.length, DEFAULT_PALETTE)
337
+ if (c) return c
338
+ }
339
+
340
+ // 3. Thresholds — only meaningful for numeric statuses (avoid Number('done') === 0 false-match)
341
+ const numericStatus = status !== '' && status != null && !isNaN(Number(status))
342
+ if (numericStatus && thresholds?.length) {
343
+ const rule = evaluateThreshold(Number(status), thresholds)
344
+ if (rule) return resolveMuiColor(rule.color).color
345
+ }
346
+
347
+ // 4. Built-in semantic class colors
348
+ const cls = classifyStatus(status)
349
+ if (cls !== 'default') return CLASS_COLORS[cls]
350
+
351
+ // 5. Fallback — schema (no mode set) → item color field → defaultColor
352
+ return schemaColor(colorSchema, index, item['color'] || null, items.length, DEFAULT_PALETTE) ?? defaultColor
353
+ }
354
+
355
+ // ── Click action ─────────────────────────────────────────────────────────────
356
+ const hasClickAction = !!node.props?.actions?.onItemClick?.code
357
+ const handleItemClick = (item, index) => {
358
+ runKpiAction(node, viewerContext, 'onItemClick', {
359
+ clickedItem: item,
360
+ clickedIndex: index,
361
+ clickedLabel: item[labelField],
362
+ clickedStatus: item[statusField],
363
+ clickedValue: valueField ? item[valueField] : undefined,
364
+ })
365
+ }
366
+
367
+ // ── Item row renderer (shared for left/right) ────────────────────────────
368
+ const itemGap = density === 'compact' ? 1 : 1.5
369
+ const itemPb = density === 'compact' ? 0.75 : 1.5
370
+
371
+ const renderItem = (item, i, side = 'left') => {
372
+ const isLast = i === items.length - 1
373
+ const dotColor = resolveColor(item, i)
374
+ const statusClass = classifyStatus(item[statusField])
375
+ const icon = iconField ? item[iconField] : null
376
+ const active = isItemActive(item)
377
+
378
+ const nextItem = items[i + 1]
379
+ const nextDone = nextItem ? classifyStatus(nextItem[statusField]) === 'done' : false
380
+ const lineIsFilled = filledLine && statusClass === 'done' && nextDone
381
+
382
+ const contentProps = {
383
+ item, labelField, dateField, descField, statusField, valueField,
384
+ showDate, showBadge, showValue, density,
385
+ dotColor: active ? activeColor : dotColor,
386
+ statusClass, format, prefix, suffix,
387
+ }
388
+
389
+ const dotCol = (
390
+ <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', flexShrink: 0, width: sz }}>
391
+ <TimelineDot
392
+ sz={sz}
393
+ color={active ? activeColor : dotColor}
394
+ statusClass={statusClass} dotStyle={dotStyle} icon={icon}
395
+ />
396
+ {!isLast && (
397
+ <Connector
398
+ lineColor={lineColor} lineWidth={lw} lineStyle={lineStyle}
399
+ filled={lineIsFilled} filledColor={dotColor}
400
+ />
401
+ )}
402
+ </Box>
403
+ )
404
+
405
+ // Active card: subtle highlighted background + left accent bar
406
+ const contentCol = (
407
+ <Box
408
+ onClick={hasClickAction ? () => handleItemClick(item, i) : undefined}
409
+ sx={{
410
+ pb: isLast ? 0 : itemPb,
411
+ flex: 1,
412
+ minWidth: 0,
413
+ cursor: hasClickAction ? 'pointer' : 'default',
414
+ borderRadius: 1,
415
+ transition: 'background .15s',
416
+ ...(hasClickAction && { '&:hover': { bgcolor: 'action.hover' } }),
417
+ ...(active && {
418
+ bgcolor: `${activeColor}0d`,
419
+ borderLeft: showActiveLine ? `3px solid ${activeColor}` : 'none',
420
+ pl: showActiveLine ? 1 : 0,
421
+ pr: 0.75,
422
+ py: 0.5,
423
+ mb: isLast ? 0 : itemPb * 0.5,
424
+ }),
425
+ }}
426
+ >
427
+ <EventContent {...contentProps} />
428
+ </Box>
429
+ )
430
+
431
+ if (side === 'right') {
432
+ return (
433
+ <Box key={i} sx={{ display: 'flex', gap: itemGap, flexDirection: 'row-reverse' }}>
434
+ {dotCol}
435
+ {contentCol}
436
+ </Box>
437
+ )
438
+ }
439
+
440
+ return (
441
+ <Box key={i} sx={{ display: 'flex', gap: itemGap }}>
442
+ {dotCol}
443
+ {contentCol}
444
+ </Box>
445
+ )
446
+ }
447
+
448
+ // ── Alternate layout ─────────────────────────────────────────────────────
449
+ if (layout === 'alternate') {
450
+ return (
451
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
452
+ <Box>
453
+ {items.map((item, i) => {
454
+ const isLast = i === items.length - 1
455
+ const dotColor = resolveColor(item, i)
456
+ const statusClass = classifyStatus(item[statusField])
457
+ const icon = iconField ? item[iconField] : null
458
+ const isEven = i % 2 === 0
459
+ const active = isItemActive(item)
460
+
461
+ const nextItem = items[i + 1]
462
+ const nextDone = nextItem ? classifyStatus(nextItem[statusField]) === 'done' : false
463
+ const lineIsFilled = filledLine && statusClass === 'done' && nextDone
464
+
465
+ const effectiveColor = active ? activeColor : dotColor
466
+ const contentProps = {
467
+ item, labelField, dateField, descField, statusField, valueField,
468
+ showDate, showBadge, showValue, density,
469
+ dotColor: effectiveColor, statusClass,
470
+ format, prefix, suffix,
471
+ }
472
+
473
+ const activeSx = active ? {
474
+ bgcolor: `${activeColor}0d`, borderRadius: 1, px: 0.75, py: 0.5,
475
+ } : {}
476
+ const clickSx = hasClickAction ? {
477
+ cursor: 'pointer', transition: 'background .15s',
478
+ '&:hover': { bgcolor: 'action.hover' },
479
+ } : {}
480
+
481
+ return (
482
+ <Box key={i} sx={{ display: 'flex', gap: 1.5, alignItems: 'flex-start' }}>
483
+ {/* Left content (even items) */}
484
+ <Box
485
+ onClick={hasClickAction && isEven ? () => handleItemClick(item, i) : undefined}
486
+ sx={{ flex: 1, pb: isLast ? 0 : itemPb, textAlign: 'right', minWidth: 0, ...activeSx, ...(isEven && clickSx) }}
487
+ >
488
+ {isEven && <EventContent {...contentProps} />}
489
+ </Box>
490
+
491
+ {/* Center spine */}
492
+ <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', flexShrink: 0, width: sz }}>
493
+ <TimelineDot sz={sz} color={effectiveColor} statusClass={statusClass} dotStyle={dotStyle} icon={icon} />
494
+ {!isLast && (
495
+ <Connector
496
+ lineColor={lineColor} lineWidth={lw} lineStyle={lineStyle}
497
+ filled={lineIsFilled} filledColor={dotColor}
498
+ />
499
+ )}
500
+ </Box>
501
+
502
+ {/* Right content (odd items) */}
503
+ <Box
504
+ onClick={hasClickAction && !isEven ? () => handleItemClick(item, i) : undefined}
505
+ sx={{ flex: 1, pb: isLast ? 0 : itemPb, minWidth: 0, ...activeSx, ...(!isEven && clickSx) }}
506
+ >
507
+ {!isEven && <EventContent {...contentProps} />}
508
+ </Box>
509
+ </Box>
510
+ )
511
+ })}
512
+ </Box>
513
+ </ViewerComponentWrapper>
514
+ )
515
+ }
516
+
517
+ // ── Left / Right layout ──────────────────────────────────────────────────
518
+ return (
519
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
520
+ <Box>
521
+ {items.map((item, i) => renderItem(item, i, layout === 'right' ? 'right' : 'left'))}
522
+ </Box>
523
+ </ViewerComponentWrapper>
524
+ )
525
+ }
@@ -1,46 +1,40 @@
1
1
  import { FormControlLabel, Switch, FormHelperText, Box } from '@mui/material'
2
2
  import ViewerComponentWrapper from '../ViewerComponentWrapper'
3
+ import FieldLabel from '../FieldLabel'
3
4
  import { resolveProps } from 'services/builderHelper/resolveProps'
5
+ import { runFieldAction } from 'services/builderHelper/actionExecutor'
4
6
 
5
7
  export default function ToggleRenderer({ node, viewerContext }) {
6
8
  const { data, form, updateFormValue, validationErrors } = viewerContext
7
- const main = resolveProps(node, 'main', { form, data })
9
+ const main = resolveProps(node, 'main', viewerContext)
8
10
 
9
- // Get component key
10
11
  const key = node.props?.main?.key?.value || node.props?.main?.key || node.id
11
-
12
- // Get value from form state (boolean)
13
12
  const value = form[key] || false
13
+ const error = validationErrors?.[key]
14
14
 
15
- // Get validation error
16
- const error = validationErrors[key]
15
+ const { label, labelPosition, required, helperText, size, color, disabled } = main
17
16
 
18
- const handleChange = (e) => {
17
+ const handleChange = e => {
19
18
  updateFormValue(key, e.target.checked)
19
+ runFieldAction(node, viewerContext, 'onChange', e.target.checked)
20
20
  }
21
21
 
22
22
  return (
23
23
  <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
24
- <Box>
25
- <FormControlLabel
26
- control={
27
- <Switch
28
- checked={Boolean(value)}
29
- onChange={handleChange}
30
- disabled={main.disabled}
31
- size={main.size}
32
- color={main.color || 'primary'}
33
- />
34
- }
35
- label={main.label || ''}
36
- labelPlacement={main.labelPlacement || 'end'}
37
- />
38
- {(error || main.helperText) && (
39
- <FormHelperText error={!!error}>
40
- {error || main.helperText}
41
- </FormHelperText>
42
- )}
43
- </Box>
24
+ <FieldLabel label={label} required={required} labelPosition={labelPosition} error={!!error}>
25
+ <Box>
26
+ <Switch
27
+ checked={Boolean(value)}
28
+ onChange={handleChange}
29
+ disabled={disabled}
30
+ size={size}
31
+ color={color || 'primary'}
32
+ />
33
+ {(error || helperText) && (
34
+ <FormHelperText error={!!error}>{error || helperText}</FormHelperText>
35
+ )}
36
+ </Box>
37
+ </FieldLabel>
44
38
  </ViewerComponentWrapper>
45
39
  )
46
40
  }