Browse Source

Merge branch 'dev' into pr/10053

pull/10053/head
maliming 5 years ago
parent
commit
e88452ab29
  1. 46
      docs/en/Community-Articles/2020-08-07-Passwordless-Authentication/POST.md
  2. 6
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/SweetAlert2/Sweetalert2ScriptContributor.cs
  3. 8
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs
  4. 24
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js
  5. 4
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs
  6. 7
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Response/AbpNoContentActionFilter.cs
  7. 0
      framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/EntityChangeType.cs
  8. 8
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
  9. 10
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs
  10. 4
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueConverters/ExtraPropertiesValueConverter.cs
  11. 4
      framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs
  12. 8
      framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs
  13. 20
      framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithSoftDelete.cs
  14. 8
      framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs
  15. 22
      framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs
  16. 2
      modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Dockerfile
  17. 3
      modules/blogging/app/Volo.BloggingTestApp/BloggingTestAppModule.cs
  18. 3
      modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj
  19. 3123
      modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/sweetalert2/sweetalert2.all.js
  20. 2
      modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/sweetalert2/sweetalert2.all.min.js
  21. 1319
      modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/sweetalert2/sweetalert2.css
  22. 3121
      modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/sweetalert2/sweetalert2.js
  23. 1
      modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/sweetalert2/sweetalert2.min.css
  24. 1
      modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/sweetalert2/sweetalert2.min.js
  25. 5
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/_ViewStart.cshtml
  26. 1
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo.Abp.FeatureManagement.Application.Contracts.csproj
  27. 4
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsModule.cs
  28. 25
      modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/AllowTenantsToChangeEmailSettingsFeatureSimpleStateChecker.cs
  29. 6
      modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/SettingManagementPermissionDefinitionProvider.cs
  30. 62
      modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/EmailSettingsAppService.cs
  31. 22
      modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Settings/EmailingPageContributor.cs
  32. 4
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json
  33. 4
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json
  34. 13
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs
  35. 2
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatures.cs
  36. 10
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/TenantSettingManagerExtensions.cs
  37. 22
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/Settings/EmailingPageContributor.cs
  38. 7
      npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts
  39. 6
      npm/ng-packs/packages/core/src/lib/utils/environment-utils.ts
  40. 5
      npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html
  41. 2
      npm/packs/aspnetcore.mvc.ui.theme.shared/package.json
  42. 5
      npm/packs/sweetalert/abp.resourcemapping.js
  43. 5
      npm/packs/sweetalert2/abp.resourcemapping.js
  44. 4
      npm/packs/sweetalert2/package.json
  45. 3123
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/wwwroot/libs/sweetalert2/sweetalert2.all.js
  46. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/wwwroot/libs/sweetalert2/sweetalert2.all.min.js
  47. 1319
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/wwwroot/libs/sweetalert2/sweetalert2.css
  48. 3121
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/wwwroot/libs/sweetalert2/sweetalert2.js
  49. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/wwwroot/libs/sweetalert2/sweetalert2.min.css
  50. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/wwwroot/libs/sweetalert2/sweetalert2.min.js
  51. 3123
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/wwwroot/libs/sweetalert2/sweetalert2.all.js
  52. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/wwwroot/libs/sweetalert2/sweetalert2.all.min.js
  53. 1319
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/wwwroot/libs/sweetalert2/sweetalert2.css
  54. 3121
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/wwwroot/libs/sweetalert2/sweetalert2.js
  55. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/wwwroot/libs/sweetalert2/sweetalert2.min.css
  56. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/wwwroot/libs/sweetalert2/sweetalert2.min.js
  57. 3123
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/wwwroot/libs/sweetalert2/sweetalert2.all.js
  58. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/wwwroot/libs/sweetalert2/sweetalert2.all.min.js
  59. 1319
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/wwwroot/libs/sweetalert2/sweetalert2.css
  60. 3121
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/wwwroot/libs/sweetalert2/sweetalert2.js
  61. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/wwwroot/libs/sweetalert2/sweetalert2.min.css
  62. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/wwwroot/libs/sweetalert2/sweetalert2.min.js
  63. 3123
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.all.js
  64. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.all.min.js
  65. 1319
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.css
  66. 3121
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.js
  67. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.min.css
  68. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.min.js
  69. 3123
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.all.js
  70. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.all.min.js
  71. 1319
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.css
  72. 3121
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.js
  73. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.min.css
  74. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.min.js
  75. 3123
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/wwwroot/libs/sweetalert2/sweetalert2.all.js
  76. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/wwwroot/libs/sweetalert2/sweetalert2.all.min.js
  77. 1319
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/wwwroot/libs/sweetalert2/sweetalert2.css
  78. 3121
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/wwwroot/libs/sweetalert2/sweetalert2.js
  79. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/wwwroot/libs/sweetalert2/sweetalert2.min.css
  80. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/wwwroot/libs/sweetalert2/sweetalert2.min.js
  81. 3123
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/wwwroot/libs/sweetalert2/sweetalert2.all.js
  82. 2
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/wwwroot/libs/sweetalert2/sweetalert2.all.min.js
  83. 1319
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/wwwroot/libs/sweetalert2/sweetalert2.css
  84. 3121
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/wwwroot/libs/sweetalert2/sweetalert2.js
  85. 1
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/wwwroot/libs/sweetalert2/sweetalert2.min.css
  86. 1
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/wwwroot/libs/sweetalert2/sweetalert2.min.js
  87. 3123
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.all.js
  88. 2
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.all.min.js
  89. 1319
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.css
  90. 3121
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.js
  91. 1
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.min.css
  92. 1
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.min.js
  93. 3123
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.all.js
  94. 2
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.all.min.js
  95. 1319
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.css
  96. 3121
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.js
  97. 1
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.min.css
  98. 1
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.min.js
  99. 3123
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/wwwroot/libs/sweetalert2/sweetalert2.all.js
  100. 2
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

