robobyte-front-builder 1.0.19 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (520) hide show
  1. package/INTEGRATION.md +1586 -0
  2. package/README.md +928 -0
  3. package/RoboByteBuilder_User_Manual.docx +0 -0
  4. package/next.config.js +19 -48
  5. package/package.json +42 -86
  6. package/src/context/BuilderContext.jsx +191 -7
  7. package/src/context/SystemContext.js +2 -2
  8. package/src/hooks/useGlobalStore.js +36 -0
  9. package/src/hooks/useTimerEngine.js +54 -0
  10. package/src/lib/index.js +11 -3
  11. package/src/lib/layouts/BlankLayout.jsx +13 -0
  12. package/src/lib/providers/RoboByteFrontBuilderProvider.jsx +61 -7
  13. package/src/lib/themes/builderTheme.js +41 -0
  14. package/src/pages/_app.js +32 -134
  15. package/src/pages/api/ai.js +107 -0
  16. package/src/pages/builders/report/index.js +1 -0
  17. package/src/pages/builders/report/list/index.js +1 -0
  18. package/src/pages/builders/report/viewer/index.js +1 -0
  19. package/src/pages/index.js +88 -37
  20. package/src/pages/printBuilder/index.jsx +263 -0
  21. package/src/pages/printBuilder/layouts/index.jsx +298 -0
  22. package/src/pages/reportModule/reportBuilder/index.js +8 -6
  23. package/src/pages/reportModule/reportBuilder/reportViewer/index.js +92 -25
  24. package/src/pages/reportModule/reportBuilder/reports/index.js +3 -5
  25. package/src/pages/reportModule/reportBuilder/reportsPermissions/index.js +2 -3
  26. package/src/pages/viewBuilder/index.jsx +117 -32
  27. package/src/pages/viewBuilder/views/index.js +3 -3
  28. package/src/pages/viewer/[id]/index.js +2 -1
  29. package/src/services/DeleteService.js +31 -60
  30. package/src/services/Endpoints/PrintLayoutEndpoints.js +42 -0
  31. package/src/services/Endpoints/ReportBuilderEndpoints.js +7 -7
  32. package/src/services/Endpoints.js +2 -0
  33. package/src/services/GetService.js +33 -54
  34. package/src/services/PatchService.js +38 -65
  35. package/src/services/PostService.js +37 -63
  36. package/src/services/UpdateService.js +39 -65
  37. package/src/services/builderHelper/actionExecutor.js +141 -25
  38. package/src/services/builderHelper/builderHelper.js +92 -0
  39. package/src/services/builderHelper/colorSchema.js +95 -0
  40. package/src/services/builderHelper/iconResolver.js +50 -0
  41. package/src/services/builderHelper/jsExecutor.js +212 -46
  42. package/src/services/builderHelper/nodeFactory.js +32 -15
  43. package/src/services/builderHelper/numberFormat.js +123 -0
  44. package/src/services/builderHelper/resolveProps.js +73 -4
  45. package/src/services/builderHelper/thresholdEngine.js +77 -0
  46. package/src/services/builderHelper/tree.js +31 -0
  47. package/src/services/components/agGridAutoComplete.js +5 -9
  48. package/src/services/config.js +9 -1
  49. package/src/services/globalStore.js +80 -0
  50. package/src/services/helper/multiSelectEditor.js +5 -9
  51. package/src/services/helper/multiSelectEditorByBuilder.js +5 -9
  52. package/src/services/reportData/fetchReportData.js +69 -28
  53. package/src/services/routerRef.js +35 -0
  54. package/src/services/sessionLog.js +171 -0
  55. package/src/views/ConfirmDialog.js +2 -2
  56. package/src/views/builder/JSEditor.js +105 -107
  57. package/src/views/builder/SessionLogDialog.jsx +350 -0
  58. package/src/views/builder/UnsavedChangesGuard.jsx +103 -0
  59. package/src/views/builder/inspector/Inspector.jsx +6 -9
  60. package/src/views/builder/inspector/Tabs/ComponentActionsTab.jsx +7 -13
  61. package/src/views/builder/inspector/Tabs/MainTab.jsx +143 -25
  62. package/src/views/builder/inspector/Tabs/RulesTab.jsx +9 -24
  63. package/src/views/builder/inspector/Tabs/StyleTab.jsx +9 -24
  64. package/src/views/builder/inspector/definitions/autocomplete/main.js +4 -6
  65. package/src/views/builder/inspector/definitions/banner/actions.js +7 -0
  66. package/src/views/builder/inspector/definitions/banner/main.js +22 -0
  67. package/src/views/builder/inspector/definitions/banner/rules.js +1 -0
  68. package/src/views/builder/inspector/definitions/banner/style.js +1 -0
  69. package/src/views/builder/inspector/definitions/breadcrumb/main.js +43 -6
  70. package/src/views/builder/inspector/definitions/button/main.js +11 -12
  71. package/src/views/builder/inspector/definitions/button/style.js +18 -30
  72. package/src/views/builder/inspector/definitions/checkbox/actions.js +3 -1
  73. package/src/views/builder/inspector/definitions/checkbox/main.js +4 -6
  74. package/src/views/builder/inspector/definitions/common/main.js +13 -2
  75. package/src/views/builder/inspector/definitions/dataGrid/main.js +23 -0
  76. package/src/views/builder/inspector/definitions/dataTableViewer/main.js +46 -0
  77. package/src/views/builder/inspector/definitions/datepicker/actions.js +3 -1
  78. package/src/views/builder/inspector/definitions/datepicker/main.js +6 -14
  79. package/src/views/builder/inspector/definitions/dialog/main.js +36 -0
  80. package/src/views/builder/inspector/definitions/dropdown/main.js +5 -8
  81. package/src/views/builder/inspector/definitions/excelUpload/actions.js +23 -0
  82. package/src/views/builder/inspector/definitions/excelUpload/main.js +17 -0
  83. package/src/views/builder/inspector/definitions/excelUpload/rules.js +1 -0
  84. package/src/views/builder/inspector/definitions/excelUpload/style.js +45 -0
  85. package/src/views/builder/inspector/definitions/header/main.js +10 -1
  86. package/src/views/builder/inspector/definitions/index.js +106 -19
  87. package/src/views/builder/inspector/definitions/input/actions.js +4 -1
  88. package/src/views/builder/inspector/definitions/input/main.js +20 -11
  89. package/src/views/builder/inspector/definitions/kpi/avatarGroup.js +22 -0
  90. package/src/views/builder/inspector/definitions/kpi/badge.js +17 -0
  91. package/src/views/builder/inspector/definitions/kpi/bulletChart.js +47 -0
  92. package/src/views/builder/inspector/definitions/kpi/chart.js +55 -0
  93. package/src/views/builder/inspector/definitions/kpi/colorScale.js +60 -0
  94. package/src/views/builder/inspector/definitions/kpi/comparisonBars.js +41 -0
  95. package/src/views/builder/inspector/definitions/kpi/countdown.js +46 -0
  96. package/src/views/builder/inspector/definitions/kpi/donut.js +51 -0
  97. package/src/views/builder/inspector/definitions/kpi/funnel.js +25 -0
  98. package/src/views/builder/inspector/definitions/kpi/gauge.js +39 -0
  99. package/src/views/builder/inspector/definitions/kpi/heatmapGrid.js +96 -0
  100. package/src/views/builder/inspector/definitions/kpi/iconBox.js +20 -0
  101. package/src/views/builder/inspector/definitions/kpi/metric.js +45 -0
  102. package/src/views/builder/inspector/definitions/kpi/rating.js +27 -0
  103. package/src/views/builder/inspector/definitions/kpi/statusDot.js +18 -0
  104. package/src/views/builder/inspector/definitions/kpi/stepStage.js +65 -0
  105. package/src/views/builder/inspector/definitions/kpi/tagList.js +32 -0
  106. package/src/views/builder/inspector/definitions/kpi/timeline.js +80 -0
  107. package/src/views/builder/inspector/definitions/kpi/trend.js +20 -0
  108. package/src/views/builder/inspector/definitions/label/main.js +10 -1
  109. package/src/views/builder/inspector/definitions/layout/main.js +27 -3
  110. package/src/views/builder/inspector/definitions/number/main.js +6 -14
  111. package/src/views/builder/inspector/definitions/pageNumber/main.js +21 -0
  112. package/src/views/builder/inspector/definitions/popover/main.js +71 -0
  113. package/src/views/builder/inspector/definitions/radio/main.js +5 -8
  114. package/src/views/builder/inspector/definitions/repeater/main.js +31 -0
  115. package/src/views/builder/inspector/definitions/reportViewer/main.js +28 -1
  116. package/src/views/builder/inspector/definitions/richtext/main.js +5 -8
  117. package/src/views/builder/inspector/definitions/signature/main.js +4 -1
  118. package/src/views/builder/inspector/definitions/tag/main.js +5 -8
  119. package/src/views/builder/inspector/definitions/textarea/actions.js +4 -1
  120. package/src/views/builder/inspector/definitions/textarea/main.js +5 -7
  121. package/src/views/builder/inspector/definitions/time/main.js +5 -8
  122. package/src/views/builder/inspector/definitions/toggle/main.js +5 -19
  123. package/src/views/builder/inspector/definitions/treeView/main.js +61 -0
  124. package/src/views/builder/inspector/definitions/viewRenderer/main.js +53 -0
  125. package/src/views/builder/inspector/definitions/wizard/main.js +68 -0
  126. package/src/views/builder/inspector/definitions/wizard-step/main.js +25 -0
  127. package/src/views/builder/inspector/fields/ActionsConfigEditor.jsx +426 -0
  128. package/src/views/builder/inspector/fields/ColorSchemaField.jsx +140 -0
  129. package/src/views/builder/inspector/fields/ColumnFunctionEditor.jsx +238 -0
  130. package/src/views/builder/inspector/fields/ColumnMappingEditor.jsx +105 -0
  131. package/src/views/builder/inspector/fields/ColumnsConfigEditor.jsx +506 -0
  132. package/src/views/builder/inspector/fields/DonutRingsEditorField.jsx +337 -0
  133. package/src/views/builder/inspector/fields/ExtraColsEditor.jsx +618 -0
  134. package/src/views/builder/inspector/fields/FunctionHelpPopover.jsx +295 -0
  135. package/src/views/builder/inspector/fields/IconEditor.jsx +64 -0
  136. package/src/views/builder/inspector/fields/KpiActionField.jsx +223 -0
  137. package/src/views/builder/inspector/fields/MarkersEditorField.jsx +173 -0
  138. package/src/views/builder/inspector/fields/SelectEditor.jsx +9 -5
  139. package/src/views/builder/inspector/fields/SeriesEditorField.jsx +363 -0
  140. package/src/views/builder/inspector/fields/TableColumnsEditor.jsx +104 -0
  141. package/src/views/builder/inspector/fields/ThresholdsEditor.jsx +247 -0
  142. package/src/views/builder/inspector/fields/ValueFunctionsRefPanel.jsx +217 -0
  143. package/src/views/builder/inspector/fields/columnEditorShared.jsx +217 -0
  144. package/src/views/builder/sidebar/Sidebar.jsx +4 -2
  145. package/src/views/builder/sidebar/SidebarTabs.jsx +28 -17
  146. package/src/views/builder/sidebar/tabs/ActionsTab.jsx +7 -3
  147. package/src/views/builder/sidebar/tabs/AiTab/AiPreviewDialog.jsx +193 -0
  148. package/src/views/builder/sidebar/tabs/AiTab/aiProvider.js +53 -0
  149. package/src/views/builder/sidebar/tabs/AiTab/index.jsx +409 -0
  150. package/src/views/builder/sidebar/tabs/AiTab/schemaTransformer.js +167 -0
  151. package/src/views/builder/sidebar/tabs/AiTab/schemaValidator.js +64 -0
  152. package/src/views/builder/sidebar/tabs/AiTab/systemPrompt.js +1151 -0
  153. package/src/views/builder/sidebar/tabs/AiTab/trainingExport.js +131 -0
  154. package/src/views/builder/sidebar/tabs/Components/ComponentsTab.jsx +31 -31
  155. package/src/views/builder/sidebar/tabs/Components/componentCatalog.js +43 -21
  156. package/src/views/builder/sidebar/tabs/Components/printComponentCatalog.js +81 -0
  157. package/src/views/builder/sidebar/tabs/TimersTab.jsx +338 -0
  158. package/src/views/builder/sidebar/tabs/TreeTab.jsx +13 -4
  159. package/src/views/builder/sidebar/tabs/ViewTab.jsx +173 -13
  160. package/src/views/builder/viewer/AdornedLabel.jsx +82 -0
  161. package/src/views/builder/viewer/ComponentRenderer.jsx +98 -24
  162. package/src/views/builder/viewer/DialogsZone.jsx +259 -0
  163. package/src/views/builder/viewer/FieldLabel.jsx +106 -0
  164. package/src/views/builder/viewer/PrintDialog.jsx +481 -0
  165. package/src/views/builder/viewer/ProductionViewer.jsx +80 -5
  166. package/src/views/builder/viewer/Viewer.jsx +106 -8
  167. package/src/views/builder/viewer/ViewerComponentWrapper.jsx +70 -9
  168. package/src/views/builder/viewer/ViewerToolbar.jsx +285 -56
  169. package/src/views/builder/viewer/renderers/AutoCompleteRenderer.jsx +26 -22
  170. package/src/views/builder/viewer/renderers/AvatarGroupRenderer.jsx +112 -0
  171. package/src/views/builder/viewer/renderers/BadgeRenderer.jsx +79 -0
  172. package/src/views/builder/viewer/renderers/BannerRenderer.jsx +62 -0
  173. package/src/views/builder/viewer/renderers/BreadcrumbRenderer.jsx +203 -15
  174. package/src/views/builder/viewer/renderers/BulletChartRenderer.jsx +147 -0
  175. package/src/views/builder/viewer/renderers/ButtonRenderer.jsx +98 -39
  176. package/src/views/builder/viewer/renderers/CardRenderer.jsx +1 -1
  177. package/src/views/builder/viewer/renderers/ChartRenderer.jsx +388 -0
  178. package/src/views/builder/viewer/renderers/CheckboxRenderer.jsx +17 -9
  179. package/src/views/builder/viewer/renderers/ColorScaleRenderer.jsx +300 -0
  180. package/src/views/builder/viewer/renderers/ComparisonBarsRenderer.jsx +133 -0
  181. package/src/views/builder/viewer/renderers/ContainerRenderer.jsx +3 -1
  182. package/src/views/builder/viewer/renderers/CountdownRenderer.jsx +249 -0
  183. package/src/views/builder/viewer/renderers/DataGridRenderer.jsx +380 -0
  184. package/src/views/builder/viewer/renderers/DataTableViewerRenderer.jsx +240 -0
  185. package/src/views/builder/viewer/renderers/DatePickerRenderer.jsx +25 -24
  186. package/src/views/builder/viewer/renderers/DialogRenderer.jsx +327 -0
  187. package/src/views/builder/viewer/renderers/DividerRenderer.jsx +1 -1
  188. package/src/views/builder/viewer/renderers/DonutRenderer.jsx +294 -0
  189. package/src/views/builder/viewer/renderers/DropdownRenderer.jsx +36 -44
  190. package/src/views/builder/viewer/renderers/ExcelUploadRenderer.jsx +639 -0
  191. package/src/views/builder/viewer/renderers/FunnelRenderer.jsx +93 -0
  192. package/src/views/builder/viewer/renderers/GaugeRenderer.jsx +159 -0
  193. package/src/views/builder/viewer/renderers/HeaderRenderer.jsx +31 -9
  194. package/src/views/builder/viewer/renderers/HeatmapGridRenderer.jsx +432 -0
  195. package/src/views/builder/viewer/renderers/IconBoxRenderer.jsx +59 -0
  196. package/src/views/builder/viewer/renderers/ImageRenderer.jsx +1 -1
  197. package/src/views/builder/viewer/renderers/InputRenderer.jsx +75 -18
  198. package/src/views/builder/viewer/renderers/LabelRenderer.jsx +35 -9
  199. package/src/views/builder/viewer/renderers/LayoutCellRenderer.jsx +102 -40
  200. package/src/views/builder/viewer/renderers/LayoutContextMenu.jsx +8 -8
  201. package/src/views/builder/viewer/renderers/LayoutRenderer.jsx +48 -6
  202. package/src/views/builder/viewer/renderers/LinkRenderer.jsx +1 -1
  203. package/src/views/builder/viewer/renderers/MenuRenderer.jsx +2 -2
  204. package/src/views/builder/viewer/renderers/MetricRenderer.jsx +80 -0
  205. package/src/views/builder/viewer/renderers/NumberFormatRenderer.jsx +21 -30
  206. package/src/views/builder/viewer/renderers/PageNumberRenderer.jsx +76 -0
  207. package/src/views/builder/viewer/renderers/PopoverRenderer.jsx +350 -0
  208. package/src/views/builder/viewer/renderers/ProgressCircleRenderer.jsx +1 -1
  209. package/src/views/builder/viewer/renderers/ProgressLineRenderer.jsx +1 -1
  210. package/src/views/builder/viewer/renderers/RadioGroupRenderer.jsx +28 -39
  211. package/src/views/builder/viewer/renderers/RatingRenderer.jsx +80 -0
  212. package/src/views/builder/viewer/renderers/RepeaterRenderer.jsx +297 -38
  213. package/src/views/builder/viewer/renderers/ReportViewerRenderer.jsx +263 -5
  214. package/src/views/builder/viewer/renderers/RichTextRenderer.jsx +60 -66
  215. package/src/views/builder/viewer/renderers/RowActionsCell.jsx +308 -0
  216. package/src/views/builder/viewer/renderers/SignatureRenderer.jsx +33 -62
  217. package/src/views/builder/viewer/renderers/StatusDotRenderer.jsx +75 -0
  218. package/src/views/builder/viewer/renderers/StepStageRenderer.jsx +348 -0
  219. package/src/views/builder/viewer/renderers/TagListRenderer.jsx +115 -0
  220. package/src/views/builder/viewer/renderers/TagPickerRenderer.jsx +31 -45
  221. package/src/views/builder/viewer/renderers/TextAreaRenderer.jsx +25 -18
  222. package/src/views/builder/viewer/renderers/TextRenderer.jsx +7 -1
  223. package/src/views/builder/viewer/renderers/TimePickerRenderer.jsx +25 -24
  224. package/src/views/builder/viewer/renderers/TimelineRenderer.jsx +525 -0
  225. package/src/views/builder/viewer/renderers/ToggleRenderer.jsx +21 -27
  226. package/src/views/builder/viewer/renderers/TreeViewRenderer.jsx +832 -0
  227. package/src/views/builder/viewer/renderers/TrendRenderer.jsx +66 -0
  228. package/src/views/builder/viewer/renderers/ViewRendererRenderer.jsx +315 -0
  229. package/src/views/builder/viewer/renderers/WizardRenderer.jsx +380 -64
  230. package/src/views/builder/viewer/renderers/WizardStepRenderer.jsx +21 -12
  231. package/src/views/builder/viewer/renderers/dataGridComponents.jsx +824 -0
  232. package/src/views/customFilter/CustomFilterDialog.js +1023 -660
  233. package/src/views/customFilter/FixedFilterDialog.js +649 -0
  234. package/src/views/customFilter/SearchFilterDialog.js +248 -0
  235. package/src/views/genericTable/BuilderExpressionParams.js +3 -3
  236. package/src/views/genericTable/ColumnConfiguratorDialog.js +33 -24
  237. package/src/views/genericTable/FixedFilterDialog.js +3 -2
  238. package/src/views/genericTable/FormattingSettingsDialog.js +8 -3
  239. package/src/views/genericTable/SGrid.js +821 -448
  240. package/src/views/genericTable/SearchFilterDialog.js +3 -2
  241. package/src/views/genericTable/cellEditors/autocompleteEditor.js +5 -9
  242. package/src/views/genericTable/convertStringFunctions.js +274 -138
  243. package/src/views/genericTable/statusBar/rowCountStatusBar.js +3 -1
  244. package/src/views/genericTable/updateRefHelpers.js +9 -6
  245. package/src/views/printBuilder/PrintBuilderViewer.jsx +627 -0
  246. package/src/views/printBuilder/PrintPreviewCanvas.jsx +157 -0
  247. package/src/views/rolePermissions/UpdateReportPermissionDialog.js +3 -2
  248. package/src/@core/components/auth/AclGuard.js +0 -55
  249. package/src/@core/components/auth/AuthGuard.js +0 -40
  250. package/src/@core/components/auth/GuestGuard.js +0 -30
  251. package/src/@core/components/custom-inputs/Horizontal.jsx +0 -143
  252. package/src/@core/components/custom-inputs/Image.jsx +0 -78
  253. package/src/@core/components/custom-inputs/Vertical.jsx +0 -113
  254. package/src/@core/components/customizer/index.jsx +0 -470
  255. package/src/@core/components/customizer/styles.module.css +0 -169
  256. package/src/@core/components/mui/Avatar.jsx +0 -41
  257. package/src/@core/components/mui/Badge.jsx +0 -20
  258. package/src/@core/components/mui/IconButton.jsx +0 -74
  259. package/src/@core/components/mui/TabList.jsx +0 -60
  260. package/src/@core/components/option-menu/index.jsx +0 -137
  261. package/src/@core/components/scroll-to-top/index.jsx +0 -43
  262. package/src/@core/components/spinner/index.js +0 -26
  263. package/src/@core/components/window-wrapper/index.js +0 -27
  264. package/src/@core/contexts/settingsContext.jsx +0 -98
  265. package/src/@core/hooks/useBgColor.js +0 -63
  266. package/src/@core/hooks/useImageVariant.js +0 -27
  267. package/src/@core/hooks/useLayoutInit.js +0 -37
  268. package/src/@core/hooks/useObjectCookie.js +0 -18
  269. package/src/@core/hooks/useSettings.jsx +0 -15
  270. package/src/@core/layouts/BlankLayout.js +0 -37
  271. package/src/@core/layouts/BlankLayoutWithAppBar.js +0 -51
  272. package/src/@core/layouts/HorizontalLayout.jsx +0 -151
  273. package/src/@core/layouts/Layout.js +0 -39
  274. package/src/@core/layouts/VerticalLayout.jsx +0 -124
  275. package/src/@core/layouts/components/blank-layout-with-appBar/index.js +0 -115
  276. package/src/@core/layouts/components/horizontal/app-bar-content/index.js +0 -67
  277. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavGroup.js +0 -352
  278. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavItems.js +0 -21
  279. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavLink.js +0 -195
  280. package/src/@core/layouts/components/horizontal/navigation/index.js +0 -31
  281. package/src/@core/layouts/components/shared-components/LanguageDropdown.js +0 -96
  282. package/src/@core/layouts/components/shared-components/ModeToggler.js +0 -32
  283. package/src/@core/layouts/components/shared-components/NotificationDropdown.js +0 -226
  284. package/src/@core/layouts/components/shared-components/UserDropdown.js +0 -177
  285. package/src/@core/layouts/components/shared-components/footer/FooterContent.js +0 -46
  286. package/src/@core/layouts/components/shared-components/footer/index.js +0 -61
  287. package/src/@core/layouts/components/vertical/appBar/index.js +0 -74
  288. package/src/@core/layouts/components/vertical/navigation/Drawer.js +0 -122
  289. package/src/@core/layouts/components/vertical/navigation/VerticalNavGroup.js +0 -435
  290. package/src/@core/layouts/components/vertical/navigation/VerticalNavHeader.js +0 -180
  291. package/src/@core/layouts/components/vertical/navigation/VerticalNavItems.js +0 -26
  292. package/src/@core/layouts/components/vertical/navigation/VerticalNavLink.js +0 -258
  293. package/src/@core/layouts/components/vertical/navigation/VerticalNavSectionTitle.js +0 -102
  294. package/src/@core/layouts/components/vertical/navigation/index.js +0 -169
  295. package/src/@core/layouts/utils.js +0 -69
  296. package/src/@core/styles/Table.module.css +0 -93
  297. package/src/@core/styles/horizontal/menuItemStyles.js +0 -100
  298. package/src/@core/styles/horizontal/menuRootStyles.js +0 -19
  299. package/src/@core/styles/libs/fullcalendar/index.js +0 -461
  300. package/src/@core/styles/libs/keen-slider/index.js +0 -111
  301. package/src/@core/styles/libs/react-apexcharts/index.js +0 -107
  302. package/src/@core/styles/libs/react-cleave/index.js +0 -33
  303. package/src/@core/styles/libs/react-credit-cards/index.js +0 -11
  304. package/src/@core/styles/libs/react-datepicker/index.js +0 -388
  305. package/src/@core/styles/libs/react-draft-wysiwyg/index.js +0 -144
  306. package/src/@core/styles/libs/react-dropzone/index.js +0 -76
  307. package/src/@core/styles/libs/react-hot-toast/index.js +0 -37
  308. package/src/@core/styles/libs/recharts/index.js +0 -47
  309. package/src/@core/styles/stepper.js +0 -103
  310. package/src/@core/styles/vertical/menuItemStyles.js +0 -138
  311. package/src/@core/styles/vertical/menuSectionStyles.js +0 -54
  312. package/src/@core/styles/vertical/navigationCustomStyles.js +0 -62
  313. package/src/@core/svg/ContentCompact.jsx +0 -17
  314. package/src/@core/svg/ContentWide.jsx +0 -17
  315. package/src/@core/svg/DirectionLtr.jsx +0 -93
  316. package/src/@core/svg/DirectionRtl.jsx +0 -93
  317. package/src/@core/svg/LayoutCollapsed.jsx +0 -59
  318. package/src/@core/svg/LayoutHorizontal.jsx +0 -42
  319. package/src/@core/svg/LayoutVertical.jsx +0 -59
  320. package/src/@core/svg/Logo.jsx +0 -76
  321. package/src/@core/svg/SkinBordered.jsx +0 -54
  322. package/src/@core/svg/SkinDefault.jsx +0 -59
  323. package/src/@core/tailwind/plugin.js +0 -78
  324. package/src/@core/theme/ThemeComponent.js +0 -63
  325. package/src/@core/theme/ThemeOptions.js +0 -71
  326. package/src/@core/theme/breakpoints/index.js +0 -11
  327. package/src/@core/theme/colorSchemes.js +0 -326
  328. package/src/@core/theme/customShadows.js +0 -11
  329. package/src/@core/theme/globalStyles.js +0 -81
  330. package/src/@core/theme/index.js +0 -42
  331. package/src/@core/theme/overrides/accordion.js +0 -51
  332. package/src/@core/theme/overrides/accordion.jsx +0 -85
  333. package/src/@core/theme/overrides/alerts.js +0 -110
  334. package/src/@core/theme/overrides/alerts.jsx +0 -180
  335. package/src/@core/theme/overrides/autocomplete.js +0 -14
  336. package/src/@core/theme/overrides/autocomplete.jsx +0 -68
  337. package/src/@core/theme/overrides/avatar.js +0 -38
  338. package/src/@core/theme/overrides/avatars.js +0 -27
  339. package/src/@core/theme/overrides/backdrop.js +0 -22
  340. package/src/@core/theme/overrides/badges.js +0 -16
  341. package/src/@core/theme/overrides/breadcrumbs.js +0 -11
  342. package/src/@core/theme/overrides/button-group.js +0 -84
  343. package/src/@core/theme/overrides/button.js +0 -93
  344. package/src/@core/theme/overrides/buttonGroup.js +0 -9
  345. package/src/@core/theme/overrides/card.js +0 -83
  346. package/src/@core/theme/overrides/checkbox.jsx +0 -95
  347. package/src/@core/theme/overrides/chip.js +0 -72
  348. package/src/@core/theme/overrides/dataGrid.js +0 -114
  349. package/src/@core/theme/overrides/dateTimePicker.js +0 -65
  350. package/src/@core/theme/overrides/dialog.js +0 -120
  351. package/src/@core/theme/overrides/divider.js +0 -13
  352. package/src/@core/theme/overrides/drawer.js +0 -20
  353. package/src/@core/theme/overrides/fab.js +0 -13
  354. package/src/@core/theme/overrides/form-control-label.js +0 -19
  355. package/src/@core/theme/overrides/icon-button.js +0 -145
  356. package/src/@core/theme/overrides/index.js +0 -103
  357. package/src/@core/theme/overrides/input.js +0 -72
  358. package/src/@core/theme/overrides/link.js +0 -9
  359. package/src/@core/theme/overrides/list.js +0 -44
  360. package/src/@core/theme/overrides/menu.js +0 -25
  361. package/src/@core/theme/overrides/pagination.js +0 -41
  362. package/src/@core/theme/overrides/paper.js +0 -9
  363. package/src/@core/theme/overrides/popover.js +0 -16
  364. package/src/@core/theme/overrides/progress.js +0 -38
  365. package/src/@core/theme/overrides/radio.jsx +0 -80
  366. package/src/@core/theme/overrides/rating.js +0 -16
  367. package/src/@core/theme/overrides/rating.jsx +0 -32
  368. package/src/@core/theme/overrides/select.js +0 -19
  369. package/src/@core/theme/overrides/select.jsx +0 -52
  370. package/src/@core/theme/overrides/slider.js +0 -97
  371. package/src/@core/theme/overrides/snackbar.js +0 -19
  372. package/src/@core/theme/overrides/switch.js +0 -73
  373. package/src/@core/theme/overrides/switches.js +0 -25
  374. package/src/@core/theme/overrides/table-pagination.js +0 -39
  375. package/src/@core/theme/overrides/table.js +0 -81
  376. package/src/@core/theme/overrides/tabs.js +0 -30
  377. package/src/@core/theme/overrides/timeline.js +0 -80
  378. package/src/@core/theme/overrides/toggle-button.js +0 -33
  379. package/src/@core/theme/overrides/toggleButton.js +0 -16
  380. package/src/@core/theme/overrides/tooltip.js +0 -21
  381. package/src/@core/theme/overrides/typography.js +0 -13
  382. package/src/@core/theme/palette/index.js +0 -107
  383. package/src/@core/theme/shadows/index.js +0 -61
  384. package/src/@core/theme/shadows.js +0 -12
  385. package/src/@core/theme/spacing/index.js +0 -3
  386. package/src/@core/theme/spacing.js +0 -5
  387. package/src/@core/theme/typography/index.js +0 -65
  388. package/src/@core/theme/typography.js +0 -84
  389. package/src/@core/utils/create-emotion-cache.js +0 -5
  390. package/src/@core/utils/hex-to-rgba.js +0 -11
  391. package/src/@core/utils/serverHelpers.js +0 -45
  392. package/src/@menu/components/RouterLink.jsx +0 -18
  393. package/src/@menu/components/horizontal-menu/HorizontalNav.jsx +0 -88
  394. package/src/@menu/components/horizontal-menu/Menu.jsx +0 -83
  395. package/src/@menu/components/horizontal-menu/MenuButton.jsx +0 -100
  396. package/src/@menu/components/horizontal-menu/MenuItem.jsx +0 -183
  397. package/src/@menu/components/horizontal-menu/SubMenu.jsx +0 -418
  398. package/src/@menu/components/horizontal-menu/SubMenuContent.jsx +0 -41
  399. package/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.jsx +0 -20
  400. package/src/@menu/components/vertical-menu/Menu.jsx +0 -161
  401. package/src/@menu/components/vertical-menu/MenuButton.jsx +0 -95
  402. package/src/@menu/components/vertical-menu/MenuItem.jsx +0 -180
  403. package/src/@menu/components/vertical-menu/MenuSection.jsx +0 -124
  404. package/src/@menu/components/vertical-menu/NavCollapseIcons.jsx +0 -70
  405. package/src/@menu/components/vertical-menu/NavHeader.jsx +0 -39
  406. package/src/@menu/components/vertical-menu/SubMenu.jsx +0 -420
  407. package/src/@menu/components/vertical-menu/SubMenuContent.jsx +0 -101
  408. package/src/@menu/components/vertical-menu/VerticalNav.jsx +0 -216
  409. package/src/@menu/contexts/horizontalNavContext.jsx +0 -29
  410. package/src/@menu/contexts/verticalNavContext.jsx +0 -65
  411. package/src/@menu/defaultConfigs.js +0 -12
  412. package/src/@menu/hooks/useHorizontalMenu.jsx +0 -19
  413. package/src/@menu/hooks/useHorizontalNav.jsx +0 -19
  414. package/src/@menu/hooks/useMediaQuery.jsx +0 -29
  415. package/src/@menu/hooks/useVerticalMenu.jsx +0 -19
  416. package/src/@menu/hooks/useVerticalNav.jsx +0 -19
  417. package/src/@menu/horizontal-menu/index.jsx +0 -8
  418. package/src/@menu/styles/StyledBackdrop.jsx +0 -15
  419. package/src/@menu/styles/StyledMenuIcon.jsx +0 -12
  420. package/src/@menu/styles/StyledMenuLabel.jsx +0 -16
  421. package/src/@menu/styles/StyledMenuPrefix.jsx +0 -10
  422. package/src/@menu/styles/StyledMenuSectionLabel.jsx +0 -21
  423. package/src/@menu/styles/StyledMenuSuffix.jsx +0 -10
  424. package/src/@menu/styles/StyledSubMenuContent.jsx +0 -43
  425. package/src/@menu/styles/horizontal/StyledHorizontalMenu.jsx +0 -13
  426. package/src/@menu/styles/horizontal/StyledHorizontalMenuItem.jsx +0 -26
  427. package/src/@menu/styles/horizontal/StyledHorizontalNav.jsx +0 -11
  428. package/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.jsx +0 -33
  429. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.jsx +0 -18
  430. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.jsx +0 -10
  431. package/src/@menu/styles/horizontal/horizontalUl.module.css +0 -15
  432. package/src/@menu/styles/styles.module.css +0 -5
  433. package/src/@menu/styles/vertical/StyledVerticalMenu.jsx +0 -16
  434. package/src/@menu/styles/vertical/StyledVerticalMenuItem.jsx +0 -28
  435. package/src/@menu/styles/vertical/StyledVerticalMenuSection.jsx +0 -23
  436. package/src/@menu/styles/vertical/StyledVerticalNav.jsx +0 -67
  437. package/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.jsx +0 -15
  438. package/src/@menu/styles/vertical/StyledVerticalNavContainer.jsx +0 -23
  439. package/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.jsx +0 -25
  440. package/src/@menu/styles/vertical/verticalNavBgImage.module.css +0 -10
  441. package/src/@menu/svg/ChevronRight.jsx +0 -9
  442. package/src/@menu/svg/Close.jsx +0 -12
  443. package/src/@menu/svg/RadioCircle.jsx +0 -12
  444. package/src/@menu/svg/RadioCircleMarked.jsx +0 -13
  445. package/src/@menu/utils/menuClasses.js +0 -44
  446. package/src/@menu/utils/menuUtils.jsx +0 -145
  447. package/src/@menu/vertical-menu/index.jsx +0 -11
  448. package/src/configs/acl.js +0 -115
  449. package/src/configs/auth.js +0 -5
  450. package/src/configs/aws-exports.js +0 -30
  451. package/src/configs/firebase.js +0 -25
  452. package/src/configs/i18n.js +0 -34
  453. package/src/configs/primaryColorConfig.js +0 -35
  454. package/src/configs/themeConfig.js +0 -44
  455. package/src/layouts/UserLayout.js +0 -94
  456. package/src/layouts/UserThemeOptions.js +0 -191
  457. package/src/layouts/components/Direction.js +0 -30
  458. package/src/layouts/components/HtmlTooltip.js +0 -15
  459. package/src/layouts/components/Translations.js +0 -11
  460. package/src/layouts/components/UserDropdown.js +0 -217
  461. package/src/layouts/components/UserIcon.js +0 -40
  462. package/src/layouts/components/acl/Can.js +0 -6
  463. package/src/layouts/components/acl/CanViewNavGroup.js +0 -36
  464. package/src/layouts/components/acl/CanViewNavLink.js +0 -17
  465. package/src/layouts/components/acl/CanViewNavSectionTitle.js +0 -17
  466. package/src/layouts/components/horizontal/AppBarContent.js +0 -39
  467. package/src/layouts/components/horizontal/ServerSideNavItems.js +0 -44
  468. package/src/layouts/components/mui/StepperComps.js +0 -55
  469. package/src/layouts/components/vertical/AppBarContent.js +0 -35
  470. package/src/layouts/components/vertical/ServerSideNavItems.js +0 -44
  471. package/src/libs/ApexCharts.jsx +0 -5
  472. package/src/libs/ReactPlayer.jsx +0 -5
  473. package/src/libs/Recharts.jsx +0 -4
  474. package/src/libs/auth.js +0 -124
  475. package/src/libs/styles/AppFullCalendar.js +0 -505
  476. package/src/libs/styles/AppKeenSlider.js +0 -116
  477. package/src/libs/styles/AppReactApexCharts.jsx +0 -110
  478. package/src/libs/styles/AppReactDatepicker.jsx +0 -470
  479. package/src/libs/styles/AppReactDropzone.js +0 -76
  480. package/src/libs/styles/AppReactToastify.jsx +0 -108
  481. package/src/libs/styles/AppRecharts.js +0 -55
  482. package/src/libs/styles/inputOtp.module.css +0 -39
  483. package/src/libs/styles/tiptapEditor.css +0 -72
  484. package/src/navigation/horizontal/index.js +0 -246
  485. package/src/navigation/vertical/index.js +0 -253
  486. package/src/pages/401.js +0 -70
  487. package/src/pages/404.js +0 -67
  488. package/src/pages/500.js +0 -68
  489. package/src/pages/[slug].js +0 -115
  490. package/src/pages/_document.js +0 -72
  491. package/src/pages/api/navigation/regenerate-registry.js +0 -116
  492. package/src/pages/api/navigation/save.js +0 -218
  493. package/src/pages/authModule/acl/index.js +0 -48
  494. package/src/pages/authModule/forgot-password/index.js +0 -228
  495. package/src/pages/authModule/permissions/rolePermissions/[id]/rolePermissionsUser/index.js +0 -392
  496. package/src/pages/authModule/permissions/rolePermissions/index.js +0 -343
  497. package/src/pages/authModule/permissions/systemPermissions/index.js +0 -354
  498. package/src/pages/authModule/privacy/index.js +0 -721
  499. package/src/pages/authModule/users/index.js +0 -210
  500. package/src/pages/login/index.js +0 -328
  501. package/src/pages/mainHome/index.js +0 -181
  502. package/src/views/builder/inspector/definitions/cell/main.js +0 -4
  503. package/src/views/builder/inspector/definitions/column/main.js +0 -9
  504. package/src/views/builder/inspector/definitions/column-group/main.js +0 -18
  505. package/src/views/builder/inspector/definitions/header-cell/main.js +0 -5
  506. package/src/views/builder/inspector/definitions/table/main.js +0 -9
  507. package/src/views/builder/viewer/renderers/CellRenderer.jsx +0 -71
  508. package/src/views/builder/viewer/renderers/ColumnGroupRenderer.jsx +0 -96
  509. package/src/views/builder/viewer/renderers/ColumnRenderer.jsx +0 -71
  510. package/src/views/builder/viewer/renderers/HeaderCellRenderer.jsx +0 -78
  511. package/src/views/builder/viewer/renderers/TabRenderer.jsx +0 -82
  512. package/src/views/builder/viewer/renderers/TableRenderer.jsx +0 -92
  513. package/src/views/pages/auth/FooterIllustrationsV2.js +0 -40
  514. package/src/views/pages/misc/FooterIllustrations.js +0 -47
  515. package/src/views/pages/misc/muiTable/CustomPagination.js +0 -34
  516. package/src/views/pages/users/UserManageDialog.js +0 -283
  517. package/src/views/pages/users/UserViewPage.js +0 -199
  518. package/src/views/users/AddUserNameDialog.js +0 -162
  519. package/src/views/users/ContactManage.js +0 -449
  520. package/src/views/users/ResetPasswordDialog.js +0 -242
