@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.
Files changed (289) hide show
  1. package/dist/components/tenant/TenancyPlan.js +307 -0
  2. package/dist/systemResources.js +18 -2
  3. package/package.json +25 -22
  4. package/src/AppAsyncWrapper.tsx +0 -42
  5. package/src/AppWrapper.tsx +0 -45
  6. package/src/DASHAdmin.tsx +0 -502
  7. package/src/DASHAdmin.tsx.old +0 -456
  8. package/src/RoutingWrapper.tsx +0 -143
  9. package/src/classes/DASHStorageClass.tsx +0 -8
  10. package/src/components/Input/RichTextField.tsx +0 -27
  11. package/src/components/Redirect.tsx +0 -46
  12. package/src/components/avatar/Avatar.tsx +0 -71
  13. package/src/components/avatar/SingleImageUploader.tsx +0 -107
  14. package/src/components/currency/Format.tsx +0 -79
  15. package/src/components/custom/Redirect.tsx +0 -23
  16. package/src/components/error/Error.tsx +0 -168
  17. package/src/components/geocoding/GeocodingField.tsx +0 -167
  18. package/src/components/i18n/BridgedLocalesMenuButton.tsx +0 -160
  19. package/src/components/i18n/LangSwitcher.tsx +0 -204
  20. package/src/components/loader/GlobalLoader.tsx +0 -49
  21. package/src/components/logs/LogFile.tsx +0 -88
  22. package/src/components/logs/LogFileById.tsx +0 -68
  23. package/src/components/logs/LogViewer.tsx +0 -43
  24. package/src/components/menu/AppMenu.tsx +0 -22
  25. package/src/components/menu/CustomMenuItemLink.tsx +0 -61
  26. package/src/components/menu/DarkToggleMode.tsx +0 -65
  27. package/src/components/menu/LanguageToggleMode.tsx +0 -120
  28. package/src/components/misc/CustomImageInput.tsx +0 -62
  29. package/src/components/misc/DASHGlobalErrorHandler.tsx +0 -194
  30. package/src/components/misc/DarkModeSwitcher.tsx +0 -112
  31. package/src/components/misc/HorizontalScroller.tsx +0 -225
  32. package/src/components/misc/LanguageSwitcher.tsx +0 -199
  33. package/src/components/misc/MUIHtmlToolTip.tsx +0 -15
  34. package/src/components/misc/MuiSimpleJsonTable.tsx +0 -279
  35. package/src/components/misc/MultiLevelTable.tsx +0 -229
  36. package/src/components/misc/NoResults.tsx +0 -28
  37. package/src/components/misc/PDFViewer.tsx +0 -85
  38. package/src/components/navigation/Breadcrumbs.tsx +0 -220
  39. package/src/components/navigation/BreadcrumbsManager.tsx +0 -310
  40. package/src/components/navigation/index.tsx +0 -5
  41. package/src/components/panel/Error.tsx +0 -168
  42. package/src/components/permission/AvailablePermissionsContext.tsx +0 -173
  43. package/src/components/permission/PermissionsSelector.tsx +0 -834
  44. package/src/components/permission/PermissionsSelectorList.tsx +0 -473
  45. package/src/components/permission/tsx +0 -0
  46. package/src/components/racustombuttons/CustomRAButton.tsx +0 -87
  47. package/src/components/racustombuttons/QuickButton.tsx +0 -117
  48. package/src/components/racustombuttons/QuickEditButton.tsx +0 -115
  49. package/src/components/racustombuttons/QuickIconButton.tsx +0 -122
  50. package/src/components/scrollbar/Scrollbar.tsx +0 -31
  51. package/src/components/selects/MultiSelect.tsx +0 -53
  52. package/src/components/selects/RASearchableSelect.tsx +0 -282
  53. package/src/components/selects/RASearchableSelectChips.tsx +0 -308
  54. package/src/components/selects/SearchableSelect.tsx +0 -139
  55. package/src/components/serviceAccount/ApiKeyRevealDialog.tsx +0 -129
  56. package/src/components/serviceAccount/ServiceAccountStatusSwitch.tsx +0 -99
  57. package/src/components/subscription/BillingCycleSelectInput.tsx +0 -68
  58. package/src/components/subscription/PlanAddonsSettings.tsx +0 -563
  59. package/src/components/subscription/PlanAuditLog.tsx +0 -453
  60. package/src/components/subscription/PlanFeaturesSettings.tsx +0 -243
  61. package/src/components/subscription/PlanLimitsSettings.tsx +0 -230
  62. package/src/components/subscription/PlanMetadataSettings.tsx +0 -306
  63. package/src/components/subscription/PlanPricesSettings.tsx +0 -307
  64. package/src/components/subscription/index.ts +0 -7
  65. package/src/components/svgelements/SvgLoading.tsx +0 -229
  66. package/src/components/svgelements/SvgLogo.tsx +0 -53
  67. package/src/components/svgelements/SvgLogoMin.tsx +0 -64
  68. package/src/components/svgelements/SvgShipping.tsx +0 -673
  69. package/src/components/tenancy/GlobalTenantWrapper.tsx +0 -84
  70. package/src/components/tenancy/TenantSwitcher.tsx +0 -514
  71. package/src/components/tenant/AvailablePermissionsContext.tsx +0 -0
  72. package/src/components/tenant/SettingsSections.tsx +0 -151
  73. package/src/components/tenant/TenancySettings.tsx +0 -122
  74. package/src/components/tenant/TenantAttributes.tsx +0 -153
  75. package/src/components/tenant/TenantAttributesContext.tsx +0 -163
  76. package/src/components/tenant/TenantSelector.tsx +0 -142
  77. package/src/components/tenant/TenantSettings.tsx +0 -184
  78. package/src/components/tenant/TenantSettingsContext.tsx +0 -165
  79. package/src/components/tenant/TenantTheme.tsx +0 -172
  80. package/src/components/user/AvatarComponent.tsx +0 -317
  81. package/src/components/user/TenantAvatarComponent.tsx +0 -99
  82. package/src/components/user/UserPreferences.tsx +0 -677
  83. package/src/config/ACTIONS.tsx +0 -26
  84. package/src/config/ConstantsService.tsx +0 -44
  85. package/src/config/DASHAdminSystemConstants.tsx +0 -183
  86. package/src/config/PARSERS.tsx +0 -9
  87. package/src/contexts/DashQueryClientContext.tsx +0 -113
  88. package/src/contexts/DashResourceContext.tsx +0 -34
  89. package/src/contexts/I18nBridgeContext.tsx +0 -156
  90. package/src/contexts/I18nBridgeSetter.tsx +0 -39
  91. package/src/contexts/I18nReduxSync.tsx +0 -27
  92. package/src/contexts/SubscriptionPlanFormatsProvider.tsx +0 -217
  93. package/src/contexts/SystemRequestsCache.tsx +0 -215
  94. package/src/contexts/auth/AuthContext.tsx +0 -567
  95. package/src/contexts/auth/AuthContextLocalStorage.tsx +0 -140
  96. package/src/contexts/auth/DASHAuthenticationService.tsx +0 -915
  97. package/src/contexts/auth/WindowContext.tsx +0 -15
  98. package/src/contexts/auth/index.tsx +0 -3
  99. package/src/contexts/com/FCMContext.tsx +0 -415
  100. package/src/contexts/com/LaravelEchoContext.tsx +0 -41
  101. package/src/contexts/com/LaravelEchoMgr.tsx +0 -155
  102. package/src/contexts/com/components/DefaultNotificationComponent.tsx +0 -20
  103. package/src/contexts/com/components/EchoNotificationsCenter.tsx +0 -65
  104. package/src/contexts/com/components/NotificationAttributesTable.tsx +0 -54
  105. package/src/contexts/com/components/NotificationRenderer.tsx +0 -42
  106. package/src/contexts/com/components/NotificationsWidget.tsx +0 -182
  107. package/src/contexts/com/components/notificationFormats.tsx +0 -50
  108. package/src/contexts/com/useLaravelEcho.tsx +0 -432
  109. package/src/contexts/dictionary/DictionaryContext.tsx +0 -94
  110. package/src/declarations.d.ts +0 -17
  111. package/src/default-theme/DASHAppProviders.tsx +0 -117
  112. package/src/default-theme/DashThemeContext.tsx +0 -209
  113. package/src/default-theme/DashThemeContext.tsx.fast +0 -143
  114. package/src/default-theme/DashThemeContext.tsx.old +0 -306
  115. package/src/default-theme/DashThemeHelperProvider.tsx +0 -98
  116. package/src/default-theme/DomainAppLayout.tsx +0 -166
  117. package/src/default-theme/DomainHeader.tsx +0 -162
  118. package/src/default-theme/DomainTheme.tsx +0 -59
  119. package/src/default-theme/FullLayoutMarkup.tsx +0 -231
  120. package/src/default-theme/StaticLayout.tsx +0 -47
  121. package/src/default-theme/index.tsx +0 -11
  122. package/src/default-theme/menu/AppDashboardGrid.tsx +0 -279
  123. package/src/default-theme/menu/AppMaterialMenu.tsx +0 -546
  124. package/src/default-theme/menu/AppMenuComponents/SubmenuPortal.tsx +0 -61
  125. package/src/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItem.tsx +0 -264
  126. package/src/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItems.tsx +0 -31
  127. package/src/default-theme/menu/AppMenuComponents/expanded/CollapsableSidebarMenu.tsx +0 -293
  128. package/src/default-theme/menu/AppMenuComponents/expanded/SidebarItem.tsx +0 -92
  129. package/src/default-theme/menu/AppMenuComponents/getItem.tsx +0 -17
  130. package/src/default-theme/menu/AppMenuComponents/interfaces.tsx +0 -41
  131. package/src/default-theme/menu/AppMenuComponents/submenuConstants.ts +0 -90
  132. package/src/default-theme/menu/AppSidebarMaterial.tsx +0 -339
  133. package/src/default-theme/menu/SidebarActions.tsx +0 -84
  134. package/src/default-theme/updateDomCssVariables.tsx +0 -176
  135. package/src/helpers/checkRole.tsx +0 -66
  136. package/src/helpers/parseAxiosError.tsx +0 -41
  137. package/src/hooks/audio/useAudio.tsx +0 -39
  138. package/src/hooks/axios.tsx +0 -165
  139. package/src/hooks/data/useDashboardStats.tsx +0 -65
  140. package/src/hooks/data/usePackageByClientsStats.tsx +0 -44
  141. package/src/hooks/data/usePackageByCommunesStats.tsx +0 -44
  142. package/src/hooks/data/usePackageStats.tsx +0 -69
  143. package/src/hooks/data/usePackageWithdrawDetails.tsx +0 -61
  144. package/src/hooks/data/useStats.tsx +0 -86
  145. package/src/hooks/isCurrentPath.tsx +0 -22
  146. package/src/hooks/notifications/WSMessagesManager.tsx +0 -152
  147. package/src/hooks/notifications/WSPusherManager.tsx +0 -92
  148. package/src/hooks/useBreadcrumbs.tsx +0 -329
  149. package/src/hooks/useClickOutside.tsx +0 -57
  150. package/src/hooks/useFormPersistance.tsx +0 -150
  151. package/src/hooks/useGlobalErrorMediator.tsx +0 -43
  152. package/src/hooks/useGlobalLoaderMgr.tsx +0 -21
  153. package/src/hooks/useHash.tsx +0 -27
  154. package/src/hooks/useLocalStorage.tsx +0 -196
  155. package/src/hooks/usePolyglotTranslation.tsx +0 -62
  156. package/src/hooks/usePrevious.tsx +0 -9
  157. package/src/hooks/usePrintSelected.tsx +0 -37
  158. package/src/hooks/useVirtualHash.tsx +0 -33
  159. package/src/hooks/window/useWindowSize.tsx +0 -36
  160. package/src/index.tsx +0 -134
  161. package/src/interfaces/IAppResourceConfig.tsx +0 -20
  162. package/src/interfaces/Log.tsx +0 -16
  163. package/src/interfaces/Tenant.tsx +0 -25
  164. package/src/interfaces/communication/IActions.tsx +0 -5
  165. package/src/interfaces/communication/INotification.tsx +0 -21
  166. package/src/interfaces/communication/IPayload.tsx +0 -3
  167. package/src/interfaces/communication/IRequestAction.tsx +0 -10
  168. package/src/interfaces/communication/IRequestPayload.tsx +0 -7
  169. package/src/interfaces/communication/IResponseAction.tsx +0 -7
  170. package/src/interfaces/misc/IAny.tsx +0 -3
  171. package/src/interfaces/misc/IFlashMessage.tsx +0 -10
  172. package/src/interfaces/navigation/IAppMenu.ts +0 -14
  173. package/src/interfaces/navigation/ICollapsableSidebarMenu.ts +0 -12
  174. package/src/interfaces/navigation/IMenuItem.ts +0 -16
  175. package/src/interfaces/notifications/IModel.tsx +0 -6
  176. package/src/interfaces/notifications/IModelField.tsx +0 -8
  177. package/src/interfaces/notifications/IUserNotification.tsx +0 -12
  178. package/src/interfaces/notifications/IUserNotificationData.tsx +0 -13
  179. package/src/interfaces/notifications/IUserNotificationPayload.tsx +0 -8
  180. package/src/interfaces/user/IGetAuth.tsx +0 -92
  181. package/src/interfaces/user/ITenantSettings.tsx +0 -3
  182. package/src/interfaces/user/IUser.tsx +0 -60
  183. package/src/interfaces/user/IUserSettings.tsx +0 -43
  184. package/src/interfaces.tsx +0 -6
  185. package/src/layout/AppLayout.tsx +0 -112
  186. package/src/layout/ApplicationLayout.tsx +0 -197
  187. package/src/layout/MotionWrapper.original.tsx +0 -236
  188. package/src/layout/MotionWrapper.tsx +0 -236
  189. package/src/layout/ResourceMenu.tsx +0 -164
  190. package/src/layout/ResoureLayout.tsx +0 -105
  191. package/src/layout/TransitionWrapper.tsx +0 -125
  192. package/src/pages/ChangePassword.tsx +0 -179
  193. package/src/pages/DASHLanding.tsx +0 -22
  194. package/src/pages/DASHLightWeightLogin.tsx +0 -611
  195. package/src/pages/DASHSimpleLogin.tsx +0 -260
  196. package/src/pages/Login.tsx +0 -111
  197. package/src/pages/Profile.tsx +0 -357
  198. package/src/pages/RecoverPassword.tsx +0 -175
  199. package/src/pages/SingleImageUploader.tsx +0 -55
  200. package/src/pages/VerifyAccount.tsx +0 -128
  201. package/src/providers/authProvider.tsx +0 -217
  202. package/src/providers/dataProvider.tsx +0 -672
  203. package/src/providers/i18n/en.ts +0 -646
  204. package/src/providers/i18n/es.ts +0 -652
  205. package/src/providers/i18n/languages.tsx +0 -8
  206. package/src/providers/i18n/mergeTranslations.ts +0 -53
  207. package/src/providers/i18nProvider.tsx +0 -23
  208. package/src/react-admin-dash/RADashComponent.tsx +0 -240
  209. package/src/react-admin-dash/Resource.tsx +0 -77
  210. package/src/resources/Brand/BrandResource.tsx +0 -130
  211. package/src/resources/DASHResourceLoader.ts +0 -180
  212. package/src/resources/Log/LogResource.tsx +0 -73
  213. package/src/resources/Tenant/ImpersonateTenantResource.tsx +0 -113
  214. package/src/resources/Trash/TrashTemplate.tsx +0 -180
  215. package/src/resources/User/components/AvatarUploadField.tsx +0 -57
  216. package/src/resources/User/components/PasswordFields.tsx +0 -73
  217. package/src/resources/User/getProfileMenu.ts +0 -57
  218. package/src/resources/User/profileResource.tsx +0 -51
  219. package/src/resources/User/userLayout.tsx +0 -62
  220. package/src/resources/User/userResource.tsx +0 -111
  221. package/src/resources/User/userSchema.tsx +0 -213
  222. package/src/resources/User/usersFilters.tsx +0 -21
  223. package/src/resources.tsx +0 -280
  224. package/src/schemas/log.tsx +0 -45
  225. package/src/schemas/notification.tsx +0 -42
  226. package/src/schemas/permissions.tsx +0 -44
  227. package/src/schemas/roles.tsx +0 -48
  228. package/src/schemas/rolesDataGrid.tsx +0 -48
  229. package/src/schemas/subscription/components/SubscriptionActions.tsx +0 -153
  230. package/src/schemas/subscription/components/SubscriptionPaymentHistory.tsx +0 -127
  231. package/src/schemas/subscription/components/SubscriptionPlanFeatures.tsx +0 -162
  232. package/src/schemas/subscription/components/SubscriptionPlanPreview.tsx +0 -141
  233. package/src/schemas/subscription/components/SubscriptionPlanStats.tsx +0 -318
  234. package/src/schemas/subscription/components/SubscriptionStatusIndicator.tsx +0 -72
  235. package/src/schemas/subscription/subscriptionPlanSchema.tsx +0 -185
  236. package/src/schemas/subscription/subscriptionSchema.tsx +0 -152
  237. package/src/schemas/subscriptionPlan.ts +0 -422
  238. package/src/schemas/tenant.tsx +0 -129
  239. package/src/schemas/tenantUser.tsx +0 -96
  240. package/src/schemas/tenant_superadmin.tsx +0 -119
  241. package/src/schemas/user.tsx +0 -26
  242. package/src/systemResources.old.tsx +0 -928
  243. package/src/systemResources.tsx +0 -1369
  244. package/src/templates/ResourceTemplate.tsx +0 -240
  245. package/src/templates/ResourceTemplate.tsx.memoized_experiment +0 -350
  246. package/src/templates/ResourceTemplate.tsx.original +0 -396
  247. package/src/templates/ResourceTemplateCreate.tsx +0 -182
  248. package/src/templates/ResourceTemplateEdit.tsx +0 -176
  249. package/src/templates/ResourceTemplateFull.tsx +0 -581
  250. package/src/templates/ResourceTemplateList.tsx +0 -340
  251. package/src/templates/ResourceTemplateOld.tsx.bkup +0 -567
  252. package/src/templates/ResourceTemplateShow.tsx +0 -88
  253. package/src/templates/TrashTemplate.tsx +0 -179
  254. package/src/tenantResources.tsx +0 -223
  255. package/src/test_portal_bubbles.tsx +0 -40
  256. package/src/theme/AppHeader.tsx +0 -52
  257. package/src/theme/AppLayoutSetting.tsx +0 -33
  258. package/src/theme/AppLogo.tsx +0 -13
  259. package/src/theme/AppSidebar.tsx +0 -12
  260. package/src/theme/AppSidebarContent.tsx +0 -105
  261. package/src/theme/AppSidebarLogo.tsx +0 -48
  262. package/src/theme/components/PageTitle.tsx +0 -37
  263. package/src/utils/cache/CacheInvalidatorContext.tsx +0 -125
  264. package/src/utils/cache/CacheInvalidatorListenerComponent.tsx +0 -10
  265. package/src/utils/cache/useCacheInvalidatorListener.tsx +0 -27
  266. package/src/utils/convertFileToBase64.tsx +0 -9
  267. package/src/utils/convertToFile.tsx +0 -14
  268. package/src/utils/cookies.tsx +0 -33
  269. package/src/utils/dashDefaultQueryClient.tsx +0 -34
  270. package/src/utils/dataUrlToBlob.tsx +0 -30
  271. package/src/utils/deepReplace.tsx +0 -19
  272. package/src/utils/getProfileMenu.tsx +0 -41
  273. package/src/utils/getTenantSettings.tsx +0 -9
  274. package/src/utils/getType.tsx +0 -8
  275. package/src/utils/getUserSettings.tsx +0 -8
  276. package/src/utils/hasCode.tsx +0 -14
  277. package/src/utils/index.ts +0 -19
  278. package/src/utils/injectTenantStyles.ts +0 -28
  279. package/src/utils/isComponent.tsx +0 -45
  280. package/src/utils/navEvents.tsx +0 -91
  281. package/src/utils/prototypes.tsx +0 -5
  282. package/src/utils/regexp.tsx +0 -4
  283. package/src/utils/resolveObjectPath.tsx +0 -4
  284. package/src/utils/setNativeValue.tsx +0 -24
  285. package/src/utils/slugify.tsx +0 -11
  286. package/src/utils/validators/emailValidator.tsx +0 -6
  287. package/src/utils/validators/requiredValidator.tsx +0 -5
  288. package/src/utils/validators/rutValidator.tsx +0 -31
  289. 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;