Resolved #885: Add default "Administration" menu

pull/892/head
Halil ibrahim Kalkan 7 years ago
parent e199619942
commit be76678c74

@ -1,5 +1,4 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap

@ -1,5 +1,4 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.AspNetCore.Mvc.UI.Packages;
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Bundling;

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
@ -13,6 +13,11 @@
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Volo\Abp\Ui\Navigation\Localization\Resource\*.json" />
<Content Remove="Volo\Abp\Ui\Navigation\Localization\Resource\*.json" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.UI\Volo.Abp.UI.csproj" />
</ItemGroup>

@ -1,10 +1,32 @@
using Volo.Abp.Modularity;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.Ui.Navigation;
using Volo.Abp.Ui.Navigation.Localization.Resource;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.UI.Navigation
{
[DependsOn(typeof(AbpUiModule))]
public class AbpUiNavigationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<VirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpUiNavigationModule>();
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AbpUiNavigationResource>("en")
.AddVirtualJson("/Volo/Abp/Ui/Navigation/Localization/Resource");
});
Configure<NavigationOptions>(options =>
{
options.MenuContributors.Add(new DefaultMenuContributor());
});
}
}
}

@ -0,0 +1,35 @@
using System.Linq;
using JetBrains.Annotations;
using Volo.Abp.Ui.Navigation;
namespace Volo.Abp.UI.Navigation
{
public static class ApplicationMenuExtensions
{
[NotNull]
public static ApplicationMenuItem GetAdministration(this ApplicationMenu applicationMenu)
{
return applicationMenu.GetMenuItem(DefaultMenuNames.Application.Main.Administration);
}
[NotNull]
public static ApplicationMenuItem GetMenuItem(this IHasMenuItems menuWithItems, string menuItemName)
{
var menuItem = menuWithItems.GetMenuItemOrNull(menuItemName);
if (menuItem == null)
{
throw new AbpException($"Could not find a menu item with given name: {menuItemName}");
}
return menuItem;
}
[CanBeNull]
public static ApplicationMenuItem GetMenuItemOrNull(
this IHasMenuItems menuWithItems,
string menuItemName)
{
return menuWithItems.Items.FirstOrDefault(mi => mi.Name == menuItemName);
}
}
}

@ -0,0 +1,34 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using System.Threading.Tasks;
using Volo.Abp.Ui.Navigation.Localization.Resource;
using Volo.Abp.UI.Navigation;
namespace Volo.Abp.Ui.Navigation
{
public class DefaultMenuContributor : IMenuContributor
{
public virtual Task ConfigureMenuAsync(MenuConfigurationContext context)
{
Configure(context);
return Task.CompletedTask;
}
protected virtual void Configure(MenuConfigurationContext context)
{
var l = context.ServiceProvider
.GetRequiredService<IStringLocalizer<AbpUiNavigationResource>>();
if (context.Menu.Name == StandardMenus.Main)
{
context.Menu.AddItem(
new ApplicationMenuItem(
DefaultMenuNames.Application.Main.Administration,
l["Menu:Administration"],
icon: "fa fa-wrench"
)
);
}
}
}
}

@ -0,0 +1,13 @@
namespace Volo.Abp.Ui.Navigation
{
public static class DefaultMenuNames
{
public static class Application
{
public static class Main
{
public const string Administration = "Abp.Application.Main.Administration";
}
}
}
}

@ -0,0 +1,10 @@
using Volo.Abp.Localization;
namespace Volo.Abp.Ui.Navigation.Localization.Resource
{
[LocalizationResourceName("AbpUiNavigation")]
public class AbpUiNavigationResource
{
}
}

@ -0,0 +1,6 @@
{
"culture": "en",
"texts": {
"Menu:Administration": "Administration"
}
}

@ -0,0 +1,6 @@
{
"culture": "tr",
"texts": {
"Menu:Administration": "Yönetim"
}
}

