@dashadmin/dash-admin 1.3.24 → 1.3.26
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/dist/AppAsyncWrapper.js +30 -1
- package/dist/AppWrapper.js +35 -1
- package/dist/DASHAdmin.js +312 -1
- package/dist/RoutingWrapper.js +76 -1
- package/dist/classes/DASHStorageClass.js +15 -1
- package/dist/components/Input/RichTextField.js +26 -1
- package/dist/components/Redirect.js +56 -1
- package/dist/components/avatar/Avatar.js +72 -1
- package/dist/components/avatar/SingleImageUploader.js +46 -1
- package/dist/components/currency/Format.js +71 -1
- package/dist/components/custom/Redirect.js +20 -1
- package/dist/components/error/Error.js +161 -1
- package/dist/components/geocoding/GeocodingField.js +133 -1
- package/dist/components/i18n/BridgedLocalesMenuButton.js +126 -1
- package/dist/components/i18n/LangSwitcher.js +196 -1
- package/dist/components/loader/GlobalLoader.js +71 -1
- package/dist/components/logs/LogFile.js +99 -1
- package/dist/components/logs/LogFileById.js +75 -1
- package/dist/components/logs/LogViewer.js +33 -1
- package/dist/components/menu/AppMenu.js +11 -1
- package/dist/components/menu/CustomMenuItemLink.js +77 -1
- package/dist/components/menu/DarkToggleMode.js +47 -1
- package/dist/components/menu/LanguageToggleMode.js +99 -1
- package/dist/components/misc/CustomImageInput.js +54 -1
- package/dist/components/misc/DASHGlobalErrorHandler.js +159 -1
- package/dist/components/misc/DarkModeSwitcher.js +40 -1
- package/dist/components/misc/LanguageSwitcher.js +193 -1
- package/dist/components/misc/MUIHtmlToolTip.js +50 -1
- package/dist/components/misc/MuiSimpleJsonTable.js +178 -1
- package/dist/components/misc/MultiLevelTable.js +124 -1
- package/dist/components/misc/NoResults.js +17 -1
- package/dist/components/misc/PDFViewer.js +86 -1
- package/dist/components/navigation/Breadcrumbs.js +178 -1
- package/dist/components/navigation/BreadcrumbsManager.js +194 -1
- package/dist/components/navigation/index.js +8 -1
- package/dist/components/panel/Error.js +161 -1
- package/dist/components/permission/AvailablePermissionsContext.js +157 -1
- package/dist/components/permission/PermissionsSelector.js +719 -1
- package/dist/components/permission/PermissionsSelectorList.js +400 -1
- package/dist/components/racustombuttons/CustomRAButton.js +94 -1
- package/dist/components/racustombuttons/QuickButton.js +109 -1
- package/dist/components/racustombuttons/QuickEditButton.js +114 -1
- package/dist/components/racustombuttons/QuickIconButton.js +119 -1
- package/dist/components/scrollbar/Scrollbar.js +52 -1
- package/dist/components/selects/MultiSelect.js +42 -1
- package/dist/components/selects/RASearchableSelect.js +207 -1
- package/dist/components/selects/RASearchableSelectChips.js +225 -1
- package/dist/components/selects/SearchableSelect.js +128 -1
- package/dist/components/subscription/BillingCycleSelectInput.js +50 -1
- package/dist/components/subscription/PlanAddonsSettings.js +396 -1
- package/dist/components/subscription/PlanAuditLog.js +345 -1
- package/dist/components/subscription/PlanFeaturesSettings.js +151 -1
- package/dist/components/subscription/PlanLimitsSettings.js +168 -1
- package/dist/components/subscription/PlanMetadataSettings.js +219 -1
- package/dist/components/subscription/PlanPricesSettings.js +222 -1
- package/dist/components/subscription/index.js +12 -1
- package/dist/components/svgelements/SvgLoading.js +330 -1
- package/dist/components/svgelements/SvgLogo.js +70 -1
- package/dist/components/svgelements/SvgLogoMin.js +76 -1
- package/dist/components/svgelements/SvgShipping.js +1001 -1
- package/dist/components/tenant/TenantAttributes.js +107 -1
- package/dist/components/tenant/TenantAttributesContext.js +150 -1
- package/dist/components/tenant/TenantSelector.js +160 -1
- package/dist/components/tenant/TenantSettings.js +107 -1
- package/dist/components/tenant/TenantSettingsContext.js +152 -1
- package/dist/components/tenant/TenantTheme.js +112 -1
- package/dist/components/user/AvatarComponent.js +270 -1
- package/dist/components/user/TenantAvatarComponent.js +83 -1
- package/dist/components/user/UserPreferences.js +422 -1
- package/dist/config/ACTIONS.js +25 -1
- package/dist/config/ConstantsService.js +25 -1
- package/dist/config/DASHAdminSystemConstants.js +137 -1
- package/dist/config/PARSERS.js +9 -1
- package/dist/contexts/DashQueryClientContext.js +78 -1
- package/dist/contexts/DashResourceContext.js +21 -1
- package/dist/contexts/I18nBridgeContext.js +123 -1
- package/dist/contexts/I18nBridgeSetter.js +29 -1
- package/dist/contexts/I18nReduxSync.js +16 -1
- package/dist/contexts/SubscriptionPlanFormatsProvider.js +175 -1
- package/dist/contexts/SystemRequestsCache.js +194 -1
- package/dist/contexts/auth/AuthContext.js +396 -1
- package/dist/contexts/auth/AuthContextLocalStorage.js +118 -1
- package/dist/contexts/auth/DASHAuthenticationService.js +679 -1
- package/dist/contexts/auth/WindowContext.js +10 -1
- package/dist/contexts/auth/index.js +2 -1
- package/dist/contexts/com/FCMContext.js +378 -1
- package/dist/contexts/com/LaravelEchoContext.js +45 -1
- package/dist/contexts/com/LaravelEchoMgr.js +121 -1
- package/dist/contexts/com/components/DefaultNotificationComponent.js +31 -1
- package/dist/contexts/com/components/NotificationAttributesTable.js +28 -1
- package/dist/contexts/com/components/NotificationRenderer.js +36 -1
- package/dist/contexts/com/components/NotificationsWidget.js +142 -1
- package/dist/contexts/com/components/notificationFormats.js +15 -1
- package/dist/contexts/com/useLaravelEcho.js +340 -1
- package/dist/contexts/dictionary/DictionaryContext.js +43 -1
- package/dist/default-theme/DASHAppProviders.js +86 -1
- package/dist/default-theme/DashThemeContext.js +146 -1
- package/dist/default-theme/DashThemeHelperProvider.js +54 -1
- package/dist/default-theme/DomainAppLayout.js +126 -1
- package/dist/default-theme/DomainHeader.js +114 -1
- package/dist/default-theme/DomainTheme.js +60 -1
- package/dist/default-theme/FullLayoutMarkup.js +55 -1
- package/dist/default-theme/StaticLayout.js +36 -1
- package/dist/default-theme/index.js +19 -1
- package/dist/default-theme/menu/AppMaterialMenu.js +364 -1
- package/dist/default-theme/menu/AppMenuComponents/SubmenuPortal.js +33 -1
- package/dist/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItem.js +239 -1
- package/dist/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItems.js +22 -1
- package/dist/default-theme/menu/AppMenuComponents/expanded/CollapsableSidebarMenu.js +209 -1
- package/dist/default-theme/menu/AppMenuComponents/expanded/SidebarItem.js +71 -1
- package/dist/default-theme/menu/AppMenuComponents/getItem.js +7 -1
- package/dist/default-theme/menu/AppMenuComponents/submenuConstants.js +78 -1
- package/dist/default-theme/menu/AppSidebarMaterial.js +232 -1
- package/dist/default-theme/menu/SidebarActions.js +75 -1
- package/dist/default-theme/updateDomCssVariables.js +134 -1
- package/dist/helpers/checkRole.js +14 -1
- package/dist/helpers/parseAxiosError.js +28 -2
- package/dist/hooks/audio/useAudio.js +24 -1
- package/dist/hooks/axios.js +52 -1
- package/dist/hooks/data/useDashboardStats.js +88 -1
- package/dist/hooks/data/usePackageByClientsStats.js +51 -1
- package/dist/hooks/data/usePackageByCommunesStats.js +51 -1
- package/dist/hooks/data/usePackageStats.js +88 -1
- package/dist/hooks/data/usePackageWithdrawDetails.js +69 -1
- package/dist/hooks/data/useStats.js +94 -1
- package/dist/hooks/isCurrentPath.js +18 -1
- package/dist/hooks/notifications/WSMessagesManager.js +128 -1
- package/dist/hooks/notifications/WSPusherManager.js +70 -1
- package/dist/hooks/useBreadcrumbs.js +208 -1
- package/dist/hooks/useClickOutside.js +18 -1
- package/dist/hooks/useFormPersistance.js +129 -1
- package/dist/hooks/useGlobalErrorMediator.js +37 -1
- package/dist/hooks/useGlobalLoaderMgr.js +20 -1
- package/dist/hooks/useHash.js +24 -1
- package/dist/hooks/useLocalStorage.js +68 -1
- package/dist/hooks/usePolyglotTranslation.js +57 -1
- package/dist/hooks/usePrevious.js +12 -1
- package/dist/hooks/usePrintSelected.js +30 -1
- package/dist/hooks/useVirtualHash.js +28 -1
- package/dist/hooks/window/useWindowSize.js +23 -1
- package/dist/index.js +120 -97
- package/dist/interfaces.js +6 -1
- package/dist/layout/AppLayout.js +36 -1
- package/dist/layout/ApplicationLayout.js +110 -1
- package/dist/layout/MotionWrapper.js +182 -1
- package/dist/layout/MotionWrapper.original.js +182 -1
- package/dist/layout/ResourceMenu.js +87 -1
- package/dist/layout/ResoureLayout.js +47 -1
- package/dist/layout/TransitionWrapper.js +83 -2
- package/dist/pages/ChangePassword.js +198 -1
- package/dist/pages/DASHLanding.js +9 -1
- package/dist/pages/DASHLightWeightLogin.js +495 -1
- package/dist/pages/DASHSimpleLogin.js +231 -1
- package/dist/pages/Login.js +113 -1
- package/dist/pages/Profile.js +347 -1
- package/dist/pages/RecoverPassword.js +175 -1
- package/dist/pages/SingleImageUploader.js +40 -1
- package/dist/pages/VerifyAccount.js +129 -1
- package/dist/providers/authProvider.js +186 -1
- package/dist/providers/dataProvider.js +468 -1
- package/dist/providers/i18n/en.js +514 -1
- package/dist/providers/i18n/es.js +520 -1
- package/dist/providers/i18n/languages.js +8 -1
- package/dist/providers/i18nProvider.js +23 -1
- package/dist/react-admin-dash/RADashComponent.js +210 -1
- package/dist/react-admin-dash/Resource.js +62 -1
- package/dist/resources/Brand/BrandResource.js +106 -1
- package/dist/resources/DASHResourceLoader.js +104 -1
- package/dist/resources/Log/LogResource.js +59 -1
- package/dist/resources/Tenant/ImpersonateTenantResource.js +113 -1
- package/dist/resources/Trash/TrashTemplate.js +195 -1
- package/dist/resources.js +259 -1
- package/dist/schemas/log.js +45 -1
- package/dist/schemas/notification.js +39 -1
- package/dist/schemas/permissions.js +44 -1
- package/dist/schemas/roles.js +48 -1
- package/dist/schemas/rolesDataGrid.js +48 -1
- package/dist/schemas/subscription/components/SubscriptionActions.js +172 -1
- package/dist/schemas/subscription/components/SubscriptionPaymentHistory.js +101 -1
- package/dist/schemas/subscription/components/SubscriptionPlanFeatures.js +115 -1
- package/dist/schemas/subscription/components/SubscriptionPlanPreview.js +92 -1
- package/dist/schemas/subscription/components/SubscriptionPlanStats.js +181 -1
- package/dist/schemas/subscription/components/SubscriptionStatusIndicator.js +70 -1
- package/dist/schemas/subscription/subscriptionPlanSchema.js +184 -1
- package/dist/schemas/subscription/subscriptionSchema.js +147 -1
- package/dist/schemas/subscriptionPlan.js +397 -1
- package/dist/schemas/tenant.js +122 -1
- package/dist/schemas/tenantUser.js +94 -1
- package/dist/schemas/tenant_superadmin.js +118 -1
- package/dist/schemas/user.js +26 -1
- package/dist/systemResources.js +1039 -1
- package/dist/systemResources.old.js +668 -1
- package/dist/templates/ResourceTemplate.js +196 -1
- package/dist/templates/ResourceTemplateCreate.js +144 -1
- package/dist/templates/ResourceTemplateEdit.js +147 -1
- package/dist/templates/ResourceTemplateFull.js +518 -1
- package/dist/templates/ResourceTemplateList.js +295 -1
- package/dist/templates/ResourceTemplateShow.js +45 -1
- package/dist/templates/TrashTemplate.js +175 -1
- package/dist/tenantResources.js +206 -1
- package/dist/test_portal_bubbles.js +37 -1
- package/dist/theme/AppHeader.js +60 -1
- package/dist/theme/AppLayoutSetting.js +34 -1
- package/dist/theme/AppLogo.js +7 -1
- package/dist/theme/AppSidebar.js +30 -1
- package/dist/theme/AppSidebarContent.js +84 -1
- package/dist/theme/AppSidebarLogo.js +42 -1
- package/dist/theme/components/PageTitle.js +61 -1
- package/dist/utils/cache/CacheInvalidatorContext.js +100 -1
- package/dist/utils/cache/CacheInvalidatorListenerComponent.js +10 -1
- package/dist/utils/cache/useCacheInvalidatorListener.js +17 -1
- package/dist/utils/convertFileToBase64.js +10 -1
- package/dist/utils/convertToFile.js +12 -1
- package/dist/utils/cookies.js +45 -1
- package/dist/utils/dashDefaultQueryClient.js +15 -1
- package/dist/utils/dataUrlToBlob.js +23 -1
- package/dist/utils/deepReplace.js +17 -1
- package/dist/utils/getProfileMenu.js +31 -1
- package/dist/utils/getTenantSettings.js +9 -1
- package/dist/utils/getType.js +10 -1
- package/dist/utils/getUserSettings.js +9 -1
- package/dist/utils/hasCode.js +14 -1
- package/dist/utils/index.js +19 -1
- package/dist/utils/injectTenantStyles.js +19 -1
- package/dist/utils/isComponent.js +23 -1
- package/dist/utils/navEvents.js +75 -1
- package/dist/utils/prototypes.js +5 -1
- package/dist/utils/regexp.js +7 -1
- package/dist/utils/resolveObjectPath.js +5 -1
- package/dist/utils/setNativeValue.js +17 -1
- package/dist/utils/slugify.js +7 -1
- package/dist/utils/validators/emailValidator.js +8 -1
- package/dist/utils/validators/requiredValidator.js +7 -1
- package/dist/utils/validators/rutValidator.js +25 -1
- package/dist/utils/validators.js +57 -1
- package/package.json +153 -69
- package/src/AppAsyncWrapper.tsx +42 -0
- package/src/AppWrapper.tsx +45 -0
- package/src/DASHAdmin.tsx +501 -0
- package/src/RoutingWrapper.tsx +139 -0
- package/src/classes/DASHStorageClass.tsx +8 -0
- package/src/components/Input/RichTextField.tsx +27 -0
- package/src/components/Redirect.tsx +46 -0
- package/src/components/avatar/Avatar.tsx +67 -0
- package/src/components/avatar/SingleImageUploader.tsx +53 -0
- package/src/components/currency/Format.tsx +77 -0
- package/src/components/custom/Redirect.tsx +23 -0
- package/src/components/error/Error.tsx +168 -0
- package/src/components/geocoding/GeocodingField.tsx +167 -0
- package/src/components/i18n/BridgedLocalesMenuButton.tsx +159 -0
- package/src/components/i18n/LangSwitcher.tsx +204 -0
- package/src/components/loader/GlobalLoader.tsx +56 -0
- package/src/components/logs/LogFile.tsx +88 -0
- package/src/components/logs/LogFileById.tsx +68 -0
- package/src/components/logs/LogViewer.tsx +43 -0
- package/src/components/menu/AppMenu.tsx +22 -0
- package/src/components/menu/CustomMenuItemLink.tsx +61 -0
- package/src/components/menu/DarkToggleMode.tsx +65 -0
- package/src/components/menu/LanguageToggleMode.tsx +120 -0
- package/src/components/misc/CustomImageInput.tsx +62 -0
- package/src/components/misc/DASHGlobalErrorHandler.tsx +194 -0
- package/src/components/misc/DarkModeSwitcher.tsx +112 -0
- package/src/components/misc/LanguageSwitcher.tsx +199 -0
- package/src/components/misc/MUIHtmlToolTip.tsx +15 -0
- package/src/components/misc/MuiSimpleJsonTable.tsx +279 -0
- package/src/components/misc/MultiLevelTable.tsx +229 -0
- package/src/components/misc/NoResults.tsx +25 -0
- package/src/components/misc/PDFViewer.tsx +85 -0
- package/src/components/navigation/Breadcrumbs.tsx +220 -0
- package/src/components/navigation/BreadcrumbsManager.tsx +310 -0
- package/src/components/navigation/index.tsx +5 -0
- package/src/components/panel/Error.tsx +168 -0
- package/src/components/permission/AvailablePermissionsContext.tsx +173 -0
- package/src/components/permission/PermissionsSelector.tsx +819 -0
- package/src/components/permission/PermissionsSelectorList.tsx +468 -0
- package/src/components/permission/tsx +0 -0
- package/src/components/racustombuttons/CustomRAButton.tsx +87 -0
- package/src/components/racustombuttons/QuickButton.tsx +117 -0
- package/src/components/racustombuttons/QuickEditButton.tsx +115 -0
- package/src/components/racustombuttons/QuickIconButton.tsx +122 -0
- package/src/components/scrollbar/Scrollbar.tsx +31 -0
- package/src/components/selects/MultiSelect.tsx +53 -0
- package/src/components/selects/RASearchableSelect.tsx +279 -0
- package/src/components/selects/RASearchableSelectChips.tsx +304 -0
- package/src/components/selects/SearchableSelect.tsx +135 -0
- package/src/components/subscription/BillingCycleSelectInput.tsx +68 -0
- package/src/components/subscription/PlanAddonsSettings.tsx +522 -0
- package/src/components/subscription/PlanAuditLog.tsx +439 -0
- package/src/components/subscription/PlanFeaturesSettings.tsx +223 -0
- package/src/components/subscription/PlanLimitsSettings.tsx +230 -0
- package/src/components/subscription/PlanMetadataSettings.tsx +284 -0
- package/src/components/subscription/PlanPricesSettings.tsx +295 -0
- package/src/components/subscription/index.ts +7 -0
- package/src/components/svgelements/SvgLoading.tsx +229 -0
- package/src/components/svgelements/SvgLogo.tsx +53 -0
- package/src/components/svgelements/SvgLogoMin.tsx +64 -0
- package/src/components/svgelements/SvgShipping.tsx +673 -0
- package/src/components/tenant/AvailablePermissionsContext.tsx +0 -0
- package/src/components/tenant/TenantAttributes.tsx +153 -0
- package/src/components/tenant/TenantAttributesContext.tsx +163 -0
- package/src/components/tenant/TenantSelector.tsx +139 -0
- package/src/components/tenant/TenantSettings.tsx +172 -0
- package/src/components/tenant/TenantSettingsContext.tsx +165 -0
- package/src/components/tenant/TenantTheme.tsx +172 -0
- package/src/components/user/AvatarComponent.tsx +301 -0
- package/src/components/user/TenantAvatarComponent.tsx +99 -0
- package/src/components/user/UserPreferences.tsx +642 -0
- package/src/config/ACTIONS.tsx +26 -0
- package/src/config/ConstantsService.tsx +44 -0
- package/src/config/DASHAdminSystemConstants.tsx +182 -0
- package/src/config/PARSERS.tsx +9 -0
- package/src/contexts/DashQueryClientContext.tsx +113 -0
- package/src/contexts/DashResourceContext.tsx +34 -0
- package/src/contexts/I18nBridgeContext.tsx +156 -0
- package/src/contexts/I18nBridgeSetter.tsx +39 -0
- package/src/contexts/I18nReduxSync.tsx +27 -0
- package/src/contexts/SubscriptionPlanFormatsProvider.tsx +217 -0
- package/src/contexts/SystemRequestsCache.tsx +215 -0
- package/src/contexts/auth/AuthContext.tsx +553 -0
- package/src/contexts/auth/AuthContextLocalStorage.tsx +140 -0
- package/src/contexts/auth/DASHAuthenticationService.tsx +917 -0
- package/src/contexts/auth/WindowContext.tsx +15 -0
- package/src/contexts/auth/index.tsx +3 -0
- package/src/contexts/com/FCMContext.tsx +415 -0
- package/src/contexts/com/LaravelEchoContext.tsx +41 -0
- package/src/contexts/com/LaravelEchoMgr.tsx +155 -0
- package/src/contexts/com/components/DefaultNotificationComponent.tsx +20 -0
- package/src/contexts/com/components/NotificationAttributesTable.tsx +54 -0
- package/src/contexts/com/components/NotificationRenderer.tsx +42 -0
- package/src/contexts/com/components/NotificationsWidget.tsx +182 -0
- package/src/contexts/com/components/notificationFormats.tsx +50 -0
- package/src/contexts/com/useLaravelEcho.tsx +432 -0
- package/src/contexts/dictionary/DictionaryContext.tsx +94 -0
- package/src/default-theme/DASHAppProviders.tsx +117 -0
- package/src/default-theme/DashThemeContext.tsx +218 -0
- package/src/default-theme/DashThemeHelperProvider.tsx +98 -0
- package/src/default-theme/DomainAppLayout.tsx +166 -0
- package/src/default-theme/DomainHeader.tsx +162 -0
- package/src/default-theme/DomainTheme.tsx +59 -0
- package/src/default-theme/FullLayoutMarkup.tsx +250 -0
- package/src/default-theme/StaticLayout.tsx +47 -0
- package/src/default-theme/index.tsx +11 -0
- package/src/default-theme/menu/AppMaterialMenu.tsx +545 -0
- package/src/default-theme/menu/AppMenuComponents/SubmenuPortal.tsx +56 -0
- package/src/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItem.tsx +254 -0
- package/src/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItems.tsx +31 -0
- package/src/default-theme/menu/AppMenuComponents/expanded/CollapsableSidebarMenu.tsx +276 -0
- package/src/default-theme/menu/AppMenuComponents/expanded/SidebarItem.tsx +91 -0
- package/src/default-theme/menu/AppMenuComponents/getItem.tsx +17 -0
- package/src/default-theme/menu/AppMenuComponents/interfaces.tsx +41 -0
- package/src/default-theme/menu/AppMenuComponents/submenuConstants.ts +85 -0
- package/src/default-theme/menu/AppSidebarMaterial.tsx +339 -0
- package/src/default-theme/menu/SidebarActions.tsx +84 -0
- package/src/default-theme/updateDomCssVariables.tsx +176 -0
- package/src/helpers/checkRole.tsx +66 -0
- package/src/helpers/parseAxiosError.tsx +41 -0
- package/src/hooks/audio/useAudio.tsx +39 -0
- package/src/hooks/axios.tsx +62 -0
- package/src/hooks/data/useDashboardStats.tsx +65 -0
- package/src/hooks/data/usePackageByClientsStats.tsx +44 -0
- package/src/hooks/data/usePackageByCommunesStats.tsx +44 -0
- package/src/hooks/data/usePackageStats.tsx +69 -0
- package/src/hooks/data/usePackageWithdrawDetails.tsx +61 -0
- package/src/hooks/data/useStats.tsx +86 -0
- package/src/hooks/isCurrentPath.tsx +22 -0
- package/src/hooks/notifications/WSMessagesManager.tsx +152 -0
- package/src/hooks/notifications/WSPusherManager.tsx +92 -0
- package/src/hooks/useBreadcrumbs.tsx +329 -0
- package/src/hooks/useClickOutside.tsx +17 -0
- package/src/hooks/useFormPersistance.tsx +150 -0
- package/src/hooks/useGlobalErrorMediator.tsx +43 -0
- package/src/hooks/useGlobalLoaderMgr.tsx +21 -0
- package/src/hooks/useHash.tsx +27 -0
- package/src/hooks/useLocalStorage.tsx +196 -0
- package/src/hooks/usePolyglotTranslation.tsx +62 -0
- package/src/hooks/usePrevious.tsx +9 -0
- package/src/hooks/usePrintSelected.tsx +37 -0
- package/src/hooks/useVirtualHash.tsx +33 -0
- package/src/hooks/window/useWindowSize.tsx +36 -0
- package/src/index.tsx +110 -0
- package/src/interfaces/IAppResourceConfig.tsx +20 -0
- package/src/interfaces/Log.tsx +16 -0
- package/src/interfaces/Tenant.tsx +25 -0
- package/src/interfaces/communication/IActions.tsx +5 -0
- package/src/interfaces/communication/INotification.tsx +21 -0
- package/src/interfaces/communication/IPayload.tsx +3 -0
- package/src/interfaces/communication/IRequestAction.tsx +10 -0
- package/src/interfaces/communication/IRequestPayload.tsx +7 -0
- package/src/interfaces/communication/IResponseAction.tsx +7 -0
- package/src/interfaces/misc/IAny.tsx +3 -0
- package/src/interfaces/misc/IFlashMessage.tsx +10 -0
- package/src/interfaces/navigation/IAppMenu.ts +14 -0
- package/src/interfaces/navigation/ICollapsableSidebarMenu.ts +12 -0
- package/src/interfaces/navigation/IMenuItem.ts +16 -0
- package/src/interfaces/notifications/IModel.tsx +6 -0
- package/src/interfaces/notifications/IModelField.tsx +8 -0
- package/src/interfaces/notifications/IUserNotification.tsx +12 -0
- package/src/interfaces/notifications/IUserNotificationData.tsx +13 -0
- package/src/interfaces/notifications/IUserNotificationPayload.tsx +8 -0
- package/src/interfaces/user/IGetAuth.tsx +92 -0
- package/src/interfaces/user/ITenantSettings.tsx +3 -0
- package/src/interfaces/user/IUser.tsx +60 -0
- package/src/interfaces/user/IUserSettings.tsx +43 -0
- package/src/interfaces.tsx +6 -0
- package/src/layout/AppLayout.tsx +112 -0
- package/src/layout/ApplicationLayout.tsx +197 -0
- package/src/layout/MotionWrapper.original.tsx +236 -0
- package/src/layout/MotionWrapper.tsx +236 -0
- package/src/layout/ResourceMenu.tsx +164 -0
- package/src/layout/ResoureLayout.tsx +105 -0
- package/src/layout/TransitionWrapper.tsx +125 -0
- package/src/pages/ChangePassword.tsx +179 -0
- package/src/pages/DASHLanding.tsx +22 -0
- package/src/pages/DASHLightWeightLogin.tsx +610 -0
- package/src/pages/DASHSimpleLogin.tsx +260 -0
- package/src/pages/Login.tsx +111 -0
- package/src/pages/Profile.tsx +394 -0
- package/src/pages/RecoverPassword.tsx +166 -0
- package/src/pages/SingleImageUploader.tsx +55 -0
- package/src/pages/VerifyAccount.tsx +128 -0
- package/src/providers/authProvider.tsx +210 -0
- package/src/providers/dataProvider.tsx +672 -0
- package/src/providers/i18n/en.ts +533 -0
- package/src/providers/i18n/es.ts +539 -0
- package/src/providers/i18n/languages.tsx +5 -0
- package/src/providers/i18nProvider.tsx +23 -0
- package/src/react-admin-dash/RADashComponent.tsx +240 -0
- package/src/react-admin-dash/Resource.tsx +77 -0
- package/src/resources/Brand/BrandResource.tsx +130 -0
- package/src/resources/DASHResourceLoader.ts +180 -0
- package/src/resources/Log/LogResource.tsx +73 -0
- package/src/resources/Tenant/ImpersonateTenantResource.tsx +113 -0
- package/src/resources/Trash/TrashTemplate.tsx +180 -0
- package/src/resources.tsx +280 -0
- package/src/schemas/log.tsx +45 -0
- package/src/schemas/notification.tsx +42 -0
- package/src/schemas/permissions.tsx +44 -0
- package/src/schemas/roles.tsx +48 -0
- package/src/schemas/rolesDataGrid.tsx +48 -0
- package/src/schemas/subscription/components/SubscriptionActions.tsx +153 -0
- package/src/schemas/subscription/components/SubscriptionPaymentHistory.tsx +120 -0
- package/src/schemas/subscription/components/SubscriptionPlanFeatures.tsx +155 -0
- package/src/schemas/subscription/components/SubscriptionPlanPreview.tsx +128 -0
- package/src/schemas/subscription/components/SubscriptionPlanStats.tsx +268 -0
- package/src/schemas/subscription/components/SubscriptionStatusIndicator.tsx +72 -0
- package/src/schemas/subscription/subscriptionPlanSchema.tsx +185 -0
- package/src/schemas/subscription/subscriptionSchema.tsx +152 -0
- package/src/schemas/subscriptionPlan.ts +422 -0
- package/src/schemas/tenant.tsx +129 -0
- package/src/schemas/tenantUser.tsx +96 -0
- package/src/schemas/tenant_superadmin.tsx +119 -0
- package/src/schemas/user.tsx +26 -0
- package/src/systemResources.old.tsx +928 -0
- package/src/systemResources.tsx +1135 -0
- package/src/templates/ResourceTemplate.tsx +240 -0
- package/src/templates/ResourceTemplateCreate.tsx +167 -0
- package/src/templates/ResourceTemplateEdit.tsx +176 -0
- package/src/templates/ResourceTemplateFull.tsx +581 -0
- package/src/templates/ResourceTemplateList.tsx +340 -0
- package/src/templates/ResourceTemplateShow.tsx +88 -0
- package/src/templates/TrashTemplate.tsx +179 -0
- package/src/tenantResources.tsx +223 -0
- package/src/test_portal_bubbles.tsx +40 -0
- package/src/theme/AppHeader.tsx +52 -0
- package/src/theme/AppLayoutSetting.tsx +33 -0
- package/src/theme/AppLogo.tsx +13 -0
- package/src/theme/AppSidebar.tsx +12 -0
- package/src/theme/AppSidebarContent.tsx +105 -0
- package/src/theme/AppSidebarLogo.tsx +48 -0
- package/src/theme/components/PageTitle.tsx +37 -0
- package/src/utils/cache/CacheInvalidatorContext.tsx +125 -0
- package/src/utils/cache/CacheInvalidatorListenerComponent.tsx +10 -0
- package/src/utils/cache/useCacheInvalidatorListener.tsx +27 -0
- package/src/utils/convertFileToBase64.tsx +9 -0
- package/src/utils/convertToFile.tsx +14 -0
- package/src/utils/cookies.tsx +33 -0
- package/src/utils/dashDefaultQueryClient.tsx +34 -0
- package/src/utils/dataUrlToBlob.tsx +30 -0
- package/src/utils/deepReplace.tsx +19 -0
- package/src/utils/getProfileMenu.tsx +41 -0
- package/src/utils/getTenantSettings.tsx +9 -0
- package/src/utils/getType.tsx +8 -0
- package/src/utils/getUserSettings.tsx +8 -0
- package/src/utils/hasCode.tsx +14 -0
- package/src/utils/index.ts +19 -0
- package/src/utils/injectTenantStyles.ts +28 -0
- package/src/utils/isComponent.tsx +45 -0
- package/src/utils/navEvents.tsx +91 -0
- package/src/utils/prototypes.tsx +5 -0
- package/src/utils/regexp.tsx +4 -0
- package/src/utils/resolveObjectPath.tsx +4 -0
- package/src/utils/setNativeValue.tsx +24 -0
- package/src/utils/slugify.tsx +11 -0
- package/src/utils/validators/emailValidator.tsx +6 -0
- package/src/utils/validators/requiredValidator.tsx +5 -0
- package/src/utils/validators/rutValidator.tsx +31 -0
- package/src/utils/validators.tsx +96 -0
- package/dist/ChangePassword-DmWAQAX_.js +0 -152
- package/dist/Login-t41HMhVT.js +0 -101
- package/dist/Profile-By-gdPUd.js +0 -294
- package/dist/RecoverPassword-DzPdbkg2.js +0 -149
- package/dist/VerifyAccount-Bofaxe5w.js +0 -99
- package/dist/index-gfebuoyf.js +0 -21614
- /package/dist/{components/permission/tsx → declarations.d.js} +0 -0
- /package/{dist → src}/DASHAdmin.tsx.old +0 -0
- /package/{dist → src}/declarations.d.ts +0 -0
- /package/{dist → src}/default-theme/DashThemeContext.tsx.fast +0 -0
- /package/{dist → src}/default-theme/DashThemeContext.tsx.old +0 -0
- /package/{dist → src}/templates/ResourceTemplate.tsx.memoized_experiment +0 -0
- /package/{dist → src}/templates/ResourceTemplate.tsx.original +0 -0
- /package/{dist → src}/templates/ResourceTemplateOld.tsx.bkup +0 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { IDashAutoAdminResourceConfig } from "dash-auto-admin";
|
|
2
|
+
import { JSX } from "react";
|
|
3
|
+
import { SidebarPosition } from "../AppSidebarMaterial";
|
|
4
|
+
|
|
5
|
+
export interface IAppMenu {
|
|
6
|
+
//hasDashboard: boolean;
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
autoHideScroll?: boolean;
|
|
9
|
+
menu?: IDashAutoAdminResourceConfig[];
|
|
10
|
+
debug?: boolean;
|
|
11
|
+
showDrawer?: boolean;
|
|
12
|
+
navSize: "small" | "large";
|
|
13
|
+
navExpanded: boolean;
|
|
14
|
+
sidebarPosition?: SidebarPosition;
|
|
15
|
+
[key: string]: any;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface IMenuItem {
|
|
19
|
+
group: string;
|
|
20
|
+
model: string;
|
|
21
|
+
label: string;
|
|
22
|
+
txtLabel: string;
|
|
23
|
+
key: React.Key;
|
|
24
|
+
to?: string;
|
|
25
|
+
icon?: JSX.Element;
|
|
26
|
+
children?: IMenuItem[];
|
|
27
|
+
type?: 'group';
|
|
28
|
+
selected?: boolean;
|
|
29
|
+
/** When true, this menu item is a simple navigation link (not a react-admin resource) */
|
|
30
|
+
menuOnly?: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ICollapsableSidebarMenu {
|
|
34
|
+
item: IMenuItem;
|
|
35
|
+
showIcon?: boolean;
|
|
36
|
+
className?: string;
|
|
37
|
+
navExpanded: boolean;
|
|
38
|
+
navSize: "small" | "large";
|
|
39
|
+
level: number;
|
|
40
|
+
sidebarPosition?: SidebarPosition;
|
|
41
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { CSSProperties, RefObject } from 'react';
|
|
2
|
+
import { SidebarPosition } from '../AppSidebarMaterial';
|
|
3
|
+
|
|
4
|
+
// Toggle this to force click behavior instead of hover (for debugging/testing)
|
|
5
|
+
export const FORCE_CLICK_OPEN = false; // Set to true for click behavior
|
|
6
|
+
|
|
7
|
+
// Threshold for when submenu should render at fixed top/bottom instead of relative to item
|
|
8
|
+
export const SUBMENU_SCROLL_THRESHOLD = 10;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Base styles for submenu portal container
|
|
12
|
+
*/
|
|
13
|
+
export const getSubmenuBaseStyle = (
|
|
14
|
+
sidebarPosition: SidebarPosition,
|
|
15
|
+
renderAtTop: boolean = false
|
|
16
|
+
): CSSProperties => ({
|
|
17
|
+
zIndex: 10000,
|
|
18
|
+
position: 'fixed',
|
|
19
|
+
maxHeight: sidebarPosition === "top" || sidebarPosition === "bottom" ? '60vh' : (renderAtTop ? '100vh' : '80vh'),
|
|
20
|
+
overflowY: 'auto',
|
|
21
|
+
width: sidebarPosition === "top" || sidebarPosition === "bottom" ? 'auto' : '260px',
|
|
22
|
+
minWidth: '200px',
|
|
23
|
+
background: 'var(--module-bg, #252526)',
|
|
24
|
+
boxShadow: '0 4px 12px rgba(0,0,0,0.25)',
|
|
25
|
+
borderRadius: 8,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Calculate submenu position based on sidebar position and item rect
|
|
30
|
+
*/
|
|
31
|
+
export const calculateSubmenuPosition = (
|
|
32
|
+
rect: DOMRect,
|
|
33
|
+
sidebarPosition: SidebarPosition,
|
|
34
|
+
renderAtTop: boolean = false
|
|
35
|
+
): CSSProperties => {
|
|
36
|
+
switch (sidebarPosition) {
|
|
37
|
+
case "right":
|
|
38
|
+
// Submenu opens to the LEFT of the sidebar item
|
|
39
|
+
return {
|
|
40
|
+
top: rect.top,
|
|
41
|
+
right: window.innerWidth - rect.left - 4,
|
|
42
|
+
left: 'auto'
|
|
43
|
+
};
|
|
44
|
+
case "top":
|
|
45
|
+
return {
|
|
46
|
+
top: renderAtTop ? 120 : rect.bottom - 4,
|
|
47
|
+
left: rect.left,
|
|
48
|
+
right: 'auto'
|
|
49
|
+
};
|
|
50
|
+
case "bottom":
|
|
51
|
+
return {
|
|
52
|
+
bottom: renderAtTop ? 120 : (window.innerHeight - rect.top) - 4,
|
|
53
|
+
left: rect.left,
|
|
54
|
+
right: 'auto'
|
|
55
|
+
};
|
|
56
|
+
case "left":
|
|
57
|
+
default:
|
|
58
|
+
// Submenu opens to the RIGHT of the sidebar item
|
|
59
|
+
return {
|
|
60
|
+
top: rect.top,
|
|
61
|
+
left: rect.right - 4,
|
|
62
|
+
right: 'auto'
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Get complete submenu style by combining base style and position
|
|
69
|
+
*/
|
|
70
|
+
export const getSubmenuStyle = (
|
|
71
|
+
itemRef: RefObject<HTMLElement | null>,
|
|
72
|
+
sidebarPosition: SidebarPosition,
|
|
73
|
+
renderAtTop: boolean = false
|
|
74
|
+
): CSSProperties => {
|
|
75
|
+
const rect = itemRef.current?.getBoundingClientRect();
|
|
76
|
+
const baseStyle = getSubmenuBaseStyle(sidebarPosition, renderAtTop);
|
|
77
|
+
|
|
78
|
+
if (!rect) {
|
|
79
|
+
// Fallback if rect not available
|
|
80
|
+
return { ...baseStyle, top: 0, left: 0 };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const positionStyle = calculateSubmenuPosition(rect, sidebarPosition, renderAtTop);
|
|
84
|
+
return { ...baseStyle, ...positionStyle };
|
|
85
|
+
};
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { styled, Theme, CSSObject } from '@mui/material/styles';
|
|
3
|
+
import Box from '@mui/material/Box';
|
|
4
|
+
import MuiDrawer from '@mui/material/Drawer';
|
|
5
|
+
import { useMediaQuery, useTheme } from '@mui/material';
|
|
6
|
+
import { IDASHAppState, DASH_REDUX_ACTIONS } from 'dash-admin-state';
|
|
7
|
+
import { useDispatch, useSelector } from 'react-redux';
|
|
8
|
+
import { IDashAutoAdminResourceConfig } from 'dash-auto-admin';
|
|
9
|
+
import { useState } from 'react';
|
|
10
|
+
|
|
11
|
+
import { useWindowSize, dashStorage } from 'dash-utils';
|
|
12
|
+
import AppMaterialMenu from './AppMaterialMenu';
|
|
13
|
+
import { useLocation } from 'react-router';
|
|
14
|
+
import { isEqual } from 'lodash';
|
|
15
|
+
import { NavEventManager } from '../../utils/navEvents';
|
|
16
|
+
|
|
17
|
+
// Only keep layout settings selector - remove nav state selectors
|
|
18
|
+
const selectLayoutSettings = (state: IDASHAppState<any, any, IDashAutoAdminResourceConfig>) => ({
|
|
19
|
+
navStyle: state.settings.navStyle,
|
|
20
|
+
layoutType: state.settings.layoutType,
|
|
21
|
+
themeType: state.settings.themeType,
|
|
22
|
+
layoutSettings: state.settings.layoutSettings,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const selectPanelSettings = (state: IDASHAppState<any, any, IDashAutoAdminResourceConfig>) =>
|
|
26
|
+
state.common.panelSettings;
|
|
27
|
+
|
|
28
|
+
// Sidebar position type
|
|
29
|
+
export type SidebarPosition = "left" | "top" | "bottom" | "right";
|
|
30
|
+
|
|
31
|
+
// Component props interface
|
|
32
|
+
export interface AppSidebarMaterialProps {
|
|
33
|
+
className?: string;
|
|
34
|
+
sidebarPosition?: SidebarPosition;
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const AppSidebarMaterial: React.FC<AppSidebarMaterialProps> = (props) => {
|
|
39
|
+
const { sidebarPosition: propSidebarPosition} = props;
|
|
40
|
+
const location = useLocation();
|
|
41
|
+
const dispatch = useDispatch();
|
|
42
|
+
const theme = useTheme();
|
|
43
|
+
const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm'));
|
|
44
|
+
const isMediumOrSmaller = useMediaQuery(theme.breakpoints.down('md')); // For sidebar position switching
|
|
45
|
+
|
|
46
|
+
// Only subscribe to layout settings - nav state is handled by AppSidebarMaterial
|
|
47
|
+
const layoutState = useSelector(selectLayoutSettings, isEqual);
|
|
48
|
+
const panelSettings = useSelector(selectPanelSettings);
|
|
49
|
+
|
|
50
|
+
// Get primary and secondary sidebar positions from Redux panelSettings
|
|
51
|
+
const primarySidebarPosition: SidebarPosition = propSidebarPosition || panelSettings?.sidebarPosition || 'left';
|
|
52
|
+
const secondarySidebarPosition: SidebarPosition = panelSettings?.secondarySidebarPosition || 'left';
|
|
53
|
+
|
|
54
|
+
// Use secondary position on medium or smaller screens (for burger menu behavior)
|
|
55
|
+
const sidebarPosition: SidebarPosition = isMediumOrSmaller ? secondarySidebarPosition : primarySidebarPosition;
|
|
56
|
+
|
|
57
|
+
// Check if position is horizontal (top/bottom) - these don't expand/collapse
|
|
58
|
+
const isHorizontalPosition = sidebarPosition === "top" || sidebarPosition === "bottom";
|
|
59
|
+
|
|
60
|
+
const {
|
|
61
|
+
navStyle,
|
|
62
|
+
layoutType,
|
|
63
|
+
themeType,
|
|
64
|
+
layoutSettings
|
|
65
|
+
} = layoutState;
|
|
66
|
+
|
|
67
|
+
// Local state for nav - initialize from localStorage for persistence
|
|
68
|
+
const [localNavExpanded, setLocalNavExpanded] = useState(() => {
|
|
69
|
+
const stored = dashStorage.getItem('dashNavExpanded');
|
|
70
|
+
return stored !== null ? stored === 'true' : false;
|
|
71
|
+
});
|
|
72
|
+
const [localNavSize, setLocalNavSize] = useState<"small" | "large">(() => {
|
|
73
|
+
const stored = dashStorage.getItem('dashNavSize');
|
|
74
|
+
return (stored === 'small' || stored === 'large') ? stored : 'large';
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// Create refs to track current values for Redux sync
|
|
78
|
+
const localNavExpandedRef = React.useRef(localNavExpanded);
|
|
79
|
+
const localNavSizeRef = React.useRef(localNavSize);
|
|
80
|
+
|
|
81
|
+
// Update refs when values change
|
|
82
|
+
React.useEffect(() => {
|
|
83
|
+
localNavExpandedRef.current = localNavExpanded;
|
|
84
|
+
localNavSizeRef.current = localNavSize;
|
|
85
|
+
}, [localNavExpanded, localNavSize]);
|
|
86
|
+
|
|
87
|
+
// Persist nav state to localStorage when it changes
|
|
88
|
+
React.useEffect(() => {
|
|
89
|
+
dashStorage.setItem('dashNavExpanded', String(localNavExpanded));
|
|
90
|
+
}, [localNavExpanded]);
|
|
91
|
+
|
|
92
|
+
React.useEffect(() => {
|
|
93
|
+
dashStorage.setItem('dashNavSize', localNavSize);
|
|
94
|
+
}, [localNavSize]);
|
|
95
|
+
|
|
96
|
+
// Listen for nav events from other components
|
|
97
|
+
React.useEffect(() => {
|
|
98
|
+
const unsubscribeToggle = NavEventManager.onToggleExpanded(() => {
|
|
99
|
+
setLocalNavExpanded(prev => !prev);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const unsubscribeSet = NavEventManager.onSetExpanded((expanded) => {
|
|
103
|
+
setLocalNavExpanded(expanded);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Listen for close drawer events (triggered when navigating on mobile)
|
|
107
|
+
const unsubscribeClose = NavEventManager.onCloseDrawer(() => {
|
|
108
|
+
if (localNavSize === 'small') {
|
|
109
|
+
setLocalNavExpanded(false);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
return () => {
|
|
114
|
+
unsubscribeToggle();
|
|
115
|
+
unsubscribeSet();
|
|
116
|
+
unsubscribeClose();
|
|
117
|
+
};
|
|
118
|
+
}, [localNavSize]);
|
|
119
|
+
|
|
120
|
+
// Memoize logo extraction to prevent unnecessary re-renders
|
|
121
|
+
const logos = React.useMemo(() => ({
|
|
122
|
+
horizontalLogo: panelSettings?.horizontalLogo || <>🖥</>,
|
|
123
|
+
squaredLogo: panelSettings?.squaredLogo || <>🖥</>,
|
|
124
|
+
}), [panelSettings?.horizontalLogo, panelSettings?.squaredLogo]);
|
|
125
|
+
|
|
126
|
+
// Body class management - keep it simple
|
|
127
|
+
React.useEffect(() => {
|
|
128
|
+
if (!layoutSettings || !layoutType || !themeType) return;
|
|
129
|
+
|
|
130
|
+
const body = document.body;
|
|
131
|
+
|
|
132
|
+
// Remove old classes
|
|
133
|
+
body.classList.remove(
|
|
134
|
+
layoutSettings.LAYOUT_TYPE_FULL,
|
|
135
|
+
layoutSettings.LAYOUT_TYPE_BOXED,
|
|
136
|
+
layoutSettings.LAYOUT_TYPE_FRAMED,
|
|
137
|
+
layoutSettings.THEME_TYPE_DARK,
|
|
138
|
+
layoutSettings.THEME_TYPE_LIGHT
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
// Add new classes
|
|
142
|
+
body.classList.add(layoutType, themeType);
|
|
143
|
+
}, [layoutType, themeType, layoutSettings]);
|
|
144
|
+
|
|
145
|
+
// Nav style management
|
|
146
|
+
React.useEffect(() => {
|
|
147
|
+
if (!layoutSettings || !navStyle) return;
|
|
148
|
+
|
|
149
|
+
const body = document.body;
|
|
150
|
+
const horizontalStyles = [
|
|
151
|
+
layoutSettings.NAV_STYLE_DEFAULT_HORIZONTAL,
|
|
152
|
+
layoutSettings.NAV_STYLE_DARK_HORIZONTAL,
|
|
153
|
+
layoutSettings.NAV_STYLE_INSIDE_HEADER_HORIZONTAL,
|
|
154
|
+
layoutSettings.NAV_STYLE_ABOVE_HEADER,
|
|
155
|
+
layoutSettings.NAV_STYLE_BELOW_HEADER
|
|
156
|
+
];
|
|
157
|
+
|
|
158
|
+
const isHorizontal = horizontalStyles.includes(navStyle);
|
|
159
|
+
body.classList.toggle('full-scroll', isHorizontal);
|
|
160
|
+
body.classList.toggle('horizontal-layout', isHorizontal);
|
|
161
|
+
}, [navStyle, layoutSettings]);
|
|
162
|
+
|
|
163
|
+
// Location-based classes - ONLY dispatch to Redux on location changes
|
|
164
|
+
const previousLocationClassRef = React.useRef<string>('');
|
|
165
|
+
|
|
166
|
+
React.useEffect(() => {
|
|
167
|
+
const body = document.body;
|
|
168
|
+
let formattedPath = '';
|
|
169
|
+
|
|
170
|
+
if (location.pathname && location.pathname !== '/') {
|
|
171
|
+
formattedPath = location.pathname.replace(/^\/|\/$/g, '').replace(/\//g, '-');
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const currentLocationClass = formattedPath ? `location-${formattedPath}` : '';
|
|
175
|
+
|
|
176
|
+
// Remove previous class
|
|
177
|
+
if (previousLocationClassRef.current) {
|
|
178
|
+
body.classList.remove(previousLocationClassRef.current);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Add new class
|
|
182
|
+
if (currentLocationClass) {
|
|
183
|
+
body.classList.add(currentLocationClass);
|
|
184
|
+
previousLocationClassRef.current = currentLocationClass;
|
|
185
|
+
} else {
|
|
186
|
+
previousLocationClassRef.current = '';
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// 🎯 ONLY sync local nav state to Redux on location changes (not on every nav toggle)
|
|
190
|
+
return () => {
|
|
191
|
+
if (previousLocationClassRef.current) {
|
|
192
|
+
body.classList.remove(previousLocationClassRef.current);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Use ref values to avoid stale closures and prevent infinite loops
|
|
196
|
+
dispatch(DASH_REDUX_ACTIONS.setNavExpanded(localNavExpandedRef.current));
|
|
197
|
+
dispatch(DASH_REDUX_ACTIONS.setNavSize(localNavSizeRef.current));
|
|
198
|
+
};
|
|
199
|
+
}, [location.pathname, dispatch]); // ✅ Removed localNavExpanded and localNavSize from deps
|
|
200
|
+
|
|
201
|
+
const windowSize = useWindowSize();
|
|
202
|
+
|
|
203
|
+
// Update parent layout className whenever local nav state or position changes
|
|
204
|
+
React.useEffect(() => {
|
|
205
|
+
const layoutElement = document.getElementById('dash-app-layout');
|
|
206
|
+
if (layoutElement) {
|
|
207
|
+
// Remove existing nav-related classes
|
|
208
|
+
layoutElement.classList.remove('expanded', 'collapsed', 'small', 'large');
|
|
209
|
+
layoutElement.classList.remove('sidebar-position-left', 'sidebar-position-right', 'sidebar-position-top', 'sidebar-position-bottom');
|
|
210
|
+
|
|
211
|
+
// Add current state classes
|
|
212
|
+
layoutElement.classList.add(localNavExpanded ? 'expanded' : 'collapsed');
|
|
213
|
+
layoutElement.classList.add(localNavSize);
|
|
214
|
+
layoutElement.classList.add(`sidebar-position-${sidebarPosition}`);
|
|
215
|
+
}
|
|
216
|
+
}, [localNavExpanded, localNavSize, sidebarPosition]);
|
|
217
|
+
|
|
218
|
+
const toggleDrawer = (e) => {
|
|
219
|
+
e.preventDefault();
|
|
220
|
+
e.stopPropagation();
|
|
221
|
+
setLocalNavExpanded(!localNavExpanded);
|
|
222
|
+
// 🎯 NO Redux dispatch here - only local state update
|
|
223
|
+
// Redux will be synced only on location changes
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
// isSmallScreen and theme are already declared at the top of the component
|
|
227
|
+
const isLargeScreen = useMediaQuery(theme.breakpoints.up('lg'));
|
|
228
|
+
|
|
229
|
+
// Track previous breakpoint states to detect changes
|
|
230
|
+
const [prevIsSmall, setPrevIsSmall] = useState<boolean | null>(null);
|
|
231
|
+
const [prevIsLarge, setPrevIsLarge] = useState<boolean | null>(null);
|
|
232
|
+
const [prevIsMediumOrSmaller, setPrevIsMediumOrSmaller] = useState<boolean | null>(null);
|
|
233
|
+
|
|
234
|
+
React.useEffect(() => {
|
|
235
|
+
// Initial load - set initial values
|
|
236
|
+
if (prevIsSmall === null || prevIsLarge === null || prevIsMediumOrSmaller === null) {
|
|
237
|
+
// On small/medium screens, ALWAYS force small+collapsed regardless of stored prefs.
|
|
238
|
+
// This ensures the sidebar never appears as a permanent drawer on mobile.
|
|
239
|
+
if (isMediumOrSmaller) {
|
|
240
|
+
setLocalNavSize("small");
|
|
241
|
+
setLocalNavExpanded(false);
|
|
242
|
+
} else {
|
|
243
|
+
// Large screen: respect stored preferences or apply defaults
|
|
244
|
+
const hasStoredNavSize = dashStorage.getItem('dashNavSize') !== null;
|
|
245
|
+
const hasStoredNavExpanded = dashStorage.getItem('dashNavExpanded') !== null;
|
|
246
|
+
|
|
247
|
+
if (!hasStoredNavSize) {
|
|
248
|
+
setLocalNavSize("large");
|
|
249
|
+
}
|
|
250
|
+
if (!hasStoredNavExpanded) {
|
|
251
|
+
setLocalNavExpanded(isLargeScreen);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
setPrevIsSmall(isSmallScreen);
|
|
256
|
+
setPrevIsLarge(isLargeScreen);
|
|
257
|
+
setPrevIsMediumOrSmaller(isMediumOrSmaller);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Check if we crossed the medium breakpoint (sidebar position switch)
|
|
262
|
+
if (prevIsMediumOrSmaller !== isMediumOrSmaller) {
|
|
263
|
+
setLocalNavSize(isMediumOrSmaller ? "small" : "large");
|
|
264
|
+
|
|
265
|
+
if (isMediumOrSmaller) {
|
|
266
|
+
// Crossed into medium or smaller screen - collapse nav
|
|
267
|
+
setLocalNavExpanded(false);
|
|
268
|
+
} else {
|
|
269
|
+
// Crossed into larger screen - expand nav
|
|
270
|
+
setLocalNavExpanded(true);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
setPrevIsMediumOrSmaller(isMediumOrSmaller);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Check if we crossed the small breakpoint
|
|
277
|
+
if (prevIsSmall !== isSmallScreen) {
|
|
278
|
+
if (isSmallScreen) {
|
|
279
|
+
// Crossed into small screen - collapse nav
|
|
280
|
+
setLocalNavExpanded(false);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
setPrevIsSmall(isSmallScreen);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Check if we crossed the large breakpoint
|
|
287
|
+
if (prevIsLarge !== isLargeScreen) {
|
|
288
|
+
if (isLargeScreen && !isMediumOrSmaller) {
|
|
289
|
+
// Only expand when crossing into large AND not in secondary mode
|
|
290
|
+
setLocalNavExpanded(true);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
setPrevIsLarge(isLargeScreen);
|
|
294
|
+
}
|
|
295
|
+
// 🎯 NO Redux dispatch here - only local state updates
|
|
296
|
+
// Redux will be synced only on location changes
|
|
297
|
+
}, [isSmallScreen, isLargeScreen, isMediumOrSmaller, prevIsSmall, prevIsLarge, prevIsMediumOrSmaller]);
|
|
298
|
+
|
|
299
|
+
// For horizontal positions (top/bottom), always use expanded/large. For vertical (left/right), use local state.
|
|
300
|
+
const effectiveNavExpanded = isHorizontalPosition ? true : localNavExpanded;
|
|
301
|
+
const effectiveNavSize = isHorizontalPosition ? "large" : localNavSize;
|
|
302
|
+
|
|
303
|
+
const drawerOpen = effectiveNavSize === "large" || (effectiveNavSize === "small" && effectiveNavExpanded);
|
|
304
|
+
const drawerClassName = `sidebar-drawer`;
|
|
305
|
+
|
|
306
|
+
return (
|
|
307
|
+
<Box sx={{ display: 'flex' }}>
|
|
308
|
+
|
|
309
|
+
<MuiDrawer
|
|
310
|
+
variant={localNavSize === "small" ? 'temporary' : 'permanent'}
|
|
311
|
+
anchor={sidebarPosition}
|
|
312
|
+
open={drawerOpen}
|
|
313
|
+
className={drawerClassName}
|
|
314
|
+
data-sidebar-position={sidebarPosition}
|
|
315
|
+
onClose={() => {
|
|
316
|
+
if (localNavSize === "small") {
|
|
317
|
+
setLocalNavExpanded(false);
|
|
318
|
+
// 🎯 NO Redux dispatch here - only local state update
|
|
319
|
+
}
|
|
320
|
+
}}
|
|
321
|
+
ModalProps={{
|
|
322
|
+
keepMounted: true, // Better open performance on mobile
|
|
323
|
+
}}
|
|
324
|
+
>
|
|
325
|
+
<AppMaterialMenu
|
|
326
|
+
navSize={effectiveNavSize}
|
|
327
|
+
navExpanded={effectiveNavExpanded}
|
|
328
|
+
logos={logos}
|
|
329
|
+
onToggleDrawer={isHorizontalPosition ? undefined : toggleDrawer}
|
|
330
|
+
sidebarPosition={sidebarPosition}
|
|
331
|
+
/>
|
|
332
|
+
</MuiDrawer>
|
|
333
|
+
</Box>
|
|
334
|
+
);
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
//AppSidebarMaterial.whyDidYouRender = true;
|
|
338
|
+
|
|
339
|
+
export default AppSidebarMaterial;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Box } from '@mui/material';
|
|
3
|
+
import { useSelector } from 'react-redux';
|
|
4
|
+
import { IDASHAppState } from 'dash-admin-state';
|
|
5
|
+
import { IDashAutoAdminResourceConfig } from 'dash-auto-admin';
|
|
6
|
+
import AvatarComponent from '../../components/user/AvatarComponent';
|
|
7
|
+
import BridgedLocalesMenuButton from '../../components/i18n/BridgedLocalesMenuButton';
|
|
8
|
+
import DarkToggleMode from '../../components/menu/DarkToggleMode';
|
|
9
|
+
import { useAuthContext } from '../../contexts/auth/AuthContext';
|
|
10
|
+
import { SidebarPosition } from './AppSidebarMaterial';
|
|
11
|
+
import LangSwitcher from '../../components/i18n/LangSwitcher';
|
|
12
|
+
|
|
13
|
+
export interface SidebarActionsProps {
|
|
14
|
+
sidebarPosition?: SidebarPosition;
|
|
15
|
+
navExpanded?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Reusable component for sidebar actions: Avatar, Locale Selector, Dark Mode Toggle, and HeaderToolBar
|
|
20
|
+
* Renders horizontally for top/bottom sidebar positions, vertically for left/right
|
|
21
|
+
*
|
|
22
|
+
* When headerToolBarReplace is true in Redux state, ONLY renders the HeaderToolBar component,
|
|
23
|
+
* replacing the default actions (Avatar, Locale, DarkMode toggle).
|
|
24
|
+
*/
|
|
25
|
+
const SidebarActions: React.FC<SidebarActionsProps> = ({
|
|
26
|
+
sidebarPosition = "left",
|
|
27
|
+
navExpanded = true
|
|
28
|
+
}) => {
|
|
29
|
+
const authContext = useAuthContext();
|
|
30
|
+
const isHorizontal = sidebarPosition === "top" || sidebarPosition === "bottom";
|
|
31
|
+
|
|
32
|
+
// Get HeaderToolBar and headerToolBarReplace from Redux
|
|
33
|
+
const HeaderToolBar = useSelector(
|
|
34
|
+
(state: IDASHAppState<any, any, IDashAutoAdminResourceConfig>) =>
|
|
35
|
+
state.common.headerToolBar,
|
|
36
|
+
);
|
|
37
|
+
const headerToolBarReplace = useSelector(
|
|
38
|
+
(state: IDASHAppState<any, any, IDashAutoAdminResourceConfig>) =>
|
|
39
|
+
state.common.headerToolBarReplace,
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<Box
|
|
44
|
+
className="sidebar-actions"
|
|
45
|
+
sx={{
|
|
46
|
+
display: 'flex',
|
|
47
|
+
alignItems: 'center',
|
|
48
|
+
gap: 1,
|
|
49
|
+
//flexDirection: isHorizontal ? 'row' : (navExpanded ? 'column-reverse' : 'column'),
|
|
50
|
+
|
|
51
|
+
...(isHorizontal ? {
|
|
52
|
+
marginLeft: 'auto',
|
|
53
|
+
flexShrink: 0,
|
|
54
|
+
paddingRight: 2,
|
|
55
|
+
flexDirection: navExpanded ? 'row-reverse' : 'row'
|
|
56
|
+
}:
|
|
57
|
+
{
|
|
58
|
+
|
|
59
|
+
flexShrink: 0,
|
|
60
|
+
flexDirection: navExpanded ? 'column' : 'column'
|
|
61
|
+
}
|
|
62
|
+
),
|
|
63
|
+
}}
|
|
64
|
+
>
|
|
65
|
+
{authContext?.authenticated && authContext.user?.id !== 'guest' && (
|
|
66
|
+
<AvatarComponent sidebarPosition={sidebarPosition} />
|
|
67
|
+
)}
|
|
68
|
+
|
|
69
|
+
{HeaderToolBar && headerToolBarReplace ? (
|
|
70
|
+
// Replace mode: Only render the custom HeaderToolBar
|
|
71
|
+
<HeaderToolBar />
|
|
72
|
+
) : (
|
|
73
|
+
// Default mode: Render all actions
|
|
74
|
+
<>
|
|
75
|
+
{HeaderToolBar && <HeaderToolBar />}
|
|
76
|
+
{authContext?.authenticated ? <BridgedLocalesMenuButton /> : <LangSwitcher />}
|
|
77
|
+
<DarkToggleMode />
|
|
78
|
+
</>
|
|
79
|
+
)}
|
|
80
|
+
</Box>
|
|
81
|
+
);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export default SidebarActions;
|