@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.
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,41 +0,0 @@
1
- import { IDashAutoAdminResourceConfig } from "dash-auto-admin";
2
- import { JSX } from "react";
3
- import { SidebarPosition } from "../AppSidebarMaterial";
4
-
5
- export interface IAppMenu {
6
- //hasDashboard: boolean;
7
- children?: React.ReactNode;
8
- autoHideScroll?: boolean;
9
- menu?: IDashAutoAdminResourceConfig[];
10
- debug?: boolean;
11
- showDrawer?: boolean;
12
- navSize: "small" | "large";
13
- navExpanded: boolean;
14
- sidebarPosition?: SidebarPosition;
15
- [key: string]: any;
16
- }
17
-
18
- export interface IMenuItem {
19
- group: string;
20
- model: string;
21
- label: string;
22
- txtLabel: string;
23
- key: React.Key;
24
- to?: string;
25
- icon?: JSX.Element;
26
- children?: IMenuItem[];
27
- type?: 'group';
28
- selected?: boolean;
29
- /** When true, this menu item is a simple navigation link (not a react-admin resource) */
30
- menuOnly?: boolean;
31
- }
32
-
33
- export interface ICollapsableSidebarMenu {
34
- item: IMenuItem;
35
- showIcon?: boolean;
36
- className?: string;
37
- navExpanded: boolean;
38
- navSize: "small" | "large";
39
- level: number;
40
- sidebarPosition?: SidebarPosition;
41
- }
@@ -1,90 +0,0 @@
1
- import { CSSProperties, RefObject } from 'react';
2
- import { SidebarPosition } from '../AppSidebarMaterial';
3
-
4
- // Toggle this to force click behavior instead of hover (for debugging/testing)
5
- export const FORCE_CLICK_OPEN = false; // Set to true for click behavior
6
-
7
- // Threshold for when submenu should render at fixed top/bottom instead of relative to item
8
- export const SUBMENU_SCROLL_THRESHOLD = 10;
9
-
10
- /**
11
- * Base styles for submenu portal container
12
- */
13
- export const getSubmenuBaseStyle = (
14
- sidebarPosition: SidebarPosition,
15
- renderAtTop: boolean = false
16
- ): CSSProperties => ({
17
- zIndex: 10000,
18
- position: 'fixed',
19
- maxHeight: sidebarPosition === "top" || sidebarPosition === "bottom" ? '60vh' : (renderAtTop ? '100vh' : '80vh'),
20
- overflowY: 'auto',
21
- width: sidebarPosition === "top" || sidebarPosition === "bottom" ? 'auto' : '260px',
22
- minWidth: '200px',
23
- // The wrapper is the SINGLE owner of the panel visuals (surface, border,
24
- // shadow, radius, padding). The inner ul.dropdown must stay transparent —
25
- // if both layers draw a border/background, their edges show as a seam line.
26
- background: 'var(--primary-contrast, #252526)',
27
- border: '1px solid rgba(255,255,255,0.08)',
28
- boxShadow: '0 10px 15px -3px rgba(0,0,0,0.25), 0 4px 6px -4px rgba(0,0,0,0.4)',
29
- borderRadius: 12,
30
- padding: 6,
31
- });
32
-
33
- /**
34
- * Calculate submenu position based on sidebar position and item rect
35
- */
36
- export const calculateSubmenuPosition = (
37
- rect: DOMRect,
38
- sidebarPosition: SidebarPosition,
39
- renderAtTop: boolean = false
40
- ): CSSProperties => {
41
- switch (sidebarPosition) {
42
- case "right":
43
- // Submenu opens to the LEFT of the sidebar item
44
- return {
45
- top: rect.top,
46
- right: window.innerWidth - rect.left - 4,
47
- left: 'auto'
48
- };
49
- case "top":
50
- return {
51
- top: renderAtTop ? 120 : rect.bottom - 4,
52
- left: rect.left,
53
- right: 'auto'
54
- };
55
- case "bottom":
56
- return {
57
- bottom: renderAtTop ? 120 : (window.innerHeight - rect.top) - 4,
58
- left: rect.left,
59
- right: 'auto'
60
- };
61
- case "left":
62
- default:
63
- // Submenu opens to the RIGHT of the sidebar item
64
- return {
65
- top: rect.top,
66
- left: rect.right - 4,
67
- right: 'auto'
68
- };
69
- }
70
- };
71
-
72
- /**
73
- * Get complete submenu style by combining base style and position
74
- */
75
- export const getSubmenuStyle = (
76
- itemRef: RefObject<HTMLElement | null>,
77
- sidebarPosition: SidebarPosition,
78
- renderAtTop: boolean = false
79
- ): CSSProperties => {
80
- const rect = itemRef.current?.getBoundingClientRect();
81
- const baseStyle = getSubmenuBaseStyle(sidebarPosition, renderAtTop);
82
-
83
- if (!rect) {
84
- // Fallback if rect not available
85
- return { ...baseStyle, top: 0, left: 0 };
86
- }
87
-
88
- const positionStyle = calculateSubmenuPosition(rect, sidebarPosition, renderAtTop);
89
- return { ...baseStyle, ...positionStyle };
90
- };
@@ -1,339 +0,0 @@
1
- import * as React from 'react';
2
- import { styled, Theme, CSSObject } from '@mui/material/styles';
3
- import Box from '@mui/material/Box';
4
- import MuiDrawer from '@mui/material/Drawer';
5
- import { useMediaQuery, useTheme } from '@mui/material';
6
- import { IDASHAppState, DASH_REDUX_ACTIONS } from 'dash-admin-state';
7
- import { useDispatch, useSelector } from 'react-redux';
8
- import { IDashAutoAdminResourceConfig } from 'dash-auto-admin';
9
- import { useState } from 'react';
10
-
11
- import { useWindowSize, dashStorage } from 'dash-utils';
12
- import AppMaterialMenu from './AppMaterialMenu';
13
- import { useLocation } from 'react-router';
14
- import { isEqual } from 'lodash';
15
- import { NavEventManager } from '../../utils/navEvents';
16
-
17
- // Only keep layout settings selector - remove nav state selectors
18
- const selectLayoutSettings = (state: IDASHAppState<any, any, IDashAutoAdminResourceConfig>) => ({
19
- navStyle: state.settings.navStyle,
20
- layoutType: state.settings.layoutType,
21
- themeType: state.settings.themeType,
22
- layoutSettings: state.settings.layoutSettings,
23
- });
24
-
25
- const selectPanelSettings = (state: IDASHAppState<any, any, IDashAutoAdminResourceConfig>) =>
26
- state.common.panelSettings;
27
-
28
- // Sidebar position type
29
- export type SidebarPosition = "left" | "top" | "bottom" | "right";
30
-
31
- // Component props interface
32
- export interface AppSidebarMaterialProps {
33
- className?: string;
34
- sidebarPosition?: SidebarPosition;
35
-
36
- }
37
-
38
- const AppSidebarMaterial: React.FC<AppSidebarMaterialProps> = (props) => {
39
- const { sidebarPosition: propSidebarPosition} = props;
40
- const location = useLocation();
41
- const dispatch = useDispatch();
42
- const theme = useTheme();
43
- const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm'));
44
- const isMediumOrSmaller = useMediaQuery(theme.breakpoints.down('md')); // For sidebar position switching
45
-
46
- // Only subscribe to layout settings - nav state is handled by AppSidebarMaterial
47
- const layoutState = useSelector(selectLayoutSettings, isEqual);
48
- const panelSettings = useSelector(selectPanelSettings);
49
-
50
- // Get primary and secondary sidebar positions from Redux panelSettings
51
- const primarySidebarPosition: SidebarPosition = propSidebarPosition || panelSettings?.sidebarPosition || 'left';
52
- const secondarySidebarPosition: SidebarPosition = panelSettings?.secondarySidebarPosition || 'left';
53
-
54
- // Use secondary position on medium or smaller screens (for burger menu behavior)
55
- const sidebarPosition: SidebarPosition = isMediumOrSmaller ? secondarySidebarPosition : primarySidebarPosition;
56
-
57
- // Check if position is horizontal (top/bottom) - these don't expand/collapse
58
- const isHorizontalPosition = sidebarPosition === "top" || sidebarPosition === "bottom";
59
-
60
- const {
61
- navStyle,
62
- layoutType,
63
- themeType,
64
- layoutSettings
65
- } = layoutState;
66
-
67
- // Local state for nav - initialize from localStorage for persistence
68
- const [localNavExpanded, setLocalNavExpanded] = useState(() => {
69
- const stored = dashStorage.getItem('dashNavExpanded');
70
- return stored !== null ? stored === 'true' : false;
71
- });
72
- const [localNavSize, setLocalNavSize] = useState<"small" | "large">(() => {
73
- const stored = dashStorage.getItem('dashNavSize');
74
- return (stored === 'small' || stored === 'large') ? stored : 'large';
75
- });
76
-
77
- // Create refs to track current values for Redux sync
78
- const localNavExpandedRef = React.useRef(localNavExpanded);
79
- const localNavSizeRef = React.useRef(localNavSize);
80
-
81
- // Update refs when values change
82
- React.useEffect(() => {
83
- localNavExpandedRef.current = localNavExpanded;
84
- localNavSizeRef.current = localNavSize;
85
- }, [localNavExpanded, localNavSize]);
86
-
87
- // Persist nav state to localStorage when it changes
88
- React.useEffect(() => {
89
- dashStorage.setItem('dashNavExpanded', String(localNavExpanded));
90
- }, [localNavExpanded]);
91
-
92
- React.useEffect(() => {
93
- dashStorage.setItem('dashNavSize', localNavSize);
94
- }, [localNavSize]);
95
-
96
- // Listen for nav events from other components
97
- React.useEffect(() => {
98
- const unsubscribeToggle = NavEventManager.onToggleExpanded(() => {
99
- setLocalNavExpanded(prev => !prev);
100
- });
101
-
102
- const unsubscribeSet = NavEventManager.onSetExpanded((expanded) => {
103
- setLocalNavExpanded(expanded);
104
- });
105
-
106
- // Listen for close drawer events (triggered when navigating on mobile)
107
- const unsubscribeClose = NavEventManager.onCloseDrawer(() => {
108
- if (localNavSize === 'small') {
109
- setLocalNavExpanded(false);
110
- }
111
- });
112
-
113
- return () => {
114
- unsubscribeToggle();
115
- unsubscribeSet();
116
- unsubscribeClose();
117
- };
118
- }, [localNavSize]);
119
-
120
- // Memoize logo extraction to prevent unnecessary re-renders
121
- const logos = React.useMemo(() => ({
122
- horizontalLogo: panelSettings?.horizontalLogo || <>🖥</>,
123
- squaredLogo: panelSettings?.squaredLogo || <>🖥</>,
124
- }), [panelSettings?.horizontalLogo, panelSettings?.squaredLogo]);
125
-
126
- // Body class management - keep it simple
127
- React.useEffect(() => {
128
- if (!layoutSettings || !layoutType || !themeType) return;
129
-
130
- const body = document.body;
131
-
132
- // Remove old classes
133
- body.classList.remove(
134
- layoutSettings.LAYOUT_TYPE_FULL,
135
- layoutSettings.LAYOUT_TYPE_BOXED,
136
- layoutSettings.LAYOUT_TYPE_FRAMED,
137
- layoutSettings.THEME_TYPE_DARK,
138
- layoutSettings.THEME_TYPE_LIGHT
139
- );
140
-
141
- // Add new classes
142
- body.classList.add(layoutType, themeType);
143
- }, [layoutType, themeType, layoutSettings]);
144
-
145
- // Nav style management
146
- React.useEffect(() => {
147
- if (!layoutSettings || !navStyle) return;
148
-
149
- const body = document.body;
150
- const horizontalStyles = [
151
- layoutSettings.NAV_STYLE_DEFAULT_HORIZONTAL,
152
- layoutSettings.NAV_STYLE_DARK_HORIZONTAL,
153
- layoutSettings.NAV_STYLE_INSIDE_HEADER_HORIZONTAL,
154
- layoutSettings.NAV_STYLE_ABOVE_HEADER,
155
- layoutSettings.NAV_STYLE_BELOW_HEADER
156
- ];
157
-
158
- const isHorizontal = horizontalStyles.includes(navStyle);
159
- body.classList.toggle('full-scroll', isHorizontal);
160
- body.classList.toggle('horizontal-layout', isHorizontal);
161
- }, [navStyle, layoutSettings]);
162
-
163
- // Location-based classes - ONLY dispatch to Redux on location changes
164
- const previousLocationClassRef = React.useRef<string>('');
165
-
166
- React.useEffect(() => {
167
- const body = document.body;
168
- let formattedPath = '';
169
-
170
- if (location.pathname && location.pathname !== '/') {
171
- formattedPath = location.pathname.replace(/^\/|\/$/g, '').replace(/\//g, '-');
172
- }
173
-
174
- const currentLocationClass = formattedPath ? `location-${formattedPath}` : '';
175
-
176
- // Remove previous class
177
- if (previousLocationClassRef.current) {
178
- body.classList.remove(previousLocationClassRef.current);
179
- }
180
-
181
- // Add new class
182
- if (currentLocationClass) {
183
- body.classList.add(currentLocationClass);
184
- previousLocationClassRef.current = currentLocationClass;
185
- } else {
186
- previousLocationClassRef.current = '';
187
- }
188
-
189
- // 🎯 ONLY sync local nav state to Redux on location changes (not on every nav toggle)
190
- return () => {
191
- if (previousLocationClassRef.current) {
192
- body.classList.remove(previousLocationClassRef.current);
193
- }
194
-
195
- // Use ref values to avoid stale closures and prevent infinite loops
196
- dispatch(DASH_REDUX_ACTIONS.setNavExpanded(localNavExpandedRef.current));
197
- dispatch(DASH_REDUX_ACTIONS.setNavSize(localNavSizeRef.current));
198
- };
199
- }, [location.pathname, dispatch]); // ✅ Removed localNavExpanded and localNavSize from deps
200
-
201
- const windowSize = useWindowSize();
202
-
203
- // Update parent layout className whenever local nav state or position changes
204
- React.useEffect(() => {
205
- const layoutElement = document.getElementById('dash-app-layout');
206
- if (layoutElement) {
207
- // Remove existing nav-related classes
208
- layoutElement.classList.remove('expanded', 'collapsed', 'small', 'large');
209
- layoutElement.classList.remove('sidebar-position-left', 'sidebar-position-right', 'sidebar-position-top', 'sidebar-position-bottom');
210
-
211
- // Add current state classes
212
- layoutElement.classList.add(localNavExpanded ? 'expanded' : 'collapsed');
213
- layoutElement.classList.add(localNavSize);
214
- layoutElement.classList.add(`sidebar-position-${sidebarPosition}`);
215
- }
216
- }, [localNavExpanded, localNavSize, sidebarPosition]);
217
-
218
- const toggleDrawer = (e) => {
219
- e.preventDefault();
220
- e.stopPropagation();
221
- setLocalNavExpanded(!localNavExpanded);
222
- // 🎯 NO Redux dispatch here - only local state update
223
- // Redux will be synced only on location changes
224
- };
225
-
226
- // isSmallScreen and theme are already declared at the top of the component
227
- const isLargeScreen = useMediaQuery(theme.breakpoints.up('lg'));
228
-
229
- // Track previous breakpoint states to detect changes
230
- const [prevIsSmall, setPrevIsSmall] = useState<boolean | null>(null);
231
- const [prevIsLarge, setPrevIsLarge] = useState<boolean | null>(null);
232
- const [prevIsMediumOrSmaller, setPrevIsMediumOrSmaller] = useState<boolean | null>(null);
233
-
234
- React.useEffect(() => {
235
- // Initial load - set initial values
236
- if (prevIsSmall === null || prevIsLarge === null || prevIsMediumOrSmaller === null) {
237
- // On small/medium screens, ALWAYS force small+collapsed regardless of stored prefs.
238
- // This ensures the sidebar never appears as a permanent drawer on mobile.
239
- if (isMediumOrSmaller) {
240
- setLocalNavSize("small");
241
- setLocalNavExpanded(false);
242
- } else {
243
- // Large screen: respect stored preferences or apply defaults
244
- const hasStoredNavSize = dashStorage.getItem('dashNavSize') !== null;
245
- const hasStoredNavExpanded = dashStorage.getItem('dashNavExpanded') !== null;
246
-
247
- if (!hasStoredNavSize) {
248
- setLocalNavSize("large");
249
- }
250
- if (!hasStoredNavExpanded) {
251
- setLocalNavExpanded(isLargeScreen);
252
- }
253
- }
254
-
255
- setPrevIsSmall(isSmallScreen);
256
- setPrevIsLarge(isLargeScreen);
257
- setPrevIsMediumOrSmaller(isMediumOrSmaller);
258
- return;
259
- }
260
-
261
- // Check if we crossed the medium breakpoint (sidebar position switch)
262
- if (prevIsMediumOrSmaller !== isMediumOrSmaller) {
263
- setLocalNavSize(isMediumOrSmaller ? "small" : "large");
264
-
265
- if (isMediumOrSmaller) {
266
- // Crossed into medium or smaller screen - collapse nav
267
- setLocalNavExpanded(false);
268
- } else {
269
- // Crossed into larger screen - expand nav
270
- setLocalNavExpanded(true);
271
- }
272
-
273
- setPrevIsMediumOrSmaller(isMediumOrSmaller);
274
- }
275
-
276
- // Check if we crossed the small breakpoint
277
- if (prevIsSmall !== isSmallScreen) {
278
- if (isSmallScreen) {
279
- // Crossed into small screen - collapse nav
280
- setLocalNavExpanded(false);
281
- }
282
-
283
- setPrevIsSmall(isSmallScreen);
284
- }
285
-
286
- // Check if we crossed the large breakpoint
287
- if (prevIsLarge !== isLargeScreen) {
288
- if (isLargeScreen && !isMediumOrSmaller) {
289
- // Only expand when crossing into large AND not in secondary mode
290
- setLocalNavExpanded(true);
291
- }
292
-
293
- setPrevIsLarge(isLargeScreen);
294
- }
295
- // 🎯 NO Redux dispatch here - only local state updates
296
- // Redux will be synced only on location changes
297
- }, [isSmallScreen, isLargeScreen, isMediumOrSmaller, prevIsSmall, prevIsLarge, prevIsMediumOrSmaller]);
298
-
299
- // For horizontal positions (top/bottom), always use expanded/large. For vertical (left/right), use local state.
300
- const effectiveNavExpanded = isHorizontalPosition ? true : localNavExpanded;
301
- const effectiveNavSize = isHorizontalPosition ? "large" : localNavSize;
302
-
303
- const drawerOpen = effectiveNavSize === "large" || (effectiveNavSize === "small" && effectiveNavExpanded);
304
- const drawerClassName = `sidebar-drawer`;
305
-
306
- return (
307
- <Box sx={{ display: 'flex' }}>
308
-
309
- <MuiDrawer
310
- variant={localNavSize === "small" ? 'temporary' : 'permanent'}
311
- anchor={sidebarPosition}
312
- open={drawerOpen}
313
- className={drawerClassName}
314
- data-sidebar-position={sidebarPosition}
315
- onClose={() => {
316
- if (localNavSize === "small") {
317
- setLocalNavExpanded(false);
318
- // 🎯 NO Redux dispatch here - only local state update
319
- }
320
- }}
321
- ModalProps={{
322
- keepMounted: true, // Better open performance on mobile
323
- }}
324
- >
325
- <AppMaterialMenu
326
- navSize={effectiveNavSize}
327
- navExpanded={effectiveNavExpanded}
328
- logos={logos}
329
- onToggleDrawer={isHorizontalPosition ? undefined : toggleDrawer}
330
- sidebarPosition={sidebarPosition}
331
- />
332
- </MuiDrawer>
333
- </Box>
334
- );
335
- };
336
-
337
- //AppSidebarMaterial.whyDidYouRender = true;
338
-
339
- export default AppSidebarMaterial;
@@ -1,84 +0,0 @@
1
- import * as React from 'react';
2
- import { Box } from '@mui/material';
3
- import { useSelector } from 'react-redux';
4
- import { IDASHAppState } from 'dash-admin-state';
5
- import { IDashAutoAdminResourceConfig } from 'dash-auto-admin';
6
- import AvatarComponent from '../../components/user/AvatarComponent';
7
- import BridgedLocalesMenuButton from '../../components/i18n/BridgedLocalesMenuButton';
8
- import DarkToggleMode from '../../components/menu/DarkToggleMode';
9
- import { useAuthContext } from '../../contexts/auth/AuthContext';
10
- import { SidebarPosition } from './AppSidebarMaterial';
11
- import LangSwitcher from '../../components/i18n/LangSwitcher';
12
-
13
- export interface SidebarActionsProps {
14
- sidebarPosition?: SidebarPosition;
15
- navExpanded?: boolean;
16
- }
17
-
18
- /**
19
- * Reusable component for sidebar actions: Avatar, Locale Selector, Dark Mode Toggle, and HeaderToolBar
20
- * Renders horizontally for top/bottom sidebar positions, vertically for left/right
21
- *
22
- * When headerToolBarReplace is true in Redux state, ONLY renders the HeaderToolBar component,
23
- * replacing the default actions (Avatar, Locale, DarkMode toggle).
24
- */
25
- const SidebarActions: React.FC<SidebarActionsProps> = ({
26
- sidebarPosition = "left",
27
- navExpanded = true
28
- }) => {
29
- const authContext = useAuthContext();
30
- const isHorizontal = sidebarPosition === "top" || sidebarPosition === "bottom";
31
-
32
- // Get HeaderToolBar and headerToolBarReplace from Redux
33
- const HeaderToolBar = useSelector(
34
- (state: IDASHAppState<any, any, IDashAutoAdminResourceConfig>) =>
35
- state.common.headerToolBar,
36
- );
37
- const headerToolBarReplace = useSelector(
38
- (state: IDASHAppState<any, any, IDashAutoAdminResourceConfig>) =>
39
- state.common.headerToolBarReplace,
40
- );
41
-
42
- return (
43
- <Box
44
- className="sidebar-actions"
45
- sx={{
46
- display: 'flex',
47
- alignItems: 'center',
48
- gap: 1,
49
- //flexDirection: isHorizontal ? 'row' : (navExpanded ? 'column-reverse' : 'column'),
50
-
51
- ...(isHorizontal ? {
52
- marginLeft: 'auto',
53
- flexShrink: 0,
54
- paddingRight: 2,
55
- flexDirection: navExpanded ? 'row-reverse' : 'row'
56
- }:
57
- {
58
-
59
- flexShrink: 0,
60
- flexDirection: navExpanded ? 'column' : 'column'
61
- }
62
- ),
63
- }}
64
- >
65
- {authContext?.authenticated && authContext.user?.id !== 'guest' && (
66
- <AvatarComponent sidebarPosition={sidebarPosition} />
67
- )}
68
-
69
- {HeaderToolBar && headerToolBarReplace ? (
70
- // Replace mode: Only render the custom HeaderToolBar
71
- (<HeaderToolBar />)
72
- ) : (
73
- // Default mode: Render all actions
74
- (<>
75
- {HeaderToolBar && <HeaderToolBar />}
76
- {authContext?.authenticated ? <BridgedLocalesMenuButton /> : <LangSwitcher />}
77
- <DarkToggleMode />
78
- </>)
79
- )}
80
- </Box>
81
- );
82
- };
83
-
84
- export default SidebarActions;