robobyte-front-builder 1.0.19 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (520) hide show
  1. package/INTEGRATION.md +1586 -0
  2. package/README.md +928 -0
  3. package/RoboByteBuilder_User_Manual.docx +0 -0
  4. package/next.config.js +19 -48
  5. package/package.json +42 -86
  6. package/src/context/BuilderContext.jsx +191 -7
  7. package/src/context/SystemContext.js +2 -2
  8. package/src/hooks/useGlobalStore.js +36 -0
  9. package/src/hooks/useTimerEngine.js +54 -0
  10. package/src/lib/index.js +11 -3
  11. package/src/lib/layouts/BlankLayout.jsx +13 -0
  12. package/src/lib/providers/RoboByteFrontBuilderProvider.jsx +61 -7
  13. package/src/lib/themes/builderTheme.js +41 -0
  14. package/src/pages/_app.js +32 -134
  15. package/src/pages/api/ai.js +107 -0
  16. package/src/pages/builders/report/index.js +1 -0
  17. package/src/pages/builders/report/list/index.js +1 -0
  18. package/src/pages/builders/report/viewer/index.js +1 -0
  19. package/src/pages/index.js +88 -37
  20. package/src/pages/printBuilder/index.jsx +263 -0
  21. package/src/pages/printBuilder/layouts/index.jsx +298 -0
  22. package/src/pages/reportModule/reportBuilder/index.js +8 -6
  23. package/src/pages/reportModule/reportBuilder/reportViewer/index.js +92 -25
  24. package/src/pages/reportModule/reportBuilder/reports/index.js +3 -5
  25. package/src/pages/reportModule/reportBuilder/reportsPermissions/index.js +2 -3
  26. package/src/pages/viewBuilder/index.jsx +117 -32
  27. package/src/pages/viewBuilder/views/index.js +3 -3
  28. package/src/pages/viewer/[id]/index.js +2 -1
  29. package/src/services/DeleteService.js +31 -60
  30. package/src/services/Endpoints/PrintLayoutEndpoints.js +42 -0
  31. package/src/services/Endpoints/ReportBuilderEndpoints.js +7 -7
  32. package/src/services/Endpoints.js +2 -0
  33. package/src/services/GetService.js +33 -54
  34. package/src/services/PatchService.js +38 -65
  35. package/src/services/PostService.js +37 -63
  36. package/src/services/UpdateService.js +39 -65
  37. package/src/services/builderHelper/actionExecutor.js +141 -25
  38. package/src/services/builderHelper/builderHelper.js +92 -0
  39. package/src/services/builderHelper/colorSchema.js +95 -0
  40. package/src/services/builderHelper/iconResolver.js +50 -0
  41. package/src/services/builderHelper/jsExecutor.js +212 -46
  42. package/src/services/builderHelper/nodeFactory.js +32 -15
  43. package/src/services/builderHelper/numberFormat.js +123 -0
  44. package/src/services/builderHelper/resolveProps.js +73 -4
  45. package/src/services/builderHelper/thresholdEngine.js +77 -0
  46. package/src/services/builderHelper/tree.js +31 -0
  47. package/src/services/components/agGridAutoComplete.js +5 -9
  48. package/src/services/config.js +9 -1
  49. package/src/services/globalStore.js +80 -0
  50. package/src/services/helper/multiSelectEditor.js +5 -9
  51. package/src/services/helper/multiSelectEditorByBuilder.js +5 -9
  52. package/src/services/reportData/fetchReportData.js +69 -28
  53. package/src/services/routerRef.js +35 -0
  54. package/src/services/sessionLog.js +171 -0
  55. package/src/views/ConfirmDialog.js +2 -2
  56. package/src/views/builder/JSEditor.js +105 -107
  57. package/src/views/builder/SessionLogDialog.jsx +350 -0
  58. package/src/views/builder/UnsavedChangesGuard.jsx +103 -0
  59. package/src/views/builder/inspector/Inspector.jsx +6 -9
  60. package/src/views/builder/inspector/Tabs/ComponentActionsTab.jsx +7 -13
  61. package/src/views/builder/inspector/Tabs/MainTab.jsx +143 -25
  62. package/src/views/builder/inspector/Tabs/RulesTab.jsx +9 -24
  63. package/src/views/builder/inspector/Tabs/StyleTab.jsx +9 -24
  64. package/src/views/builder/inspector/definitions/autocomplete/main.js +4 -6
  65. package/src/views/builder/inspector/definitions/banner/actions.js +7 -0
  66. package/src/views/builder/inspector/definitions/banner/main.js +22 -0
  67. package/src/views/builder/inspector/definitions/banner/rules.js +1 -0
  68. package/src/views/builder/inspector/definitions/banner/style.js +1 -0
  69. package/src/views/builder/inspector/definitions/breadcrumb/main.js +43 -6
  70. package/src/views/builder/inspector/definitions/button/main.js +11 -12
  71. package/src/views/builder/inspector/definitions/button/style.js +18 -30
  72. package/src/views/builder/inspector/definitions/checkbox/actions.js +3 -1
  73. package/src/views/builder/inspector/definitions/checkbox/main.js +4 -6
  74. package/src/views/builder/inspector/definitions/common/main.js +13 -2
  75. package/src/views/builder/inspector/definitions/dataGrid/main.js +23 -0
  76. package/src/views/builder/inspector/definitions/dataTableViewer/main.js +46 -0
  77. package/src/views/builder/inspector/definitions/datepicker/actions.js +3 -1
  78. package/src/views/builder/inspector/definitions/datepicker/main.js +6 -14
  79. package/src/views/builder/inspector/definitions/dialog/main.js +36 -0
  80. package/src/views/builder/inspector/definitions/dropdown/main.js +5 -8
  81. package/src/views/builder/inspector/definitions/excelUpload/actions.js +23 -0
  82. package/src/views/builder/inspector/definitions/excelUpload/main.js +17 -0
  83. package/src/views/builder/inspector/definitions/excelUpload/rules.js +1 -0
  84. package/src/views/builder/inspector/definitions/excelUpload/style.js +45 -0
  85. package/src/views/builder/inspector/definitions/header/main.js +10 -1
  86. package/src/views/builder/inspector/definitions/index.js +106 -19
  87. package/src/views/builder/inspector/definitions/input/actions.js +4 -1
  88. package/src/views/builder/inspector/definitions/input/main.js +20 -11
  89. package/src/views/builder/inspector/definitions/kpi/avatarGroup.js +22 -0
  90. package/src/views/builder/inspector/definitions/kpi/badge.js +17 -0
  91. package/src/views/builder/inspector/definitions/kpi/bulletChart.js +47 -0
  92. package/src/views/builder/inspector/definitions/kpi/chart.js +55 -0
  93. package/src/views/builder/inspector/definitions/kpi/colorScale.js +60 -0
  94. package/src/views/builder/inspector/definitions/kpi/comparisonBars.js +41 -0
  95. package/src/views/builder/inspector/definitions/kpi/countdown.js +46 -0
  96. package/src/views/builder/inspector/definitions/kpi/donut.js +51 -0
  97. package/src/views/builder/inspector/definitions/kpi/funnel.js +25 -0
  98. package/src/views/builder/inspector/definitions/kpi/gauge.js +39 -0
  99. package/src/views/builder/inspector/definitions/kpi/heatmapGrid.js +96 -0
  100. package/src/views/builder/inspector/definitions/kpi/iconBox.js +20 -0
  101. package/src/views/builder/inspector/definitions/kpi/metric.js +45 -0
  102. package/src/views/builder/inspector/definitions/kpi/rating.js +27 -0
  103. package/src/views/builder/inspector/definitions/kpi/statusDot.js +18 -0
  104. package/src/views/builder/inspector/definitions/kpi/stepStage.js +65 -0
  105. package/src/views/builder/inspector/definitions/kpi/tagList.js +32 -0
  106. package/src/views/builder/inspector/definitions/kpi/timeline.js +80 -0
  107. package/src/views/builder/inspector/definitions/kpi/trend.js +20 -0
  108. package/src/views/builder/inspector/definitions/label/main.js +10 -1
  109. package/src/views/builder/inspector/definitions/layout/main.js +27 -3
  110. package/src/views/builder/inspector/definitions/number/main.js +6 -14
  111. package/src/views/builder/inspector/definitions/pageNumber/main.js +21 -0
  112. package/src/views/builder/inspector/definitions/popover/main.js +71 -0
  113. package/src/views/builder/inspector/definitions/radio/main.js +5 -8
  114. package/src/views/builder/inspector/definitions/repeater/main.js +31 -0
  115. package/src/views/builder/inspector/definitions/reportViewer/main.js +28 -1
  116. package/src/views/builder/inspector/definitions/richtext/main.js +5 -8
  117. package/src/views/builder/inspector/definitions/signature/main.js +4 -1
  118. package/src/views/builder/inspector/definitions/tag/main.js +5 -8
  119. package/src/views/builder/inspector/definitions/textarea/actions.js +4 -1
  120. package/src/views/builder/inspector/definitions/textarea/main.js +5 -7
  121. package/src/views/builder/inspector/definitions/time/main.js +5 -8
  122. package/src/views/builder/inspector/definitions/toggle/main.js +5 -19
  123. package/src/views/builder/inspector/definitions/treeView/main.js +61 -0
  124. package/src/views/builder/inspector/definitions/viewRenderer/main.js +53 -0
  125. package/src/views/builder/inspector/definitions/wizard/main.js +68 -0
  126. package/src/views/builder/inspector/definitions/wizard-step/main.js +25 -0
  127. package/src/views/builder/inspector/fields/ActionsConfigEditor.jsx +426 -0
  128. package/src/views/builder/inspector/fields/ColorSchemaField.jsx +140 -0
  129. package/src/views/builder/inspector/fields/ColumnFunctionEditor.jsx +238 -0
  130. package/src/views/builder/inspector/fields/ColumnMappingEditor.jsx +105 -0
  131. package/src/views/builder/inspector/fields/ColumnsConfigEditor.jsx +506 -0
  132. package/src/views/builder/inspector/fields/DonutRingsEditorField.jsx +337 -0
  133. package/src/views/builder/inspector/fields/ExtraColsEditor.jsx +618 -0
  134. package/src/views/builder/inspector/fields/FunctionHelpPopover.jsx +295 -0
  135. package/src/views/builder/inspector/fields/IconEditor.jsx +64 -0
  136. package/src/views/builder/inspector/fields/KpiActionField.jsx +223 -0
  137. package/src/views/builder/inspector/fields/MarkersEditorField.jsx +173 -0
  138. package/src/views/builder/inspector/fields/SelectEditor.jsx +9 -5
  139. package/src/views/builder/inspector/fields/SeriesEditorField.jsx +363 -0
  140. package/src/views/builder/inspector/fields/TableColumnsEditor.jsx +104 -0
  141. package/src/views/builder/inspector/fields/ThresholdsEditor.jsx +247 -0
  142. package/src/views/builder/inspector/fields/ValueFunctionsRefPanel.jsx +217 -0
  143. package/src/views/builder/inspector/fields/columnEditorShared.jsx +217 -0
  144. package/src/views/builder/sidebar/Sidebar.jsx +4 -2
  145. package/src/views/builder/sidebar/SidebarTabs.jsx +28 -17
  146. package/src/views/builder/sidebar/tabs/ActionsTab.jsx +7 -3
  147. package/src/views/builder/sidebar/tabs/AiTab/AiPreviewDialog.jsx +193 -0
  148. package/src/views/builder/sidebar/tabs/AiTab/aiProvider.js +53 -0
  149. package/src/views/builder/sidebar/tabs/AiTab/index.jsx +409 -0
  150. package/src/views/builder/sidebar/tabs/AiTab/schemaTransformer.js +167 -0
  151. package/src/views/builder/sidebar/tabs/AiTab/schemaValidator.js +64 -0
  152. package/src/views/builder/sidebar/tabs/AiTab/systemPrompt.js +1151 -0
  153. package/src/views/builder/sidebar/tabs/AiTab/trainingExport.js +131 -0
  154. package/src/views/builder/sidebar/tabs/Components/ComponentsTab.jsx +31 -31
  155. package/src/views/builder/sidebar/tabs/Components/componentCatalog.js +43 -21
  156. package/src/views/builder/sidebar/tabs/Components/printComponentCatalog.js +81 -0
  157. package/src/views/builder/sidebar/tabs/TimersTab.jsx +338 -0
  158. package/src/views/builder/sidebar/tabs/TreeTab.jsx +13 -4
  159. package/src/views/builder/sidebar/tabs/ViewTab.jsx +173 -13
  160. package/src/views/builder/viewer/AdornedLabel.jsx +82 -0
  161. package/src/views/builder/viewer/ComponentRenderer.jsx +98 -24
  162. package/src/views/builder/viewer/DialogsZone.jsx +259 -0
  163. package/src/views/builder/viewer/FieldLabel.jsx +106 -0
  164. package/src/views/builder/viewer/PrintDialog.jsx +481 -0
  165. package/src/views/builder/viewer/ProductionViewer.jsx +80 -5
  166. package/src/views/builder/viewer/Viewer.jsx +106 -8
  167. package/src/views/builder/viewer/ViewerComponentWrapper.jsx +70 -9
  168. package/src/views/builder/viewer/ViewerToolbar.jsx +285 -56
  169. package/src/views/builder/viewer/renderers/AutoCompleteRenderer.jsx +26 -22
  170. package/src/views/builder/viewer/renderers/AvatarGroupRenderer.jsx +112 -0
  171. package/src/views/builder/viewer/renderers/BadgeRenderer.jsx +79 -0
  172. package/src/views/builder/viewer/renderers/BannerRenderer.jsx +62 -0
  173. package/src/views/builder/viewer/renderers/BreadcrumbRenderer.jsx +203 -15
  174. package/src/views/builder/viewer/renderers/BulletChartRenderer.jsx +147 -0
  175. package/src/views/builder/viewer/renderers/ButtonRenderer.jsx +98 -39
  176. package/src/views/builder/viewer/renderers/CardRenderer.jsx +1 -1
  177. package/src/views/builder/viewer/renderers/ChartRenderer.jsx +388 -0
  178. package/src/views/builder/viewer/renderers/CheckboxRenderer.jsx +17 -9
  179. package/src/views/builder/viewer/renderers/ColorScaleRenderer.jsx +300 -0
  180. package/src/views/builder/viewer/renderers/ComparisonBarsRenderer.jsx +133 -0
  181. package/src/views/builder/viewer/renderers/ContainerRenderer.jsx +3 -1
  182. package/src/views/builder/viewer/renderers/CountdownRenderer.jsx +249 -0
  183. package/src/views/builder/viewer/renderers/DataGridRenderer.jsx +380 -0
  184. package/src/views/builder/viewer/renderers/DataTableViewerRenderer.jsx +240 -0
  185. package/src/views/builder/viewer/renderers/DatePickerRenderer.jsx +25 -24
  186. package/src/views/builder/viewer/renderers/DialogRenderer.jsx +327 -0
  187. package/src/views/builder/viewer/renderers/DividerRenderer.jsx +1 -1
  188. package/src/views/builder/viewer/renderers/DonutRenderer.jsx +294 -0
  189. package/src/views/builder/viewer/renderers/DropdownRenderer.jsx +36 -44
  190. package/src/views/builder/viewer/renderers/ExcelUploadRenderer.jsx +639 -0
  191. package/src/views/builder/viewer/renderers/FunnelRenderer.jsx +93 -0
  192. package/src/views/builder/viewer/renderers/GaugeRenderer.jsx +159 -0
  193. package/src/views/builder/viewer/renderers/HeaderRenderer.jsx +31 -9
  194. package/src/views/builder/viewer/renderers/HeatmapGridRenderer.jsx +432 -0
  195. package/src/views/builder/viewer/renderers/IconBoxRenderer.jsx +59 -0
  196. package/src/views/builder/viewer/renderers/ImageRenderer.jsx +1 -1
  197. package/src/views/builder/viewer/renderers/InputRenderer.jsx +75 -18
  198. package/src/views/builder/viewer/renderers/LabelRenderer.jsx +35 -9
  199. package/src/views/builder/viewer/renderers/LayoutCellRenderer.jsx +102 -40
  200. package/src/views/builder/viewer/renderers/LayoutContextMenu.jsx +8 -8
  201. package/src/views/builder/viewer/renderers/LayoutRenderer.jsx +48 -6
  202. package/src/views/builder/viewer/renderers/LinkRenderer.jsx +1 -1
  203. package/src/views/builder/viewer/renderers/MenuRenderer.jsx +2 -2
  204. package/src/views/builder/viewer/renderers/MetricRenderer.jsx +80 -0
  205. package/src/views/builder/viewer/renderers/NumberFormatRenderer.jsx +21 -30
  206. package/src/views/builder/viewer/renderers/PageNumberRenderer.jsx +76 -0
  207. package/src/views/builder/viewer/renderers/PopoverRenderer.jsx +350 -0
  208. package/src/views/builder/viewer/renderers/ProgressCircleRenderer.jsx +1 -1
  209. package/src/views/builder/viewer/renderers/ProgressLineRenderer.jsx +1 -1
  210. package/src/views/builder/viewer/renderers/RadioGroupRenderer.jsx +28 -39
  211. package/src/views/builder/viewer/renderers/RatingRenderer.jsx +80 -0
  212. package/src/views/builder/viewer/renderers/RepeaterRenderer.jsx +297 -38
  213. package/src/views/builder/viewer/renderers/ReportViewerRenderer.jsx +263 -5
  214. package/src/views/builder/viewer/renderers/RichTextRenderer.jsx +60 -66
  215. package/src/views/builder/viewer/renderers/RowActionsCell.jsx +308 -0
  216. package/src/views/builder/viewer/renderers/SignatureRenderer.jsx +33 -62
  217. package/src/views/builder/viewer/renderers/StatusDotRenderer.jsx +75 -0
  218. package/src/views/builder/viewer/renderers/StepStageRenderer.jsx +348 -0
  219. package/src/views/builder/viewer/renderers/TagListRenderer.jsx +115 -0
  220. package/src/views/builder/viewer/renderers/TagPickerRenderer.jsx +31 -45
  221. package/src/views/builder/viewer/renderers/TextAreaRenderer.jsx +25 -18
  222. package/src/views/builder/viewer/renderers/TextRenderer.jsx +7 -1
  223. package/src/views/builder/viewer/renderers/TimePickerRenderer.jsx +25 -24
  224. package/src/views/builder/viewer/renderers/TimelineRenderer.jsx +525 -0
  225. package/src/views/builder/viewer/renderers/ToggleRenderer.jsx +21 -27
  226. package/src/views/builder/viewer/renderers/TreeViewRenderer.jsx +832 -0
  227. package/src/views/builder/viewer/renderers/TrendRenderer.jsx +66 -0
  228. package/src/views/builder/viewer/renderers/ViewRendererRenderer.jsx +315 -0
  229. package/src/views/builder/viewer/renderers/WizardRenderer.jsx +380 -64
  230. package/src/views/builder/viewer/renderers/WizardStepRenderer.jsx +21 -12
  231. package/src/views/builder/viewer/renderers/dataGridComponents.jsx +824 -0
  232. package/src/views/customFilter/CustomFilterDialog.js +1023 -660
  233. package/src/views/customFilter/FixedFilterDialog.js +649 -0
  234. package/src/views/customFilter/SearchFilterDialog.js +248 -0
  235. package/src/views/genericTable/BuilderExpressionParams.js +3 -3
  236. package/src/views/genericTable/ColumnConfiguratorDialog.js +33 -24
  237. package/src/views/genericTable/FixedFilterDialog.js +3 -2
  238. package/src/views/genericTable/FormattingSettingsDialog.js +8 -3
  239. package/src/views/genericTable/SGrid.js +821 -448
  240. package/src/views/genericTable/SearchFilterDialog.js +3 -2
  241. package/src/views/genericTable/cellEditors/autocompleteEditor.js +5 -9
  242. package/src/views/genericTable/convertStringFunctions.js +274 -138
  243. package/src/views/genericTable/statusBar/rowCountStatusBar.js +3 -1
  244. package/src/views/genericTable/updateRefHelpers.js +9 -6
  245. package/src/views/printBuilder/PrintBuilderViewer.jsx +627 -0
  246. package/src/views/printBuilder/PrintPreviewCanvas.jsx +157 -0
  247. package/src/views/rolePermissions/UpdateReportPermissionDialog.js +3 -2
  248. package/src/@core/components/auth/AclGuard.js +0 -55
  249. package/src/@core/components/auth/AuthGuard.js +0 -40
  250. package/src/@core/components/auth/GuestGuard.js +0 -30
  251. package/src/@core/components/custom-inputs/Horizontal.jsx +0 -143
  252. package/src/@core/components/custom-inputs/Image.jsx +0 -78
  253. package/src/@core/components/custom-inputs/Vertical.jsx +0 -113
  254. package/src/@core/components/customizer/index.jsx +0 -470
  255. package/src/@core/components/customizer/styles.module.css +0 -169
  256. package/src/@core/components/mui/Avatar.jsx +0 -41
  257. package/src/@core/components/mui/Badge.jsx +0 -20
  258. package/src/@core/components/mui/IconButton.jsx +0 -74
  259. package/src/@core/components/mui/TabList.jsx +0 -60
  260. package/src/@core/components/option-menu/index.jsx +0 -137
  261. package/src/@core/components/scroll-to-top/index.jsx +0 -43
  262. package/src/@core/components/spinner/index.js +0 -26
  263. package/src/@core/components/window-wrapper/index.js +0 -27
  264. package/src/@core/contexts/settingsContext.jsx +0 -98
  265. package/src/@core/hooks/useBgColor.js +0 -63
  266. package/src/@core/hooks/useImageVariant.js +0 -27
  267. package/src/@core/hooks/useLayoutInit.js +0 -37
  268. package/src/@core/hooks/useObjectCookie.js +0 -18
  269. package/src/@core/hooks/useSettings.jsx +0 -15
  270. package/src/@core/layouts/BlankLayout.js +0 -37
  271. package/src/@core/layouts/BlankLayoutWithAppBar.js +0 -51
  272. package/src/@core/layouts/HorizontalLayout.jsx +0 -151
  273. package/src/@core/layouts/Layout.js +0 -39
  274. package/src/@core/layouts/VerticalLayout.jsx +0 -124
  275. package/src/@core/layouts/components/blank-layout-with-appBar/index.js +0 -115
  276. package/src/@core/layouts/components/horizontal/app-bar-content/index.js +0 -67
  277. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavGroup.js +0 -352
  278. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavItems.js +0 -21
  279. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavLink.js +0 -195
  280. package/src/@core/layouts/components/horizontal/navigation/index.js +0 -31
  281. package/src/@core/layouts/components/shared-components/LanguageDropdown.js +0 -96
  282. package/src/@core/layouts/components/shared-components/ModeToggler.js +0 -32
  283. package/src/@core/layouts/components/shared-components/NotificationDropdown.js +0 -226
  284. package/src/@core/layouts/components/shared-components/UserDropdown.js +0 -177
  285. package/src/@core/layouts/components/shared-components/footer/FooterContent.js +0 -46
  286. package/src/@core/layouts/components/shared-components/footer/index.js +0 -61
  287. package/src/@core/layouts/components/vertical/appBar/index.js +0 -74
  288. package/src/@core/layouts/components/vertical/navigation/Drawer.js +0 -122
  289. package/src/@core/layouts/components/vertical/navigation/VerticalNavGroup.js +0 -435
  290. package/src/@core/layouts/components/vertical/navigation/VerticalNavHeader.js +0 -180
  291. package/src/@core/layouts/components/vertical/navigation/VerticalNavItems.js +0 -26
  292. package/src/@core/layouts/components/vertical/navigation/VerticalNavLink.js +0 -258
  293. package/src/@core/layouts/components/vertical/navigation/VerticalNavSectionTitle.js +0 -102
  294. package/src/@core/layouts/components/vertical/navigation/index.js +0 -169
  295. package/src/@core/layouts/utils.js +0 -69
  296. package/src/@core/styles/Table.module.css +0 -93
  297. package/src/@core/styles/horizontal/menuItemStyles.js +0 -100
  298. package/src/@core/styles/horizontal/menuRootStyles.js +0 -19
  299. package/src/@core/styles/libs/fullcalendar/index.js +0 -461
  300. package/src/@core/styles/libs/keen-slider/index.js +0 -111
  301. package/src/@core/styles/libs/react-apexcharts/index.js +0 -107
  302. package/src/@core/styles/libs/react-cleave/index.js +0 -33
  303. package/src/@core/styles/libs/react-credit-cards/index.js +0 -11
  304. package/src/@core/styles/libs/react-datepicker/index.js +0 -388
  305. package/src/@core/styles/libs/react-draft-wysiwyg/index.js +0 -144
  306. package/src/@core/styles/libs/react-dropzone/index.js +0 -76
  307. package/src/@core/styles/libs/react-hot-toast/index.js +0 -37
  308. package/src/@core/styles/libs/recharts/index.js +0 -47
  309. package/src/@core/styles/stepper.js +0 -103
  310. package/src/@core/styles/vertical/menuItemStyles.js +0 -138
  311. package/src/@core/styles/vertical/menuSectionStyles.js +0 -54
  312. package/src/@core/styles/vertical/navigationCustomStyles.js +0 -62
  313. package/src/@core/svg/ContentCompact.jsx +0 -17
  314. package/src/@core/svg/ContentWide.jsx +0 -17
  315. package/src/@core/svg/DirectionLtr.jsx +0 -93
  316. package/src/@core/svg/DirectionRtl.jsx +0 -93
  317. package/src/@core/svg/LayoutCollapsed.jsx +0 -59
  318. package/src/@core/svg/LayoutHorizontal.jsx +0 -42
  319. package/src/@core/svg/LayoutVertical.jsx +0 -59
  320. package/src/@core/svg/Logo.jsx +0 -76
  321. package/src/@core/svg/SkinBordered.jsx +0 -54
  322. package/src/@core/svg/SkinDefault.jsx +0 -59
  323. package/src/@core/tailwind/plugin.js +0 -78
  324. package/src/@core/theme/ThemeComponent.js +0 -63
  325. package/src/@core/theme/ThemeOptions.js +0 -71
  326. package/src/@core/theme/breakpoints/index.js +0 -11
  327. package/src/@core/theme/colorSchemes.js +0 -326
  328. package/src/@core/theme/customShadows.js +0 -11
  329. package/src/@core/theme/globalStyles.js +0 -81
  330. package/src/@core/theme/index.js +0 -42
  331. package/src/@core/theme/overrides/accordion.js +0 -51
  332. package/src/@core/theme/overrides/accordion.jsx +0 -85
  333. package/src/@core/theme/overrides/alerts.js +0 -110
  334. package/src/@core/theme/overrides/alerts.jsx +0 -180
  335. package/src/@core/theme/overrides/autocomplete.js +0 -14
  336. package/src/@core/theme/overrides/autocomplete.jsx +0 -68
  337. package/src/@core/theme/overrides/avatar.js +0 -38
  338. package/src/@core/theme/overrides/avatars.js +0 -27
  339. package/src/@core/theme/overrides/backdrop.js +0 -22
  340. package/src/@core/theme/overrides/badges.js +0 -16
  341. package/src/@core/theme/overrides/breadcrumbs.js +0 -11
  342. package/src/@core/theme/overrides/button-group.js +0 -84
  343. package/src/@core/theme/overrides/button.js +0 -93
  344. package/src/@core/theme/overrides/buttonGroup.js +0 -9
  345. package/src/@core/theme/overrides/card.js +0 -83
  346. package/src/@core/theme/overrides/checkbox.jsx +0 -95
  347. package/src/@core/theme/overrides/chip.js +0 -72
  348. package/src/@core/theme/overrides/dataGrid.js +0 -114
  349. package/src/@core/theme/overrides/dateTimePicker.js +0 -65
  350. package/src/@core/theme/overrides/dialog.js +0 -120
  351. package/src/@core/theme/overrides/divider.js +0 -13
  352. package/src/@core/theme/overrides/drawer.js +0 -20
  353. package/src/@core/theme/overrides/fab.js +0 -13
  354. package/src/@core/theme/overrides/form-control-label.js +0 -19
  355. package/src/@core/theme/overrides/icon-button.js +0 -145
  356. package/src/@core/theme/overrides/index.js +0 -103
  357. package/src/@core/theme/overrides/input.js +0 -72
  358. package/src/@core/theme/overrides/link.js +0 -9
  359. package/src/@core/theme/overrides/list.js +0 -44
  360. package/src/@core/theme/overrides/menu.js +0 -25
  361. package/src/@core/theme/overrides/pagination.js +0 -41
  362. package/src/@core/theme/overrides/paper.js +0 -9
  363. package/src/@core/theme/overrides/popover.js +0 -16
  364. package/src/@core/theme/overrides/progress.js +0 -38
  365. package/src/@core/theme/overrides/radio.jsx +0 -80
  366. package/src/@core/theme/overrides/rating.js +0 -16
  367. package/src/@core/theme/overrides/rating.jsx +0 -32
  368. package/src/@core/theme/overrides/select.js +0 -19
  369. package/src/@core/theme/overrides/select.jsx +0 -52
  370. package/src/@core/theme/overrides/slider.js +0 -97
  371. package/src/@core/theme/overrides/snackbar.js +0 -19
  372. package/src/@core/theme/overrides/switch.js +0 -73
  373. package/src/@core/theme/overrides/switches.js +0 -25
  374. package/src/@core/theme/overrides/table-pagination.js +0 -39
  375. package/src/@core/theme/overrides/table.js +0 -81
  376. package/src/@core/theme/overrides/tabs.js +0 -30
  377. package/src/@core/theme/overrides/timeline.js +0 -80
  378. package/src/@core/theme/overrides/toggle-button.js +0 -33
  379. package/src/@core/theme/overrides/toggleButton.js +0 -16
  380. package/src/@core/theme/overrides/tooltip.js +0 -21
  381. package/src/@core/theme/overrides/typography.js +0 -13
  382. package/src/@core/theme/palette/index.js +0 -107
  383. package/src/@core/theme/shadows/index.js +0 -61
  384. package/src/@core/theme/shadows.js +0 -12
  385. package/src/@core/theme/spacing/index.js +0 -3
  386. package/src/@core/theme/spacing.js +0 -5
  387. package/src/@core/theme/typography/index.js +0 -65
  388. package/src/@core/theme/typography.js +0 -84
  389. package/src/@core/utils/create-emotion-cache.js +0 -5
  390. package/src/@core/utils/hex-to-rgba.js +0 -11
  391. package/src/@core/utils/serverHelpers.js +0 -45
  392. package/src/@menu/components/RouterLink.jsx +0 -18
  393. package/src/@menu/components/horizontal-menu/HorizontalNav.jsx +0 -88
  394. package/src/@menu/components/horizontal-menu/Menu.jsx +0 -83
  395. package/src/@menu/components/horizontal-menu/MenuButton.jsx +0 -100
  396. package/src/@menu/components/horizontal-menu/MenuItem.jsx +0 -183
  397. package/src/@menu/components/horizontal-menu/SubMenu.jsx +0 -418
  398. package/src/@menu/components/horizontal-menu/SubMenuContent.jsx +0 -41
  399. package/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.jsx +0 -20
  400. package/src/@menu/components/vertical-menu/Menu.jsx +0 -161
  401. package/src/@menu/components/vertical-menu/MenuButton.jsx +0 -95
  402. package/src/@menu/components/vertical-menu/MenuItem.jsx +0 -180
  403. package/src/@menu/components/vertical-menu/MenuSection.jsx +0 -124
  404. package/src/@menu/components/vertical-menu/NavCollapseIcons.jsx +0 -70
  405. package/src/@menu/components/vertical-menu/NavHeader.jsx +0 -39
  406. package/src/@menu/components/vertical-menu/SubMenu.jsx +0 -420
  407. package/src/@menu/components/vertical-menu/SubMenuContent.jsx +0 -101
  408. package/src/@menu/components/vertical-menu/VerticalNav.jsx +0 -216
  409. package/src/@menu/contexts/horizontalNavContext.jsx +0 -29
  410. package/src/@menu/contexts/verticalNavContext.jsx +0 -65
  411. package/src/@menu/defaultConfigs.js +0 -12
  412. package/src/@menu/hooks/useHorizontalMenu.jsx +0 -19
  413. package/src/@menu/hooks/useHorizontalNav.jsx +0 -19
  414. package/src/@menu/hooks/useMediaQuery.jsx +0 -29
  415. package/src/@menu/hooks/useVerticalMenu.jsx +0 -19
  416. package/src/@menu/hooks/useVerticalNav.jsx +0 -19
  417. package/src/@menu/horizontal-menu/index.jsx +0 -8
  418. package/src/@menu/styles/StyledBackdrop.jsx +0 -15
  419. package/src/@menu/styles/StyledMenuIcon.jsx +0 -12
  420. package/src/@menu/styles/StyledMenuLabel.jsx +0 -16
  421. package/src/@menu/styles/StyledMenuPrefix.jsx +0 -10
  422. package/src/@menu/styles/StyledMenuSectionLabel.jsx +0 -21
  423. package/src/@menu/styles/StyledMenuSuffix.jsx +0 -10
  424. package/src/@menu/styles/StyledSubMenuContent.jsx +0 -43
  425. package/src/@menu/styles/horizontal/StyledHorizontalMenu.jsx +0 -13
  426. package/src/@menu/styles/horizontal/StyledHorizontalMenuItem.jsx +0 -26
  427. package/src/@menu/styles/horizontal/StyledHorizontalNav.jsx +0 -11
  428. package/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.jsx +0 -33
  429. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.jsx +0 -18
  430. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.jsx +0 -10
  431. package/src/@menu/styles/horizontal/horizontalUl.module.css +0 -15
  432. package/src/@menu/styles/styles.module.css +0 -5
  433. package/src/@menu/styles/vertical/StyledVerticalMenu.jsx +0 -16
  434. package/src/@menu/styles/vertical/StyledVerticalMenuItem.jsx +0 -28
  435. package/src/@menu/styles/vertical/StyledVerticalMenuSection.jsx +0 -23
  436. package/src/@menu/styles/vertical/StyledVerticalNav.jsx +0 -67
  437. package/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.jsx +0 -15
  438. package/src/@menu/styles/vertical/StyledVerticalNavContainer.jsx +0 -23
  439. package/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.jsx +0 -25
  440. package/src/@menu/styles/vertical/verticalNavBgImage.module.css +0 -10
  441. package/src/@menu/svg/ChevronRight.jsx +0 -9
  442. package/src/@menu/svg/Close.jsx +0 -12
  443. package/src/@menu/svg/RadioCircle.jsx +0 -12
  444. package/src/@menu/svg/RadioCircleMarked.jsx +0 -13
  445. package/src/@menu/utils/menuClasses.js +0 -44
  446. package/src/@menu/utils/menuUtils.jsx +0 -145
  447. package/src/@menu/vertical-menu/index.jsx +0 -11
  448. package/src/configs/acl.js +0 -115
  449. package/src/configs/auth.js +0 -5
  450. package/src/configs/aws-exports.js +0 -30
  451. package/src/configs/firebase.js +0 -25
  452. package/src/configs/i18n.js +0 -34
  453. package/src/configs/primaryColorConfig.js +0 -35
  454. package/src/configs/themeConfig.js +0 -44
  455. package/src/layouts/UserLayout.js +0 -94
  456. package/src/layouts/UserThemeOptions.js +0 -191
  457. package/src/layouts/components/Direction.js +0 -30
  458. package/src/layouts/components/HtmlTooltip.js +0 -15
  459. package/src/layouts/components/Translations.js +0 -11
  460. package/src/layouts/components/UserDropdown.js +0 -217
  461. package/src/layouts/components/UserIcon.js +0 -40
  462. package/src/layouts/components/acl/Can.js +0 -6
  463. package/src/layouts/components/acl/CanViewNavGroup.js +0 -36
  464. package/src/layouts/components/acl/CanViewNavLink.js +0 -17
  465. package/src/layouts/components/acl/CanViewNavSectionTitle.js +0 -17
  466. package/src/layouts/components/horizontal/AppBarContent.js +0 -39
  467. package/src/layouts/components/horizontal/ServerSideNavItems.js +0 -44
  468. package/src/layouts/components/mui/StepperComps.js +0 -55
  469. package/src/layouts/components/vertical/AppBarContent.js +0 -35
  470. package/src/layouts/components/vertical/ServerSideNavItems.js +0 -44
  471. package/src/libs/ApexCharts.jsx +0 -5
  472. package/src/libs/ReactPlayer.jsx +0 -5
  473. package/src/libs/Recharts.jsx +0 -4
  474. package/src/libs/auth.js +0 -124
  475. package/src/libs/styles/AppFullCalendar.js +0 -505
  476. package/src/libs/styles/AppKeenSlider.js +0 -116
  477. package/src/libs/styles/AppReactApexCharts.jsx +0 -110
  478. package/src/libs/styles/AppReactDatepicker.jsx +0 -470
  479. package/src/libs/styles/AppReactDropzone.js +0 -76
  480. package/src/libs/styles/AppReactToastify.jsx +0 -108
  481. package/src/libs/styles/AppRecharts.js +0 -55
  482. package/src/libs/styles/inputOtp.module.css +0 -39
  483. package/src/libs/styles/tiptapEditor.css +0 -72
  484. package/src/navigation/horizontal/index.js +0 -246
  485. package/src/navigation/vertical/index.js +0 -253
  486. package/src/pages/401.js +0 -70
  487. package/src/pages/404.js +0 -67
  488. package/src/pages/500.js +0 -68
  489. package/src/pages/[slug].js +0 -115
  490. package/src/pages/_document.js +0 -72
  491. package/src/pages/api/navigation/regenerate-registry.js +0 -116
  492. package/src/pages/api/navigation/save.js +0 -218
  493. package/src/pages/authModule/acl/index.js +0 -48
  494. package/src/pages/authModule/forgot-password/index.js +0 -228
  495. package/src/pages/authModule/permissions/rolePermissions/[id]/rolePermissionsUser/index.js +0 -392
  496. package/src/pages/authModule/permissions/rolePermissions/index.js +0 -343
  497. package/src/pages/authModule/permissions/systemPermissions/index.js +0 -354
  498. package/src/pages/authModule/privacy/index.js +0 -721
  499. package/src/pages/authModule/users/index.js +0 -210
  500. package/src/pages/login/index.js +0 -328
  501. package/src/pages/mainHome/index.js +0 -181
  502. package/src/views/builder/inspector/definitions/cell/main.js +0 -4
  503. package/src/views/builder/inspector/definitions/column/main.js +0 -9
  504. package/src/views/builder/inspector/definitions/column-group/main.js +0 -18
  505. package/src/views/builder/inspector/definitions/header-cell/main.js +0 -5
  506. package/src/views/builder/inspector/definitions/table/main.js +0 -9
  507. package/src/views/builder/viewer/renderers/CellRenderer.jsx +0 -71
  508. package/src/views/builder/viewer/renderers/ColumnGroupRenderer.jsx +0 -96
  509. package/src/views/builder/viewer/renderers/ColumnRenderer.jsx +0 -71
  510. package/src/views/builder/viewer/renderers/HeaderCellRenderer.jsx +0 -78
  511. package/src/views/builder/viewer/renderers/TabRenderer.jsx +0 -82
  512. package/src/views/builder/viewer/renderers/TableRenderer.jsx +0 -92
  513. package/src/views/pages/auth/FooterIllustrationsV2.js +0 -40
  514. package/src/views/pages/misc/FooterIllustrations.js +0 -47
  515. package/src/views/pages/misc/muiTable/CustomPagination.js +0 -34
  516. package/src/views/pages/users/UserManageDialog.js +0 -283
  517. package/src/views/pages/users/UserViewPage.js +0 -199
  518. package/src/views/users/AddUserNameDialog.js +0 -162
  519. package/src/views/users/ContactManage.js +0 -449
  520. package/src/views/users/ResetPasswordDialog.js +0 -242
