@dashadmin/dash-admin 1.3.25 → 1.3.26

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