robobyte-front-builder 1.0.19 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (513) hide show
  1. package/README.md +211 -0
  2. package/next.config.js +19 -48
  3. package/package.json +39 -85
  4. package/src/context/BuilderContext.jsx +134 -6
  5. package/src/context/SystemContext.js +2 -2
  6. package/src/hooks/useGlobalStore.js +36 -0
  7. package/src/hooks/useTimerEngine.js +54 -0
  8. package/src/lib/index.js +11 -3
  9. package/src/lib/layouts/BlankLayout.jsx +13 -0
  10. package/src/lib/providers/RoboByteFrontBuilderProvider.jsx +61 -7
  11. package/src/lib/themes/builderTheme.js +41 -0
  12. package/src/pages/_app.js +32 -134
  13. package/src/pages/api/ai.js +87 -0
  14. package/src/pages/builders/report/index.js +1 -0
  15. package/src/pages/builders/report/list/index.js +1 -0
  16. package/src/pages/builders/report/viewer/index.js +1 -0
  17. package/src/pages/index.js +88 -37
  18. package/src/pages/printBuilder/index.jsx +263 -0
  19. package/src/pages/printBuilder/layouts/index.jsx +298 -0
  20. package/src/pages/reportModule/reportBuilder/index.js +8 -6
  21. package/src/pages/reportModule/reportBuilder/reportViewer/index.js +33 -22
  22. package/src/pages/reportModule/reportBuilder/reports/index.js +3 -5
  23. package/src/pages/reportModule/reportBuilder/reportsPermissions/index.js +2 -3
  24. package/src/pages/viewBuilder/index.jsx +117 -32
  25. package/src/pages/viewBuilder/views/index.js +3 -3
  26. package/src/pages/viewer/[id]/index.js +2 -1
  27. package/src/services/DeleteService.js +31 -60
  28. package/src/services/Endpoints/PrintLayoutEndpoints.js +42 -0
  29. package/src/services/Endpoints.js +2 -0
  30. package/src/services/GetService.js +33 -54
  31. package/src/services/PatchService.js +38 -65
  32. package/src/services/PostService.js +37 -63
  33. package/src/services/UpdateService.js +39 -65
  34. package/src/services/builderHelper/actionExecutor.js +141 -25
  35. package/src/services/builderHelper/builderHelper.js +92 -0
  36. package/src/services/builderHelper/colorSchema.js +95 -0
  37. package/src/services/builderHelper/iconResolver.js +50 -0
  38. package/src/services/builderHelper/jsExecutor.js +212 -46
  39. package/src/services/builderHelper/nodeFactory.js +32 -15
  40. package/src/services/builderHelper/numberFormat.js +123 -0
  41. package/src/services/builderHelper/resolveProps.js +73 -4
  42. package/src/services/builderHelper/thresholdEngine.js +77 -0
  43. package/src/services/builderHelper/tree.js +31 -0
  44. package/src/services/components/agGridAutoComplete.js +5 -9
  45. package/src/services/config.js +9 -1
  46. package/src/services/globalStore.js +80 -0
  47. package/src/services/helper/multiSelectEditor.js +5 -9
  48. package/src/services/helper/multiSelectEditorByBuilder.js +5 -9
  49. package/src/services/reportData/fetchReportData.js +69 -28
  50. package/src/services/routerRef.js +35 -0
  51. package/src/views/ConfirmDialog.js +2 -2
  52. package/src/views/builder/JSEditor.js +105 -107
  53. package/src/views/builder/inspector/Inspector.jsx +6 -9
  54. package/src/views/builder/inspector/Tabs/ComponentActionsTab.jsx +7 -13
  55. package/src/views/builder/inspector/Tabs/MainTab.jsx +143 -25
  56. package/src/views/builder/inspector/Tabs/RulesTab.jsx +9 -24
  57. package/src/views/builder/inspector/Tabs/StyleTab.jsx +9 -24
  58. package/src/views/builder/inspector/definitions/autocomplete/main.js +4 -6
  59. package/src/views/builder/inspector/definitions/banner/actions.js +7 -0
  60. package/src/views/builder/inspector/definitions/banner/main.js +22 -0
  61. package/src/views/builder/inspector/definitions/banner/rules.js +1 -0
  62. package/src/views/builder/inspector/definitions/banner/style.js +1 -0
  63. package/src/views/builder/inspector/definitions/breadcrumb/main.js +43 -6
  64. package/src/views/builder/inspector/definitions/button/main.js +11 -12
  65. package/src/views/builder/inspector/definitions/button/style.js +18 -30
  66. package/src/views/builder/inspector/definitions/checkbox/actions.js +3 -1
  67. package/src/views/builder/inspector/definitions/checkbox/main.js +4 -6
  68. package/src/views/builder/inspector/definitions/common/main.js +13 -2
  69. package/src/views/builder/inspector/definitions/dataGrid/main.js +23 -0
  70. package/src/views/builder/inspector/definitions/dataTableViewer/main.js +46 -0
  71. package/src/views/builder/inspector/definitions/datepicker/actions.js +3 -1
  72. package/src/views/builder/inspector/definitions/datepicker/main.js +6 -14
  73. package/src/views/builder/inspector/definitions/dialog/main.js +36 -0
  74. package/src/views/builder/inspector/definitions/dropdown/main.js +5 -8
  75. package/src/views/builder/inspector/definitions/excelUpload/actions.js +23 -0
  76. package/src/views/builder/inspector/definitions/excelUpload/main.js +17 -0
  77. package/src/views/builder/inspector/definitions/excelUpload/rules.js +1 -0
  78. package/src/views/builder/inspector/definitions/excelUpload/style.js +45 -0
  79. package/src/views/builder/inspector/definitions/header/main.js +10 -1
  80. package/src/views/builder/inspector/definitions/index.js +106 -19
  81. package/src/views/builder/inspector/definitions/input/actions.js +4 -1
  82. package/src/views/builder/inspector/definitions/input/main.js +20 -11
  83. package/src/views/builder/inspector/definitions/kpi/avatarGroup.js +22 -0
  84. package/src/views/builder/inspector/definitions/kpi/badge.js +17 -0
  85. package/src/views/builder/inspector/definitions/kpi/bulletChart.js +47 -0
  86. package/src/views/builder/inspector/definitions/kpi/chart.js +55 -0
  87. package/src/views/builder/inspector/definitions/kpi/colorScale.js +60 -0
  88. package/src/views/builder/inspector/definitions/kpi/comparisonBars.js +41 -0
  89. package/src/views/builder/inspector/definitions/kpi/countdown.js +46 -0
  90. package/src/views/builder/inspector/definitions/kpi/donut.js +51 -0
  91. package/src/views/builder/inspector/definitions/kpi/funnel.js +25 -0
  92. package/src/views/builder/inspector/definitions/kpi/gauge.js +39 -0
  93. package/src/views/builder/inspector/definitions/kpi/heatmapGrid.js +96 -0
  94. package/src/views/builder/inspector/definitions/kpi/iconBox.js +20 -0
  95. package/src/views/builder/inspector/definitions/kpi/metric.js +45 -0
  96. package/src/views/builder/inspector/definitions/kpi/rating.js +27 -0
  97. package/src/views/builder/inspector/definitions/kpi/statusDot.js +18 -0
  98. package/src/views/builder/inspector/definitions/kpi/stepStage.js +65 -0
  99. package/src/views/builder/inspector/definitions/kpi/tagList.js +32 -0
  100. package/src/views/builder/inspector/definitions/kpi/timeline.js +80 -0
  101. package/src/views/builder/inspector/definitions/kpi/trend.js +20 -0
  102. package/src/views/builder/inspector/definitions/label/main.js +10 -1
  103. package/src/views/builder/inspector/definitions/layout/main.js +27 -3
  104. package/src/views/builder/inspector/definitions/number/main.js +6 -14
  105. package/src/views/builder/inspector/definitions/pageNumber/main.js +21 -0
  106. package/src/views/builder/inspector/definitions/popover/main.js +71 -0
  107. package/src/views/builder/inspector/definitions/radio/main.js +5 -8
  108. package/src/views/builder/inspector/definitions/repeater/main.js +31 -0
  109. package/src/views/builder/inspector/definitions/reportViewer/main.js +15 -1
  110. package/src/views/builder/inspector/definitions/richtext/main.js +5 -8
  111. package/src/views/builder/inspector/definitions/signature/main.js +4 -1
  112. package/src/views/builder/inspector/definitions/tag/main.js +5 -8
  113. package/src/views/builder/inspector/definitions/textarea/actions.js +4 -1
  114. package/src/views/builder/inspector/definitions/textarea/main.js +5 -7
  115. package/src/views/builder/inspector/definitions/time/main.js +5 -8
  116. package/src/views/builder/inspector/definitions/toggle/main.js +5 -19
  117. package/src/views/builder/inspector/definitions/treeView/main.js +61 -0
  118. package/src/views/builder/inspector/definitions/viewRenderer/main.js +53 -0
  119. package/src/views/builder/inspector/definitions/wizard/main.js +68 -0
  120. package/src/views/builder/inspector/definitions/wizard-step/main.js +25 -0
  121. package/src/views/builder/inspector/fields/ActionsConfigEditor.jsx +426 -0
  122. package/src/views/builder/inspector/fields/ColorSchemaField.jsx +140 -0
  123. package/src/views/builder/inspector/fields/ColumnFunctionEditor.jsx +238 -0
  124. package/src/views/builder/inspector/fields/ColumnMappingEditor.jsx +105 -0
  125. package/src/views/builder/inspector/fields/ColumnsConfigEditor.jsx +506 -0
  126. package/src/views/builder/inspector/fields/DonutRingsEditorField.jsx +337 -0
  127. package/src/views/builder/inspector/fields/ExtraColsEditor.jsx +618 -0
  128. package/src/views/builder/inspector/fields/FunctionHelpPopover.jsx +295 -0
  129. package/src/views/builder/inspector/fields/IconEditor.jsx +64 -0
  130. package/src/views/builder/inspector/fields/KpiActionField.jsx +223 -0
  131. package/src/views/builder/inspector/fields/MarkersEditorField.jsx +173 -0
  132. package/src/views/builder/inspector/fields/SelectEditor.jsx +9 -5
  133. package/src/views/builder/inspector/fields/SeriesEditorField.jsx +363 -0
  134. package/src/views/builder/inspector/fields/TableColumnsEditor.jsx +104 -0
  135. package/src/views/builder/inspector/fields/ThresholdsEditor.jsx +247 -0
  136. package/src/views/builder/inspector/fields/ValueFunctionsRefPanel.jsx +217 -0
  137. package/src/views/builder/inspector/fields/columnEditorShared.jsx +217 -0
  138. package/src/views/builder/sidebar/Sidebar.jsx +4 -2
  139. package/src/views/builder/sidebar/SidebarTabs.jsx +28 -17
  140. package/src/views/builder/sidebar/tabs/ActionsTab.jsx +7 -3
  141. package/src/views/builder/sidebar/tabs/AiTab/AiPreviewDialog.jsx +193 -0
  142. package/src/views/builder/sidebar/tabs/AiTab/aiProvider.js +49 -0
  143. package/src/views/builder/sidebar/tabs/AiTab/index.jsx +409 -0
  144. package/src/views/builder/sidebar/tabs/AiTab/schemaTransformer.js +102 -0
  145. package/src/views/builder/sidebar/tabs/AiTab/schemaValidator.js +64 -0
  146. package/src/views/builder/sidebar/tabs/AiTab/systemPrompt.js +1151 -0
  147. package/src/views/builder/sidebar/tabs/Components/ComponentsTab.jsx +31 -31
  148. package/src/views/builder/sidebar/tabs/Components/componentCatalog.js +43 -21
  149. package/src/views/builder/sidebar/tabs/Components/printComponentCatalog.js +81 -0
  150. package/src/views/builder/sidebar/tabs/TimersTab.jsx +338 -0
  151. package/src/views/builder/sidebar/tabs/TreeTab.jsx +13 -4
  152. package/src/views/builder/sidebar/tabs/ViewTab.jsx +1 -1
  153. package/src/views/builder/viewer/AdornedLabel.jsx +82 -0
  154. package/src/views/builder/viewer/ComponentRenderer.jsx +98 -24
  155. package/src/views/builder/viewer/DialogsZone.jsx +259 -0
  156. package/src/views/builder/viewer/FieldLabel.jsx +106 -0
  157. package/src/views/builder/viewer/PrintDialog.jsx +481 -0
  158. package/src/views/builder/viewer/ProductionViewer.jsx +80 -5
  159. package/src/views/builder/viewer/Viewer.jsx +106 -8
  160. package/src/views/builder/viewer/ViewerComponentWrapper.jsx +61 -4
  161. package/src/views/builder/viewer/ViewerToolbar.jsx +273 -59
  162. package/src/views/builder/viewer/renderers/AutoCompleteRenderer.jsx +26 -22
  163. package/src/views/builder/viewer/renderers/AvatarGroupRenderer.jsx +112 -0
  164. package/src/views/builder/viewer/renderers/BadgeRenderer.jsx +79 -0
  165. package/src/views/builder/viewer/renderers/BannerRenderer.jsx +62 -0
  166. package/src/views/builder/viewer/renderers/BreadcrumbRenderer.jsx +203 -15
  167. package/src/views/builder/viewer/renderers/BulletChartRenderer.jsx +147 -0
  168. package/src/views/builder/viewer/renderers/ButtonRenderer.jsx +98 -39
  169. package/src/views/builder/viewer/renderers/CardRenderer.jsx +1 -1
  170. package/src/views/builder/viewer/renderers/ChartRenderer.jsx +388 -0
  171. package/src/views/builder/viewer/renderers/CheckboxRenderer.jsx +17 -9
  172. package/src/views/builder/viewer/renderers/ColorScaleRenderer.jsx +300 -0
  173. package/src/views/builder/viewer/renderers/ComparisonBarsRenderer.jsx +133 -0
  174. package/src/views/builder/viewer/renderers/ContainerRenderer.jsx +3 -1
  175. package/src/views/builder/viewer/renderers/CountdownRenderer.jsx +249 -0
  176. package/src/views/builder/viewer/renderers/DataGridRenderer.jsx +380 -0
  177. package/src/views/builder/viewer/renderers/DataTableViewerRenderer.jsx +240 -0
  178. package/src/views/builder/viewer/renderers/DatePickerRenderer.jsx +25 -24
  179. package/src/views/builder/viewer/renderers/DialogRenderer.jsx +327 -0
  180. package/src/views/builder/viewer/renderers/DividerRenderer.jsx +1 -1
  181. package/src/views/builder/viewer/renderers/DonutRenderer.jsx +294 -0
  182. package/src/views/builder/viewer/renderers/DropdownRenderer.jsx +36 -44
  183. package/src/views/builder/viewer/renderers/ExcelUploadRenderer.jsx +639 -0
  184. package/src/views/builder/viewer/renderers/FunnelRenderer.jsx +93 -0
  185. package/src/views/builder/viewer/renderers/GaugeRenderer.jsx +159 -0
  186. package/src/views/builder/viewer/renderers/HeaderRenderer.jsx +31 -9
  187. package/src/views/builder/viewer/renderers/HeatmapGridRenderer.jsx +432 -0
  188. package/src/views/builder/viewer/renderers/IconBoxRenderer.jsx +59 -0
  189. package/src/views/builder/viewer/renderers/ImageRenderer.jsx +1 -1
  190. package/src/views/builder/viewer/renderers/InputRenderer.jsx +75 -18
  191. package/src/views/builder/viewer/renderers/LabelRenderer.jsx +35 -9
  192. package/src/views/builder/viewer/renderers/LayoutCellRenderer.jsx +102 -40
  193. package/src/views/builder/viewer/renderers/LayoutContextMenu.jsx +8 -8
  194. package/src/views/builder/viewer/renderers/LayoutRenderer.jsx +48 -6
  195. package/src/views/builder/viewer/renderers/LinkRenderer.jsx +1 -1
  196. package/src/views/builder/viewer/renderers/MenuRenderer.jsx +2 -2
  197. package/src/views/builder/viewer/renderers/MetricRenderer.jsx +80 -0
  198. package/src/views/builder/viewer/renderers/NumberFormatRenderer.jsx +21 -30
  199. package/src/views/builder/viewer/renderers/PageNumberRenderer.jsx +76 -0
  200. package/src/views/builder/viewer/renderers/PopoverRenderer.jsx +350 -0
  201. package/src/views/builder/viewer/renderers/ProgressCircleRenderer.jsx +1 -1
  202. package/src/views/builder/viewer/renderers/ProgressLineRenderer.jsx +1 -1
  203. package/src/views/builder/viewer/renderers/RadioGroupRenderer.jsx +28 -39
  204. package/src/views/builder/viewer/renderers/RatingRenderer.jsx +80 -0
  205. package/src/views/builder/viewer/renderers/RepeaterRenderer.jsx +297 -38
  206. package/src/views/builder/viewer/renderers/ReportViewerRenderer.jsx +219 -5
  207. package/src/views/builder/viewer/renderers/RichTextRenderer.jsx +60 -66
  208. package/src/views/builder/viewer/renderers/RowActionsCell.jsx +308 -0
  209. package/src/views/builder/viewer/renderers/SignatureRenderer.jsx +33 -62
  210. package/src/views/builder/viewer/renderers/StatusDotRenderer.jsx +75 -0
  211. package/src/views/builder/viewer/renderers/StepStageRenderer.jsx +348 -0
  212. package/src/views/builder/viewer/renderers/TagListRenderer.jsx +115 -0
  213. package/src/views/builder/viewer/renderers/TagPickerRenderer.jsx +31 -45
  214. package/src/views/builder/viewer/renderers/TextAreaRenderer.jsx +25 -18
  215. package/src/views/builder/viewer/renderers/TextRenderer.jsx +7 -1
  216. package/src/views/builder/viewer/renderers/TimePickerRenderer.jsx +25 -24
  217. package/src/views/builder/viewer/renderers/TimelineRenderer.jsx +525 -0
  218. package/src/views/builder/viewer/renderers/ToggleRenderer.jsx +21 -27
  219. package/src/views/builder/viewer/renderers/TreeViewRenderer.jsx +832 -0
  220. package/src/views/builder/viewer/renderers/TrendRenderer.jsx +66 -0
  221. package/src/views/builder/viewer/renderers/ViewRendererRenderer.jsx +315 -0
  222. package/src/views/builder/viewer/renderers/WizardRenderer.jsx +380 -64
  223. package/src/views/builder/viewer/renderers/WizardStepRenderer.jsx +21 -12
  224. package/src/views/builder/viewer/renderers/dataGridComponents.jsx +824 -0
  225. package/src/views/customFilter/CustomFilterDialog.js +1023 -660
  226. package/src/views/customFilter/FixedFilterDialog.js +649 -0
  227. package/src/views/customFilter/SearchFilterDialog.js +248 -0
  228. package/src/views/genericTable/BuilderExpressionParams.js +3 -3
  229. package/src/views/genericTable/ColumnConfiguratorDialog.js +33 -24
  230. package/src/views/genericTable/FixedFilterDialog.js +3 -2
  231. package/src/views/genericTable/FormattingSettingsDialog.js +8 -3
  232. package/src/views/genericTable/SGrid.js +198 -97
  233. package/src/views/genericTable/SearchFilterDialog.js +3 -2
  234. package/src/views/genericTable/cellEditors/autocompleteEditor.js +5 -9
  235. package/src/views/genericTable/convertStringFunctions.js +274 -138
  236. package/src/views/genericTable/statusBar/rowCountStatusBar.js +3 -1
  237. package/src/views/genericTable/updateRefHelpers.js +9 -6
  238. package/src/views/printBuilder/PrintBuilderViewer.jsx +607 -0
  239. package/src/views/printBuilder/PrintPreviewCanvas.jsx +157 -0
  240. package/src/views/rolePermissions/UpdateReportPermissionDialog.js +3 -2
  241. package/src/@core/components/auth/AclGuard.js +0 -55
  242. package/src/@core/components/auth/AuthGuard.js +0 -40
  243. package/src/@core/components/auth/GuestGuard.js +0 -30
  244. package/src/@core/components/custom-inputs/Horizontal.jsx +0 -143
  245. package/src/@core/components/custom-inputs/Image.jsx +0 -78
  246. package/src/@core/components/custom-inputs/Vertical.jsx +0 -113
  247. package/src/@core/components/customizer/index.jsx +0 -470
  248. package/src/@core/components/customizer/styles.module.css +0 -169
  249. package/src/@core/components/mui/Avatar.jsx +0 -41
  250. package/src/@core/components/mui/Badge.jsx +0 -20
  251. package/src/@core/components/mui/IconButton.jsx +0 -74
  252. package/src/@core/components/mui/TabList.jsx +0 -60
  253. package/src/@core/components/option-menu/index.jsx +0 -137
  254. package/src/@core/components/scroll-to-top/index.jsx +0 -43
  255. package/src/@core/components/spinner/index.js +0 -26
  256. package/src/@core/components/window-wrapper/index.js +0 -27
  257. package/src/@core/contexts/settingsContext.jsx +0 -98
  258. package/src/@core/hooks/useBgColor.js +0 -63
  259. package/src/@core/hooks/useImageVariant.js +0 -27
  260. package/src/@core/hooks/useLayoutInit.js +0 -37
  261. package/src/@core/hooks/useObjectCookie.js +0 -18
  262. package/src/@core/hooks/useSettings.jsx +0 -15
  263. package/src/@core/layouts/BlankLayout.js +0 -37
  264. package/src/@core/layouts/BlankLayoutWithAppBar.js +0 -51
  265. package/src/@core/layouts/HorizontalLayout.jsx +0 -151
  266. package/src/@core/layouts/Layout.js +0 -39
  267. package/src/@core/layouts/VerticalLayout.jsx +0 -124
  268. package/src/@core/layouts/components/blank-layout-with-appBar/index.js +0 -115
  269. package/src/@core/layouts/components/horizontal/app-bar-content/index.js +0 -67
  270. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavGroup.js +0 -352
  271. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavItems.js +0 -21
  272. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavLink.js +0 -195
  273. package/src/@core/layouts/components/horizontal/navigation/index.js +0 -31
  274. package/src/@core/layouts/components/shared-components/LanguageDropdown.js +0 -96
  275. package/src/@core/layouts/components/shared-components/ModeToggler.js +0 -32
  276. package/src/@core/layouts/components/shared-components/NotificationDropdown.js +0 -226
  277. package/src/@core/layouts/components/shared-components/UserDropdown.js +0 -177
  278. package/src/@core/layouts/components/shared-components/footer/FooterContent.js +0 -46
  279. package/src/@core/layouts/components/shared-components/footer/index.js +0 -61
  280. package/src/@core/layouts/components/vertical/appBar/index.js +0 -74
  281. package/src/@core/layouts/components/vertical/navigation/Drawer.js +0 -122
  282. package/src/@core/layouts/components/vertical/navigation/VerticalNavGroup.js +0 -435
  283. package/src/@core/layouts/components/vertical/navigation/VerticalNavHeader.js +0 -180
  284. package/src/@core/layouts/components/vertical/navigation/VerticalNavItems.js +0 -26
  285. package/src/@core/layouts/components/vertical/navigation/VerticalNavLink.js +0 -258
  286. package/src/@core/layouts/components/vertical/navigation/VerticalNavSectionTitle.js +0 -102
  287. package/src/@core/layouts/components/vertical/navigation/index.js +0 -169
  288. package/src/@core/layouts/utils.js +0 -69
  289. package/src/@core/styles/Table.module.css +0 -93
  290. package/src/@core/styles/horizontal/menuItemStyles.js +0 -100
  291. package/src/@core/styles/horizontal/menuRootStyles.js +0 -19
  292. package/src/@core/styles/libs/fullcalendar/index.js +0 -461
  293. package/src/@core/styles/libs/keen-slider/index.js +0 -111
  294. package/src/@core/styles/libs/react-apexcharts/index.js +0 -107
  295. package/src/@core/styles/libs/react-cleave/index.js +0 -33
  296. package/src/@core/styles/libs/react-credit-cards/index.js +0 -11
  297. package/src/@core/styles/libs/react-datepicker/index.js +0 -388
  298. package/src/@core/styles/libs/react-draft-wysiwyg/index.js +0 -144
  299. package/src/@core/styles/libs/react-dropzone/index.js +0 -76
  300. package/src/@core/styles/libs/react-hot-toast/index.js +0 -37
  301. package/src/@core/styles/libs/recharts/index.js +0 -47
  302. package/src/@core/styles/stepper.js +0 -103
  303. package/src/@core/styles/vertical/menuItemStyles.js +0 -138
  304. package/src/@core/styles/vertical/menuSectionStyles.js +0 -54
  305. package/src/@core/styles/vertical/navigationCustomStyles.js +0 -62
  306. package/src/@core/svg/ContentCompact.jsx +0 -17
  307. package/src/@core/svg/ContentWide.jsx +0 -17
  308. package/src/@core/svg/DirectionLtr.jsx +0 -93
  309. package/src/@core/svg/DirectionRtl.jsx +0 -93
  310. package/src/@core/svg/LayoutCollapsed.jsx +0 -59
  311. package/src/@core/svg/LayoutHorizontal.jsx +0 -42
  312. package/src/@core/svg/LayoutVertical.jsx +0 -59
  313. package/src/@core/svg/Logo.jsx +0 -76
  314. package/src/@core/svg/SkinBordered.jsx +0 -54
  315. package/src/@core/svg/SkinDefault.jsx +0 -59
  316. package/src/@core/tailwind/plugin.js +0 -78
  317. package/src/@core/theme/ThemeComponent.js +0 -63
  318. package/src/@core/theme/ThemeOptions.js +0 -71
  319. package/src/@core/theme/breakpoints/index.js +0 -11
  320. package/src/@core/theme/colorSchemes.js +0 -326
  321. package/src/@core/theme/customShadows.js +0 -11
  322. package/src/@core/theme/globalStyles.js +0 -81
  323. package/src/@core/theme/index.js +0 -42
  324. package/src/@core/theme/overrides/accordion.js +0 -51
  325. package/src/@core/theme/overrides/accordion.jsx +0 -85
  326. package/src/@core/theme/overrides/alerts.js +0 -110
  327. package/src/@core/theme/overrides/alerts.jsx +0 -180
  328. package/src/@core/theme/overrides/autocomplete.js +0 -14
  329. package/src/@core/theme/overrides/autocomplete.jsx +0 -68
  330. package/src/@core/theme/overrides/avatar.js +0 -38
  331. package/src/@core/theme/overrides/avatars.js +0 -27
  332. package/src/@core/theme/overrides/backdrop.js +0 -22
  333. package/src/@core/theme/overrides/badges.js +0 -16
  334. package/src/@core/theme/overrides/breadcrumbs.js +0 -11
  335. package/src/@core/theme/overrides/button-group.js +0 -84
  336. package/src/@core/theme/overrides/button.js +0 -93
  337. package/src/@core/theme/overrides/buttonGroup.js +0 -9
  338. package/src/@core/theme/overrides/card.js +0 -83
  339. package/src/@core/theme/overrides/checkbox.jsx +0 -95
  340. package/src/@core/theme/overrides/chip.js +0 -72
  341. package/src/@core/theme/overrides/dataGrid.js +0 -114
  342. package/src/@core/theme/overrides/dateTimePicker.js +0 -65
  343. package/src/@core/theme/overrides/dialog.js +0 -120
  344. package/src/@core/theme/overrides/divider.js +0 -13
  345. package/src/@core/theme/overrides/drawer.js +0 -20
  346. package/src/@core/theme/overrides/fab.js +0 -13
  347. package/src/@core/theme/overrides/form-control-label.js +0 -19
  348. package/src/@core/theme/overrides/icon-button.js +0 -145
  349. package/src/@core/theme/overrides/index.js +0 -103
  350. package/src/@core/theme/overrides/input.js +0 -72
  351. package/src/@core/theme/overrides/link.js +0 -9
  352. package/src/@core/theme/overrides/list.js +0 -44
  353. package/src/@core/theme/overrides/menu.js +0 -25
  354. package/src/@core/theme/overrides/pagination.js +0 -41
  355. package/src/@core/theme/overrides/paper.js +0 -9
  356. package/src/@core/theme/overrides/popover.js +0 -16
  357. package/src/@core/theme/overrides/progress.js +0 -38
  358. package/src/@core/theme/overrides/radio.jsx +0 -80
  359. package/src/@core/theme/overrides/rating.js +0 -16
  360. package/src/@core/theme/overrides/rating.jsx +0 -32
  361. package/src/@core/theme/overrides/select.js +0 -19
  362. package/src/@core/theme/overrides/select.jsx +0 -52
  363. package/src/@core/theme/overrides/slider.js +0 -97
  364. package/src/@core/theme/overrides/snackbar.js +0 -19
  365. package/src/@core/theme/overrides/switch.js +0 -73
  366. package/src/@core/theme/overrides/switches.js +0 -25
  367. package/src/@core/theme/overrides/table-pagination.js +0 -39
  368. package/src/@core/theme/overrides/table.js +0 -81
  369. package/src/@core/theme/overrides/tabs.js +0 -30
  370. package/src/@core/theme/overrides/timeline.js +0 -80
  371. package/src/@core/theme/overrides/toggle-button.js +0 -33
  372. package/src/@core/theme/overrides/toggleButton.js +0 -16
  373. package/src/@core/theme/overrides/tooltip.js +0 -21
  374. package/src/@core/theme/overrides/typography.js +0 -13
  375. package/src/@core/theme/palette/index.js +0 -107
  376. package/src/@core/theme/shadows/index.js +0 -61
  377. package/src/@core/theme/shadows.js +0 -12
  378. package/src/@core/theme/spacing/index.js +0 -3
  379. package/src/@core/theme/spacing.js +0 -5
  380. package/src/@core/theme/typography/index.js +0 -65
  381. package/src/@core/theme/typography.js +0 -84
  382. package/src/@core/utils/create-emotion-cache.js +0 -5
  383. package/src/@core/utils/hex-to-rgba.js +0 -11
  384. package/src/@core/utils/serverHelpers.js +0 -45
  385. package/src/@menu/components/RouterLink.jsx +0 -18
  386. package/src/@menu/components/horizontal-menu/HorizontalNav.jsx +0 -88
  387. package/src/@menu/components/horizontal-menu/Menu.jsx +0 -83
  388. package/src/@menu/components/horizontal-menu/MenuButton.jsx +0 -100
  389. package/src/@menu/components/horizontal-menu/MenuItem.jsx +0 -183
  390. package/src/@menu/components/horizontal-menu/SubMenu.jsx +0 -418
  391. package/src/@menu/components/horizontal-menu/SubMenuContent.jsx +0 -41
  392. package/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.jsx +0 -20
  393. package/src/@menu/components/vertical-menu/Menu.jsx +0 -161
  394. package/src/@menu/components/vertical-menu/MenuButton.jsx +0 -95
  395. package/src/@menu/components/vertical-menu/MenuItem.jsx +0 -180
  396. package/src/@menu/components/vertical-menu/MenuSection.jsx +0 -124
  397. package/src/@menu/components/vertical-menu/NavCollapseIcons.jsx +0 -70
  398. package/src/@menu/components/vertical-menu/NavHeader.jsx +0 -39
  399. package/src/@menu/components/vertical-menu/SubMenu.jsx +0 -420
  400. package/src/@menu/components/vertical-menu/SubMenuContent.jsx +0 -101
  401. package/src/@menu/components/vertical-menu/VerticalNav.jsx +0 -216
  402. package/src/@menu/contexts/horizontalNavContext.jsx +0 -29
  403. package/src/@menu/contexts/verticalNavContext.jsx +0 -65
  404. package/src/@menu/defaultConfigs.js +0 -12
  405. package/src/@menu/hooks/useHorizontalMenu.jsx +0 -19
  406. package/src/@menu/hooks/useHorizontalNav.jsx +0 -19
  407. package/src/@menu/hooks/useMediaQuery.jsx +0 -29
  408. package/src/@menu/hooks/useVerticalMenu.jsx +0 -19
  409. package/src/@menu/hooks/useVerticalNav.jsx +0 -19
  410. package/src/@menu/horizontal-menu/index.jsx +0 -8
  411. package/src/@menu/styles/StyledBackdrop.jsx +0 -15
  412. package/src/@menu/styles/StyledMenuIcon.jsx +0 -12
  413. package/src/@menu/styles/StyledMenuLabel.jsx +0 -16
  414. package/src/@menu/styles/StyledMenuPrefix.jsx +0 -10
  415. package/src/@menu/styles/StyledMenuSectionLabel.jsx +0 -21
  416. package/src/@menu/styles/StyledMenuSuffix.jsx +0 -10
  417. package/src/@menu/styles/StyledSubMenuContent.jsx +0 -43
  418. package/src/@menu/styles/horizontal/StyledHorizontalMenu.jsx +0 -13
  419. package/src/@menu/styles/horizontal/StyledHorizontalMenuItem.jsx +0 -26
  420. package/src/@menu/styles/horizontal/StyledHorizontalNav.jsx +0 -11
  421. package/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.jsx +0 -33
  422. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.jsx +0 -18
  423. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.jsx +0 -10
  424. package/src/@menu/styles/horizontal/horizontalUl.module.css +0 -15
  425. package/src/@menu/styles/styles.module.css +0 -5
  426. package/src/@menu/styles/vertical/StyledVerticalMenu.jsx +0 -16
  427. package/src/@menu/styles/vertical/StyledVerticalMenuItem.jsx +0 -28
  428. package/src/@menu/styles/vertical/StyledVerticalMenuSection.jsx +0 -23
  429. package/src/@menu/styles/vertical/StyledVerticalNav.jsx +0 -67
  430. package/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.jsx +0 -15
  431. package/src/@menu/styles/vertical/StyledVerticalNavContainer.jsx +0 -23
  432. package/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.jsx +0 -25
  433. package/src/@menu/styles/vertical/verticalNavBgImage.module.css +0 -10
  434. package/src/@menu/svg/ChevronRight.jsx +0 -9
  435. package/src/@menu/svg/Close.jsx +0 -12
  436. package/src/@menu/svg/RadioCircle.jsx +0 -12
  437. package/src/@menu/svg/RadioCircleMarked.jsx +0 -13
  438. package/src/@menu/utils/menuClasses.js +0 -44
  439. package/src/@menu/utils/menuUtils.jsx +0 -145
  440. package/src/@menu/vertical-menu/index.jsx +0 -11
  441. package/src/configs/acl.js +0 -115
  442. package/src/configs/auth.js +0 -5
  443. package/src/configs/aws-exports.js +0 -30
  444. package/src/configs/firebase.js +0 -25
  445. package/src/configs/i18n.js +0 -34
  446. package/src/configs/primaryColorConfig.js +0 -35
  447. package/src/configs/themeConfig.js +0 -44
  448. package/src/layouts/UserLayout.js +0 -94
  449. package/src/layouts/UserThemeOptions.js +0 -191
  450. package/src/layouts/components/Direction.js +0 -30
  451. package/src/layouts/components/HtmlTooltip.js +0 -15
  452. package/src/layouts/components/Translations.js +0 -11
  453. package/src/layouts/components/UserDropdown.js +0 -217
  454. package/src/layouts/components/UserIcon.js +0 -40
  455. package/src/layouts/components/acl/Can.js +0 -6
  456. package/src/layouts/components/acl/CanViewNavGroup.js +0 -36
  457. package/src/layouts/components/acl/CanViewNavLink.js +0 -17
  458. package/src/layouts/components/acl/CanViewNavSectionTitle.js +0 -17
  459. package/src/layouts/components/horizontal/AppBarContent.js +0 -39
  460. package/src/layouts/components/horizontal/ServerSideNavItems.js +0 -44
  461. package/src/layouts/components/mui/StepperComps.js +0 -55
  462. package/src/layouts/components/vertical/AppBarContent.js +0 -35
  463. package/src/layouts/components/vertical/ServerSideNavItems.js +0 -44
  464. package/src/libs/ApexCharts.jsx +0 -5
  465. package/src/libs/ReactPlayer.jsx +0 -5
  466. package/src/libs/Recharts.jsx +0 -4
  467. package/src/libs/auth.js +0 -124
  468. package/src/libs/styles/AppFullCalendar.js +0 -505
  469. package/src/libs/styles/AppKeenSlider.js +0 -116
  470. package/src/libs/styles/AppReactApexCharts.jsx +0 -110
  471. package/src/libs/styles/AppReactDatepicker.jsx +0 -470
  472. package/src/libs/styles/AppReactDropzone.js +0 -76
  473. package/src/libs/styles/AppReactToastify.jsx +0 -108
  474. package/src/libs/styles/AppRecharts.js +0 -55
  475. package/src/libs/styles/inputOtp.module.css +0 -39
  476. package/src/libs/styles/tiptapEditor.css +0 -72
  477. package/src/navigation/horizontal/index.js +0 -246
  478. package/src/navigation/vertical/index.js +0 -253
  479. package/src/pages/401.js +0 -70
  480. package/src/pages/404.js +0 -67
  481. package/src/pages/500.js +0 -68
  482. package/src/pages/[slug].js +0 -115
  483. package/src/pages/_document.js +0 -72
  484. package/src/pages/api/navigation/regenerate-registry.js +0 -116
  485. package/src/pages/api/navigation/save.js +0 -218
  486. package/src/pages/authModule/acl/index.js +0 -48
  487. package/src/pages/authModule/forgot-password/index.js +0 -228
  488. package/src/pages/authModule/permissions/rolePermissions/[id]/rolePermissionsUser/index.js +0 -392
  489. package/src/pages/authModule/permissions/rolePermissions/index.js +0 -343
  490. package/src/pages/authModule/permissions/systemPermissions/index.js +0 -354
  491. package/src/pages/authModule/privacy/index.js +0 -721
  492. package/src/pages/authModule/users/index.js +0 -210
  493. package/src/pages/login/index.js +0 -328
  494. package/src/pages/mainHome/index.js +0 -181
  495. package/src/views/builder/inspector/definitions/cell/main.js +0 -4
  496. package/src/views/builder/inspector/definitions/column/main.js +0 -9
  497. package/src/views/builder/inspector/definitions/column-group/main.js +0 -18
  498. package/src/views/builder/inspector/definitions/header-cell/main.js +0 -5
  499. package/src/views/builder/inspector/definitions/table/main.js +0 -9
  500. package/src/views/builder/viewer/renderers/CellRenderer.jsx +0 -71
  501. package/src/views/builder/viewer/renderers/ColumnGroupRenderer.jsx +0 -96
  502. package/src/views/builder/viewer/renderers/ColumnRenderer.jsx +0 -71
  503. package/src/views/builder/viewer/renderers/HeaderCellRenderer.jsx +0 -78
  504. package/src/views/builder/viewer/renderers/TabRenderer.jsx +0 -82
  505. package/src/views/builder/viewer/renderers/TableRenderer.jsx +0 -92
  506. package/src/views/pages/auth/FooterIllustrationsV2.js +0 -40
  507. package/src/views/pages/misc/FooterIllustrations.js +0 -47
  508. package/src/views/pages/misc/muiTable/CustomPagination.js +0 -34
  509. package/src/views/pages/users/UserManageDialog.js +0 -283
  510. package/src/views/pages/users/UserViewPage.js +0 -199
  511. package/src/views/users/AddUserNameDialog.js +0 -162
  512. package/src/views/users/ContactManage.js +0 -449
  513. package/src/views/users/ResetPasswordDialog.js +0 -242