46
docs/en/Community-Articles/2020-08-07-Passwordless-Authentication/POST.md

@ -194,16 +194,11 @@ We implemented token generation infrastructure, now it's time validate the token
```csharp
using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Identity;
using Volo.Abp.Security.Claims;
using Volo.Abp.Users;
using Volo.Abp.Identity.AspNetCore;
namespace PasswordlessAuthentication.Web.Controllers
{
@ -211,9 +206,12 @@ namespace PasswordlessAuthentication.Web.Controllers
{
protected IdentityUserManager UserManager { get; }
public PasswordlessController(IdentityUserManager userManager)
protected AbpSignInManager SignInManager { get; }
public PasswordlessController(IdentityUserManager userManager, AbpSignInManager signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
public virtual async Task<IActionResult> Login(string token, string userId)
@ -228,45 +226,15 @@ namespace PasswordlessAuthentication.Web.Controllers
await UserManager.UpdateSecurityStampAsync(user);
var roles = await UserManager.GetRolesAsync(user);
var principal = new ClaimsPrincipal(
new ClaimsIdentity(CreateClaims(user, roles), IdentityConstants.ApplicationScheme)
);
await HttpContext.SignInAsync(IdentityConstants.ApplicationScheme, principal);
await SignInManager.SignInAsync(user, isPersistent: false);
return Redirect("/");
}
private static IEnumerable<Claim> CreateClaims(IUser user, IEnumerable<string> roles)
{
var claims = new List<Claim>
{
new Claim("sub", user.Id.ToString()),
new Claim(AbpClaimTypes.UserId, user.Id.ToString()),
new Claim(AbpClaimTypes.Email, user.Email),
new Claim(AbpClaimTypes.UserName, user.UserName),
new Claim(AbpClaimTypes.EmailVerified, user.EmailConfirmed.ToString().ToLower()),
};
if (!string.IsNullOrWhiteSpace(user.PhoneNumber))
{
claims.Add(new Claim(AbpClaimTypes.PhoneNumber, user.PhoneNumber));
}
foreach (var role in roles)
{
claims.Add(new Claim(AbpClaimTypes.Role, role));
}
return claims;
}
}
}
```
We created an endpoint for `/Passwordless/Login` that gets the token and the user Id. In this action, we find the user via repository and validate the token via `UserManager.VerifyUserTokenAsync()` method. If it's valid, we create claims of the user then call `HttpContext.SignInAsync` to be able to create an encrypted cookie and add it to the current response. Finally we redirect the page to the root URL.
We created an endpoint for `/Passwordless/Login` that gets the token and the user Id. In this action, we find the user via repository and validate the token via `UserManager.VerifyUserTokenAsync()` method. If it's valid, we call `SignInManager.SignInAsync` to be able to create an encrypted cookie and add it to the current response. Finally we redirect the page to the root URL.
That's all! We created a passwordless login with 7 steps.

6
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/SweetAlert/SweetalertScriptContributor.cs → framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/SweetAlert2/Sweetalert2ScriptContributor.cs

@ -3,14 +3,14 @@ using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.Core;
using Volo.Abp.Modularity;
namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.SweetAlert
namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.SweetAlert2
{
[DependsOn(typeof(CoreScriptContributor))]
public class SweetalertScriptContributor : BundleContributor
public class Sweetalert2ScriptContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.AddIfNotContains("/libs/sweetalert/sweetalert.min.js");
context.Files.AddIfNotContains("/libs/sweetalert2/sweetalert2.all.min.js");
}
}
}

8
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs

@ -9,7 +9,7 @@ using Volo.Abp.AspNetCore.Mvc.UI.Packages.Lodash;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.Luxon;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.MalihuCustomScrollbar;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.Select2;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.SweetAlert;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.SweetAlert2;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.Timeago;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.Toastr;
using Volo.Abp.Modularity;
@ -24,7 +24,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Bundling
typeof(JQueryFormScriptContributor),
typeof(Select2ScriptContributor),
typeof(DatatablesNetBs4ScriptContributor),
typeof(SweetalertScriptContributor),
typeof(Sweetalert2ScriptContributor),
typeof(ToastrScriptBundleContributor),
typeof(MalihuCustomScrollbarPluginScriptBundleContributor),
typeof(LuxonScriptContributor),
@ -44,9 +44,9 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Bundling
"/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert/abp-sweetalert.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js"
});
}
}
}
}

24
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert/abp-sweetalert.js → framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js