@@ -1,23 +1,225 @@
1
- import { Box } from '@mui/material'
1
+ import { useEffect, useCallback } from 'react'
2
+ import { Box, Typography, CircularProgress } from '@mui/material'
3
+ import { RepeatOutlined, WidgetsOutlined } from '@mui/icons-material'
4
+ import { useState } from 'react'
2
5
  import ViewerComponentWrapper from '../ViewerComponentWrapper'
3
6
  import ComponentRenderer from '../ComponentRenderer'
4
7
  import DropZone from '../DropZone'
5
8
  import { resolveProps } from 'services/builderHelper/resolveProps'
6
9
  import { createNode } from 'services/builderHelper/nodeFactory'
7
10
  import { insertIntoTreeAtIndex, moveNodeInTree } from 'services/builderHelper/tree'
11
+ import { Endpoints, Services } from 'services/Endpoints'
12
+
13
+ // ── Direction → flex styles ───────────────────────────────────────────────────
14
+
15
+ function directionSx(direction, gap) {
16
+ const g = gap != null ? gap : 1
17
+ switch (direction) {
18
+ case 'horizontal':
19
+ return { display: 'flex', flexDirection: 'row', gap: g, flexWrap: 'nowrap', width: '100%' }
20
+ case 'wrap':
21
+ return { display: 'flex', flexDirection: 'row', gap: g, flexWrap: 'wrap', width: '100%' }
22
+ default: // vertical
23
+ return { display: 'flex', flexDirection: 'column', gap: g, width: '100%' }
24
+ }
25
+ }
26
+
27
+ // ── Build a scoped viewerContext for one item ─────────────────────────────────
28
+ //
29
+ // Two modes depending on whether `dataKey` is set:
30
+ //
31
+ // Without dataKey (read-only iteration):
32
+ // data = parent data (untouched)
33
+ // dataItem = the current item from the items array
34
+ // setData = parent setData (writes go to parent state directly)
35
+ //
36
+ // With dataKey (form array mode):
37
+ // data = parent.data[dataKey][index] ← item's own slice
38
+ // setData = scoped setter that writes back to parent.data[dataKey][index]
39
+ // dataItem = same item slice (convenient alias inside expressions)
40
+ //
41
+ // In both cases `itemIndex` is available as a bare variable in expressions.
42
+
43
+ // ── Build a scoped viewerContext for one item ─────────────────────────────────
44
+ //
45
+ // Inputs inside a Repeater MUST be scoped per-item — otherwise all items share
46
+ // form[key] from the parent form and show the same value.
47
+ //
48
+ // Storage key priority:
49
+ // dataKey (explicit) → data[dataKey][index] visible to parent, readable anywhere
50
+ // no dataKey → data[__rpt_<nodeId>][index] internal, items still isolated
51
+ //
52
+ // In both cases:
53
+ // form → item slice, so form[fieldKey] resolves per-item
54
+ // updateFormValue → scoped setter writing to item slice
55
+ // data → item slice (when dataKey set) or parent data (when not set,
56
+ // so expressions like dataItem.x still work via dataItem)
57
+
58
+ function buildItemContext(parentCtx, item, index, dataKey, nodeId) {
59
+ const storageKey = dataKey || `__rpt_${nodeId}`
60
+ const parentSetData = parentCtx.setData
61
+
62
+ const scopedSetData = (updater) => {
63
+ parentSetData(prev => {
64
+ const arr = Array.isArray(prev[storageKey]) ? [...prev[storageKey]] : []
65
+ arr[index] = typeof updater === 'function' ? updater(arr[index] ?? {}) : updater
66
+ return { ...prev, [storageKey]: arr }
67
+ })
68
+ }
69
+
70
+ const scopedUpdateFormValue = (fieldKey, value) => {
71
+ scopedSetData(prev => ({ ...prev, [fieldKey]: value }))
72
+ }
73
+
74
+ // The item's own data slice — what the scoped form reads from
75
+ const itemSlice = (Array.isArray(parentCtx.data?.[storageKey])
76
+ ? parentCtx.data[storageKey][index]
77
+ : null) ?? {}
78
+
79
+ if (dataKey) {
80
+ // Full scoping: data = item slice so expressions like `data.phone` also resolve
81
+ return {
82
+ ...parentCtx,
83
+ data: itemSlice,
84
+ setData: scopedSetData,
85
+ form: itemSlice,
86
+ updateFormValue: scopedUpdateFormValue,
87
+ dataItem: item ?? itemSlice,
88
+ itemIndex: index,
89
+ isEditMode: false,
90
+ builderContext: null,
91
+ }
92
+ }
93
+
94
+ // No dataKey: keep parent data intact for expressions, but scope form so
95
+ // inputs don't collide. Writes via updateFormValue land in the internal slot.
96
+ return {
97
+ ...parentCtx,
98
+ setData: scopedSetData,
99
+ form: itemSlice,
100
+ updateFormValue: scopedUpdateFormValue,
101
+ dataItem: item,
102
+ itemIndex: index,
103
+ isEditMode: false,
104
+ builderContext: null,
105
+ }
106
+ }
107
+
108
+ // ── Widget schema cache ────────────────────────────────────────────────────────
109
+
110
+ const widgetSchemaCache = {}
111
+
112
+ function useWidgetSchema(widgetId) {
113
+ const [node, setNode] = useState(widgetId ? widgetSchemaCache[widgetId] ?? null : null)
114
+ const [loading, setLoading] = useState(false)
115
+ const [error, setError] = useState(null)
116
+
117
+ useEffect(() => {
118
+ if (!widgetId) { setNode(null); return }
119
+ if (widgetSchemaCache[widgetId]) { setNode(widgetSchemaCache[widgetId]); return }
120
+
121
+ let cancelled = false
122
+ setLoading(true)
123
+ setError(null)
124
+
125
+ Services.GetService(Endpoints.Widget.Get.GetById, false, { id: widgetId })
126
+ .then(res => {
127
+ if (cancelled) return
128
+ if (res?.data?.value) {
129
+ const parsed = JSON.parse(res.data.value)
130
+ widgetSchemaCache[widgetId] = parsed
131
+ setNode(parsed)
132
+ } else {
133
+ setError('Widget not found')
134
+ }
135
+ })
136
+ .catch(e => {
137
+ if (!cancelled) {
138
+ console.error('[Repeater] failed to load widget', e)
139
+ setError('Failed to load widget')
140
+ }
141
+ })
142
+ .finally(() => { if (!cancelled) setLoading(false) })
143
+
144
+ return () => { cancelled = true }
145
+ }, [widgetId])
146
+
147
+ return { node, loading, error }
148
+ }
149
+
150
+ // ── Main renderer ─────────────────────────────────────────────────────────────
8
151
 
