robobyte-front-builder 1.0.17 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +211 -0
- package/next.config.js +19 -48
- package/package.json +39 -85
- package/src/context/BuilderContext.jsx +134 -6
- 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 +59 -1
- package/src/lib/themes/builderTheme.js +41 -0
- package/src/pages/_app.js +32 -134
- package/src/pages/api/ai.js +87 -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 +723 -563
- package/src/pages/reportModule/reportBuilder/reportViewer/index.js +137 -71
- package/src/pages/reportModule/reportBuilder/reports/index.js +51 -13
- package/src/pages/reportModule/reportBuilder/reportsPermissions/index.js +126 -0
- 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.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 +241 -0
- package/src/services/helper/reportSessionHelper.js +83 -0
- package/src/services/reportData/fetchReportData.js +69 -28
- package/src/services/routerRef.js +35 -0
- package/src/views/ConfirmDialog.js +2 -2
- package/src/views/builder/JSEditor.js +105 -107
- 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 +15 -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 +49 -0
- package/src/views/builder/sidebar/tabs/AiTab/index.jsx +409 -0
- package/src/views/builder/sidebar/tabs/AiTab/schemaTransformer.js +102 -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/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 +1 -1
- 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 +61 -4
- package/src/views/builder/viewer/ViewerToolbar.jsx +273 -59
- 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 +219 -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 +771 -0
- package/src/views/genericTable/FixedFilterDialog.js +3 -2
- package/src/views/genericTable/FormattingSettingsDialog.js +551 -0
- package/src/views/genericTable/ReportSettingsDialog.js +151 -0
- package/src/views/genericTable/SGrid.js +1061 -247
- package/src/views/genericTable/SearchFilterDialog.js +3 -2
- package/src/views/genericTable/TAGGrid.js +83 -69
- package/src/views/genericTable/cellEditors/autocompleteEditor.js +5 -9
- package/src/views/genericTable/convertStringFunctions.js +336 -0
- package/src/views/genericTable/statusBar/rowCountStatusBar.js +3 -1
- package/src/views/genericTable/updateRefHelpers.js +424 -0
- package/src/views/printBuilder/PrintBuilderViewer.jsx +607 -0
- package/src/views/printBuilder/PrintPreviewCanvas.jsx +157 -0
- package/src/views/rolePermissions/UpdateReportPermissionDialog.js +316 -0
- 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
|
@@ -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
|
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared number formatting utility.
|
|
3
|
+
*
|
|
4
|
+
* format options:
|
|
5
|
+
* 'number' — 1,234.56
|
|
6
|
+
* 'currency' — $1,234.56 (currencyCode defaults to USD)
|
|
7
|
+
* 'percent' — 12.4% (expects 0-100 range; pass asRatio:true for 0-1)
|
|
8
|
+
* 'compact' — 84.2k / 1.2M
|
|
9
|
+
* 'duration' — value treated as total seconds → "2h 14m 05s"
|
|
10
|
+
* 'bytes' — 1.2 MB / 4.3 GB
|
|
11
|
+
* 'custom' — returns raw value (caller formats via expression)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** Sanitise a decimals value from an expression field.
|
|
15
|
+
* Accepts string/number, clamps to [0, 20], falls back to `fallback`. */
|
|
16
|
+
function clampDec(val, fallback = 0) {
|
|
17
|
+
if (val == null) return fallback
|
|
18
|
+
const n = Math.round(Number(val))
|
|
19
|
+
if (!isFinite(n) || n < 0) return fallback
|
|
20
|
+
return Math.min(20, n)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Sanitise prefix/suffix — ensure they are plain strings. */
|
|
24
|
+
function safeStr(val) {
|
|
25
|
+
if (val == null) return ''
|
|
26
|
+
return typeof val === 'string' ? val : String(val)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function formatNumber(value, {
|
|
30
|
+
format = 'number',
|
|
31
|
+
decimals,
|
|
32
|
+
prefix = '',
|
|
33
|
+
suffix = '',
|
|
34
|
+
locale = 'en-US',
|
|
35
|
+
currency = 'USD',
|
|
36
|
+
asRatio = false, // for percent: true means value is 0-1
|
|
37
|
+
} = {}) {
|
|
38
|
+
if (value == null || value === '') return '—'
|
|
39
|
+
const num = Number(value)
|
|
40
|
+
if (isNaN(num)) return String(value)
|
|
41
|
+
|
|
42
|
+
// Sanitise caller-supplied strings from expression fields
|
|
43
|
+
const pfx = safeStr(prefix)
|
|
44
|
+
const sfx = safeStr(suffix)
|
|
45
|
+
|
|
46
|
+
let core
|
|
47
|
+
|
|
48
|
+
switch (format) {
|
|
49
|
+
case 'currency': {
|
|
50
|
+
const dec = clampDec(decimals, 2)
|
|
51
|
+
core = new Intl.NumberFormat(locale, {
|
|
52
|
+
style: 'currency', currency: safeStr(currency) || 'USD',
|
|
53
|
+
minimumFractionDigits: dec, maximumFractionDigits: dec,
|
|
54
|
+
}).format(num)
|
|
55
|
+
break
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
case 'percent': {
|
|
59
|
+
const pct = asRatio ? num * 100 : num
|
|
60
|
+
const dec = clampDec(decimals, 1)
|
|
61
|
+
core = pct.toFixed(dec) + '%'
|
|
62
|
+
break
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
case 'compact': {
|
|
66
|
+
core = new Intl.NumberFormat(locale, {
|
|
67
|
+
notation: 'compact',
|
|
68
|
+
maximumFractionDigits: clampDec(decimals, 1),
|
|
69
|
+
}).format(num)
|
|
70
|
+
break
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
case 'duration': {
|
|
74
|
+
// value = total seconds
|
|
75
|
+
const totalSec = Math.abs(Math.round(num))
|
|
76
|
+
const h = Math.floor(totalSec / 3600)
|
|
77
|
+
const m = Math.floor((totalSec % 3600) / 60)
|
|
78
|
+
const s = totalSec % 60
|
|
79
|
+
const parts = []
|
|
80
|
+
if (h) parts.push(`${h}h`)
|
|
81
|
+
if (m || h) parts.push(`${m}m`)
|
|
82
|
+
parts.push(`${String(s).padStart(2, '0')}s`)
|
|
83
|
+
core = (num < 0 ? '-' : '') + parts.join(' ')
|
|
84
|
+
break
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
case 'bytes': {
|
|
88
|
+
const abs = Math.abs(num)
|
|
89
|
+
const sign = num < 0 ? '-' : ''
|
|
90
|
+
const dec = clampDec(decimals, 1)
|
|
91
|
+
if (abs >= 1e12) core = sign + (abs / 1e12).toFixed(dec) + ' TB'
|
|
92
|
+
else if (abs >= 1e9) core = sign + (abs / 1e9).toFixed(dec) + ' GB'
|
|
93
|
+
else if (abs >= 1e6) core = sign + (abs / 1e6).toFixed(dec) + ' MB'
|
|
94
|
+
else if (abs >= 1e3) core = sign + (abs / 1e3).toFixed(dec) + ' KB'
|
|
95
|
+
else core = sign + abs + ' B'
|
|
96
|
+
break
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
default: { // 'number'
|
|
100
|
+
const dec = clampDec(decimals, 0)
|
|
101
|
+
core = new Intl.NumberFormat(locale, {
|
|
102
|
+
minimumFractionDigits: dec,
|
|
103
|
+
maximumFractionDigits: dec,
|
|
104
|
+
}).format(num)
|
|
105
|
+
break
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return `${pfx}${core}${sfx}`
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Format a trend delta. Returns { text, positive, zero } */
|
|
113
|
+
export function formatTrend(value, { isPercent = true, decimals = 1, invertColors = false } = {}) {
|
|
114
|
+
if (value == null || value === '') return { text: '—', positive: null, zero: true }
|
|
115
|
+
const num = Number(value)
|
|
116
|
+
if (isNaN(num)) return { text: String(value), positive: null, zero: false }
|
|
117
|
+
const zero = num === 0
|
|
118
|
+
const positive = invertColors ? num < 0 : num > 0
|
|
119
|
+
const abs = Math.abs(num)
|
|
120
|
+
const text = (num > 0 ? '+' : num < 0 ? '−' : '') +
|
|
121
|
+
(isPercent ? abs.toFixed(decimals) + '%' : abs.toFixed(decimals))
|
|
122
|
+
return { text, positive, zero }
|
|
123
|
+
}
|
|
@@ -1,21 +1,68 @@
|
|
|
1
|
-
import { getJSCalculationFunction } from './jsExecutor'
|
|
1
|
+
import { getJSCalculationFunction, getUrlParams } from './jsExecutor'
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a node's props tab (main / style / advanced) into plain values.
|
|
5
|
+
*
|
|
6
|
+
* Accepts either:
|
|
7
|
+
* - a plain context object: { form, data, setData, dataRef, reportRefs, … }
|
|
8
|
+
* - a full viewerContext (has dataRef as a React ref with .current)
|
|
9
|
+
*
|
|
10
|
+
* Backward-compatible: callers that pass only { form, data } still work.
|
|
11
|
+
* Callers that pass the full viewerContext get dataItem / itemIndex / all
|
|
12
|
+
* page stores automatically, without any per-renderer boilerplate.
|
|
13
|
+
*/
|
|
3
14
|
export function resolveProps(node, tab, context = {}) {
|
|
4
15
|
const props = node.props?.[tab] ?? {}
|
|
5
16
|
const resolved = {}
|
|
6
17
|
|
|
18
|
+
const form = context.form ?? {}
|
|
19
|
+
const data = context.data ?? {}
|
|
20
|
+
const setData = context.setData ?? (() => {})
|
|
21
|
+
|
|
22
|
+
// dataRef may be a React ref ({ current: obj }) when viewerContext is passed
|
|
23
|
+
// directly, or a plain object when a custom resolveCtx is constructed.
|
|
24
|
+
const rawDataRef = context.dataRef
|
|
25
|
+
const dataRef = rawDataRef?.current !== undefined ? rawDataRef.current : (rawDataRef ?? {})
|
|
26
|
+
|
|
27
|
+
const rawReportRefs = context.reportRefs
|
|
28
|
+
const reportRefs = rawReportRefs?.current !== undefined ? rawReportRefs.current : (rawReportRefs ?? {})
|
|
29
|
+
|
|
30
|
+
const openDialog = context.openDialog ?? (() => {})
|
|
31
|
+
const closeDialog = context.closeDialog ?? (() => {})
|
|
32
|
+
const urlParams = getUrlParams()
|
|
33
|
+
|
|
34
|
+
// `page` — parent/main-page stores forwarded from the viewerContext.
|
|
35
|
+
// In isolated dialogs/embedded views these differ from the component's own data.
|
|
36
|
+
const page = context.page ?? {
|
|
37
|
+
data: context.pageData ?? data,
|
|
38
|
+
setData: context.pageSetData ?? setData,
|
|
39
|
+
dataRef: context.pageDataRef ?? dataRef,
|
|
40
|
+
reportRefs: context.pageReportRefs ?? reportRefs,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const execContext = {
|
|
44
|
+
form, data, setData, dataRef, reportRefs, openDialog, closeDialog, page,
|
|
45
|
+
// Repeater item context — present when inside a Repeater, null elsewhere
|
|
46
|
+
dataItem: context.dataItem ?? null,
|
|
47
|
+
itemIndex: context.itemIndex ?? null,
|
|
48
|
+
}
|
|
49
|
+
|
|
7
50
|
for (const [key, field] of Object.entries(props)) {
|
|
8
51
|
if (!field) continue
|
|
9
52
|
|
|
10
53
|
if ((field.valueType || field.type) === 'value') {
|
|
11
|
-
|
|
54
|
+
// Skip empty strings so the renderer's destructuring default kicks in.
|
|
55
|
+
// An explicitly cleared field should behave identically to "never set".
|
|
56
|
+
if (field.value !== '') resolved[key] = field.value
|
|
12
57
|
continue
|
|
13
58
|
}
|
|
14
59
|
|
|
15
60
|
if ((field.valueType || field.type) === 'expression' && field.expression?.code) {
|
|
16
61
|
try {
|
|
17
|
-
const calc = getJSCalculationFunction(field.expression.code,
|
|
18
|
-
|
|
62
|
+
const calc = getJSCalculationFunction(field.expression.code, execContext)
|
|
63
|
+
|
|
64
|
+
// Call Calculation with all args — old functions that only declare (form, data) ignore extras
|
|
65
|
+
const value = calc(form, data, setData, dataRef, reportRefs, openDialog, closeDialog, urlParams, page)
|
|
19
66
|
|
|
20
67
|
// Viewer prop resolution is synchronous. Skip unresolved promises.
|
|
21
68
|
if (value && typeof value.then === 'function') {
|
|
@@ -32,3 +79,25 @@ export function resolveProps(node, tab, context = {}) {
|
|
|
32
79
|
|
|
33
80
|
return resolved
|
|
34
81
|
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Resolve a scalar value from a KPI component's "value key" field.
|
|
85
|
+
*
|
|
86
|
+
* The field type is `expression`, so resolveProps already evaluates it.
|
|
87
|
+
* The result can be either:
|
|
88
|
+
* • a string → treat as a data key and look up data[key]
|
|
89
|
+
* • anything else (number, boolean, null …) → use the value directly
|
|
90
|
+
*
|
|
91
|
+
* This lets users write either:
|
|
92
|
+
* valueKey: "revenue" → data["revenue"]
|
|
93
|
+
* valueKey: data.price * data.qty → computed value used as-is
|
|
94
|
+
* valueKey: 42 → literal 42
|
|
95
|
+
*
|
|
96
|
+
* @param {*} key The resolved value from resolveProps (already evaluated)
|
|
97
|
+
* @param {object} data The current page data object
|
|
98
|
+
* @param {*} fallback Returned when key is null/undefined (default: undefined)
|
|
99
|
+
*/
|
|
100
|
+
export function resolveValue(key, data, fallback = undefined) {
|
|
101
|
+
if (key == null) return fallback
|
|
102
|
+
return typeof key === 'string' ? (data?.[key] ?? fallback) : key
|
|
103
|
+
}
|