@ -1,6 +1,6 @@
var abp = abp || {};
(function ($) {
if (!sweetAlert || !$) {
if (!Swal || !$) {
return;
}
@ -27,7 +27,8 @@
confirm: {
icon: 'warning',
title: 'Are you sure?',
buttons: ['Cancel', 'Yes']
showCancelButton: true,
reverseButtons: true
}
}
};
@ -51,7 +52,7 @@
);
return $.Deferred(function ($dfd) {
sweetAlert(opts).then(function () {
Swal.fire(opts).then(function () {
$dfd.resolve();
});
});
@ -73,7 +74,7 @@
return showMessage('error', message, title);
};
abp.message.confirm = function (message, titleOrCallback, callback, closeOnEsc) {
abp.message.confirm = function (message, titleOrCallback, callback) {
var userOpts = {
text: message
@ -86,8 +87,6 @@
userOpts.title = titleOrCallback;
};
userOpts.closeOnEsc = closeOnEsc;
var opts = $.extend(
{},
abp.libs.sweetAlert.config['default'],
@ -96,10 +95,10 @@
);
return $.Deferred(function ($dfd) {
sweetAlert(opts).then(function (isConfirmed) {
callback && callback(isConfirmed);
$dfd.resolve(isConfirmed);
});
Swal.fire(opts).then(result => {
callback && callback(result.value);
$dfd.resolve(result.value);
})
});
};
@ -107,7 +106,8 @@
var l = abp.localization.getResource('AbpUi');
abp.libs.sweetAlert.config.confirm.title = l('AreYouSure');
abp.libs.sweetAlert.config.confirm.buttons = [l('Cancel'), l('Yes')];
abp.libs.sweetAlert.config.confirm.showCancelButton = true;
abp.libs.sweetAlert.config.confirm.reverseButtons = true;
});
})(jQuery);
})(jQuery);

4
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs

@ -30,10 +30,6 @@ namespace Volo.Abp.AspNetCore.Mvc.Json
options.JsonSerializerOptions.Converters.Add(new ObjectToInferredTypesConverter());
options.JsonSerializerOptions.Converters.Add(new AbpHasExtraPropertiesJsonConverterFactory());
// Remove after this PR.
// https://github.com/dotnet/runtime/pull/57525
options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString;
}
}
}

7
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Response/AbpNoContentActionFilter.cs

@ -18,8 +18,9 @@ namespace Volo.Abp.AspNetCore.Mvc.Response
await next();
if (context.HttpContext.Response.StatusCode == (int)HttpStatusCode.OK
&& context.Result == null)
if (!context.HttpContext.Response.HasStarted &&
context.HttpContext.Response.StatusCode == (int)HttpStatusCode.OK &&
context.Result == null)
{
var returnType = context.ActionDescriptor.GetReturnType();
if (returnType == typeof(Task) || returnType == typeof(void))
@ -29,4 +30,4 @@ namespace Volo.Abp.AspNetCore.Mvc.Response
}
}
}
}
}

0
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/EntityChangeType.cs → framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/EntityChangeType.cs

8
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs

@ -155,6 +155,10 @@ namespace Volo.Abp.EntityFrameworkCore
{
try
{
ApplyAbpConcepts();
var eventReport = CreateEventReport();
var auditLog = AuditingManager?.Current?.Log;
List<EntityChangeInfo> entityChangeList = null;
if (auditLog != null)
@ -162,10 +166,6 @@ namespace Volo.Abp.EntityFrameworkCore
entityChangeList = EntityHistoryHelper.CreateChangeList(ChangeTracker.Entries().ToList());
}
ApplyAbpConcepts();
var eventReport = CreateEventReport();
var result = await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
PublishEntityEvents(eventReport);

10
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs

@ -166,7 +166,7 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
foreach (var property in properties)
{
var propertyEntry = entityEntry.Property(property.Name);
if (ShouldSavePropertyHistory(propertyEntry, isCreated || isDeleted))
if (ShouldSavePropertyHistory(propertyEntry, isCreated || isDeleted) && !IsSoftDeleted(entityEntry))
{
propertyChanges.Add(new EntityPropertyChangeInfo
{
@ -188,11 +188,11 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
protected virtual bool IsDeleted(EntityEntry entityEntry)
{
if (entityEntry.State == EntityState.Deleted)
{
return true;
}
return entityEntry.State == EntityState.Deleted || IsSoftDeleted(entityEntry);
}
protected virtual bool IsSoftDeleted(EntityEntry entityEntry)
{
var entity = entityEntry.Entity;
return entity is ISoftDelete && entity.As<ISoftDelete>().IsDeleted;
}

4
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueConverters/ExtraPropertiesValueConverter.cs

@ -51,10 +51,6 @@ namespace Volo.Abp.EntityFrameworkCore.ValueConverters
var deserializeOptions = new JsonSerializerOptions();
deserializeOptions.Converters.Add(new ObjectToInferredTypesConverter());
// Remove after this PR.
// https://github.com/dotnet/runtime/pull/57525
deserializeOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString;
var dictionary = JsonSerializer.Deserialize<ExtraPropertyDictionary>(extraPropertiesAsJson, deserializeOptions) ??
new ExtraPropertyDictionary();

4
framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptionsSetup.cs

@ -29,10 +29,6 @@ namespace Volo.Abp.Json.SystemTextJson
// If the user hasn't explicitly configured the encoder, use the less strict encoder that does not encode all non-ASCII characters.
options.JsonSerializerOptions.Encoder ??= JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
// Remove after this PR.
// https://github.com/dotnet/runtime/pull/57525
options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString;
}
}
}

8
framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs

@ -43,6 +43,12 @@ namespace Volo.Abp.Auditing
"AppEntityWithSelector",
type => type == typeof(AppEntityWithSelector))
);
options.EntityHistorySelectors.Add(
new NamedTypeSelector(
"AppEntityWithSoftDelete",
type => type == typeof(AppEntityWithSoftDelete))
);
});
context.Services.AddType<Auditing_Tests.MyAuditedObject1>();
@ -62,4 +68,4 @@ namespace Volo.Abp.Auditing
return connection;
}
}
}
}

20
framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithSoftDelete.cs

