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; using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap 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.Bundling;
using Volo.Abp.AspNetCore.Mvc.UI.Packages; using Volo.Abp.AspNetCore.Mvc.UI.Packages;
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Bundling; 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" /> <Import Project="..\..\..\common.props" />
@ -13,6 +13,11 @@
<RootNamespace /> <RootNamespace />
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Volo\Abp\Ui\Navigation\Localization\Resource\*.json" />
<Content Remove="Volo\Abp\Ui\Navigation\Localization\Resource\*.json" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Volo.Abp.UI\Volo.Abp.UI.csproj" /> <ProjectReference Include="..\Volo.Abp.UI\Volo.Abp.UI.csproj" />
</ItemGroup> </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 namespace Volo.Abp.UI.Navigation
{ {
[DependsOn(typeof(AbpUiModule))] [DependsOn(typeof(AbpUiModule))]
public class AbpUiNavigationModule : AbpModule 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;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -9,26 +8,26 @@ namespace Volo.Abp.UI.Navigation
{ {
public class MenuManager : IMenuManager, ITransientDependency public class MenuManager : IMenuManager, ITransientDependency
{ {
private readonly NavigationOptions _options; protected NavigationOptions Options { get; }
private readonly IServiceProvider _serviceProvider; protected IHybridServiceScopeFactory ServiceScopeFactory { get; }
public MenuManager( public MenuManager(
IOptions<NavigationOptions> options, IOptions<NavigationOptions> options,
IServiceProvider serviceProvider) IHybridServiceScopeFactory serviceScopeFactory)
{ {
_serviceProvider = serviceProvider; ServiceScopeFactory = serviceScopeFactory;
_options = options.Value; Options = options.Value;
} }
public async Task<ApplicationMenu> GetAsync(string name) public async Task<ApplicationMenu> GetAsync(string name)
{ {
var menu = new ApplicationMenu(name); var menu = new ApplicationMenu(name);
using (var scope = _serviceProvider.CreateScope()) using (var scope = ServiceScopeFactory.CreateScope())
{ {
var context = new MenuConfigurationContext(menu, scope.ServiceProvider); var context = new MenuConfigurationContext(menu, scope.ServiceProvider);
foreach (var contributor in _options.MenuContributors) foreach (var contributor in Options.MenuContributors)
{ {
await contributor.ConfigureMenuAsync(context); await contributor.ConfigureMenuAsync(context);
} }
@ -41,6 +40,7 @@ namespace Volo.Abp.UI.Navigation
protected virtual void NormalizeMenu(ApplicationMenu menu) 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()); menu.Items.RemoveAll(item => item.IsLeaf && item.Url.IsNullOrEmpty());
} }
} }

@ -2,6 +2,12 @@ namespace Volo.Abp.UI.Navigation
{ {
public static class StandardMenus 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 Main = "Main";
public const string User = "User"; public const string User = "User";
public const string Shortcut = "Shortcut"; public const string Shortcut = "Shortcut";

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

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

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

Loading…
Cancel
Save