From 8a28f5e3031dc3c96d5f99c2827323cef859b461 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 22 Mar 2019 15:59:00 +0300 Subject: [PATCH] created feature-management modal & added to tenant management --- .../Volo/Abp/FeatureManagement/FeatureDto.cs | 20 +++++ .../Abp/FeatureManagement/FeatureListDto.cs | 9 +++ .../FeatureManagement/IFeatureAppService.cs | 16 ++++ .../Abp/FeatureManagement/UpdateFeatureDto.cs | 13 ++++ .../FeatureManagement/UpdateFeaturesDto.cs | 9 +++ .../FeatureManagement/FeatureAppService.cs | 78 +++++++++++++++++++ .../FeatureManagementModal.cshtml | 60 ++++++++++++++ .../FeatureManagementModal.cshtml.cs | 75 ++++++++++++++++++ .../feature-management-modal.js | 17 ++++ .../Volo.Abp.FeatureManagement.Web.csproj | 14 ++-- ...antManagement.Application.Contracts.csproj | 3 +- ...antManagementApplicationContractsModule.cs | 2 + ...lo.Abp.TenantManagement.Application.csproj | 5 +- .../AbpTenantManagementApplicationModule.cs | 2 + .../AbpTenantManagementWebModule.cs | 2 + .../TenantManagement/Tenants/Index.cshtml | 5 +- .../Volo.Abp.TenantManagement.Web.csproj | 2 +- .../multi-tenancy/views/tenants/index.js | 13 ++++ 18 files changed, 332 insertions(+), 13 deletions(-) create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureDto.cs create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureListDto.cs create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/UpdateFeatureDto.cs create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/UpdateFeaturesDto.cs create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureDto.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureDto.cs new file mode 100644 index 0000000000..75f5722ee8 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureDto.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using Volo.Abp.Validation.StringValues; + +namespace Volo.Abp.FeatureManagement +{ + public class FeatureDto + { + public string Name { get; set; } + + public string Value { get; set; } + + public string Description { get; set; } + + public IStringValueType ValueType { get; set; } + + public int Depth { get; set; } + + public string ParentName { get; set; } + } +} \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureListDto.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureListDto.cs new file mode 100644 index 0000000000..ee7bad8d5c --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureListDto.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Volo.Abp.FeatureManagement +{ + public class FeatureListDto + { + public List Features { get; set; } + } +} \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs new file mode 100644 index 0000000000..a30b2397fa --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Volo.Abp.Application.Services; + +namespace Volo.Abp.FeatureManagement +{ + public interface IFeatureAppService : IApplicationService + { + Task GetAsync([NotNull] string providerName, [NotNull] string providerKey); + + Task UpdateAsync([NotNull] string providerName, [NotNull] string providerKey, UpdateFeaturesDto input); + } +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/UpdateFeatureDto.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/UpdateFeatureDto.cs new file mode 100644 index 0000000000..26b351ee9e --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/UpdateFeatureDto.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Volo.Abp.FeatureManagement +{ + public class UpdateFeatureDto + { + public string Name { get; set; } + + public string Value { get; set; } + } +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/UpdateFeaturesDto.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/UpdateFeaturesDto.cs new file mode 100644 index 0000000000..3b8fbd2bd7 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/UpdateFeaturesDto.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Volo.Abp.FeatureManagement +{ + public class UpdateFeaturesDto + { + public List Features { get; set; } + } +} \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs new file mode 100644 index 0000000000..555ddbf495 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Options; +using Volo.Abp.Application.Services; +using Volo.Abp.Features; + +namespace Volo.Abp.FeatureManagement +{ + [Authorize] + public class FeatureAppService : ApplicationService, IFeatureAppService + { + protected FeatureManagementOptions Options { get; } + + private readonly IFeatureManager _featureManager; + private readonly IFeatureDefinitionManager _featureDefinitionManager; + private readonly IStringLocalizerFactory _stringLocalizerFactory; + + public FeatureAppService(IFeatureManager featureManager, + IFeatureDefinitionManager featureDefinitionManager, + IStringLocalizerFactory stringLocalizerFactory, + IOptions options) + { + _featureManager = featureManager; + _featureDefinitionManager = featureDefinitionManager; + _stringLocalizerFactory = stringLocalizerFactory; + Options = options.Value; + } + + public async Task GetAsync([NotNull] string providerName, [NotNull] string providerKey) + { + var featureDefinitions = _featureDefinitionManager.GetAll(); + var features = new List(); + + foreach (var featureDefinition in featureDefinitions) + { + features.Add(new FeatureDto + { + Name = featureDefinition.Name, + ValueType = featureDefinition.ValueType, + Description = featureDefinition.Description.Localize(_stringLocalizerFactory), + ParentName = featureDefinition.Parent?.Name, + Value = await _featureManager.GetOrNullAsync(featureDefinition.Name, providerName, providerKey) + }); + } + + SetFeatureDepth(features, providerName, providerKey); + + return new FeatureListDto { Features = features }; + } + + public async Task UpdateAsync([NotNull] string providerName, [NotNull] string providerKey, UpdateFeaturesDto input) + { + foreach (var feature in input.Features) + { + await _featureManager.SetAsync(feature.Name, feature.Value, providerName, providerKey); + } + } + + private void SetFeatureDepth(List features, string providerName, string providerKey, + FeatureDto parentFeature = null, int depth = 0) + { + foreach (var feature in features) + { + if ((parentFeature == null && feature.ParentName == null) || (parentFeature != null && parentFeature.Name == feature.ParentName)) + { + feature.Depth = depth; + SetFeatureDepth(features, providerName, providerKey, feature, depth + 1); + } + } + } + } +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml new file mode 100644 index 0000000000..b52ea264b4 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml @@ -0,0 +1,60 @@ +@page +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@using Volo.Abp.FeatureManagement.Localization +@using Volo.Abp.Validation.StringValues +@using Volo.Abp.FeatureManagement.Web.Pages.FeatureManagement +@model FeatureManagementModal +@inject IHtmlLocalizer L +@{ + Layout = null; +} +
+ + + + + + @for (var i = 0; i < Model.FeatureListDto.Features.Count; i++) + { + var feature = Model.FeatureListDto.Features[i]; +
+ + @feature.Name + + + @if (feature.ValueType is FreeTextStringValueType) + { + + + } + @if (feature.ValueType is SelectionStringValueType) + { + + + } + @if (feature.ValueType is ToggleStringValueType) + { + + + } +
+ } +
+ +
+
+ diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs new file mode 100644 index 0000000000..23e46de955 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs @@ -0,0 +1,75 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; +using Volo.Abp.Validation.StringValues; + +namespace Volo.Abp.FeatureManagement.Web.Pages.FeatureManagement +{ + public class FeatureManagementModal : AbpPageModel + { + [Required] + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ProviderName { get; set; } + + [Required] + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ProviderKey { get; set; } + + [BindProperty] + public List Features { get; set; } + + public FeatureListDto FeatureListDto { get; set; } + + private readonly IFeatureAppService _featureAppService; + + public FeatureManagementModal(IFeatureAppService featureAppService) + { + _featureAppService = featureAppService; + } + + public async Task OnGetAsync() + { + FeatureListDto = await _featureAppService.GetAsync(ProviderName, ProviderKey); + } + + public async Task OnPostAsync() + { + var features = new UpdateFeaturesDto + { + Features = Features.Select(f => new UpdateFeatureDto + { + Name = f.Name, + Value = f.Type == nameof(ToggleStringValueType) ? f.BoolValue.ToString() : f.Value + }).ToList() + }; + + await _featureAppService.UpdateAsync(ProviderName, ProviderKey, features); + + return NoContent(); + } + + + public class ProviderInfoViewModel + { + public string ProviderName { get; set; } + + public string ProviderKey { get; set; } + } + + public class FeatureViewModel + { + public string Name { get; set; } + + public string Value { get; set; } + + public bool BoolValue { get; set; } + + public string Type { get; set; } + } + } +} \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js new file mode 100644 index 0000000000..74b66f467d --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js @@ -0,0 +1,17 @@ +var abp = abp || {}; +(function ($) { + abp.modals = abp.modals || {}; + + abp.modals.FeatureManagement = function () { + + $('.FeatureValueCheckbox').change(function () { + if (this.checked) { + $(this).val("true"); + } + else { + $(this).val("false"); + } + }); + + }; +})(jQuery); \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj index 3175e1143a..ffe9acd932 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj @@ -11,19 +11,17 @@ - - + + + - - - - + + - - + diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo.Abp.TenantManagement.Application.Contracts.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo.Abp.TenantManagement.Application.Contracts.csproj index 393c22258c..1371026493 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo.Abp.TenantManagement.Application.Contracts.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo.Abp.TenantManagement.Application.Contracts.csproj @@ -1,4 +1,4 @@ - + @@ -15,6 +15,7 @@ + diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementApplicationContractsModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementApplicationContractsModule.cs index 50c6aae024..d7f572aaf1 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementApplicationContractsModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementApplicationContractsModule.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Application; using Volo.Abp.Authorization.Permissions; +using Volo.Abp.FeatureManagement; using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.TenantManagement.Localization; @@ -10,6 +11,7 @@ namespace Volo.Abp.TenantManagement { [DependsOn(typeof(AbpDddApplicationModule))] [DependsOn(typeof(AbpTenantManagementDomainSharedModule))] + [DependsOn(typeof(AbpFeatureManagementApplicationContractsModule))] public class AbpTenantManagementApplicationContractsModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.csproj index e8e0d54a9e..32b8394e2e 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.csproj @@ -1,4 +1,4 @@ - + @@ -16,8 +16,9 @@ - + + diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/AbpTenantManagementApplicationModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/AbpTenantManagementApplicationModule.cs index ab00b0dc80..1dbba9efd0 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/AbpTenantManagementApplicationModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/AbpTenantManagementApplicationModule.cs @@ -1,11 +1,13 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AutoMapper; +using Volo.Abp.FeatureManagement; using Volo.Abp.Modularity; namespace Volo.Abp.TenantManagement { [DependsOn(typeof(AbpTenantManagementDomainModule))] [DependsOn(typeof(AbpTenantManagementApplicationContractsModule))] + [DependsOn(typeof(AbpFeatureManagementApplicationModule))] public class AbpTenantManagementApplicationModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs index 2267539b09..8ea03c99f3 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AutoMapper; +using Volo.Abp.FeatureManagement; using Volo.Abp.Localization; using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; @@ -16,6 +17,7 @@ namespace Volo.Abp.TenantManagement.Web { [DependsOn(typeof(AbpTenantManagementHttpApiModule))] [DependsOn(typeof(AbpAspNetCoreMvcUiBootstrapModule))] + [DependsOn(typeof(AbpFeatureManagementWebModule))] [DependsOn(typeof(AbpAutoMapperModule))] public class AbpTenantManagementWebModule : AbpModule { diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml index a5a7bf4a90..95cd3d8331 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml @@ -13,7 +13,10 @@ PageLayout.Content.MenuItemName = TenantManagementMenuNames.Tenants; } @section scripts { - + + + + } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj index 94071ed59e..c542768e8c 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj @@ -29,8 +29,8 @@ + - diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/wwwroot/modules/multi-tenancy/views/tenants/index.js b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/wwwroot/modules/multi-tenancy/views/tenants/index.js index bfb44f0bcc..344cc1963d 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/wwwroot/modules/multi-tenancy/views/tenants/index.js +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/wwwroot/modules/multi-tenancy/views/tenants/index.js @@ -5,6 +5,7 @@ var _editModal = new abp.ModalManager(abp.appPath + 'TenantManagement/Tenants/EditModal'); var _createModal = new abp.ModalManager(abp.appPath + 'TenantManagement/Tenants/CreateModal'); + var _featuresModal = new abp.ModalManager(abp.appPath + 'FeatureManagement/FeatureManagementModal'); $(function () { @@ -27,6 +28,18 @@ }); } }, + { + text: l('Features'), + visible: function () { + return true; //TODO: Check permission + }, + action: function (data) { + _featuresModal.open({ + providerName: 'Tenant', + providerKey: data.record.id + }); + } + }, { text: l('Delete'), visible: function () { return true; }, //TODO: Check permission