Browse Source

Resolved #9286: Allow to render more than one menu in the main menu

pull/9261/head
Halil İbrahim Kalkan 5 years ago
parent
commit
7998daff7c
  1. 10
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/AbpNavigationOptions.cs
  2. 2
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IMenuManager.cs
  3. 53
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs
  4. 2
      modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/NavMenu.razor.cs
  5. 2
      modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Menu/MainNavbarMenuViewComponent.cs
  6. 1
      modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs
  7. 31
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenuContributor.cs
  8. 5
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenus.cs

10
framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/AbpNavigationOptions.cs

@ -7,10 +7,20 @@ namespace Volo.Abp.UI.Navigation
{
[NotNull]
public List<IMenuContributor> MenuContributors { get; }
/// <summary>
/// Includes the <see cref="StandardMenus.Main"/> by default.
/// </summary>
public List<string> MainMenuNames { get; }
public AbpNavigationOptions()
{
MenuContributors = new List<IMenuContributor>();
MainMenuNames = new List<string>
{
StandardMenus.Main
};
}
}
}

2
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<ApplicationMenu> GetAsync(string name);
Task<ApplicationMenu> GetMainMenuAsync();
}
}

53
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<ApplicationMenu> GetAsync(string name)
public Task<ApplicationMenu> GetAsync(string name)
{
return GetInternalAsync(StandardMenus.Main);
}
public Task<ApplicationMenu> GetMainMenuAsync()
{
return GetAsync(Options.MainMenuNames.ToArray());
}
protected virtual async Task<ApplicationMenu> GetAsync(params string[] menuNames)
{
if (menuNames.IsNullOrEmpty())
{
return new ApplicationMenu(StandardMenus.Main);
}
var menus = new List<ApplicationMenu>();
foreach (var menuName in Options.MainMenuNames)
{
menus.Add(await GetInternalAsync(menuName));
}
return MergeMenus(menus);
}
protected virtual ApplicationMenu MergeMenus(List<ApplicationMenu> 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<ApplicationMenu> GetInternalAsync(string name)
{
var menu = new ApplicationMenu(name);

2
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();
}
}
}

2
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<IViewComponentResult> InvokeAsync()
{
var menu = await _menuManager.GetAsync(StandardMenus.Main);
var menu = await _menuManager.GetMainMenuAsync();
return View("~/Themes/Basic/Components/Menu/Default.cshtml", menu);
}
}

1
modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs

@ -44,6 +44,7 @@ namespace Volo.CmsKit.Public.Web
Configure<AbpNavigationOptions>(options =>
{
options.MenuContributors.Add(new CmsKitPublicMenuContributor());
options.MainMenuNames.Add(CmsKitMenus.Public);
});
Configure<AbpVirtualFileSystemOptions>(options =>

31
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<MenuItemDto> 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<MenuItemDto> 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);
}
}
}
}

5
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";
}
}

Loading…
Cancel
Save