9
152
  export default function RepeaterRenderer({ node, viewerContext }) {
10
- const { data, form, isEditMode, builderContext } = viewerContext
11
- const main = resolveProps(node, 'main', { form, data })
153
+ const { data, form, isEditMode, builderContext, setData } = viewerContext
154
+
155
+ // Resolve own props using parent context (no item scope yet)
156
+ const main = resolveProps(node, 'main', viewerContext)
157
+
158
+ const {
159
+ items: itemsProp,
160
+ count,
161
+ dataKey,
162
+ itemKey,
163
+ widgetId,
164
+ direction = 'vertical',
165
+ gap,
166
+ } = main
167
+
168
+ // ── Determine the effective items array ───────────────────────────────────
169
+ //
170
+ // Priority:
171
+ // 1. `items` expression → use as-is (array of objects)
172
+ // 2. `count` expression → generate N slots, read values from data[dataKey]
173
+ // 3. data[dataKey] is already an array → use its length
174
+
175
+ const effectiveItems = (() => {
176
+ if (Array.isArray(itemsProp) && itemsProp.length > 0) return itemsProp
177
+
178
+ const n = Number(count)
179
+ if (Number.isFinite(n) && n > 0) {
180
+ // Generate N item slots. When dataKey is set, seed from existing state
181
+ // so we don't lose values across re-renders.
182
+ const existing = dataKey && Array.isArray(data?.[dataKey]) ? data[dataKey] : []
183
+ return Array.from({ length: n }, (_, i) => existing[i] ?? {})
184
+ }
12
185
 
13
- // For repeater, we use the 'items' from data/form based on the 'key'
14
- const items = main.items || []
186
+ // Fallback: if dataKey points to an existing array, derive count from it
187
+ if (dataKey && Array.isArray(data?.[dataKey])) return data[dataKey]
188
+
189
+ return []
190
+ })()
191
+
192
+ // ── Initialize / sync data[dataKey] in parent state ───────────────────────
193
+ // When count is set and dataKey is provided, ensure parent state has an
194
+ // array of the right length so the main context can read it immediately.
195
+
196
+ useEffect(() => {
197
+ if (!dataKey) return
198
+ const n = Number(count)
199
+ if (!Number.isFinite(n) || n <= 0) return
200
+
201
+ const current = data?.[dataKey]
202
+ // Only initialize if missing or length changed — never overwrite existing values
203
+ if (!Array.isArray(current) || current.length !== n) {
204
+ const next = Array.from({ length: n }, (_, i) => current?.[i] ?? {})
205
+ setData(prev => ({ ...prev, [dataKey]: next }))
206
+ }
207
+ // eslint-disable-next-line react-hooks/exhaustive-deps
208
+ }, [dataKey, count])
209
+
210
+ // ── Widget template ───────────────────────────────────────────────────────
211
+
212
+ const { node: widgetNode, loading: widgetLoading, error: widgetError } = useWidgetSchema(
213
+ widgetId || null
214
+ )
215
+ const hasWidgetTemplate = !!widgetId && !!widgetNode
216
+
217
+ // ── Drag-drop handlers (edit mode, inline template only) ──────────────────
15
218
 
16
219
  const handleDropAtIndex = index => e => {
17
220
  if (!isEditMode || !builderContext) return
18
221
  e.preventDefault()
19
222
  e.stopPropagation()
20
-
21
223
  try {
22
224
  const nodeId = e.dataTransfer.getData('application/builder-node-id')
23
225
  if (nodeId) {
@@ -29,11 +231,10 @@ export default function RepeaterRenderer({ node, viewerContext }) {
29
231
  builderContext.setDraggingNodeId(null)
30
232
  return
31
233
  }
32
-
33
234
  const componentData = e.dataTransfer.getData('application/builder-component')
34
235
  if (componentData) {
35
236
  const component = JSON.parse(componentData)
36
- const newNode = createNode(component.type)
237
+ const newNode = createNode(component.type)
37
238
  builderContext.setSchema(prev => ({
38
239
  ...prev,
39
240
  root: insertIntoTreeAtIndex(prev.root, node.id, newNode, index)
@@ -47,14 +248,37 @@ export default function RepeaterRenderer({ node, viewerContext }) {
47
248
  }
48
249
  }
49
250
 
50
- return (
51
- <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
52
- <Box sx={{ border: '1px dashed #ccc', p: 1 }}>
53
- {isEditMode ? (
54
- // In edit mode, we show the template (children)
55
- <Box>
56
- <Box sx={{ fontSize: 10, color: 'text.secondary', mb: 1 }}>Repeater Template</Box>
57
- {node.children?.length > 0 ? (
251
+ // ── Edit mode ─────────────────────────────────────────────────────────────
252
+
253
+ if (isEditMode) {
254
+ return (
255
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
256
+ <Box sx={{
257
+ border: '1px dashed',
258
+ borderColor: 'primary.light',
259
+ borderRadius: 1,
260
+ p: 1,
261
+ bgcolor: 'action.hover',
262
+ minHeight: 56,
263
+ }}>
264
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5, mb: 1 }}>
265
+ <RepeatOutlined sx={{ fontSize: 14, color: 'text.disabled' }} />
266
+ <Typography sx={{ fontSize: 10, color: 'text.secondary', textTransform: 'uppercase', letterSpacing: 0.5 }}>
267
+ Repeater
268
+ {dataKey ? ` · ${dataKey}` : ''}
269
+ {widgetId ? ` · widget ${widgetId}` : ` · ${direction}`}
270
+ </Typography>
271
+ </Box>
272
+
273
+ {widgetId ? (
274
+ <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: 1, p: 2, color: 'text.disabled', minHeight: 48 }}>
275
+ <WidgetsOutlined sx={{ fontSize: 28, opacity: 0.4 }} />
276
+ <Typography sx={{ fontSize: 11, textAlign: 'center' }}>Widget template — ID: {widgetId}</Typography>
277
+ </Box>
278
+ ) : (
279
+ <Box sx={{ bgcolor: 'background.paper', borderRadius: 0.5, p: 0.5 }}>
280
+ <Typography sx={{ fontSize: 9, color: 'text.disabled', mb: 0.5, px: 0.5 }}>ITEM TEMPLATE</Typography>
281
+ {node.children?.length > 0 ? (
58
282
  <>
59
283
  {node.children.map((child, index) => (
60
284
  <Box key={child.id}>
@@ -64,30 +288,65 @@ export default function RepeaterRenderer({ node, viewerContext }) {
64
288
  ))}
65
289
  <DropZone onDrop={handleDropAtIndex(node.children.length)} isEditMode={isEditMode} />
66
290
  </>
67
- ) : (
291
+ ) : (
68
292
  <DropZone onDrop={handleDropAtIndex(0)} isEditMode={isEditMode} />
69
- )}
70
- </Box>
71
- ) : (
72
- // In preview mode, we repeat the template for each item
73
- items.map((item, index) => (
74
- <Box key={index} sx={{ mb: 2, borderBottom: '1px solid #eee', pb: 1 }}>
75
- {node.children?.map(child => (
76
- <ComponentRenderer
77
- key={child.id}
78
- node={child}
79
- viewerContext={{
80
- ...viewerContext,
81
- data: { ...data, item, index } // Provide item context
82
- }}
83
- />
84
- ))}
293
+ )}
85
294
  </Box>
86
- ))
87
- )}
88
- {!isEditMode && items.length === 0 && (
89
- <Box sx={{ textAlign: 'center', color: 'text.disabled', py: 2 }}>No items to display</Box>
90
- )}
295
+ )}
296
+ </Box>
297
+ </ViewerComponentWrapper>
298
+ )
299
+ }
300
+
301
+ // ── Preview / production ──────────────────────────────────────────────────
302
+
303
+ if (widgetId && widgetLoading) {
304
+ return (
305
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
306
+ <Box display='flex' alignItems='center' justifyContent='center' sx={{ minHeight: 48 }}>
307
+ <CircularProgress size={20} />
308
+ </Box>
309
+ </ViewerComponentWrapper>
310
+ )
311
+ }
312
+
313
+ if (widgetId && widgetError) {
314
+ return (
315
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
316
+ <Typography color='error' sx={{ fontSize: 12, p: 1 }}>{widgetError}</Typography>
317
+ </ViewerComponentWrapper>
318
+ )
319
+ }
320
+
321
+ if (effectiveItems.length === 0) {
322
+ return (
323
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
324
+ <Box sx={{ color: 'text.disabled', fontSize: 12, p: 1, textAlign: 'center' }}>No items</Box>
325
+ </ViewerComponentWrapper>
326
+ )
327
+ }
328
+
329
+ const renderItem = (item, index) => {
330
+ const ctx = buildItemContext(viewerContext, item, index, dataKey, node.id)
331
+ const key = itemKey && item?.[itemKey] != null ? item[itemKey] : index
332
+
333
+ if (hasWidgetTemplate) {
334
+ return <Box key={key}><ComponentRenderer node={widgetNode} viewerContext={ctx} /></Box>
335
+ }
336
+
337
+ return (
338
+ <Box key={key}>
339
+ {node.children?.map(child => (
340
+ <ComponentRenderer key={child.id} node={child} viewerContext={ctx} />
341
+ ))}
342
+ </Box>
343
+ )
344
+ }
345
+
346
+ return (
347
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
348
+ <Box sx={directionSx(direction, gap)}>
349
+ {effectiveItems.map((item, index) => renderItem(item, index))}
91
350
  </Box>
92
351
  </ViewerComponentWrapper>
93
352
  )
@@ -1,15 +1,273 @@
1
- import React from 'react'
2
- import ReportViewer from 'src/pages/reportModule/reportBuilder/reportViewer'
1
+ import React, { useRef, useEffect, useCallback, useState, useMemo } from 'react'
2
+ import { Box, CircularProgress } from '@mui/material'
3
+ import ReportViewer from 'pages/builders/report/viewer'
3
4
  import ViewerComponentWrapper from '../ViewerComponentWrapper'
4
5
  import { resolveProps } from 'services/builderHelper/resolveProps'
6
+ import RowActionsCell from './RowActionsCell'
7
+ import { PrintTable } from '../PrintDialog'
8
+ import fetchReportDataByPageId from 'services/reportData/fetchReportData'
9
+ import { executeJSCode } from 'services/builderHelper/jsExecutor'
5
10
 
11
+ // ── Print-mode report table ────────────────────────────────────────────────────
12
+ // Uses fetchReportDataByPageId with isPagination:false to load ALL rows in one
13
+ // request, then renders a plain HTML table (AG Grid virtualization breaks print).
14
+ function PrintReportTable({ mainProps, viewerContext }) {
15
+ const [rows, setRows] = useState(null) // null = still loading
16
+ const [columns, setColumns] = useState([])
17
+
18
+ useEffect(() => {
19
+ let cancelled = false
20
+
21
+ const load = async () => {
22
+ const pageId = mainProps.pageId || mainProps.id
23
+ const dataKey = mainProps.dataKey
24
+ const ctxData = viewerContext?.data
25
+
26
+ // Fast path: no report ID — fall back to data already in viewerContext
27
+ if (!pageId) {
28
+ const fallback = Array.isArray(ctxData?.[dataKey]) ? ctxData[dataKey] : []
29
+ if (!cancelled) {
30
+ setRows(fallback)
31
+ setColumns(Array.isArray(mainProps.columnDefs) ? mainProps.columnDefs : [])
32
+ }
33
+ return
34
+ }
35
+
36
+ const result = await fetchReportDataByPageId({
37
+ pageId,
38
+ filter: mainProps.filter ?? {},
39
+ isPagination: false, // NoPagination — fetch every row
40
+ pageSize: 100000,
41
+ })
42
+
43
+ if (cancelled) return
44
+
45
+ // Prefer columnDefs explicitly configured in the builder UI.
46
+ // If none, fall back to selectedFields from the builder model —
47
+ // fetchReportDataByPageId exposes them via finalRequest.filter.selectFields.
48
+ let cols = []
49
+ if (Array.isArray(mainProps.columnDefs) && mainProps.columnDefs.length > 0) {
50
+ cols = mainProps.columnDefs
51
+ } else {
52
+ const selectedFields = result?.finalRequest?.filter?.selectFields ?? []
53
+ cols = selectedFields.map(f => ({
54
+ field: f.headerName,
55
+ headerName: f.friendlyName || f.headerName,
56
+ }))
57
+ }
58
+
59
+ setRows(result?.rows ?? [])
60
+ setColumns(cols)
61
+ }
62
+
63
+ load()
64
+ return () => { cancelled = true }
65
+ // eslint-disable-next-line react-hooks/exhaustive-deps
66
+ }, [mainProps.pageId, mainProps.id])
67
+
68
+ if (rows === null) {
69
+ return (
70
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, p: 2, fontSize: 11, color: '#999' }}>
71
+ <CircularProgress size={14} />
72
+ Loading report data…
73
+ </Box>
74
+ )
75
+ }
76
+
77
+ return <PrintTable columns={columns} rows={rows} />
78
+ }
79
+
80
+ // ── Main renderer ─────────────────────────────────────────────────────────────
6
81
  export default function ReportViewerRenderer({ node, viewerContext }) {
7
- const { data, form } = viewerContext
8
- const main = resolveProps(node, 'main', { form, data })
82
+ const {
83
+ data, form, setData, dataRef, reportRefs, openDialog, closeDialog,
84
+ pageData, pageSetData, pageDataRef, pageReportRefs,
85
+ isPrintContext, isPrintBuilder, isEditMode, isPreviewMode,
86
+ } = viewerContext
87
+
88
+ const resolveCtx = {
89
+ form,
90
+ data,
91
+ setData,
92
+ dataRef: dataRef?.current ?? {},
93
+ reportRefs: reportRefs?.current ?? {},
94
+ openDialog: openDialog ?? (() => {}),
95
+ closeDialog: closeDialog ?? (() => {}),
96
+ pageData, pageSetData, pageDataRef, pageReportRefs,
97
+ }
98
+
99
+ const main = resolveProps(node, 'main', resolveCtx)
100
+
101
+ // Use the editable 'key' prop as the node name — falls back to node.id.
102
+ // This is the identifier used in reportRefs and passed to column functions
103
+ // as `nodeName` so cross-table ref calls can target this viewer by name.
104
+ const nodeName = main.key || node.id
105
+
106
+ // Strip 'key' before spreading — React treats it as a reserved prop and
107
+ // would silently drop it; we pass it explicitly below.
108
+ // Also strip actionsConfig (row actions — bound separately into actionsRenderer)
109
+ // and viewerActions (page-level actions — bound separately below).
110
+ const { key: _key, actionsConfig: _actionsConfig, viewerActions: _viewerActions, ...mainProps } = main
111
+
112
+ // Each ReportViewer instance owns its updateRef for tracking row mutations.
113
+ // Register under nodeName so column functions can access it via reportRefs.
114
+ const updateRef = useRef([])
115
+
116
+ useEffect(() => {
117
+ if (reportRefs?.current) {
118
+ reportRefs.current[nodeName] = updateRef
119
+ }
120
+ return () => {
121
+ if (reportRefs?.current) {
122
+ delete reportRefs.current[nodeName]
123
+ }
124
+ }
125
+ }, [nodeName, reportRefs])
126
+
127
+ // ── Build the `actions` cell-renderer function from actionsConfig ─────────
128
+ const actionsConfig = Array.isArray(main.actionsConfig) && main.actionsConfig.length > 0
129
+ ? main.actionsConfig
130
+ : null
131
+
132
+ const ctxRef = useRef(viewerContext)
133
+ ctxRef.current = viewerContext
134
+
135
+ const actionsRenderer = useCallback(
136
+ actionsConfig
137
+ ? (params) => (
138
+ <RowActionsCell
139
+ params={params}
140
+ actionsConfig={actionsConfig}
141
+ viewerContext={ctxRef.current}
142
+ nodeName={nodeName}
143
+ />
144
+ )
145
+ : null,
146
+ // eslint-disable-next-line react-hooks/exhaustive-deps
147
+ [JSON.stringify(actionsConfig)]
148
+ )
149
+
150
+ // ── Build viewer actions with bound onClick handlers ───────────────────────
151
+ // Page-level buttons rendered in the report toolbar after Filter / Refresh.
152
+ // Each item is a copy of the schema config plus a stable `onClick` that
153
+ // runs the Calculation in the same scope as row actions, minus rowData.
154
+ const viewerActionsConfig = Array.isArray(main.viewerActions) && main.viewerActions.length > 0
155
+ ? main.viewerActions
156
+ : null
157
+
158
+ const viewerActions = useMemo(() => {
159
+ if (!viewerActionsConfig) return null
160
+ return viewerActionsConfig.map((action, idx) => ({
161
+ key: `${action.label ?? 'action'}-${idx}`,
162
+ label: action.label,
163
+ icon: action.icon,
164
+ color: action.color,
165
+ variant: action.variant,
166
+ disabled: action.disabled,
167
+ confirmation: action.confirmation,
168
+ onClick: async () => {
169
+ if (!action.code) return
170
+ const ctx = ctxRef.current ?? {}
171
+ await executeJSCode(action.code, {
172
+ form: ctx.form ?? {},
173
+ data: ctx.data ?? {},
174
+ setData: ctx.setData ?? (() => {}),
175
+ dataRef: ctx.dataRef?.current ?? {},
176
+ reportRefs: ctx.reportRefs?.current ?? {},
177
+ openDialog: ctx.openDialog ?? (() => {}),
178
+ closeDialog: ctx.closeDialog ?? (() => {}),
179
+ pageData: ctx.pageData,
180
+ pageSetData: ctx.pageSetData,
181
+ pageDataRef: ctx.pageDataRef,
182
+ pageReportRefs: ctx.pageReportRefs,
183
+ })
184
+ },
185
+ }))
186
+ // Stringify the config so we recompute only when its shape changes.
187
+ // eslint-disable-next-line react-hooks/exhaustive-deps
188
+ }, [JSON.stringify(viewerActionsConfig)])
189
+
190
+ // ── Edit mode: rich placeholder (both UI builder and print builder) ────────
191
+ if (isEditMode) {
192
+ const cols = Array.isArray(mainProps.columnDefs) ? mainProps.columnDefs : []
193
+ const colNames = cols.slice(0, 5).map(c => c.headerName || c.field || c.label || '?')
194
+ const hasMore = cols.length > 5
195
+
196
+ const detailRows = [
197
+ mainProps.dataKey && { label: 'dataKey', value: mainProps.dataKey },
198
+ nodeName && { label: 'id', value: nodeName },
199
+ mainProps.rowHeight != null && { label: 'rowHeight', value: mainProps.rowHeight },
200
+ mainProps.pagination != null && { label: 'pagination', value: String(mainProps.pagination) },
201
+ ].filter(Boolean)
202
+
203
+ return (
204
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
205
+ <Box sx={{
206
+ border: '2px dashed #90a4ae', borderRadius: 1, p: 1.5, m: 0.5,
207
+ bgcolor: '#f0f4f8', display: 'flex', flexDirection: 'column', gap: 0.5, minHeight: 72,
208
+ }}>
209
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
210
+ <Box sx={{ fontSize: 10, fontWeight: 700, color: '#546e7a',
211
+ textTransform: 'uppercase', letterSpacing: 0.5, flexShrink: 0 }}>
212
+ Report Viewer
213
+ </Box>
214
+ {cols.length > 0 && (
215
+ <Box sx={{ fontSize: 10, color: '#90a4ae', ml: 'auto', flexShrink: 0 }}>
216
+ {cols.length} col{cols.length !== 1 ? 's' : ''}
217
+ </Box>
218
+ )}
219
+ </Box>
220
+
221
+ {detailRows.map(({ label, value }) => (
222
+ <Box key={label} sx={{ display: 'flex', gap: 0.5, alignItems: 'baseline' }}>
223
+ <Box sx={{ fontSize: 9, color: '#90a4ae', fontWeight: 600, minWidth: 58, flexShrink: 0 }}>
224
+ {label}
225
+ </Box>
226
+ <Box sx={{ fontSize: 10, color: '#37474f', fontFamily: 'monospace',
227
+ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
228
+ {value}
229
+ </Box>
230
+ </Box>
231
+ ))}
232
+
233
+ {colNames.length > 0 && (
234
+ <Box sx={{ fontSize: 9, color: '#78909c', mt: 0.25,
235
+ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
236
+ {colNames.join(' · ')}{hasMore ? ` · +${cols.length - 5} more` : ''}
237
+ </Box>
238
+ )}
239
+ </Box>
240
+ </ViewerComponentWrapper>
241
+ )
242
+ }
243
+
244
+ // ── Print context / print builder preview ────────────────────────────────────
245
+ // AG Grid's virtualization breaks under window.print().
246
+ // PrintReportTable fetches ALL rows using NoPagination and maps columns properly.
247
+ if (isPrintContext || (isPrintBuilder && isPreviewMode)) {
248
+ return (
249
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
250
+ <PrintReportTable mainProps={mainProps} viewerContext={viewerContext} />
251
+ </ViewerComponentWrapper>
252
+ )
253
+ }
9
254
 
10
255
  return (
11
256
  <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
12
- <ReportViewer noHeader={true} {...main} />
257
+ <ReportViewer
258
+ key={nodeName}
259
+ noHeader={true}
260
+ {...mainProps}
261
+ actions={actionsRenderer ?? mainProps.actions}
262
+ viewerActions={viewerActions}
263
+ updateRef={updateRef}
264
+ nodeId={nodeName}
265
+ reportRefs={reportRefs}
266
+ data={data}
267
+ dataRef={dataRef?.current}
268
+ openDialog={openDialog}
269
+ closeDialog={closeDialog}
270
+ />
13
271
  </ViewerComponentWrapper>
14
272
  )
15
273
  }