@@ -0,0 +1,409 @@
1
+ import { useState, useRef, useEffect, useCallback } from 'react'
2
+ import { createPortal } from 'react-dom'
3
+ import {
4
+ Box, TextField, IconButton, Typography, CircularProgress,
5
+ Chip, Tooltip, Divider, Button, Alert,
6
+ } from '@mui/material'
7
+ import SendIcon from '@mui/icons-material/Send'
8
+ import AutoAwesomeIcon from '@mui/icons-material/AutoAwesome'
9
+ import DeleteSweepIcon from '@mui/icons-material/DeleteSweep'
10
+ import VisibilityIcon from '@mui/icons-material/Visibility'
11
+ import RefreshIcon from '@mui/icons-material/Refresh'
12
+ import CheckIcon from '@mui/icons-material/Check'
13
+ import UndoIcon from '@mui/icons-material/Undo'
14
+ import { useBuilder } from 'context/BuilderContext'
15
+ import { sendAiMessage, getProviderLabel } from './aiProvider'
16
+ import { buildSystemPrompt } from './systemPrompt'
17
+ import { parseAiResponse, transformAiSchema } from './schemaTransformer'
18
+ import { validateAiSchema } from './schemaValidator'
19
+
20
+ // ── Constants ─────────────────────────────────────────────────────────────────
21
+
22
+ const SYSTEM_PROMPT = buildSystemPrompt()
23
+
24
+ const QUICK_PROMPTS = [
25
+ 'Build a login form',
26
+ 'Create a user registration form',
27
+ 'Build a 3-column KPI dashboard',
28
+ 'Add a data table with search',
29
+ 'Build a wizard with 3 steps',
30
+ ]
31
+
32
+ // ── Preview banner (rendered via portal over the whole page) ──────────────────
33
+
34
+ function PreviewBanner({ message, onApply, onRevert }) {
35
+ if (typeof document === 'undefined') return null
36
+ return createPortal(
37
+ <Box sx={{
38
+ position: 'fixed', top: 0, left: 0, right: 0, zIndex: 9999,
39
+ bgcolor: 'primary.dark',
40
+ color: 'primary.contrastText',
41
+ display: 'flex', alignItems: 'center',
42
+ px: 2, py: 0.75, gap: 1.5,
43
+ boxShadow: 4,
44
+ }}>
45
+ <AutoAwesomeIcon sx={{ fontSize: 15, opacity: 0.85 }} />
46
+ <Typography variant='body2' sx={{ flex: 1, fontWeight: 500, fontSize: 13 }} noWrap>
47
+ AI Preview — {message}
48
+ </Typography>
49
+ <Button
50
+ size='small'
51
+ onClick={onRevert}
52
+ startIcon={<UndoIcon sx={{ fontSize: 14 }} />}
53
+ sx={{
54
+ color: 'primary.contrastText',
55
+ borderColor: 'rgba(255,255,255,0.4)',
56
+ border: '1px solid',
57
+ fontSize: 12, py: 0.4, px: 1.2,
58
+ '&:hover': { bgcolor: 'rgba(255,255,255,0.12)' },
59
+ }}
60
+ >
61
+ Revert
62
+ </Button>
63
+ <Button
64
+ size='small'
65
+ onClick={onApply}
66
+ startIcon={<CheckIcon sx={{ fontSize: 14 }} />}
67
+ sx={{
68
+ bgcolor: 'primary.contrastText',
69
+ color: 'primary.dark',
70
+ fontSize: 12, py: 0.4, px: 1.2,
71
+ '&:hover': { bgcolor: 'grey.100' },
72
+ }}
73
+ >
74
+ Apply
75
+ </Button>
76
+ </Box>,
77
+ document.body
78
+ )
79
+ }
80
+
81
+ // ── Message bubbles ────────────────────────────────────────────────────────────
82
+
83
+ function UserBubble({ text }) {
84
+ return (
85
+ <Box sx={{ display: 'flex', justifyContent: 'flex-end', mb: 1 }}>
86
+ <Box sx={{
87
+ maxWidth: '85%', px: 1.5, py: 1,
88
+ bgcolor: 'primary.main', color: 'primary.contrastText',
89
+ borderRadius: '16px 16px 4px 16px',
90
+ fontSize: 13, lineHeight: 1.5,
91
+ whiteSpace: 'pre-wrap', wordBreak: 'break-word',
92
+ }}>
93
+ {text}
94
+ </Box>
95
+ </Box>
96
+ )
97
+ }
98
+
99
+ function AiBubble({ content }) {
100
+ return (
101
+ <Box sx={{ display: 'flex', justifyContent: 'flex-start', mb: 1 }}>
102
+ <Box sx={{
103
+ maxWidth: '85%', px: 1.5, py: 1,
104
+ bgcolor: 'background.paper',
105
+ border: '1px solid', borderColor: 'divider',
106
+ borderRadius: '16px 16px 16px 4px',
107
+ fontSize: 13, lineHeight: 1.5,
108
+ whiteSpace: 'pre-wrap', wordBreak: 'break-word',
109
+ }}>
110
+ {content}
111
+ </Box>
112
+ </Box>
113
+ )
114
+ }
115
+
116
+ function SchemaProposalBubble({ message, isPreviewing, onPreview }) {
117
+ return (
118
+ <Box sx={{ display: 'flex', justifyContent: 'flex-start', mb: 1 }}>
119
+ <Box sx={{
120
+ maxWidth: '90%', px: 1.5, py: 1.25,
121
+ bgcolor: 'background.paper',
122
+ border: '1px solid',
123
+ borderColor: isPreviewing ? 'success.main' : 'primary.main',
124
+ borderRadius: '16px 16px 16px 4px',
125
+ }}>
126
+ <Box display='flex' alignItems='center' gap={0.75} mb={0.75}>
127
+ <AutoAwesomeIcon sx={{ fontSize: 14, color: isPreviewing ? 'success.main' : 'primary.main' }} />
128
+ <Typography variant='caption' color={isPreviewing ? 'success.main' : 'primary.main'} fontWeight={600}>
129
+ {isPreviewing ? 'Previewing on canvas' : 'Schema ready'}
130
+ </Typography>
131
+ </Box>
132
+ <Typography sx={{ fontSize: 13, mb: 1, lineHeight: 1.5 }}>{message}</Typography>
133
+ {!isPreviewing && (
134
+ <Button
135
+ size='small'
136
+ variant='outlined'
137
+ startIcon={<VisibilityIcon />}
138
+ onClick={onPreview}
139
+ sx={{ fontSize: 12 }}
140
+ >
141
+ Preview on Canvas
142
+ </Button>
143
+ )}
144
+ </Box>
145
+ </Box>
146
+ )
147
+ }
148
+
149
+ function TypingIndicator() {
150
+ return (
151
+ <Box sx={{ display: 'flex', justifyContent: 'flex-start', mb: 1 }}>
152
+ <Box sx={{
153
+ px: 2, py: 1.25,
154
+ bgcolor: 'background.paper',
155
+ border: '1px solid', borderColor: 'divider',
156
+ borderRadius: '16px 16px 16px 4px',
157
+ display: 'flex', alignItems: 'center', gap: 0.5,
158
+ }}>
159
+ {[0, 1, 2].map(i => (
160
+ <Box key={i} sx={{
161
+ width: 6, height: 6, borderRadius: '50%',
162
+ bgcolor: 'text.disabled',
163
+ animation: 'pulse 1.2s ease-in-out infinite',
164
+ animationDelay: `${i * 0.2}s`,
165
+ '@keyframes pulse': {
166
+ '0%, 80%, 100%': { transform: 'scale(0.6)', opacity: 0.4 },
167
+ '40%': { transform: 'scale(1)', opacity: 1 },
168
+ },
169
+ }} />
170
+ ))}
171
+ </Box>
172
+ </Box>
173
+ )
174
+ }
175
+
176
+ // ── Main AI tab ────────────────────────────────────────────────────────────────
177
+
178
+ export default function AiTab() {
179
+ const { schema, setSchema } = useBuilder()
180
+
181
+ // Chat messages: { id, role:'user'|'ai', kind:'text'|'schema', content?, aiSchema?, aiMessage? }
182
+ const [messages, setMessages] = useState([])
183
+ const [input, setInput] = useState('')
184
+ const [loading, setLoading] = useState(false)
185
+ const [error, setError] = useState(null)
186
+
187
+ // Preview: schema is already on the canvas; originalSchema lets us revert
188
+ // { originalSchema, aiSchema, aiMessage, msgId }
189
+ const [preview, setPreview] = useState(null)
190
+
191
+ const bottomRef = useRef(null)
192
+ const inputRef = useRef(null)
193
+
194
+ useEffect(() => {
195
+ bottomRef.current?.scrollIntoView({ behavior: 'smooth' })
196
+ }, [messages, loading])
197
+
198
+ // ── Build messages for the API ─────────────────────────────────────────────
199
+ const buildApiMessages = useCallback((conversationMsgs, userText) => {
200
+ const history = conversationMsgs
201
+ .filter(m => m.kind === 'text' || (m.kind === 'schema' && m.role === 'ai'))
202
+ .map(m => ({
203
+ role: m.role === 'user' ? 'user' : 'assistant',
204
+ content: m.role === 'ai' && m.kind === 'schema'
205
+ ? `${m.aiMessage}\n\`\`\`json\n${JSON.stringify({ type: 'schema', message: m.aiMessage, schema: m.aiSchema }, null, 2)}\n\`\`\``
206
+ : m.content,
207
+ }))
208
+
209
+ const userContent =
210
+ `<current_canvas_schema>\n${JSON.stringify(schema, null, 2)}\n</current_canvas_schema>\n\n${userText}`
211
+
212
+ return [...history, { role: 'user', content: userContent }]
213
+ }, [schema])
214
+
215
+ // ── Send ────────────────────────────────────────────────────────────────────
216
+ const handleSend = useCallback(async (text) => {
217
+ const trimmed = (text ?? input).trim()
218
+ if (!trimmed || loading) return
219
+
220
+ setInput('')
221
+ setError(null)
222
+
223
+ const userMsg = { id: Date.now(), role: 'user', kind: 'text', content: trimmed }
224
+ setMessages(prev => [...prev, userMsg])
225
+ setLoading(true)
226
+
227
+ try {
228
+ const apiMsgs = buildApiMessages(messages, trimmed)
229
+ const raw = await sendAiMessage(apiMsgs, SYSTEM_PROMPT)
230
+ const parsed = parseAiResponse(raw)
231
+
232
+ if (parsed.type === 'schema') {
233
+ const { valid, errors } = validateAiSchema(parsed.schema)
234
+ if (!valid) {
235
+ setMessages(prev => [...prev, {
236
+ id: Date.now() + 1, role: 'ai', kind: 'text',
237
+ content: `I generated a schema but it failed validation:\n• ${errors.join('\n• ')}\n\nCould you rephrase your request?`,
238
+ }])
239
+ } else {
240
+ const msgId = Date.now() + 1
241
+ setMessages(prev => [...prev, {
242
+ id: msgId, role: 'ai', kind: 'schema',
243
+ aiSchema: parsed.schema, aiMessage: parsed.message,
244
+ }])
245
+ }
246
+ } else {
247
+ setMessages(prev => [...prev, {
248
+ id: Date.now() + 1, role: 'ai', kind: 'text',
249
+ content: parsed.content,
250
+ }])
251
+ }
252
+ } catch (err) {
253
+ setError(err.message)
254
+ } finally {
255
+ setLoading(false)
256
+ inputRef.current?.focus()
257
+ }
258
+ }, [input, loading, messages, buildApiMessages])
259
+
260
+ // ── Preview on canvas ──────────────────────────────────────────────────────
261
+ const handlePreview = useCallback((aiSchema, aiMessage, msgId) => {
262
+ // If another preview is active, revert it first
263
+ if (preview) setSchema(preview.originalSchema)
264
+
265
+ try {
266
+ const transformed = transformAiSchema(aiSchema)
267
+ setPreview({ originalSchema: schema, aiSchema, aiMessage, msgId })
268
+ setSchema(transformed)
269
+ } catch (err) {
270
+ setError(`Preview failed: ${err.message}`)
271
+ }
272
+ }, [preview, schema, setSchema])
273
+
274
+ // ── Apply (keep schema, clear preview) ────────────────────────────────────
275
+ const handleApply = useCallback(() => {
276
+ setPreview(null)
277
+ setMessages(prev => [...prev, {
278
+ id: Date.now(), role: 'ai', kind: 'text',
279
+ content: '✅ Schema applied to canvas.',
280
+ }])
281
+ }, [])
282
+
283
+ // ── Revert (restore original, clear preview) ───────────────────────────────
284
+ const handleRevert = useCallback(() => {
285
+ if (preview?.originalSchema) setSchema(preview.originalSchema)
286
+ setPreview(null)
287
+ }, [preview, setSchema])
288
+
289
+ const handleKeyDown = (e) => {
290
+ if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend() }
291
+ }
292
+
293
+ return (
294
+ <Box sx={{ height: '100%', display: 'flex', flexDirection: 'column', overflow: 'hidden' }}>
295
+
296
+ {/* ── Preview banner ── */}
297
+ {preview && (
298
+ <PreviewBanner
299
+ message={preview.aiMessage}
300
+ onApply={handleApply}
301
+ onRevert={handleRevert}
302
+ />
303
+ )}
304
+
305
+ {/* ── Header ── */}
306
+ <Box sx={{
307
+ px: 2, py: 1, flexShrink: 0,
308
+ display: 'flex', alignItems: 'center', gap: 1,
309
+ borderBottom: '1px solid', borderColor: 'divider',
310
+ bgcolor: 'background.paper',
311
+ }}>
312
+ <AutoAwesomeIcon sx={{ fontSize: 16, color: 'primary.main' }} />
313
+ <Typography variant='caption' fontWeight={600} sx={{ flex: 1 }}>
314
+ AI Builder
315
+ </Typography>
316
+ <Chip label={getProviderLabel()} size='small' variant='outlined' sx={{ fontSize: 10 }} />
317
+ {messages.length > 0 && (
318
+ <Tooltip title='Clear conversation'>
319
+ <IconButton size='small' onClick={() => {
320
+ if (preview) handleRevert()
321
+ setMessages([])
322
+ setError(null)
323
+ }}>
324
+ <DeleteSweepIcon sx={{ fontSize: 16 }} />
325
+ </IconButton>
326
+ </Tooltip>
327
+ )}
328
+ </Box>
329
+
330
+ {/* ── Messages ── */}
331
+ <Box sx={{ flex: 1, overflow: 'auto', px: 1.5, py: 1.5 }}>
332
+ {messages.length === 0 && !loading && (
333
+ <Box sx={{ textAlign: 'center', mt: 3 }}>
334
+ <AutoAwesomeIcon sx={{ fontSize: 32, color: 'text.disabled', mb: 1 }} />
335
+ <Typography variant='body2' color='text.disabled' sx={{ mb: 2 }}>
336
+ Describe the UI you want to build.
337
+ </Typography>
338
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.75 }}>
339
+ {QUICK_PROMPTS.map(p => (
340
+ <Chip
341
+ key={p} label={p} size='small' variant='outlined' clickable
342
+ onClick={() => handleSend(p)}
343
+ sx={{ fontSize: 11, cursor: 'pointer' }}
344
+ />
345
+ ))}
346
+ </Box>
347
+ </Box>
348
+ )}
349
+
350
+ {messages.map(msg => {
351
+ if (msg.role === 'user') return <UserBubble key={msg.id} text={msg.content} />
352
+
353
+ if (msg.kind === 'schema') {
354
+ const isPreviewing = preview?.msgId === msg.id
355
+ return (
356
+ <SchemaProposalBubble
357
+ key={msg.id}
358
+ message={msg.aiMessage}
359
+ isPreviewing={isPreviewing}
360
+ onPreview={() => handlePreview(msg.aiSchema, msg.aiMessage, msg.id)}
361
+ />
362
+ )
363
+ }
364
+
365
+ return <AiBubble key={msg.id} content={msg.content} />
366
+ })}
367
+
368
+ {loading && <TypingIndicator />}
369
+
370
+ {error && (
371
+ <Alert severity='error' sx={{ mt: 1, fontSize: 12 }}
372
+ action={<IconButton size='small' onClick={() => setError(null)}><RefreshIcon fontSize='small' /></IconButton>}>
373
+ {error}
374
+ </Alert>
375
+ )}
376
+
377
+ <div ref={bottomRef} />
378
+ </Box>
379
+
380
+ <Divider />
381
+
382
+ {/* ── Input ── */}
383
+ <Box sx={{
384
+ px: 1.5, py: 1, flexShrink: 0,
385
+ bgcolor: 'background.paper',
386
+ display: 'flex', gap: 1, alignItems: 'flex-end',
387
+ }}>
388
+ <TextField
389
+ inputRef={inputRef}
390
+ fullWidth multiline maxRows={4} size='small'
391
+ placeholder='Describe what you want to build…'
392
+ value={input}
393
+ onChange={e => setInput(e.target.value)}
394
+ onKeyDown={handleKeyDown}
395
+ disabled={loading}
396
+ sx={{ '& .MuiInputBase-root': { fontSize: 13 } }}
397
+ />
398
+ <IconButton
399
+ color='primary'
400
+ onClick={() => handleSend()}
401
+ disabled={!input.trim() || loading}
402
+ sx={{ mb: 0.25 }}
403
+ >
404
+ {loading ? <CircularProgress size={20} /> : <SendIcon fontSize='small' />}
405
+ </IconButton>
406
+ </Box>
407
+ </Box>
408
+ )
409
+ }
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Transform an AI-generated simplified schema into a full builder schema.
3
+ *
4
+ * AI produces:
5
+ * { type:'input', props:{ label:'Name', key:'name' }, children:[] }
6
+ *
7
+ * Builder requires:
8
+ * { id:'cmp_xxx', type:'input', props:{ main:{ label:{valueType:'value',value:'Name'}, ... }, style:{}, advanced:{} }, children:[] }
9
+ *
10
+ * This module handles the conversion so the AI never needs to deal with
11
+ * valueType wrappers or UUID generation.
12
+ */
13
+
14
+ function uid() {
15
+ try { return `cmp_${crypto.randomUUID()}` }
16
+ catch { return `cmp_${Math.random().toString(36).slice(2, 11)}` }
17
+ }
18
+
19
+ function wrap(value) {
20
+ return { valueType: 'value', value }
21
+ }
22
+
23
+ function wrapGroup(rawProps = {}) {
24
+ const group = {}
25
+ for (const [k, v] of Object.entries(rawProps)) {
26
+ if (v === undefined || v === null) continue
27
+ group[k] = wrap(v)
28
+ }
29
+ return group
30
+ }
31
+
32
+ function buildProps(node) {
33
+ // AI nodes have:
34
+ // node.props → main group (component props like label, key, cols, gap …)
35
+ // node.style → style group (cell/visual styling like padding, backgroundColor …)
36
+ return {
37
+ main: wrapGroup(node.props ?? {}),
38
+ style: wrapGroup(node.style ?? {}),
39
+ advanced: {},
40
+ }
41
+ }
42
+
43
+ function transformNode(node) {
44
+ if (!node || typeof node !== 'object' || !node.type) return null
45
+ return {
46
+ id: uid(),
47
+ type: node.type,
48
+ props: buildProps(node),
49
+ children: Array.isArray(node.children)
50
+ ? node.children.map(transformNode).filter(Boolean)
51
+ : [],
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Convert the AI's simplified schema into a full builder schema.
57
+ * Returns { root, dialogs, actions, timers }.
58
+ * Throws if the AI schema is structurally invalid.
59
+ */
60
+ export function transformAiSchema(aiSchema) {
61
+ if (!aiSchema || typeof aiSchema !== 'object') {
62
+ throw new Error('AI schema is not an object')
63
+ }
64
+ if (!aiSchema.root) {
65
+ throw new Error('AI schema is missing a root node')
66
+ }
67
+
68
+ const root = transformNode(aiSchema.root)
69
+ root.id = 'root' // root always has a fixed id
70
+
71
+ return { root, dialogs: [], actions: [], timers: [] }
72
+ }
73
+
74
+ // ── Reverse: full builder schema → simplified AI schema ──────────────────────
75
+ //
76
+ // The session log stores the full builder schema (with `id`, `valueType`
77
+ // wrappers, and the main/style/advanced prop groups). Training data must be
78
+ // in the simplified format that the AI is expected to emit, otherwise we'd
79
+ // be teaching the model the wrong shape. This is the inverse of
80
+ // transformAiSchema(). It is lossy by design:
81
+ //
82
+ // - `id` fields are dropped (regenerated on import)
83
+ // - `valueType: 'value'` props are unwrapped to bare values
84
+ // - Non-value props (expressions, references) are dropped — the
85
+ // simplified format the AI is trained on cannot represent them.
86
+ // - The `advanced` group is dropped (the AI never produces it).
87
+ //
88
+ // Returns the simplified node, or null if the node is unusable.
89
+
90
+ function unwrapGroup(group = {}) {
91
+ const out = {}
92
+ for (const [k, v] of Object.entries(group)) {
93
+ if (v == null) continue
94
+ if (typeof v === 'object' && 'valueType' in v) {
95
+ // Only the plain `value` form is representable in the simplified format.
96
+ if (v.valueType === 'value' && v.value !== undefined) {
97
+ out[k] = v.value
98
+ }
99
+ // Drop expression / function / reference / other variants.
100
+ } else {
101
+ // Already a plain value (legacy schemas may have unwrapped props).
102
+ out[k] = v
103
+ }
104
+ }
105
+ return out
106
+ }
107
+
108
+ export function simplifyFullNode(node) {
109
+ if (!node || typeof node !== 'object' || !node.type) return null
110
+ const propsGroup = node.props ?? {}
111
+ const main = unwrapGroup(propsGroup.main ?? {})
112
+ const style = unwrapGroup(propsGroup.style ?? {})
113
+ // advanced is intentionally dropped.
114
+
115
+ const simplified = {
116
+ type: node.type,
117
+ props: main,
118
+ children: Array.isArray(node.children)
119
+ ? node.children.map(simplifyFullNode).filter(Boolean)
120
+ : [],
121
+ }
122
+ if (Object.keys(style).length > 0) simplified.style = style
123
+ return simplified
124
+ }
125
+
126
+ /**
127
+ * Convert a full builder schema (the shape stored in the session log) into
128
+ * the simplified shape used by training data and the AI's expected output.
129
+ *
130
+ * Accepts either { root, dialogs?, ... } or a bare root node.
131
+ * Returns { root: <simplified> }.
132
+ */
133
+ export function simplifyFullSchema(full) {
134
+ if (!full || typeof full !== 'object') return { root: null }
135
+ const rootNode = full.root ?? full
136
+ return { root: simplifyFullNode(rootNode) }
137
+ }
138
+
139
+ // ── Response parser ───────────────────────────────────────────────────────────
140
+
141
+ /**
142
+ * Parse the raw text from the AI.
143
+ *
144
+ * Returns one of:
145
+ * { type: 'schema', schema: <simplified>, message: string, raw: string }
146
+ * { type: 'message', content: string }
147
+ */
148
+ export function parseAiResponse(text) {
149
+ // Look for a ```json ... ``` block
150
+ const match = text.match(/```json\s*([\s\S]*?)\s*```/)
151
+ if (match) {
152
+ try {
153
+ const data = JSON.parse(match[1])
154
+ if (data?.type === 'schema' && data?.schema) {
155
+ return {
156
+ type: 'schema',
157
+ schema: data.schema, // still simplified — caller transforms
158
+ message: data.message ?? 'Schema generated.',
159
+ raw: text,
160
+ }
161
+ }
162
+ } catch {
163
+ // malformed JSON in the code block — fall through to plain message
164
+ }
165
+ }
166
+ return { type: 'message', content: text }
167
+ }
@@ -0,0 +1,64 @@
1
+ import { COMPONENT_SECTIONS } from 'views/builder/sidebar/tabs/Components/componentCatalog'
2
+
3
+ /**
4
+ * Validate an AI-generated simplified schema before transformation.
5
+ * Operates on the raw AI output (no valueType wrappers, no IDs).
6
+ */
7
+
8
+ // All types recognised by the builder (catalog + structural children)
9
+ const VALID_TYPES = new Set([
10
+ 'container', // root is always a container
11
+ 'layout-cell', // child of layout
12
+ 'wizard-step', // child of wizard
13
+ ...COMPONENT_SECTIONS.flatMap(s => s.items.map(i => i.type)),
14
+ ])
15
+
16
+ function validateNode(node, path, errors) {
17
+ if (!node || typeof node !== 'object') {
18
+ errors.push(`${path} is not an object`)
19
+ return
20
+ }
21
+ if (typeof node.type !== 'string' || !node.type) {
22
+ errors.push(`${path} is missing a "type" string`)
23
+ return
24
+ }
25
+ if (!VALID_TYPES.has(node.type)) {
26
+ errors.push(`${path}: unknown component type "${node.type}"`)
27
+ }
28
+ if (!Array.isArray(node.children)) {
29
+ errors.push(`${path}.children must be an array`)
30
+ return
31
+ }
32
+ // Structural nesting checks
33
+ if (node.type === 'layout') {
34
+ node.children.forEach((c, i) => {
35
+ if (c?.type !== 'layout-cell') {
36
+ errors.push(`${path}.children[${i}]: layout children must be layout-cell (got "${c?.type}")`)
37
+ }
38
+ })
39
+ }
40
+ if (node.type === 'wizard') {
41
+ node.children.forEach((c, i) => {
42
+ if (c?.type !== 'wizard-step') {
43
+ errors.push(`${path}.children[${i}]: wizard children must be wizard-step (got "${c?.type}")`)
44
+ }
45
+ })
46
+ }
47
+ node.children.forEach((child, i) => validateNode(child, `${path}.children[${i}]`, errors))
48
+ }
49
+
50
+ /**
51
+ * @param {object} aiSchema - raw AI schema { root: { type, props, children } }
52
+ * @returns {{ valid: boolean, errors: string[] }}
53
+ */
54
+ export function validateAiSchema(aiSchema) {
55
+ const errors = []
56
+ if (!aiSchema || typeof aiSchema !== 'object') {
57
+ return { valid: false, errors: ['Schema is not an object'] }
58
+ }
59
+ if (!aiSchema.root) {
60
+ return { valid: false, errors: ['Schema is missing root node'] }
61
+ }
62
+ validateNode(aiSchema.root, 'root', errors)
63
+ return { valid: errors.length === 0, errors }
64
+ }