From 215b6d64337c1905ee621fa19a4f866f950c05e1 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 8 Jan 2025 15:09:36 +0800 Subject: [PATCH 1/2] Fix basic theme blazor menu remain open problem. Resolve #21840 --- .../Themes/Basic/FirstLevelNavMenuItem.razor | 39 ++++++++------- .../Basic/FirstLevelNavMenuItem.razor.cs | 27 ++++++---- .../Themes/Basic/MainMenuProvider.cs | 46 +++++++++++++++++ .../Themes/Basic/MenuItemViewModel.cs | 43 ++++++++++++++++ .../Themes/Basic/MenuViewModel.cs | 50 +++++++++++++++++++ .../Themes/Basic/NavMenu.razor | 2 +- .../Themes/Basic/NavMenu.razor.cs | 20 ++++++-- .../Themes/Basic/SecondLevelNavMenuItem.razor | 36 ++++++------- .../Basic/SecondLevelNavMenuItem.razor.cs | 27 ++++++---- 9 files changed, 226 insertions(+), 64 deletions(-) create mode 100644 modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MainMenuProvider.cs create mode 100644 modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuItemViewModel.cs create mode 100644 modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuViewModel.cs diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor index 0ccd9b93db..3b1cdc1d4d 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor @@ -1,29 +1,29 @@ @using Volo.Abp.UI.Navigation @{ - var elementId = MenuItem.ElementId ?? "MenuItem_" + MenuItem.Name.Replace(".", "_"); - var cssClass = string.IsNullOrEmpty(MenuItem.CssClass) ? string.Empty : MenuItem.CssClass; - var disabled = MenuItem.IsDisabled ? "disabled" : string.Empty; - var url = MenuItem.Url == null ? "#" : MenuItem.Url.TrimStart('/', '~'); - var customComponentType = MenuItem.GetComponentTypeOrDefault(); + var elementId = MenuItem.MenuItem.ElementId ?? "MenuItem_" + MenuItem.MenuItem.Name.Replace(".", "_"); + var cssClass = string.IsNullOrEmpty(MenuItem.MenuItem.CssClass) ? string.Empty : MenuItem.MenuItem.CssClass; + var disabled = MenuItem.MenuItem.IsDisabled ? "disabled" : string.Empty; + var url = MenuItem.MenuItem.Url == null ? "#" : MenuItem.MenuItem.Url.TrimStart('/', '~'); + var customComponentType = MenuItem.MenuItem.GetComponentTypeOrDefault(); } -@if (MenuItem.IsLeaf) +@if (MenuItem.MenuItem.IsLeaf) { if (customComponentType != null && typeof(ComponentBase).IsAssignableFrom(customComponentType)) { } - else if (MenuItem.Url != null) + else if (MenuItem.MenuItem.Url != null) { } @@ -38,22 +38,23 @@ else } else { - } - diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor.cs index 4cdd0ec8a4..fc1c0a2da4 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor.cs +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor.cs @@ -1,37 +1,42 @@ using System; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Routing; -using Volo.Abp.UI.Navigation; +using Volo.Abp.AspNetCore.Components.Web.Theming.Layout; namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; public partial class FirstLevelNavMenuItem : IDisposable { - [Inject] private NavigationManager NavigationManager { get; set; } + [Inject] + private NavigationManager NavigationManager { get; set; } + + [Inject] + protected PageLayout PageLayout { get; set; } [Parameter] - public ApplicationMenuItem MenuItem { get; set; } + public MenuViewModel Menu { get; set; } - public bool IsSubMenuOpen { get; set; } + [Parameter] + public MenuItemViewModel MenuItem { get; set; } protected override void OnInitialized() { NavigationManager.LocationChanged += OnLocationChanged; } - private void ToggleSubMenu() + protected virtual void OnLocationChanged(object sender, LocationChangedEventArgs e) { - IsSubMenuOpen = !IsSubMenuOpen; + Menu.CloseAll(); + Menu.InvokeStateChanged(); } - public void Dispose() + protected virtual void ToggleMenu() { - NavigationManager.LocationChanged -= OnLocationChanged; + Menu.ToggleOpen(MenuItem); } - private void OnLocationChanged(object sender, LocationChangedEventArgs e) + public virtual void Dispose() { - IsSubMenuOpen = false; - InvokeAsync(StateHasChanged); + NavigationManager.LocationChanged -= OnLocationChanged; } } diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MainMenuProvider.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MainMenuProvider.cs new file mode 100644 index 0000000000..c8d63792d9 --- /dev/null +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MainMenuProvider.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.UI.Navigation; + +namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; + +public class MainMenuProvider : IScopedDependency +{ + private readonly IMenuManager _menuManager; + + public MainMenuProvider(IMenuManager menuManager) + { + _menuManager = menuManager; + } + + public virtual async Task GetMenuAsync() + { + var menu = await _menuManager.GetMainMenuAsync(); + var result = new MenuViewModel + { + Menu = menu, + Items = menu.Items.Select(CreateMenuItemViewModel).ToList() + }; + result.SetParents(); + return result; + } + + private MenuItemViewModel CreateMenuItemViewModel(ApplicationMenuItem applicationMenuItem) + { + var viewModel = new MenuItemViewModel + { + MenuItem = applicationMenuItem, + }; + + viewModel.Items = new List(); + + foreach (var item in applicationMenuItem.Items) + { + viewModel.Items.Add(CreateMenuItemViewModel(item)); + } + + return viewModel; + } +} diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuItemViewModel.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuItemViewModel.cs new file mode 100644 index 0000000000..0c31d6dfe5 --- /dev/null +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuItemViewModel.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using JetBrains.Annotations; +using Volo.Abp.UI.Navigation; + +namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; + +public class MenuItemViewModel +{ + public ApplicationMenuItem MenuItem { get; set; } + + public IList Items { get; set; } + + public bool IsOpen { get; set; } + + [CanBeNull] + public MenuItemViewModel Parent { get; set; } + + public void Open() + { + Parent?.Open(); + IsOpen = true; + } + + public void Close() + { + foreach (var childItem in Items) + { + childItem.Close(); + } + + IsOpen = false; + } + + public void SetParents([CanBeNull] MenuItemViewModel parent) + { + Parent = parent; + + foreach (var childItem in Items) + { + childItem.SetParents(this); + } + } +} diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuViewModel.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuViewModel.cs new file mode 100644 index 0000000000..28e9a19d6d --- /dev/null +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuViewModel.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.UI.Navigation; + +namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; + +public class MenuViewModel +{ + public ApplicationMenu Menu { get; set; } + + public List Items { get; set; } + + public EventHandler StateChanged; + + public void SetParents() + { + foreach (var item in Items) + { + item.SetParents(null); + } + } + + public void ToggleOpen(MenuItemViewModel menuItem) + { + if (menuItem.IsOpen) + { + menuItem.Close(); + } + else + { + CloseAll(); + menuItem.Open(); + } + + StateChanged.InvokeSafely(this); + } + + public void CloseAll() + { + foreach (var item in Items) + { + item.Close(); + } + } + + public void InvokeStateChanged() + { + StateChanged.InvokeSafely(this); + } +} diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor index b35ec8ba2e..f0d03be25e 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor @@ -2,6 +2,6 @@ { foreach (var menuItem in Menu.Items) { - + } } diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor.cs index 5b9c07ad44..a6999173d5 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor.cs +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor.cs @@ -11,27 +11,39 @@ namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; public partial class NavMenu : IDisposable { [Inject] - protected IMenuManager MenuManager { get; set; } + protected MainMenuProvider MainMenuProvider { get; set; } [Inject] protected ApplicationConfigurationChangedService ApplicationConfigurationChangedService { get; set; } - protected ApplicationMenu Menu { get; set; } + protected MenuViewModel Menu { get; set; } protected async override Task OnInitializedAsync() { - Menu = await MenuManager.GetMainMenuAsync(); + Menu = await MainMenuProvider.GetMenuAsync(); + Menu.StateChanged += Menu_StateChanged; ApplicationConfigurationChangedService.Changed += ApplicationConfigurationChanged; } + private void Menu_StateChanged(object sender, EventArgs e) + { + InvokeAsync(StateHasChanged); + } + private async void ApplicationConfigurationChanged() { - Menu = await MenuManager.GetMainMenuAsync(); + Menu.StateChanged -= Menu_StateChanged; + Menu = await MainMenuProvider.GetMenuAsync(); + Menu.StateChanged += Menu_StateChanged; await InvokeAsync(StateHasChanged); } public void Dispose() { + if (Menu != null) + { + Menu.StateChanged -= Menu_StateChanged; + } ApplicationConfigurationChangedService.Changed -= ApplicationConfigurationChanged; } } diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor index 9200e83657..08f4f72090 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor @@ -1,26 +1,26 @@ @using Volo.Abp.UI.Navigation @{ - var elementId = MenuItem.ElementId ?? "MenuItem_" + MenuItem.Name.Replace(".", "_"); - var cssClass = string.IsNullOrEmpty(MenuItem.CssClass) ? string.Empty : MenuItem.CssClass; - var disabled = MenuItem.IsDisabled ? "disabled" : string.Empty; - var url = MenuItem.Url == null ? "#" : MenuItem.Url.TrimStart('/', '~'); - var customComponentType = MenuItem.GetComponentTypeOrDefault(); + var elementId = MenuItem.MenuItem.ElementId ?? "MenuItem_" + MenuItem.MenuItem.Name.Replace(".", "_"); + var cssClass = string.IsNullOrEmpty(MenuItem.MenuItem.CssClass) ? string.Empty : MenuItem.MenuItem.CssClass; + var disabled = MenuItem.MenuItem.IsDisabled ? "disabled" : string.Empty; + var url = MenuItem.MenuItem.Url == null ? "#" : MenuItem.MenuItem.Url.TrimStart('/', '~'); + var customComponentType = MenuItem.MenuItem.GetComponentTypeOrDefault(); } -@if (MenuItem.IsLeaf) +@if (MenuItem.MenuItem.IsLeaf) { if (customComponentType != null && typeof(ComponentBase).IsAssignableFrom(customComponentType)) { } - else if (MenuItem.Url != null) + else if (MenuItem.MenuItem.Url != null) { - - @if (MenuItem.Icon != null) + + @if (MenuItem.MenuItem.Icon != null) { - + } - @MenuItem.DisplayName + @MenuItem.MenuItem.DisplayName } @@ -34,22 +34,22 @@ else } else { - } - -} \ No newline at end of file +} diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor.cs index c736770884..d835082390 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor.cs +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor.cs @@ -1,37 +1,42 @@ using System; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Routing; -using Volo.Abp.UI.Navigation; +using Volo.Abp.AspNetCore.Components.Web.Theming.Layout; namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; public partial class SecondLevelNavMenuItem : IDisposable { - [Inject] private NavigationManager NavigationManager { get; set; } + [Inject] + private NavigationManager NavigationManager { get; set; } + + [Inject] + protected PageLayout PageLayout { get; set; } [Parameter] - public ApplicationMenuItem MenuItem { get; set; } + public MenuViewModel Menu { get; set; } - public bool IsSubMenuOpen { get; set; } + [Parameter] + public MenuItemViewModel MenuItem { get; set; } protected override void OnInitialized() { NavigationManager.LocationChanged += OnLocationChanged; } - private void ToggleSubMenu() + protected virtual void OnLocationChanged(object sender, LocationChangedEventArgs e) { - IsSubMenuOpen = !IsSubMenuOpen; + Menu.CloseAll(); + Menu.InvokeStateChanged(); } - public void Dispose() + protected virtual void ToggleMenu() { - NavigationManager.LocationChanged -= OnLocationChanged; + Menu.ToggleOpen(MenuItem); } - private void OnLocationChanged(object sender, LocationChangedEventArgs e) + public virtual void Dispose() { - IsSubMenuOpen = false; - InvokeAsync(StateHasChanged); + NavigationManager.LocationChanged -= OnLocationChanged; } } From b90f338ebbc9098eec94d4fdbc9fa6f404e7510b Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 11 Jan 2025 17:34:00 +0800 Subject: [PATCH 2/2] Refactor navigation menu components and remove unused view models --- .../Themes/Basic/FirstLevelNavMenuItem.razor | 107 +++++++++--------- .../Basic/FirstLevelNavMenuItem.razor.cs | 25 ++-- .../Themes/Basic/MainMenuProvider.cs | 46 -------- .../Themes/Basic/MenuItemViewModel.cs | 43 ------- .../Themes/Basic/MenuViewModel.cs | 50 -------- .../Themes/Basic/NavMenu.razor | 2 +- .../Themes/Basic/NavMenu.razor.cs | 20 +--- .../Themes/Basic/SecondLevelNavMenuItem.razor | 81 ++++++------- .../Basic/SecondLevelNavMenuItem.razor.cs | 27 ++--- 9 files changed, 117 insertions(+), 284 deletions(-) delete mode 100644 modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MainMenuProvider.cs delete mode 100644 modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuItemViewModel.cs delete mode 100644 modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuViewModel.cs diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor index 3b1cdc1d4d..32de8507cb 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor @@ -1,62 +1,67 @@ -@using Volo.Abp.UI.Navigation +@using Volo.Abp.UI.Navigation @{ - var elementId = MenuItem.MenuItem.ElementId ?? "MenuItem_" + MenuItem.MenuItem.Name.Replace(".", "_"); - var cssClass = string.IsNullOrEmpty(MenuItem.MenuItem.CssClass) ? string.Empty : MenuItem.MenuItem.CssClass; - var disabled = MenuItem.MenuItem.IsDisabled ? "disabled" : string.Empty; - var url = MenuItem.MenuItem.Url == null ? "#" : MenuItem.MenuItem.Url.TrimStart('/', '~'); - var customComponentType = MenuItem.MenuItem.GetComponentTypeOrDefault(); + var customComponentType = MenuItem.GetComponentTypeOrDefault(); } -@if (MenuItem.MenuItem.IsLeaf) + +@if (customComponentType != null && typeof(ComponentBase).IsAssignableFrom(customComponentType)) { - if (customComponentType != null && typeof(ComponentBase).IsAssignableFrom(customComponentType)) - { - - } - else if (MenuItem.MenuItem.Url != null) - { - - } + } else { - + else + { + var itemUrl = item.Url == null ? "#" : item.Url.TrimStart('/', '~'); + + @if (item.Icon != null) + { + + } + + @item.DisplayName + + + } + } + + } diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor.cs index fc1c0a2da4..ea448c3b7d 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor.cs +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor.cs @@ -1,23 +1,20 @@ using System; +using Blazorise; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Routing; -using Volo.Abp.AspNetCore.Components.Web.Theming.Layout; +using Volo.Abp.UI.Navigation; namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; public partial class FirstLevelNavMenuItem : IDisposable { - [Inject] - private NavigationManager NavigationManager { get; set; } - - [Inject] - protected PageLayout PageLayout { get; set; } - [Parameter] - public MenuViewModel Menu { get; set; } + public ApplicationMenuItem MenuItem { get; set; } = default!; - [Parameter] - public MenuItemViewModel MenuItem { get; set; } + private Dropdown _dropdown; + + [Inject] + private NavigationManager NavigationManager { get; set; } protected override void OnInitialized() { @@ -26,13 +23,7 @@ public partial class FirstLevelNavMenuItem : IDisposable protected virtual void OnLocationChanged(object sender, LocationChangedEventArgs e) { - Menu.CloseAll(); - Menu.InvokeStateChanged(); - } - - protected virtual void ToggleMenu() - { - Menu.ToggleOpen(MenuItem); + _dropdown?.Hide(); } public virtual void Dispose() diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MainMenuProvider.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MainMenuProvider.cs deleted file mode 100644 index c8d63792d9..0000000000 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MainMenuProvider.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.UI.Navigation; - -namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; - -public class MainMenuProvider : IScopedDependency -{ - private readonly IMenuManager _menuManager; - - public MainMenuProvider(IMenuManager menuManager) - { - _menuManager = menuManager; - } - - public virtual async Task GetMenuAsync() - { - var menu = await _menuManager.GetMainMenuAsync(); - var result = new MenuViewModel - { - Menu = menu, - Items = menu.Items.Select(CreateMenuItemViewModel).ToList() - }; - result.SetParents(); - return result; - } - - private MenuItemViewModel CreateMenuItemViewModel(ApplicationMenuItem applicationMenuItem) - { - var viewModel = new MenuItemViewModel - { - MenuItem = applicationMenuItem, - }; - - viewModel.Items = new List(); - - foreach (var item in applicationMenuItem.Items) - { - viewModel.Items.Add(CreateMenuItemViewModel(item)); - } - - return viewModel; - } -} diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuItemViewModel.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuItemViewModel.cs deleted file mode 100644 index 0c31d6dfe5..0000000000 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuItemViewModel.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System.Collections.Generic; -using JetBrains.Annotations; -using Volo.Abp.UI.Navigation; - -namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; - -public class MenuItemViewModel -{ - public ApplicationMenuItem MenuItem { get; set; } - - public IList Items { get; set; } - - public bool IsOpen { get; set; } - - [CanBeNull] - public MenuItemViewModel Parent { get; set; } - - public void Open() - { - Parent?.Open(); - IsOpen = true; - } - - public void Close() - { - foreach (var childItem in Items) - { - childItem.Close(); - } - - IsOpen = false; - } - - public void SetParents([CanBeNull] MenuItemViewModel parent) - { - Parent = parent; - - foreach (var childItem in Items) - { - childItem.SetParents(this); - } - } -} diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuViewModel.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuViewModel.cs deleted file mode 100644 index 28e9a19d6d..0000000000 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MenuViewModel.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using Volo.Abp.UI.Navigation; - -namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; - -public class MenuViewModel -{ - public ApplicationMenu Menu { get; set; } - - public List Items { get; set; } - - public EventHandler StateChanged; - - public void SetParents() - { - foreach (var item in Items) - { - item.SetParents(null); - } - } - - public void ToggleOpen(MenuItemViewModel menuItem) - { - if (menuItem.IsOpen) - { - menuItem.Close(); - } - else - { - CloseAll(); - menuItem.Open(); - } - - StateChanged.InvokeSafely(this); - } - - public void CloseAll() - { - foreach (var item in Items) - { - item.Close(); - } - } - - public void InvokeStateChanged() - { - StateChanged.InvokeSafely(this); - } -} diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor index f0d03be25e..b35ec8ba2e 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor @@ -2,6 +2,6 @@ { foreach (var menuItem in Menu.Items) { - + } } diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor.cs index a6999173d5..5b9c07ad44 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor.cs +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor.cs @@ -11,39 +11,27 @@ namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; public partial class NavMenu : IDisposable { [Inject] - protected MainMenuProvider MainMenuProvider { get; set; } + protected IMenuManager MenuManager { get; set; } [Inject] protected ApplicationConfigurationChangedService ApplicationConfigurationChangedService { get; set; } - protected MenuViewModel Menu { get; set; } + protected ApplicationMenu Menu { get; set; } protected async override Task OnInitializedAsync() { - Menu = await MainMenuProvider.GetMenuAsync(); - Menu.StateChanged += Menu_StateChanged; + Menu = await MenuManager.GetMainMenuAsync(); ApplicationConfigurationChangedService.Changed += ApplicationConfigurationChanged; } - private void Menu_StateChanged(object sender, EventArgs e) - { - InvokeAsync(StateHasChanged); - } - private async void ApplicationConfigurationChanged() { - Menu.StateChanged -= Menu_StateChanged; - Menu = await MainMenuProvider.GetMenuAsync(); - Menu.StateChanged += Menu_StateChanged; + Menu = await MenuManager.GetMainMenuAsync(); await InvokeAsync(StateHasChanged); } public void Dispose() { - if (Menu != null) - { - Menu.StateChanged -= Menu_StateChanged; - } ApplicationConfigurationChangedService.Changed -= ApplicationConfigurationChanged; } } diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor index 08f4f72090..2e6f783556 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor @@ -1,55 +1,48 @@ -@using Volo.Abp.UI.Navigation +@using Volo.Abp.UI.Navigation @{ - var elementId = MenuItem.MenuItem.ElementId ?? "MenuItem_" + MenuItem.MenuItem.Name.Replace(".", "_"); - var cssClass = string.IsNullOrEmpty(MenuItem.MenuItem.CssClass) ? string.Empty : MenuItem.MenuItem.CssClass; - var disabled = MenuItem.MenuItem.IsDisabled ? "disabled" : string.Empty; - var url = MenuItem.MenuItem.Url == null ? "#" : MenuItem.MenuItem.Url.TrimStart('/', '~'); - var customComponentType = MenuItem.MenuItem.GetComponentTypeOrDefault(); + var customComponentType = MenuItem.GetComponentTypeOrDefault(); } -@if (MenuItem.MenuItem.IsLeaf) + +@if (customComponentType != null && typeof(ComponentBase).IsAssignableFrom(customComponentType)) { - if (customComponentType != null && typeof(ComponentBase).IsAssignableFrom(customComponentType)) - { - - } - else if (MenuItem.MenuItem.Url != null) - { - - @if (MenuItem.MenuItem.Icon != null) - { - - } - - @MenuItem.MenuItem.DisplayName - - - } + } else { - + + } diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor.cs index d835082390..b188b764ed 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor.cs +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor.cs @@ -1,23 +1,23 @@ using System; +using Blazorise; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Routing; -using Volo.Abp.AspNetCore.Components.Web.Theming.Layout; +using Volo.Abp.UI.Navigation; namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; public partial class SecondLevelNavMenuItem : IDisposable { - [Inject] - private NavigationManager NavigationManager { get; set; } - - [Inject] - protected PageLayout PageLayout { get; set; } - [Parameter] - public MenuViewModel Menu { get; set; } + public ApplicationMenuItem MenuItem { get; set; } = default!; [Parameter] - public MenuItemViewModel MenuItem { get; set; } + public Dropdown ParentDropdown { get; set; } = default!; + + private Dropdown _dropdown; + + [Inject] + private NavigationManager NavigationManager { get; set; } protected override void OnInitialized() { @@ -26,13 +26,8 @@ public partial class SecondLevelNavMenuItem : IDisposable protected virtual void OnLocationChanged(object sender, LocationChangedEventArgs e) { - Menu.CloseAll(); - Menu.InvokeStateChanged(); - } - - protected virtual void ToggleMenu() - { - Menu.ToggleOpen(MenuItem); + ParentDropdown?.Hide(); + _dropdown?.Hide(); } public virtual void Dispose()