From f57520755bc0a970f59472fb20796693c50048ec Mon Sep 17 00:00:00 2001 From: Ahmet Date: Sat, 3 Oct 2020 01:40:33 +0300 Subject: [PATCH] Added Setting Management Blazor UI Closes: #5541 --- .../Volo.Abp.SettingManagement.sln | 7 +++ .../AbpSettingManagementBlazorModule.cs | 36 +++++++++++ .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 ++++++++++ .../ISettingComponentContributor.cs | 11 ++++ .../Menus/SettingManagementMenuContributor.cs | 60 +++++++++++++++++++ .../Menus/SettingManagementMenus.cs | 7 +++ .../SettingManagement/SettingManagement.razor | 57 ++++++++++++++++++ .../SettingManagement.razor.cs | 45 ++++++++++++++ .../SettingComponentCreationContext.cs | 20 +++++++ .../SettingComponentGroup.cs | 39 ++++++++++++ ...ettingManagementBlazorAutoMapperProfile.cs | 12 ++++ .../SettingManagementComponentOptions.cs | 14 +++++ .../Volo.Abp.SettingManagement.Blazor.csproj | 20 +++++++ .../_Imports.razor | 5 ++ 15 files changed, 366 insertions(+) create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/AbpSettingManagementBlazorModule.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/FodyWeavers.xml create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/FodyWeavers.xsd create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/ISettingComponentContributor.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenuContributor.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenus.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingComponentCreationContext.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingComponentGroup.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingManagementBlazorAutoMapperProfile.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingManagementComponentOptions.cs create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.csproj create mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/_Imports.razor diff --git a/modules/setting-management/Volo.Abp.SettingManagement.sln b/modules/setting-management/Volo.Abp.SettingManagement.sln index 54a63cb48a..8292218678 100644 --- a/modules/setting-management/Volo.Abp.SettingManagement.sln +++ b/modules/setting-management/Volo.Abp.SettingManagement.sln @@ -25,6 +25,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.SettingManagement. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.SettingManagement.Web", "src\Volo.Abp.SettingManagement.Web\Volo.Abp.SettingManagement.Web.csproj", "{AF6BE46D-AC88-4DEF-BBEC-F60A00847D43}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.SettingManagement.Blazor", "src\Volo.Abp.SettingManagement.Blazor\Volo.Abp.SettingManagement.Blazor.csproj", "{BDF54E3C-C262-406E-8060-84C423335BDD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -67,6 +69,10 @@ Global {AF6BE46D-AC88-4DEF-BBEC-F60A00847D43}.Debug|Any CPU.Build.0 = Debug|Any CPU {AF6BE46D-AC88-4DEF-BBEC-F60A00847D43}.Release|Any CPU.ActiveCfg = Release|Any CPU {AF6BE46D-AC88-4DEF-BBEC-F60A00847D43}.Release|Any CPU.Build.0 = Release|Any CPU + {BDF54E3C-C262-406E-8060-84C423335BDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BDF54E3C-C262-406E-8060-84C423335BDD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BDF54E3C-C262-406E-8060-84C423335BDD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BDF54E3C-C262-406E-8060-84C423335BDD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -81,6 +87,7 @@ Global {AFF6A7B6-A80B-4569-9F6B-CD6C72EAB6D4} = {7E8D2943-ADE7-4C89-8048-0780CE07E0E0} {DF76DE74-1029-4FEA-8ADF-3C5636944757} = {7E8D2943-ADE7-4C89-8048-0780CE07E0E0} {AF6BE46D-AC88-4DEF-BBEC-F60A00847D43} = {F1BE945B-F0CF-4712-BC2B-9AF8C02059EA} + {BDF54E3C-C262-406E-8060-84C423335BDD} = {F1BE945B-F0CF-4712-BC2B-9AF8C02059EA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {24B3A486-E7CA-4AA5-B76F-27D351A97E59} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/AbpSettingManagementBlazorModule.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/AbpSettingManagementBlazorModule.cs new file mode 100644 index 0000000000..2ff6f9b6cf --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/AbpSettingManagementBlazorModule.cs @@ -0,0 +1,36 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Routing; +using Volo.Abp.AutoMapper; +using Volo.Abp.Modularity; +using Volo.Abp.SettingManagement.Blazor.Menus; +using Volo.Abp.UI.Navigation; + +namespace Volo.Abp.SettingManagement.Blazor +{ + [DependsOn( + typeof(AbpSettingManagementDomainSharedModule), + typeof(AbpAutoMapperModule) + )] + public class AbpSettingManagementBlazorModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAutoMapperObjectMapper(); + + Configure(options => + { + options.AddProfile(validate: true); + }); + + Configure(options => + { + options.MenuContributors.Add(new SettingManagementMenuContributor()); + }); + + Configure(options => + { + options.AdditionalAssemblies.Add(typeof(AbpSettingManagementBlazorModule).Assembly); + }); + } + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/FodyWeavers.xml b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/FodyWeavers.xml new file mode 100644 index 0000000000..be0de3a908 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/FodyWeavers.xsd b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/FodyWeavers.xsd new file mode 100644 index 0000000000..3f3946e282 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/ISettingComponentContributor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/ISettingComponentContributor.cs new file mode 100644 index 0000000000..19e8abb562 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/ISettingComponentContributor.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.SettingManagement.Blazor +{ + public interface ISettingComponentContributor + { + Task ConfigureAsync(SettingComponentCreationContext context); + + Task CheckPermissionsAsync(SettingComponentCreationContext context); + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenuContributor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenuContributor.cs new file mode 100644 index 0000000000..5b9b7a3c35 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenuContributor.cs @@ -0,0 +1,60 @@ +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.SettingManagement.Localization; +using Volo.Abp.UI.Navigation; + +namespace Volo.Abp.SettingManagement.Blazor.Menus +{ + public class SettingManagementMenuContributor : IMenuContributor + { + public async Task ConfigureMenuAsync(MenuConfigurationContext context) + { + if (context.Menu.Name == StandardMenus.Main) + { + await ConfigureMainMenu(context); + } + } + + private async Task ConfigureMainMenu(MenuConfigurationContext context) + { + var settingManagementPageOptions = context.ServiceProvider.GetRequiredService>().Value; + var settingPageCreationContext = new SettingComponentCreationContext(context.ServiceProvider); + if ( + !settingManagementPageOptions.Contributors.Any() || + !(await CheckAnyOfPagePermissionsGranted(settingManagementPageOptions, settingPageCreationContext)) + ) + { + return; + } + + var l = context.GetLocalizer(); + + context.Menu + .GetAdministration() + .AddItem( + new ApplicationMenuItem( + SettingManagementMenus.GroupName, + l["Settings"], + "/SettingManagement", + icon: "fa fa-cog" + ) + ); + } + + protected virtual async Task CheckAnyOfPagePermissionsGranted( + SettingManagementComponentOptions settingManagementComponentOptions, + SettingComponentCreationContext settingComponentCreationContext) + { + foreach (var contributor in settingManagementComponentOptions.Contributors) + { + if (await contributor.CheckPermissionsAsync(settingComponentCreationContext)) + { + return true; + } + } + return false; + } + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenus.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenus.cs new file mode 100644 index 0000000000..4e109b8d32 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenus.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.SettingManagement.Blazor.Menus +{ + public class SettingManagementMenus + { + public const string GroupName = "SettingManagement"; + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor new file mode 100644 index 0000000000..0586b5c5b6 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor @@ -0,0 +1,57 @@ +@page "/SettingManagement" +@using Microsoft.Extensions.Localization +@using Volo.Abp.SettingManagement.Localization +@inject IStringLocalizer L +@inherits SettingManagementBase + +@* ************************* PAGE HEADER ************************* *@ +
+
+