@ -0,0 +1,20 @@
using System;
using Volo.Abp.Domain.Entities;
namespace Volo.Abp.Auditing.App.Entities
{
public class AppEntityWithSoftDelete : AggregateRoot<Guid>, IHasDeletionTime
{
public AppEntityWithSoftDelete(Guid id, string name)
: base(id)
{
Name = name;
}
public string Name { get; set; }
public bool IsDeleted { get; set; }
public DateTime? DeletionTime { get; set; }
}
}

8
framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs

@ -17,15 +17,17 @@ namespace Volo.Abp.Auditing.App.EntityFrameworkCore
public DbSet<AppEntityWithPropertyHasAudited> AppEntityWithPropertyHasAudited { get; set; }
public DbSet<AppEntityWithSelector> AppEntityWithSelector { get; set; }
public DbSet<AppFullAuditedEntityWithAudited> AppFullAuditedEntityWithAudited { get; set; }
public DbSet<AppEntityWithAuditedAndHasCustomAuditingProperties> AppEntityWithAuditedAndHasCustomAuditingProperties { get; set; }
public DbSet<AppEntityWithSoftDelete> AppEntityWithSoftDelete { get; set; }
public AbpAuditingTestDbContext(DbContextOptions<AbpAuditingTestDbContext> options)
: base(options)
{
}
}
}
}

22
framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs

@ -314,5 +314,27 @@ namespace Volo.Abp.Auditing
&& x.EntityChanges[0].PropertyChanges[0].PropertyName == nameof(AppEntityWithAudited.Name)));
#pragma warning restore 4014
}
[Fact]
public virtual async Task Should_Write_AuditLog_For_Soft_Deleted_Entity()
{
var entity = new AppEntityWithSoftDelete(Guid.NewGuid(), "test name");
var repository = ServiceProvider.GetRequiredService<IBasicRepository<AppEntityWithSoftDelete, Guid>>();
await repository.InsertAsync(entity);
using (var scope = _auditingManager.BeginScope())
{
await repository.DeleteAsync(entity.Id);
await scope.SaveAsync();
}
#pragma warning disable 4014
_auditingStore.Received().SaveAsync(Arg.Is<AuditLogInfo>(x => x.EntityChanges.Count == 1 &&
x.EntityChanges[0].ChangeType == EntityChangeType.Deleted &&
x.EntityChanges[0].PropertyChanges.Count == 0));
#pragma warning restore 4014
}
}
}

2
modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Dockerfile

@ -1,4 +1,4 @@
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
FROM mcr.microsoft.com/dotnet/aspnet:6.0.0-rc.1-bullseye-slim AS base
WORKDIR /app
EXPOSE 80
COPY bin/Release/publish .

3
modules/blogging/app/Volo.BloggingTestApp/BloggingTestAppModule.cs