@@ -0,0 +1,639 @@
1
+ import { useState, useRef, useMemo, useEffect, useCallback } from 'react'
2
+ import {
3
+ Box, Button, Dialog, DialogTitle, DialogContent, DialogActions,
4
+ Typography, TextField, IconButton,
5
+ Table, TableHead, TableBody, TableRow, TableCell,
6
+ Alert, CircularProgress, Tooltip,
7
+ } from '@mui/material'
8
+ import { UploadFileOutlined, CheckCircleOutlined, EastOutlined, CloseOutlined, FileUploadOutlined } from '@mui/icons-material'
9
+ import ViewerComponentWrapper from '../ViewerComponentWrapper'
10
+ import { resolveProps } from 'services/builderHelper/resolveProps'
11
+ import { runFieldAction } from 'services/builderHelper/actionExecutor'
12
+
13
+ // ─────────────────────────────────────────────────────────────────────────────
14
+ // Edit-mode placeholder — mirrors the production shape per variant
15
+ // ─────────────────────────────────────────────────────────────────────────────
16
+
17
+ function EditPlaceholder({ storageKey, variant = 'dropzone', label = 'Upload Excel' }) {
18
+ // Icon variant — just a ghost icon button
19
+ if (variant === 'icon') {
20
+ return (
21
+ <Tooltip title={`Excel Upload${storageKey ? ` · ${storageKey}` : ''}`}>
22
+ <Box
23
+ sx={{
24
+ display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
25
+ width: 40, height: 40, borderRadius: '50%',
26
+ border: '1px dashed', borderColor: 'primary.light',
27
+ bgcolor: 'action.hover', color: 'text.disabled',
28
+ pointerEvents: 'none',
29
+ }}
30
+ >
31
+ <FileUploadOutlined sx={{ fontSize: 20 }} />
32
+ </Box>
33
+ </Tooltip>
34
+ )
35
+ }
36
+
37
+ // Button variant — ghost outlined button
38
+ if (variant === 'button') {
39
+ return (
40
+ <Box sx={{ display: 'inline-flex', alignItems: 'center', gap: 1, pointerEvents: 'none' }}>
41
+ <Box
42
+ sx={{
43
+ display: 'inline-flex', alignItems: 'center', gap: 0.75,
44
+ px: 2, py: 0.6,
45
+ border: '1px dashed', borderColor: 'primary.light', borderRadius: 1,
46
+ bgcolor: 'action.hover', color: 'text.secondary',
47
+ }}
48
+ >
49
+ <FileUploadOutlined sx={{ fontSize: 16, color: 'text.disabled' }} />
50
+ <Typography sx={{ fontSize: 13, color: 'text.secondary' }}>{label}</Typography>
51
+ </Box>
52
+ {storageKey && (
53
+ <Typography sx={{ fontSize: 10, color: 'text.disabled', textTransform: 'uppercase', letterSpacing: 0.5 }}>
54
+ · {storageKey}
55
+ </Typography>
56
+ )}
57
+ </Box>
58
+ )
59
+ }
60
+
61
+ // Default: dropzone variant
62
+ return (
63
+ <Box
64
+ sx={{
65
+ border: '2px dashed', borderColor: 'primary.light', borderRadius: 2,
66
+ p: 3, bgcolor: 'action.hover',
67
+ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 0.75,
68
+ pointerEvents: 'none',
69
+ }}
70
+ >
71
+ <UploadFileOutlined sx={{ fontSize: 32, color: 'text.disabled' }} />
72
+ <Typography sx={{ fontSize: 13, fontWeight: 500, color: 'text.secondary' }}>{label}</Typography>
73
+ <Typography sx={{ fontSize: 10, color: 'text.disabled', textTransform: 'uppercase', letterSpacing: 0.5 }}>
74
+ Excel Upload{storageKey ? ` · ${storageKey}` : ''}
75
+ </Typography>
76
+ </Box>
77
+ )
78
+ }
79
+
80
+ // ─────────────────────────────────────────────────────────────────────────────
81
+ // Mapping dialog — simple list: Excel column → field name
82
+ // ─────────────────────────────────────────────────────────────────────────────
83
+
84
+ function MappingDialog({ open, onClose, onConfirm, headers, rawRows, fileName, presetMapping = [] }) {
85
+ // mapping: { [colIndex]: fieldName } (empty string = skip this column)
86
+ const [mapping, setMapping] = useState({})
87
+
88
+ // Initialise: pre-fill from presetMapping where column names match, otherwise use header name
89
+ useEffect(() => {
90
+ if (!open) return
91
+ const presetByColumn = Object.fromEntries(presetMapping.map(({ column, field }) => [column, field]))
92
+ const init = {}
93
+ headers.forEach((h, i) => { init[i] = presetByColumn[h] ?? h })
94
+ setMapping(init)
95
+ }, [open, headers, presetMapping])
96
+
97
+ const setField = (colIdx, value) =>
98
+ setMapping(prev => ({ ...prev, [colIdx]: value }))
99
+
100
+ // Sample values for a column (first 2 non-empty cells)
101
+ const sample = (colIdx) =>
102
+ rawRows
103
+ .slice(0, 5)
104
+ .map(r => r[colIdx])
105
+ .filter(v => v != null && v !== '')
106
+ .slice(0, 2)
107
+ .join(' · ')
108
+
109
+ // validRows = [{ from: colIndex, to: fieldName }] for non-empty mappings
110
+ const validRows = headers
111
+ .map((_, i) => ({ from: i, to: (mapping[i] ?? '').trim() }))
112
+ .filter(r => r.to !== '')
113
+
114
+ return (
115
+ <Dialog open={open} onClose={onClose} maxWidth='sm' fullWidth scroll='paper'>
116
+ <DialogTitle sx={{ pb: 0.5 }}>
117
+ <Typography variant='h6'>Map Columns to Fields</Typography>
118
+ <Typography variant='caption' color='text.secondary'>
119
+ {fileName} · {headers.length} columns · {rawRows.length} rows
120
+ </Typography>
121
+ </DialogTitle>
122
+
123
+ <DialogContent dividers sx={{ p: 0 }}>
124
+ {/* Header row */}
125
+ <Box
126
+ sx={{
127
+ display: 'grid', gridTemplateColumns: '1fr 32px 1fr',
128
+ alignItems: 'center', gap: 1,
129
+ px: 2.5, py: 1,
130
+ bgcolor: 'action.hover',
131
+ borderBottom: '1px solid', borderColor: 'divider',
132
+ }}
133
+ >
134
+ <Typography variant='caption' fontWeight={600} color='text.secondary' sx={{ textTransform: 'uppercase', letterSpacing: 0.5 }}>
135
+ Excel Column
136
+ </Typography>
137
+ <span />
138
+ <Typography variant='caption' fontWeight={600} color='text.secondary' sx={{ textTransform: 'uppercase', letterSpacing: 0.5 }}>
139
+ Field Name
140
+ </Typography>
141
+ </Box>
142
+
143
+ {/* One row per column */}
144
+ {headers.map((header, colIdx) => {
145
+ const fieldVal = mapping[colIdx] ?? ''
146
+ const sampleText = sample(colIdx)
147
+ return (
148
+ <Box
149
+ key={colIdx}
150
+ sx={{
151
+ display: 'grid', gridTemplateColumns: '1fr 32px 1fr',
152
+ alignItems: 'center', gap: 1,
153
+ px: 2.5, py: 1.25,
154
+ borderBottom: '1px solid', borderColor: 'divider',
155
+ '&:last-child': { borderBottom: 'none' },
156
+ opacity: fieldVal.trim() === '' ? 0.45 : 1,
157
+ transition: 'opacity 0.15s',
158
+ }}
159
+ >
160
+ {/* Left: Excel column name + sample */}
161
+ <Box>
162
+ <Typography variant='body2' fontWeight={500}>{header}</Typography>
163
+ {sampleText && (
164
+ <Typography variant='caption' color='text.disabled' noWrap sx={{ display: 'block' }}>
165
+ e.g. {sampleText}
166
+ </Typography>
167
+ )}
168
+ </Box>
169
+
170
+ {/* Arrow */}
171
+ <EastOutlined sx={{ fontSize: 16, color: 'text.disabled', justifySelf: 'center' }} />
172
+
173
+ {/* Right: editable field name */}
174
+ <TextField
175
+ size='small'
176
+ fullWidth
177
+ placeholder='field name (leave blank to skip)'
178
+ value={fieldVal}
179
+ onChange={e => setField(colIdx, e.target.value)}
180
+ InputProps={{
181
+ endAdornment: fieldVal !== '' && (
182
+ <Tooltip title='Clear'>
183
+ <IconButton size='small' edge='end' onClick={() => setField(colIdx, '')} tabIndex={-1}>
184
+ <CloseOutlined sx={{ fontSize: 14 }} />
185
+ </IconButton>
186
+ </Tooltip>
187
+ ),
188
+ }}
189
+ />
190
+ </Box>
191
+ )
192
+ })}
193
+
194
+ {validRows.length === 0 && (
195
+ <Alert severity='warning' sx={{ m: 2 }}>
196
+ Fill in at least one field name to import.
197
+ </Alert>
198
+ )}
199
+ </DialogContent>
200
+
201
+ <DialogActions sx={{ justifyContent: 'space-between', px: 2.5 }}>
202
+ <Typography variant='caption' color='text.secondary'>
203
+ {validRows.length} of {headers.length} columns will be imported
204
+ </Typography>
205
+ <Box sx={{ display: 'flex', gap: 1 }}>
206
+ <Button onClick={onClose}>Cancel</Button>
207
+ <Button
208
+ variant='contained'
209
+ disabled={validRows.length === 0}
210
+ onClick={() => onConfirm(validRows)}
211
+ >
212
+ Import {rawRows.length} row{rawRows.length !== 1 ? 's' : ''}
213
+ </Button>
214
+ </Box>
215
+ </DialogActions>
216
+ </Dialog>
217
+ )
218
+ }
219
+
220
+ // ─────────────────────────────────────────────────────────────────────────────
221
+ // Main renderer
222
+ // ─────────────────────────────────────────────────────────────────────────────
223
+
224
+ export default function ExcelUploadRenderer({ node, viewerContext }) {
225
+ const { data, setData, reportRefs, isEditMode } = viewerContext
226
+ const main = resolveProps(node, 'main', viewerContext)
227
+ const styleProps = resolveProps(node, 'style', viewerContext)
228
+
229
+ const {
230
+ key: nodeKey,
231
+ dataKey,
232
+ defaultMapping,
233
+ variant = 'dropzone',
234
+ sheetIndex = 0,
235
+ label: uploadLabel = 'Upload Excel',
236
+ showPreview = true,
237
+ maxPreviewRows = 5,
238
+ } = main
239
+
240
+ const {
241
+ color: styleColor,
242
+ buttonVariant: styleButtonVariant,
243
+ size: styleSize,
244
+ borderRadius,
245
+ fontSize,
246
+ fontWeight,
247
+ width,
248
+ height,
249
+ margin,
250
+ padding,
251
+ } = styleProps ?? {}
252
+
253
+ // Normalise defaultMapping: [{ column, field }] → only valid pairs
254
+ const presetMapping = useMemo(() => {
255
+ const arr = Array.isArray(defaultMapping) ? defaultMapping : []
256
+ return arr.filter(r => r?.column?.trim() && r?.field?.trim())
257
+ }, [defaultMapping])
258
+
259
+ const nodeName = nodeKey || node.id
260
+ const storageKey = dataKey || `__eu_${node.id}`
261
+
262
+ // ── Stored rows ───────────────────────────────────────────────────────────
263
+ const storedRows = useMemo(() => {
264
+ const arr = data?.[storageKey]
265
+ return Array.isArray(arr) ? arr : []
266
+ }, [data, storageKey])
267
+
268
+ // ── Stable refs for reportRefs entry ─────────────────────────────────────
269
+ const setDataRef = useRef(setData)
270
+ const storageKeyRef = useRef(storageKey)
271
+ const storedRowsRef = useRef(storedRows)
272
+ setDataRef.current = setData
273
+ storageKeyRef.current = storageKey
274
+ storedRowsRef.current = storedRows
275
+
276
+ useEffect(() => {
277
+ if (!reportRefs?.current) return
278
+ reportRefs.current[nodeName] = {
279
+ get rows() { return storedRowsRef.current },
280
+ get storageKey() { return storageKeyRef.current },
281
+ setRows(arr) {
282
+ setDataRef.current(prev => ({ ...prev, [storageKeyRef.current]: Array.isArray(arr) ? arr : [] }))
283
+ },
284
+ clear() {
285
+ setDataRef.current(prev => ({ ...prev, [storageKeyRef.current]: [] }))
286
+ },
287
+ }
288
+ return () => { if (reportRefs?.current) delete reportRefs.current[nodeName] }
289
+ // eslint-disable-next-line react-hooks/exhaustive-deps
290
+ }, [nodeName, reportRefs])
291
+
292
+ // ── Local state ───────────────────────────────────────────────────────────
293
+ const [fileName, setFileName] = useState('')
294
+ const [headers, setHeaders] = useState([])
295
+ const [rawRows, setRawRows] = useState([])
296
+ const [mappingCols, setMappingCols] = useState([]) // [{from, to}] of last confirmed mapping
297
+ const [dialogOpen, setDialogOpen] = useState(false)
298
+ const [loading, setLoading] = useState(false)
299
+ const [error, setError] = useState(null)
300
+ const [isDragging, setIsDragging] = useState(false)
301
+ const fileInputRef = useRef(null)
302
+
303
+ // ── Apply mapping directly (preset or confirmed from dialog) ─────────────
304
+ const applyMapping = useCallback(async (validRows, rows) => {
305
+ const mappedRows = rows.map(row => {
306
+ const obj = {}
307
+ validRows.forEach(({ from, to }) => { obj[to.trim()] = row[from] ?? '' })
308
+ return obj
309
+ })
310
+ // Fire onMapped first — if the action returns an array, use that as the final data
311
+ const actionResult = await runFieldAction(node, viewerContext, 'onMapped', mappedRows)
312
+ const finalRows = Array.isArray(actionResult) ? actionResult : mappedRows
313
+ setData(prev => ({ ...prev, [storageKey]: finalRows }))
314
+ setMappingCols(validRows)
315
+ }, [storageKey, setData, node, viewerContext])
316
+
317
+ // ── Parse file ────────────────────────────────────────────────────────────
318
+ const parseFile = useCallback(async (file) => {
319
+ if (!file) return
320
+ setLoading(true)
321
+ setError(null)
322
+ try {
323
+ const xlsxMod = await import('xlsx')
324
+ const XLSX = xlsxMod.default ?? xlsxMod
325
+ const buffer = await file.arrayBuffer()
326
+ const workbook = XLSX.read(buffer, { type: 'array' })
327
+ const idx = sheetIndex ?? 0
328
+ const sheetName = workbook.SheetNames[idx]
329
+ if (!sheetName) throw new Error(`Sheet index ${idx} not found (file has ${workbook.SheetNames.length} sheet(s))`)
330
+ const sheet = workbook.Sheets[sheetName]
331
+ const jsonData = XLSX.utils.sheet_to_json(sheet, { header: 1, defval: '' })
332
+ if (!jsonData.length) throw new Error('Sheet is empty')
333
+ const hdrs = (jsonData[0] ?? []).map(String)
334
+ const rows = jsonData.slice(1).filter(row => row.some(cell => cell !== ''))
335
+ setFileName(file.name)
336
+ setHeaders(hdrs)
337
+ setRawRows(rows)
338
+ runFieldAction(node, viewerContext, 'onUpload', { fileName: file.name, headers: hdrs, rowCount: rows.length })
339
+
340
+ // Always open the dialog — preset mapping pre-fills the field names
341
+ setDialogOpen(true)
342
+ } catch (e) {
343
+ setError(e.message || 'Failed to parse file')
344
+ } finally {
345
+ setLoading(false)
346
+ }
347
+ }, [node, viewerContext, sheetIndex, presetMapping, applyMapping])
348
+
349
+ // ── Mapping confirmed from dialog ─────────────────────────────────────────
350
+ const handleMappingConfirm = useCallback((validRows) => {
351
+ applyMapping(validRows, rawRows)
352
+ setDialogOpen(false)
353
+ }, [rawRows, applyMapping])
354
+
355
+ // ── Clear ─────────────────────────────────────────────────────────────────
356
+ const handleClear = useCallback(() => {
357
+ setData(prev => ({ ...prev, [storageKey]: [] }))
358
+ setFileName('')
359
+ setHeaders([])
360
+ setRawRows([])
361
+ setMappingCols([])
362
+ runFieldAction(node, viewerContext, 'onClear', [])
363
+ }, [storageKey, setData, node, viewerContext])
364
+
365
+ // ── Drag & drop ───────────────────────────────────────────────────────────
366
+ const handleDrop = useCallback(e => {
367
+ e.preventDefault()
368
+ setIsDragging(false)
369
+ const file = e.dataTransfer.files?.[0]
370
+ if (file) parseFile(file)
371
+ }, [parseFile])
372
+
373
+ // ── Edit mode ─────────────────────────────────────────────────────────────
374
+ if (isEditMode) {
375
+ return (
376
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
377
+ <EditPlaceholder storageKey={storageKey} variant={variant} label={uploadLabel} />
378
+ </ViewerComponentWrapper>
379
+ )
380
+ }
381
+
382
+ // ── Shared derived values ─────────────────────────────────────────────────
383
+ const hasData = storedRows.length > 0
384
+ const previewRows = storedRows.slice(0, maxPreviewRows ?? 5)
385
+ const previewCols = mappingCols.length > 0
386
+ ? mappingCols.map(m => m.to.trim())
387
+ : Object.keys(storedRows[0] ?? {})
388
+
389
+ // ── Hidden file input (shared by all variants) ────────────────────────────
390
+ const fileInput = (
391
+ <input
392
+ ref={fileInputRef}
393
+ type='file'
394
+ accept='.xlsx,.xls,.csv'
395
+ style={{ display: 'none' }}
396
+ onChange={e => { const f = e.target.files?.[0]; if (f) parseFile(f); e.target.value = '' }}
397
+ />
398
+ )
399
+
400
+ // ── Preview table (shared) ────────────────────────────────────────────────
401
+ const previewTable = showPreview !== false && hasData && previewCols.length > 0 && (
402
+ <Box sx={{ mt: 2, overflowX: 'auto' }}>
403
+ <Typography variant='caption' color='text.secondary' sx={{ mb: 0.5, display: 'block' }}>
404
+ Preview — {previewRows.length} of {storedRows.length} row{storedRows.length !== 1 ? 's' : ''}
405
+ </Typography>
406
+ <Table size='small' sx={{ minWidth: 300 }}>
407
+ <TableHead>
408
+ <TableRow>
409
+ {previewCols.map(col => (
410
+ <TableCell key={col} sx={{ fontWeight: 600, fontSize: 11, whiteSpace: 'nowrap', fontFamily: 'monospace' }}>
411
+ {col}
412
+ </TableCell>
413
+ ))}
414
+ </TableRow>
415
+ </TableHead>
416
+ <TableBody>
417
+ {previewRows.map((row, i) => (
418
+ <TableRow key={i}>
419
+ {previewCols.map(col => (
420
+ <TableCell key={col} sx={{ fontSize: 12 }}>
421
+ {String(row[col] ?? '')}
422
+ </TableCell>
423
+ ))}
424
+ </TableRow>
425
+ ))}
426
+ </TableBody>
427
+ </Table>
428
+ {storedRows.length > (maxPreviewRows ?? 5) && (
429
+ <Typography variant='caption' color='text.secondary' sx={{ mt: 0.5, display: 'block' }}>
430
+ +{storedRows.length - (maxPreviewRows ?? 5)} more rows
431
+ </Typography>
432
+ )}
433
+ </Box>
434
+ )
435
+
436
+ // ─────────────────────────────────────────────────────────────────────────
437
+ // Icon button variant
438
+ // ─────────────────────────────────────────────────────────────────────────
439
+ if (variant === 'icon') {
440
+ const iconTooltip = loading
441
+ ? 'Reading file…'
442
+ : hasData
443
+ ? `${storedRows.length} row${storedRows.length !== 1 ? 's' : ''} imported · click to re-upload`
444
+ : uploadLabel
445
+
446
+ const iconSizePx = styleSize === 'small' ? 16 : styleSize === 'large' ? 24 : 20
447
+ const activeColor = styleColor && styleColor !== 'default' ? `${styleColor}.main` : (hasData ? 'success.main' : 'text.secondary')
448
+ const activeBorderColor = styleColor && styleColor !== 'default' ? `${styleColor}.light` : (hasData ? 'success.light' : 'divider')
449
+
450
+ return (
451
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
452
+ {fileInput}
453
+ <Box sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5, margin, width, height }}>
454
+ <Tooltip title={iconTooltip} arrow>
455
+ <span>
456
+ <IconButton
457
+ onClick={() => !loading && fileInputRef.current?.click()}
458
+ disabled={loading}
459
+ sx={{
460
+ color: activeColor,
461
+ border: '1px solid',
462
+ borderColor: activeBorderColor,
463
+ borderRadius: borderRadius ?? 1.5,
464
+ p: styleSize === 'small' ? 0.5 : styleSize === 'large' ? 1 : 0.75,
465
+ transition: 'all 0.2s',
466
+ '&:hover': { borderColor: 'primary.main', color: 'primary.main', bgcolor: 'action.hover' },
467
+ }}
468
+ >
469
+ {loading
470
+ ? <CircularProgress size={iconSizePx - 2} color='inherit' />
471
+ : hasData
472
+ ? <CheckCircleOutlined sx={{ fontSize: iconSizePx }} />
473
+ : <FileUploadOutlined sx={{ fontSize: iconSizePx }} />
474
+ }
475
+ </IconButton>
476
+ </span>
477
+ </Tooltip>
478
+ {hasData && (
479
+ <Tooltip title='Clear' arrow>
480
+ <IconButton size='small' onClick={handleClear} sx={{ color: 'text.disabled', '&:hover': { color: 'error.main' } }}>
481
+ <CloseOutlined sx={{ fontSize: 14 }} />
482
+ </IconButton>
483
+ </Tooltip>
484
+ )}
485
+ </Box>
486
+ {error && <Alert severity='error' sx={{ mt: 1 }} onClose={() => setError(null)}>{error}</Alert>}
487
+ {previewTable}
488
+ <MappingDialog open={dialogOpen} onClose={() => setDialogOpen(false)} onConfirm={handleMappingConfirm} headers={headers} rawRows={rawRows} fileName={fileName} presetMapping={presetMapping} />
489
+ </ViewerComponentWrapper>
490
+ )
491
+ }
492
+
493
+ // ─────────────────────────────────────────────────────────────────────────
494
+ // Button variant
495
+ // ─────────────────────────────────────────────────────────────────────────
496
+ if (variant === 'button') {
497
+ const btnVariant = styleButtonVariant ?? 'outlined'
498
+ const btnSize = styleSize ?? 'medium'
499
+ const btnColor = styleColor && styleColor !== 'default' ? styleColor : (hasData ? 'success' : undefined)
500
+ const isContained = btnVariant === 'contained'
501
+ const iconSizePx = btnSize === 'small' ? 15 : btnSize === 'large' ? 20 : 18
502
+
503
+ return (
504
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
505
+ {fileInput}
506
+ <Box sx={{ display: 'inline-flex', alignItems: 'center', gap: 1, margin, width, height }}>
507
+ <Button
508
+ variant={btnVariant}
509
+ size={btnSize}
510
+ color={btnColor}
511
+ startIcon={
512
+ loading
513
+ ? <CircularProgress size={iconSizePx - 3} color='inherit' />
514
+ : hasData
515
+ ? <CheckCircleOutlined sx={{ fontSize: iconSizePx }} />
516
+ : <FileUploadOutlined sx={{ fontSize: iconSizePx }} />
517
+ }
518
+ onClick={() => !loading && fileInputRef.current?.click()}
519
+ disabled={loading}
520
+ sx={{
521
+ borderStyle: !isContained && !hasData ? 'dashed' : 'solid',
522
+ textTransform: 'none',
523
+ fontWeight: fontWeight ?? (hasData ? 600 : 400),
524
+ fontSize,
525
+ borderRadius,
526
+ padding,
527
+ transition: 'all 0.2s',
528
+ ...(!btnColor && !hasData && {
529
+ color: 'text.secondary',
530
+ borderColor: 'divider',
531
+ '&:hover': { borderStyle: 'solid', borderColor: 'primary.main', color: 'primary.main', bgcolor: 'action.hover' },
532
+ }),
533
+ }}
534
+ >
535
+ {loading
536
+ ? 'Reading…'
537
+ : hasData
538
+ ? `${storedRows.length} row${storedRows.length !== 1 ? 's' : ''} imported`
539
+ : uploadLabel
540
+ }
541
+ </Button>
542
+ {hasData && (
543
+ <Tooltip title='Clear' arrow>
544
+ <IconButton size='small' onClick={handleClear} sx={{ color: 'text.disabled', '&:hover': { color: 'error.main' } }}>
545
+ <CloseOutlined sx={{ fontSize: 14 }} />
546
+ </IconButton>
547
+ </Tooltip>
548
+ )}
549
+ </Box>
550
+ {error && <Alert severity='error' sx={{ mt: 1 }} onClose={() => setError(null)}>{error}</Alert>}
551
+ {previewTable}
552
+ <MappingDialog open={dialogOpen} onClose={() => setDialogOpen(false)} onConfirm={handleMappingConfirm} headers={headers} rawRows={rawRows} fileName={fileName} presetMapping={presetMapping} />
553
+ </ViewerComponentWrapper>
554
+ )
555
+ }
556
+
557
+ // ─────────────────────────────────────────────────────────────────────────
558
+ // Default: drop zone variant
559
+ // ─────────────────────────────────────────────────────────────────────────
560
+ return (
561
+ <ViewerComponentWrapper node={node} viewerContext={viewerContext}>
562
+
563
+ {/* ── Upload zone ── */}
564
+ <Box
565
+ onDragOver={e => { e.preventDefault(); setIsDragging(true) }}
566
+ onDragLeave={() => setIsDragging(false)}
567
+ onDrop={handleDrop}
568
+ onClick={() => !loading && fileInputRef.current?.click()}
569
+ sx={{
570
+ border: '2px dashed',
571
+ borderColor: isDragging ? 'primary.main' : hasData ? 'success.light' : 'divider',
572
+ borderRadius: 2,
573
+ p: 3,
574
+ textAlign: 'center',
575
+ bgcolor: 'background.paper',
576
+ transition: 'border-color 0.2s, background-color 0.2s',
577
+ cursor: loading ? 'default' : 'pointer',
578
+ '&:hover': { borderColor: 'primary.main', bgcolor: 'action.hover' },
579
+ }}
580
+ >
581
+ {fileInput}
582
+
583
+ {loading ? (
584
+ <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 1 }}>
585
+ <CircularProgress size={28} />
586
+ <Typography variant='body2' color='text.secondary'>Reading file…</Typography>
587
+ </Box>
588
+
589
+ ) : hasData ? (
590
+ <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 0.5 }}>
591
+ <CheckCircleOutlined sx={{ fontSize: 32, color: 'success.main' }} />
592
+ <Typography variant='body2' fontWeight={600} color='success.main'>
593
+ {storedRows.length} row{storedRows.length !== 1 ? 's' : ''} imported
594
+ </Typography>
595
+ {fileName && (
596
+ <Typography variant='caption' color='text.secondary'>{fileName}</Typography>
597
+ )}
598
+ <Box sx={{ display: 'flex', gap: 1, mt: 1 }} onClick={e => e.stopPropagation()}>
599
+ <Button size='small' variant='outlined' onClick={() => fileInputRef.current?.click()}>
600
+ Re-upload
601
+ </Button>
602
+ <Button size='small' color='error' variant='outlined' onClick={handleClear}>
603
+ Clear
604
+ </Button>
605
+ </Box>
606
+ </Box>
607
+
608
+ ) : (
609
+ <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 1 }}>
610
+ <UploadFileOutlined sx={{ fontSize: 40, color: 'text.disabled' }} />
611
+ <Typography variant='body2' fontWeight={500}>{uploadLabel}</Typography>
612
+ <Typography variant='caption' color='text.secondary'>
613
+ Drag & drop or click · .xlsx · .xls · .csv
614
+ </Typography>
615
+ </Box>
616
+ )}
617
+ </Box>
618
+
619
+ {/* ── Error ── */}
620
+ {error && (
621
+ <Alert severity='error' sx={{ mt: 1 }} onClose={() => setError(null)}>
622
+ {error}
623
+ </Alert>
624
+ )}
625
+
626
+ {previewTable}
627
+
628
+ <MappingDialog
629
+ open={dialogOpen}
630
+ onClose={() => setDialogOpen(false)}
631
+ onConfirm={handleMappingConfirm}
632
+ headers={headers}
633
+ rawRows={rawRows}
634
+ fileName={fileName}
635
+ presetMapping={presetMapping}
636
+ />
637
+ </ViewerComponentWrapper>
638
+ )
639
+ }