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
@@ -1,76 +1,232 @@
1
1
  import { Services } from '../Endpoints'
2
2
  import fetchReportDataByPageId from '../reportData/fetchReportData'
3
+ import toast from 'react-hot-toast'
4
+ import { getRouter } from '../routerRef'
5
+ import { getGlobalData, setGlobalData } from '../globalStore'
6
+
7
+ // ─────────────────────────────────────────────────────────────────────────────
8
+ // showToast — available in every Calculation as a named function.
9
+ // react-hot-toast is a direct dependency of this package, and <Toaster /> is
10
+ // mounted by RoboByteFrontBuilderProvider, so both use the same module instance.
11
+ //
12
+ // Usage (inside any action code):
13
+ // showToast('Saved successfully', 'success')
14
+ // showToast('Something went wrong', 'error')
15
+ // showToast('Please review the form', 'warning')
16
+ // showToast('Data loaded', 'info')
17
+ //
18
+ // type: 'success' | 'error' | 'warning' | 'info' | 'loading' (default: 'default')
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ function showToast(message, type = 'default') {
21
+ switch (type) {
22
+ case 'success': return toast.success(message)
23
+ case 'error': return toast.error(message)
24
+ case 'warning': return toast(message, { icon: '⚠️' })
25
+ case 'info': return toast(message, { icon: 'ℹ️' })
26
+ case 'loading': return toast.loading(message)
27
+ default: return toast(message)
28
+ }
29
+ }
30
+
31
+ // ─────────────────────────────────────────────────────────────────────────────
32
+ // URL helpers
33
+ // ─────────────────────────────────────────────────────────────────────────────
3
34
 
4
35
  /**
5
- * Centralized JSEditor code executor
6
- * Executes user-defined Calculation functions with injected services
36
+ * Returns current page URL params as a plain object.
37
+ * Computed fresh at execution time no React hook required.
7
38
  *
8
- * @param {string} code - The user's JavaScript code containing a Calculation function
9
- * @param {object} context - Execution context with form and data
10
- * @param {object} context.form - Form data
11
- * @param {object} context.data - Global data object
12
- * @returns {Promise<any>} - Result from the Calculation function
39
+ * Shape: { query: Record<string,string>, pathname: string, asPath: string }
13
40
  */