@ -44,8 +44,10 @@ namespace Volo.BloggingTestApp
{
[DependsOn(
typeof(BloggingWebModule),
typeof(BloggingHttpApiModule),
typeof(BloggingApplicationModule),
typeof(BloggingAdminWebModule),
typeof(BloggingAdminHttpApiModule),
typeof(BloggingAdminApplicationModule),
#if MONGODB
typeof(BloggingTestAppMongoDbModule),
@ -55,6 +57,7 @@ namespace Volo.BloggingTestApp
typeof(AbpAccountWebModule),
typeof(AbpAccountApplicationModule),
typeof(AbpIdentityWebModule),
typeof(AbpIdentityHttpApiModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpPermissionManagementDomainIdentityModule),
typeof(AbpPermissionManagementApplicationModule),

3
modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj

@ -24,12 +24,15 @@
<ProjectReference Include="..\Volo.BloggingTestApp.EntityFrameworkCore\Volo.BloggingTestApp.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\src\Volo.Blogging.Application\Volo.Blogging.Application.csproj" />
<ProjectReference Include="..\..\src\Volo.Blogging.Web\Volo.Blogging.Web.csproj" />
<ProjectReference Include="..\..\src\Volo.Blogging.HttpApi\Volo.Blogging.HttpApi.csproj" />
<ProjectReference Include="..\..\src\Volo.Blogging.Admin.Application\Volo.Blogging.Admin.Application.csproj" />
<ProjectReference Include="..\..\src\Volo.Blogging.Admin.Web\Volo.Blogging.Admin.Web.csproj" />
<ProjectReference Include="..\..\src\Volo.Blogging.Admin.HttpApi\Volo.Blogging.Admin.HttpApi.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" />
<ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.Application\Volo.Abp.Identity.Application.csproj" />
<ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.Web\Volo.Abp.Identity.Web.csproj" />
<ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.HttpApi\Volo.Abp.Identity.HttpApi.csproj" />
<ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.PermissionManagement.Domain.Identity\Volo.Abp.PermissionManagement.Domain.Identity.csproj" />
<ProjectReference Include="..\..\..\..\modules\permission-management\src\Volo.Abp.PermissionManagement.Application\Volo.Abp.PermissionManagement.Application.csproj" />
<ProjectReference Include="..\..\..\..\modules\account\src\Volo.Abp.Account.Web\Volo.Abp.Account.Web.csproj" />

3123
modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/sweetalert2/sweetalert2.all.js

File diff suppressed because one or more lines are too long

2
modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

File diff suppressed because one or more lines are too long

1319
modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/sweetalert2/sweetalert2.css

File diff suppressed because it is too large

3121
modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/sweetalert2/sweetalert2.js

File diff suppressed because it is too large

1
modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/sweetalert2/sweetalert2.min.css

File diff suppressed because one or more lines are too long

1
modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/sweetalert2/sweetalert2.min.js

File diff suppressed because one or more lines are too long

5
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/_ViewStart.cshtml

@ -0,0 +1,5 @@
@using Volo.Abp.AspNetCore.Mvc.UI.Theming
@inject IThemeManager ThemeManager
@{
Layout = ThemeManager.CurrentTheme.GetPublicLayout();
}

1
modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo.Abp.FeatureManagement.Application.Contracts.csproj

@ -11,6 +11,7 @@
<ItemGroup>
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Ddd.Application.Contracts\Volo.Abp.Ddd.Application.Contracts.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Authorization.Abstractions\Volo.Abp.Authorization.Abstractions.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Json\Volo.Abp.Json.csproj" />
</ItemGroup>
<ItemGroup>

4
modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsModule.cs

@ -2,6 +2,7 @@
using Volo.Abp.Application;
using Volo.Abp.Authorization;
using Volo.Abp.FeatureManagement.JsonConverters;
using Volo.Abp.Json;
using Volo.Abp.Json.Newtonsoft;
using Volo.Abp.Json.SystemTextJson;
using Volo.Abp.Modularity;
@ -12,7 +13,8 @@ namespace Volo.Abp.FeatureManagement
[DependsOn(
typeof(AbpFeatureManagementDomainSharedModule),
typeof(AbpDddApplicationContractsModule),
typeof(AbpAuthorizationAbstractionsModule)
typeof(AbpAuthorizationAbstractionsModule),
typeof(AbpJsonModule)
)]
public class AbpFeatureManagementApplicationContractsModule : AbpModule
{

25
modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/AllowTenantsToChangeEmailSettingsFeatureSimpleStateChecker.cs

@ -0,0 +1,25 @@
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Features;
using Volo.Abp.MultiTenancy;
using Volo.Abp.SimpleStateChecking;
namespace Volo.Abp.SettingManagement
{
public class AllowTenantsToChangeEmailSettingsFeatureSimpleStateChecker : ISimpleStateChecker<PermissionDefinition>
{
public async Task<bool> IsEnabledAsync(SimpleStateCheckerContext<PermissionDefinition> context)
{
var currentTenant = context.ServiceProvider.GetRequiredService<ICurrentTenant>();
if (!currentTenant.IsAvailable)
{
return true;
}
var featureChecker = context.ServiceProvider.GetRequiredService<IFeatureChecker>();
return await featureChecker.IsEnabledAsync(SettingManagementFeatures.AllowTenantsToChangeEmailSettings);
}
}
}

6
modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/SettingManagementPermissionDefinitionProvider.cs

@ -1,6 +1,5 @@
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy;
using Volo.Abp.SettingManagement.Localization;
namespace Volo.Abp.SettingManagement
@ -10,7 +9,10 @@ namespace Volo.Abp.SettingManagement
public override void Define(IPermissionDefinitionContext context)
{
var moduleGroup = context.AddGroup(SettingManagementPermissions.GroupName, L("Permission:SettingManagement"));
moduleGroup.AddPermission(SettingManagementPermissions.Emailing, L("Permission:Emailing"), multiTenancySide: MultiTenancySides.Host);
moduleGroup
.AddPermission(SettingManagementPermissions.Emailing, L("Permission:Emailing"))
.StateCheckers.Add(new AllowTenantsToChangeEmailSettingsFeatureSimpleStateChecker());
}
private static LocalizableString L(string name)

62
modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/EmailSettingsAppService.cs

@ -2,6 +2,8 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Emailing;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Features;
namespace Volo.Abp.SettingManagement
{
@ -17,30 +19,52 @@ namespace Volo.Abp.SettingManagement
public virtual async Task<EmailSettingsDto> GetAsync()
{
return new EmailSettingsDto {
SmtpHost = await SettingManager.GetOrNullGlobalAsync(EmailSettingNames.Smtp.Host),
SmtpPort = Convert.ToInt32(await SettingManager.GetOrNullGlobalAsync(EmailSettingNames.Smtp.Port)),
SmtpUserName = await SettingManager.GetOrNullGlobalAsync(EmailSettingNames.Smtp.UserName),
SmtpPassword = await SettingManager.GetOrNullGlobalAsync(EmailSettingNames.Smtp.Password),
SmtpDomain = await SettingManager.GetOrNullGlobalAsync(EmailSettingNames.Smtp.Domain),
SmtpEnableSsl = Convert.ToBoolean(await SettingManager.GetOrNullGlobalAsync(EmailSettingNames.Smtp.EnableSsl)),
SmtpUseDefaultCredentials = Convert.ToBoolean(await SettingManager.GetOrNullGlobalAsync(EmailSettingNames.Smtp.UseDefaultCredentials)),
DefaultFromAddress = await SettingManager.GetOrNullGlobalAsync(EmailSettingNames.DefaultFromAddress),
DefaultFromDisplayName = await SettingManager.GetOrNullGlobalAsync(EmailSettingNames.DefaultFromDisplayName),
await CheckFeatureAsync();
var settingsDto = new EmailSettingsDto {
SmtpHost = await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.Host),
SmtpPort = Convert.ToInt32(await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.Port)),
SmtpUserName = await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.UserName),
SmtpPassword = await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.Password),
SmtpDomain = await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.Domain),
SmtpEnableSsl = Convert.ToBoolean(await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.EnableSsl)),
SmtpUseDefaultCredentials = Convert.ToBoolean(await SettingProvider.GetOrNullAsync(EmailSettingNames.Smtp.UseDefaultCredentials)),
DefaultFromAddress = await SettingProvider.GetOrNullAsync(EmailSettingNames.DefaultFromAddress),
DefaultFromDisplayName = await SettingProvider.GetOrNullAsync(EmailSettingNames.DefaultFromDisplayName),
};
if (CurrentTenant.IsAvailable)
{
settingsDto.SmtpHost = await SettingManager.GetOrNullForTenantAsync(EmailSettingNames.Smtp.Host, CurrentTenant.GetId(), false);
settingsDto.SmtpUserName = await SettingManager.GetOrNullForTenantAsync(EmailSettingNames.Smtp.UserName, CurrentTenant.GetId(), false);
settingsDto.SmtpPassword = await SettingManager.GetOrNullForTenantAsync(EmailSettingNames.Smtp.Password, CurrentTenant.GetId(), false);
settingsDto.SmtpDomain = await SettingManager.GetOrNullForTenantAsync(EmailSettingNames.Smtp.Domain, CurrentTenant.GetId(), false);
}
return settingsDto;
}
public virtual async Task UpdateAsync(UpdateEmailSettingsDto input)
{
await SettingManager.SetGlobalAsync(EmailSettingNames.Smtp.Host, input.SmtpHost);
await SettingManager.SetGlobalAsync(EmailSettingNames.Smtp.Port, input.SmtpPort.ToString());
await SettingManager.SetGlobalAsync(EmailSettingNames.Smtp.UserName, input.SmtpUserName);
await SettingManager.SetGlobalAsync(EmailSettingNames.Smtp.Password, input.SmtpPassword);
await SettingManager.SetGlobalAsync(EmailSettingNames.Smtp.Domain, input.SmtpDomain);
await SettingManager.SetGlobalAsync(EmailSettingNames.Smtp.EnableSsl, input.SmtpEnableSsl.ToString());
await SettingManager.SetGlobalAsync(EmailSettingNames.Smtp.UseDefaultCredentials, input.SmtpUseDefaultCredentials.ToString().ToLowerInvariant());
await SettingManager.SetGlobalAsync(EmailSettingNames.DefaultFromAddress, input.DefaultFromAddress);
await SettingManager.SetGlobalAsync(EmailSettingNames.DefaultFromDisplayName, input.DefaultFromDisplayName);
await CheckFeatureAsync();
await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.Host, input.SmtpHost);
await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.Port, input.SmtpPort.ToString());
await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.UserName, input.SmtpUserName);
await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.Password, input.SmtpPassword);
await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.Domain, input.SmtpDomain);
await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.EnableSsl, input.SmtpEnableSsl.ToString());
await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.Smtp.UseDefaultCredentials, input.SmtpUseDefaultCredentials.ToString().ToLowerInvariant());
await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.DefaultFromAddress, input.DefaultFromAddress);
await SettingManager.SetForTenantOrGlobalAsync(CurrentTenant.Id, EmailSettingNames.DefaultFromDisplayName, input.DefaultFromDisplayName);
}
private async Task CheckFeatureAsync()
{
if (CurrentTenant.IsAvailable)
{
await FeatureChecker.CheckEnabledAsync(SettingManagementFeatures.AllowTenantsToChangeEmailSettings);
}
}
}
}

