Browse Source

Merge branch 'dev' into adding-widget-to-editor

pull/13242/head
malik masis 4 years ago
parent
commit
90cb933564
  1. 18
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs
  2. 21
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/Navigation/SettingManagementMainMenuContributor.cs
  3. 4
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml
  4. 4
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/ISettingPageContributor.cs
  5. 29
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml
  6. 31
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs
  7. 24
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js
  8. 59
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageContributorBase.cs
  9. 99
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageContributorManager.cs
  10. 52
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/Settings/EmailingPageContributor.cs

18
modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs

@ -1,7 +1,5 @@
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.Localization;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared;
using Volo.Abp.AutoMapper; using Volo.Abp.AutoMapper;
using Volo.Abp.Http.ProxyScripting.Generators.JQuery; using Volo.Abp.Http.ProxyScripting.Generators.JQuery;
@ -29,7 +27,7 @@ public class AbpSettingManagementWebModule : AbpModule
{ {
options.AddAssemblyResource(typeof(AbpSettingManagementResource), typeof(AbpSettingManagementWebModule).Assembly); options.AddAssemblyResource(typeof(AbpSettingManagementResource), typeof(AbpSettingManagementWebModule).Assembly);
}); });
PreConfigure<IMvcBuilder>(mvcBuilder => PreConfigure<IMvcBuilder>(mvcBuilder =>
{ {
mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpSettingManagementWebModule).Assembly); mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpSettingManagementWebModule).Assembly);
@ -54,21 +52,11 @@ public class AbpSettingManagementWebModule : AbpModule
options.FileSets.AddEmbedded<AbpSettingManagementWebModule>(); options.FileSets.AddEmbedded<AbpSettingManagementWebModule>();
}); });
Configure<AbpBundlingOptions>(options =>
{
options.ScriptBundles
.Configure(typeof(IndexModel).FullName,
configuration =>
{
configuration.AddFiles("/Pages/SettingManagement/Components/EmailSettingGroup/Default.js");
});
});
Configure<DynamicJavaScriptProxyOptions>(options => Configure<DynamicJavaScriptProxyOptions>(options =>
{ {
options.DisableModule(SettingManagementRemoteServiceConsts.ModuleName); options.DisableModule(SettingManagementRemoteServiceConsts.ModuleName);
}); });
context.Services.AddAutoMapperObjectMapper<AbpSettingManagementWebModule>(); context.Services.AddAutoMapperObjectMapper<AbpSettingManagementWebModule>();
Configure<AbpAutoMapperOptions>(options => Configure<AbpAutoMapperOptions>(options =>
{ {

21
modules/setting-management/src/Volo.Abp.SettingManagement.Web/Navigation/SettingManagementMainMenuContributor.cs

@ -1,5 +1,4 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Features; using Volo.Abp.Features;
@ -25,10 +24,8 @@ public class SettingManagementMainMenuContributor : IMenuContributor
return; return;
} }
var settingManagementPageOptions = context.ServiceProvider.GetRequiredService<IOptions<SettingManagementPageOptions>>().Value; var settingPageContributorManager = context.ServiceProvider.GetRequiredService<SettingPageContributorManager>();
var settingPageCreationContext = new SettingPageCreationContext(context.ServiceProvider); if (!(await settingPageContributorManager.GetAvailableContributors()).Any())
if (!settingManagementPageOptions.Contributors.Any() ||
!(await CheckAnyOfPagePermissionsGranted(settingManagementPageOptions, settingPageCreationContext)))
{ {
return; return;
} }
@ -46,18 +43,4 @@ public class SettingManagementMainMenuContributor : IMenuContributor
).RequireFeatures(SettingManagementFeatures.Enable) ).RequireFeatures(SettingManagementFeatures.Enable)
); );
} }
protected virtual async Task<bool> CheckAnyOfPagePermissionsGranted(
SettingManagementPageOptions settingManagementPageOptions,
SettingPageCreationContext settingPageCreationContext)
{
foreach (var contributor in settingManagementPageOptions.Contributors)
{
if (await contributor.CheckPermissionsAsync(settingPageCreationContext))
{
return true;
}
}
return false;
}
} }

4
modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml

@ -6,6 +6,8 @@
@inject IPermissionChecker PermissionChecker @inject IPermissionChecker PermissionChecker
@model Volo.Abp.SettingManagement.Web.Pages.SettingManagement.Components.EmailSettingGroup.EmailSettingGroupViewComponent.UpdateEmailSettingsViewModel @model Volo.Abp.SettingManagement.Web.Pages.SettingManagement.Components.EmailSettingGroup.EmailSettingGroupViewComponent.UpdateEmailSettingsViewModel
<abp-script src="/Pages/SettingManagement/Components/EmailSettingGroup/Default.js" />
<form id="EmailSettingsForm" method="post"> <form id="EmailSettingsForm" method="post">
<abp-row> <abp-row>
<abp-column size-md="_12"> <abp-column size-md="_12">
@ -36,4 +38,4 @@
</div> </div>
</abp-column> </abp-column>
</abp-row> </abp-row>
</form> </form>

4
modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/ISettingPageContributor.cs

@ -1,4 +1,5 @@
using System.Threading.Tasks; using System;
using System.Threading.Tasks;
namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement; namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement;
@ -6,5 +7,6 @@ public interface ISettingPageContributor
{ {
Task ConfigureAsync(SettingPageCreationContext context); Task ConfigureAsync(SettingPageCreationContext context);
[Obsolete("Use SettingPageContributorBase as base class and call `RequiredPermissions` or `RequiredFeatures` for better performance.")]
Task<bool> CheckPermissionsAsync(SettingPageCreationContext context); Task<bool> CheckPermissionsAsync(SettingPageCreationContext context);
} }

29
modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml

@ -21,19 +21,24 @@
<div id="SettingManagementWrapper"> <div id="SettingManagementWrapper">
<abp-card> <abp-card>
<abp-card-body> <abp-card-body>
<abp-tabs tab-style="PillVertical" vertical-header-size="_3"> <div class="row">
@foreach (var group in Model.SettingPageCreationContext.Groups) <div class="col-md-3">
{ <ul class="nav flex-column nav-pills" id="tabs-nav" role="tablist">
<abp-tab title="@group.DisplayName"> @for (var i = 0; i < Model.SettingPageCreationContext.Groups.Count; i++)
<h2>@group.DisplayName</h2>
<hr class="my-4" />
@await Component.InvokeAsync(group.ComponentType, new
{ {
parameter = group.Parameter var group = Model.SettingPageCreationContext.Groups[i];
}) var active = i == 0 ? "active" : string.Empty;
</abp-tab> <li class="nav-item">
} <a class="nav-link @active" data-id="@group.Id" data-bs-toggle="pill" role="tab">@group.DisplayName</a>
</abp-tabs> </li>
}
</ul>
</div>
<div class="col-md-9">
<div class="tab-content" id="tab-content">
</div>
</div>
</div>
</abp-card-body> </abp-card-body>
</abp-card> </abp-card>
</div> </div>

31
modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs

@ -1,5 +1,5 @@
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
@ -13,25 +13,19 @@ public class IndexModel : AbpPageModel
{ {
public SettingPageCreationContext SettingPageCreationContext { get; private set; } public SettingPageCreationContext SettingPageCreationContext { get; private set; }
protected SettingPageContributorManager SettingPageContributorManager { get; }
protected ILocalEventBus LocalEventBus { get; } protected ILocalEventBus LocalEventBus { get; }
protected SettingManagementPageOptions Options { get; }
public IndexModel( public IndexModel(ILocalEventBus localEventBus, SettingPageContributorManager settingPageContributorManager)
IOptions<SettingManagementPageOptions> options,
ILocalEventBus localEventBus)
{ {
LocalEventBus = localEventBus; LocalEventBus = localEventBus;
Options = options.Value; SettingPageContributorManager = settingPageContributorManager;
} }
public virtual async Task<IActionResult> OnGetAsync() public virtual async Task<IActionResult> OnGetAsync()
{ {
SettingPageCreationContext = new SettingPageCreationContext(ServiceProvider); SettingPageCreationContext = await SettingPageContributorManager.ConfigureAsync();
foreach (var contributor in Options.Contributors)
{
await contributor.ConfigureAsync(SettingPageCreationContext);
}
return Page(); return Page();
} }
@ -41,6 +35,19 @@ public class IndexModel : AbpPageModel
return Task.FromResult<IActionResult>(Page()); return Task.FromResult<IActionResult>(Page());
} }
public virtual async Task<IActionResult> OnPostRenderViewAsync(string id)
{
var context = await SettingPageContributorManager.ConfigureAsync();
var view = context.Groups.FirstOrDefault(x => x.Id == id);
if (view != null)
{
return ViewComponent(view.ComponentType, view.Parameter);
}
return NoContent();
}
public virtual async Task<NoContentResult> OnPostRefreshConfigurationAsync() public virtual async Task<NoContentResult> OnPostRefreshConfigurationAsync()
{ {
await LocalEventBus.PublishAsync( await LocalEventBus.PublishAsync(

24
modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js

@ -1,6 +1,30 @@
(function ($) { (function ($) {
var l = abp.localization.getResource('AbpSettingManagement'); var l = abp.localization.getResource('AbpSettingManagement');
$('#tabs-nav .nav-item .nav-link').click(function () {
var _this = $(this);
if(_this.attr('data-bs-target') !== undefined) {
return;
}
var id = _this.data("id")
abp.ui.block({
elm: '#tab-content',
busy: true,
promise: abp.ajax({
type: 'POST',
url: 'SettingManagement?handler=RenderView&id=' + id,
dataType: "html",
contentType: false,
processData: false
}).done(function (response) {
$('#tab-content').children('.tab-pane').removeClass('show').removeClass('active');
_this.attr('data-bs-target', '#' + $.escapeSelector($.escapeSelector(id)));
$('#tab-content').append('<div id=' + $.escapeSelector(id) + ' class="tab-pane fade active show">' + response + '</div>');
})
});
}).first().click();
$(document).on('AbpSettingSaved', function () { $(document).on('AbpSettingSaved', function () {
abp.notify.success(l('SuccessfullySaved')); abp.notify.success(l('SuccessfullySaved'));

59
modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageContributorBase.cs

@ -0,0 +1,59 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement;
public abstract class SettingPageContributorBase : ISettingPageContributor
{
private readonly HashSet<string> _requiredPermissions;
private readonly HashSet<string> _requiredFeatures;
private readonly HashSet<string> _requiredTenantSideFeatures;
protected SettingPageContributorBase()
{
_requiredPermissions = new HashSet<string>();
_requiredFeatures = new HashSet<string>();
_requiredTenantSideFeatures = new HashSet<string>();
}
protected virtual SettingPageContributorBase RequiredPermissions(params string[] permissions)
{
Check.NotNullOrEmpty(permissions, nameof(permissions));
_requiredPermissions.AddIfNotContains(permissions);
return this;
}
public virtual IReadOnlySet<string> GetRequiredPermissions()
{
return _requiredPermissions;
}
protected virtual SettingPageContributorBase RequiredFeatures(params string[] features)
{
Check.NotNullOrEmpty(features, nameof(features));
_requiredFeatures.AddIfNotContains(features);
return this;
}
protected virtual SettingPageContributorBase RequiredTenantSideFeatures(params string[] features)
{
Check.NotNullOrEmpty(features, nameof(features));
_requiredTenantSideFeatures.AddIfNotContains(features);
return this;
}
public virtual IReadOnlySet<string> GetRequiredFeatures(MultiTenancySides? multiTenancySides = null)
{
return multiTenancySides == null || multiTenancySides != MultiTenancySides.Tenant
? _requiredFeatures
: _requiredTenantSideFeatures;
}
public abstract Task ConfigureAsync(SettingPageCreationContext context);
public virtual Task<bool> CheckPermissionsAsync(SettingPageCreationContext context)
{
return Task.FromResult(true);
}
}

99
modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageContributorManager.cs

@ -0,0 +1,99 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Features;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement;
public class SettingPageContributorManager : IScopedDependency
{
protected IServiceProvider ServiceProvider { get; }
protected ConcurrentDictionary<string, List<ISettingPageContributor>> CachedAvailableContributors { get; set; }
public SettingPageContributorManager(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
CachedAvailableContributors = new ConcurrentDictionary<string, List<ISettingPageContributor>>();
}
public virtual async Task<List<ISettingPageContributor>> GetAvailableContributors()
{
return CachedAvailableContributors.GetOrAdd(nameof(SettingPageContributorManager), await GetAvailableContributorsInternalAsync());
}
public virtual async Task<SettingPageCreationContext> ConfigureAsync()
{
var contributors = CachedAvailableContributors.GetOrAdd(nameof(SettingPageContributorManager), await GetAvailableContributorsInternalAsync());
var context = new SettingPageCreationContext(ServiceProvider);
foreach (var contributor in contributors)
{
await contributor.ConfigureAsync(context);
}
return context;
}
protected virtual async Task<List<ISettingPageContributor>> GetAvailableContributorsInternalAsync()
{
var contributors = ServiceProvider.GetRequiredService<IOptions<SettingManagementPageOptions>>().Value.Contributors;
var contributorBases = contributors.Where(x => x is SettingPageContributorBase).Cast<SettingPageContributorBase>().ToList();
var permissions = new HashSet<string>();
permissions.AddIfNotContains(contributorBases.SelectMany(x => x.GetRequiredPermissions()));
var featureChecker = ServiceProvider.GetRequiredService<IFeatureChecker>();
var permissionChecker = ServiceProvider.GetRequiredService<IPermissionChecker>();
var grantResult = await permissionChecker.IsGrantedAsync(permissions.ToArray());
var availableContributors = new List<ISettingPageContributor>();
foreach (var contributor in contributorBases)
{
var available = true;
var requiredFeatures = contributor.GetRequiredFeatures();
if (requiredFeatures.Any() && !await featureChecker.IsEnabledAsync(true, requiredFeatures.ToArray()))
{
available = false;
}
if (available)
{
var requiredTenantSideFeatures = contributor.GetRequiredFeatures(MultiTenancySides.Tenant);
if (requiredTenantSideFeatures.Any() && !await featureChecker.IsEnabledAsync(true, requiredTenantSideFeatures.ToArray()))
{
available = false;
}
}
if (available)
{
available = contributor.GetRequiredPermissions().All(x => grantResult.Result.ContainsKey(x) && grantResult.Result[x] == PermissionGrantResult.Granted);
}
if (available)
{
availableContributors.Add(contributor);
}
}
var context = new SettingPageCreationContext(ServiceProvider);
foreach (var contributor in contributors.Where(x => x is not SettingPageContributorBase))
{
#pragma warning disable CS0618
if (await contributor.CheckPermissionsAsync(context))
#pragma warning restore CS0618
{
availableContributors.Add(contributor);
}
}
return availableContributors;
}
}

52
modules/setting-management/src/Volo.Abp.SettingManagement.Web/Settings/EmailingPageContributor.cs

@ -1,24 +1,22 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using Volo.Abp.Features;
using Volo.Abp.MultiTenancy;
using Volo.Abp.SettingManagement.Localization; using Volo.Abp.SettingManagement.Localization;
using Volo.Abp.SettingManagement.Web.Pages.SettingManagement; using Volo.Abp.SettingManagement.Web.Pages.SettingManagement;
using Volo.Abp.SettingManagement.Web.Pages.SettingManagement.Components.EmailSettingGroup; using Volo.Abp.SettingManagement.Web.Pages.SettingManagement.Components.EmailSettingGroup;
namespace Volo.Abp.SettingManagement.Web.Settings; namespace Volo.Abp.SettingManagement.Web.Settings;
public class EmailingPageContributor : ISettingPageContributor public class EmailingPageContributor : SettingPageContributorBase
{ {
public async Task ConfigureAsync(SettingPageCreationContext context) public EmailingPageContributor()
{
RequiredFeatures(SettingManagementFeatures.Enable);
RequiredTenantSideFeatures(SettingManagementFeatures.AllowTenantsToChangeEmailSettings);
RequiredPermissions(SettingManagementPermissions.Emailing);
}
public override Task ConfigureAsync(SettingPageCreationContext context)
{ {
if (!await CheckPermissionsInternalAsync(context))
{
return;
}
var l = context.ServiceProvider.GetRequiredService<IStringLocalizer<AbpSettingManagementResource>>(); var l = context.ServiceProvider.GetRequiredService<IStringLocalizer<AbpSettingManagementResource>>();
context.Groups.Add( context.Groups.Add(
new SettingPageGroup( new SettingPageGroup(
@ -27,38 +25,6 @@ public class EmailingPageContributor : ISettingPageContributor
typeof(EmailSettingGroupViewComponent) typeof(EmailSettingGroupViewComponent)
) )
); );
} return Task.CompletedTask;
public async Task<bool> CheckPermissionsAsync(SettingPageCreationContext context)
{
return await CheckPermissionsInternalAsync(context);
}
private async Task<bool> CheckPermissionsInternalAsync(SettingPageCreationContext context)
{
if (!await CheckFeatureAsync(context))
{
return false;
}
var authorizationService = context.ServiceProvider.GetRequiredService<IAuthorizationService>();
return await authorizationService.IsGrantedAsync(SettingManagementPermissions.Emailing);
}
private async Task<bool> CheckFeatureAsync(SettingPageCreationContext context)
{
var featureCheck = context.ServiceProvider.GetRequiredService<IFeatureChecker>();
if (!await featureCheck.IsEnabledAsync(SettingManagementFeatures.Enable))
{
return false;
}
if (context.ServiceProvider.GetRequiredService<ICurrentTenant>().IsAvailable)
{
return await featureCheck.IsEnabledAsync(SettingManagementFeatures.AllowTenantsToChangeEmailSettings);
}
return true;
} }
} }

Loading…
Cancel
Save