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,481 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react'
|
|
2
|
+
import { createPortal } from 'react-dom'
|
|
3
|
+
import { Box, Dialog, DialogContent, IconButton, Tooltip, Button, CircularProgress } from '@mui/material'
|
|
4
|
+
import { CloseOutlined, PrintOutlined } from '@mui/icons-material'
|
|
5
|
+
import ComponentRenderer from './ComponentRenderer'
|
|
6
|
+
import { Endpoints, Services } from 'services/Endpoints'
|
|
7
|
+
import PrintPreviewCanvas from 'views/printBuilder/PrintPreviewCanvas'
|
|
8
|
+
|
|
9
|
+
const PRINT_STYLE_ID = '__rbb_print_style__'
|
|
10
|
+
|
|
11
|
+
const PAGE_SIZE_NAMES = { A4: 'A4', Letter: 'letter', Legal: 'legal' }
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
// ── CSS injected when print schema is available ───────────────────────────────
|
|
15
|
+
//
|
|
16
|
+
// Strategy (table-based, cross-browser):
|
|
17
|
+
// • @page — paper size + body margins only (NO header/footer height added)
|
|
18
|
+
// • <thead> — repeats automatically at the top of every printed page
|
|
19
|
+
// • <tfoot> — repeats automatically at the bottom of every printed page
|
|
20
|
+
// • <tbody> <tr>s — body pages that paginate naturally
|
|
21
|
+
// • #__rbb_print_portal__ is a Portal appended directly to <body>.
|
|
22
|
+
// On screen it is hidden via CSS; on print the Dialog is hidden and the
|
|
23
|
+
// portal is revealed — this also covers Ctrl+P (no JS needed).
|
|
24
|
+
//
|
|
25
|
+
function buildPrintCSS(settings = {}) {
|
|
26
|
+
const pageSize = PAGE_SIZE_NAMES[settings.pageSize] ?? 'A4'
|
|
27
|
+
const orient = settings.orientation ?? 'portrait'
|
|
28
|
+
const m = settings.margins ?? { top: 0, right: 0, bottom: 0, left: 0 }
|
|
29
|
+
const hEnabled = settings.header?.enabled
|
|
30
|
+
const fEnabled = settings.footer?.enabled
|
|
31
|
+
const hH = hEnabled ? (settings.header?.height ?? 10) : 0 // mm
|
|
32
|
+
const fH = fEnabled ? (settings.footer?.height ?? 10) : 0 // mm
|
|
33
|
+
|
|
34
|
+
// ── Watermark ─────────────────────────────────────────────────────────────
|
|
35
|
+
const wm = settings.watermark ?? {}
|
|
36
|
+
const wmEnabled = wm.enabled && wm.text
|
|
37
|
+
const wmFontSize = wm.fontSize ?? 60
|
|
38
|
+
const wmAngle = wm.angle ?? -45
|
|
39
|
+
const wmOpacity = wm.opacity ?? 0.1
|
|
40
|
+
const wmColor = wm.color ?? '#000000'
|
|
41
|
+
|
|
42
|
+
// ── Print CSS strategy ────────────────────────────────────────────────────
|
|
43
|
+
// @page margin = 0. Zones are full-paper-edge (top/bottom/left/right = 0).
|
|
44
|
+
// Page margins (m.*) are expressed as PADDING inside each zone container —
|
|
45
|
+
// they are NOT added to the zone's height or position offset.
|
|
46
|
+
//
|
|
47
|
+
// Header top:0 left:0 right:0 height=hH mm (exact configured height)
|
|
48
|
+
// padding: m.top m.right 0 m.left → margins live inside the zone
|
|
49
|
+
//
|
|
50
|
+
// Footer bottom:0 left:0 right:0 height=fH mm
|
|
51
|
+
// padding: 0 m.right m.bottom m.left
|
|
52
|
+
//
|
|
53
|
+
// Body page padding-top=hH padding-bottom=fH (push content past zones)
|
|
54
|
+
// padding-left/right = m.left/right (side margins inside body)
|
|
55
|
+
// min-height:100vh = one full paper per zone
|
|
56
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
57
|
+
return `
|
|
58
|
+
@page {
|
|
59
|
+
size: ${pageSize} ${orient};
|
|
60
|
+
margin: 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* ── Screen: keep the portal invisible ── */
|
|
64
|
+
#__rbb_print_portal__ { display: none; }
|
|
65
|
+
|
|
66
|
+
@media print {
|
|
67
|
+
/* ── Hide everything except the portal ── */
|
|
68
|
+
.MuiModal-root,
|
|
69
|
+
.MuiModal-backdrop,
|
|
70
|
+
body > *:not(#__rbb_print_portal__) { display: none !important; }
|
|
71
|
+
|
|
72
|
+
body {
|
|
73
|
+
background: white !important;
|
|
74
|
+
margin: 0 !important; padding: 0 !important;
|
|
75
|
+
}
|
|
76
|
+
#__rbb_print_portal__ {
|
|
77
|
+
display: block !important;
|
|
78
|
+
width: 100%;
|
|
79
|
+
margin: 0 !important; padding: 0 !important;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* ── Header — full paper edge, exact configured height, margins as padding ── */
|
|
83
|
+
.rbb-print-header {
|
|
84
|
+
position: fixed;
|
|
85
|
+
top: 0; left: 0; right: 0;
|
|
86
|
+
height: ${hH}mm;
|
|
87
|
+
padding: ${m.top}mm ${m.right}mm 0 ${m.left}mm;
|
|
88
|
+
box-sizing: border-box;
|
|
89
|
+
overflow: hidden;
|
|
90
|
+
border-bottom: ${hEnabled ? '1px solid #e0e0e0' : 'none'};
|
|
91
|
+
background: white;
|
|
92
|
+
z-index: 1;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* ── Footer — full paper edge, exact configured height, margins as padding ── */
|
|
96
|
+
.rbb-print-footer {
|
|
97
|
+
position: fixed;
|
|
98
|
+
bottom: 0; left: 0; right: 0;
|
|
99
|
+
height: ${fH}mm;
|
|
100
|
+
padding: 0 ${m.right}mm ${m.bottom}mm ${m.left}mm;
|
|
101
|
+
box-sizing: border-box;
|
|
102
|
+
overflow: hidden;
|
|
103
|
+
border-top: ${fEnabled ? '1px solid #e0e0e0' : 'none'};
|
|
104
|
+
background: white;
|
|
105
|
+
z-index: 1;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* ── Body container ── */
|
|
109
|
+
.rbb-print-body { margin: 0; padding: 0; }
|
|
110
|
+
|
|
111
|
+
/* ── Individual page zones ── */
|
|
112
|
+
/* padding-top/bottom = exact zone heights so body content clears the zones.
|
|
113
|
+
padding-left/right = page side margins expressed as body padding.
|
|
114
|
+
min-height:100vh = one full paper page per zone. */
|
|
115
|
+
.rbb-print-page {
|
|
116
|
+
box-sizing: border-box;
|
|
117
|
+
min-height: 100vh;
|
|
118
|
+
padding-top: ${hH}mm;
|
|
119
|
+
padding-bottom: ${fH}mm;
|
|
120
|
+
padding-left: ${m.left}mm;
|
|
121
|
+
padding-right: ${m.right}mm;
|
|
122
|
+
page-break-inside: avoid;
|
|
123
|
+
break-inside: avoid;
|
|
124
|
+
}
|
|
125
|
+
/* Each zone → its own physical page; skip last to avoid a blank trailing page */
|
|
126
|
+
.rbb-print-page:not(:last-child) {
|
|
127
|
+
page-break-after: always;
|
|
128
|
+
break-after: page;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* ── Watermark ── */
|
|
132
|
+
${wmEnabled ? `
|
|
133
|
+
.rbb-watermark {
|
|
134
|
+
position: fixed;
|
|
135
|
+
top: 50%; left: 50%;
|
|
136
|
+
transform: translate(-50%, -50%) rotate(${wmAngle}deg);
|
|
137
|
+
font-size: ${wmFontSize}pt;
|
|
138
|
+
color: ${wmColor};
|
|
139
|
+
opacity: ${wmOpacity};
|
|
140
|
+
pointer-events: none;
|
|
141
|
+
white-space: nowrap;
|
|
142
|
+
user-select: none;
|
|
143
|
+
z-index: 9999;
|
|
144
|
+
font-weight: 700;
|
|
145
|
+
}` : ''}
|
|
146
|
+
}
|
|
147
|
+
`
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function injectPrintStyle(settings) {
|
|
151
|
+
document.getElementById(PRINT_STYLE_ID)?.remove()
|
|
152
|
+
const style = document.createElement('style')
|
|
153
|
+
style.id = PRINT_STYLE_ID
|
|
154
|
+
style.innerHTML = buildPrintCSS(settings)
|
|
155
|
+
document.head.appendChild(style)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function removePrintStyle() {
|
|
159
|
+
document.getElementById(PRINT_STYLE_ID)?.remove()
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ── Plain HTML table (used by ReportViewer in print context) ─────────────────
|
|
163
|
+
function printCellText(value) {
|
|
164
|
+
if (value === null || value === undefined) return ''
|
|
165
|
+
if (typeof value === 'object') {
|
|
166
|
+
try { return JSON.stringify(value) } catch { return String(value) }
|
|
167
|
+
}
|
|
168
|
+
return String(value)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function PrintTable({ columns = [], rows = [] }) {
|
|
172
|
+
return (
|
|
173
|
+
<Box component='table' sx={{
|
|
174
|
+
width: '100%', borderCollapse: 'collapse', fontSize: 12, fontFamily: 'inherit',
|
|
175
|
+
}}>
|
|
176
|
+
<thead>
|
|
177
|
+
<tr>
|
|
178
|
+
{columns.map((col, i) => (
|
|
179
|
+
<th key={i} style={{ border: '1px solid #ccc', padding: '6px 8px',
|
|
180
|
+
textAlign: 'left', backgroundColor: '#f0f0f0', fontWeight: 600 }}>
|
|
181
|
+
{col.headerName || col.field || col.label || ''}
|
|
182
|
+
</th>
|
|
183
|
+
))}
|
|
184
|
+
</tr>
|
|
185
|
+
</thead>
|
|
186
|
+
<tbody>
|
|
187
|
+
{rows.map((row, ri) => (
|
|
188
|
+
<tr key={ri}>
|
|
189
|
+
{columns.map((col, ci) => (
|
|
190
|
+
<td key={ci} style={{ border: '1px solid #ccc', padding: '5px 8px' }}>
|
|
191
|
+
{printCellText(row[col.field])}
|
|
192
|
+
</td>
|
|
193
|
+
))}
|
|
194
|
+
</tr>
|
|
195
|
+
))}
|
|
196
|
+
</tbody>
|
|
197
|
+
</Box>
|
|
198
|
+
)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// ── PrintDialog ───────────────────────────────────────────────────────────────
|
|
202
|
+
export default function PrintDialog({ viewerContext }) {
|
|
203
|
+
const [open, setOpen] = useState(false)
|
|
204
|
+
const [loading, setLoading] = useState(false)
|
|
205
|
+
const [printSchema, setPrintSchema] = useState(null)
|
|
206
|
+
const [printData, setPrintData] = useState({})
|
|
207
|
+
|
|
208
|
+
const { printDialogRef } = viewerContext
|
|
209
|
+
|
|
210
|
+
useEffect(() => {
|
|
211
|
+
if (!printDialogRef) return
|
|
212
|
+
printDialogRef.current = {
|
|
213
|
+
// Normal usage: fetch layout by ID then open
|
|
214
|
+
open: (layoutId, data = {}) => {
|
|
215
|
+
setPrintData(data)
|
|
216
|
+
setOpen(true)
|
|
217
|
+
loadLayout(layoutId)
|
|
218
|
+
},
|
|
219
|
+
// Test Print / builder usage: schema already in memory, skip the API fetch
|
|
220
|
+
openWithSchema: (schema, data = {}) => {
|
|
221
|
+
setPrintData(data)
|
|
222
|
+
setPrintSchema(schema)
|
|
223
|
+
setLoading(false)
|
|
224
|
+
setOpen(true)
|
|
225
|
+
},
|
|
226
|
+
close: () => setOpen(false),
|
|
227
|
+
}
|
|
228
|
+
return () => { if (printDialogRef.current) printDialogRef.current = null }
|
|
229
|
+
}, [printDialogRef])
|
|
230
|
+
|
|
231
|
+
const loadLayout = async (layoutId) => {
|
|
232
|
+
if (!layoutId) return
|
|
233
|
+
setLoading(true)
|
|
234
|
+
setPrintSchema(null)
|
|
235
|
+
try {
|
|
236
|
+
const response = await Services.GetService(
|
|
237
|
+
Endpoints.PrintLayout.Get.GetById, false, { id: layoutId }
|
|
238
|
+
)
|
|
239
|
+
if (response?.data?.value) setPrintSchema(JSON.parse(response.data.value))
|
|
240
|
+
} catch (err) {
|
|
241
|
+
console.error('[PrintDialog] Failed to load layout:', err)
|
|
242
|
+
} finally {
|
|
243
|
+
setLoading(false)
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Inject print CSS as soon as schema is ready so Ctrl+P also works correctly.
|
|
248
|
+
// CSS hides the portal on screen and hides the Dialog on print.
|
|
249
|
+
useEffect(() => {
|
|
250
|
+
if (printSchema) {
|
|
251
|
+
injectPrintStyle(printSchema.settings)
|
|
252
|
+
} else {
|
|
253
|
+
removePrintStyle()
|
|
254
|
+
}
|
|
255
|
+
return () => removePrintStyle()
|
|
256
|
+
}, [printSchema])
|
|
257
|
+
|
|
258
|
+
// ── Fill .rbb-page-number spans with real numbers before window.print() ──
|
|
259
|
+
//
|
|
260
|
+
// Strategy for fixed header/footer with page numbers:
|
|
261
|
+
// position:fixed elements are painted once and shown identically on every
|
|
262
|
+
// physical page — the browser never rerenders them per-page. So we:
|
|
263
|
+
// 1. Clone the fixed zone once per body-page, each with the correct number.
|
|
264
|
+
// 2. Position each clone absolutely inside its body-page div (which already
|
|
265
|
+
// has the correct padding-top/bottom so it fills one full printed page).
|
|
266
|
+
// 3. Inject a temporary <style> that hides the global fixed zone during print.
|
|
267
|
+
// 4. Restore everything via the afterprint event.
|
|
268
|
+
//
|
|
269
|
+
function injectPageNumbers() {
|
|
270
|
+
const portal = document.getElementById('__rbb_print_portal__')
|
|
271
|
+
if (!portal) return
|
|
272
|
+
|
|
273
|
+
const pages = [...portal.querySelectorAll('.rbb-print-page')]
|
|
274
|
+
const total = pages.length
|
|
275
|
+
|
|
276
|
+
// ── 1. Body pages — straightforward, index is known ──────────────────────
|
|
277
|
+
pages.forEach((pageEl, idx) => {
|
|
278
|
+
pageEl.querySelectorAll('.rbb-page-number').forEach(span => {
|
|
279
|
+
const fmt = span.dataset.format ?? 'Page {page} of {pages}'
|
|
280
|
+
span.textContent = fmt
|
|
281
|
+
.replace('{page}', String(idx + 1))
|
|
282
|
+
.replace('{pages}', String(total))
|
|
283
|
+
})
|
|
284
|
+
})
|
|
285
|
+
|
|
286
|
+
// ── 2. Fixed header / footer — clone per page ─────────────────────────────
|
|
287
|
+
const headerEl = portal.querySelector('.rbb-print-header')
|
|
288
|
+
const footerEl = portal.querySelector('.rbb-print-footer')
|
|
289
|
+
const headerHasPN = !!headerEl?.querySelector('.rbb-page-number')
|
|
290
|
+
const footerHasPN = !!footerEl?.querySelector('.rbb-page-number')
|
|
291
|
+
|
|
292
|
+
if (!headerHasPN && !footerHasPN) return // nothing to do
|
|
293
|
+
|
|
294
|
+
// Mark the originals with a unique hide-class so the temp style targets ONLY
|
|
295
|
+
// the global fixed zone — not the clones (which also carry the zone class).
|
|
296
|
+
const HIDE_HEADER = '__rbb_hide_header__'
|
|
297
|
+
const HIDE_FOOTER = '__rbb_hide_footer__'
|
|
298
|
+
if (headerHasPN) headerEl.classList.add(HIDE_HEADER)
|
|
299
|
+
if (footerHasPN) footerEl.classList.add(HIDE_FOOTER)
|
|
300
|
+
|
|
301
|
+
const tmpStyle = document.createElement('style')
|
|
302
|
+
tmpStyle.id = '__rbb_pn_tmp_style__'
|
|
303
|
+
let hideCss = '@media print {\n'
|
|
304
|
+
if (headerHasPN) hideCss += ` .${HIDE_HEADER} { display: none !important; }\n`
|
|
305
|
+
if (footerHasPN) hideCss += ` .${HIDE_FOOTER} { display: none !important; }\n`
|
|
306
|
+
hideCss += '}'
|
|
307
|
+
tmpStyle.textContent = hideCss
|
|
308
|
+
document.head.appendChild(tmpStyle)
|
|
309
|
+
|
|
310
|
+
// Clone into each page with the correct page number.
|
|
311
|
+
// Clones do NOT carry the hide-class so they remain visible in print.
|
|
312
|
+
pages.forEach((pageEl, idx) => {
|
|
313
|
+
pageEl.style.position = 'relative' // needed for absolute child positioning
|
|
314
|
+
|
|
315
|
+
if (headerHasPN) {
|
|
316
|
+
const clone = headerEl.cloneNode(true)
|
|
317
|
+
clone.classList.remove(HIDE_HEADER) // must NOT be hidden
|
|
318
|
+
clone.classList.add('__rbb_pn_clone__')
|
|
319
|
+
Object.assign(clone.style, {
|
|
320
|
+
position: 'absolute', top: '0', left: '0', right: '0',
|
|
321
|
+
display: 'block',
|
|
322
|
+
})
|
|
323
|
+
clone.querySelectorAll('.rbb-page-number').forEach(span => {
|
|
324
|
+
const fmt = span.dataset.format ?? 'Page {page} of {pages}'
|
|
325
|
+
span.textContent = fmt.replace('{page}', idx + 1).replace('{pages}', total)
|
|
326
|
+
})
|
|
327
|
+
pageEl.prepend(clone)
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if (footerHasPN) {
|
|
331
|
+
const clone = footerEl.cloneNode(true)
|
|
332
|
+
clone.classList.remove(HIDE_FOOTER) // must NOT be hidden
|
|
333
|
+
clone.classList.add('__rbb_pn_clone__')
|
|
334
|
+
Object.assign(clone.style, {
|
|
335
|
+
position: 'absolute', bottom: '0', left: '0', right: '0',
|
|
336
|
+
display: 'block',
|
|
337
|
+
})
|
|
338
|
+
clone.querySelectorAll('.rbb-page-number').forEach(span => {
|
|
339
|
+
const fmt = span.dataset.format ?? 'Page {page} of {pages}'
|
|
340
|
+
span.textContent = fmt.replace('{page}', idx + 1).replace('{pages}', total)
|
|
341
|
+
})
|
|
342
|
+
pageEl.appendChild(clone)
|
|
343
|
+
}
|
|
344
|
+
})
|
|
345
|
+
|
|
346
|
+
// ── 3. Restore after print ────────────────────────────────────────────────
|
|
347
|
+
const cleanup = () => {
|
|
348
|
+
document.getElementById('__rbb_pn_tmp_style__')?.remove()
|
|
349
|
+
portal.querySelectorAll('.__rbb_pn_clone__').forEach(el => el.remove())
|
|
350
|
+
headerEl?.classList.remove('__rbb_hide_header__')
|
|
351
|
+
footerEl?.classList.remove('__rbb_hide_footer__')
|
|
352
|
+
pages.forEach(p => p.style.removeProperty('position'))
|
|
353
|
+
window.removeEventListener('afterprint', cleanup)
|
|
354
|
+
}
|
|
355
|
+
window.addEventListener('afterprint', cleanup)
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
const handlePrint = () => {
|
|
359
|
+
// Re-inject with latest settings, close the dialog so it leaves the DOM,
|
|
360
|
+
// then fire window.print() after the MUI exit animation (~300 ms).
|
|
361
|
+
injectPrintStyle(printSchema?.settings)
|
|
362
|
+
setOpen(false)
|
|
363
|
+
setTimeout(() => {
|
|
364
|
+
injectPageNumbers()
|
|
365
|
+
window.print()
|
|
366
|
+
}, 350)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// ── Shared viewerContext for all rendered zones ────────────────────────────
|
|
370
|
+
const makePrintViewerCtx = () => ({
|
|
371
|
+
...viewerContext,
|
|
372
|
+
data: printData,
|
|
373
|
+
setData: () => {},
|
|
374
|
+
form: {},
|
|
375
|
+
setForm: () => {},
|
|
376
|
+
mode: 'preview',
|
|
377
|
+
isEditMode: false,
|
|
378
|
+
isPreviewMode: true,
|
|
379
|
+
isPrintContext: true,
|
|
380
|
+
isPrintBuilder: false,
|
|
381
|
+
builderContext: null,
|
|
382
|
+
})
|
|
383
|
+
|
|
384
|
+
const settings = printSchema?.settings ?? {}
|
|
385
|
+
const hEnabled = settings.header?.enabled
|
|
386
|
+
const fEnabled = settings.footer?.enabled
|
|
387
|
+
const pageOrder = printSchema?.pageOrder ?? []
|
|
388
|
+
const zones = printSchema?.zones ?? {}
|
|
389
|
+
|
|
390
|
+
const printCtx = makePrintViewerCtx()
|
|
391
|
+
|
|
392
|
+
return (
|
|
393
|
+
<>
|
|
394
|
+
{/* ── Screen-preview Dialog — only mounted while open ──────────────── */}
|
|
395
|
+
{open && (
|
|
396
|
+
<Dialog open onClose={() => setOpen(false)} fullScreen
|
|
397
|
+
PaperProps={{ sx: { bgcolor: '#888' } }}>
|
|
398
|
+
|
|
399
|
+
{/* Toolbar */}
|
|
400
|
+
<Box sx={{
|
|
401
|
+
display: 'flex', alignItems: 'center', gap: 1,
|
|
402
|
+
px: 2, py: 1, bgcolor: 'background.paper',
|
|
403
|
+
borderBottom: '1px solid', borderColor: 'divider',
|
|
404
|
+
'@media print': { display: 'none' },
|
|
405
|
+
}}>
|
|
406
|
+
<Box sx={{ flex: 1, fontWeight: 600, fontSize: 14 }}>Print Preview</Box>
|
|
407
|
+
<Button variant='contained' startIcon={<PrintOutlined />}
|
|
408
|
+
onClick={handlePrint} disabled={loading || !printSchema} size='small'>
|
|
409
|
+
Print
|
|
410
|
+
</Button>
|
|
411
|
+
<Tooltip title='Close'>
|
|
412
|
+
<IconButton size='small' onClick={() => setOpen(false)}>
|
|
413
|
+
<CloseOutlined fontSize='small' />
|
|
414
|
+
</IconButton>
|
|
415
|
+
</Tooltip>
|
|
416
|
+
</Box>
|
|
417
|
+
|
|
418
|
+
{/* Screen preview */}
|
|
419
|
+
<DialogContent sx={{ p: 4, display: 'flex', justifyContent: 'center', overflow: 'auto', bgcolor: '#888' }}>
|
|
420
|
+
{loading && (
|
|
421
|
+
<Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: 400 }}>
|
|
422
|
+
<CircularProgress />
|
|
423
|
+
</Box>
|
|
424
|
+
)}
|
|
425
|
+
|
|
426
|
+
{!loading && printSchema && (
|
|
427
|
+
<PrintPreviewCanvas
|
|
428
|
+
schema={printSchema}
|
|
429
|
+
makeViewerCtx={() => printCtx}
|
|
430
|
+
/>
|
|
431
|
+
)}
|
|
432
|
+
|
|
433
|
+
{!loading && !printSchema && (
|
|
434
|
+
<Box sx={{ color: 'white', mt: 8 }}>Failed to load print layout.</Box>
|
|
435
|
+
)}
|
|
436
|
+
</DialogContent>
|
|
437
|
+
</Dialog>
|
|
438
|
+
)}
|
|
439
|
+
|
|
440
|
+
{/* ── Print portal — appended directly to <body>, used by window.print() ──
|
|
441
|
+
Hidden on screen (display:none); the @media print CSS reveals it.
|
|
442
|
+
position:fixed header/footer repeat on every printed page reliably. */}
|
|
443
|
+
{printSchema && typeof document !== 'undefined' && createPortal(
|
|
444
|
+
<div id='__rbb_print_portal__'>
|
|
445
|
+
{/* Watermark — position:fixed repeats on every printed page */}
|
|
446
|
+
{settings.watermark?.enabled && settings.watermark?.text && (
|
|
447
|
+
<div className='rbb-watermark'>{settings.watermark.text}</div>
|
|
448
|
+
)}
|
|
449
|
+
|
|
450
|
+
{/* Header — fixed to top of every page */}
|
|
451
|
+
{hEnabled && zones.header && (
|
|
452
|
+
<div className='rbb-print-header'>
|
|
453
|
+
<ComponentRenderer node={zones.header} viewerContext={printCtx} />
|
|
454
|
+
</div>
|
|
455
|
+
)}
|
|
456
|
+
|
|
457
|
+
{/* Footer — fixed to bottom of every page */}
|
|
458
|
+
{fEnabled && zones.footer && (
|
|
459
|
+
<div className='rbb-print-footer'>
|
|
460
|
+
<ComponentRenderer node={zones.footer} viewerContext={printCtx} />
|
|
461
|
+
</div>
|
|
462
|
+
)}
|
|
463
|
+
|
|
464
|
+
{/* Body pages — margin offset keeps content clear of fixed header/footer */}
|
|
465
|
+
<div className='rbb-print-body'>
|
|
466
|
+
{pageOrder.map((pageId) => {
|
|
467
|
+
const pageNode = zones[pageId]
|
|
468
|
+
if (!pageNode) return null
|
|
469
|
+
return (
|
|
470
|
+
<div key={pageId} className='rbb-print-page'>
|
|
471
|
+
<ComponentRenderer node={pageNode} viewerContext={printCtx} />
|
|
472
|
+
</div>
|
|
473
|
+
)
|
|
474
|
+
})}
|
|
475
|
+
</div>
|
|
476
|
+
</div>,
|
|
477
|
+
document.body
|
|
478
|
+
)}
|
|
479
|
+
</>
|
|
480
|
+
)
|
|
481
|
+
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { Box } from '@mui/material'
|
|
2
|
-
import { useState, useEffect } from 'react'
|
|
2
|
+
import { useState, useEffect, useRef, useCallback } from 'react'
|
|
3
3
|
import ComponentRenderer from './ComponentRenderer'
|
|
4
|
+
import DialogsZone from './DialogsZone'
|
|
5
|
+
import PrintDialog from './PrintDialog'
|
|
4
6
|
import { executeActionsByEvent } from 'services/builderHelper/actionExecutor'
|
|
5
7
|
import { executeJSCode } from 'services/builderHelper/jsExecutor'
|
|
8
|
+
import { useTimerEngine } from 'src/hooks/useTimerEngine'
|
|
6
9
|
|
|
7
10
|
/**
|
|
8
11
|
* Validate form based on component validation rules
|
|
@@ -68,11 +71,41 @@ async function validateForm(root, formData) {
|
|
|
68
71
|
*
|
|
69
72
|
* @param {object} schema - The form schema
|
|
70
73
|
*/
|
|
71
|
-
export default function ProductionViewer({ schema }) {
|
|
74
|
+
export default function ProductionViewer({ schema, stateRef }) {
|
|
72
75
|
const [data, setData] = useState({})
|
|
73
76
|
const [form, setForm] = useState({})
|
|
74
77
|
const [validationErrors, setValidationErrors] = useState({})
|
|
75
78
|
|
|
79
|
+
// ── Unified ref storage ──────────────────────────────────────────────────
|
|
80
|
+
// dataRef : mutable non-reactive store — mutate via dataRef.current.x = y
|
|
81
|
+
// reportRefs : { [nodeId]: updateRef } registry; populated by ReportViewerRenderer
|
|
82
|
+
// dialogRefs : { [key]: { open, close } } registry; populated by DialogRenderer
|
|
83
|
+
const dataRef = useRef({})
|
|
84
|
+
const reportRefs = useRef({})
|
|
85
|
+
const dialogRefs = useRef({})
|
|
86
|
+
const printDialogRef = useRef(null)
|
|
87
|
+
|
|
88
|
+
const openDialog = useCallback((key, data) => {
|
|
89
|
+
const ref = dialogRefs.current[key]
|
|
90
|
+
if (ref) ref.open(data)
|
|
91
|
+
else console.warn(`[openDialog] No dialog registered with key "${key}"`)
|
|
92
|
+
}, [])
|
|
93
|
+
|
|
94
|
+
const closeDialog = useCallback((key) => {
|
|
95
|
+
const ref = dialogRefs.current[key]
|
|
96
|
+
if (ref) ref.close()
|
|
97
|
+
else console.warn(`[closeDialog] No dialog registered with key "${key}"`)
|
|
98
|
+
}, [])
|
|
99
|
+
|
|
100
|
+
const openPrintLayout = useCallback((layoutId, data) => {
|
|
101
|
+
if (printDialogRef.current) printDialogRef.current.open(layoutId, data)
|
|
102
|
+
else console.warn('[openPrintLayout] PrintDialog is not mounted')
|
|
103
|
+
}, [])
|
|
104
|
+
|
|
105
|
+
const closePrintLayout = useCallback(() => {
|
|
106
|
+
if (printDialogRef.current) printDialogRef.current.close()
|
|
107
|
+
}, [])
|
|
108
|
+
|
|
76
109
|
// Execute onLoad actions when component mounts or schema changes
|
|
77
110
|
useEffect(() => {
|
|
78
111
|
// Reset form and data for fresh execution
|
|
@@ -82,12 +115,32 @@ export default function ProductionViewer({ schema }) {
|
|
|
82
115
|
|
|
83
116
|
// Execute onLoad actions with fresh context
|
|
84
117
|
if (schema?.actions && schema.actions.length > 0) {
|
|
85
|
-
executeActionsByEvent(schema.actions, 'onLoad', {
|
|
118
|
+
executeActionsByEvent(schema.actions, 'onLoad', {
|
|
119
|
+
form: {}, data: {}, setData,
|
|
120
|
+
dataRef: dataRef.current, reportRefs: reportRefs.current,
|
|
121
|
+
}).catch(err => {
|
|
86
122
|
console.error('onLoad actions error:', err)
|
|
87
123
|
})
|
|
88
124
|
}
|
|
89
125
|
}, [schema])
|
|
90
126
|
|
|
127
|
+
// ── Timer engine ────────────────────────────────────────────────────────────
|
|
128
|
+
// Build a stable execution context object and update it on every render.
|
|
129
|
+
// useTimerEngine reads through a ref so timers always use fresh state without
|
|
130
|
+
// triggering re-registration on every data/form update.
|
|
131
|
+
const timerContext = {
|
|
132
|
+
data,
|
|
133
|
+
setData,
|
|
134
|
+
form,
|
|
135
|
+
dataRef: dataRef.current,
|
|
136
|
+
reportRefs: reportRefs.current,
|
|
137
|
+
openDialog,
|
|
138
|
+
closeDialog,
|
|
139
|
+
openPrintLayout,
|
|
140
|
+
closePrintLayout,
|
|
141
|
+
}
|
|
142
|
+
useTimerEngine({ timers: schema?.timers, context: timerContext })
|
|
143
|
+
|
|
91
144
|
// Update form field value
|
|
92
145
|
const updateFormValue = (key, value) => {
|
|
93
146
|
setForm(prev => ({
|
|
@@ -104,7 +157,10 @@ export default function ProductionViewer({ schema }) {
|
|
|
104
157
|
|
|
105
158
|
// If validation passes, execute onSubmit actions
|
|
106
159
|
if (Object.keys(errors).length === 0) {
|
|
107
|
-
await executeActionsByEvent(schema.actions, 'onSubmit', {
|
|
160
|
+
await executeActionsByEvent(schema.actions, 'onSubmit', {
|
|
161
|
+
form, data, setData,
|
|
162
|
+
dataRef: dataRef.current, reportRefs: reportRefs.current,
|
|
163
|
+
})
|
|
108
164
|
return true
|
|
109
165
|
}
|
|
110
166
|
return false
|
|
@@ -132,7 +188,21 @@ export default function ProductionViewer({ schema }) {
|
|
|
132
188
|
setValidationErrors,
|
|
133
189
|
submitForm,
|
|
134
190
|
resetForm,
|
|
135
|
-
builderContext: null // No builder context in production
|
|
191
|
+
builderContext: null, // No builder context in production
|
|
192
|
+
// ── Unified ref storage ────────────────────────────────────────────────
|
|
193
|
+
dataRef, // useRef({}) — mutate via dataRef.current.x = value
|
|
194
|
+
reportRefs, // useRef({}) — { [nodeId]: updateRef } per ReportViewer
|
|
195
|
+
dialogRefs, // useRef({}) — { [key]: { open, close } } per Dialog
|
|
196
|
+
printDialogRef, // useRef(null) — { open(layoutId, data), close() }
|
|
197
|
+
openDialog,
|
|
198
|
+
closeDialog,
|
|
199
|
+
openPrintLayout,
|
|
200
|
+
closePrintLayout,
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Expose live state to the debug panel (toolbar reads this via stateRef)
|
|
204
|
+
if (stateRef) {
|
|
205
|
+
stateRef.current = { data, form, dataRef, reportRefs }
|
|
136
206
|
}
|
|
137
207
|
|
|
138
208
|
if (!schema?.root) {
|
|
@@ -150,6 +220,11 @@ export default function ProductionViewer({ schema }) {
|
|
|
150
220
|
<Box sx={{ flex: 1, overflow: 'auto', p: 2 }}>
|
|
151
221
|
<ComponentRenderer node={schema.root} viewerContext={viewerContext} />
|
|
152
222
|
</Box>
|
|
223
|
+
{/* Dialogs — mounted but hidden; opened via openDialog(key) */}
|
|
224
|
+
<DialogsZone dialogs={schema.dialogs ?? []} viewerContext={viewerContext} />
|
|
225
|
+
|
|
226
|
+
{/* Print — mounted but hidden; opened via openPrintLayout(layoutId, data) */}
|
|
227
|
+
<PrintDialog viewerContext={viewerContext} />
|
|
153
228
|
</Box>
|
|
154
229
|
)
|
|
155
230
|
}
|