22
modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Settings/EmailingPageContributor.cs

@ -2,6 +2,8 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using Volo.Abp.Features;
using Volo.Abp.MultiTenancy;
using Volo.Abp.SettingManagement.Blazor.Pages.SettingManagement.EmailSettingGroup;
using Volo.Abp.SettingManagement.Localization;
@ -33,9 +35,29 @@ namespace Volo.Abp.SettingManagement.Blazor.Settings
private async Task<bool> CheckPermissionsInternalAsync(SettingComponentCreationContext context)
{
if (!await CheckFeatureAsync(context))
{
return false;
}
var authorizationService = context.ServiceProvider.GetRequiredService<IAuthorizationService>();
return await authorizationService.IsGrantedAsync(SettingManagementPermissions.Emailing);
}
private async Task<bool> CheckFeatureAsync(SettingComponentCreationContext context)
{
var currentTenant = context.ServiceProvider.GetRequiredService<ICurrentTenant>();
if (!currentTenant.IsAvailable)
{
return true;
}
var featureCheck = context.ServiceProvider.GetRequiredService<IFeatureChecker>();
return await featureCheck.IsEnabledAsync(SettingManagementFeatures.AllowTenantsToChangeEmailSettings);
}
}
}

4
modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json

@ -17,6 +17,8 @@
"DefaultFromDisplayName": "Default from display name",
"Feature:SettingManagementGroup": "Setting Management",
"Feature:SettingManagementEnable": "Enable setting management",
"Feature:SettingManagementEnableDescription": "Enable setting management system in the application."
"Feature:SettingManagementEnableDescription": "Enable setting management system in the application.",
"Feature:AllowTenantsToChangeEmailSettings": "Allow tenants to change email settings.",
"Feature:AllowTenantsToChangeEmailSettingsDescription": "Allow tenants to change email settings."
}
}

4
modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json

@ -17,6 +17,8 @@
"DefaultFromDisplayName": "默认显示名称",
"Feature:SettingManagementGroup": "设置管理",
"Feature:SettingManagementEnable": "启用设置管理",
"Feature:SettingManagementEnableDescription": "在应用程序中启用设置管理系统."
"Feature:SettingManagementEnableDescription": "在应用程序中启用设置管理系统.",
"Feature:AllowTenantsToChangeEmailSettings": "允许租户更改邮件设置.",
"Feature:AllowTenantsToChangeEmailSettingsDescription": "允许租户更改邮件设置."
}
}

