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..b8b6c33d7c --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs @@ -0,0 +1,93 @@ +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) + { + await CheckProviderPolicy(providerName); + + 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) + { + await CheckProviderPolicy(providerName); + + 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); + } + } + } + + protected virtual async Task CheckProviderPolicy(string providerName) + { + var policyName = Options.ProviderPolicies.GetOrDefault(providerName); + if (policyName.IsNullOrEmpty()) + { + throw new AbpException($"No policy defined to get/set permissions for the provider '{policyName}'. Use {nameof(FeatureManagementOptions)} to map the policy."); + } + + await AuthorizationService.CheckAsync(policyName); + } + } +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs index 515db2b03f..54f5364c18 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs @@ -21,7 +21,6 @@ namespace Volo.Abp.FeatureManagement { options.Providers.Add(); options.Providers.Add(); - options.Providers.Add(); }); Configure(options => diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementOptions.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementOptions.cs index 0599c3e4c5..b671c475ec 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementOptions.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementOptions.cs @@ -1,4 +1,5 @@ -using Volo.Abp.Collections; +using System.Collections.Generic; +using Volo.Abp.Collections; namespace Volo.Abp.FeatureManagement { @@ -6,9 +7,12 @@ namespace Volo.Abp.FeatureManagement { public ITypeList Providers { get; } + public Dictionary ProviderPolicies { get; } + public FeatureManagementOptions() { Providers = new TypeList(); + ProviderPolicies = new Dictionary(); } } } \ No newline at end of file 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/Volo.Abp.TenantManagement.sln b/modules/tenant-management/Volo.Abp.TenantManagement.sln index 20fd21a531..9e1f76c980 100644 --- a/modules/tenant-management/Volo.Abp.TenantManagement.sln +++ b/modules/tenant-management/Volo.Abp.TenantManagement.sln @@ -25,14 +25,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.TenantManagement.W EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.TenantManagement.Application.Tests", "test\Volo.Abp.TenantManagement.Application.Tests\Volo.Abp.TenantManagement.Application.Tests.csproj", "{72445B2D-07FA-4A35-A3D6-FF4ACE299BF4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.TenantManagement.EntityFrameworkCore.Tests", "test\Volo.Abp.TenantManagement.EntityFrameworkCore.Tests\Volo.Abp.TenantManagement.EntityFrameworkCore.Tests.csproj", "{A2BB8897-EBDB-46BB-B885-F8635B21F376}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.TenantManagement.EntityFrameworkCore.Tests", "test\Volo.Abp.TenantManagement.EntityFrameworkCore.Tests\Volo.Abp.TenantManagement.EntityFrameworkCore.Tests.csproj", "{A2BB8897-EBDB-46BB-B885-F8635B21F376}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.TenantManagement.MongoDB", "src\Volo.Abp.TenantManagement.MongoDB\Volo.Abp.TenantManagement.MongoDB.csproj", "{ED95242E-3C31-4A89-9C62-93B306EFEB15}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.TenantManagement.MongoDB", "src\Volo.Abp.TenantManagement.MongoDB\Volo.Abp.TenantManagement.MongoDB.csproj", "{ED95242E-3C31-4A89-9C62-93B306EFEB15}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.TenantManagement.MongoDB.Tests", "test\Volo.Abp.TenantManagement.MongoDB.Tests\Volo.Abp.TenantManagement.MongoDB.Tests.csproj", "{F75B4C54-A5F1-4101-99F5-A5B868A5146B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.TenantManagement.MongoDB.Tests", "test\Volo.Abp.TenantManagement.MongoDB.Tests\Volo.Abp.TenantManagement.MongoDB.Tests.csproj", "{F75B4C54-A5F1-4101-99F5-A5B868A5146B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.TenantManagement.TestBase", "test\Volo.Abp.TenantManagement.TestBase\Volo.Abp.TenantManagement.TestBase.csproj", "{C3BAD6E8-00CD-4283-9416-64287BB5B265}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.FeatureManagement.Domain.TenantManagement", "src\Volo.Abp.FeatureManagement.Domain.TenantManagement\Volo.Abp.FeatureManagement.Domain.TenantManagement.csproj", "{7A5E7998-62CF-418B-A452-0FCB4CB853CC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -91,6 +93,10 @@ Global {C3BAD6E8-00CD-4283-9416-64287BB5B265}.Debug|Any CPU.Build.0 = Debug|Any CPU {C3BAD6E8-00CD-4283-9416-64287BB5B265}.Release|Any CPU.ActiveCfg = Release|Any CPU {C3BAD6E8-00CD-4283-9416-64287BB5B265}.Release|Any CPU.Build.0 = Release|Any CPU + {7A5E7998-62CF-418B-A452-0FCB4CB853CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A5E7998-62CF-418B-A452-0FCB4CB853CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A5E7998-62CF-418B-A452-0FCB4CB853CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A5E7998-62CF-418B-A452-0FCB4CB853CC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -109,6 +115,7 @@ Global {ED95242E-3C31-4A89-9C62-93B306EFEB15} = {799CA525-4748-421A-9892-05C68BB2FA13} {F75B4C54-A5F1-4101-99F5-A5B868A5146B} = {C6941869-A9FC-4BEA-AD3F-C1E104826ECA} {C3BAD6E8-00CD-4283-9416-64287BB5B265} = {C6941869-A9FC-4BEA-AD3F-C1E104826ECA} + {7A5E7998-62CF-418B-A452-0FCB4CB853CC} = {799CA525-4748-421A-9892-05C68BB2FA13} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {7C258726-2CE0-44D3-A2D7-71812E8F505C} diff --git a/modules/tenant-management/src/Volo.Abp.FeatureManagement.Domain.TenantManagement/Volo.Abp.FeatureManagement.Domain.TenantManagement.csproj b/modules/tenant-management/src/Volo.Abp.FeatureManagement.Domain.TenantManagement/Volo.Abp.FeatureManagement.Domain.TenantManagement.csproj new file mode 100644 index 0000000000..94c6905fec --- /dev/null +++ b/modules/tenant-management/src/Volo.Abp.FeatureManagement.Domain.TenantManagement/Volo.Abp.FeatureManagement.Domain.TenantManagement.csproj @@ -0,0 +1,12 @@ + + + + netcoreapp2.2 + + + + + + + + diff --git a/modules/tenant-management/src/Volo.Abp.FeatureManagement.Domain.TenantManagement/Volo/Abp/FeatureManagement/TenantManagement/AbpFeatureManagementDomainTenantManagementModule.cs b/modules/tenant-management/src/Volo.Abp.FeatureManagement.Domain.TenantManagement/Volo/Abp/FeatureManagement/TenantManagement/AbpFeatureManagementDomainTenantManagementModule.cs new file mode 100644 index 0000000000..ac698c913c --- /dev/null +++ b/modules/tenant-management/src/Volo.Abp.FeatureManagement.Domain.TenantManagement/Volo/Abp/FeatureManagement/TenantManagement/AbpFeatureManagementDomainTenantManagementModule.cs @@ -0,0 +1,18 @@ +using Volo.Abp.Features; +using Volo.Abp.Modularity; + +namespace Volo.Abp.FeatureManagement.TenantManagement +{ + public class AbpFeatureManagementDomainTenantManagementModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Providers.Add(); + + options.ProviderPolicies[TenantFeatureValueProvider.ProviderName] = "AbpTenantManagement.Tenants.ManageFeatures"; + }); + } + } +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/TenantFeatureManagementProvider.cs b/modules/tenant-management/src/Volo.Abp.FeatureManagement.Domain.TenantManagement/Volo/Abp/FeatureManagement/TenantManagement/TenantFeatureManagementProvider.cs similarity index 94% rename from modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/TenantFeatureManagementProvider.cs rename to modules/tenant-management/src/Volo.Abp.FeatureManagement.Domain.TenantManagement/Volo/Abp/FeatureManagement/TenantManagement/TenantFeatureManagementProvider.cs index b03fc43d8a..e625e47880 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/TenantFeatureManagementProvider.cs +++ b/modules/tenant-management/src/Volo.Abp.FeatureManagement.Domain.TenantManagement/Volo/Abp/FeatureManagement/TenantManagement/TenantFeatureManagementProvider.cs @@ -11,7 +11,7 @@ namespace Volo.Abp.FeatureManagement protected ICurrentTenant CurrentTenant { get; } public TenantFeatureManagementProvider( - IFeatureManagementStore store, + IFeatureManagementStore store, ICurrentTenant currentTenant) : base(store) { 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.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementPermissionDefinitionProvider.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementPermissionDefinitionProvider.cs index 822de19ad8..32aae64598 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementPermissionDefinitionProvider.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementPermissionDefinitionProvider.cs @@ -8,12 +8,13 @@ namespace Volo.Abp.TenantManagement { public override void Define(IPermissionDefinitionContext context) { - var identityGroup = context.AddGroup(TenantManagementPermissions.GroupName, L("Permission:TenantManagement")); + var tenantManagementGroup = context.AddGroup(TenantManagementPermissions.GroupName, L("Permission:TenantManagement")); - var rolesPermission = identityGroup.AddPermission(TenantManagementPermissions.Tenants.Default, L("Permission:TenantManagement")); - rolesPermission.AddChild(TenantManagementPermissions.Tenants.Create, L("Permission:Create")); - rolesPermission.AddChild(TenantManagementPermissions.Tenants.Update, L("Permission:Edit")); - rolesPermission.AddChild(TenantManagementPermissions.Tenants.Delete, L("Permission:Delete")); + var tenantsPermission = tenantManagementGroup.AddPermission(TenantManagementPermissions.Tenants.Default, L("Permission:TenantManagement")); + tenantsPermission.AddChild(TenantManagementPermissions.Tenants.Create, L("Permission:Create")); + tenantsPermission.AddChild(TenantManagementPermissions.Tenants.Update, L("Permission:Edit")); + tenantsPermission.AddChild(TenantManagementPermissions.Tenants.Delete, L("Permission:Delete")); + tenantsPermission.AddChild(TenantManagementPermissions.Tenants.ManageFeatures, L("Permission:ManageFeatures")); } private static LocalizableString L(string name) diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/Localization/ApplicationContracts/en.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/Localization/ApplicationContracts/en.json index 92a555e5a7..c153af5e10 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/Localization/ApplicationContracts/en.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/Localization/ApplicationContracts/en.json @@ -4,6 +4,7 @@ "Permission:TenantManagement": "Tenant management", "Permission:Create": "Create", "Permission:Edit": "Edit", - "Permission:Delete": "Delete" + "Permission:Delete": "Delete", + "Permission:ManageFeatures": "Manage features" } } \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/Localization/ApplicationContracts/tr.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/Localization/ApplicationContracts/tr.json index a192048e78..8ff9d2c2d5 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/Localization/ApplicationContracts/tr.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/Localization/ApplicationContracts/tr.json @@ -4,6 +4,7 @@ "Permission:TenantManagement": "Müşteri yönetimi", "Permission:Create": "Oluşturma", "Permission:Edit": "Düzenleme", - "Permission:Delete": "Silme" + "Permission:Delete": "Silme", + "Permission:ManageFeatures": "Özellikleri yönet" } } \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantManagementPermissions.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantManagementPermissions.cs index bc30e65e1f..622c52d338 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantManagementPermissions.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantManagementPermissions.cs @@ -10,6 +10,7 @@ public const string Create = Default + ".Create"; public const string Update = Default + ".Update"; public const string Delete = Default + ".Delete"; + public const string ManageFeatures = Default + ".ManageFeatures"; } } } \ No newline at end of file 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