@dashadmin/dash-admin 1.3.73 → 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,220 +0,0 @@
|
|
|
1
|
-
import React, { JSX, useMemo } from 'react';
|
|
2
|
-
import { Box, Typography } from '@mui/material';
|
|
3
|
-
import { Link } from 'react-router-dom';
|
|
4
|
-
import { useSelector } from 'react-redux';
|
|
5
|
-
import NavigateNextIcon from '@mui/icons-material/NavigateNext';
|
|
6
|
-
import HomeIcon from '@mui/icons-material/Home';
|
|
7
|
-
import { IBreadcrumbItem, IDASHAppState, IPageState } from 'dash-admin-state';
|
|
8
|
-
import { IDashAutoAdminResourceConfig } from 'dash-auto-admin';
|
|
9
|
-
|
|
10
|
-
// ============================================================================
|
|
11
|
-
// TYPES & INTERFACES
|
|
12
|
-
// ============================================================================
|
|
13
|
-
|
|
14
|
-
export interface BreadcrumbsProps {
|
|
15
|
-
/** Override the breadcrumbs from Redux state */
|
|
16
|
-
items?: IBreadcrumbItem[];
|
|
17
|
-
/** Custom separator between breadcrumb items */
|
|
18
|
-
separator?: React.ReactNode;
|
|
19
|
-
/** Maximum number of items to show (others will be collapsed) */
|
|
20
|
-
maxItems?: number;
|
|
21
|
-
/** Custom class name */
|
|
22
|
-
className?: string;
|
|
23
|
-
/** Show home icon as first item */
|
|
24
|
-
showHomeIcon?: boolean;
|
|
25
|
-
/** Home path (default: '/') */
|
|
26
|
-
homePath?: string;
|
|
27
|
-
/** Home label (default: 'Home') */
|
|
28
|
-
homeLabel?: string;
|
|
29
|
-
/** Custom styles */
|
|
30
|
-
sx?: Record<string, any>;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// ============================================================================
|
|
34
|
-
// BREADCRUMB ITEM COMPONENT
|
|
35
|
-
// ============================================================================
|
|
36
|
-
|
|
37
|
-
interface BreadcrumbItemProps {
|
|
38
|
-
item: IBreadcrumbItem;
|
|
39
|
-
isLast: boolean;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const BreadcrumbItem: React.FC<BreadcrumbItemProps> = ({ item, isLast }) => {
|
|
43
|
-
const content = (
|
|
44
|
-
<Box
|
|
45
|
-
component="span"
|
|
46
|
-
className={`dash-breadcrumb-item ${isLast ? 'dash-breadcrumb-item--active' : ''}`}
|
|
47
|
-
sx={{
|
|
48
|
-
display: 'inline-flex',
|
|
49
|
-
flexDirection: 'row',
|
|
50
|
-
alignItems: 'center',
|
|
51
|
-
gap: '2px',
|
|
52
|
-
flexShrink: 0,
|
|
53
|
-
}}
|
|
54
|
-
>
|
|
55
|
-
{item.icon && (
|
|
56
|
-
<Box
|
|
57
|
-
component="span"
|
|
58
|
-
className="dash-breadcrumb-icon"
|
|
59
|
-
sx={{
|
|
60
|
-
display: 'inline-flex',
|
|
61
|
-
alignItems: 'center',
|
|
62
|
-
flexShrink: 0,
|
|
63
|
-
'& svg': {
|
|
64
|
-
fontSize: '12px',
|
|
65
|
-
},
|
|
66
|
-
}}
|
|
67
|
-
>
|
|
68
|
-
{item.icon}
|
|
69
|
-
</Box>
|
|
70
|
-
)}
|
|
71
|
-
<Typography
|
|
72
|
-
component="span"
|
|
73
|
-
className="dash-breadcrumb-label"
|
|
74
|
-
sx={{
|
|
75
|
-
fontSize: '11px',
|
|
76
|
-
fontWeight: isLast ? 500 : 400,
|
|
77
|
-
lineHeight: 1.2,
|
|
78
|
-
color: isLast
|
|
79
|
-
? 'var(--text-header, #ffffff)'
|
|
80
|
-
: 'var(--text-header-muted, rgba(255, 255, 255, 0.7))',
|
|
81
|
-
whiteSpace: 'nowrap',
|
|
82
|
-
overflow: 'hidden',
|
|
83
|
-
textOverflow: 'ellipsis',
|
|
84
|
-
maxWidth: '120px',
|
|
85
|
-
}}
|
|
86
|
-
>
|
|
87
|
-
{item.label}
|
|
88
|
-
</Typography>
|
|
89
|
-
</Box>
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
// If it's the last item or no path, don't make it a link
|
|
93
|
-
if (isLast || !item.path) {
|
|
94
|
-
return content;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Ensure path starts with / to avoid relative navigation issues
|
|
98
|
-
const path = !item.path.startsWith('/') ? `/${item.path}` : item.path;
|
|
99
|
-
|
|
100
|
-
// Use React Router's Link for client-side navigation
|
|
101
|
-
return (
|
|
102
|
-
<Link
|
|
103
|
-
to={path}
|
|
104
|
-
className="dash-breadcrumb-link"
|
|
105
|
-
style={{
|
|
106
|
-
textDecoration: 'none',
|
|
107
|
-
display: 'inline-flex',
|
|
108
|
-
alignItems: 'center',
|
|
109
|
-
}}
|
|
110
|
-
>
|
|
111
|
-
{content}
|
|
112
|
-
</Link>
|
|
113
|
-
);
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
// ============================================================================
|
|
117
|
-
// MAIN BREADCRUMBS COMPONENT
|
|
118
|
-
// ============================================================================
|
|
119
|
-
|
|
120
|
-
export const Breadcrumbs: React.FC<BreadcrumbsProps> = ({
|
|
121
|
-
items: propItems,
|
|
122
|
-
separator,
|
|
123
|
-
maxItems,
|
|
124
|
-
className = '',
|
|
125
|
-
showHomeIcon = false,
|
|
126
|
-
homePath = '/',
|
|
127
|
-
homeLabel = 'Home',
|
|
128
|
-
sx = {},
|
|
129
|
-
}): JSX.Element | null => {
|
|
130
|
-
// Create default separator inside component to avoid hook issues
|
|
131
|
-
const defaultSeparator = <NavigateNextIcon sx={{ fontSize: '12px', color: 'var(--text-header-muted, rgba(255, 255, 255, 0.5))' }} />;
|
|
132
|
-
const actualSeparator = separator ?? defaultSeparator;
|
|
133
|
-
// Get breadcrumbs from Redux state if not provided via props
|
|
134
|
-
const pageState: IPageState = useSelector(
|
|
135
|
-
(state: IDASHAppState<any, any, IDashAutoAdminResourceConfig>) => state.page
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
const breadcrumbs = propItems || pageState.breadcrumbs;
|
|
139
|
-
|
|
140
|
-
// Build final items list
|
|
141
|
-
const displayItems = useMemo(() => {
|
|
142
|
-
if (!breadcrumbs || breadcrumbs.length === 0) {
|
|
143
|
-
return [];
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
let items = [...breadcrumbs];
|
|
147
|
-
|
|
148
|
-
// Add home item if requested
|
|
149
|
-
if (showHomeIcon) {
|
|
150
|
-
const homeItem: IBreadcrumbItem = {
|
|
151
|
-
label: homeLabel,
|
|
152
|
-
path: homePath,
|
|
153
|
-
icon: <HomeIcon />,
|
|
154
|
-
};
|
|
155
|
-
items = [homeItem, ...items];
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Apply maxItems limit if specified
|
|
159
|
-
if (maxItems && items.length > maxItems) {
|
|
160
|
-
const start = items.slice(0, 1);
|
|
161
|
-
const end = items.slice(-(maxItems - 2));
|
|
162
|
-
const ellipsis: IBreadcrumbItem = {
|
|
163
|
-
label: '...',
|
|
164
|
-
path: undefined,
|
|
165
|
-
};
|
|
166
|
-
items = [...start, ellipsis, ...end];
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
return items;
|
|
170
|
-
}, [breadcrumbs, showHomeIcon, homeLabel, homePath, maxItems]);
|
|
171
|
-
|
|
172
|
-
// Don't render if no items
|
|
173
|
-
if (displayItems.length === 0) {
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return (
|
|
178
|
-
<Box
|
|
179
|
-
component="nav"
|
|
180
|
-
aria-label="breadcrumb"
|
|
181
|
-
className={`dash-breadcrumbs ${className}`}
|
|
182
|
-
sx={{
|
|
183
|
-
display: 'flex',
|
|
184
|
-
flexDirection: 'row',
|
|
185
|
-
alignItems: 'center',
|
|
186
|
-
flexWrap: 'nowrap',
|
|
187
|
-
gap: '2px',
|
|
188
|
-
padding: 0,
|
|
189
|
-
margin: 0,
|
|
190
|
-
...sx,
|
|
191
|
-
}}
|
|
192
|
-
>
|
|
193
|
-
{displayItems.map((item, index) => {
|
|
194
|
-
const isLast = index === displayItems.length - 1;
|
|
195
|
-
|
|
196
|
-
return (
|
|
197
|
-
<React.Fragment key={`breadcrumb-${index}-${item.label}`}>
|
|
198
|
-
<BreadcrumbItem item={item} isLast={isLast} />
|
|
199
|
-
{!isLast && (
|
|
200
|
-
<Box
|
|
201
|
-
component="span"
|
|
202
|
-
className="dash-breadcrumb-separator"
|
|
203
|
-
sx={{
|
|
204
|
-
display: 'inline-flex',
|
|
205
|
-
alignItems: 'center',
|
|
206
|
-
mx: '1px',
|
|
207
|
-
flexShrink: 0,
|
|
208
|
-
}}
|
|
209
|
-
>
|
|
210
|
-
{actualSeparator}
|
|
211
|
-
</Box>
|
|
212
|
-
)}
|
|
213
|
-
</React.Fragment>
|
|
214
|
-
);
|
|
215
|
-
})}
|
|
216
|
-
</Box>
|
|
217
|
-
);
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
export default Breadcrumbs;
|
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
import React, { useEffect, useMemo } from 'react';
|
|
2
|
-
import { useLocation } from 'react-router-dom';
|
|
3
|
-
import { useDispatch } from 'react-redux';
|
|
4
|
-
import { useStore } from 'react-admin';
|
|
5
|
-
import { IBreadcrumbItem, DASH_REDUX_ACTIONS } from 'dash-admin-state';
|
|
6
|
-
import { IDashAutoAdminResourceConfig } from 'dash-auto-admin';
|
|
7
|
-
import { DASHAdminSystemConstants } from 'dash-constants';
|
|
8
|
-
|
|
9
|
-
// ============================================================================
|
|
10
|
-
// TYPES & INTERFACES
|
|
11
|
-
// ============================================================================
|
|
12
|
-
|
|
13
|
-
export interface BreadcrumbsManagerProps {
|
|
14
|
-
/** Custom label map for route segments */
|
|
15
|
-
labelMap?: Record<string, string>;
|
|
16
|
-
/** Whether to include the home item */
|
|
17
|
-
includeHome?: boolean;
|
|
18
|
-
/** Home path */
|
|
19
|
-
homePath?: string;
|
|
20
|
-
/** Home label */
|
|
21
|
-
homeLabel?: string;
|
|
22
|
-
/** Custom breadcrumb generator function */
|
|
23
|
-
customGenerator?: (
|
|
24
|
-
pathname: string,
|
|
25
|
-
resourceConfig?: IDashAutoAdminResourceConfig,
|
|
26
|
-
record?: any
|
|
27
|
-
) => IBreadcrumbItem[];
|
|
28
|
-
/** Field to use as record name (default: 'name') */
|
|
29
|
-
recordNameField?: string;
|
|
30
|
-
/** Children components */
|
|
31
|
-
children?: React.ReactNode;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// ============================================================================
|
|
35
|
-
// DEFAULT LABEL MAPPINGS
|
|
36
|
-
// ============================================================================
|
|
37
|
-
|
|
38
|
-
const defaultLabelMap: Record<string, string> = {
|
|
39
|
-
// Common actions
|
|
40
|
-
'create': 'Crear',
|
|
41
|
-
'edit': 'Editar',
|
|
42
|
-
'show': 'Ver',
|
|
43
|
-
'list': 'Lista',
|
|
44
|
-
'inline': 'Detalle',
|
|
45
|
-
'trash': 'Papelera',
|
|
46
|
-
|
|
47
|
-
// Common routes
|
|
48
|
-
'admin': 'Admin',
|
|
49
|
-
'system': 'Sistema',
|
|
50
|
-
'settings': 'Configuración',
|
|
51
|
-
'users': 'Usuarios',
|
|
52
|
-
'roles': 'Roles',
|
|
53
|
-
'permissions': 'Permisos',
|
|
54
|
-
'tenants': 'Tenants',
|
|
55
|
-
'profile': 'Perfil',
|
|
56
|
-
'dashboard': 'Dashboard',
|
|
57
|
-
'apps': 'Aplicaciones',
|
|
58
|
-
'client': 'Cliente',
|
|
59
|
-
'mall': 'Mall',
|
|
60
|
-
'public': 'Público',
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
// ============================================================================
|
|
64
|
-
// HELPER FUNCTIONS
|
|
65
|
-
// ============================================================================
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Parse a route segment into a readable label
|
|
69
|
-
*/
|
|
70
|
-
const parseSegmentLabel = (
|
|
71
|
-
segment: string,
|
|
72
|
-
labelMap: Record<string, string>,
|
|
73
|
-
resourceConfig?: IDashAutoAdminResourceConfig
|
|
74
|
-
): string => {
|
|
75
|
-
// Check custom label map first
|
|
76
|
-
if (labelMap[segment]) {
|
|
77
|
-
return labelMap[segment];
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Check default label map
|
|
81
|
-
if (defaultLabelMap[segment]) {
|
|
82
|
-
return defaultLabelMap[segment];
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Check if segment matches resource model
|
|
86
|
-
if (resourceConfig) {
|
|
87
|
-
const modelParts = resourceConfig.model?.split('/') || [];
|
|
88
|
-
if (modelParts.includes(segment)) {
|
|
89
|
-
return resourceConfig.label || segment;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Convert kebab-case or snake_case to Title Case
|
|
94
|
-
return segment
|
|
95
|
-
.replace(/[-_]/g, ' ')
|
|
96
|
-
.replace(/\b\w/g, char => char.toUpperCase());
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Check if a segment is an ID (numeric or UUID-like)
|
|
101
|
-
*/
|
|
102
|
-
const isIdSegment = (segment: string): boolean => {
|
|
103
|
-
// Check for numeric ID
|
|
104
|
-
if (/^\d+$/.test(segment)) {
|
|
105
|
-
return true;
|
|
106
|
-
}
|
|
107
|
-
// Check for UUID
|
|
108
|
-
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(segment)) {
|
|
109
|
-
return true;
|
|
110
|
-
}
|
|
111
|
-
// Check for short hash-like IDs (at least 20 chars alphanumeric)
|
|
112
|
-
if (/^[a-z0-9]{20,}$/i.test(segment)) {
|
|
113
|
-
return true;
|
|
114
|
-
}
|
|
115
|
-
return false;
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Generate breadcrumbs from pathname
|
|
120
|
-
*/
|
|
121
|
-
const generateBreadcrumbsFromPath = (
|
|
122
|
-
pathname: string,
|
|
123
|
-
labelMap: Record<string, string>,
|
|
124
|
-
resourceConfig?: IDashAutoAdminResourceConfig,
|
|
125
|
-
includeHome?: boolean,
|
|
126
|
-
homePath?: string,
|
|
127
|
-
homeLabel?: string,
|
|
128
|
-
recordName?: string
|
|
129
|
-
): IBreadcrumbItem[] => {
|
|
130
|
-
const URL_PREFIX = DASHAdminSystemConstants.system.URL_PREFIX || '';
|
|
131
|
-
|
|
132
|
-
// Remove URL prefix and clean path
|
|
133
|
-
let cleanPath = pathname;
|
|
134
|
-
if (URL_PREFIX && cleanPath.startsWith(URL_PREFIX)) {
|
|
135
|
-
cleanPath = cleanPath.slice(URL_PREFIX.length);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// Split into segments and filter empty ones
|
|
139
|
-
const segments = cleanPath.split('/').filter(Boolean);
|
|
140
|
-
|
|
141
|
-
if (segments.length === 0) {
|
|
142
|
-
return [];
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const breadcrumbs: IBreadcrumbItem[] = [];
|
|
146
|
-
|
|
147
|
-
// Add home item if requested
|
|
148
|
-
if (includeHome) {
|
|
149
|
-
breadcrumbs.push({
|
|
150
|
-
label: homeLabel || 'Home',
|
|
151
|
-
path: homePath || '/',
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
let currentPath = URL_PREFIX;
|
|
156
|
-
|
|
157
|
-
// Ensure path starts with slash if prefix doesn't have one
|
|
158
|
-
if (currentPath && !currentPath.startsWith('/')) {
|
|
159
|
-
currentPath = `/${currentPath}`;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Build breadcrumbs for each segment
|
|
163
|
-
segments.forEach((segment, index) => {
|
|
164
|
-
currentPath += `/${segment}`;
|
|
165
|
-
const isLast = index === segments.length - 1;
|
|
166
|
-
const isId = isIdSegment(segment);
|
|
167
|
-
|
|
168
|
-
// Handle ID segments
|
|
169
|
-
if (isId) {
|
|
170
|
-
// If we have a record name and this is the last segment or second-to-last, use it
|
|
171
|
-
if (recordName && (isLast || index === segments.length - 2)) {
|
|
172
|
-
breadcrumbs.push({
|
|
173
|
-
label: recordName,
|
|
174
|
-
path: isLast ? undefined : currentPath,
|
|
175
|
-
isActive: isLast,
|
|
176
|
-
data: { id: segment },
|
|
177
|
-
});
|
|
178
|
-
} else {
|
|
179
|
-
// Use a generic "Record #ID" label (truncated for display)
|
|
180
|
-
const displayId = segment.length > 8
|
|
181
|
-
? `#${segment.substring(0, 8)}...`
|
|
182
|
-
: `#${segment}`;
|
|
183
|
-
breadcrumbs.push({
|
|
184
|
-
label: displayId,
|
|
185
|
-
path: isLast ? undefined : currentPath,
|
|
186
|
-
isActive: isLast,
|
|
187
|
-
data: { id: segment },
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Get the label for this segment
|
|
194
|
-
const label = parseSegmentLabel(segment, labelMap, resourceConfig);
|
|
195
|
-
|
|
196
|
-
breadcrumbs.push({
|
|
197
|
-
label,
|
|
198
|
-
path: isLast ? undefined : currentPath,
|
|
199
|
-
isActive: isLast,
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
return breadcrumbs;
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
// ============================================================================
|
|
207
|
-
// COMPONENT
|
|
208
|
-
// ============================================================================
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* BreadcrumbsManager
|
|
212
|
-
*
|
|
213
|
-
* A component that automatically manages breadcrumb state based on the current route.
|
|
214
|
-
* Place this component in your app layout to enable automatic breadcrumb generation.
|
|
215
|
-
*
|
|
216
|
-
* @example
|
|
217
|
-
* ```tsx
|
|
218
|
-
* // In your app layout
|
|
219
|
-
* <BreadcrumbsManager includeHome homeLabel="Dashboard">
|
|
220
|
-
* {children}
|
|
221
|
-
* </BreadcrumbsManager>
|
|
222
|
-
* ```
|
|
223
|
-
*/
|
|
224
|
-
export const BreadcrumbsManager: React.FC<BreadcrumbsManagerProps> = ({
|
|
225
|
-
labelMap = {},
|
|
226
|
-
includeHome = false,
|
|
227
|
-
homePath = '/',
|
|
228
|
-
homeLabel = 'Home',
|
|
229
|
-
customGenerator,
|
|
230
|
-
recordNameField = 'name',
|
|
231
|
-
children,
|
|
232
|
-
}) => {
|
|
233
|
-
const dispatch = useDispatch();
|
|
234
|
-
const location = useLocation();
|
|
235
|
-
|
|
236
|
-
// Get resource config from store
|
|
237
|
-
const [resourceConfig] = useStore<IDashAutoAdminResourceConfig>('resourceConfig');
|
|
238
|
-
|
|
239
|
-
// Note: We don't use useRecordContext here because it requires RecordContextProvider
|
|
240
|
-
// The record name will be handled by the useBreadcrumbs hook in resource templates instead
|
|
241
|
-
const record: any = null;
|
|
242
|
-
|
|
243
|
-
// Merge label maps
|
|
244
|
-
const mergedLabelMap = useMemo(() => ({
|
|
245
|
-
...defaultLabelMap,
|
|
246
|
-
...labelMap,
|
|
247
|
-
}), [labelMap]);
|
|
248
|
-
|
|
249
|
-
// Get record name from record context
|
|
250
|
-
const recordName = useMemo(() => {
|
|
251
|
-
if (!record) return undefined;
|
|
252
|
-
|
|
253
|
-
// Try common name fields
|
|
254
|
-
const nameFields = [recordNameField, 'name', 'title', 'label', 'displayName', 'username'];
|
|
255
|
-
for (const field of nameFields) {
|
|
256
|
-
if (record[field]) {
|
|
257
|
-
return String(record[field]);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// Use recordRepresentation if available
|
|
262
|
-
if (resourceConfig?.recordRepresentation) {
|
|
263
|
-
const repr = resourceConfig.recordRepresentation;
|
|
264
|
-
if (typeof repr === 'string' && record[repr]) {
|
|
265
|
-
return String(record[repr]);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
return undefined;
|
|
270
|
-
}, [record, recordNameField, resourceConfig]);
|
|
271
|
-
|
|
272
|
-
// Generate and dispatch breadcrumbs on route change
|
|
273
|
-
useEffect(() => {
|
|
274
|
-
let breadcrumbs: IBreadcrumbItem[];
|
|
275
|
-
|
|
276
|
-
if (customGenerator) {
|
|
277
|
-
breadcrumbs = customGenerator(location.pathname, resourceConfig, record);
|
|
278
|
-
} else {
|
|
279
|
-
breadcrumbs = generateBreadcrumbsFromPath(
|
|
280
|
-
location.pathname,
|
|
281
|
-
mergedLabelMap,
|
|
282
|
-
resourceConfig,
|
|
283
|
-
includeHome,
|
|
284
|
-
homePath,
|
|
285
|
-
homeLabel,
|
|
286
|
-
recordName
|
|
287
|
-
);
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// Only update if we have breadcrumbs
|
|
291
|
-
if (breadcrumbs.length > 0) {
|
|
292
|
-
dispatch(DASH_REDUX_ACTIONS.updatePage({ breadcrumbs }));
|
|
293
|
-
}
|
|
294
|
-
}, [
|
|
295
|
-
location.pathname,
|
|
296
|
-
mergedLabelMap,
|
|
297
|
-
resourceConfig,
|
|
298
|
-
includeHome,
|
|
299
|
-
homePath,
|
|
300
|
-
homeLabel,
|
|
301
|
-
recordName,
|
|
302
|
-
customGenerator,
|
|
303
|
-
dispatch,
|
|
304
|
-
record,
|
|
305
|
-
]);
|
|
306
|
-
|
|
307
|
-
return <>{children}</>;
|
|
308
|
-
};
|
|
309
|
-
|
|
310
|
-
export default BreadcrumbsManager;
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
export { Breadcrumbs, default as BreadcrumbsComponent } from './Breadcrumbs';
|
|
2
|
-
export type { BreadcrumbsProps } from './Breadcrumbs';
|
|
3
|
-
|
|
4
|
-
export { BreadcrumbsManager, default as BreadcrumbsManagerComponent } from './BreadcrumbsManager';
|
|
5
|
-
export type { BreadcrumbsManagerProps } from './BreadcrumbsManager';
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { ComponentType, ErrorInfo, Fragment, HtmlHTMLAttributes } from 'react';
|
|
2
|
-
import { FallbackProps } from 'react-error-boundary';
|
|
3
|
-
import { styled } from '@mui/material/styles';
|
|
4
|
-
import PropTypes from 'prop-types';
|
|
5
|
-
import {
|
|
6
|
-
Button,
|
|
7
|
-
Accordion,
|
|
8
|
-
AccordionDetails,
|
|
9
|
-
AccordionSummary,
|
|
10
|
-
Typography,
|
|
11
|
-
} from '@mui/material';
|
|
12
|
-
import ErrorIcon from '@mui/icons-material/Report';
|
|
13
|
-
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
|
|
14
|
-
import History from '@mui/icons-material/History';
|
|
15
|
-
import { useTranslate } from 'react-admin';
|
|
16
|
-
import { useResetErrorBoundaryOnLocationChange } from 'react-admin';
|
|
17
|
-
import { Title } from 'react-admin';
|
|
18
|
-
|
|
19
|
-
export const Error = (
|
|
20
|
-
props: InternalErrorProps & {
|
|
21
|
-
errorComponent?: ComponentType<ErrorProps>;
|
|
22
|
-
},
|
|
23
|
-
) => {
|
|
24
|
-
const {
|
|
25
|
-
error,
|
|
26
|
-
errorComponent: ErrorComponent,
|
|
27
|
-
errorInfo,
|
|
28
|
-
resetErrorBoundary,
|
|
29
|
-
className,
|
|
30
|
-
title,
|
|
31
|
-
...rest
|
|
32
|
-
} = props;
|
|
33
|
-
|
|
34
|
-
const translate = useTranslate();
|
|
35
|
-
useResetErrorBoundaryOnLocationChange(resetErrorBoundary);
|
|
36
|
-
|
|
37
|
-
if (ErrorComponent) {
|
|
38
|
-
return <ErrorComponent error={error} errorInfo={errorInfo} title={title} />;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return (
|
|
42
|
-
<Fragment>
|
|
43
|
-
{title && <Title title={title} />}
|
|
44
|
-
<Root className={className} {...rest}>
|
|
45
|
-
<h1 className={ErrorClasses.title} role='alert'>
|
|
46
|
-
<ErrorIcon className={ErrorClasses.icon} />
|
|
47
|
-
{translate('ra.page.error')}
|
|
48
|
-
</h1>
|
|
49
|
-
<div>{translate('ra.message.error')}</div>
|
|
50
|
-
{/* @ts-ignore */}
|
|
51
|
-
{process.env.NODE_ENV !== 'production' && (
|
|
52
|
-
<>
|
|
53
|
-
<Accordion className={ErrorClasses.panel}>
|
|
54
|
-
<AccordionSummary
|
|
55
|
-
expandIcon={<ExpandMoreIcon />}
|
|
56
|
-
className={ErrorClasses.panelSumary}
|
|
57
|
-
>
|
|
58
|
-
{translate(error.message, {
|
|
59
|
-
_: error.message,
|
|
60
|
-
})}
|
|
61
|
-
</AccordionSummary>
|
|
62
|
-
<AccordionDetails className={ErrorClasses.panelDetails}>
|
|
63
|
-
{/*
|
|
64
|
-
error message is repeated here to allow users to copy it. AccordionSummary doesn't support text selection.
|
|
65
|
-
*/}
|
|
66
|
-
<p>
|
|
67
|
-
{translate(error.message, {
|
|
68
|
-
_: error.message,
|
|
69
|
-
})}
|
|
70
|
-
</p>
|
|
71
|
-
<p>{errorInfo?.componentStack}</p>
|
|
72
|
-
</AccordionDetails>
|
|
73
|
-
</Accordion>
|
|
74
|
-
</>
|
|
75
|
-
)}
|
|
76
|
-
<div className={ErrorClasses.toolbar}>
|
|
77
|
-
<Button variant='contained' startIcon={<History />} onClick={goBack}>
|
|
78
|
-
{translate('ra.action.back')}
|
|
79
|
-
</Button>
|
|
80
|
-
</div>
|
|
81
|
-
</Root>
|
|
82
|
-
</Fragment>
|
|
83
|
-
);
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
Error.propTypes = {
|
|
87
|
-
className: PropTypes.string,
|
|
88
|
-
error: PropTypes.object.isRequired,
|
|
89
|
-
errorInfo: PropTypes.object,
|
|
90
|
-
title: PropTypes.string,
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
interface InternalErrorProps
|
|
94
|
-
extends Omit<HtmlHTMLAttributes<HTMLDivElement>, 'title'>,
|
|
95
|
-
FallbackProps,
|
|
96
|
-
ErrorProps {
|
|
97
|
-
className?: string;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export interface ErrorProps extends Pick<FallbackProps, 'error'> {
|
|
101
|
-
errorInfo?: ErrorInfo;
|
|
102
|
-
//title?: TitleComponent;
|
|
103
|
-
title?: any;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const PREFIX = 'RaError';
|
|
107
|
-
|
|
108
|
-
export const ErrorClasses = {
|
|
109
|
-
container: `${PREFIX}-container`,
|
|
110
|
-
title: `${PREFIX}-title`,
|
|
111
|
-
icon: `${PREFIX}-icon`,
|
|
112
|
-
panel: `${PREFIX}-panel`,
|
|
113
|
-
panelSumary: `${PREFIX}-panelSumary`,
|
|
114
|
-
panelDetails: `${PREFIX}-panelDetails`,
|
|
115
|
-
toolbar: `${PREFIX}-toolbar`,
|
|
116
|
-
advice: `${PREFIX}-advice`,
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
const Root = styled('div', {
|
|
120
|
-
name: PREFIX,
|
|
121
|
-
overridesResolver: (props, styles) => styles.root,
|
|
122
|
-
})(({ theme }) => ({
|
|
123
|
-
display: 'flex',
|
|
124
|
-
flexDirection: 'column',
|
|
125
|
-
alignItems: 'center',
|
|
126
|
-
justifyContent: 'center',
|
|
127
|
-
[theme.breakpoints.down('md')]: {
|
|
128
|
-
padding: '1em',
|
|
129
|
-
},
|
|
130
|
-
fontFamily: 'Roboto, sans-serif',
|
|
131
|
-
opacity: 0.5,
|
|
132
|
-
|
|
133
|
-
[`& .${ErrorClasses.title}`]: {
|
|
134
|
-
display: 'flex',
|
|
135
|
-
alignItems: 'center',
|
|
136
|
-
},
|
|
137
|
-
|
|
138
|
-
[`& .${ErrorClasses.icon}`]: {
|
|
139
|
-
width: '2em',
|
|
140
|
-
height: '2em',
|
|
141
|
-
marginRight: '0.5em',
|
|
142
|
-
},
|
|
143
|
-
|
|
144
|
-
[`& .${ErrorClasses.panel}`]: {
|
|
145
|
-
marginTop: '1em',
|
|
146
|
-
maxWidth: '60em',
|
|
147
|
-
},
|
|
148
|
-
|
|
149
|
-
[`& .${ErrorClasses.panelSumary}`]: {
|
|
150
|
-
userSelect: 'all',
|
|
151
|
-
},
|
|
152
|
-
|
|
153
|
-
[`& .${ErrorClasses.panelDetails}`]: {
|
|
154
|
-
whiteSpace: 'pre-wrap',
|
|
155
|
-
},
|
|
156
|
-
|
|
157
|
-
[`& .${ErrorClasses.toolbar}`]: {
|
|
158
|
-
marginTop: '2em',
|
|
159
|
-
},
|
|
160
|
-
|
|
161
|
-
[`& .${ErrorClasses.advice}`]: {
|
|
162
|
-
marginTop: '2em',
|
|
163
|
-
},
|
|
164
|
-
}));
|
|
165
|
-
|
|
166
|
-
function goBack() {
|
|
167
|
-
window.history.go(-1);
|
|
168
|
-
}
|