13
modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs

@ -5,18 +5,27 @@ using Volo.Abp.Validation.StringValues;
namespace Volo.Abp.SettingManagement
{
public class SettingManagementFeatureDefinitionProvider: FeatureDefinitionProvider
public class SettingManagementFeatureDefinitionProvider : FeatureDefinitionProvider
{
public override void Define(IFeatureDefinitionContext context)
{
var group = context.AddGroup(SettingManagementFeatures.GroupName,
L("Feature:SettingManagementGroup"));
group.AddFeature(SettingManagementFeatures.Enable,
var settingEnableFeature = group.AddFeature(
SettingManagementFeatures.Enable,
"true",
L("Feature:SettingManagementEnable"),
L("Feature:SettingManagementEnableDescription"),
new ToggleStringValueType());
settingEnableFeature.CreateChild(
SettingManagementFeatures.AllowTenantsToChangeEmailSettings,
"false",
L("Feature:AllowTenantsToChangeEmailSettings"),
L("AllowTenantsToChangeEmailSettingsDescription"),
new ToggleStringValueType(),
isAvailableToHost: false);
}
private static LocalizableString L(string name)

2
modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatures.cs

@ -5,5 +5,7 @@
public const string GroupName = "SettingManagement";
public const string Enable = GroupName + ".Enable";
public const string AllowTenantsToChangeEmailSettings = GroupName + ".AllowTenantsToChangeEmailSettings";
}
}

10
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/TenantSettingManagerExtensions.cs

@ -37,5 +37,15 @@ namespace Volo.Abp.SettingManagement
{
return settingManager.SetAsync(name, value, TenantSettingValueProvider.ProviderName, null, forceToSet);
}
public static Task SetForTenantOrGlobalAsync(this ISettingManager settingManager, Guid? tenantId, [NotNull] string name, [CanBeNull] string value, bool forceToSet = false)
{
if (tenantId.HasValue)
{
return settingManager.SetForTenantAsync(tenantId.Value, name, value, forceToSet);
}
return settingManager.SetGlobalAsync(name, value);
}
}
}

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

@ -2,6 +2,8 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using Volo.Abp.Features;
using Volo.Abp.MultiTenancy;
using Volo.Abp.SettingManagement.Localization;
using Volo.Abp.SettingManagement.Web.Pages.SettingManagement;
using Volo.Abp.SettingManagement.Web.Pages.SettingManagement.Components.EmailSettingGroup;
@ -34,9 +36,29 @@ namespace Volo.Abp.SettingManagement.Web.Settings
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 currentTenant = context.ServiceProvider.GetRequiredService<ICurrentTenant>();
if (!currentTenant.IsAvailable)
{
return true;
}
var featureCheck = context.ServiceProvider.GetRequiredService<IFeatureChecker>();
return await featureCheck.IsEnabledAsync(SettingManagementFeatures.AllowTenantsToChangeEmailSettings);
}
}
}

7
npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts

@ -6,7 +6,7 @@ import {
OAuthErrorEvent,
OAuthInfoEvent,
OAuthService,
OAuthStorage,
OAuthStorage
} from 'angular-oauth2-oidc';
import { from, Observable, of, pipe } from 'rxjs';
import { filter, switchMap, tap } from 'rxjs/operators';
@ -37,7 +37,10 @@ export abstract class AuthFlowStrategy {
abstract logout(queryParams?: Params): Observable<any>;
abstract login(params?: LoginParams | Params): Observable<any>;
private catchError = err => this.httpErrorReporter.reportError(err);
private catchError = err => {
this.httpErrorReporter.reportError(err);
return of(null);
};
constructor(protected injector: Injector) {
this.httpErrorReporter = injector.get(HttpErrorReporterService);

6
npm/ng-packs/packages/core/src/lib/utils/environment-utils.ts

@ -1,5 +1,6 @@
import { HttpClient } from '@angular/common/http';
import { Injector } from '@angular/core';
import { of } from 'rxjs';
import { catchError, tap } from 'rxjs/operators';
import { Environment, RemoteEnv } from '../models/environment';
import { EnvironmentService } from '../services/environment.service';
@ -19,7 +20,10 @@ export function getRemoteEnv(injector: Injector, environment: Partial<Environmen
return http
.request<Environment>(method, url, { headers })
.pipe(
catchError(err => httpErrorReporter.reportError(err)), // TODO: Condiser get handle function from a provider
catchError(err => {
httpErrorReporter.reportError(err);
return of(null);
}), // TODO: Consider get handle function from a provider
tap(env => environmentService.setState(mergeEnvironments(environment, env, remoteEnv))),
)
.toPromise();

5
npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html

@ -34,9 +34,8 @@
<ng-template #abpHeader>
<h3>
{{
selected?.id
? 'AbpTenantManagement::Edit'
: ('AbpTenantManagement::NewTenant' | abpLocalization)
(selected?.id ? 'AbpTenantManagement::Edit' : 'AbpTenantManagement::NewTenant')
| abpLocalization
}}
</h3>
</ng-template>

2
npm/packs/aspnetcore.mvc.ui.theme.shared/package.json

@ -16,7 +16,7 @@
"@abp/luxon": "~4.4.2",
"@abp/malihu-custom-scrollbar-plugin": "~4.4.2",
"@abp/select2": "~4.4.2",
"@abp/sweetalert": "~4.4.2",
"@abp/sweetalert2": "~4.4.2",
"@abp/timeago": "~4.4.2",
"@abp/toastr": "~4.4.2"
},

5
npm/packs/sweetalert/abp.resourcemapping.js

@ -1,5 +0,0 @@
module.exports = {
mappings: {
"@node_modules/sweetalert/dist/*.*": "@libs/sweetalert/"
}
}

5
npm/packs/sweetalert2/abp.resourcemapping.js

@ -0,0 +1,5 @@
module.exports = {
mappings: {
"@node_modules/sweetalert2/dist/*.*": "@libs/sweetalert2/"
}
}

4
npm/packs/sweetalert/package.json → npm/packs/sweetalert2/package.json

@ -1,12 +1,12 @@
{
"version": "4.4.2",
"name": "@abp/sweetalert",
"name": "@abp/sweetalert2",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~4.4.2",
"sweetalert": "^2.1.2"
"sweetalert2": "^11.0.18"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431"
}

3123
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/wwwroot/libs/sweetalert2/sweetalert2.all.js

File diff suppressed because one or more lines are too long

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

File diff suppressed because one or more lines are too long

1319
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/wwwroot/libs/sweetalert2/sweetalert2.css

File diff suppressed because it is too large

3121
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/wwwroot/libs/sweetalert2/sweetalert2.js

File diff suppressed because it is too large

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/wwwroot/libs/sweetalert2/sweetalert2.min.css

File diff suppressed because one or more lines are too long

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/wwwroot/libs/sweetalert2/sweetalert2.min.js

File diff suppressed because one or more lines are too long

3123
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/wwwroot/libs/sweetalert2/sweetalert2.all.js

File diff suppressed because one or more lines are too long

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

File diff suppressed because one or more lines are too long

1319
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/wwwroot/libs/sweetalert2/sweetalert2.css

File diff suppressed because it is too large

3121
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/wwwroot/libs/sweetalert2/sweetalert2.js

File diff suppressed because it is too large

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/wwwroot/libs/sweetalert2/sweetalert2.min.css

File diff suppressed because one or more lines are too long

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/wwwroot/libs/sweetalert2/sweetalert2.min.js

File diff suppressed because one or more lines are too long

3123
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/wwwroot/libs/sweetalert2/sweetalert2.all.js

File diff suppressed because one or more lines are too long

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

File diff suppressed because one or more lines are too long

1319
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/wwwroot/libs/sweetalert2/sweetalert2.css

File diff suppressed because it is too large

3121
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/wwwroot/libs/sweetalert2/sweetalert2.js

File diff suppressed because it is too large

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/wwwroot/libs/sweetalert2/sweetalert2.min.css

File diff suppressed because one or more lines are too long

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/wwwroot/libs/sweetalert2/sweetalert2.min.js

File diff suppressed because one or more lines are too long

3123
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.all.js

File diff suppressed because one or more lines are too long

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

File diff suppressed because one or more lines are too long

1319
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.css

File diff suppressed because it is too large

3121
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.js

File diff suppressed because it is too large

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.min.css

File diff suppressed because one or more lines are too long

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.min.js

File diff suppressed because one or more lines are too long

3123
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.all.js

File diff suppressed because one or more lines are too long

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

File diff suppressed because one or more lines are too long

1319
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.css

File diff suppressed because it is too large

3121
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.js

File diff suppressed because it is too large

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.min.css

File diff suppressed because one or more lines are too long

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.min.js

File diff suppressed because one or more lines are too long

3123
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/wwwroot/libs/sweetalert2/sweetalert2.all.js

File diff suppressed because one or more lines are too long

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

File diff suppressed because one or more lines are too long

1319
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/wwwroot/libs/sweetalert2/sweetalert2.css

File diff suppressed because it is too large

3121
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/wwwroot/libs/sweetalert2/sweetalert2.js

File diff suppressed because it is too large

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/wwwroot/libs/sweetalert2/sweetalert2.min.css

File diff suppressed because one or more lines are too long

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/wwwroot/libs/sweetalert2/sweetalert2.min.js

File diff suppressed because one or more lines are too long

3123
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/wwwroot/libs/sweetalert2/sweetalert2.all.js

File diff suppressed because one or more lines are too long

2
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

File diff suppressed because one or more lines are too long

1319
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/wwwroot/libs/sweetalert2/sweetalert2.css

File diff suppressed because it is too large

3121
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/wwwroot/libs/sweetalert2/sweetalert2.js

File diff suppressed because it is too large

1
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/wwwroot/libs/sweetalert2/sweetalert2.min.css

File diff suppressed because one or more lines are too long

1
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/wwwroot/libs/sweetalert2/sweetalert2.min.js

File diff suppressed because one or more lines are too long

3123
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.all.js

File diff suppressed because one or more lines are too long

2
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

File diff suppressed because one or more lines are too long

1319
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.css

File diff suppressed because it is too large

3121
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.js

File diff suppressed because it is too large

1
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.min.css

File diff suppressed because one or more lines are too long

1
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/wwwroot/libs/sweetalert2/sweetalert2.min.js

File diff suppressed because one or more lines are too long

3123
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.all.js

File diff suppressed because one or more lines are too long

2
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

File diff suppressed because one or more lines are too long

1319
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.css

File diff suppressed because it is too large

3121
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.js

File diff suppressed because it is too large

1
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.min.css

File diff suppressed because one or more lines are too long

1
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/wwwroot/libs/sweetalert2/sweetalert2.min.js

File diff suppressed because one or more lines are too long

3123
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/wwwroot/libs/sweetalert2/sweetalert2.all.js

File diff suppressed because one or more lines are too long

2
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

File diff suppressed because one or more lines are too long

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save