diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/AbpNavigationOptions.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/AbpNavigationOptions.cs index 75c2d426d9..2306778f26 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/AbpNavigationOptions.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/AbpNavigationOptions.cs @@ -7,10 +7,20 @@ namespace Volo.Abp.UI.Navigation { [NotNull] public List MenuContributors { get; } + + /// + /// Includes the by default. + /// + public List MainMenuNames { get; } public AbpNavigationOptions() { MenuContributors = new List(); + + MainMenuNames = new List + { + StandardMenus.Main + }; } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IMenuManager.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IMenuManager.cs index c22c771e7b..250b77eef0 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IMenuManager.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IMenuManager.cs @@ -5,5 +5,7 @@ namespace Volo.Abp.UI.Navigation public interface IMenuManager { Task GetAsync(string name); + + Task GetMainMenuAsync(); } } diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs index 0b52aff7b8..e32047c404 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Options; @@ -24,7 +25,57 @@ namespace Volo.Abp.UI.Navigation SimpleStateCheckerManager = simpleStateCheckerManager; } - public async Task GetAsync(string name) + public Task GetAsync(string name) + { + return GetInternalAsync(StandardMenus.Main); + } + + public Task GetMainMenuAsync() + { + return GetAsync(Options.MainMenuNames.ToArray()); + } + + protected virtual async Task GetAsync(params string[] menuNames) + { + if (menuNames.IsNullOrEmpty()) + { + return new ApplicationMenu(StandardMenus.Main); + } + + var menus = new List(); + + foreach (var menuName in Options.MainMenuNames) + { + menus.Add(await GetInternalAsync(menuName)); + } + + return MergeMenus(menus); + } + + protected virtual ApplicationMenu MergeMenus(List menus) + { + Check.NotNullOrEmpty(menus, nameof(menus)); + + if (menus.Count == 1) + { + return menus[0]; + } + + var firstMenu = menus[0]; + + for (int i = 1; i < menus.Count; i++) + { + var currentMenu = menus[i]; + foreach (var menuItem in currentMenu.Items) + { + firstMenu.AddItem(menuItem); + } + } + + return firstMenu; + } + + protected virtual async Task GetInternalAsync(string name) { var menu = new ApplicationMenu(name); 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 302c3c9ec2..af408aab57 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 @@ -13,7 +13,7 @@ namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic protected override async Task OnInitializedAsync() { - Menu = await MenuManager.GetAsync(StandardMenus.Main); + Menu = await MenuManager.GetMainMenuAsync(); } } } diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Menu/MainNavbarMenuViewComponent.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Menu/MainNavbarMenuViewComponent.cs index 0369457165..72534ecd42 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Menu/MainNavbarMenuViewComponent.cs +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Menu/MainNavbarMenuViewComponent.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Menu public async Task InvokeAsync() { - var menu = await _menuManager.GetAsync(StandardMenus.Main); + var menu = await _menuManager.GetMainMenuAsync(); return View("~/Themes/Basic/Components/Menu/Default.cshtml", menu); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs index 95cce8da9f..23fdd07206 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs @@ -44,6 +44,7 @@ namespace Volo.CmsKit.Public.Web Configure(options => { options.MenuContributors.Add(new CmsKitPublicMenuContributor()); + options.MainMenuNames.Add(CmsKitMenus.Public); }); Configure(options => diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenuContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenuContributor.cs index f867a025d1..271a0a1ae8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenuContributor.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenuContributor.cs @@ -14,7 +14,7 @@ namespace Volo.CmsKit.Public.Web.Menus { public async Task ConfigureMenuAsync(MenuConfigurationContext context) { - if (context.Menu.Name == StandardMenus.Main) + if (context.Menu.Name == CmsKitMenus.Public) { await ConfigureMainMenuAsync(context); } @@ -30,12 +30,9 @@ namespace Volo.CmsKit.Public.Web.Menus if (mainMenu != null) { - // TODO: Consider about not to remove existing static menus. - // context.Menu.Items.Clear(); - foreach (var menuItemDto in mainMenu.Items.Where(x => x.ParentId == null && x.IsActive)) { - var applicationMenuItem = CreateApplicationMenu(menuItemDto); + var applicationMenuItem = CreateApplicationMenuItem(menuItemDto); context.Menu.Items.Add(applicationMenuItem); AddChildItems(applicationMenuItem, menuItemDto, mainMenu.Items); } @@ -43,7 +40,18 @@ namespace Volo.CmsKit.Public.Web.Menus } } - private ApplicationMenuItem CreateApplicationMenu(MenuItemDto menuItem) + private void AddChildItems(ApplicationMenuItem parent, MenuItemDto menuItem, List source) + { + var applicationMenuItem = CreateApplicationMenuItem(menuItem); + parent.Items.Add(applicationMenuItem); + + foreach (var item in source.Where(x => x.ParentId == menuItem.Id && x.IsActive)) + { + AddChildItems(applicationMenuItem, item, source); + } + } + + private ApplicationMenuItem CreateApplicationMenuItem(MenuItemDto menuItem) { return new ApplicationMenuItem( menuItem.DisplayName, @@ -58,16 +66,5 @@ namespace Volo.CmsKit.Public.Web.Menus menuItem.RequiredPermissionName ); } - - private void AddChildItems(ApplicationMenuItem parent, MenuItemDto menuItem, List source) - { - var applicationMenuItem = CreateApplicationMenu(menuItem); - parent.Items.Add(applicationMenuItem); - - foreach (var item in source.Where(x => x.ParentId == menuItem.Id && x.IsActive)) - { - AddChildItems(applicationMenuItem, item, source); - } - } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenus.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenus.cs index eee362a20b..41cf4b0e96 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenus.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenus.cs @@ -7,4 +7,9 @@ //Add your menu items here... //public const string Home = Prefix + ".MyNewMenuItem"; } + + public class CmsKitMenus + { + public const string Public = "CmsKit.Public"; + } }