@L["Settings"]

+
+
+ +
+
+
+ +
+
+
+ + + + + + @foreach (var group in SettingComponentCreationContext.Groups) + { + + @group.DisplayName + + } + + + @foreach (var group in SettingComponentCreationContext.Groups) + { + +

@group.DisplayName

+ + + @{ + SettingItemRenders.Add(builder => + { + builder.OpenComponent(0, group.ComponentType); + builder.CloseComponent(); + }); + } + + @SettingItemRenders.Last() +
+ } +
+
+
+
\ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor.cs new file mode 100644 index 0000000000..3d41afd05f --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Options; + +namespace Volo.Abp.SettingManagement.Blazor.Pages.SettingManagement +{ + public abstract class SettingManagementBase : OwningComponentBase + { + [Inject] + protected IServiceProvider ServiceProvider { get; set; } + + protected SettingComponentCreationContext SettingComponentCreationContext { get; set; } + + [Inject] + protected IOptions _options { get; set; } + + protected SettingManagementComponentOptions Options => _options.Value; + + protected List SettingItemRenders { get; set; } = new List(); + + protected string SelectedGroup; + + protected override async Task OnInitializedAsync() + { + SettingComponentCreationContext = new SettingComponentCreationContext(ServiceProvider); + + foreach (var contributor in Options.Contributors) + { + await contributor.ConfigureAsync(SettingComponentCreationContext); + } + + SettingItemRenders.Clear(); + + SelectedGroup = GetNormalizedString(SettingComponentCreationContext.Groups.First().Id); + } + + protected string GetNormalizedString(string value) + { + return value.Replace('.', '_'); + } + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingComponentCreationContext.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingComponentCreationContext.cs new file mode 100644 index 0000000000..5898ace730 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingComponentCreationContext.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.SettingManagement.Blazor +{ + public class SettingComponentCreationContext : IServiceProviderAccessor + { + public IServiceProvider ServiceProvider { get; } + + public List Groups { get; } + + public SettingComponentCreationContext(IServiceProvider serviceProvider) + { + ServiceProvider = serviceProvider; + + Groups = new List(); + } + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingComponentGroup.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingComponentGroup.cs new file mode 100644 index 0000000000..22b59d83e1 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingComponentGroup.cs @@ -0,0 +1,39 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.Abp.SettingManagement.Blazor +{ + public class SettingComponentGroup + { + public string Id + { + get => _id; + set => _id = Check.NotNullOrWhiteSpace(value, nameof(Id)); + } + private string _id; + + public string DisplayName + { + get => _displayName; + set => _displayName = Check.NotNullOrWhiteSpace(value, nameof(DisplayName)); + } + private string _displayName; + + public Type ComponentType + { + get => _componentType; + set => _componentType = Check.NotNull(value, nameof(ComponentType)); + } + private Type _componentType; + + public object Parameter { get; set; } + + public SettingComponentGroup([NotNull] string id, [NotNull] string displayName, [NotNull] Type componentType, object parameter = null) + { + Id = id; + DisplayName = displayName; + ComponentType = componentType; + Parameter = parameter; + } + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingManagementBlazorAutoMapperProfile.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingManagementBlazorAutoMapperProfile.cs new file mode 100644 index 0000000000..94946a9889 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingManagementBlazorAutoMapperProfile.cs @@ -0,0 +1,12 @@ +using AutoMapper; + +namespace Volo.Abp.SettingManagement.Blazor +{ + public class SettingManagementBlazorAutoMapperProfile : Profile + { + public SettingManagementBlazorAutoMapperProfile() + { + + } + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingManagementComponentOptions.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingManagementComponentOptions.cs new file mode 100644 index 0000000000..e49fe4aa2d --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingManagementComponentOptions.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace Volo.Abp.SettingManagement.Blazor +{ + public class SettingManagementComponentOptions + { + public List Contributors { get; } + + public SettingManagementComponentOptions() + { + Contributors = new List(); + } + } +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.csproj new file mode 100644 index 0000000000..ea32179ddd --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Volo.Abp.SettingManagement.Blazor.csproj @@ -0,0 +1,20 @@ + + + + + + + netstandard2.1 + 3.0 + Volo.Abp.SettingManagement.Blazor + + + + + + + + + + + diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/_Imports.razor b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/_Imports.razor new file mode 100644 index 0000000000..4685ac9893 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/_Imports.razor @@ -0,0 +1,5 @@ +@using Microsoft.AspNetCore.Components.Web +@using Volo.Abp.AspNetCore.Components.WebAssembly +@using Volo.Abp.BlazoriseUI +@using Blazorise +@using Blazorise.DataGrid \ No newline at end of file