robobyte-front-builder 1.0.19 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +61 -7
- 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 +8 -6
- package/src/pages/reportModule/reportBuilder/reportViewer/index.js +33 -22
- 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.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/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 +33 -24
- package/src/views/genericTable/FixedFilterDialog.js +3 -2
- package/src/views/genericTable/FormattingSettingsDialog.js +8 -3
- package/src/views/genericTable/SGrid.js +198 -97
- 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 +607 -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
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared parameter-reference popover used by all code/function editors in the app.
|
|
3
|
+
* Import HelpPopover and pass the `type` string matching one of the HELP_CONTENT keys.
|
|
4
|
+
*/
|
|
5
|
+
import { useState } from 'react'
|
|
6
|
+
import { Box, IconButton, Popover, Tooltip, Typography } from '@mui/material'
|
|
7
|
+
import { HelpOutlineOutlined } from '@mui/icons-material'
|
|
8
|
+
|
|
9
|
+
// ── Help content per editor type ──────────────────────────────────────────────
|
|
10
|
+
|
|
11
|
+
export const HELP_CONTENT = {
|
|
12
|
+
// ── Builder calculation (JSEditor / ExpressionEditor) ─────────────────────
|
|
13
|
+
calculation: {
|
|
14
|
+
title: 'calculation',
|
|
15
|
+
desc: 'Async function for reactive logic — fetch data, set state, navigate steps, open dialogs.',
|
|
16
|
+
params: [
|
|
17
|
+
{ name: 'form', desc: 'Form field values (read)' },
|
|
18
|
+
{ name: 'data', desc: 'Reactive page state (read)' },
|
|
19
|
+
{ name: 'setData', desc: 'Write to page state (triggers re-render)' },
|
|
20
|
+
{ name: 'dataRef', desc: 'Mutable non-reactive store (read/write, no re-render)' },
|
|
21
|
+
{ name: 'reportRefs', desc: 'Registry of all grid refs on the page' },
|
|
22
|
+
{ name: 'openDialog', desc: 'openDialog(key, data?) — open a dialog by Key' },
|
|
23
|
+
{ name: 'closeDialog', desc: 'closeDialog(key) — close a dialog by Key' },
|
|
24
|
+
{ name: 'urlParams', desc: '{ query, pathname, asPath } from the current page URL' },
|
|
25
|
+
{ name: 'page', desc: 'stepIndex, goToStep(n), nextStep(), prevStep() — step navigation' },
|
|
26
|
+
{ name: 'dataItem', desc: '(Repeater only) The current repeated item' },
|
|
27
|
+
{ name: 'itemIndex', desc: '(Repeater only) The current iteration index (0-based)' },
|
|
28
|
+
{ name: 'newValue', desc: '(Field actions only) The value emitted by the component — e.g. new input text, mapped rows array for onMapped, etc.' },
|
|
29
|
+
{ name: 'showToast', desc: "showToast(message, type?) — show a toast notification. type: 'success' | 'error' | 'warning' | 'info' | 'loading'" },
|
|
30
|
+
{ name: 'router', desc: "Next.js router — router.push('/path'), router.replace(...), router.back(), router.query" },
|
|
31
|
+
{ name: 'globalData', desc: 'Cross-route global state (read) — persists across page navigations' },
|
|
32
|
+
{ name: 'setGlobalData', desc: 'Write to global state — setGlobalData(prev => ({ ...prev, key: value }))' },
|
|
33
|
+
],
|
|
34
|
+
returns: 'Promise<any>',
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
calculationValidate: {
|
|
38
|
+
title: 'calculationValidate',
|
|
39
|
+
desc: 'Validates before advancing to the next step. Same scope as calculation.',
|
|
40
|
+
params: [
|
|
41
|
+
{ name: 'form', desc: 'Form field values (read)' },
|
|
42
|
+
{ name: 'data', desc: 'Reactive page state (read)' },
|
|
43
|
+
{ name: 'setData', desc: 'Write to page state' },
|
|
44
|
+
{ name: 'page', desc: 'stepIndex, goToStep(n), nextStep(), prevStep()' },
|
|
45
|
+
],
|
|
46
|
+
returns: 'true → allow | false → block silently | string → block + show as error',
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
// ── AG Grid column functions ───────────────────────────────────────────────
|
|
50
|
+
valueSetter: {
|
|
51
|
+
title: 'valueSetter',
|
|
52
|
+
desc: 'Called when a cell edit is committed. Must return true to confirm the change.',
|
|
53
|
+
params: [
|
|
54
|
+
{ name: 'params.newValue', desc: 'The new value entered by the user' },
|
|
55
|
+
{ name: 'params.data', desc: 'AG Grid row object — alias as rowData to avoid shadowing page data' },
|
|
56
|
+
{ name: 'params.context', desc: 'Grid context — contains updateRef, nodeName' },
|
|
57
|
+
{ name: 'data', desc: 'Reactive page state (read-only snapshot)' },
|
|
58
|
+
{ name: 'setData', desc: 'Write to page state (triggers re-render)' },
|
|
59
|
+
{ name: 'dataRef', desc: 'Mutable non-reactive store' },
|
|
60
|
+
{ name: 'setRefValue', desc: 'Track the edit in updateRef for batch saves' },
|
|
61
|
+
{ name: 'getNodeRef', desc: 'Get the updateRef for any grid by nodeId' },
|
|
62
|
+
],
|
|
63
|
+
returns: 'boolean — true to accept, false to cancel',
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
valueGetter: {
|
|
67
|
+
title: 'valueGetter',
|
|
68
|
+
desc: 'Derives the displayed cell value. Runs on every render cycle.',
|
|
69
|
+
params: [
|
|
70
|
+
{ name: 'params.data', desc: 'The AG Grid row object' },
|
|
71
|
+
{ name: 'params.context', desc: 'Grid context — contains updateRef, nodeName' },
|
|
72
|
+
{ name: 'data', desc: 'Reactive page state (read)' },
|
|
73
|
+
{ name: 'dataRef', desc: 'Mutable non-reactive store' },
|
|
74
|
+
{ name: 'getRefValue', desc: 'Read a pending edit value from updateRef' },
|
|
75
|
+
],
|
|
76
|
+
returns: 'any — the value to display in the cell',
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
valueFormatter: {
|
|
80
|
+
title: 'valueFormatter',
|
|
81
|
+
desc: 'Formats the cell value for display only. Does not affect the underlying data.',
|
|
82
|
+
params: [
|
|
83
|
+
{ name: 'params.value', desc: 'The raw cell value (from valueGetter or data)' },
|
|
84
|
+
{ name: 'params.data', desc: 'The AG Grid row object' },
|
|
85
|
+
{ name: 'data', desc: 'Reactive page state (read)' },
|
|
86
|
+
],
|
|
87
|
+
returns: 'string — the formatted display string',
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
cellStyle: {
|
|
91
|
+
title: 'cellStyle',
|
|
92
|
+
desc: 'Returns a CSS style object applied directly to the cell element.',
|
|
93
|
+
params: [
|
|
94
|
+
{ name: 'params.value', desc: 'The cell value' },
|
|
95
|
+
{ name: 'params.data', desc: 'The AG Grid row object' },
|
|
96
|
+
{ name: 'data', desc: 'Reactive page state (read)' },
|
|
97
|
+
],
|
|
98
|
+
returns: 'object — CSS properties e.g. { color: "red", fontWeight: "bold" }',
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
tooltipValueGetter: {
|
|
102
|
+
title: 'tooltipValueGetter',
|
|
103
|
+
desc: 'Returns the tooltip string shown on cell hover.',
|
|
104
|
+
params: [
|
|
105
|
+
{ name: 'params.value', desc: 'The cell value' },
|
|
106
|
+
{ name: 'params.data', desc: 'The AG Grid row object' },
|
|
107
|
+
],
|
|
108
|
+
returns: 'string — tooltip text',
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
asyncFetchOptions: {
|
|
112
|
+
title: 'asyncFetchOptions',
|
|
113
|
+
desc: 'Fetches options for MultiSelectEditor. Called on open and on each search term change.',
|
|
114
|
+
params: [
|
|
115
|
+
{ name: 'search', desc: 'Current search string typed by the user' },
|
|
116
|
+
{ name: 'data', desc: 'Reactive page state (read)' },
|
|
117
|
+
{ name: 'setData', desc: 'Write to page state' },
|
|
118
|
+
{ name: 'dataRef', desc: 'Mutable non-reactive store' },
|
|
119
|
+
{ name: 'reportRefs', desc: 'Registry of all grid refs on the page' },
|
|
120
|
+
],
|
|
121
|
+
returns: 'Promise<array> — list of option objects',
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
// ── Custom filter editor (CustomFilterDialog) ─────────────────────────────
|
|
125
|
+
customFilter: {
|
|
126
|
+
title: 'customFilter',
|
|
127
|
+
desc: 'JavaScript code block that builds a custom filter array appended to the main query.',
|
|
128
|
+
params: [
|
|
129
|
+
{ name: 'authContext', desc: 'Auth context — user, permissions, tokens (e.g. authContext.user.id)' },
|
|
130
|
+
{ name: 'filters', desc: 'Current filter array from the dialog' },
|
|
131
|
+
{ name: 'customFilter', desc: 'Declare this array and push filter objects into it — it is returned automatically' },
|
|
132
|
+
],
|
|
133
|
+
returns: 'void — populate the customFilter array, e.g. customFilter = [{ path: "UserId", value: authContext.user.id, method: "Equals" }]',
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
// ── Formatting / conditional expression ───────────────────────────────────
|
|
137
|
+
formattingExpression: {
|
|
138
|
+
title: 'formattingExpression',
|
|
139
|
+
desc: 'JavaScript expression evaluated to produce a style value for conditional formatting.',
|
|
140
|
+
params: [
|
|
141
|
+
{ name: 'value', desc: 'The cell value being formatted' },
|
|
142
|
+
{ name: 'row', desc: 'The full data row object' },
|
|
143
|
+
{ name: 'rowIndex', desc: 'Index of the row in the grid' },
|
|
144
|
+
],
|
|
145
|
+
returns: 'string | number — the resulting CSS value (color, size, etc.)',
|
|
146
|
+
},
|
|
147
|
+
|
|
148
|
+
// ── Generic column params / additional params ─────────────────────────────
|
|
149
|
+
columnParams: {
|
|
150
|
+
title: 'columnParams',
|
|
151
|
+
desc: 'AG Grid column definition properties as key-value pairs (without outer braces). Merged into the colDef object.',
|
|
152
|
+
params: [
|
|
153
|
+
{ name: 'valueFormatter', desc: '(p) => string — format display value' },
|
|
154
|
+
{ name: 'width', desc: 'number — fixed column width in px' },
|
|
155
|
+
{ name: 'minWidth', desc: 'number — minimum column width in px' },
|
|
156
|
+
{ name: 'cellClass', desc: 'string | (p) => string — CSS class on the cell' },
|
|
157
|
+
{ name: 'comparator', desc: '(a, b, nodeA, nodeB, desc) => number — custom sort' },
|
|
158
|
+
],
|
|
159
|
+
returns: 'object — merged into the AG Grid colDef',
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
// ── AG Grid / Report Viewer row action ───────────────────────────────────
|
|
163
|
+
actionButton: {
|
|
164
|
+
title: 'actionButton',
|
|
165
|
+
desc: 'Runs when the user clicks this action in the row ⋮ popover. The full AG Grid row object is available as `rowData`.',
|
|
166
|
+
params: [
|
|
167
|
+
{ name: 'rowData', desc: 'The AG Grid row object — all server-side field values for this row' },
|
|
168
|
+
{ name: 'data', desc: 'Reactive page state (read)' },
|
|
169
|
+
{ name: 'setData', desc: 'Write to page state (triggers re-render)' },
|
|
170
|
+
{ name: 'dataRef', desc: 'Mutable non-reactive store (read/write, no re-render)' },
|
|
171
|
+
{ name: 'reportRefs', desc: 'Registry of all grid refs on the page' },
|
|
172
|
+
{ name: 'openDialog', desc: 'openDialog(key, data?) — open a dialog by Key' },
|
|
173
|
+
{ name: 'closeDialog', desc: 'closeDialog(key) — close a dialog by Key' },
|
|
174
|
+
{ name: 'setRefValue', desc: 'setRefValue(updateRef, rowData, id, field, value) — track pending edits' },
|
|
175
|
+
{ name: 'getRefValue', desc: 'getRefValue(updateRef, rowData, id, field) — read a pending edit value' },
|
|
176
|
+
{ name: 'clearRefRow', desc: 'clearRefRow(updateRef, rowData, id) — remove pending edits for this row' },
|
|
177
|
+
{ name: 'clearAllRef', desc: 'clearAllRef(updateRef) — remove ALL pending edits for the grid' },
|
|
178
|
+
{ name: 'getNodeRef', desc: 'getNodeRef(nodeId?) — get the updateRef for any grid (omit for this grid)' },
|
|
179
|
+
{ name: 'THIS_NODE', desc: 'Sentinel — pass as `node` argument to target the current grid' },
|
|
180
|
+
{ name: 'showToast', desc: "showToast(message, type?) — 'success' | 'error' | 'warning' | 'info'" },
|
|
181
|
+
],
|
|
182
|
+
returns: 'Promise<any>',
|
|
183
|
+
},
|
|
184
|
+
|
|
185
|
+
// ── Tree View node action ─────────────────────────────────────────────────
|
|
186
|
+
treeViewAction: {
|
|
187
|
+
title: 'treeViewAction',
|
|
188
|
+
desc: 'Runs when the user clicks this action button in the Tree View node popover. The clicked node object is available as `node`.',
|
|
189
|
+
params: [
|
|
190
|
+
{ name: 'node', desc: 'The full tree node object that was clicked (all its data fields)' },
|
|
191
|
+
{ name: 'data', desc: 'Reactive page state (read)' },
|
|
192
|
+
{ name: 'setData', desc: 'Write to page state (triggers re-render)' },
|
|
193
|
+
{ name: 'dataRef', desc: 'Mutable non-reactive store (read/write, no re-render)' },
|
|
194
|
+
{ name: 'reportRefs', desc: 'Registry of all grid refs on the page' },
|
|
195
|
+
{ name: 'openDialog', desc: 'openDialog(key, data?) — open a dialog by Key' },
|
|
196
|
+
{ name: 'closeDialog', desc: 'closeDialog(key) — close a dialog by Key' },
|
|
197
|
+
{ name: 'showToast', desc: "showToast(message, type?) — 'success' | 'error' | 'warning' | 'info'" },
|
|
198
|
+
],
|
|
199
|
+
returns: 'Promise<any>',
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
// ── Cell editor params ────────────────────────────────────────────────────
|
|
203
|
+
cellEditorParams: {
|
|
204
|
+
title: 'cellEditorParams',
|
|
205
|
+
desc: 'Object or function returning params passed to the cell editor component.',
|
|
206
|
+
params: [
|
|
207
|
+
{ name: 'values', desc: '(agSelectCellEditor) Array of allowed values' },
|
|
208
|
+
{ name: 'options', desc: '(SelectEditor / AutocompleteEditor) Array of { value, label } or strings' },
|
|
209
|
+
{ name: 'min/max', desc: '(NumberEditor) Numeric bounds' },
|
|
210
|
+
{ name: 'color', desc: '(CheckboxEditor) MUI palette key' },
|
|
211
|
+
],
|
|
212
|
+
returns: 'object — passed directly as props to the editor component',
|
|
213
|
+
},
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ── HelpPopover component ─────────────────────────────────────────────────────
|
|
217
|
+
|
|
218
|
+
export function HelpPopover({ type, iconSx }) {
|
|
219
|
+
const [anchor, setAnchor] = useState(null)
|
|
220
|
+
const help = HELP_CONTENT[type]
|
|
221
|
+
if (!help) return null
|
|
222
|
+
|
|
223
|
+
return (
|
|
224
|
+
<>
|
|
225
|
+
<Tooltip title='Parameter reference'>
|
|
226
|
+
<IconButton
|
|
227
|
+
size='small'
|
|
228
|
+
onClick={e => { e.stopPropagation(); setAnchor(e.currentTarget) }}
|
|
229
|
+
sx={{ color: '#5a7a9a', p: 0.4, '&:hover': { color: '#90caf9' }, ...iconSx }}
|
|
230
|
+
>
|
|
231
|
+
<HelpOutlineOutlined sx={{ fontSize: 15 }} />
|
|
232
|
+
</IconButton>
|
|
233
|
+
</Tooltip>
|
|
234
|
+
|
|
235
|
+
<Popover
|
|
236
|
+
open={Boolean(anchor)}
|
|
237
|
+
anchorEl={anchor}
|
|
238
|
+
onClose={() => setAnchor(null)}
|
|
239
|
+
anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
|
|
240
|
+
transformOrigin={{ vertical: 'top', horizontal: 'left' }}
|
|
241
|
+
sx={{ zIndex: 1600 }}
|
|
242
|
+
PaperProps={{
|
|
243
|
+
sx: {
|
|
244
|
+
bgcolor: '#1a1f2a',
|
|
245
|
+
border: '1px solid #2a3a4a',
|
|
246
|
+
borderRadius: 1.5,
|
|
247
|
+
boxShadow: '0 8px 32px rgba(0,0,0,0.5)',
|
|
248
|
+
p: 2,
|
|
249
|
+
maxWidth: 420,
|
|
250
|
+
minWidth: 280,
|
|
251
|
+
},
|
|
252
|
+
}}
|
|
253
|
+
>
|
|
254
|
+
{/* Title */}
|
|
255
|
+
<Typography sx={{ fontSize: 12, fontWeight: 700, color: '#90caf9', mb: 0.5, fontFamily: 'monospace' }}>
|
|
256
|
+
{help.title}
|
|
257
|
+
</Typography>
|
|
258
|
+
<Typography sx={{ fontSize: 11, color: '#8a9ab0', mb: 1.5, lineHeight: 1.5 }}>
|
|
259
|
+
{help.desc}
|
|
260
|
+
</Typography>
|
|
261
|
+
|
|
262
|
+
{/* Params */}
|
|
263
|
+
{help.params.length > 0 && (
|
|
264
|
+
<>
|
|
265
|
+
<Typography sx={{ fontSize: 10, fontWeight: 700, letterSpacing: '0.1em', textTransform: 'uppercase', color: '#445', mb: 0.75 }}>
|
|
266
|
+
Available
|
|
267
|
+
</Typography>
|
|
268
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.5, mb: 1.5 }}>
|
|
269
|
+
{help.params.map(p => (
|
|
270
|
+
<Box key={p.name} sx={{ display: 'flex', gap: 1, alignItems: 'flex-start' }}>
|
|
271
|
+
<Typography sx={{ fontSize: 11, color: '#aed581', fontFamily: 'monospace', flexShrink: 0, minWidth: 130 }}>
|
|
272
|
+
{p.name}
|
|
273
|
+
</Typography>
|
|
274
|
+
<Typography sx={{ fontSize: 11, color: '#7a8fa0', lineHeight: 1.4 }}>
|
|
275
|
+
{p.desc}
|
|
276
|
+
</Typography>
|
|
277
|
+
</Box>
|
|
278
|
+
))}
|
|
279
|
+
</Box>
|
|
280
|
+
</>
|
|
281
|
+
)}
|
|
282
|
+
|
|
283
|
+
{/* Returns */}
|
|
284
|
+
<Box sx={{ borderTop: '1px solid #2a3a4a', pt: 1 }}>
|
|
285
|
+
<Typography sx={{ fontSize: 10, fontWeight: 700, letterSpacing: '0.1em', textTransform: 'uppercase', color: '#445', mb: 0.5 }}>
|
|
286
|
+
Returns / Result
|
|
287
|
+
</Typography>
|
|
288
|
+
<Typography sx={{ fontSize: 11, color: '#ffcc80', fontFamily: 'monospace', whiteSpace: 'pre-wrap' }}>
|
|
289
|
+
{help.returns}
|
|
290
|
+
</Typography>
|
|
291
|
+
</Box>
|
|
292
|
+
</Popover>
|
|
293
|
+
</>
|
|
294
|
+
)
|
|
295
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Box, TextField, Tooltip } from '@mui/material'
|
|
2
|
+
import JSEditor from '../../JSEditor'
|
|
3
|
+
import { resolveIcon } from 'services/builderHelper/iconResolver'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Inspector field for icon / text adornment values.
|
|
7
|
+
*
|
|
8
|
+
* • User types an MUI icon name (e.g. "SearchOutlined") → shows icon preview
|
|
9
|
+
* • User types plain text (e.g. "$" or "kg") → shows text preview
|
|
10
|
+
* • Expression mode toggle via JSEditor button (same as other field editors)
|
|
11
|
+
*
|
|
12
|
+
* Stored value shape (same as every other field):
|
|
13
|
+
* { valueType: 'value', value: 'SearchOutlined' }
|
|
14
|
+
* { valueType: 'expression', expression: { type: 'js', code: '...' } }
|
|
15
|
+
*/
|
|
16
|
+
export default function IconEditor({ field, onChange }) {
|
|
17
|
+
const safeField = field ?? { valueType: 'value', value: '' }
|
|
18
|
+
const isExpr = safeField.valueType === 'expression'
|
|
19
|
+
const rawValue = isExpr ? '' : (safeField.value ?? '')
|
|
20
|
+
|
|
21
|
+
// Resolve preview
|
|
22
|
+
const Icon = !isExpr && rawValue ? resolveIcon(rawValue) : null
|
|
23
|
+
const hasText = !isExpr && rawValue && !Icon
|
|
24
|
+
const previewTip = Icon ? rawValue : (hasText ? `Text: "${rawValue}"` : '')
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<Box display='flex' alignItems='center' gap={0.5}>
|
|
28
|
+
<TextField
|
|
29
|
+
size='small'
|
|
30
|
+
fullWidth
|
|
31
|
+
disabled={isExpr}
|
|
32
|
+
value={rawValue}
|
|
33
|
+
placeholder={isExpr ? 'Using expression' : 'Icon name or text…'}
|
|
34
|
+
onChange={e => onChange?.({ valueType: 'value', value: e.target.value })}
|
|
35
|
+
InputProps={{
|
|
36
|
+
endAdornment: (
|
|
37
|
+
<Tooltip title={previewTip} placement='top' disableHoverListener={!previewTip}>
|
|
38
|
+
<Box
|
|
39
|
+
sx={{
|
|
40
|
+
display: 'flex',
|
|
41
|
+
alignItems: 'center',
|
|
42
|
+
pr: 0.5,
|
|
43
|
+
color: 'text.secondary',
|
|
44
|
+
fontSize: 13,
|
|
45
|
+
minWidth: 20,
|
|
46
|
+
}}
|
|
47
|
+
>
|
|
48
|
+
{Icon && <Icon sx={{ fontSize: 18 }} />}
|
|
49
|
+
{hasText && rawValue}
|
|
50
|
+
</Box>
|
|
51
|
+
</Tooltip>
|
|
52
|
+
),
|
|
53
|
+
}}
|
|
54
|
+
/>
|
|
55
|
+
|
|
56
|
+
<JSEditor
|
|
57
|
+
value={isExpr ? undefined : rawValue}
|
|
58
|
+
expression={safeField.expression}
|
|
59
|
+
mode={isExpr ? 'expression' : 'value'}
|
|
60
|
+
onChange={payload => onChange?.(payload)}
|
|
61
|
+
/>
|
|
62
|
+
</Box>
|
|
63
|
+
)
|
|
64
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { useState } from 'react'
|
|
2
|
+
import { Box, Button, Chip, IconButton, Tooltip, Typography } from '@mui/material'
|
|
3
|
+
import { Close, DeleteOutlined, Fullscreen, FullscreenExit } from '@mui/icons-material'
|
|
4
|
+
import { CodeBraces } from 'mdi-material-ui'
|
|
5
|
+
import Editor from '@monaco-editor/react'
|
|
6
|
+
import { HelpPopover } from './FunctionHelpPopover'
|
|
7
|
+
|
|
8
|
+
// ── Monaco options — identical to ColumnFunctionEditor ────────────────────────
|
|
9
|
+
|
|
10
|
+
const EDITOR_OPTIONS = {
|
|
11
|
+
minimap: { enabled: false },
|
|
12
|
+
fontFamily: "Menlo, Monaco, 'Courier New', monospace",
|
|
13
|
+
fontSize: 13,
|
|
14
|
+
lineNumbers: 'on',
|
|
15
|
+
wordWrap: 'on',
|
|
16
|
+
scrollBeyondLastLine: false,
|
|
17
|
+
automaticLayout: true,
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function buildTemplate(contextVars = []) {
|
|
21
|
+
const varLines = contextVars.length
|
|
22
|
+
? contextVars.map(v => ` // ${v}`).join('\n')
|
|
23
|
+
: ' // (no extra variables for this event)'
|
|
24
|
+
|
|
25
|
+
return `async function Calculation(form, data, setData, dataRef, reportRefs, openDialog, closeDialog, urlParams, page) {
|
|
26
|
+
// Available click variables:
|
|
27
|
+
${varLines}
|
|
28
|
+
|
|
29
|
+
// Examples:
|
|
30
|
+
// setData(prev => ({ ...prev, selected: clickedItem }))
|
|
31
|
+
// openDialog('myDialog', { data: { row: clickedItem } })
|
|
32
|
+
// showToast('Selected: ' + clickedLabel, 'info')
|
|
33
|
+
}
|
|
34
|
+
`
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ── Component ─────────────────────────────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Inspector field for a single KPI event action.
|
|
41
|
+
* Renders identically to ColumnFunctionEditor (slide-up panel, HelpPopover, fullscreen).
|
|
42
|
+
*
|
|
43
|
+
* Props:
|
|
44
|
+
* label — field label shown in FieldWrapper
|
|
45
|
+
* contextVars — string[] of variables injected at click time (shown as chips in panel header)
|
|
46
|
+
* value — { actionType: 'custom', code: '...' } | undefined | null
|
|
47
|
+
* onChange — (newVal) => void (newVal is the action object or null to clear)
|
|
48
|
+
*/
|
|
49
|
+
export default function KpiActionField({ label, contextVars = [], value, onChange }) {
|
|
50
|
+
const [open, setOpen] = useState(false)
|
|
51
|
+
const [fullscreen, setFullscreen] = useState(false)
|
|
52
|
+
const [draft, setDraft] = useState('')
|
|
53
|
+
|
|
54
|
+
const hasAction = !!value?.code?.trim()
|
|
55
|
+
|
|
56
|
+
const handleOpen = () => {
|
|
57
|
+
setDraft(value?.code?.trim() || buildTemplate(contextVars))
|
|
58
|
+
setOpen(true)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const handleClose = () => {
|
|
62
|
+
setOpen(false)
|
|
63
|
+
setFullscreen(false)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const handleSave = () => {
|
|
67
|
+
const trimmed = draft.trim()
|
|
68
|
+
onChange(trimmed ? { actionType: 'custom', code: trimmed } : null)
|
|
69
|
+
handleClose()
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const handleClear = (e) => {
|
|
73
|
+
e.stopPropagation()
|
|
74
|
+
onChange(null)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// First meaningful line for the inline preview
|
|
78
|
+
const preview = hasAction
|
|
79
|
+
? value.code.split('\n').find(l => {
|
|
80
|
+
const t = l.trim()
|
|
81
|
+
return t && !t.startsWith('//') && !t.startsWith('async function') && !t.startsWith('}')
|
|
82
|
+
}) ?? '(code set)'
|
|
83
|
+
: null
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<>
|
|
87
|
+
{/* ── Inline inspector row ── */}
|
|
88
|
+
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5, width: '100%' }}>
|
|
89
|
+
{/* Code preview / placeholder — clicking opens the editor */}
|
|
90
|
+
<Box
|
|
91
|
+
onClick={handleOpen}
|
|
92
|
+
sx={{
|
|
93
|
+
flex: 1, minWidth: 0, cursor: 'pointer',
|
|
94
|
+
px: 1, py: 0.4, borderRadius: 1,
|
|
95
|
+
bgcolor: 'action.hover',
|
|
96
|
+
'&:hover': { bgcolor: 'action.selected' },
|
|
97
|
+
}}
|
|
98
|
+
>
|
|
99
|
+
<Typography noWrap sx={{
|
|
100
|
+
fontSize: 11, fontFamily: 'monospace',
|
|
101
|
+
color: hasAction ? '#aed581' : 'text.disabled',
|
|
102
|
+
}}>
|
|
103
|
+
{preview ?? `(no action)`}
|
|
104
|
+
</Typography>
|
|
105
|
+
</Box>
|
|
106
|
+
|
|
107
|
+
{/* Open editor */}
|
|
108
|
+
<Tooltip title={`Open ${label ?? 'action'} editor`}>
|
|
109
|
+
<IconButton size='small' onClick={handleOpen} sx={{ color: hasAction ? '#aed581' : '#555', p: 0.4 }}>
|
|
110
|
+
<CodeBraces fontSize='small' />
|
|
111
|
+
</IconButton>
|
|
112
|
+
</Tooltip>
|
|
113
|
+
|
|
114
|
+
{/* Clear */}
|
|
115
|
+
{hasAction && (
|
|
116
|
+
<Tooltip title='Clear action'>
|
|
117
|
+
<IconButton size='small' onClick={handleClear} sx={{ color: 'text.disabled', p: 0.4 }}>
|
|
118
|
+
<DeleteOutlined sx={{ fontSize: 15 }} />
|
|
119
|
+
</IconButton>
|
|
120
|
+
</Tooltip>
|
|
121
|
+
)}
|
|
122
|
+
</Box>
|
|
123
|
+
|
|
124
|
+
{/* ── Slide-up editor panel — same style as ColumnFunctionEditor ── */}
|
|
125
|
+
{open && (
|
|
126
|
+
<Box sx={{
|
|
127
|
+
position: 'fixed',
|
|
128
|
+
bottom: 0,
|
|
129
|
+
left: 0,
|
|
130
|
+
right: 0,
|
|
131
|
+
top: fullscreen ? 0 : 'auto',
|
|
132
|
+
height: fullscreen ? '100vh' : '55vh',
|
|
133
|
+
bgcolor: '#1e1e1e',
|
|
134
|
+
zIndex: 1500,
|
|
135
|
+
borderTop: fullscreen ? 'none' : '2px solid #2a3a4a',
|
|
136
|
+
display: 'flex',
|
|
137
|
+
flexDirection: 'column',
|
|
138
|
+
transition: 'height 0.15s ease, top 0.15s ease',
|
|
139
|
+
}}>
|
|
140
|
+
{/* Header */}
|
|
141
|
+
<Box sx={{
|
|
142
|
+
display: 'flex',
|
|
143
|
+
alignItems: 'center',
|
|
144
|
+
justifyContent: 'space-between',
|
|
145
|
+
px: 2, py: 0.8,
|
|
146
|
+
bgcolor: '#252526',
|
|
147
|
+
borderBottom: '1px solid #333',
|
|
148
|
+
flexShrink: 0,
|
|
149
|
+
gap: 1,
|
|
150
|
+
}}>
|
|
151
|
+
{/* Left: icon + label + context chips */}
|
|
152
|
+
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap', flex: 1, minWidth: 0 }}>
|
|
153
|
+
<CodeBraces sx={{ fontSize: 14, color: '#7b8ea0', flexShrink: 0 }} />
|
|
154
|
+
<Typography sx={{ fontSize: 12, color: '#90caf9', fontWeight: 600, letterSpacing: '0.05em', flexShrink: 0 }}>
|
|
155
|
+
{label}
|
|
156
|
+
</Typography>
|
|
157
|
+
{contextVars.length > 0 && (
|
|
158
|
+
<>
|
|
159
|
+
<Typography sx={{ fontSize: 11, color: '#555', flexShrink: 0 }}>·</Typography>
|
|
160
|
+
{contextVars.map(v => (
|
|
161
|
+
<Chip
|
|
162
|
+
key={v}
|
|
163
|
+
label={v}
|
|
164
|
+
size='small'
|
|
165
|
+
sx={{
|
|
166
|
+
fontSize: 10, fontFamily: 'monospace', height: 18,
|
|
167
|
+
bgcolor: '#1e2a1e', color: '#aed581',
|
|
168
|
+
border: '1px solid #2e4a2e',
|
|
169
|
+
'& .MuiChip-label': { px: 0.75 },
|
|
170
|
+
}}
|
|
171
|
+
/>
|
|
172
|
+
))}
|
|
173
|
+
</>
|
|
174
|
+
)}
|
|
175
|
+
</Box>
|
|
176
|
+
|
|
177
|
+
{/* Right: help + fullscreen + close */}
|
|
178
|
+
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5, flexShrink: 0 }}>
|
|
179
|
+
<HelpPopover type='calculation' />
|
|
180
|
+
<Tooltip title={fullscreen ? 'Exit fullscreen' : 'Fullscreen'}>
|
|
181
|
+
<IconButton size='small' onClick={() => setFullscreen(f => !f)} sx={{ color: '#666' }}>
|
|
182
|
+
{fullscreen
|
|
183
|
+
? <FullscreenExit sx={{ fontSize: 16 }} />
|
|
184
|
+
: <Fullscreen sx={{ fontSize: 16 }} />}
|
|
185
|
+
</IconButton>
|
|
186
|
+
</Tooltip>
|
|
187
|
+
<IconButton size='small' onClick={handleClose} sx={{ color: '#666' }}>
|
|
188
|
+
<Close sx={{ fontSize: 16 }} />
|
|
189
|
+
</IconButton>
|
|
190
|
+
</Box>
|
|
191
|
+
</Box>
|
|
192
|
+
|
|
193
|
+
{/* Monaco editor */}
|
|
194
|
+
<Box sx={{ flex: 1, minHeight: 0 }}>
|
|
195
|
+
<Editor
|
|
196
|
+
height='100%'
|
|
197
|
+
defaultLanguage='javascript'
|
|
198
|
+
theme='vs-dark'
|
|
199
|
+
value={draft}
|
|
200
|
+
options={EDITOR_OPTIONS}
|
|
201
|
+
onChange={v => setDraft(v ?? '')}
|
|
202
|
+
onMount={editor => editor.focus()}
|
|
203
|
+
/>
|
|
204
|
+
</Box>
|
|
205
|
+
|
|
206
|
+
{/* Footer */}
|
|
207
|
+
<Box sx={{
|
|
208
|
+
display: 'flex',
|
|
209
|
+
gap: 1,
|
|
210
|
+
justifyContent: 'flex-end',
|
|
211
|
+
px: 2, py: 1,
|
|
212
|
+
bgcolor: '#252526',
|
|
213
|
+
borderTop: '1px solid #333',
|
|
214
|
+
flexShrink: 0,
|
|
215
|
+
}}>
|
|
216
|
+
<Button size='small' onClick={handleClose} sx={{ color: '#888' }}>Cancel</Button>
|
|
217
|
+
<Button size='small' variant='contained' color='primary' onClick={handleSave}>Apply</Button>
|
|
218
|
+
</Box>
|
|
219
|
+
</Box>
|
|
220
|
+
)}
|
|
221
|
+
</>
|
|
222
|
+
)
|
|
223
|
+
}
|