@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
@ -9,26 +8,26 @@ namespace Volo.Abp.UI.Navigation
{
public class MenuManager : IMenuManager, ITransientDependency
{
private readonly NavigationOptions _options;
private readonly IServiceProvider _serviceProvider;
protected NavigationOptions Options { get; }
protected IHybridServiceScopeFactory ServiceScopeFactory { get; }
public MenuManager(
IOptions<NavigationOptions> options,
IServiceProvider serviceProvider)
IHybridServiceScopeFactory serviceScopeFactory)
{
_serviceProvider = serviceProvider;
_options = options.Value;
ServiceScopeFactory = serviceScopeFactory;
Options = options.Value;
}
public async Task<ApplicationMenu> GetAsync(string name)
{
var menu = new ApplicationMenu(name);
using (var scope = _serviceProvider.CreateScope())
using (var scope = ServiceScopeFactory.CreateScope())
{
var context = new MenuConfigurationContext(menu, scope.ServiceProvider);
foreach (var contributor in _options.MenuContributors)
foreach (var contributor in Options.MenuContributors)
{
await contributor.ConfigureMenuAsync(context);
}
@ -41,6 +40,7 @@ namespace Volo.Abp.UI.Navigation
protected virtual void NormalizeMenu(ApplicationMenu menu)
{
//TODO: Should also consider sub menus, recursively, bottom to top!
menu.Items.RemoveAll(item => item.IsLeaf && item.Url.IsNullOrEmpty());
}
}

@ -2,6 +2,12 @@ namespace Volo.Abp.UI.Navigation
{
public static class StandardMenus
{
/* TODO: Consider to create nested class like
* StandardMenus.Application.Main
* StandardMenus.Application.User
* StandardMenus.Application.Shortcut
*/
public const string Main = "Main";
public const string User = "User";
public const string Shortcut = "Shortcut";

@ -2,6 +2,7 @@
namespace Localization.Resources.AbpUi
{
//TODO: Move to the Volo.Abp.UI.Localization.Resource folder
[LocalizationResourceName("AbpUi")]
public class AbpUiResource
{

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
@ -15,6 +15,7 @@
<ItemGroup>
<EmbeddedResource Include="Localization\**\*.json" />
<Content Remove="Localization\**\*.json" />
</ItemGroup>
<ItemGroup>

@ -20,7 +20,9 @@ namespace Volo.Abp.UI
Configure<AbpLocalizationOptions>(options =>
{
options.Resources.Add<AbpUiResource>("en").AddVirtualJson("/Localization/Resources/AbpUi");
options.Resources
.Add<AbpUiResource>("en")
.AddVirtualJson("/Localization/Resources/AbpUi");
});
}
}

@ -2,7 +2,7 @@
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.Modularity;
using System.Collections.Generic;
using Volo.Abp.Ui.Navigation;
using Xunit;
namespace Volo.Abp.UI.Navigation
@ -25,7 +25,7 @@ namespace Volo.Abp.UI.Navigation
mainMenu.DisplayName.ShouldBe("Main Menu");
mainMenu.Items.Count.ShouldBe(2);
mainMenu.Items[0].Name.ShouldBe("Dashboard");
mainMenu.Items[1].Name.ShouldBe("Administration");
mainMenu.Items[1].Name.ShouldBe(DefaultMenuNames.Application.Main.Administration);
mainMenu.Items[1].Items[0].Name.ShouldBe("Administration.UserManagement");
mainMenu.Items[1].Items[1].Name.ShouldBe("Administration.RoleManagement");
mainMenu.Items[1].Items[2].Name.ShouldBe("Administration.DashboardSettings");
@ -60,10 +60,7 @@ namespace Volo.Abp.UI.Navigation
context.Menu.DisplayName = "Main Menu";
var administration = context.Menu.Items.GetOrAdd(
m => m.Name == "Administration",
() => new ApplicationMenuItem("Administration", "Administration")
);
var administration = context.Menu.GetAdministration();
administration.AddItem(new ApplicationMenuItem("Administration.UserManagement", "User Management", url: "/admin/users"));
administration.AddItem(new ApplicationMenuItem("Administration.RoleManagement", "Role Management", url: "/admin/roles"));
@ -88,10 +85,7 @@ namespace Volo.Abp.UI.Navigation
context.Menu.Items.Insert(0, new ApplicationMenuItem("Dashboard", "Dashboard", url: "/dashboard"));
var administration = context.Menu.Items.GetOrAdd(
m => m.Name == "Administration",
() => new ApplicationMenuItem("Administration", "Administration")
);
var administration = context.Menu.GetAdministration();
administration.AddItem(new ApplicationMenuItem("Administration.DashboardSettings", "Dashboard Settings", url: "/admin/settings/dashboard"));

Loading…
Cancel
Save