diff --git a/src/Masa.Stack.Components/Configs/GlobalConfig.cs b/src/Masa.Stack.Components/Configs/GlobalConfig.cs index 9db91656..006cb489 100644 --- a/src/Masa.Stack.Components/Configs/GlobalConfig.cs +++ b/src/Masa.Stack.Components/Configs/GlobalConfig.cs @@ -2,17 +2,21 @@ public class GlobalConfig : IScopedDependency { - private const string DarkCookieKey = "GlobalConfig_IsDark"; - private const string MiniCookieKey = "GlobalConfig_NavigationMini"; - private const string FavoriteCookieKey = "GlobalConfig_Favorite"; - private const string LangCookieKey = "GlobalConfig_Lang"; + private const string DarkStoreKey = "GlobalConfig_IsDark"; + private const string MiniStoreKey = "GlobalConfig_NavigationMini"; + private const string FavoriteStoreKey = "GlobalConfig_Favorite"; + private const string LangStoreKey = "GlobalConfig_Lang"; + private const string NavLayerStoreKey = "GlobalConfig_NavLayer"; - private readonly CookieStorage _cookieStorage; + private readonly LocalStorage _localStore; private readonly I18n _i18N; private bool _dark; private bool _mini; private string _favorite; private Guid _currentTeamId; + private int _navLayer = 2; + + public List NavLayerItems = new List { 1, 2, 3 }; public delegate void GlobalConfigChanged(); @@ -22,10 +26,14 @@ public class GlobalConfig : IScopedDependency public event CurrentTeamChanged? OnCurrentTeamChanged; - public GlobalConfig(CookieStorage cookieStorage, I18n i18n) + public delegate Task NavLayerChanged(); + + public event NavLayerChanged? OnNavLayerChanged; + + public GlobalConfig(I18n i18n, LocalStorage localStore) { - _cookieStorage = cookieStorage; _i18N = i18n; + _localStore = localStore; } public CultureInfo Culture @@ -34,7 +42,7 @@ public CultureInfo Culture set { _i18N.SetCulture(new CultureInfo("en-US"), value); - _cookieStorage.SetAsync(LangCookieKey, value.Name); + _localStore.SetItemAsync(LangStoreKey, value.Name); OnLanguageChanged?.Invoke(); } } @@ -61,7 +69,7 @@ public bool Dark set { _dark = value; - _cookieStorage.SetAsync(DarkCookieKey, value); + _localStore.SetItemAsync(DarkStoreKey, value); } } @@ -73,7 +81,7 @@ public bool Mini set { _mini = value; - _cookieStorage?.SetAsync(MiniCookieKey, value); + _localStore?.SetItemAsync(MiniStoreKey, value); } } @@ -83,20 +91,40 @@ public string Favorite set { _favorite = value; - _cookieStorage?.SetAsync(FavoriteCookieKey, value); + _localStore?.SetItemAsync(FavoriteStoreKey, value); + } + } + + public int NavLayer + { + get => _navLayer; + set + { + if (_navLayer != value) + { + _navLayer = value; + OnNavLayerChanged?.Invoke(); + _localStore.SetItemAsync(NavLayerStoreKey, value); + } } } public async void Initialization() { - _dark = Convert.ToBoolean(await _cookieStorage.GetAsync(DarkCookieKey)); - bool.TryParse(await _cookieStorage.GetAsync(MiniCookieKey), out _mini); - _favorite = await _cookieStorage.GetAsync(FavoriteCookieKey); + _dark = Convert.ToBoolean(await _localStore.GetItemAsync(DarkStoreKey)); + bool.TryParse(await _localStore.GetItemAsync(MiniStoreKey), out _mini); + _favorite = await _localStore.GetItemAsync(FavoriteStoreKey) ?? string.Empty; - var lang = await _cookieStorage.GetAsync(LangCookieKey); + var lang = await _localStore.GetItemAsync(LangStoreKey); if (!string.IsNullOrWhiteSpace(lang)) { _i18N.SetCulture(new CultureInfo("en-US"), new CultureInfo(lang)); } + + var navLayer = await _localStore.GetItemAsync(NavLayerStoreKey); + if (navLayer > 0) + { + _navLayer = navLayer; + } } } diff --git a/src/Masa.Stack.Components/Locales/en-US.json b/src/Masa.Stack.Components/Locales/en-US.json index 77417ca2..89dd9964 100644 --- a/src/Masa.Stack.Components/Locales/en-US.json +++ b/src/Masa.Stack.Components/Locales/en-US.json @@ -131,5 +131,7 @@ }, "403Tips": "You are not authorized! ", "404Tips": "The requested URL was not found.", - "BackToHome": "Back to home" + "BackToHome": "Back to home", + "NavigationLayerLabel": "Menu display", + "Layer": "layer" } diff --git a/src/Masa.Stack.Components/Locales/ru-RU.json b/src/Masa.Stack.Components/Locales/ru-RU.json index 09c200c0..145f6f1a 100644 --- a/src/Masa.Stack.Components/Locales/ru-RU.json +++ b/src/Masa.Stack.Components/Locales/ru-RU.json @@ -216,5 +216,7 @@ "Create": "Создать", "403Tips": "У вас нет разрешения!", "404Tips": "Не найден запрашиваемый URL.", - "BackToHome": "Вернуться на главную" + "BackToHome": "Вернуться на главную", + "NavigationLayerLabel": "Меню Показать", + "Layer": "Слой" } diff --git a/src/Masa.Stack.Components/Locales/zh-CN.json b/src/Masa.Stack.Components/Locales/zh-CN.json index 774c7bf1..df7fbc32 100644 --- a/src/Masa.Stack.Components/Locales/zh-CN.json +++ b/src/Masa.Stack.Components/Locales/zh-CN.json @@ -217,5 +217,7 @@ "Create": "新建", "403Tips": "您未经授权!", "404Tips": "找不到请求的URL。", - "BackToHome": "回到主页" + "BackToHome": "回到主页", + "NavigationLayerLabel": "菜单显示", + "Layer": "层" } diff --git a/src/Masa.Stack.Components/Shared/GlobalNavigations/ExpansionAppWrapper.razor b/src/Masa.Stack.Components/Shared/GlobalNavigations/ExpansionAppWrapper.razor index 446077af..b88b845f 100644 --- a/src/Masa.Stack.Components/Shared/GlobalNavigations/ExpansionAppWrapper.razor +++ b/src/Masa.Stack.Components/Shared/GlobalNavigations/ExpansionAppWrapper.razor @@ -38,15 +38,21 @@ @code { - private RenderFragment RenderNestNav(ExpansionMenu menu) => __builder => + private RenderFragment RenderNestNav(ExpansionMenu menu, int layer = 1) => __builder => { @RenderNav(menu) + if (GlobalConfig.NavLayer <= layer) + { + return; + } + if (menu.Children.Count != 0) { foreach (var child in menu.Children) { - @RenderNestNav(child) + layer++; + @RenderNestNav(child, layer) } } }; diff --git a/src/Masa.Stack.Components/Shared/GlobalNavigations/ExpansionAppWrapper.razor.cs b/src/Masa.Stack.Components/Shared/GlobalNavigations/ExpansionAppWrapper.razor.cs index 18f99172..7d854d95 100644 --- a/src/Masa.Stack.Components/Shared/GlobalNavigations/ExpansionAppWrapper.razor.cs +++ b/src/Masa.Stack.Components/Shared/GlobalNavigations/ExpansionAppWrapper.razor.cs @@ -11,6 +11,16 @@ public partial class ExpansionAppWrapper [Parameter] public EventCallback OnItemOperClick { get; set; } + [Inject] + public GlobalConfig GlobalConfig { get; set; } = null!; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + GlobalConfig.OnNavLayerChanged += Changed; + } + private async Task ItemOperClick() { await OnItemOperClick.InvokeAsync(Value); @@ -43,4 +53,15 @@ private static string GetClass(ExpansionMenu menu) return string.Join(" ", css); } + + async Task Changed() + { + await InvokeAsync(StateHasChanged); + } + + protected override ValueTask DisposeAsyncCore() + { + GlobalConfig.OnNavLayerChanged -= Changed; + return base.DisposeAsyncCore(); + } } diff --git a/src/Masa.Stack.Components/Shared/GlobalNavigations/GlobalNavigation.razor b/src/Masa.Stack.Components/Shared/GlobalNavigations/GlobalNavigation.razor index 56e81425..9f124d46 100644 --- a/src/Masa.Stack.Components/Shared/GlobalNavigations/GlobalNavigation.razor +++ b/src/Masa.Stack.Components/Shared/GlobalNavigations/GlobalNavigation.razor @@ -81,6 +81,10 @@
@T("GlobalNavigation") +
+ +
+ mdi-close diff --git a/src/Masa.Stack.Components/Shared/GlobalNavigations/GlobalNavigation.razor.cs b/src/Masa.Stack.Components/Shared/GlobalNavigations/GlobalNavigation.razor.cs index b5468e46..6facf10f 100644 --- a/src/Masa.Stack.Components/Shared/GlobalNavigations/GlobalNavigation.razor.cs +++ b/src/Masa.Stack.Components/Shared/GlobalNavigations/GlobalNavigation.razor.cs @@ -16,6 +16,9 @@ public partial class GlobalNavigation : MasaComponentBase [Parameter] public Func? OnFavoriteRemove { get; set; } + [Inject] + public GlobalConfig GlobalConfig { get; set; } = null!; + private bool _visible; private List<(string name, string url)>? _recentVisits; private List>? _recommendApps; diff --git a/src/Masa.Stack.Components/Shared/Layouts/Components/Notification.razor.cs b/src/Masa.Stack.Components/Shared/Layouts/Components/Notification.razor.cs index b662b0a7..96ec5d35 100644 --- a/src/Masa.Stack.Components/Shared/Layouts/Components/Notification.razor.cs +++ b/src/Masa.Stack.Components/Shared/Layouts/Components/Notification.razor.cs @@ -113,9 +113,13 @@ async Task Changed() await InvokeAsync(StateHasChanged); } - public async void Dispose() + protected override async ValueTask DisposeAsyncCore() { NoticeState.OnNoticeChanged -= Changed; - await HubConnection.DisposeAsync(); + if (HubConnection != null) + { + await HubConnection.DisposeAsync(); + } + await base.DisposeAsyncCore(); } } \ No newline at end of file