14
- export async function executeJSCode(code, context = {}) {
15
- if (!code) {
16
- throw new Error('No code provided to execute')
41
+ export function getUrlParams() {
42
+ if (typeof window === 'undefined') {
43
+ return { query: {}, pathname: '', asPath: '' }
44
+ }
45
+ const search = new URLSearchParams(window.location.search)
46
+ const query = Object.fromEntries(search.entries())
47
+ return {
48
+ query,
49
+ pathname: window.location.pathname,
50
+ asPath: window.location.pathname + window.location.search,
51
+ }
52
+ }
53
+
54
+ // ─────────────────────────────────────────────────────────────────────────────
55
+ // Unified context shape
56
+ // ─────────────────────────────────────────────────────────────────────────────
57
+ //
58
+ // form — form field values (state snapshot, read-only)
59
+ // data — reactive data state for this component/dialog/view (read-only snapshot)
60
+ // setData — state setter; Calculation can call setData(prev => ({...}))
61
+ // dataRef — mutable non-reactive store (read/write, no re-render)
62
+ // reportRefs — map of { [nodeId]: updateRef } for every ReportViewer on page
63
+ // openDialog / closeDialog — open or close a named dialog
64
+ // urlParams — { query, pathname, asPath } from window.location (auto-computed)
65
+ //
66
+ // page — always points to the PARENT/MAIN-PAGE stores.
67
+ // Inside a dialog or embedded view `data` is the isolated child
68
+ // state while `page.data` is the outer page's state.
69
+ // In a top-level page page === { data, setData, dataRef, reportRefs }.
70
+ //
71
+ // Calculation signature:
72
+ // function Calculation(form, data, setData, dataRef, reportRefs, openDialog, closeDialog, urlParams, page) { ... }
73
+ //
74
+ // IMPORTANT — setData and data are kept in sync within a single execution:
75
+ // setData(prev => ({ ...prev, userId: 42 }))
76
+ // console.log(data.userId) // ← 42, not stale. Works as expected.
77
+ //
78
+ // ─────────────────────────────────────────────────────────────────────────────
79
+
80
+ function extractContext(context) {
81
+ const rawData = context.data ?? {}
82
+ const rawSetData = context.setData ?? (() => {})
83
+ const dataRef = context.dataRef ?? {}
84
+ const reportRefs = context.reportRefs ?? {}
85
+
86
+ // ── Live data snapshot ────────────────────────────────────────────────────
87
+ //
88
+ // React state updates are asynchronous: calling setData() schedules a
89
+ // re-render but does NOT change the `data` reference captured by the current
90
+ // Calculation closure. This means code like:
91
+ //
92
+ // setData(prev => ({ ...prev, userId: 42 }))
93
+ // console.log(data.userId) // ← still undefined!
94
+ //
95
+ // is confusing and hard to debug.
96
+ //
97
+ // Fix: maintain a mutable `dataSnapshot` object that is kept in sync with
98
+ // state. We pass this object (not the raw snapshot) as `data` to the
99
+ // Calculation. When wrappedSetData is called, dataSnapshot is updated
100
+ // in-place before the React re-render is scheduled — so any code that runs
101
+ // after setData() in the same function sees the new values immediately.
102
+ //
103
+ const dataSnapshot = { ...rawData }
104
+
105
+ const wrappedSetData = (updater) => {
106
+ // Compute the next state eagerly using our local snapshot as `prev`.
107
+ // This is safe because we always keep the snapshot in sync with real state.
108
+ const next = typeof updater === 'function' ? updater(dataSnapshot) : updater
109
+ if (next && typeof next === 'object') {
110
+ // Mutate snapshot in-place so that subsequent reads of `data` inside
111
+ // the same Calculation see the updated values.
112
+ Object.keys(dataSnapshot).forEach(k => delete dataSnapshot[k])
113
+ Object.assign(dataSnapshot, next)
114
+ }
115
+ // Schedule the React state update (triggers component re-render)
116
+ rawSetData(next)
17
117
  }
18
118
 
19
- const { form = {}, data = {} } = context
119
+ return {
120
+ form: context.form ?? {},
121
+ data: dataSnapshot, // ← live-updating reference
122
+ setData: wrappedSetData, // ← syncs snapshot before scheduling re-render
123
+ dataRef,
124
+ reportRefs,
125
+ openDialog: context.openDialog ?? (() => {}),
126
+ closeDialog: context.closeDialog ?? (() => {}),
127
+ openPrintLayout: context.openPrintLayout ?? (() => {}),
128
+ closePrintLayout: context.closePrintLayout ?? (() => {}),
129
+ urlParams: getUrlParams(),
130
+ // `page` — always the parent/main-page stores.
131
+ // In dialogs/embedded views these differ from the isolated `data`.
132
+ // In a top-level page they are identical.
133
+ page: {
134
+ data: context.pageData ?? dataSnapshot,
135
+ setData: context.pageSetData ?? wrappedSetData,
136
+ dataRef: context.pageDataRef ?? dataRef,
137
+ reportRefs: context.pageReportRefs ?? reportRefs,
138
+ },
139
+ // Repeater-scoped item context — null outside a Repeater.
140
+ // Available as closure variables `dataItem` and `itemIndex` in expressions.
141
+ dataItem: context.dataItem ?? null,
142
+ itemIndex: context.itemIndex ?? null,
143
+ }
144
+ }
145
+
146
+ // ─────────────────────────────────────────────────────────────────────────────
147
+ // Async executor (used by action executor and direct calls)
148
+ // ─────────────────────────────────────────────────────────────────────────────
149
+
150
+ /**
151
+ * Execute a user-defined Calculation function asynchronously.
152
+ *
153
+ * @param {string} code - JS code containing a Calculation function
154
+ * @param {object} context - Execution context (see shape above)
155
+ * @returns {Promise<any>}
156
+ */
157
+ export async function executeJSCode(code, context = {}) {
158
+ if (!code) throw new Error('No code provided to execute')
159
+
160
+ const { form, data, setData, dataRef, reportRefs, openDialog, closeDialog,
161
+ openPrintLayout, closePrintLayout, urlParams, page } = extractContext(context)
162
+
163
+ // extraVars: optional plain object of named variables to inject directly into
164
+ // the Calculation's lexical scope. e.g. { rowData: params.data }
165
+ const extraVars = (context.extraVars && typeof context.extraVars === 'object') ? context.extraVars : {}
166
+ const extraNames = Object.keys(extraVars)
167
+ const extraValues = Object.values(extraVars)
20
168
 
21
169
  try {
22
- // Create async function from code with services available
23
170
  const fn = new Function(
24
- 'form',
25
- 'data',
26
- 'GetService',
27
- 'PostService',
28
- 'UpdateService',
29
- 'DeleteService',
30
- 'PatchService',
171
+ 'form', 'data', 'setData', 'dataRef', 'reportRefs', 'openDialog', 'closeDialog',
172
+ 'openPrintLayout', 'closePrintLayout',
173
+ 'urlParams', 'page',
174
+ 'GetService', 'PostService', 'UpdateService', 'DeleteService', 'PatchService',
31
175
  'fetchReportData',
176
+ 'showToast',
177
+ 'router',
178
+ 'globalData', 'setGlobalData',
179
+ ...extraNames,
32
180
  `
33
181
  return (async function() {
34
182
  ${code}
35
183
  if (typeof Calculation !== 'function') {
36
184
  throw new Error('Calculation function not found')
37
185
  }
38
- return await Calculation(form, data)
186
+ return await Calculation(form, data, setData, dataRef, reportRefs, openDialog, closeDialog, openPrintLayout, closePrintLayout, urlParams, page)
39
187
  })()
40
188
  `
41
189
  )
42
190
 
43
- // Execute the function with services
44
- const result = await fn(
45
- form,
46
- data,
191
+ return await fn(
192
+ form, data, setData, dataRef, reportRefs, openDialog, closeDialog,
193
+ openPrintLayout, closePrintLayout,
194
+ urlParams, page,
47
195
  Services.GetService,
48
196
  Services.PostService,
49
197
  Services.UpdateService,
50
198
  Services.DeleteService,
51
199
  Services.PatchService,
52
- fetchReportDataByPageId
200
+ fetchReportDataByPageId,
201
+ showToast,
202
+ getRouter(),
203
+ getGlobalData(), setGlobalData,
204
+ ...extraValues
53
205
  )
54
-
55
- return result
56
206
  } catch (error) {
57
207
  console.error('JSCode execution error:', error)
58
208
  throw error
59
209
  }
60
210
  }
61
211
 
212
+ // ─────────────────────────────────────────────────────────────────────────────
213
+ // Sync factory (used by resolveProps for expression-based prop resolution)
214
+ // ─────────────────────────────────────────────────────────────────────────────
215
+
62
216
  /**
63
- * Synchronous version for prop resolution
64
- * Returns the Calculation function itself without executing it
217
+ * Parse a user Calculation function synchronously and return it ready to call.
218
+ * The returned function has services in its closure and accepts:
219
+ * (form, data, setData, dataRef, reportRefs, openDialog, closeDialog, urlParams, page)
65
220
  *
66
- * @param {string} code - The user's JavaScript code containing a Calculation function
67
- * @param {object} context - Execution context with form and data
68
- * @returns {Function} - The Calculation function ready to be called
221
+ * @param {string} code - JS code containing a Calculation function
222
+ * @param {object} context - Execution context (see shape above)
223
+ * @returns {Function} - The Calculation function
69
224
  */
70
225
  export function getJSCalculationFunction(code, context = {}) {
71
- if (!code) {
72
- throw new Error('No code provided')
73
- }
226
+ if (!code) throw new Error('No code provided')
227
+
228
+ const { form, data, setData, dataRef, reportRefs, openDialog, closeDialog,
229
+ openPrintLayout, closePrintLayout, urlParams, page, dataItem, itemIndex } = extractContext(context)
74
230
 
75
231
  try {
76
232
  const hasAsyncCalculation = /async\s+function\s+Calculation/.test(code)
@@ -81,13 +237,18 @@ export function getJSCalculationFunction(code, context = {}) {
81
237
  : code
82
238
 
83
239
  const fn = new Function(
84
- ...Object.keys(context),
85
- 'GetService',
86
- 'PostService',
87
- 'UpdateService',
88
- 'DeleteService',
89
- 'PatchService',
240
+ 'form', 'data', 'setData', 'dataRef', 'reportRefs', 'openDialog', 'closeDialog',
241
+ 'openPrintLayout', 'closePrintLayout',
242
+ 'urlParams', 'page',
243
+ 'GetService', 'PostService', 'UpdateService', 'DeleteService', 'PatchService',
90
244
  'fetchReportData',
245
+ 'showToast',
246
+ 'router',
247
+ 'globalData', 'setGlobalData',
248
+ // Repeater-scoped variables — available as bare names inside expressions.
249
+ // `dataItem` — the current repeated item object (null outside a Repeater)
250
+ // `itemIndex` — the current iteration index (null outside a Repeater)
251
+ 'dataItem', 'itemIndex',
91
252
  `
92
253
  ${normalizedCode}
93
254
  if (typeof Calculation !== 'function') {
@@ -97,17 +258,22 @@ return Calculation
97
258
  `
98
259
  )
99
260
 
100
- const calc = fn(
101
- ...Object.values(context),
261
+ // Return the raw Calculation function — caller is responsible for passing all args
262
+ return fn(
263
+ form, data, setData, dataRef, reportRefs, openDialog, closeDialog,
264
+ openPrintLayout, closePrintLayout,
265
+ urlParams, page,
102
266
  Services.GetService,
103
267
  Services.PostService,
104
268
  Services.UpdateService,
105
269
  Services.DeleteService,
106
270
  Services.PatchService,
107
- fetchReportDataByPageId
271
+ fetchReportDataByPageId,
272
+ showToast,
273
+ getRouter(),
274
+ getGlobalData(), setGlobalData,
275
+ dataItem, itemIndex
108
276
  )
109
-
110
- return calc
111
277
  } catch (error) {
112
278
  console.error('JSCode parsing error:', error)
113
279
  throw error
@@ -11,34 +11,51 @@ const CONTAINER_TYPES = [
11
11
  'repeater',
12
12
  'widget',
13
13
  'layout',
14
- 'layout-cell'
14
+ 'layout-cell',
15
+ 'dialog',
15
16
  ]
16
17
 
18
+ /**
19
+ * Recursively replaces every node `id` in a tree with a fresh UUID.
20
+ * Used when a saved widget is dropped so each instance gets unique IDs.
21
+ */
22
+ export function remapIds(node) {
23
+ if (!node || typeof node !== 'object') return node
24
+ return {
25
+ ...node,
26
+ id: `cmp_${crypto.randomUUID()}`,
27
+ children: Array.isArray(node.children)
28
+ ? node.children.map(remapIds)
29
+ : node.children,
30
+ }
31
+ }
32
+
17
33
  export function createNode(type, overrides = {}) {
34
+ // When a full saved node tree is passed (e.g. a widget drop), the overrides
35
+ // object already contains an `id` from the saved schema. If we just spread it
36
+ // every drop of the same widget shares identical IDs, breaking selection.
37
+ // Detect this case and remap the entire tree to fresh IDs instead.
38
+ if (overrides && overrides.id) {
39
+ return remapIds(overrides)
40
+ }
41
+
18
42
  const isContainer = CONTAINER_TYPES.includes(type)
19
- const randomKey = `${type}_${Math.random().toString(36).substring(2, 9)}`
43
+ const randomKey = `${type}_${Math.random().toString(36).substring(2, 9)}`
20
44
 
21
- const node = {
45
+ return {
22
46
  id: `cmp_${crypto.randomUUID()}`,
23
47
  type,
24
48
  props: {
25
49
  main: {
26
- key: {
27
- valueType: 'value',
28
- value: randomKey
29
- },
30
- enabled: true
50
+ key: { valueType: 'value', value: randomKey },
51
+ enabled: true,
31
52
  },
32
53
  style: {},
33
- advanced: {}
34
- },
35
- expressions: {
36
- main: {}
54
+ advanced: {},
37
55
  },
56
+ expressions: { main: {} },
38
57
  className: '',
39
58
  children: isContainer ? [] : undefined,
40
- ...overrides
59
+ ...overrides,
41
60
  }
42
-
43
- return node
44
61
  }
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Shared number formatting utility.
3
+ *
4
+ * format options:
5
+ * 'number' — 1,234.56
6
+ * 'currency' — $1,234.56 (currencyCode defaults to USD)
7
+ * 'percent' — 12.4% (expects 0-100 range; pass asRatio:true for 0-1)
8
+ * 'compact' — 84.2k / 1.2M
9
+ * 'duration' — value treated as total seconds → "2h 14m 05s"
10
+ * 'bytes' — 1.2 MB / 4.3 GB
11
+ * 'custom' — returns raw value (caller formats via expression)
12
+ */
13
+
14
+ /** Sanitise a decimals value from an expression field.
15
+ * Accepts string/number, clamps to [0, 20], falls back to `fallback`. */
16
+ function clampDec(val, fallback = 0) {
17
+ if (val == null) return fallback
18
+ const n = Math.round(Number(val))
19
+ if (!isFinite(n) || n < 0) return fallback
20
+ return Math.min(20, n)
21
+ }
22
+
23
+ /** Sanitise prefix/suffix — ensure they are plain strings. */
24
+ function safeStr(val) {
25
+ if (val == null) return ''
26
+ return typeof val === 'string' ? val : String(val)
27
+ }
28
+
29
+ export function formatNumber(value, {
30
+ format = 'number',
31
+ decimals,
32
+ prefix = '',
33
+ suffix = '',
34
+ locale = 'en-US',
35
+ currency = 'USD',
36
+ asRatio = false, // for percent: true means value is 0-1
37
+ } = {}) {
38
+ if (value == null || value === '') return '—'
39
+ const num = Number(value)
40
+ if (isNaN(num)) return String(value)
41
+
42
+ // Sanitise caller-supplied strings from expression fields
43
+ const pfx = safeStr(prefix)
44
+ const sfx = safeStr(suffix)
45
+
46
+ let core
47
+
48
+ switch (format) {
49
+ case 'currency': {
50
+ const dec = clampDec(decimals, 2)
51
+ core = new Intl.NumberFormat(locale, {
52
+ style: 'currency', currency: safeStr(currency) || 'USD',
53
+ minimumFractionDigits: dec, maximumFractionDigits: dec,
54
+ }).format(num)
55
+ break
56
+ }
57
+
58
+ case 'percent': {
59
+ const pct = asRatio ? num * 100 : num
60
+ const dec = clampDec(decimals, 1)
61
+ core = pct.toFixed(dec) + '%'
62
+ break
63
+ }
64
+
65
+ case 'compact': {
66
+ core = new Intl.NumberFormat(locale, {
67
+ notation: 'compact',
68
+ maximumFractionDigits: clampDec(decimals, 1),
69
+ }).format(num)
70
+ break
71
+ }
72
+
73
+ case 'duration': {
74
+ // value = total seconds
75
+ const totalSec = Math.abs(Math.round(num))
76
+ const h = Math.floor(totalSec / 3600)
77
+ const m = Math.floor((totalSec % 3600) / 60)
78
+ const s = totalSec % 60
79
+ const parts = []
80
+ if (h) parts.push(`${h}h`)
81
+ if (m || h) parts.push(`${m}m`)
82
+ parts.push(`${String(s).padStart(2, '0')}s`)
83
+ core = (num < 0 ? '-' : '') + parts.join(' ')
84
+ break
85
+ }
86
+
87
+ case 'bytes': {
88
+ const abs = Math.abs(num)
89
+ const sign = num < 0 ? '-' : ''
90
+ const dec = clampDec(decimals, 1)
91
+ if (abs >= 1e12) core = sign + (abs / 1e12).toFixed(dec) + ' TB'
92
+ else if (abs >= 1e9) core = sign + (abs / 1e9).toFixed(dec) + ' GB'
93
+ else if (abs >= 1e6) core = sign + (abs / 1e6).toFixed(dec) + ' MB'
94
+ else if (abs >= 1e3) core = sign + (abs / 1e3).toFixed(dec) + ' KB'
95
+ else core = sign + abs + ' B'
96
+ break
97
+ }
98
+
99
+ default: { // 'number'
100
+ const dec = clampDec(decimals, 0)
101
+ core = new Intl.NumberFormat(locale, {
102
+ minimumFractionDigits: dec,
103
+ maximumFractionDigits: dec,
104
+ }).format(num)
105
+ break
106
+ }
107
+ }
108
+
109
+ return `${pfx}${core}${sfx}`
110
+ }
111
+
112
+ /** Format a trend delta. Returns { text, positive, zero } */
113
+ export function formatTrend(value, { isPercent = true, decimals = 1, invertColors = false } = {}) {
114
+ if (value == null || value === '') return { text: '—', positive: null, zero: true }
115
+ const num = Number(value)
116
+ if (isNaN(num)) return { text: String(value), positive: null, zero: false }
117
+ const zero = num === 0
118
+ const positive = invertColors ? num < 0 : num > 0
119
+ const abs = Math.abs(num)
120
+ const text = (num > 0 ? '+' : num < 0 ? '−' : '') +
121
+ (isPercent ? abs.toFixed(decimals) + '%' : abs.toFixed(decimals))
122
+ return { text, positive, zero }
123
+ }
@@ -1,21 +1,68 @@
1
- import { getJSCalculationFunction } from './jsExecutor'
1
+ import { getJSCalculationFunction, getUrlParams } from './jsExecutor'
2
2
 
3
+ /**
4
+ * Resolve a node's props tab (main / style / advanced) into plain values.
5
+ *
6
+ * Accepts either:
7
+ * - a plain context object: { form, data, setData, dataRef, reportRefs, … }
8
+ * - a full viewerContext (has dataRef as a React ref with .current)
9
+ *
10
+ * Backward-compatible: callers that pass only { form, data } still work.
11
+ * Callers that pass the full viewerContext get dataItem / itemIndex / all
12
+ * page stores automatically, without any per-renderer boilerplate.
13
+ */
3
14
  export function resolveProps(node, tab, context = {}) {
4
15
  const props = node.props?.[tab] ?? {}
5
16
  const resolved = {}
6
17
 
18
+ const form = context.form ?? {}
19
+ const data = context.data ?? {}
20
+ const setData = context.setData ?? (() => {})
21
+
22
+ // dataRef may be a React ref ({ current: obj }) when viewerContext is passed
23
+ // directly, or a plain object when a custom resolveCtx is constructed.
24
+ const rawDataRef = context.dataRef
25
+ const dataRef = rawDataRef?.current !== undefined ? rawDataRef.current : (rawDataRef ?? {})
26
+
27
+ const rawReportRefs = context.reportRefs
28
+ const reportRefs = rawReportRefs?.current !== undefined ? rawReportRefs.current : (rawReportRefs ?? {})
29
+
30
+ const openDialog = context.openDialog ?? (() => {})
31
+ const closeDialog = context.closeDialog ?? (() => {})
32
+ const urlParams = getUrlParams()
33
+
34
+ // `page` — parent/main-page stores forwarded from the viewerContext.
35
+ // In isolated dialogs/embedded views these differ from the component's own data.
36
+ const page = context.page ?? {
37
+ data: context.pageData ?? data,
38
+ setData: context.pageSetData ?? setData,
39
+ dataRef: context.pageDataRef ?? dataRef,
40
+ reportRefs: context.pageReportRefs ?? reportRefs,
41
+ }
42
+
43
+ const execContext = {
44
+ form, data, setData, dataRef, reportRefs, openDialog, closeDialog, page,
45
+ // Repeater item context — present when inside a Repeater, null elsewhere
46
+ dataItem: context.dataItem ?? null,
47
+ itemIndex: context.itemIndex ?? null,
48
+ }
49
+
7
50
  for (const [key, field] of Object.entries(props)) {
8
51
  if (!field) continue
9
52
 
10
53
  if ((field.valueType || field.type) === 'value') {
11
- resolved[key] = field.value
54
+ // Skip empty strings so the renderer's destructuring default kicks in.
55
+ // An explicitly cleared field should behave identically to "never set".
56
+ if (field.value !== '') resolved[key] = field.value
12
57
  continue
13
58
  }
14
59
 
15
60
  if ((field.valueType || field.type) === 'expression' && field.expression?.code) {
16
61
  try {
17
- const calc = getJSCalculationFunction(field.expression.code, context)
18
- const value = calc(context.form, context.data)
62
+ const calc = getJSCalculationFunction(field.expression.code, execContext)
63
+
64
+ // Call Calculation with all args — old functions that only declare (form, data) ignore extras
65
+ const value = calc(form, data, setData, dataRef, reportRefs, openDialog, closeDialog, urlParams, page)
19
66
 
20
67
  // Viewer prop resolution is synchronous. Skip unresolved promises.
21
68
  if (value && typeof value.then === 'function') {
@@ -32,3 +79,25 @@ export function resolveProps(node, tab, context = {}) {
32
79
 
33
80
  return resolved
34
81
  }
82
+
83
+ /**
84
+ * Resolve a scalar value from a KPI component's "value key" field.
85
+ *
86
+ * The field type is `expression`, so resolveProps already evaluates it.
87
+ * The result can be either:
88
+ * • a string → treat as a data key and look up data[key]
89
+ * • anything else (number, boolean, null …) → use the value directly
90
+ *
91
+ * This lets users write either:
92
+ * valueKey: "revenue" → data["revenue"]
93
+ * valueKey: data.price * data.qty → computed value used as-is
94
+ * valueKey: 42 → literal 42
95
+ *
96
+ * @param {*} key The resolved value from resolveProps (already evaluated)
97
+ * @param {object} data The current page data object
98
+ * @param {*} fallback Returned when key is null/undefined (default: undefined)
99
+ */
100
+ export function resolveValue(key, data, fallback = undefined) {
101
+ if (key == null) return fallback
102
+ return typeof key === 'string' ? (data?.[key] ?? fallback) : key
103
+ }