@dashadmin/dash-admin 1.3.72 → 1.3.74-srcfree.1
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/components/tenant/TenancyPlan.js +307 -0
- package/dist/systemResources.js +18 -2
- package/package.json +25 -22
- package/src/AppAsyncWrapper.tsx +0 -42
- package/src/AppWrapper.tsx +0 -45
- package/src/DASHAdmin.tsx +0 -502
- package/src/DASHAdmin.tsx.old +0 -456
- package/src/RoutingWrapper.tsx +0 -143
- package/src/classes/DASHStorageClass.tsx +0 -8
- package/src/components/Input/RichTextField.tsx +0 -27
- package/src/components/Redirect.tsx +0 -46
- package/src/components/avatar/Avatar.tsx +0 -71
- package/src/components/avatar/SingleImageUploader.tsx +0 -107
- package/src/components/currency/Format.tsx +0 -79
- package/src/components/custom/Redirect.tsx +0 -23
- package/src/components/error/Error.tsx +0 -168
- package/src/components/geocoding/GeocodingField.tsx +0 -167
- package/src/components/i18n/BridgedLocalesMenuButton.tsx +0 -160
- package/src/components/i18n/LangSwitcher.tsx +0 -204
- package/src/components/loader/GlobalLoader.tsx +0 -49
- package/src/components/logs/LogFile.tsx +0 -88
- package/src/components/logs/LogFileById.tsx +0 -68
- package/src/components/logs/LogViewer.tsx +0 -43
- package/src/components/menu/AppMenu.tsx +0 -22
- package/src/components/menu/CustomMenuItemLink.tsx +0 -61
- package/src/components/menu/DarkToggleMode.tsx +0 -65
- package/src/components/menu/LanguageToggleMode.tsx +0 -120
- package/src/components/misc/CustomImageInput.tsx +0 -62
- package/src/components/misc/DASHGlobalErrorHandler.tsx +0 -194
- package/src/components/misc/DarkModeSwitcher.tsx +0 -112
- package/src/components/misc/HorizontalScroller.tsx +0 -225
- package/src/components/misc/LanguageSwitcher.tsx +0 -199
- package/src/components/misc/MUIHtmlToolTip.tsx +0 -15
- package/src/components/misc/MuiSimpleJsonTable.tsx +0 -279
- package/src/components/misc/MultiLevelTable.tsx +0 -229
- package/src/components/misc/NoResults.tsx +0 -28
- package/src/components/misc/PDFViewer.tsx +0 -85
- package/src/components/navigation/Breadcrumbs.tsx +0 -220
- package/src/components/navigation/BreadcrumbsManager.tsx +0 -310
- package/src/components/navigation/index.tsx +0 -5
- package/src/components/panel/Error.tsx +0 -168
- package/src/components/permission/AvailablePermissionsContext.tsx +0 -173
- package/src/components/permission/PermissionsSelector.tsx +0 -834
- package/src/components/permission/PermissionsSelectorList.tsx +0 -473
- package/src/components/permission/tsx +0 -0
- package/src/components/racustombuttons/CustomRAButton.tsx +0 -87
- package/src/components/racustombuttons/QuickButton.tsx +0 -117
- package/src/components/racustombuttons/QuickEditButton.tsx +0 -115
- package/src/components/racustombuttons/QuickIconButton.tsx +0 -122
- package/src/components/scrollbar/Scrollbar.tsx +0 -31
- package/src/components/selects/MultiSelect.tsx +0 -53
- package/src/components/selects/RASearchableSelect.tsx +0 -282
- package/src/components/selects/RASearchableSelectChips.tsx +0 -308
- package/src/components/selects/SearchableSelect.tsx +0 -139
- package/src/components/serviceAccount/ApiKeyRevealDialog.tsx +0 -129
- package/src/components/serviceAccount/ServiceAccountStatusSwitch.tsx +0 -99
- package/src/components/subscription/BillingCycleSelectInput.tsx +0 -68
- package/src/components/subscription/PlanAddonsSettings.tsx +0 -563
- package/src/components/subscription/PlanAuditLog.tsx +0 -453
- package/src/components/subscription/PlanFeaturesSettings.tsx +0 -243
- package/src/components/subscription/PlanLimitsSettings.tsx +0 -230
- package/src/components/subscription/PlanMetadataSettings.tsx +0 -306
- package/src/components/subscription/PlanPricesSettings.tsx +0 -307
- package/src/components/subscription/index.ts +0 -7
- package/src/components/svgelements/SvgLoading.tsx +0 -229
- package/src/components/svgelements/SvgLogo.tsx +0 -53
- package/src/components/svgelements/SvgLogoMin.tsx +0 -64
- package/src/components/svgelements/SvgShipping.tsx +0 -673
- package/src/components/tenancy/GlobalTenantWrapper.tsx +0 -84
- package/src/components/tenancy/TenantSwitcher.tsx +0 -514
- package/src/components/tenant/AvailablePermissionsContext.tsx +0 -0
- package/src/components/tenant/SettingsSections.tsx +0 -151
- package/src/components/tenant/TenancySettings.tsx +0 -122
- package/src/components/tenant/TenantAttributes.tsx +0 -153
- package/src/components/tenant/TenantAttributesContext.tsx +0 -163
- package/src/components/tenant/TenantSelector.tsx +0 -142
- package/src/components/tenant/TenantSettings.tsx +0 -184
- package/src/components/tenant/TenantSettingsContext.tsx +0 -165
- package/src/components/tenant/TenantTheme.tsx +0 -172
- package/src/components/user/AvatarComponent.tsx +0 -317
- package/src/components/user/TenantAvatarComponent.tsx +0 -99
- package/src/components/user/UserPreferences.tsx +0 -677
- package/src/config/ACTIONS.tsx +0 -26
- package/src/config/ConstantsService.tsx +0 -44
- package/src/config/DASHAdminSystemConstants.tsx +0 -183
- package/src/config/PARSERS.tsx +0 -9
- package/src/contexts/DashQueryClientContext.tsx +0 -113
- package/src/contexts/DashResourceContext.tsx +0 -34
- package/src/contexts/I18nBridgeContext.tsx +0 -156
- package/src/contexts/I18nBridgeSetter.tsx +0 -39
- package/src/contexts/I18nReduxSync.tsx +0 -27
- package/src/contexts/SubscriptionPlanFormatsProvider.tsx +0 -217
- package/src/contexts/SystemRequestsCache.tsx +0 -215
- package/src/contexts/auth/AuthContext.tsx +0 -567
- package/src/contexts/auth/AuthContextLocalStorage.tsx +0 -140
- package/src/contexts/auth/DASHAuthenticationService.tsx +0 -915
- package/src/contexts/auth/WindowContext.tsx +0 -15
- package/src/contexts/auth/index.tsx +0 -3
- package/src/contexts/com/FCMContext.tsx +0 -415
- package/src/contexts/com/LaravelEchoContext.tsx +0 -41
- package/src/contexts/com/LaravelEchoMgr.tsx +0 -155
- package/src/contexts/com/components/DefaultNotificationComponent.tsx +0 -20
- package/src/contexts/com/components/EchoNotificationsCenter.tsx +0 -65
- package/src/contexts/com/components/NotificationAttributesTable.tsx +0 -54
- package/src/contexts/com/components/NotificationRenderer.tsx +0 -42
- package/src/contexts/com/components/NotificationsWidget.tsx +0 -182
- package/src/contexts/com/components/notificationFormats.tsx +0 -50
- package/src/contexts/com/useLaravelEcho.tsx +0 -432
- package/src/contexts/dictionary/DictionaryContext.tsx +0 -94
- package/src/declarations.d.ts +0 -17
- package/src/default-theme/DASHAppProviders.tsx +0 -117
- package/src/default-theme/DashThemeContext.tsx +0 -209
- package/src/default-theme/DashThemeContext.tsx.fast +0 -143
- package/src/default-theme/DashThemeContext.tsx.old +0 -306
- package/src/default-theme/DashThemeHelperProvider.tsx +0 -98
- package/src/default-theme/DomainAppLayout.tsx +0 -166
- package/src/default-theme/DomainHeader.tsx +0 -162
- package/src/default-theme/DomainTheme.tsx +0 -59
- package/src/default-theme/FullLayoutMarkup.tsx +0 -231
- package/src/default-theme/StaticLayout.tsx +0 -47
- package/src/default-theme/index.tsx +0 -11
- package/src/default-theme/menu/AppDashboardGrid.tsx +0 -279
- package/src/default-theme/menu/AppMaterialMenu.tsx +0 -546
- package/src/default-theme/menu/AppMenuComponents/SubmenuPortal.tsx +0 -61
- package/src/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItem.tsx +0 -264
- package/src/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItems.tsx +0 -31
- package/src/default-theme/menu/AppMenuComponents/expanded/CollapsableSidebarMenu.tsx +0 -293
- package/src/default-theme/menu/AppMenuComponents/expanded/SidebarItem.tsx +0 -92
- package/src/default-theme/menu/AppMenuComponents/getItem.tsx +0 -17
- package/src/default-theme/menu/AppMenuComponents/interfaces.tsx +0 -41
- package/src/default-theme/menu/AppMenuComponents/submenuConstants.ts +0 -90
- package/src/default-theme/menu/AppSidebarMaterial.tsx +0 -339
- package/src/default-theme/menu/SidebarActions.tsx +0 -84
- package/src/default-theme/updateDomCssVariables.tsx +0 -176
- package/src/helpers/checkRole.tsx +0 -66
- package/src/helpers/parseAxiosError.tsx +0 -41
- package/src/hooks/audio/useAudio.tsx +0 -39
- package/src/hooks/axios.tsx +0 -165
- package/src/hooks/data/useDashboardStats.tsx +0 -65
- package/src/hooks/data/usePackageByClientsStats.tsx +0 -44
- package/src/hooks/data/usePackageByCommunesStats.tsx +0 -44
- package/src/hooks/data/usePackageStats.tsx +0 -69
- package/src/hooks/data/usePackageWithdrawDetails.tsx +0 -61
- package/src/hooks/data/useStats.tsx +0 -86
- package/src/hooks/isCurrentPath.tsx +0 -22
- package/src/hooks/notifications/WSMessagesManager.tsx +0 -152
- package/src/hooks/notifications/WSPusherManager.tsx +0 -92
- package/src/hooks/useBreadcrumbs.tsx +0 -329
- package/src/hooks/useClickOutside.tsx +0 -57
- package/src/hooks/useFormPersistance.tsx +0 -150
- package/src/hooks/useGlobalErrorMediator.tsx +0 -43
- package/src/hooks/useGlobalLoaderMgr.tsx +0 -21
- package/src/hooks/useHash.tsx +0 -27
- package/src/hooks/useLocalStorage.tsx +0 -196
- package/src/hooks/usePolyglotTranslation.tsx +0 -62
- package/src/hooks/usePrevious.tsx +0 -9
- package/src/hooks/usePrintSelected.tsx +0 -37
- package/src/hooks/useVirtualHash.tsx +0 -33
- package/src/hooks/window/useWindowSize.tsx +0 -36
- package/src/index.tsx +0 -134
- package/src/interfaces/IAppResourceConfig.tsx +0 -20
- package/src/interfaces/Log.tsx +0 -16
- package/src/interfaces/Tenant.tsx +0 -25
- package/src/interfaces/communication/IActions.tsx +0 -5
- package/src/interfaces/communication/INotification.tsx +0 -21
- package/src/interfaces/communication/IPayload.tsx +0 -3
- package/src/interfaces/communication/IRequestAction.tsx +0 -10
- package/src/interfaces/communication/IRequestPayload.tsx +0 -7
- package/src/interfaces/communication/IResponseAction.tsx +0 -7
- package/src/interfaces/misc/IAny.tsx +0 -3
- package/src/interfaces/misc/IFlashMessage.tsx +0 -10
- package/src/interfaces/navigation/IAppMenu.ts +0 -14
- package/src/interfaces/navigation/ICollapsableSidebarMenu.ts +0 -12
- package/src/interfaces/navigation/IMenuItem.ts +0 -16
- package/src/interfaces/notifications/IModel.tsx +0 -6
- package/src/interfaces/notifications/IModelField.tsx +0 -8
- package/src/interfaces/notifications/IUserNotification.tsx +0 -12
- package/src/interfaces/notifications/IUserNotificationData.tsx +0 -13
- package/src/interfaces/notifications/IUserNotificationPayload.tsx +0 -8
- package/src/interfaces/user/IGetAuth.tsx +0 -92
- package/src/interfaces/user/ITenantSettings.tsx +0 -3
- package/src/interfaces/user/IUser.tsx +0 -60
- package/src/interfaces/user/IUserSettings.tsx +0 -43
- package/src/interfaces.tsx +0 -6
- package/src/layout/AppLayout.tsx +0 -112
- package/src/layout/ApplicationLayout.tsx +0 -197
- package/src/layout/MotionWrapper.original.tsx +0 -236
- package/src/layout/MotionWrapper.tsx +0 -236
- package/src/layout/ResourceMenu.tsx +0 -164
- package/src/layout/ResoureLayout.tsx +0 -105
- package/src/layout/TransitionWrapper.tsx +0 -125
- package/src/pages/ChangePassword.tsx +0 -179
- package/src/pages/DASHLanding.tsx +0 -22
- package/src/pages/DASHLightWeightLogin.tsx +0 -611
- package/src/pages/DASHSimpleLogin.tsx +0 -260
- package/src/pages/Login.tsx +0 -111
- package/src/pages/Profile.tsx +0 -357
- package/src/pages/RecoverPassword.tsx +0 -175
- package/src/pages/SingleImageUploader.tsx +0 -55
- package/src/pages/VerifyAccount.tsx +0 -128
- package/src/providers/authProvider.tsx +0 -217
- package/src/providers/dataProvider.tsx +0 -672
- package/src/providers/i18n/en.ts +0 -646
- package/src/providers/i18n/es.ts +0 -652
- package/src/providers/i18n/languages.tsx +0 -8
- package/src/providers/i18n/mergeTranslations.ts +0 -53
- package/src/providers/i18nProvider.tsx +0 -23
- package/src/react-admin-dash/RADashComponent.tsx +0 -240
- package/src/react-admin-dash/Resource.tsx +0 -77
- package/src/resources/Brand/BrandResource.tsx +0 -130
- package/src/resources/DASHResourceLoader.ts +0 -180
- package/src/resources/Log/LogResource.tsx +0 -73
- package/src/resources/Tenant/ImpersonateTenantResource.tsx +0 -113
- package/src/resources/Trash/TrashTemplate.tsx +0 -180
- package/src/resources/User/components/AvatarUploadField.tsx +0 -57
- package/src/resources/User/components/PasswordFields.tsx +0 -73
- package/src/resources/User/getProfileMenu.ts +0 -57
- package/src/resources/User/profileResource.tsx +0 -51
- package/src/resources/User/userLayout.tsx +0 -62
- package/src/resources/User/userResource.tsx +0 -111
- package/src/resources/User/userSchema.tsx +0 -213
- package/src/resources/User/usersFilters.tsx +0 -21
- package/src/resources.tsx +0 -280
- package/src/schemas/log.tsx +0 -45
- package/src/schemas/notification.tsx +0 -42
- package/src/schemas/permissions.tsx +0 -44
- package/src/schemas/roles.tsx +0 -48
- package/src/schemas/rolesDataGrid.tsx +0 -48
- package/src/schemas/subscription/components/SubscriptionActions.tsx +0 -153
- package/src/schemas/subscription/components/SubscriptionPaymentHistory.tsx +0 -127
- package/src/schemas/subscription/components/SubscriptionPlanFeatures.tsx +0 -162
- package/src/schemas/subscription/components/SubscriptionPlanPreview.tsx +0 -141
- package/src/schemas/subscription/components/SubscriptionPlanStats.tsx +0 -318
- package/src/schemas/subscription/components/SubscriptionStatusIndicator.tsx +0 -72
- package/src/schemas/subscription/subscriptionPlanSchema.tsx +0 -185
- package/src/schemas/subscription/subscriptionSchema.tsx +0 -152
- package/src/schemas/subscriptionPlan.ts +0 -422
- package/src/schemas/tenant.tsx +0 -129
- package/src/schemas/tenantUser.tsx +0 -96
- package/src/schemas/tenant_superadmin.tsx +0 -119
- package/src/schemas/user.tsx +0 -26
- package/src/systemResources.old.tsx +0 -928
- package/src/systemResources.tsx +0 -1369
- package/src/templates/ResourceTemplate.tsx +0 -240
- package/src/templates/ResourceTemplate.tsx.memoized_experiment +0 -350
- package/src/templates/ResourceTemplate.tsx.original +0 -396
- package/src/templates/ResourceTemplateCreate.tsx +0 -182
- package/src/templates/ResourceTemplateEdit.tsx +0 -176
- package/src/templates/ResourceTemplateFull.tsx +0 -581
- package/src/templates/ResourceTemplateList.tsx +0 -340
- package/src/templates/ResourceTemplateOld.tsx.bkup +0 -567
- package/src/templates/ResourceTemplateShow.tsx +0 -88
- package/src/templates/TrashTemplate.tsx +0 -179
- package/src/tenantResources.tsx +0 -223
- package/src/test_portal_bubbles.tsx +0 -40
- package/src/theme/AppHeader.tsx +0 -52
- package/src/theme/AppLayoutSetting.tsx +0 -33
- package/src/theme/AppLogo.tsx +0 -13
- package/src/theme/AppSidebar.tsx +0 -12
- package/src/theme/AppSidebarContent.tsx +0 -105
- package/src/theme/AppSidebarLogo.tsx +0 -48
- package/src/theme/components/PageTitle.tsx +0 -37
- package/src/utils/cache/CacheInvalidatorContext.tsx +0 -125
- package/src/utils/cache/CacheInvalidatorListenerComponent.tsx +0 -10
- package/src/utils/cache/useCacheInvalidatorListener.tsx +0 -27
- package/src/utils/convertFileToBase64.tsx +0 -9
- package/src/utils/convertToFile.tsx +0 -14
- package/src/utils/cookies.tsx +0 -33
- package/src/utils/dashDefaultQueryClient.tsx +0 -34
- package/src/utils/dataUrlToBlob.tsx +0 -30
- package/src/utils/deepReplace.tsx +0 -19
- package/src/utils/getProfileMenu.tsx +0 -41
- package/src/utils/getTenantSettings.tsx +0 -9
- package/src/utils/getType.tsx +0 -8
- package/src/utils/getUserSettings.tsx +0 -8
- package/src/utils/hasCode.tsx +0 -14
- package/src/utils/index.ts +0 -19
- package/src/utils/injectTenantStyles.ts +0 -28
- package/src/utils/isComponent.tsx +0 -45
- package/src/utils/navEvents.tsx +0 -91
- package/src/utils/prototypes.tsx +0 -5
- package/src/utils/regexp.tsx +0 -4
- package/src/utils/resolveObjectPath.tsx +0 -4
- package/src/utils/setNativeValue.tsx +0 -24
- package/src/utils/slugify.tsx +0 -11
- package/src/utils/validators/emailValidator.tsx +0 -6
- package/src/utils/validators/requiredValidator.tsx +0 -5
- package/src/utils/validators/rutValidator.tsx +0 -31
- package/src/utils/validators.tsx +0 -96
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BridgedLocalesMenuButton
|
|
3
|
-
*
|
|
4
|
-
* A custom locale menu button that uses the bridged i18nProvider
|
|
5
|
-
* instead of React Admin's context-based provider.
|
|
6
|
-
*
|
|
7
|
-
* This is necessary because AppMaterialMenu renders outside AdminContext,
|
|
8
|
-
* so it can't access the custom i18nProvider with getLocales().
|
|
9
|
-
*/
|
|
10
|
-
import React, { useState, useCallback } from 'react';
|
|
11
|
-
import { Menu, MenuItem, Button, Tooltip, IconButton } from '@mui/material';
|
|
12
|
-
import TranslateIcon from '@mui/icons-material/Translate';
|
|
13
|
-
import LanguageIcon from '@mui/icons-material/Language';
|
|
14
|
-
import { useI18nBridge, useBridgedLocales } from '../../contexts/I18nBridgeContext';
|
|
15
|
-
import { useLocaleState } from 'react-admin';
|
|
16
|
-
import { useDispatch } from 'react-redux';
|
|
17
|
-
import { DASH_REDUX_ACTIONS } from 'dash-admin-state';
|
|
18
|
-
|
|
19
|
-
interface BridgedLocalesMenuButtonProps {
|
|
20
|
-
/** Show icon only (compact mode) */
|
|
21
|
-
iconOnly?: boolean;
|
|
22
|
-
/** Custom icon */
|
|
23
|
-
icon?: React.ReactNode;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const BridgedLocalesMenuButton: React.FC<BridgedLocalesMenuButtonProps> = ({
|
|
27
|
-
iconOnly = true,
|
|
28
|
-
icon = <LanguageIcon />
|
|
29
|
-
}) => {
|
|
30
|
-
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
|
|
31
|
-
const locales = useBridgedLocales();
|
|
32
|
-
const { i18nProvider, locale: currentLocale, setLocale: setBridgedLocale } = useI18nBridge();
|
|
33
|
-
// We still use RA's useLocaleState but only to SET it if needed,
|
|
34
|
-
// though we should really just use the bridge
|
|
35
|
-
const [, setRALocale] = useLocaleState();
|
|
36
|
-
|
|
37
|
-
const handleClick = useCallback((event: React.MouseEvent<HTMLElement>) => {
|
|
38
|
-
setAnchorEl(event.currentTarget);
|
|
39
|
-
}, []);
|
|
40
|
-
|
|
41
|
-
const handleClose = useCallback(() => {
|
|
42
|
-
setAnchorEl(null);
|
|
43
|
-
}, []);
|
|
44
|
-
|
|
45
|
-
const dispatch = useDispatch(); // Add dispatch
|
|
46
|
-
|
|
47
|
-
const handleLocaleChange = useCallback(async (locale: string) => {
|
|
48
|
-
console.log('🌐 BridgedLocalesMenuButton: Changing locale to:', locale);
|
|
49
|
-
|
|
50
|
-
// Use bridged provider to change locale (async)
|
|
51
|
-
// This updates the actual translation provider logic/internal state
|
|
52
|
-
if (i18nProvider?.changeLocale) {
|
|
53
|
-
console.log('🌐 BridgedLocalesMenuButton: Awaiting changeLocale...');
|
|
54
|
-
try {
|
|
55
|
-
await i18nProvider.changeLocale(locale);
|
|
56
|
-
console.log('🌐 BridgedLocalesMenuButton: changeLocale complete.');
|
|
57
|
-
} catch (error) {
|
|
58
|
-
console.error('🌐 BridgedLocalesMenuButton: changeLocale failed:', error);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Persist locale to localStorage for persistence across page reloads
|
|
63
|
-
try {
|
|
64
|
-
localStorage.setItem('dash-user-locale', locale);
|
|
65
|
-
console.log('🌐 BridgedLocalesMenuButton: Persisted locale to localStorage:', locale);
|
|
66
|
-
} catch (e) {
|
|
67
|
-
console.warn('🌐 BridgedLocalesMenuButton: Failed to persist locale to localStorage:', e);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// UPDATE STATE LAST (after provider is ready)
|
|
71
|
-
// This triggers re-render. Since provider is ready, translations will be correct.
|
|
72
|
-
console.log('🌐 BridgedLocalesMenuButton: Updating state...');
|
|
73
|
-
|
|
74
|
-
// 1. Update Redux state (Critical for DASHAdmin and ResourceTemplate propagation)
|
|
75
|
-
// We pass the full object if needed, but the reducer seems to handle the payload directly or we might need to check if it expects a string or object.
|
|
76
|
-
// Looking at SettingsReducer: locale: action.payload.
|
|
77
|
-
// Looking at SettingsReducer initial state: locale is an object { languageId, locale, name, icon }.
|
|
78
|
-
// But switchLanguage action just takes 'locale'.
|
|
79
|
-
// If the reducer replaces the WHOLE state.locale object with a string, it might break other things IF they expect an object.
|
|
80
|
-
// Let's check Settting.tsx: dispatch({ type: SWITCH_LANGUAGE, payload: locale });
|
|
81
|
-
// Let's check SettingsReducer: return { ...state, locale: action.payload };
|
|
82
|
-
// If action.payload is a string 'en', then state.settings.locale becomes 'en'.
|
|
83
|
-
// DASHAdmin selectLocale returns state.settings.locale.
|
|
84
|
-
// AsyncResources expects locale (any).
|
|
85
|
-
// It seems DASHAdmin handles it being a string.
|
|
86
|
-
dispatch(DASH_REDUX_ACTIONS.switchLanguage(locale) as any);
|
|
87
|
-
|
|
88
|
-
// 2. Update Bridged Context
|
|
89
|
-
setBridgedLocale(locale);
|
|
90
|
-
|
|
91
|
-
// 3. Update React Admin State
|
|
92
|
-
setRALocale(locale);
|
|
93
|
-
|
|
94
|
-
handleClose();
|
|
95
|
-
}, [i18nProvider, setBridgedLocale, setRALocale, handleClose, dispatch]);
|
|
96
|
-
|
|
97
|
-
// Don't render if no locales available
|
|
98
|
-
if (!locales || locales.length <= 1) {
|
|
99
|
-
console.log('🌐 BridgedLocalesMenuButton: Not rendering - locales:', locales);
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
console.log('🌐 BridgedLocalesMenuButton: Rendering with locales:', locales, 'current:', currentLocale);
|
|
104
|
-
|
|
105
|
-
const open = Boolean(anchorEl);
|
|
106
|
-
const currentLocaleName = locales.find(l => l.locale === currentLocale)?.name || currentLocale;
|
|
107
|
-
|
|
108
|
-
return (
|
|
109
|
-
<>
|
|
110
|
-
{iconOnly ? (
|
|
111
|
-
<Tooltip title={`Language: ${currentLocaleName}`}>
|
|
112
|
-
<IconButton
|
|
113
|
-
onClick={handleClick}
|
|
114
|
-
className="dash-icon-button-color dash-icon-button-bg"
|
|
115
|
-
aria-label="change language"
|
|
116
|
-
aria-controls={open ? 'locale-menu' : undefined}
|
|
117
|
-
aria-haspopup="true"
|
|
118
|
-
aria-expanded={open ? 'true' : undefined}
|
|
119
|
-
>
|
|
120
|
-
{icon}
|
|
121
|
-
</IconButton>
|
|
122
|
-
</Tooltip>
|
|
123
|
-
) : (
|
|
124
|
-
<Button
|
|
125
|
-
onClick={handleClick}
|
|
126
|
-
color="inherit"
|
|
127
|
-
startIcon={icon}
|
|
128
|
-
aria-controls={open ? 'locale-menu' : undefined}
|
|
129
|
-
aria-haspopup="true"
|
|
130
|
-
aria-expanded={open ? 'true' : undefined}
|
|
131
|
-
>
|
|
132
|
-
{currentLocaleName}
|
|
133
|
-
</Button>
|
|
134
|
-
)}
|
|
135
|
-
<Menu
|
|
136
|
-
id="locale-menu"
|
|
137
|
-
anchorEl={anchorEl}
|
|
138
|
-
open={open}
|
|
139
|
-
onClose={handleClose}
|
|
140
|
-
slotProps={{
|
|
141
|
-
list: {
|
|
142
|
-
'aria-labelledby': 'locale-button',
|
|
143
|
-
}
|
|
144
|
-
}}
|
|
145
|
-
>
|
|
146
|
-
{locales.map((localeOption) => (
|
|
147
|
-
<MenuItem
|
|
148
|
-
key={localeOption.locale}
|
|
149
|
-
selected={localeOption.locale === currentLocale}
|
|
150
|
-
onClick={() => handleLocaleChange(localeOption.locale)}
|
|
151
|
-
>
|
|
152
|
-
{localeOption.name || localeOption.locale}
|
|
153
|
-
</MenuItem>
|
|
154
|
-
))}
|
|
155
|
-
</Menu>
|
|
156
|
-
</>
|
|
157
|
-
);
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
export default BridgedLocalesMenuButton;
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import { MouseEvent, useState, useRef, useEffect } from 'react';
|
|
3
|
-
import { Avatar, useMediaQuery, useTheme } from '@mui/material';
|
|
4
|
-
import LanguageIcon from '@mui/icons-material/Translate';
|
|
5
|
-
import ReactDOM from 'react-dom';
|
|
6
|
-
import { useWindowSize } from 'dash-utils';
|
|
7
|
-
import { useLocales, useLocaleState } from '../../hooks/usePolyglotTranslation';
|
|
8
|
-
import { useBridgedChangeLocale } from '../../contexts/I18nBridgeContext';
|
|
9
|
-
const DefaultIcon = <LanguageIcon />;
|
|
10
|
-
|
|
11
|
-
export interface LanguageSwitcherButtonProps {
|
|
12
|
-
icon?: React.ReactNode;
|
|
13
|
-
languages?: { locale: string; name: string }[];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const LangSwitcher = (props: LanguageSwitcherButtonProps) => {
|
|
17
|
-
const { icon = DefaultIcon, languages: languagesProp } = props;
|
|
18
|
-
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
|
|
19
|
-
|
|
20
|
-
const languages = useLocales({ locales: languagesProp });
|
|
21
|
-
const [locale, setLocale] = useLocaleState();
|
|
22
|
-
const changeBridgedLocale = useBridgedChangeLocale();
|
|
23
|
-
|
|
24
|
-
const theme = useTheme();
|
|
25
|
-
const isSmallScreen = useMediaQuery(theme.breakpoints.down('md'));
|
|
26
|
-
const [webView, setWebView] = useState<boolean>(false);
|
|
27
|
-
const [open, setOpen] = useState(false);
|
|
28
|
-
const avatarRef = useRef<HTMLDivElement>(null);
|
|
29
|
-
const menuRef = useRef<HTMLDivElement>(null);
|
|
30
|
-
const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 });
|
|
31
|
-
const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
32
|
-
|
|
33
|
-
const windowSize = useWindowSize();
|
|
34
|
-
useEffect(() => {
|
|
35
|
-
if(document.body.classList.contains('webview')) {
|
|
36
|
-
setWebView(true)
|
|
37
|
-
} else {
|
|
38
|
-
setWebView(false)
|
|
39
|
-
}
|
|
40
|
-
}, []);
|
|
41
|
-
|
|
42
|
-
const getNameForLocale = (locale: string): string => {
|
|
43
|
-
const language = languages.find(language => language.locale === locale);
|
|
44
|
-
return language ? language.name : '';
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const changeLocale = (newLocale: string) => (): void => {
|
|
48
|
-
setLocale(newLocale);
|
|
49
|
-
// Also update the bridge context so components like AppMaterialMenu re-render
|
|
50
|
-
changeBridgedLocale(newLocale);
|
|
51
|
-
setOpen(false);
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const calculateMenuPosition = () => {
|
|
55
|
-
if (avatarRef.current && windowSize.width) {
|
|
56
|
-
const rect = avatarRef.current.getBoundingClientRect();
|
|
57
|
-
const menuWidth = 200; // minWidth from styles
|
|
58
|
-
|
|
59
|
-
let left = rect.left + window.scrollX;
|
|
60
|
-
|
|
61
|
-
// Ensure menu doesn't go off-screen using windowSize
|
|
62
|
-
if (left + menuWidth > windowSize.width) {
|
|
63
|
-
left = windowSize.width - menuWidth - 10; // 10px margin
|
|
64
|
-
}
|
|
65
|
-
if (left < 10) {
|
|
66
|
-
left = 10; // 10px margin
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
setMenuPosition({
|
|
70
|
-
top: rect.top + window.scrollY + 30,
|
|
71
|
-
left: left
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
const handleLanguageMouseEnter = (e: React.MouseEvent<HTMLDivElement>) => {
|
|
77
|
-
e.preventDefault();
|
|
78
|
-
|
|
79
|
-
// Clear any existing timeout
|
|
80
|
-
if (timeoutRef.current) {
|
|
81
|
-
clearTimeout(timeoutRef.current);
|
|
82
|
-
timeoutRef.current = null;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
setOpen(true);
|
|
86
|
-
calculateMenuPosition();
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
const handleLanguageClick = (e: React.MouseEvent<HTMLDivElement>) => {
|
|
90
|
-
e.preventDefault();
|
|
91
|
-
setOpen(prevOpen => !prevOpen);
|
|
92
|
-
calculateMenuPosition();
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
const handleMouseLeave = () => {
|
|
96
|
-
if (!webView) {
|
|
97
|
-
// Add a small delay before closing to allow moving to menu
|
|
98
|
-
timeoutRef.current = setTimeout(() => {
|
|
99
|
-
setOpen(false);
|
|
100
|
-
}, 100);
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
const handleMenuMouseEnter = () => {
|
|
105
|
-
// Clear timeout when entering menu
|
|
106
|
-
if (timeoutRef.current) {
|
|
107
|
-
clearTimeout(timeoutRef.current);
|
|
108
|
-
timeoutRef.current = null;
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
const handleMenuMouseLeave = () => {
|
|
113
|
-
if (!webView) {
|
|
114
|
-
setOpen(false);
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
// Cleanup timeout on unmount
|
|
119
|
-
useEffect(() => {
|
|
120
|
-
return () => {
|
|
121
|
-
if (timeoutRef.current) {
|
|
122
|
-
clearTimeout(timeoutRef.current);
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
}, []);
|
|
126
|
-
|
|
127
|
-
// Recalculate position on screen resize
|
|
128
|
-
useEffect(() => {
|
|
129
|
-
const handleResize = () => {
|
|
130
|
-
if (open) {
|
|
131
|
-
calculateMenuPosition();
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
window.addEventListener('resize', handleResize);
|
|
136
|
-
return () => window.removeEventListener('resize', handleResize);
|
|
137
|
-
}, [open, isSmallScreen]);
|
|
138
|
-
|
|
139
|
-
return (
|
|
140
|
-
<>
|
|
141
|
-
<div
|
|
142
|
-
ref={avatarRef}
|
|
143
|
-
|
|
144
|
-
{... !webView ? {
|
|
145
|
-
onMouseEnter: handleLanguageMouseEnter,
|
|
146
|
-
onMouseLeave: handleMouseLeave
|
|
147
|
-
} : {
|
|
148
|
-
onClick: handleLanguageClick
|
|
149
|
-
}}
|
|
150
|
-
>
|
|
151
|
-
<Avatar
|
|
152
|
-
sizes='small'
|
|
153
|
-
sx={{ fontSize: '1rem' }}
|
|
154
|
-
style={{
|
|
155
|
-
width: '30px',
|
|
156
|
-
height: '30px',
|
|
157
|
-
minHeight: '30px'
|
|
158
|
-
}}
|
|
159
|
-
className='dash-icon-button-color dash-icon-button-bg'
|
|
160
|
-
>
|
|
161
|
-
{getNameForLocale(locale).substring(0, 2).toUpperCase()}
|
|
162
|
-
</Avatar>
|
|
163
|
-
</div>
|
|
164
|
-
|
|
165
|
-
{open && ReactDOM.createPortal(
|
|
166
|
-
<div
|
|
167
|
-
ref={menuRef}
|
|
168
|
-
className="dash-language-menu-portal"
|
|
169
|
-
onMouseEnter={!webView ? handleMenuMouseEnter : undefined}
|
|
170
|
-
onMouseLeave={!webView ? handleMenuMouseLeave : undefined}
|
|
171
|
-
>
|
|
172
|
-
<div
|
|
173
|
-
className={`dash-language-menu ${open ? 'show' : ''}`}
|
|
174
|
-
style={{
|
|
175
|
-
zIndex: 10000,
|
|
176
|
-
position: 'absolute',
|
|
177
|
-
top: menuPosition.top,
|
|
178
|
-
left: menuPosition.left,
|
|
179
|
-
}}
|
|
180
|
-
>
|
|
181
|
-
{languages.map(language => (
|
|
182
|
-
<div
|
|
183
|
-
key={language.locale}
|
|
184
|
-
className={`dash-language-menu-item ${language.locale === locale ? 'selected' : ''}`}
|
|
185
|
-
onClick={changeLocale(language.locale)}
|
|
186
|
-
style={{
|
|
187
|
-
padding: '8px 16px',
|
|
188
|
-
cursor: 'pointer',
|
|
189
|
-
backgroundColor: language.locale === locale ? 'rgba(0, 0, 0, 0.08)' : 'transparent',
|
|
190
|
-
minWidth: '150px'
|
|
191
|
-
}}
|
|
192
|
-
>
|
|
193
|
-
{language.name}
|
|
194
|
-
</div>
|
|
195
|
-
))}
|
|
196
|
-
</div>
|
|
197
|
-
</div>,
|
|
198
|
-
document.body
|
|
199
|
-
)}
|
|
200
|
-
</>
|
|
201
|
-
);
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
export default LangSwitcher;
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @author Francisco Aranda - @farandal - http://www.linkedin.com/in/farandal
|
|
3
|
-
* @email farandal@gmail.com
|
|
4
|
-
* @create date 2021-06-30
|
|
5
|
-
* @desc @farandal React Boilerplate Framework - 2020
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { deepmerge } from '@mui/utils';
|
|
9
|
-
|
|
10
|
-
import React, { PropsWithChildren, useEffect } from 'react';
|
|
11
|
-
import useGlobalLoaderMgr from '../../hooks/useGlobalLoaderMgr';
|
|
12
|
-
|
|
13
|
-
interface IGlobalLoader extends PropsWithChildren {
|
|
14
|
-
styles?: any;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const GlobalLoader: React.FC<IGlobalLoader> = ({
|
|
18
|
-
styles,
|
|
19
|
-
children,
|
|
20
|
-
}) => {
|
|
21
|
-
const [loading] = useGlobalLoaderMgr();
|
|
22
|
-
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
console.log('GlobalLoader loading state changed:', loading);
|
|
25
|
-
}, [loading]);
|
|
26
|
-
|
|
27
|
-
if (!loading) return null;
|
|
28
|
-
|
|
29
|
-
const wrapperStyle = deepmerge(
|
|
30
|
-
{
|
|
31
|
-
width: '100%',
|
|
32
|
-
height: '100%',
|
|
33
|
-
overflow: 'hidden',
|
|
34
|
-
display: 'flex',
|
|
35
|
-
alignItems: 'center',
|
|
36
|
-
justifyContent: 'center',
|
|
37
|
-
},
|
|
38
|
-
styles?.wrapper
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
return (
|
|
42
|
-
<div className='loadingOverlay' style={wrapperStyle}>
|
|
43
|
-
{children}
|
|
44
|
-
</div>
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
export default GlobalLoader;
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Button,
|
|
3
|
-
DialogActions,
|
|
4
|
-
DialogContent,
|
|
5
|
-
TextareaAutosize,
|
|
6
|
-
} from '@mui/material';
|
|
7
|
-
|
|
8
|
-
import React, { useEffect, useState } from 'react';
|
|
9
|
-
import { useRecordContext } from 'react-admin';
|
|
10
|
-
import useAxios from '../../hooks/axios';
|
|
11
|
-
import { saveAs } from 'file-saver';
|
|
12
|
-
import { ILog, ILogTxtFileComponent } from '../../interfaces/Log';
|
|
13
|
-
import { IDashAutoAdminCustomFieldComponent } from 'dash-auto-admin';
|
|
14
|
-
|
|
15
|
-
export const LogTxtFileComponent: React.FC<ILogTxtFileComponent> = ({
|
|
16
|
-
log,
|
|
17
|
-
}) => {
|
|
18
|
-
const { axios } = useAxios();
|
|
19
|
-
|
|
20
|
-
const [logFile, setlogFile] = useState<Blob>(null);
|
|
21
|
-
const [logContent, setlogContent] = useState<string>(null);
|
|
22
|
-
|
|
23
|
-
const downloadLog = async () => {
|
|
24
|
-
let fileName = log.filepath.split('/')[log.filepath.split('/').length - 1];
|
|
25
|
-
saveAs(logFile, fileName);
|
|
26
|
-
};
|
|
27
|
-
const preLoadLog = async (logID) => {
|
|
28
|
-
if (log?.filepath) {
|
|
29
|
-
const { data: file } = await axios.get(`/system/log/${log.id}/download`, {
|
|
30
|
-
responseType: 'blob',
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
let fileContent = await file.text();
|
|
34
|
-
|
|
35
|
-
setlogFile(file);
|
|
36
|
-
setlogContent(fileContent);
|
|
37
|
-
} else {
|
|
38
|
-
setlogContent('Proceso completado correctamente');
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
useEffect(() => {
|
|
43
|
-
preLoadLog(log);
|
|
44
|
-
}, []);
|
|
45
|
-
|
|
46
|
-
return (
|
|
47
|
-
<DialogContent>
|
|
48
|
-
<TextareaAutosize
|
|
49
|
-
style={{ width: '100%' }}
|
|
50
|
-
maxRows={50}
|
|
51
|
-
defaultValue={logContent !== '' ? logContent : ' Cargando... '}
|
|
52
|
-
/>
|
|
53
|
-
{log?.filepath && (
|
|
54
|
-
<DialogActions>
|
|
55
|
-
<Button onClick={() => downloadLog()}>Descargar</Button>{' '}
|
|
56
|
-
</DialogActions>
|
|
57
|
-
)}
|
|
58
|
-
</DialogContent>
|
|
59
|
-
);
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
const LogTxtFileEdit: React.FC<IDashAutoAdminCustomFieldComponent> = ({
|
|
63
|
-
method,
|
|
64
|
-
attribute,
|
|
65
|
-
}) => {
|
|
66
|
-
const log: ILog = useRecordContext();
|
|
67
|
-
return <LogTxtFileComponent log={log} />;
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
const LogTxtFileView: React.FC<IDashAutoAdminCustomFieldComponent> = ({
|
|
71
|
-
method,
|
|
72
|
-
attribute,
|
|
73
|
-
}) => {
|
|
74
|
-
const log: ILog = useRecordContext();
|
|
75
|
-
return <LogTxtFileComponent log={log} />;
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const LogTxtFile = ({ method, attribute, resourceConfig }: IDashAutoAdminCustomFieldComponent) => {
|
|
79
|
-
switch (method) {
|
|
80
|
-
case 'edit':
|
|
81
|
-
case 'create':
|
|
82
|
-
return <LogTxtFileEdit attribute={attribute} method={method} resourceConfig={resourceConfig} />;
|
|
83
|
-
case 'view':
|
|
84
|
-
return <LogTxtFileView attribute={attribute} method={method} resourceConfig={resourceConfig} />;
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
export default LogTxtFile;
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Button,
|
|
3
|
-
DialogActions,
|
|
4
|
-
DialogContent,
|
|
5
|
-
TextareaAutosize,
|
|
6
|
-
} from '@mui/material';
|
|
7
|
-
|
|
8
|
-
import React, { useEffect, useState } from 'react';
|
|
9
|
-
import useAxios from '../../hooks/axios';
|
|
10
|
-
import { saveAs } from 'file-saver';
|
|
11
|
-
|
|
12
|
-
interface LogFileByIdProps {
|
|
13
|
-
id: string | number;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const LogFileById: React.FC<LogFileByIdProps> = ({ id }) => {
|
|
17
|
-
const { axios } = useAxios();
|
|
18
|
-
|
|
19
|
-
const [logFile, setLogFile] = useState<Blob>(null);
|
|
20
|
-
const [logContent, setLogContent] = useState<string>(null);
|
|
21
|
-
const [filepath, setFilepath] = useState<string>(null);
|
|
22
|
-
|
|
23
|
-
const downloadLog = async () => {
|
|
24
|
-
if (filepath) {
|
|
25
|
-
let fileName = filepath.split('/')[filepath.split('/').length - 1];
|
|
26
|
-
saveAs(logFile, fileName);
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
const preLoadLog = async () => {
|
|
31
|
-
try {
|
|
32
|
-
const { data: file } = await axios.get(`/system/log/${id}/download`, {
|
|
33
|
-
responseType: 'blob',
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
const { data: logData } = await axios.get(`/system/log/${id}`);
|
|
37
|
-
setFilepath(logData.filepath);
|
|
38
|
-
|
|
39
|
-
let fileContent = await file.text();
|
|
40
|
-
|
|
41
|
-
setLogFile(file);
|
|
42
|
-
setLogContent(fileContent);
|
|
43
|
-
} catch (error) {
|
|
44
|
-
setLogContent('Error al cargar el archivo');
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
useEffect(() => {
|
|
49
|
-
preLoadLog();
|
|
50
|
-
}, [id]);
|
|
51
|
-
|
|
52
|
-
return (
|
|
53
|
-
<DialogContent>
|
|
54
|
-
<TextareaAutosize
|
|
55
|
-
style={{ width: '100%' }}
|
|
56
|
-
maxRows={50}
|
|
57
|
-
defaultValue={logContent !== '' ? logContent : ' Cargando... '}
|
|
58
|
-
/>
|
|
59
|
-
{filepath && (
|
|
60
|
-
<DialogActions>
|
|
61
|
-
<Button onClick={downloadLog}>Descargar</Button>
|
|
62
|
-
</DialogActions>
|
|
63
|
-
)}
|
|
64
|
-
</DialogContent>
|
|
65
|
-
);
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
export default LogFileById;
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { IDashAutoAdminCustomFieldComponent } from 'dash-auto-admin';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { useRecordContext } from 'react-admin';
|
|
4
|
-
|
|
5
|
-
export interface ILogViewerComponent {
|
|
6
|
-
log: any;
|
|
7
|
-
}
|
|
8
|
-
export const LogViewerComponent: React.FC<ILogViewerComponent> = ({ log }) => {
|
|
9
|
-
return (
|
|
10
|
-
<>
|
|
11
|
-
<h1>Log</h1>
|
|
12
|
-
</>
|
|
13
|
-
);
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const LogViewerEdit: React.FC<IDashAutoAdminCustomFieldComponent> = ({
|
|
17
|
-
method,
|
|
18
|
-
attribute,
|
|
19
|
-
}) => {
|
|
20
|
-
const log = useRecordContext();
|
|
21
|
-
|
|
22
|
-
return <>{log && <LogViewerComponent log={log} />}</>;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const LogViewerView: React.FC<IDashAutoAdminCustomFieldComponent> = ({
|
|
26
|
-
method,
|
|
27
|
-
attribute,
|
|
28
|
-
}) => {
|
|
29
|
-
const log: any = useRecordContext();
|
|
30
|
-
return <>{log && <LogViewerComponent log={log} />}</>;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const LogViewer = ({ method, attribute, resourceConfig }: IDashAutoAdminCustomFieldComponent) => {
|
|
34
|
-
switch (method) {
|
|
35
|
-
case 'edit':
|
|
36
|
-
case 'create':
|
|
37
|
-
return <LogViewerEdit attribute={attribute} method={method} resourceConfig={resourceConfig} />;
|
|
38
|
-
case 'view':
|
|
39
|
-
return <LogViewerView attribute={attribute} method={method} resourceConfig={resourceConfig} />;
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
export default LogViewer;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
|
|
3
|
-
export interface IAppMenu {
|
|
4
|
-
//hasDashboard: boolean;
|
|
5
|
-
children?: React.ReactNode;
|
|
6
|
-
autoHideScroll?: boolean;
|
|
7
|
-
[key: string]: any;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
// Group icons
|
|
11
|
-
export const AppMenu: React.FC<IAppMenu> = ({
|
|
12
|
-
hasDashboard,
|
|
13
|
-
autoHideScroll = false,
|
|
14
|
-
children,
|
|
15
|
-
}) => {
|
|
16
|
-
|
|
17
|
-
return (
|
|
18
|
-
<>
|
|
19
|
-
Deprecated
|
|
20
|
-
</>
|
|
21
|
-
);
|
|
22
|
-
};
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import React, { forwardRef, useCallback, ReactElement, ReactNode } from 'react';
|
|
2
|
-
import { styled } from '@mui/material/styles';
|
|
3
|
-
import PropTypes from 'prop-types';
|
|
4
|
-
import clsx from 'clsx';
|
|
5
|
-
import { Link, LinkProps, useMatch } from 'react-router-dom';
|
|
6
|
-
|
|
7
|
-
import { useTranslate, useBasename } from 'react-admin';
|
|
8
|
-
import { useSidebarState } from 'react-admin';
|
|
9
|
-
|
|
10
|
-
export type CustomMenuItemLinkProps = LinkProps & {
|
|
11
|
-
// @ts-ignore - JSX namespace issue
|
|
12
|
-
leftIcon?: JSX.Element;
|
|
13
|
-
primaryText?: ReactNode;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const MenuItemLink: React.FC<CustomMenuItemLinkProps> = (props /*, ref*/) => {
|
|
17
|
-
const { className, primaryText, leftIcon, onClick, ...rest } = props;
|
|
18
|
-
|
|
19
|
-
const translate = useTranslate();
|
|
20
|
-
const basename = useBasename();
|
|
21
|
-
|
|
22
|
-
const [open, setOpen] = useSidebarState();
|
|
23
|
-
const handleMenuTap = useCallback(
|
|
24
|
-
(e) => {
|
|
25
|
-
setOpen(false);
|
|
26
|
-
|
|
27
|
-
onClick && onClick(e);
|
|
28
|
-
},
|
|
29
|
-
[setOpen, onClick],
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
const to =
|
|
33
|
-
(typeof props.to === 'string' ? props.to : props.to.pathname) || '';
|
|
34
|
-
const match = useMatch({ path: to, end: to === `${basename}/` });
|
|
35
|
-
|
|
36
|
-
return (
|
|
37
|
-
<Link
|
|
38
|
-
className={clsx(className, {
|
|
39
|
-
[MenuItemLinkClasses.active]: !!match,
|
|
40
|
-
})}
|
|
41
|
-
//ref={ref}
|
|
42
|
-
tabIndex={0}
|
|
43
|
-
{...rest}
|
|
44
|
-
onClick={handleMenuTap}
|
|
45
|
-
>
|
|
46
|
-
{leftIcon && <span className={MenuItemLinkClasses.icon}>{leftIcon}</span>}
|
|
47
|
-
{typeof primaryText === 'string'
|
|
48
|
-
? translate(primaryText, { _: primaryText })
|
|
49
|
-
: primaryText}
|
|
50
|
-
</Link>
|
|
51
|
-
);
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const PREFIX = 'RaMenuItemLink';
|
|
55
|
-
|
|
56
|
-
export const MenuItemLinkClasses = {
|
|
57
|
-
active: `${PREFIX}-active`,
|
|
58
|
-
icon: `${PREFIX}-icon`,
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
export default MenuItemLink;
|