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.
- package/INTEGRATION.md +1586 -0
- package/README.md +928 -0
- package/RoboByteBuilder_User_Manual.docx +0 -0
- package/next.config.js +19 -48
- package/package.json +42 -86
- package/src/context/BuilderContext.jsx +191 -7
- package/src/context/SystemContext.js +2 -2
- package/src/hooks/useGlobalStore.js +36 -0
- package/src/hooks/useTimerEngine.js +54 -0
- package/src/lib/index.js +11 -3
- package/src/lib/layouts/BlankLayout.jsx +13 -0
- package/src/lib/providers/RoboByteFrontBuilderProvider.jsx +61 -7
- package/src/lib/themes/builderTheme.js +41 -0
- package/src/pages/_app.js +32 -134
- package/src/pages/api/ai.js +107 -0
- package/src/pages/builders/report/index.js +1 -0
- package/src/pages/builders/report/list/index.js +1 -0
- package/src/pages/builders/report/viewer/index.js +1 -0
- package/src/pages/index.js +88 -37
- package/src/pages/printBuilder/index.jsx +263 -0
- package/src/pages/printBuilder/layouts/index.jsx +298 -0
- package/src/pages/reportModule/reportBuilder/index.js +8 -6
- package/src/pages/reportModule/reportBuilder/reportViewer/index.js +92 -25
- package/src/pages/reportModule/reportBuilder/reports/index.js +3 -5
- package/src/pages/reportModule/reportBuilder/reportsPermissions/index.js +2 -3
- package/src/pages/viewBuilder/index.jsx +117 -32
- package/src/pages/viewBuilder/views/index.js +3 -3
- package/src/pages/viewer/[id]/index.js +2 -1
- package/src/services/DeleteService.js +31 -60
- package/src/services/Endpoints/PrintLayoutEndpoints.js +42 -0
- package/src/services/Endpoints/ReportBuilderEndpoints.js +7 -7
- package/src/services/Endpoints.js +2 -0
- package/src/services/GetService.js +33 -54
- package/src/services/PatchService.js +38 -65
- package/src/services/PostService.js +37 -63
- package/src/services/UpdateService.js +39 -65
- package/src/services/builderHelper/actionExecutor.js +141 -25
- package/src/services/builderHelper/builderHelper.js +92 -0
- package/src/services/builderHelper/colorSchema.js +95 -0
- package/src/services/builderHelper/iconResolver.js +50 -0
- package/src/services/builderHelper/jsExecutor.js +212 -46
- package/src/services/builderHelper/nodeFactory.js +32 -15
- package/src/services/builderHelper/numberFormat.js +123 -0
- package/src/services/builderHelper/resolveProps.js +73 -4
- package/src/services/builderHelper/thresholdEngine.js +77 -0
- package/src/services/builderHelper/tree.js +31 -0
- package/src/services/components/agGridAutoComplete.js +5 -9
- package/src/services/config.js +9 -1
- package/src/services/globalStore.js +80 -0
- package/src/services/helper/multiSelectEditor.js +5 -9
- package/src/services/helper/multiSelectEditorByBuilder.js +5 -9
- package/src/services/reportData/fetchReportData.js +69 -28
- package/src/services/routerRef.js +35 -0
- package/src/services/sessionLog.js +171 -0
- package/src/views/ConfirmDialog.js +2 -2
- package/src/views/builder/JSEditor.js +105 -107
- package/src/views/builder/SessionLogDialog.jsx +350 -0
- package/src/views/builder/UnsavedChangesGuard.jsx +103 -0
- package/src/views/builder/inspector/Inspector.jsx +6 -9
- package/src/views/builder/inspector/Tabs/ComponentActionsTab.jsx +7 -13
- package/src/views/builder/inspector/Tabs/MainTab.jsx +143 -25
- package/src/views/builder/inspector/Tabs/RulesTab.jsx +9 -24
- package/src/views/builder/inspector/Tabs/StyleTab.jsx +9 -24
- package/src/views/builder/inspector/definitions/autocomplete/main.js +4 -6
- package/src/views/builder/inspector/definitions/banner/actions.js +7 -0
- package/src/views/builder/inspector/definitions/banner/main.js +22 -0
- package/src/views/builder/inspector/definitions/banner/rules.js +1 -0
- package/src/views/builder/inspector/definitions/banner/style.js +1 -0
- package/src/views/builder/inspector/definitions/breadcrumb/main.js +43 -6
- package/src/views/builder/inspector/definitions/button/main.js +11 -12
- package/src/views/builder/inspector/definitions/button/style.js +18 -30
- package/src/views/builder/inspector/definitions/checkbox/actions.js +3 -1
- package/src/views/builder/inspector/definitions/checkbox/main.js +4 -6
- package/src/views/builder/inspector/definitions/common/main.js +13 -2
- package/src/views/builder/inspector/definitions/dataGrid/main.js +23 -0
- package/src/views/builder/inspector/definitions/dataTableViewer/main.js +46 -0
- package/src/views/builder/inspector/definitions/datepicker/actions.js +3 -1
- package/src/views/builder/inspector/definitions/datepicker/main.js +6 -14
- package/src/views/builder/inspector/definitions/dialog/main.js +36 -0
- package/src/views/builder/inspector/definitions/dropdown/main.js +5 -8
- package/src/views/builder/inspector/definitions/excelUpload/actions.js +23 -0
- package/src/views/builder/inspector/definitions/excelUpload/main.js +17 -0
- package/src/views/builder/inspector/definitions/excelUpload/rules.js +1 -0
- package/src/views/builder/inspector/definitions/excelUpload/style.js +45 -0
- package/src/views/builder/inspector/definitions/header/main.js +10 -1
- package/src/views/builder/inspector/definitions/index.js +106 -19
- package/src/views/builder/inspector/definitions/input/actions.js +4 -1
- package/src/views/builder/inspector/definitions/input/main.js +20 -11
- package/src/views/builder/inspector/definitions/kpi/avatarGroup.js +22 -0
- package/src/views/builder/inspector/definitions/kpi/badge.js +17 -0
- package/src/views/builder/inspector/definitions/kpi/bulletChart.js +47 -0
- package/src/views/builder/inspector/definitions/kpi/chart.js +55 -0
- package/src/views/builder/inspector/definitions/kpi/colorScale.js +60 -0
- package/src/views/builder/inspector/definitions/kpi/comparisonBars.js +41 -0
- package/src/views/builder/inspector/definitions/kpi/countdown.js +46 -0
- package/src/views/builder/inspector/definitions/kpi/donut.js +51 -0
- package/src/views/builder/inspector/definitions/kpi/funnel.js +25 -0
- package/src/views/builder/inspector/definitions/kpi/gauge.js +39 -0
- package/src/views/builder/inspector/definitions/kpi/heatmapGrid.js +96 -0
- package/src/views/builder/inspector/definitions/kpi/iconBox.js +20 -0
- package/src/views/builder/inspector/definitions/kpi/metric.js +45 -0
- package/src/views/builder/inspector/definitions/kpi/rating.js +27 -0
- package/src/views/builder/inspector/definitions/kpi/statusDot.js +18 -0
- package/src/views/builder/inspector/definitions/kpi/stepStage.js +65 -0
- package/src/views/builder/inspector/definitions/kpi/tagList.js +32 -0
- package/src/views/builder/inspector/definitions/kpi/timeline.js +80 -0
- package/src/views/builder/inspector/definitions/kpi/trend.js +20 -0
- package/src/views/builder/inspector/definitions/label/main.js +10 -1
- package/src/views/builder/inspector/definitions/layout/main.js +27 -3
- package/src/views/builder/inspector/definitions/number/main.js +6 -14
- package/src/views/builder/inspector/definitions/pageNumber/main.js +21 -0
- package/src/views/builder/inspector/definitions/popover/main.js +71 -0
- package/src/views/builder/inspector/definitions/radio/main.js +5 -8
- package/src/views/builder/inspector/definitions/repeater/main.js +31 -0
- package/src/views/builder/inspector/definitions/reportViewer/main.js +28 -1
- package/src/views/builder/inspector/definitions/richtext/main.js +5 -8
- package/src/views/builder/inspector/definitions/signature/main.js +4 -1
- package/src/views/builder/inspector/definitions/tag/main.js +5 -8
- package/src/views/builder/inspector/definitions/textarea/actions.js +4 -1
- package/src/views/builder/inspector/definitions/textarea/main.js +5 -7
- package/src/views/builder/inspector/definitions/time/main.js +5 -8
- package/src/views/builder/inspector/definitions/toggle/main.js +5 -19
- package/src/views/builder/inspector/definitions/treeView/main.js +61 -0
- package/src/views/builder/inspector/definitions/viewRenderer/main.js +53 -0
- package/src/views/builder/inspector/definitions/wizard/main.js +68 -0
- package/src/views/builder/inspector/definitions/wizard-step/main.js +25 -0
- package/src/views/builder/inspector/fields/ActionsConfigEditor.jsx +426 -0
- package/src/views/builder/inspector/fields/ColorSchemaField.jsx +140 -0
- package/src/views/builder/inspector/fields/ColumnFunctionEditor.jsx +238 -0
- package/src/views/builder/inspector/fields/ColumnMappingEditor.jsx +105 -0
- package/src/views/builder/inspector/fields/ColumnsConfigEditor.jsx +506 -0
- package/src/views/builder/inspector/fields/DonutRingsEditorField.jsx +337 -0
- package/src/views/builder/inspector/fields/ExtraColsEditor.jsx +618 -0
- package/src/views/builder/inspector/fields/FunctionHelpPopover.jsx +295 -0
- package/src/views/builder/inspector/fields/IconEditor.jsx +64 -0
- package/src/views/builder/inspector/fields/KpiActionField.jsx +223 -0
- package/src/views/builder/inspector/fields/MarkersEditorField.jsx +173 -0
- package/src/views/builder/inspector/fields/SelectEditor.jsx +9 -5
- package/src/views/builder/inspector/fields/SeriesEditorField.jsx +363 -0
- package/src/views/builder/inspector/fields/TableColumnsEditor.jsx +104 -0
- package/src/views/builder/inspector/fields/ThresholdsEditor.jsx +247 -0
- package/src/views/builder/inspector/fields/ValueFunctionsRefPanel.jsx +217 -0
- package/src/views/builder/inspector/fields/columnEditorShared.jsx +217 -0
- package/src/views/builder/sidebar/Sidebar.jsx +4 -2
- package/src/views/builder/sidebar/SidebarTabs.jsx +28 -17
- package/src/views/builder/sidebar/tabs/ActionsTab.jsx +7 -3
- package/src/views/builder/sidebar/tabs/AiTab/AiPreviewDialog.jsx +193 -0
- package/src/views/builder/sidebar/tabs/AiTab/aiProvider.js +53 -0
- package/src/views/builder/sidebar/tabs/AiTab/index.jsx +409 -0
- package/src/views/builder/sidebar/tabs/AiTab/schemaTransformer.js +167 -0
- package/src/views/builder/sidebar/tabs/AiTab/schemaValidator.js +64 -0
- package/src/views/builder/sidebar/tabs/AiTab/systemPrompt.js +1151 -0
- package/src/views/builder/sidebar/tabs/AiTab/trainingExport.js +131 -0
- package/src/views/builder/sidebar/tabs/Components/ComponentsTab.jsx +31 -31
- package/src/views/builder/sidebar/tabs/Components/componentCatalog.js +43 -21
- package/src/views/builder/sidebar/tabs/Components/printComponentCatalog.js +81 -0
- package/src/views/builder/sidebar/tabs/TimersTab.jsx +338 -0
- package/src/views/builder/sidebar/tabs/TreeTab.jsx +13 -4
- package/src/views/builder/sidebar/tabs/ViewTab.jsx +173 -13
- package/src/views/builder/viewer/AdornedLabel.jsx +82 -0
- package/src/views/builder/viewer/ComponentRenderer.jsx +98 -24
- package/src/views/builder/viewer/DialogsZone.jsx +259 -0
- package/src/views/builder/viewer/FieldLabel.jsx +106 -0
- package/src/views/builder/viewer/PrintDialog.jsx +481 -0
- package/src/views/builder/viewer/ProductionViewer.jsx +80 -5
- package/src/views/builder/viewer/Viewer.jsx +106 -8
- package/src/views/builder/viewer/ViewerComponentWrapper.jsx +70 -9
- package/src/views/builder/viewer/ViewerToolbar.jsx +285 -56
- package/src/views/builder/viewer/renderers/AutoCompleteRenderer.jsx +26 -22
- package/src/views/builder/viewer/renderers/AvatarGroupRenderer.jsx +112 -0
- package/src/views/builder/viewer/renderers/BadgeRenderer.jsx +79 -0
- package/src/views/builder/viewer/renderers/BannerRenderer.jsx +62 -0
- package/src/views/builder/viewer/renderers/BreadcrumbRenderer.jsx +203 -15
- package/src/views/builder/viewer/renderers/BulletChartRenderer.jsx +147 -0
- package/src/views/builder/viewer/renderers/ButtonRenderer.jsx +98 -39
- package/src/views/builder/viewer/renderers/CardRenderer.jsx +1 -1
- package/src/views/builder/viewer/renderers/ChartRenderer.jsx +388 -0
- package/src/views/builder/viewer/renderers/CheckboxRenderer.jsx +17 -9
- package/src/views/builder/viewer/renderers/ColorScaleRenderer.jsx +300 -0
- package/src/views/builder/viewer/renderers/ComparisonBarsRenderer.jsx +133 -0
- package/src/views/builder/viewer/renderers/ContainerRenderer.jsx +3 -1
- package/src/views/builder/viewer/renderers/CountdownRenderer.jsx +249 -0
- package/src/views/builder/viewer/renderers/DataGridRenderer.jsx +380 -0
- package/src/views/builder/viewer/renderers/DataTableViewerRenderer.jsx +240 -0
- package/src/views/builder/viewer/renderers/DatePickerRenderer.jsx +25 -24
- package/src/views/builder/viewer/renderers/DialogRenderer.jsx +327 -0
- package/src/views/builder/viewer/renderers/DividerRenderer.jsx +1 -1
- package/src/views/builder/viewer/renderers/DonutRenderer.jsx +294 -0
- package/src/views/builder/viewer/renderers/DropdownRenderer.jsx +36 -44
- package/src/views/builder/viewer/renderers/ExcelUploadRenderer.jsx +639 -0
- package/src/views/builder/viewer/renderers/FunnelRenderer.jsx +93 -0
- package/src/views/builder/viewer/renderers/GaugeRenderer.jsx +159 -0
- package/src/views/builder/viewer/renderers/HeaderRenderer.jsx +31 -9
- package/src/views/builder/viewer/renderers/HeatmapGridRenderer.jsx +432 -0
- package/src/views/builder/viewer/renderers/IconBoxRenderer.jsx +59 -0
- package/src/views/builder/viewer/renderers/ImageRenderer.jsx +1 -1
- package/src/views/builder/viewer/renderers/InputRenderer.jsx +75 -18
- package/src/views/builder/viewer/renderers/LabelRenderer.jsx +35 -9
- package/src/views/builder/viewer/renderers/LayoutCellRenderer.jsx +102 -40
- package/src/views/builder/viewer/renderers/LayoutContextMenu.jsx +8 -8
- package/src/views/builder/viewer/renderers/LayoutRenderer.jsx +48 -6
- package/src/views/builder/viewer/renderers/LinkRenderer.jsx +1 -1
- package/src/views/builder/viewer/renderers/MenuRenderer.jsx +2 -2
- package/src/views/builder/viewer/renderers/MetricRenderer.jsx +80 -0
- package/src/views/builder/viewer/renderers/NumberFormatRenderer.jsx +21 -30
- package/src/views/builder/viewer/renderers/PageNumberRenderer.jsx +76 -0
- package/src/views/builder/viewer/renderers/PopoverRenderer.jsx +350 -0
- package/src/views/builder/viewer/renderers/ProgressCircleRenderer.jsx +1 -1
- package/src/views/builder/viewer/renderers/ProgressLineRenderer.jsx +1 -1
- package/src/views/builder/viewer/renderers/RadioGroupRenderer.jsx +28 -39
- package/src/views/builder/viewer/renderers/RatingRenderer.jsx +80 -0
- package/src/views/builder/viewer/renderers/RepeaterRenderer.jsx +297 -38
- package/src/views/builder/viewer/renderers/ReportViewerRenderer.jsx +263 -5
- package/src/views/builder/viewer/renderers/RichTextRenderer.jsx +60 -66
- package/src/views/builder/viewer/renderers/RowActionsCell.jsx +308 -0
- package/src/views/builder/viewer/renderers/SignatureRenderer.jsx +33 -62
- package/src/views/builder/viewer/renderers/StatusDotRenderer.jsx +75 -0
- package/src/views/builder/viewer/renderers/StepStageRenderer.jsx +348 -0
- package/src/views/builder/viewer/renderers/TagListRenderer.jsx +115 -0
- package/src/views/builder/viewer/renderers/TagPickerRenderer.jsx +31 -45
- package/src/views/builder/viewer/renderers/TextAreaRenderer.jsx +25 -18
- package/src/views/builder/viewer/renderers/TextRenderer.jsx +7 -1
- package/src/views/builder/viewer/renderers/TimePickerRenderer.jsx +25 -24
- package/src/views/builder/viewer/renderers/TimelineRenderer.jsx +525 -0
- package/src/views/builder/viewer/renderers/ToggleRenderer.jsx +21 -27
- package/src/views/builder/viewer/renderers/TreeViewRenderer.jsx +832 -0
- package/src/views/builder/viewer/renderers/TrendRenderer.jsx +66 -0
- package/src/views/builder/viewer/renderers/ViewRendererRenderer.jsx +315 -0
- package/src/views/builder/viewer/renderers/WizardRenderer.jsx +380 -64
- package/src/views/builder/viewer/renderers/WizardStepRenderer.jsx +21 -12
- package/src/views/builder/viewer/renderers/dataGridComponents.jsx +824 -0
- package/src/views/customFilter/CustomFilterDialog.js +1023 -660
- package/src/views/customFilter/FixedFilterDialog.js +649 -0
- package/src/views/customFilter/SearchFilterDialog.js +248 -0
- package/src/views/genericTable/BuilderExpressionParams.js +3 -3
- package/src/views/genericTable/ColumnConfiguratorDialog.js +33 -24
- package/src/views/genericTable/FixedFilterDialog.js +3 -2
- package/src/views/genericTable/FormattingSettingsDialog.js +8 -3
- package/src/views/genericTable/SGrid.js +821 -448
- package/src/views/genericTable/SearchFilterDialog.js +3 -2
- package/src/views/genericTable/cellEditors/autocompleteEditor.js +5 -9
- package/src/views/genericTable/convertStringFunctions.js +274 -138
- package/src/views/genericTable/statusBar/rowCountStatusBar.js +3 -1
- package/src/views/genericTable/updateRefHelpers.js +9 -6
- package/src/views/printBuilder/PrintBuilderViewer.jsx +627 -0
- package/src/views/printBuilder/PrintPreviewCanvas.jsx +157 -0
- package/src/views/rolePermissions/UpdateReportPermissionDialog.js +3 -2
- package/src/@core/components/auth/AclGuard.js +0 -55
- package/src/@core/components/auth/AuthGuard.js +0 -40
- package/src/@core/components/auth/GuestGuard.js +0 -30
- package/src/@core/components/custom-inputs/Horizontal.jsx +0 -143
- package/src/@core/components/custom-inputs/Image.jsx +0 -78
- package/src/@core/components/custom-inputs/Vertical.jsx +0 -113
- package/src/@core/components/customizer/index.jsx +0 -470
- package/src/@core/components/customizer/styles.module.css +0 -169
- package/src/@core/components/mui/Avatar.jsx +0 -41
- package/src/@core/components/mui/Badge.jsx +0 -20
- package/src/@core/components/mui/IconButton.jsx +0 -74
- package/src/@core/components/mui/TabList.jsx +0 -60
- package/src/@core/components/option-menu/index.jsx +0 -137
- package/src/@core/components/scroll-to-top/index.jsx +0 -43
- package/src/@core/components/spinner/index.js +0 -26
- package/src/@core/components/window-wrapper/index.js +0 -27
- package/src/@core/contexts/settingsContext.jsx +0 -98
- package/src/@core/hooks/useBgColor.js +0 -63
- package/src/@core/hooks/useImageVariant.js +0 -27
- package/src/@core/hooks/useLayoutInit.js +0 -37
- package/src/@core/hooks/useObjectCookie.js +0 -18
- package/src/@core/hooks/useSettings.jsx +0 -15
- package/src/@core/layouts/BlankLayout.js +0 -37
- package/src/@core/layouts/BlankLayoutWithAppBar.js +0 -51
- package/src/@core/layouts/HorizontalLayout.jsx +0 -151
- package/src/@core/layouts/Layout.js +0 -39
- package/src/@core/layouts/VerticalLayout.jsx +0 -124
- package/src/@core/layouts/components/blank-layout-with-appBar/index.js +0 -115
- package/src/@core/layouts/components/horizontal/app-bar-content/index.js +0 -67
- package/src/@core/layouts/components/horizontal/navigation/HorizontalNavGroup.js +0 -352
- package/src/@core/layouts/components/horizontal/navigation/HorizontalNavItems.js +0 -21
- package/src/@core/layouts/components/horizontal/navigation/HorizontalNavLink.js +0 -195
- package/src/@core/layouts/components/horizontal/navigation/index.js +0 -31
- package/src/@core/layouts/components/shared-components/LanguageDropdown.js +0 -96
- package/src/@core/layouts/components/shared-components/ModeToggler.js +0 -32
- package/src/@core/layouts/components/shared-components/NotificationDropdown.js +0 -226
- package/src/@core/layouts/components/shared-components/UserDropdown.js +0 -177
- package/src/@core/layouts/components/shared-components/footer/FooterContent.js +0 -46
- package/src/@core/layouts/components/shared-components/footer/index.js +0 -61
- package/src/@core/layouts/components/vertical/appBar/index.js +0 -74
- package/src/@core/layouts/components/vertical/navigation/Drawer.js +0 -122
- package/src/@core/layouts/components/vertical/navigation/VerticalNavGroup.js +0 -435
- package/src/@core/layouts/components/vertical/navigation/VerticalNavHeader.js +0 -180
- package/src/@core/layouts/components/vertical/navigation/VerticalNavItems.js +0 -26
- package/src/@core/layouts/components/vertical/navigation/VerticalNavLink.js +0 -258
- package/src/@core/layouts/components/vertical/navigation/VerticalNavSectionTitle.js +0 -102
- package/src/@core/layouts/components/vertical/navigation/index.js +0 -169
- package/src/@core/layouts/utils.js +0 -69
- package/src/@core/styles/Table.module.css +0 -93
- package/src/@core/styles/horizontal/menuItemStyles.js +0 -100
- package/src/@core/styles/horizontal/menuRootStyles.js +0 -19
- package/src/@core/styles/libs/fullcalendar/index.js +0 -461
- package/src/@core/styles/libs/keen-slider/index.js +0 -111
- package/src/@core/styles/libs/react-apexcharts/index.js +0 -107
- package/src/@core/styles/libs/react-cleave/index.js +0 -33
- package/src/@core/styles/libs/react-credit-cards/index.js +0 -11
- package/src/@core/styles/libs/react-datepicker/index.js +0 -388
- package/src/@core/styles/libs/react-draft-wysiwyg/index.js +0 -144
- package/src/@core/styles/libs/react-dropzone/index.js +0 -76
- package/src/@core/styles/libs/react-hot-toast/index.js +0 -37
- package/src/@core/styles/libs/recharts/index.js +0 -47
- package/src/@core/styles/stepper.js +0 -103
- package/src/@core/styles/vertical/menuItemStyles.js +0 -138
- package/src/@core/styles/vertical/menuSectionStyles.js +0 -54
- package/src/@core/styles/vertical/navigationCustomStyles.js +0 -62
- package/src/@core/svg/ContentCompact.jsx +0 -17
- package/src/@core/svg/ContentWide.jsx +0 -17
- package/src/@core/svg/DirectionLtr.jsx +0 -93
- package/src/@core/svg/DirectionRtl.jsx +0 -93
- package/src/@core/svg/LayoutCollapsed.jsx +0 -59
- package/src/@core/svg/LayoutHorizontal.jsx +0 -42
- package/src/@core/svg/LayoutVertical.jsx +0 -59
- package/src/@core/svg/Logo.jsx +0 -76
- package/src/@core/svg/SkinBordered.jsx +0 -54
- package/src/@core/svg/SkinDefault.jsx +0 -59
- package/src/@core/tailwind/plugin.js +0 -78
- package/src/@core/theme/ThemeComponent.js +0 -63
- package/src/@core/theme/ThemeOptions.js +0 -71
- package/src/@core/theme/breakpoints/index.js +0 -11
- package/src/@core/theme/colorSchemes.js +0 -326
- package/src/@core/theme/customShadows.js +0 -11
- package/src/@core/theme/globalStyles.js +0 -81
- package/src/@core/theme/index.js +0 -42
- package/src/@core/theme/overrides/accordion.js +0 -51
- package/src/@core/theme/overrides/accordion.jsx +0 -85
- package/src/@core/theme/overrides/alerts.js +0 -110
- package/src/@core/theme/overrides/alerts.jsx +0 -180
- package/src/@core/theme/overrides/autocomplete.js +0 -14
- package/src/@core/theme/overrides/autocomplete.jsx +0 -68
- package/src/@core/theme/overrides/avatar.js +0 -38
- package/src/@core/theme/overrides/avatars.js +0 -27
- package/src/@core/theme/overrides/backdrop.js +0 -22
- package/src/@core/theme/overrides/badges.js +0 -16
- package/src/@core/theme/overrides/breadcrumbs.js +0 -11
- package/src/@core/theme/overrides/button-group.js +0 -84
- package/src/@core/theme/overrides/button.js +0 -93
- package/src/@core/theme/overrides/buttonGroup.js +0 -9
- package/src/@core/theme/overrides/card.js +0 -83
- package/src/@core/theme/overrides/checkbox.jsx +0 -95
- package/src/@core/theme/overrides/chip.js +0 -72
- package/src/@core/theme/overrides/dataGrid.js +0 -114
- package/src/@core/theme/overrides/dateTimePicker.js +0 -65
- package/src/@core/theme/overrides/dialog.js +0 -120
- package/src/@core/theme/overrides/divider.js +0 -13
- package/src/@core/theme/overrides/drawer.js +0 -20
- package/src/@core/theme/overrides/fab.js +0 -13
- package/src/@core/theme/overrides/form-control-label.js +0 -19
- package/src/@core/theme/overrides/icon-button.js +0 -145
- package/src/@core/theme/overrides/index.js +0 -103
- package/src/@core/theme/overrides/input.js +0 -72
- package/src/@core/theme/overrides/link.js +0 -9
- package/src/@core/theme/overrides/list.js +0 -44
- package/src/@core/theme/overrides/menu.js +0 -25
- package/src/@core/theme/overrides/pagination.js +0 -41
- package/src/@core/theme/overrides/paper.js +0 -9
- package/src/@core/theme/overrides/popover.js +0 -16
- package/src/@core/theme/overrides/progress.js +0 -38
- package/src/@core/theme/overrides/radio.jsx +0 -80
- package/src/@core/theme/overrides/rating.js +0 -16
- package/src/@core/theme/overrides/rating.jsx +0 -32
- package/src/@core/theme/overrides/select.js +0 -19
- package/src/@core/theme/overrides/select.jsx +0 -52
- package/src/@core/theme/overrides/slider.js +0 -97
- package/src/@core/theme/overrides/snackbar.js +0 -19
- package/src/@core/theme/overrides/switch.js +0 -73
- package/src/@core/theme/overrides/switches.js +0 -25
- package/src/@core/theme/overrides/table-pagination.js +0 -39
- package/src/@core/theme/overrides/table.js +0 -81
- package/src/@core/theme/overrides/tabs.js +0 -30
- package/src/@core/theme/overrides/timeline.js +0 -80
- package/src/@core/theme/overrides/toggle-button.js +0 -33
- package/src/@core/theme/overrides/toggleButton.js +0 -16
- package/src/@core/theme/overrides/tooltip.js +0 -21
- package/src/@core/theme/overrides/typography.js +0 -13
- package/src/@core/theme/palette/index.js +0 -107
- package/src/@core/theme/shadows/index.js +0 -61
- package/src/@core/theme/shadows.js +0 -12
- package/src/@core/theme/spacing/index.js +0 -3
- package/src/@core/theme/spacing.js +0 -5
- package/src/@core/theme/typography/index.js +0 -65
- package/src/@core/theme/typography.js +0 -84
- package/src/@core/utils/create-emotion-cache.js +0 -5
- package/src/@core/utils/hex-to-rgba.js +0 -11
- package/src/@core/utils/serverHelpers.js +0 -45
- package/src/@menu/components/RouterLink.jsx +0 -18
- package/src/@menu/components/horizontal-menu/HorizontalNav.jsx +0 -88
- package/src/@menu/components/horizontal-menu/Menu.jsx +0 -83
- package/src/@menu/components/horizontal-menu/MenuButton.jsx +0 -100
- package/src/@menu/components/horizontal-menu/MenuItem.jsx +0 -183
- package/src/@menu/components/horizontal-menu/SubMenu.jsx +0 -418
- package/src/@menu/components/horizontal-menu/SubMenuContent.jsx +0 -41
- package/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.jsx +0 -20
- package/src/@menu/components/vertical-menu/Menu.jsx +0 -161
- package/src/@menu/components/vertical-menu/MenuButton.jsx +0 -95
- package/src/@menu/components/vertical-menu/MenuItem.jsx +0 -180
- package/src/@menu/components/vertical-menu/MenuSection.jsx +0 -124
- package/src/@menu/components/vertical-menu/NavCollapseIcons.jsx +0 -70
- package/src/@menu/components/vertical-menu/NavHeader.jsx +0 -39
- package/src/@menu/components/vertical-menu/SubMenu.jsx +0 -420
- package/src/@menu/components/vertical-menu/SubMenuContent.jsx +0 -101
- package/src/@menu/components/vertical-menu/VerticalNav.jsx +0 -216
- package/src/@menu/contexts/horizontalNavContext.jsx +0 -29
- package/src/@menu/contexts/verticalNavContext.jsx +0 -65
- package/src/@menu/defaultConfigs.js +0 -12
- package/src/@menu/hooks/useHorizontalMenu.jsx +0 -19
- package/src/@menu/hooks/useHorizontalNav.jsx +0 -19
- package/src/@menu/hooks/useMediaQuery.jsx +0 -29
- package/src/@menu/hooks/useVerticalMenu.jsx +0 -19
- package/src/@menu/hooks/useVerticalNav.jsx +0 -19
- package/src/@menu/horizontal-menu/index.jsx +0 -8
- package/src/@menu/styles/StyledBackdrop.jsx +0 -15
- package/src/@menu/styles/StyledMenuIcon.jsx +0 -12
- package/src/@menu/styles/StyledMenuLabel.jsx +0 -16
- package/src/@menu/styles/StyledMenuPrefix.jsx +0 -10
- package/src/@menu/styles/StyledMenuSectionLabel.jsx +0 -21
- package/src/@menu/styles/StyledMenuSuffix.jsx +0 -10
- package/src/@menu/styles/StyledSubMenuContent.jsx +0 -43
- package/src/@menu/styles/horizontal/StyledHorizontalMenu.jsx +0 -13
- package/src/@menu/styles/horizontal/StyledHorizontalMenuItem.jsx +0 -26
- package/src/@menu/styles/horizontal/StyledHorizontalNav.jsx +0 -11
- package/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.jsx +0 -33
- package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.jsx +0 -18
- package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.jsx +0 -10
- package/src/@menu/styles/horizontal/horizontalUl.module.css +0 -15
- package/src/@menu/styles/styles.module.css +0 -5
- package/src/@menu/styles/vertical/StyledVerticalMenu.jsx +0 -16
- package/src/@menu/styles/vertical/StyledVerticalMenuItem.jsx +0 -28
- package/src/@menu/styles/vertical/StyledVerticalMenuSection.jsx +0 -23
- package/src/@menu/styles/vertical/StyledVerticalNav.jsx +0 -67
- package/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.jsx +0 -15
- package/src/@menu/styles/vertical/StyledVerticalNavContainer.jsx +0 -23
- package/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.jsx +0 -25
- package/src/@menu/styles/vertical/verticalNavBgImage.module.css +0 -10
- package/src/@menu/svg/ChevronRight.jsx +0 -9
- package/src/@menu/svg/Close.jsx +0 -12
- package/src/@menu/svg/RadioCircle.jsx +0 -12
- package/src/@menu/svg/RadioCircleMarked.jsx +0 -13
- package/src/@menu/utils/menuClasses.js +0 -44
- package/src/@menu/utils/menuUtils.jsx +0 -145
- package/src/@menu/vertical-menu/index.jsx +0 -11
- package/src/configs/acl.js +0 -115
- package/src/configs/auth.js +0 -5
- package/src/configs/aws-exports.js +0 -30
- package/src/configs/firebase.js +0 -25
- package/src/configs/i18n.js +0 -34
- package/src/configs/primaryColorConfig.js +0 -35
- package/src/configs/themeConfig.js +0 -44
- package/src/layouts/UserLayout.js +0 -94
- package/src/layouts/UserThemeOptions.js +0 -191
- package/src/layouts/components/Direction.js +0 -30
- package/src/layouts/components/HtmlTooltip.js +0 -15
- package/src/layouts/components/Translations.js +0 -11
- package/src/layouts/components/UserDropdown.js +0 -217
- package/src/layouts/components/UserIcon.js +0 -40
- package/src/layouts/components/acl/Can.js +0 -6
- package/src/layouts/components/acl/CanViewNavGroup.js +0 -36
- package/src/layouts/components/acl/CanViewNavLink.js +0 -17
- package/src/layouts/components/acl/CanViewNavSectionTitle.js +0 -17
- package/src/layouts/components/horizontal/AppBarContent.js +0 -39
- package/src/layouts/components/horizontal/ServerSideNavItems.js +0 -44
- package/src/layouts/components/mui/StepperComps.js +0 -55
- package/src/layouts/components/vertical/AppBarContent.js +0 -35
- package/src/layouts/components/vertical/ServerSideNavItems.js +0 -44
- package/src/libs/ApexCharts.jsx +0 -5
- package/src/libs/ReactPlayer.jsx +0 -5
- package/src/libs/Recharts.jsx +0 -4
- package/src/libs/auth.js +0 -124
- package/src/libs/styles/AppFullCalendar.js +0 -505
- package/src/libs/styles/AppKeenSlider.js +0 -116
- package/src/libs/styles/AppReactApexCharts.jsx +0 -110
- package/src/libs/styles/AppReactDatepicker.jsx +0 -470
- package/src/libs/styles/AppReactDropzone.js +0 -76
- package/src/libs/styles/AppReactToastify.jsx +0 -108
- package/src/libs/styles/AppRecharts.js +0 -55
- package/src/libs/styles/inputOtp.module.css +0 -39
- package/src/libs/styles/tiptapEditor.css +0 -72
- package/src/navigation/horizontal/index.js +0 -246
- package/src/navigation/vertical/index.js +0 -253
- package/src/pages/401.js +0 -70
- package/src/pages/404.js +0 -67
- package/src/pages/500.js +0 -68
- package/src/pages/[slug].js +0 -115
- package/src/pages/_document.js +0 -72
- package/src/pages/api/navigation/regenerate-registry.js +0 -116
- package/src/pages/api/navigation/save.js +0 -218
- package/src/pages/authModule/acl/index.js +0 -48
- package/src/pages/authModule/forgot-password/index.js +0 -228
- package/src/pages/authModule/permissions/rolePermissions/[id]/rolePermissionsUser/index.js +0 -392
- package/src/pages/authModule/permissions/rolePermissions/index.js +0 -343
- package/src/pages/authModule/permissions/systemPermissions/index.js +0 -354
- package/src/pages/authModule/privacy/index.js +0 -721
- package/src/pages/authModule/users/index.js +0 -210
- package/src/pages/login/index.js +0 -328
- package/src/pages/mainHome/index.js +0 -181
- package/src/views/builder/inspector/definitions/cell/main.js +0 -4
- package/src/views/builder/inspector/definitions/column/main.js +0 -9
- package/src/views/builder/inspector/definitions/column-group/main.js +0 -18
- package/src/views/builder/inspector/definitions/header-cell/main.js +0 -5
- package/src/views/builder/inspector/definitions/table/main.js +0 -9
- package/src/views/builder/viewer/renderers/CellRenderer.jsx +0 -71
- package/src/views/builder/viewer/renderers/ColumnGroupRenderer.jsx +0 -96
- package/src/views/builder/viewer/renderers/ColumnRenderer.jsx +0 -71
- package/src/views/builder/viewer/renderers/HeaderCellRenderer.jsx +0 -78
- package/src/views/builder/viewer/renderers/TabRenderer.jsx +0 -82
- package/src/views/builder/viewer/renderers/TableRenderer.jsx +0 -92
- package/src/views/pages/auth/FooterIllustrationsV2.js +0 -40
- package/src/views/pages/misc/FooterIllustrations.js +0 -47
- package/src/views/pages/misc/muiTable/CustomPagination.js +0 -34
- package/src/views/pages/users/UserManageDialog.js +0 -283
- package/src/views/pages/users/UserViewPage.js +0 -199
- package/src/views/users/AddUserNameDialog.js +0 -162
- package/src/views/users/ContactManage.js +0 -449
- package/src/views/users/ResetPasswordDialog.js +0 -242
|
@@ -61,6 +61,51 @@ function cloneNode(node) {
|
|
|
61
61
|
return cloned
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
// ── System clipboard helpers (cross-tab / cross-browser) ─────────────────────
|
|
65
|
+
//
|
|
66
|
+
// Nodes are serialised as: { "__rbfb": 1, "node": <schema node> }
|
|
67
|
+
// The sentinel lets us reject arbitrary text the user may have copied elsewhere.
|
|
68
|
+
//
|
|
69
|
+
// writeNodeToClipboard — async, silently swallows permission errors
|
|
70
|
+
// readNodeFromClipboard — async, returns node object or null
|
|
71
|
+
//
|
|
72
|
+
const RBFB_MARKER = '__rbfb'
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Serialise a builder node and write it to the system clipboard.
|
|
76
|
+
* Safe to call fire-and-forget: never throws.
|
|
77
|
+
*/
|
|
78
|
+
export function writeNodeToClipboard(node) {
|
|
79
|
+
if (!navigator?.clipboard?.writeText) return Promise.resolve()
|
|
80
|
+
return navigator.clipboard
|
|
81
|
+
.writeText(JSON.stringify({ [RBFB_MARKER]: 1, node }))
|
|
82
|
+
.catch(() => {}) // permission denied or insecure context — ignore silently
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Read a builder node from the system clipboard.
|
|
87
|
+
* Returns the raw node object if the clipboard contains valid builder JSON,
|
|
88
|
+
* or null for any other content / permission denial.
|
|
89
|
+
*/
|
|
90
|
+
export async function readNodeFromClipboard() {
|
|
91
|
+
if (!navigator?.clipboard?.readText) return null
|
|
92
|
+
try {
|
|
93
|
+
const text = await navigator.clipboard.readText()
|
|
94
|
+
const obj = JSON.parse(text)
|
|
95
|
+
if (obj && obj[RBFB_MARKER] === 1 && obj.node && typeof obj.node === 'object') {
|
|
96
|
+
return obj.node
|
|
97
|
+
}
|
|
98
|
+
} catch {} // SyntaxError, NotAllowedError, etc.
|
|
99
|
+
return null
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ── Container types — paste-as-child targets ───────────────────────────────
|
|
103
|
+
export const CONTAINER_TYPES = new Set([
|
|
104
|
+
'container', 'card',
|
|
105
|
+
'wizard', 'wizard-step', 'repeater',
|
|
106
|
+
'widget', 'layout', 'layout-cell', 'dialog'
|
|
107
|
+
])
|
|
108
|
+
|
|
64
109
|
export function duplicateInTree(node, targetId) {
|
|
65
110
|
if (!node.children) return node
|
|
66
111
|
|
|
@@ -82,6 +127,53 @@ export function duplicateInTree(node, targetId) {
|
|
|
82
127
|
}
|
|
83
128
|
}
|
|
84
129
|
|
|
130
|
+
// ── Insert newNode immediately after targetId in the tree ─────────────────
|
|
131
|
+
function insertAfterInTree(node, targetId, newNode) {
|
|
132
|
+
if (!node.children) return node
|
|
133
|
+
|
|
134
|
+
const idx = node.children.findIndex(c => c.id === targetId)
|
|
135
|
+
if (idx !== -1) {
|
|
136
|
+
const next = [...node.children]
|
|
137
|
+
next.splice(idx + 1, 0, newNode)
|
|
138
|
+
return { ...node, children: next }
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
...node,
|
|
143
|
+
children: node.children.map(child => insertAfterInTree(child, targetId, newNode))
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Paste a cloned copy of clipboardNode relative to targetId.
|
|
149
|
+
*
|
|
150
|
+
* - No targetId → append as last child of root
|
|
151
|
+
* - targetId is a container → append as last child of that container
|
|
152
|
+
* - targetId is a leaf → insert as next sibling
|
|
153
|
+
*
|
|
154
|
+
* @param {object} root - Schema root node
|
|
155
|
+
* @param {string|null} targetId - Currently selected node id (or null)
|
|
156
|
+
* @param {object} clipboardNode - The node that was copied
|
|
157
|
+
* @param {boolean} asChild - Force paste-as-child even if target is a leaf
|
|
158
|
+
* @returns {object} - New root node
|
|
159
|
+
*/
|
|
160
|
+
export function pasteIntoTree(root, targetId, clipboardNode, asChild = false) {
|
|
161
|
+
const newNode = cloneNode(clipboardNode)
|
|
162
|
+
|
|
163
|
+
if (!targetId) {
|
|
164
|
+
// No selection — append to root's children
|
|
165
|
+
return { ...root, children: [...(root.children ?? []), newNode] }
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (asChild) {
|
|
169
|
+
// Target is a container — insert as last child
|
|
170
|
+
return insertIntoTree(root, targetId, newNode)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Target is a leaf — insert as next sibling
|
|
174
|
+
return insertAfterInTree(root, targetId, newNode)
|
|
175
|
+
}
|
|
176
|
+
|
|
85
177
|
function resolveValue(node, name, formData) {
|
|
86
178
|
const expr = node.expressions?.main?.[name]
|
|
87
179
|
if (expr?.type === 'js') {
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared color schema utility for KPI renderers.
|
|
3
|
+
*
|
|
4
|
+
* Supports four coloring modes for item arrays:
|
|
5
|
+
* palette — cycle through the global fallback palette (default)
|
|
6
|
+
* tints — monochromatic tints of a chosen base color
|
|
7
|
+
* data — only use colors that come from the data; no generated fallback
|
|
8
|
+
* custom — user-defined JSON array of hex / rgb strings
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export const DEFAULT_PALETTE = [
|
|
12
|
+
'#1976d2','#9c27b0','#e91e63','#ff9800',
|
|
13
|
+
'#4caf50','#00bcd4','#f44336','#3f51b5',
|
|
14
|
+
'#ff5722','#009688','#8bc34a','#607d8b',
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
// ── Low-level helpers ─────────────────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
export function hexToRgb(hex) {
|
|
20
|
+
const h = (hex || '').replace('#', '')
|
|
21
|
+
if (h.length < 6) return [0, 0, 0]
|
|
22
|
+
return [
|
|
23
|
+
parseInt(h.slice(0, 2), 16),
|
|
24
|
+
parseInt(h.slice(2, 4), 16),
|
|
25
|
+
parseInt(h.slice(4, 6), 16),
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Generate `count` tint variants — from 100 % saturation → ~38 % (mixed with white).
|
|
31
|
+
*/
|
|
32
|
+
export function generateTints(baseHex, count = 8) {
|
|
33
|
+
try {
|
|
34
|
+
const [r, g, b] = hexToRgb(baseHex)
|
|
35
|
+
return Array.from({ length: count }, (_, i) => {
|
|
36
|
+
const t = count === 1 ? 0 : (i * 0.62) / (count - 1)
|
|
37
|
+
const mix = v => Math.round(v + (255 - v) * t)
|
|
38
|
+
return `rgb(${mix(r)},${mix(g)},${mix(b)})`
|
|
39
|
+
})
|
|
40
|
+
} catch {
|
|
41
|
+
return DEFAULT_PALETTE.slice(0, count)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ── Public API ────────────────────────────────────────────────────────────────
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Resolve a colorSchema config object into an ordered color array for `count` items.
|
|
49
|
+
*
|
|
50
|
+
* Returns `null` for 'data' mode — the caller should skip generated colors entirely
|
|
51
|
+
* and rely solely on per-item data colors.
|
|
52
|
+
*
|
|
53
|
+
* @param {object|null} schema { mode, color, customColors }
|
|
54
|
+
* @param {number} count Number of items (used for tint generation)
|
|
55
|
+
* @param {string[]} palette Fallback palette (defaults to DEFAULT_PALETTE)
|
|
56
|
+
* @returns {string[]|null}
|
|
57
|
+
*/
|
|
58
|
+
export function resolveColorSchema(schema, count = 8, palette = DEFAULT_PALETTE) {
|
|
59
|
+
const mode = schema?.mode || 'palette'
|
|
60
|
+
|
|
61
|
+
if (mode === 'tints' && schema?.color) {
|
|
62
|
+
return generateTints(schema.color, count)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (mode === 'custom') {
|
|
66
|
+
try {
|
|
67
|
+
const arr = JSON.parse(schema?.customColors || '[]')
|
|
68
|
+
if (Array.isArray(arr) && arr.length) return arr
|
|
69
|
+
} catch { /* fall through */ }
|
|
70
|
+
return palette
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (mode === 'data') return null // no generated fallback
|
|
74
|
+
|
|
75
|
+
return palette // 'palette' or unknown
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Get the final color for a single item.
|
|
80
|
+
*
|
|
81
|
+
* Priority: dataColor (from data field) → schema-derived color.
|
|
82
|
+
*
|
|
83
|
+
* @param {object|null} schema colorSchema config
|
|
84
|
+
* @param {number} index Item index (for cycling)
|
|
85
|
+
* @param {string|null} dataColor Color already extracted from the data item
|
|
86
|
+
* @param {number} total Total item count
|
|
87
|
+
* @param {string[]} palette Fallback palette
|
|
88
|
+
* @returns {string|undefined}
|
|
89
|
+
*/
|
|
90
|
+
export function schemaColor(schema, index, dataColor, total, palette = DEFAULT_PALETTE) {
|
|
91
|
+
if (dataColor) return dataColor
|
|
92
|
+
const colors = resolveColorSchema(schema, total, palette)
|
|
93
|
+
if (!colors) return undefined // 'data' mode, no data color available
|
|
94
|
+
return colors[index % colors.length]
|
|
95
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves a string to an MUI @mui/icons-material component.
|
|
3
|
+
*
|
|
4
|
+
* Strategy: lazy-load the entire icons barrel once on first call (tree-shaking
|
|
5
|
+
* doesn't help for a dynamic lookup anyway), then cache for the lifetime of
|
|
6
|
+
* the session. Returns null when the name isn't a known icon.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const Icon = resolveIcon('SearchOutlined') // → React component or null
|
|
10
|
+
* const isIcon = isIconName('SearchOutlined') // → true
|
|
11
|
+
* const isIcon = isIconName('$') // → false
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
let _iconModule = null
|
|
15
|
+
|
|
16
|
+
function getIconModule() {
|
|
17
|
+
if (!_iconModule) {
|
|
18
|
+
try {
|
|
19
|
+
// eslint-disable-next-line global-require
|
|
20
|
+
_iconModule = require('@mui/icons-material')
|
|
21
|
+
} catch {
|
|
22
|
+
_iconModule = {}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return _iconModule
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Returns the MUI icon component for `name`, or null if not found.
|
|
30
|
+
* @param {string|null|undefined} name
|
|
31
|
+
* @returns {React.ComponentType|null}
|
|
32
|
+
*/
|
|
33
|
+
export function resolveIcon(name) {
|
|
34
|
+
if (!name || typeof name !== 'string') return null
|
|
35
|
+
const icons = getIconModule()
|
|
36
|
+
return icons[name] ?? null
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Returns true if `value` resolves to a known MUI icon component.
|
|
41
|
+
* Useful to decide whether to render an icon vs plain text in an adornment.
|
|
42
|
+
* @param {string|null|undefined} value
|
|
43
|
+
* @returns {boolean}
|
|
44
|
+
*/
|
|
45
|
+
export function isIconName(value) {
|
|
46
|
+
if (!value || typeof value !== 'string') return false
|
|
47
|
+
// Quick heuristic: icon names always start with an uppercase letter.
|
|
48
|
+
if (!/^[A-Z]/.test(value)) return false
|
|
49
|
+
return !!resolveIcon(value)
|
|
50
|
+
}
|
|
@@ -1,76 +1,232 @@
|
|
|
1
1
|
import { Services } from '../Endpoints'
|
|
2
2
|
import fetchReportDataByPageId from '../reportData/fetchReportData'
|
|
3
|
+
import toast from 'react-hot-toast'
|
|
4
|
+
import { getRouter } from '../routerRef'
|
|
5
|
+
import { getGlobalData, setGlobalData } from '../globalStore'
|
|
6
|
+
|
|
7
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
8
|
+
// showToast — available in every Calculation as a named function.
|
|
9
|
+
// react-hot-toast is a direct dependency of this package, and <Toaster /> is
|
|
10
|
+
// mounted by RoboByteFrontBuilderProvider, so both use the same module instance.
|
|
11
|
+
//
|
|
12
|
+
// Usage (inside any action code):
|
|
13
|
+
// showToast('Saved successfully', 'success')
|
|
14
|
+
// showToast('Something went wrong', 'error')
|
|
15
|
+
// showToast('Please review the form', 'warning')
|
|
16
|
+
// showToast('Data loaded', 'info')
|
|
17
|
+
//
|
|
18
|
+
// type: 'success' | 'error' | 'warning' | 'info' | 'loading' (default: 'default')
|
|
19
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
20
|
+
function showToast(message, type = 'default') {
|
|
21
|
+
switch (type) {
|
|
22
|
+
case 'success': return toast.success(message)
|
|
23
|
+
case 'error': return toast.error(message)
|
|
24
|
+
case 'warning': return toast(message, { icon: '⚠️' })
|
|
25
|
+
case 'info': return toast(message, { icon: 'ℹ️' })
|
|
26
|
+
case 'loading': return toast.loading(message)
|
|
27
|
+
default: return toast(message)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
32
|
+
// URL helpers
|
|
33
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
3
34
|
|
|
4
35
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
36
|
+
* Returns current page URL params as a plain object.
|
|
37
|
+
* Computed fresh at execution time — no React hook required.
|
|
7
38
|
*
|
|
8
|
-
*
|
|
9
|
-
* @param {object} context - Execution context with form and data
|
|
10
|
-
* @param {object} context.form - Form data
|
|
11
|
-
* @param {object} context.data - Global data object
|
|
12
|
-
* @returns {Promise<any>} - Result from the Calculation function
|
|
39
|
+
* Shape: { query: Record<string,string>, pathname: string, asPath: string }
|
|
13
40
|
*/
|
|
14
|
-
export
|
|
15
|
-
if (
|
|
16
|
-
|
|
41
|
+
export function getUrlParams() {
|
|
42
|
+
if (typeof window === 'undefined') {
|
|
43
|
+
return { query: {}, pathname: '', asPath: '' }
|
|
44
|
+
}
|
|
45
|
+
const search = new URLSearchParams(window.location.search)
|
|
46
|
+
const query = Object.fromEntries(search.entries())
|
|
47
|
+
return {
|
|
48
|
+
query,
|
|
49
|
+
pathname: window.location.pathname,
|
|
50
|
+
asPath: window.location.pathname + window.location.search,
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
55
|
+
// Unified context shape
|
|
56
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
57
|
+
//
|
|
58
|
+
// form — form field values (state snapshot, read-only)
|
|
59
|
+
// data — reactive data state for this component/dialog/view (read-only snapshot)
|
|
60
|
+
// setData — state setter; Calculation can call setData(prev => ({...}))
|
|
61
|
+
// dataRef — mutable non-reactive store (read/write, no re-render)
|
|
62
|
+
// reportRefs — map of { [nodeId]: updateRef } for every ReportViewer on page
|
|
63
|
+
// openDialog / closeDialog — open or close a named dialog
|
|
64
|
+
// urlParams — { query, pathname, asPath } from window.location (auto-computed)
|
|
65
|
+
//
|
|
66
|
+
// page — always points to the PARENT/MAIN-PAGE stores.
|
|
67
|
+
// Inside a dialog or embedded view `data` is the isolated child
|
|
68
|
+
// state while `page.data` is the outer page's state.
|
|
69
|
+
// In a top-level page page === { data, setData, dataRef, reportRefs }.
|
|
70
|
+
//
|
|
71
|
+
// Calculation signature:
|
|
72
|
+
// function Calculation(form, data, setData, dataRef, reportRefs, openDialog, closeDialog, urlParams, page) { ... }
|
|
73
|
+
//
|
|
74
|
+
// IMPORTANT — setData and data are kept in sync within a single execution:
|
|
75
|
+
// setData(prev => ({ ...prev, userId: 42 }))
|
|
76
|
+
// console.log(data.userId) // ← 42, not stale. Works as expected.
|
|
77
|
+
//
|
|
78
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
79
|
+
|
|
80
|
+
function extractContext(context) {
|
|
81
|
+
const rawData = context.data ?? {}
|
|
82
|
+
const rawSetData = context.setData ?? (() => {})
|
|
83
|
+
const dataRef = context.dataRef ?? {}
|
|
84
|
+
const reportRefs = context.reportRefs ?? {}
|
|
85
|
+
|
|
86
|
+
// ── Live data snapshot ────────────────────────────────────────────────────
|
|
87
|
+
//
|
|
88
|
+
// React state updates are asynchronous: calling setData() schedules a
|
|
89
|
+
// re-render but does NOT change the `data` reference captured by the current
|
|
90
|
+
// Calculation closure. This means code like:
|
|
91
|
+
//
|
|
92
|
+
// setData(prev => ({ ...prev, userId: 42 }))
|
|
93
|
+
// console.log(data.userId) // ← still undefined!
|
|
94
|
+
//
|
|
95
|
+
// is confusing and hard to debug.
|
|
96
|
+
//
|
|
97
|
+
// Fix: maintain a mutable `dataSnapshot` object that is kept in sync with
|
|
98
|
+
// state. We pass this object (not the raw snapshot) as `data` to the
|
|
99
|
+
// Calculation. When wrappedSetData is called, dataSnapshot is updated
|
|
100
|
+
// in-place before the React re-render is scheduled — so any code that runs
|
|
101
|
+
// after setData() in the same function sees the new values immediately.
|
|
102
|
+
//
|
|
103
|
+
const dataSnapshot = { ...rawData }
|
|
104
|
+
|
|
105
|
+
const wrappedSetData = (updater) => {
|
|
106
|
+
// Compute the next state eagerly using our local snapshot as `prev`.
|
|
107
|
+
// This is safe because we always keep the snapshot in sync with real state.
|
|
108
|
+
const next = typeof updater === 'function' ? updater(dataSnapshot) : updater
|
|
109
|
+
if (next && typeof next === 'object') {
|
|
110
|
+
// Mutate snapshot in-place so that subsequent reads of `data` inside
|
|
111
|
+
// the same Calculation see the updated values.
|
|
112
|
+
Object.keys(dataSnapshot).forEach(k => delete dataSnapshot[k])
|
|
113
|
+
Object.assign(dataSnapshot, next)
|
|
114
|
+
}
|
|
115
|
+
// Schedule the React state update (triggers component re-render)
|
|
116
|
+
rawSetData(next)
|
|
17
117
|
}
|
|
18
118
|
|
|
19
|
-
|
|
119
|
+
return {
|
|
120
|
+
form: context.form ?? {},
|
|
121
|
+
data: dataSnapshot, // ← live-updating reference
|
|
122
|
+
setData: wrappedSetData, // ← syncs snapshot before scheduling re-render
|
|
123
|
+
dataRef,
|
|
124
|
+
reportRefs,
|
|
125
|
+
openDialog: context.openDialog ?? (() => {}),
|
|
126
|
+
closeDialog: context.closeDialog ?? (() => {}),
|
|
127
|
+
openPrintLayout: context.openPrintLayout ?? (() => {}),
|
|
128
|
+
closePrintLayout: context.closePrintLayout ?? (() => {}),
|
|
129
|
+
urlParams: getUrlParams(),
|
|
130
|
+
// `page` — always the parent/main-page stores.
|
|
131
|
+
// In dialogs/embedded views these differ from the isolated `data`.
|
|
132
|
+
// In a top-level page they are identical.
|
|
133
|
+
page: {
|
|
134
|
+
data: context.pageData ?? dataSnapshot,
|
|
135
|
+
setData: context.pageSetData ?? wrappedSetData,
|
|
136
|
+
dataRef: context.pageDataRef ?? dataRef,
|
|
137
|
+
reportRefs: context.pageReportRefs ?? reportRefs,
|
|
138
|
+
},
|
|
139
|
+
// Repeater-scoped item context — null outside a Repeater.
|
|
140
|
+
// Available as closure variables `dataItem` and `itemIndex` in expressions.
|
|
141
|
+
dataItem: context.dataItem ?? null,
|
|
142
|
+
itemIndex: context.itemIndex ?? null,
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
147
|
+
// Async executor (used by action executor and direct calls)
|
|
148
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Execute a user-defined Calculation function asynchronously.
|
|
152
|
+
*
|
|
153
|
+
* @param {string} code - JS code containing a Calculation function
|
|
154
|
+
* @param {object} context - Execution context (see shape above)
|
|
155
|
+
* @returns {Promise<any>}
|
|
156
|
+
*/
|
|
157
|
+
export async function executeJSCode(code, context = {}) {
|
|
158
|
+
if (!code) throw new Error('No code provided to execute')
|
|
159
|
+
|
|
160
|
+
const { form, data, setData, dataRef, reportRefs, openDialog, closeDialog,
|
|
161
|
+
openPrintLayout, closePrintLayout, urlParams, page } = extractContext(context)
|
|
162
|
+
|
|
163
|
+
// extraVars: optional plain object of named variables to inject directly into
|
|
164
|
+
// the Calculation's lexical scope. e.g. { rowData: params.data }
|
|
165
|
+
const extraVars = (context.extraVars && typeof context.extraVars === 'object') ? context.extraVars : {}
|
|
166
|
+
const extraNames = Object.keys(extraVars)
|
|
167
|
+
const extraValues = Object.values(extraVars)
|
|
20
168
|
|
|
21
169
|
try {
|
|
22
|
-
// Create async function from code with services available
|
|
23
170
|
const fn = new Function(
|
|
24
|
-
'form',
|
|
25
|
-
'
|
|
26
|
-
'
|
|
27
|
-
'PostService',
|
|
28
|
-
'UpdateService',
|
|
29
|
-
'DeleteService',
|
|
30
|
-
'PatchService',
|
|
171
|
+
'form', 'data', 'setData', 'dataRef', 'reportRefs', 'openDialog', 'closeDialog',
|
|
172
|
+
'openPrintLayout', 'closePrintLayout',
|
|
173
|
+
'urlParams', 'page',
|
|
174
|
+
'GetService', 'PostService', 'UpdateService', 'DeleteService', 'PatchService',
|
|
31
175
|
'fetchReportData',
|
|
176
|
+
'showToast',
|
|
177
|
+
'router',
|
|
178
|
+
'globalData', 'setGlobalData',
|
|
179
|
+
...extraNames,
|
|
32
180
|
`
|
|
33
181
|
return (async function() {
|
|
34
182
|
${code}
|
|
35
183
|
if (typeof Calculation !== 'function') {
|
|
36
184
|
throw new Error('Calculation function not found')
|
|
37
185
|
}
|
|
38
|
-
return await Calculation(form, data)
|
|
186
|
+
return await Calculation(form, data, setData, dataRef, reportRefs, openDialog, closeDialog, openPrintLayout, closePrintLayout, urlParams, page)
|
|
39
187
|
})()
|
|
40
188
|
`
|
|
41
189
|
)
|
|
42
190
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
191
|
+
return await fn(
|
|
192
|
+
form, data, setData, dataRef, reportRefs, openDialog, closeDialog,
|
|
193
|
+
openPrintLayout, closePrintLayout,
|
|
194
|
+
urlParams, page,
|
|
47
195
|
Services.GetService,
|
|
48
196
|
Services.PostService,
|
|
49
197
|
Services.UpdateService,
|
|
50
198
|
Services.DeleteService,
|
|
51
199
|
Services.PatchService,
|
|
52
|
-
fetchReportDataByPageId
|
|
200
|
+
fetchReportDataByPageId,
|
|
201
|
+
showToast,
|
|
202
|
+
getRouter(),
|
|
203
|
+
getGlobalData(), setGlobalData,
|
|
204
|
+
...extraValues
|
|
53
205
|
)
|
|
54
|
-
|
|
55
|
-
return result
|
|
56
206
|
} catch (error) {
|
|
57
207
|
console.error('JSCode execution error:', error)
|
|
58
208
|
throw error
|
|
59
209
|
}
|
|
60
210
|
}
|
|
61
211
|
|
|
212
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
213
|
+
// Sync factory (used by resolveProps for expression-based prop resolution)
|
|
214
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
215
|
+
|
|
62
216
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
217
|
+
* Parse a user Calculation function synchronously and return it ready to call.
|
|
218
|
+
* The returned function has services in its closure and accepts:
|
|
219
|
+
* (form, data, setData, dataRef, reportRefs, openDialog, closeDialog, urlParams, page)
|
|
65
220
|
*
|
|
66
|
-
* @param {string} code
|
|
67
|
-
* @param {object} context - Execution context
|
|
68
|
-
* @returns {Function}
|
|
221
|
+
* @param {string} code - JS code containing a Calculation function
|
|
222
|
+
* @param {object} context - Execution context (see shape above)
|
|
223
|
+
* @returns {Function} - The Calculation function
|
|
69
224
|
*/
|
|
70
225
|
export function getJSCalculationFunction(code, context = {}) {
|
|
71
|
-
if (!code)
|
|
72
|
-
|
|
73
|
-
|
|
226
|
+
if (!code) throw new Error('No code provided')
|
|
227
|
+
|
|
228
|
+
const { form, data, setData, dataRef, reportRefs, openDialog, closeDialog,
|
|
229
|
+
openPrintLayout, closePrintLayout, urlParams, page, dataItem, itemIndex } = extractContext(context)
|
|
74
230
|
|
|
75
231
|
try {
|
|
76
232
|
const hasAsyncCalculation = /async\s+function\s+Calculation/.test(code)
|
|
@@ -81,13 +237,18 @@ export function getJSCalculationFunction(code, context = {}) {
|
|
|
81
237
|
: code
|
|
82
238
|
|
|
83
239
|
const fn = new Function(
|
|
84
|
-
|
|
85
|
-
'
|
|
86
|
-
'
|
|
87
|
-
'UpdateService',
|
|
88
|
-
'DeleteService',
|
|
89
|
-
'PatchService',
|
|
240
|
+
'form', 'data', 'setData', 'dataRef', 'reportRefs', 'openDialog', 'closeDialog',
|
|
241
|
+
'openPrintLayout', 'closePrintLayout',
|
|
242
|
+
'urlParams', 'page',
|
|
243
|
+
'GetService', 'PostService', 'UpdateService', 'DeleteService', 'PatchService',
|
|
90
244
|
'fetchReportData',
|
|
245
|
+
'showToast',
|
|
246
|
+
'router',
|
|
247
|
+
'globalData', 'setGlobalData',
|
|
248
|
+
// Repeater-scoped variables — available as bare names inside expressions.
|
|
249
|
+
// `dataItem` — the current repeated item object (null outside a Repeater)
|
|
250
|
+
// `itemIndex` — the current iteration index (null outside a Repeater)
|
|
251
|
+
'dataItem', 'itemIndex',
|
|
91
252
|
`
|
|
92
253
|
${normalizedCode}
|
|
93
254
|
if (typeof Calculation !== 'function') {
|
|
@@ -97,17 +258,22 @@ return Calculation
|
|
|
97
258
|
`
|
|
98
259
|
)
|
|
99
260
|
|
|
100
|
-
|
|
101
|
-
|
|
261
|
+
// Return the raw Calculation function — caller is responsible for passing all args
|
|
262
|
+
return fn(
|
|
263
|
+
form, data, setData, dataRef, reportRefs, openDialog, closeDialog,
|
|
264
|
+
openPrintLayout, closePrintLayout,
|
|
265
|
+
urlParams, page,
|
|
102
266
|
Services.GetService,
|
|
103
267
|
Services.PostService,
|
|
104
268
|
Services.UpdateService,
|
|
105
269
|
Services.DeleteService,
|
|
106
270
|
Services.PatchService,
|
|
107
|
-
fetchReportDataByPageId
|
|
271
|
+
fetchReportDataByPageId,
|
|
272
|
+
showToast,
|
|
273
|
+
getRouter(),
|
|
274
|
+
getGlobalData(), setGlobalData,
|
|
275
|
+
dataItem, itemIndex
|
|
108
276
|
)
|
|
109
|
-
|
|
110
|
-
return calc
|
|
111
277
|
} catch (error) {
|
|
112
278
|
console.error('JSCode parsing error:', error)
|
|
113
279
|
throw error
|
|
@@ -11,34 +11,51 @@ const CONTAINER_TYPES = [
|
|
|
11
11
|
'repeater',
|
|
12
12
|
'widget',
|
|
13
13
|
'layout',
|
|
14
|
-
'layout-cell'
|
|
14
|
+
'layout-cell',
|
|
15
|
+
'dialog',
|
|
15
16
|
]
|
|
16
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Recursively replaces every node `id` in a tree with a fresh UUID.
|
|
20
|
+
* Used when a saved widget is dropped so each instance gets unique IDs.
|
|
21
|
+
*/
|
|
22
|
+
export function remapIds(node) {
|
|
23
|
+
if (!node || typeof node !== 'object') return node
|
|
24
|
+
return {
|
|
25
|
+
...node,
|
|
26
|
+
id: `cmp_${crypto.randomUUID()}`,
|
|
27
|
+
children: Array.isArray(node.children)
|
|
28
|
+
? node.children.map(remapIds)
|
|
29
|
+
: node.children,
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
17
33
|
export function createNode(type, overrides = {}) {
|
|
34
|
+
// When a full saved node tree is passed (e.g. a widget drop), the overrides
|
|
35
|
+
// object already contains an `id` from the saved schema. If we just spread it
|
|
36
|
+
// every drop of the same widget shares identical IDs, breaking selection.
|
|
37
|
+
// Detect this case and remap the entire tree to fresh IDs instead.
|
|
38
|
+
if (overrides && overrides.id) {
|
|
39
|
+
return remapIds(overrides)
|
|
40
|
+
}
|
|
41
|
+
|
|
18
42
|
const isContainer = CONTAINER_TYPES.includes(type)
|
|
19
|
-
const randomKey
|
|
43
|
+
const randomKey = `${type}_${Math.random().toString(36).substring(2, 9)}`
|
|
20
44
|
|
|
21
|
-
|
|
45
|
+
return {
|
|
22
46
|
id: `cmp_${crypto.randomUUID()}`,
|
|
23
47
|
type,
|
|
24
48
|
props: {
|
|
25
49
|
main: {
|
|
26
|
-
key: {
|
|
27
|
-
|
|
28
|
-
value: randomKey
|
|
29
|
-
},
|
|
30
|
-
enabled: true
|
|
50
|
+
key: { valueType: 'value', value: randomKey },
|
|
51
|
+
enabled: true,
|
|
31
52
|
},
|
|
32
53
|
style: {},
|
|
33
|
-
advanced: {}
|
|
34
|
-
},
|
|
35
|
-
expressions: {
|
|
36
|
-
main: {}
|
|
54
|
+
advanced: {},
|
|
37
55
|
},
|
|
56
|
+
expressions: { main: {} },
|
|
38
57
|
className: '',
|
|
39
58
|
children: isContainer ? [] : undefined,
|
|
40
|
-
...overrides
|
|
59
|
+
...overrides,
|
|
41
60
|
}
|
|
42
|
-
|
|
43
|
-
return node
|
|
44
61
|
}
|