From cfa4d09e36d29371c86d94236cb5aebfe9debf9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Tu=CC=88ken?= Date: Tue, 7 Jan 2020 23:44:47 +0300 Subject: [PATCH 01/61] Create Volo.Abp.AspNetCore.Serilog package. --- framework/Volo.Abp.sln | 9 ++- ...CoreSerilogApplicationBuilderExtensions.cs | 13 ++++ .../Volo.Abp.AspNetCore.Serilog.csproj | 27 +++++++ .../AspNetCore/Serilog/AbpSerilogModule.cs | 14 ++++ .../AspNetCore/Serilog/SerilogMiddleware.cs | 70 +++++++++++++++++++ 5 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj create mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogModule.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/SerilogMiddleware.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 088a9437a8..b9a27d757f 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -1,4 +1,4 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 +Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.28922.388 MinimumVisualStudioVersion = 10.0.40219.1 @@ -256,6 +256,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Minify", "src\Volo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Minify.Tests", "test\Volo.Abp.Minify.Tests\Volo.Abp.Minify.Tests.csproj", "{E69182B3-350A-43F5-A935-5EBBEBECEF97}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Serilog", "src\Volo.Abp.AspNetCore.Serilog\Volo.Abp.AspNetCore.Serilog.csproj", "{3B801003-BE74-49ED-9749-DA5E99F45EBF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -762,6 +764,10 @@ Global {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Debug|Any CPU.Build.0 = Debug|Any CPU {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Release|Any CPU.ActiveCfg = Release|Any CPU {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Release|Any CPU.Build.0 = Release|Any CPU + {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -892,6 +898,7 @@ Global {73559227-EBF0-475F-835B-1FF0CD9132AA} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {928DC30D-C078-4BB4-A9F8-FE7252C67DC6} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {E69182B3-350A-43F5-A935-5EBBEBECEF97} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {3B801003-BE74-49ED-9749-DA5E99F45EBF} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs new file mode 100644 index 0000000000..f9093ffaac --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs @@ -0,0 +1,13 @@ +using Volo.Abp.AspNetCore.Serilog; + +namespace Microsoft.AspNetCore.Builder +{ + public static class AbpAspNetCoreSerilogApplicationBuilderExtensions + { + public static IApplicationBuilder UseSerilogEnrichers(this IApplicationBuilder app) + { + return app + .UseMiddleware(); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj new file mode 100644 index 0000000000..f450e04423 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj @@ -0,0 +1,27 @@ + + + + + + netcoreapp3.1 + Volo.Abp.AspNetCore.Serilog + Volo.Abp.AspNetCore.Serilog + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + true + Library + + + + + + + + + + + + + diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogModule.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogModule.cs new file mode 100644 index 0000000000..5012d54e30 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogModule.cs @@ -0,0 +1,14 @@ +using Volo.Abp.AspNetCore; +using Volo.Abp.Modularity; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.AspNetCore.Serilog +{ + [DependsOn( + typeof(AbpMultiTenancyModule), + typeof(AbpAspNetCoreModule) + )] + public class AbpSerilogModule : AbpModule + { + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/SerilogMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/SerilogMiddleware.cs new file mode 100644 index 0000000000..10bbdb188f --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/SerilogMiddleware.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Serilog.Context; +using Serilog.Core; +using Serilog.Core.Enrichers; +using Volo.Abp.Clients; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Tracing; +using Volo.Abp.Users; + +namespace Volo.Abp.AspNetCore.Serilog +{ + public class SerilogMiddleware : IMiddleware, ITransientDependency + { + private const string TenantEnricherPropertyName = "TenantId"; + private const string UserEnricherPropertyName = "UserId"; + private const string ClientEnricherPropertyName = "ClientId"; + private const string CorrelationIdPropertyName = "CorrelationId"; + + private readonly ICurrentClient _currentClient; + private readonly ICurrentTenant _currentTenant; + private readonly ICurrentUser _currentUser; + private readonly ICorrelationIdProvider _correlationIdProvider; + + public SerilogMiddleware( + ICurrentTenant currentTenant, + ICurrentUser currentUser, + ICurrentClient currentClient, + ICorrelationIdProvider correlationIdProvider) + { + _currentTenant = currentTenant; + _currentUser = currentUser; + _currentClient = currentClient; + _correlationIdProvider = correlationIdProvider; + } + + public async Task InvokeAsync(HttpContext context, RequestDelegate next) + { + var enrichers = new List(); + + if (_currentTenant?.Id != null) + { + enrichers.Add(new PropertyEnricher(TenantEnricherPropertyName, _currentTenant.Id)); + } + + if (_currentUser?.Id != null) + { + enrichers.Add(new PropertyEnricher(UserEnricherPropertyName, _currentUser.Id)); + } + + if (_currentClient?.Id != null) + { + enrichers.Add(new PropertyEnricher(ClientEnricherPropertyName, _currentClient.Id)); + } + + var correlationId = _correlationIdProvider.Get(); + if (!string.IsNullOrEmpty(correlationId)) + { + enrichers.Add(new PropertyEnricher(CorrelationIdPropertyName, correlationId)); + } + + using (LogContext.Push(enrichers.ToArray())) + { + await next(context).ConfigureAwait(false); + } + } + } +} \ No newline at end of file From c57281570177e91d4f80a00ebcf8f58d5f9cda15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Tu=CC=88ken?= Date: Wed, 8 Jan 2020 07:41:56 +0300 Subject: [PATCH 02/61] Update application template UseSerilogEnrichers. --- .../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 1 + .../MyProjectNameHttpApiHostModule.cs | 5 ++++- ...yCompanyName.MyProjectName.HttpApi.HostWithIds.csproj | 1 + .../MyProjectNameHttpApiHostModule.cs | 5 ++++- .../MyCompanyName.MyProjectName.IdentityServer.csproj | 2 ++ .../MyProjectNameIdentityServerModule.cs | 5 ++++- .../MyCompanyName.MyProjectName.Web.Host.csproj | 2 ++ .../MyProjectNameWebModule.cs | 6 ++++-- .../MyCompanyName.MyProjectName.Web.csproj | 1 + .../MyProjectNameWebModule.cs | 9 ++++----- 10 files changed, 27 insertions(+), 10 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index 19435bb1fa..173d10bbc2 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -20,6 +20,7 @@ + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index 59ba519ce4..3db35cd20b 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -15,6 +15,7 @@ using Microsoft.OpenApi.Models; using Volo.Abp; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy; +using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.Autofac; using Volo.Abp.Caching; using Volo.Abp.Localization; @@ -28,7 +29,8 @@ namespace MyCompanyName.MyProjectName typeof(AbpAutofacModule), typeof(AbpAspNetCoreMvcUiMultiTenancyModule), typeof(MyProjectNameApplicationModule), - typeof(MyProjectNameEntityFrameworkCoreDbMigrationsModule) + typeof(MyProjectNameEntityFrameworkCoreDbMigrationsModule), + typeof(AbpSerilogModule) )] public class MyProjectNameHttpApiHostModule : AbpModule { @@ -178,6 +180,7 @@ namespace MyCompanyName.MyProjectName }); app.UseAuditing(); + app.UseSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj index 038e2e4016..f59176e5af 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj @@ -20,6 +20,7 @@ + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs index a60d2ddb35..73a9d01be6 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs @@ -18,6 +18,7 @@ using Volo.Abp.Account.Web; using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.MultiTenancy; using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.Autofac; using Volo.Abp.Localization; using Volo.Abp.Modularity; @@ -34,7 +35,8 @@ namespace MyCompanyName.MyProjectName typeof(MyProjectNameEntityFrameworkCoreDbMigrationsModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpAspNetCoreAuthenticationJwtBearerModule), - typeof(AbpAccountWebIdentityServerModule) + typeof(AbpAccountWebIdentityServerModule), + typeof(AbpSerilogModule) )] public class MyProjectNameHttpApiHostModule : AbpModule { @@ -172,6 +174,7 @@ namespace MyCompanyName.MyProjectName }); app.UseAuditing(); + app.UseSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj index aecc6831be..e040f9642d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj @@ -43,6 +43,8 @@ + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs index 2e2211791e..117386e588 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs @@ -18,6 +18,7 @@ using Volo.Abp.AspNetCore.Mvc.UI; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.Auditing; using Volo.Abp.Autofac; using Volo.Abp.BackgroundJobs; @@ -35,7 +36,8 @@ namespace MyCompanyName.MyProjectName typeof(AbpAccountWebIdentityServerModule), typeof(AbpAccountApplicationModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), - typeof(MyProjectNameEntityFrameworkCoreDbMigrationsModule) + typeof(MyProjectNameEntityFrameworkCoreDbMigrationsModule), + typeof(AbpSerilogModule) )] public class MyProjectNameIdentityServerModule : AbpModule { @@ -149,6 +151,7 @@ namespace MyCompanyName.MyProjectName app.UseAuthorization(); app.UseAbpRequestLocalization(); app.UseAuditing(); + app.UseSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index 66864acc82..ecdd1446fa 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -29,6 +29,8 @@ + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs index 28afed0c7c..c30a3b5d88 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs @@ -22,6 +22,7 @@ using Volo.Abp.AspNetCore.Mvc.UI; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; using Volo.Abp.Caching; @@ -49,7 +50,8 @@ namespace MyCompanyName.MyProjectName.Web typeof(AbpFeatureManagementWebModule), typeof(AbpHttpClientIdentityModelModule), typeof(AbpIdentityWebModule), - typeof(AbpTenantManagementWebModule) + typeof(AbpTenantManagementWebModule), + typeof(AbpSerilogModule) )] public class MyProjectNameWebModule : AbpModule { @@ -241,7 +243,7 @@ namespace MyCompanyName.MyProjectName.Web }); app.UseAuditing(); - + app.UseSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index 9540447c74..6cf7d25498 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -47,6 +47,7 @@ + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs index 87626719f3..cd27c9ece2 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs @@ -23,6 +23,7 @@ using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; using Volo.Abp.FeatureManagement; @@ -47,7 +48,8 @@ namespace MyCompanyName.MyProjectName.Web typeof(AbpAccountWebIdentityServerModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpAspNetCoreAuthenticationJwtBearerModule), - typeof(AbpTenantManagementWebModule) + typeof(AbpTenantManagementWebModule), + typeof(AbpSerilogModule) )] public class MyProjectNameWebModule : AbpModule { @@ -198,7 +200,6 @@ namespace MyCompanyName.MyProjectName.Web { app.UseErrorPage(); } - app.UseVirtualFiles(); app.UseRouting(); app.UseAuthentication(); @@ -208,18 +209,16 @@ namespace MyCompanyName.MyProjectName.Web { app.UseMultiTenancy(); } - app.UseIdentityServer(); app.UseAuthorization(); app.UseAbpRequestLocalization(); - app.UseSwagger(); app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API"); }); - app.UseAuditing(); + app.UseSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } From 3028b1a431c06894068382aa3d2af925935d7db3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Tu=CC=88ken?= Date: Wed, 8 Jan 2020 07:54:17 +0300 Subject: [PATCH 03/61] Update module template UseSerilogEnrichers. --- .../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 1 + .../MyProjectNameHttpApiHostModule.cs | 5 ++++- .../MyCompanyName.MyProjectName.IdentityServer.csproj | 1 + .../MyProjectNameIdentityServerModule.cs | 5 ++++- .../MyCompanyName.MyProjectName.Web.Host.csproj | 6 ++++++ .../MyProjectNameWebHostModule.cs | 6 ++++-- .../MyCompanyName.MyProjectName.Web.Unified.csproj | 1 + .../MyProjectNameWebUnifiedModule.cs | 5 ++++- 8 files changed, 25 insertions(+), 5 deletions(-) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index fe10668840..07979b3f63 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -19,6 +19,7 @@ + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index f48706663e..972ccc9708 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -15,6 +15,7 @@ using Swashbuckle.AspNetCore.Swagger; using Volo.Abp; using Volo.Abp.AspNetCore.MultiTenancy; using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy; +using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.Autofac; using Volo.Abp.Caching; @@ -39,7 +40,8 @@ namespace MyCompanyName.MyProjectName typeof(AbpEntityFrameworkCoreSqlServerModule), typeof(AbpAuditLoggingEntityFrameworkCoreModule), typeof(AbpPermissionManagementEntityFrameworkCoreModule), - typeof(AbpSettingManagementEntityFrameworkCoreModule) + typeof(AbpSettingManagementEntityFrameworkCoreModule), + typeof(AbpSerilogModule) )] public class MyProjectNameHttpApiHostModule : AbpModule { @@ -166,6 +168,7 @@ namespace MyCompanyName.MyProjectName options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API"); }); app.UseAuditing(); + app.UseSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj index b25ce4b603..062dceabaf 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj @@ -21,6 +21,7 @@ + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs index 5f0f80c05e..7205fdf225 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs @@ -17,6 +17,7 @@ using Volo.Abp.AspNetCore.Authentication.JwtBearer; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; +using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.Auditing; using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.Autofac; @@ -66,7 +67,8 @@ namespace MyCompanyName.MyProjectName typeof(AbpTenantManagementApplicationModule), typeof(AbpTenantManagementHttpApiModule), typeof(AbpAspNetCoreAuthenticationJwtBearerModule), - typeof(MyProjectNameApplicationContractsModule) + typeof(MyProjectNameApplicationContractsModule), + typeof(AbpSerilogModule) )] public class MyProjectNameIdentityServerModule : AbpModule { @@ -189,6 +191,7 @@ namespace MyCompanyName.MyProjectName options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API"); }); app.UseAuditing(); + app.UseSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); SeedData(context); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index 663a908ad8..cacefbdb7c 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -51,4 +51,10 @@ + + + ..\..\..\..\..\framework\src\Volo.Abp.AspNetCore.Serilog\bin\Debug\netcoreapp3.1\Volo.Abp.AspNetCore.Serilog.dll + + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs index 473bdab2cf..cabb843736 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs @@ -21,6 +21,7 @@ using Volo.Abp.AspNetCore.Mvc.UI; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; using Volo.Abp.Caching; @@ -55,7 +56,8 @@ namespace MyCompanyName.MyProjectName typeof(AbpTenantManagementWebModule), typeof(AbpTenantManagementHttpApiClientModule), typeof(AbpFeatureManagementHttpApiClientModule), - typeof(AbpPermissionManagementHttpApiClientModule) + typeof(AbpPermissionManagementHttpApiClientModule), + typeof(AbpSerilogModule) )] public class MyProjectNameWebHostModule : AbpModule { @@ -249,7 +251,7 @@ namespace MyCompanyName.MyProjectName }); app.UseAuditing(); - + app.UseSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj index 1099836b9c..35fe11e53d 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj @@ -17,6 +17,7 @@ + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs index 8390297a9f..ea653ca4a1 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs @@ -12,6 +12,7 @@ using Volo.Abp.Account; using Volo.Abp.Account.Web; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.Autofac; using Volo.Abp.Data; @@ -56,7 +57,8 @@ namespace MyCompanyName.MyProjectName typeof(AbpTenantManagementWebModule), typeof(AbpTenantManagementApplicationModule), typeof(AbpTenantManagementEntityFrameworkCoreModule), - typeof(AbpAspNetCoreMvcUiBasicThemeModule) + typeof(AbpAspNetCoreMvcUiBasicThemeModule), + typeof(AbpSerilogModule) )] public class MyProjectNameWebUnifiedModule : AbpModule { @@ -137,6 +139,7 @@ namespace MyCompanyName.MyProjectName app.UseAbpRequestLocalization(); app.UseAuditing(); + app.UseSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); using (var scope = context.ServiceProvider.CreateScope()) From 3c479b952429898a1dda770a00d3c65291d1e232 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Tu=CC=88ken?= Date: Thu, 9 Jan 2020 00:20:27 +0300 Subject: [PATCH 04/61] Adding AbpAspNetCoreSerilogEnrichersOptions. --- .../AbpAspNetCoreSerilogEnrichersOptions.cs | 21 +++++++++++++++++++ .../Serilog/AbpSerilogEnrichersConsts.cs | 10 +++++++++ .../AspNetCore/Serilog/SerilogMiddleware.cs | 19 ++++++++--------- 3 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogEnrichersOptions.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogEnrichersConsts.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogEnrichersOptions.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogEnrichersOptions.cs new file mode 100644 index 0000000000..06453cb61f --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogEnrichersOptions.cs @@ -0,0 +1,21 @@ +namespace Volo.Abp.AspNetCore.Serilog +{ + public class AbpAspNetCoreSerilogEnrichersOptions + { + public string TenantIdEnricherPropertyName { get; set; } + + public string UserIdEnricherPropertyName { get; set; } + + public string ClientIdEnricherPropertyName { get; set; } + + public string CorrelationIdPropertyName { get; set; } + + public AbpAspNetCoreSerilogEnrichersOptions() + { + TenantIdEnricherPropertyName = AbpSerilogEnrichersConsts.TenantIdEnricherPropertyName; + UserIdEnricherPropertyName = AbpSerilogEnrichersConsts.UserIdEnricherPropertyName; + ClientIdEnricherPropertyName = AbpSerilogEnrichersConsts.ClientIdEnricherPropertyName; + CorrelationIdPropertyName = AbpSerilogEnrichersConsts.CorrelationIdPropertyName; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogEnrichersConsts.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogEnrichersConsts.cs new file mode 100644 index 0000000000..bf2832b553 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogEnrichersConsts.cs @@ -0,0 +1,10 @@ +namespace Volo.Abp.AspNetCore.Serilog +{ + public class AbpSerilogEnrichersConsts + { + public const string TenantIdEnricherPropertyName = "TenantId"; + public const string UserIdEnricherPropertyName = "UserId"; + public const string ClientIdEnricherPropertyName = "ClientId"; + public const string CorrelationIdPropertyName = "CorrelationId"; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/SerilogMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/SerilogMiddleware.cs index 10bbdb188f..e03bcd5342 100644 --- a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/SerilogMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/SerilogMiddleware.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Options; using Serilog.Context; using Serilog.Core; using Serilog.Core.Enrichers; @@ -14,26 +15,24 @@ namespace Volo.Abp.AspNetCore.Serilog { public class SerilogMiddleware : IMiddleware, ITransientDependency { - private const string TenantEnricherPropertyName = "TenantId"; - private const string UserEnricherPropertyName = "UserId"; - private const string ClientEnricherPropertyName = "ClientId"; - private const string CorrelationIdPropertyName = "CorrelationId"; - private readonly ICurrentClient _currentClient; private readonly ICurrentTenant _currentTenant; private readonly ICurrentUser _currentUser; private readonly ICorrelationIdProvider _correlationIdProvider; + private readonly AbpAspNetCoreSerilogEnrichersOptions _options; public SerilogMiddleware( ICurrentTenant currentTenant, ICurrentUser currentUser, ICurrentClient currentClient, - ICorrelationIdProvider correlationIdProvider) + ICorrelationIdProvider correlationIdProvider, + IOptions options) { _currentTenant = currentTenant; _currentUser = currentUser; _currentClient = currentClient; _correlationIdProvider = correlationIdProvider; + _options = options.Value; } public async Task InvokeAsync(HttpContext context, RequestDelegate next) @@ -42,23 +41,23 @@ namespace Volo.Abp.AspNetCore.Serilog if (_currentTenant?.Id != null) { - enrichers.Add(new PropertyEnricher(TenantEnricherPropertyName, _currentTenant.Id)); + enrichers.Add(new PropertyEnricher(_options.TenantIdEnricherPropertyName, _currentTenant.Id)); } if (_currentUser?.Id != null) { - enrichers.Add(new PropertyEnricher(UserEnricherPropertyName, _currentUser.Id)); + enrichers.Add(new PropertyEnricher(_options.UserIdEnricherPropertyName, _currentUser.Id)); } if (_currentClient?.Id != null) { - enrichers.Add(new PropertyEnricher(ClientEnricherPropertyName, _currentClient.Id)); + enrichers.Add(new PropertyEnricher(_options.ClientIdEnricherPropertyName, _currentClient.Id)); } var correlationId = _correlationIdProvider.Get(); if (!string.IsNullOrEmpty(correlationId)) { - enrichers.Add(new PropertyEnricher(CorrelationIdPropertyName, correlationId)); + enrichers.Add(new PropertyEnricher(_options.CorrelationIdPropertyName, correlationId)); } using (LogContext.Push(enrichers.ToArray())) From beecc1995732e37f76c49e9274dc522df541d512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Tu=CC=88ken?= Date: Thu, 9 Jan 2020 10:39:49 +0300 Subject: [PATCH 05/61] Add test project. --- framework/Volo.Abp.sln | 7 ++ .../Volo.Abp.AspNetCore.Serilog.Tests.csproj | 24 +++++ .../AspNetCore/App/AbpSerilogTestModule.cs | 39 ++++++++ .../Volo/Abp/AspNetCore/App/CollectingSink.cs | 19 ++++ .../AspNetCore/App/SerilogTestController.cs | 27 ++++++ .../Volo/Abp/AspNetCore/App/Startup.cs | 20 ++++ .../AspNetCore/Serilog/AbpSerilogTestBase.cs | 31 ++++++ .../Serilog/Serilog_Enrichers_Tests.cs | 97 +++++++++++++++++++ 8 files changed, 264 insertions(+) create mode 100644 framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj create mode 100644 framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/CollectingSink.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/SerilogTestController.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/Startup.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/AbpSerilogTestBase.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index b9a27d757f..b731aff187 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -258,6 +258,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Minify.Tests", "te EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Serilog", "src\Volo.Abp.AspNetCore.Serilog\Volo.Abp.AspNetCore.Serilog.csproj", "{3B801003-BE74-49ED-9749-DA5E99F45EBF}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Serilog.Tests", "test\Volo.Abp.AspNetCore.Serilog.Tests\Volo.Abp.AspNetCore.Serilog.Tests.csproj", "{9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -768,6 +770,10 @@ Global {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Debug|Any CPU.Build.0 = Debug|Any CPU {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Release|Any CPU.ActiveCfg = Release|Any CPU {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Release|Any CPU.Build.0 = Release|Any CPU + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -899,6 +905,7 @@ Global {928DC30D-C078-4BB4-A9F8-FE7252C67DC6} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {E69182B3-350A-43F5-A935-5EBBEBECEF97} = {447C8A77-E5F0-4538-8687-7383196D04EA} {3B801003-BE74-49ED-9749-DA5E99F45EBF} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62} = {447C8A77-E5F0-4538-8687-7383196D04EA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj new file mode 100644 index 0000000000..740c57949d --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj @@ -0,0 +1,24 @@ + + + + + + netcoreapp3.1 + Volo.Abp.AspNetCore.Serilog.Tests + Volo.Abp.AspNetCore.Serilog.Tests + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs new file mode 100644 index 0000000000..64ac0d76bc --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Builder; +using Volo.Abp.AspNetCore.MultiTenancy; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Serilog; +using Volo.Abp.AspNetCore.TestBase; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.AspNetCore.App +{ + [DependsOn( + typeof(AbpAspNetCoreTestBaseModule), + typeof(AbpAspNetCoreMvcModule), + typeof(AbpAspNetCoreMultiTenancyModule), + typeof(AbpSerilogModule), + typeof(AbpAutofacModule) + )] + public class AbpSerilogTestModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => { options.IsEnabled = true; }); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + + app.UseCorrelationId(); + app.UseRouting(); + app.UseAuthorization(); + app.UseMultiTenancy(); + app.UseAuditing(); + app.UseSerilogEnrichers(); + app.UseMvcWithDefaultRouteAndArea(); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/CollectingSink.cs b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/CollectingSink.cs new file mode 100644 index 0000000000..fe403e02ef --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/CollectingSink.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using System.Linq; +using Serilog.Core; +using Serilog.Events; + +namespace Volo.Abp.AspNetCore.App +{ + public class CollectingSink : ILogEventSink + { + public List Events { get; } = new List(); + + public LogEvent SingleEvent => Events.Single(); + + public void Emit(LogEvent logEvent) + { + Events.Add(logEvent); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/SerilogTestController.cs b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/SerilogTestController.cs new file mode 100644 index 0000000000..972af4c801 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/SerilogTestController.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Tracing; + +namespace Volo.Abp.AspNetCore.App +{ + public class SerilogTestController : AbpController + { + private readonly ICorrelationIdProvider _correlationIdProvider; + + public SerilogTestController(ICorrelationIdProvider correlationIdProvider) + { + _correlationIdProvider = correlationIdProvider; + } + + public ActionResult Index() + { + return Content("Index-Result"); + } + + public ActionResult CorrelationId() + { + return Content(_correlationIdProvider.Get()); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/Startup.cs b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/Startup.cs new file mode 100644 index 0000000000..a1a58100d5 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/Startup.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace Volo.Abp.AspNetCore.App +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env,ILoggerFactory loggerFactory) + { + app.InitializeApplication(); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/AbpSerilogTestBase.cs b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/AbpSerilogTestBase.cs new file mode 100644 index 0000000000..96a13ac45b --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/AbpSerilogTestBase.cs @@ -0,0 +1,31 @@ +using System.Linq; +using Microsoft.Extensions.Hosting; +using Serilog; +using Serilog.Events; +using Volo.Abp.AspNetCore.App; + +namespace Volo.Abp.AspNetCore.Serilog +{ + public class AbpSerilogTestBase : AbpAspNetCoreTestBase + { + protected readonly CollectingSink CollectingSink = new CollectingSink(); + + protected override IHostBuilder CreateHostBuilder() + { + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Information() + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .Enrich.FromLogContext() + .WriteTo.Sink(CollectingSink) + .CreateLogger(); + + return base.CreateHostBuilder() + .UseSerilog(); + } + + protected LogEvent GetLogEvent(string text) + { + return CollectingSink.Events.FirstOrDefault(m => m.MessageTemplate.Text == text); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs new file mode 100644 index 0000000000..bc45eb7c51 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs @@ -0,0 +1,97 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Serilog.Events; +using Shouldly; +using Volo.Abp.AspNetCore.App; +using Volo.Abp.AspNetCore.MultiTenancy; +using Volo.Abp.MultiTenancy; +using Volo.Abp.MultiTenancy.ConfigurationStore; +using Xunit; + +namespace Volo.Abp.AspNetCore.Serilog +{ + public class Serilog_Enrichers_Tests : AbpSerilogTestBase + { + private const string ExecutedEndpointLogEventText = "Executed endpoint '{EndpointName}'"; + + private readonly Guid _testTenantId = Guid.NewGuid(); + private readonly string _testTenantName = "acme"; + + private readonly AbpAspNetCoreMultiTenancyOptions _tenancyOptions; + private readonly AbpAspNetCoreSerilogEnrichersOptions _serilogEnrichersOptions; + private readonly ILogger _logger; + + public Serilog_Enrichers_Tests() + { + _tenancyOptions = ServiceProvider.GetRequiredService>().Value; + _serilogEnrichersOptions = + ServiceProvider.GetRequiredService>().Value; + _logger = ServiceProvider.GetRequiredService>(); + } + + protected override IHostBuilder CreateHostBuilder() + { + return base.CreateHostBuilder().ConfigureServices(services => + { + services.Configure(options => + { + options.Tenants = new[] + { + new TenantConfiguration(_testTenantId, _testTenantName) + }; + }); + }); + } + + [Fact] + public async Task TenantId_Not_Set_Test() + { + var url = GetUrl(nameof(SerilogTestController.Index)); + var result = await GetResponseAsStringAsync(url).ConfigureAwait(false); + + var executedLogEvent = GetLogEvent(ExecutedEndpointLogEventText); + + executedLogEvent.ShouldNotBeNull(); + executedLogEvent.Properties.ContainsKey(_serilogEnrichersOptions.TenantIdEnricherPropertyName) + .ShouldBe(false); + } + + [Fact] + public async Task TenantId_Set_Test() + { + var url = + GetUrl(nameof(SerilogTestController.Index)) + + $"?{_tenancyOptions.TenantKey}={_testTenantName}"; + var result = await GetResponseAsStringAsync(url).ConfigureAwait(false); + + var executedLogEvent = GetLogEvent(ExecutedEndpointLogEventText); + + executedLogEvent.ShouldNotBeNull(); + executedLogEvent.Properties.ContainsKey(_serilogEnrichersOptions.TenantIdEnricherPropertyName) + .ShouldBe(true); + ((ScalarValue) executedLogEvent.Properties[_serilogEnrichersOptions.TenantIdEnricherPropertyName]).Value + .ShouldBe(_testTenantId); + } + + [Fact] + public async Task CorrelationId_Enrichers_Test() + { + var url = GetUrl(nameof(SerilogTestController.CorrelationId)); + var result = await GetResponseAsStringAsync(url).ConfigureAwait(false); + + var executedLogEvent = GetLogEvent(ExecutedEndpointLogEventText); + + executedLogEvent.ShouldNotBeNull(); + + executedLogEvent.Properties.ContainsKey(_serilogEnrichersOptions.CorrelationIdPropertyName) + .ShouldNotBeNull(); + + ((ScalarValue) executedLogEvent.Properties[_serilogEnrichersOptions.CorrelationIdPropertyName]).Value + .ShouldBe(result); + } + } +} \ No newline at end of file From c3669cc208512684adceacba8a7ccfa96731fe83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Tu=CC=88ken?= Date: Thu, 9 Jan 2020 10:40:23 +0300 Subject: [PATCH 06/61] Add Volo.Abp.AspNetCore.Serilog to common.ps1 --- nupkg/common.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index eeac13eac8..a582f8c115 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -40,6 +40,7 @@ $projects = ( "framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", "framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared", "framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets", + "framework/src/Volo.Abp.AspNetCore.Serilog", "framework/src/Volo.Abp.AspNetCore.TestBase", "framework/src/Volo.Abp.Auditing", "framework/src/Volo.Abp.Authorization", From e84dde4f76abf5ccb45036afce868bde9266e4f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Tu=CC=88ken?= Date: Thu, 9 Jan 2020 11:06:50 +0300 Subject: [PATCH 07/61] Change Serilog.Extensions.Hosting package to Serilog.AspNetCore. --- .../Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj | 2 +- .../app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj | 2 +- .../Volo.ClientSimulation.Demo.csproj | 2 +- modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj | 2 +- .../Acme.BookStore.HttpApi.Host.csproj | 2 +- .../src/Acme.BookStore.Web/Acme.BookStore.Web.csproj | 2 +- .../Acme.BookStore.BookManagement.HttpApi.Host.csproj | 2 +- .../Acme.BookStore.BookManagement.IdentityServer.csproj | 2 +- .../Acme.BookStore.BookManagement.Web.Host.csproj | 2 +- .../Acme.BookStore.BookManagement.Web.Unified.csproj | 2 +- .../BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj | 2 +- .../src/DashboardDemo.Web/DashboardDemo.Web.csproj | 2 +- .../applications/AuthServer.Host/AuthServer.Host.csproj | 2 +- .../BackendAdminApp.Host/BackendAdminApp.Host.csproj | 2 +- .../applications/PublicWebSite.Host/PublicWebSite.Host.csproj | 2 +- .../BackendAdminAppGateway.Host.csproj | 2 +- .../gateways/InternalGateway.Host/InternalGateway.Host.csproj | 2 +- .../PublicWebSiteGateway.Host/PublicWebSiteGateway.Host.csproj | 2 +- .../BloggingService.Host/BloggingService.Host.csproj | 2 +- .../IdentityService.Host/IdentityService.Host.csproj | 2 +- .../ProductService.Host/ProductService.Host.csproj | 2 +- .../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 2 +- .../MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj | 2 +- .../MyCompanyName.MyProjectName.IdentityServer.csproj | 2 +- .../MyCompanyName.MyProjectName.Web.Host.csproj | 2 +- .../MyCompanyName.MyProjectName.Web.csproj | 2 +- .../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 2 +- .../MyCompanyName.MyProjectName.IdentityServer.csproj | 2 +- .../MyCompanyName.MyProjectName.Web.Host.csproj | 2 +- .../MyCompanyName.MyProjectName.Web.Unified.csproj | 2 +- 30 files changed, 30 insertions(+), 30 deletions(-) diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj index 3384fcf332..931eb63088 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj @@ -9,7 +9,7 @@ - + diff --git a/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj b/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj index 750481d6a1..1ef5fb5c4c 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj +++ b/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj @@ -12,7 +12,7 @@ - + diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj index 8544cf6cff..0f9f7bde5e 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj @@ -8,7 +8,7 @@ - + diff --git a/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj index ef8fc992e3..c5e164247b 100644 --- a/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj +++ b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj @@ -14,7 +14,7 @@ - + diff --git a/samples/BookStore-Angular-MongoDb/aspnet-core/src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.csproj b/samples/BookStore-Angular-MongoDb/aspnet-core/src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.csproj index 46638e1958..ad0861edc7 100644 --- a/samples/BookStore-Angular-MongoDb/aspnet-core/src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.csproj +++ b/samples/BookStore-Angular-MongoDb/aspnet-core/src/Acme.BookStore.HttpApi.Host/Acme.BookStore.HttpApi.Host.csproj @@ -10,7 +10,7 @@ - + diff --git a/samples/BookStore-Modular/application/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj b/samples/BookStore-Modular/application/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj index b71bc65d91..9d4115179c 100644 --- a/samples/BookStore-Modular/application/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj +++ b/samples/BookStore-Modular/application/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj @@ -32,7 +32,7 @@ - + diff --git a/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.HttpApi.Host/Acme.BookStore.BookManagement.HttpApi.Host.csproj b/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.HttpApi.Host/Acme.BookStore.BookManagement.HttpApi.Host.csproj index db35047e19..60f118bc93 100644 --- a/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.HttpApi.Host/Acme.BookStore.BookManagement.HttpApi.Host.csproj +++ b/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.HttpApi.Host/Acme.BookStore.BookManagement.HttpApi.Host.csproj @@ -10,7 +10,7 @@ - + diff --git a/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.IdentityServer/Acme.BookStore.BookManagement.IdentityServer.csproj b/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.IdentityServer/Acme.BookStore.BookManagement.IdentityServer.csproj index c0eebd425a..d9b39f407e 100644 --- a/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.IdentityServer/Acme.BookStore.BookManagement.IdentityServer.csproj +++ b/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.IdentityServer/Acme.BookStore.BookManagement.IdentityServer.csproj @@ -8,7 +8,7 @@ - + diff --git a/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.Web.Host/Acme.BookStore.BookManagement.Web.Host.csproj b/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.Web.Host/Acme.BookStore.BookManagement.Web.Host.csproj index 0534b56365..1df46016b4 100644 --- a/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.Web.Host/Acme.BookStore.BookManagement.Web.Host.csproj +++ b/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.Web.Host/Acme.BookStore.BookManagement.Web.Host.csproj @@ -10,7 +10,7 @@ - + diff --git a/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.Web.Unified/Acme.BookStore.BookManagement.Web.Unified.csproj b/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.Web.Unified/Acme.BookStore.BookManagement.Web.Unified.csproj index 9fb034d5fe..04993f9b69 100644 --- a/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.Web.Unified/Acme.BookStore.BookManagement.Web.Unified.csproj +++ b/samples/BookStore-Modular/modules/book-management/host/Acme.BookStore.BookManagement.Web.Unified/Acme.BookStore.BookManagement.Web.Unified.csproj @@ -10,7 +10,7 @@ - + diff --git a/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj b/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj index 153b6f38e3..832114ce3b 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj +++ b/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj @@ -23,7 +23,7 @@ - + diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/DashboardDemo.Web.csproj b/samples/DashboardDemo/src/DashboardDemo.Web/DashboardDemo.Web.csproj index 466a7359bc..f00f144407 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Web/DashboardDemo.Web.csproj +++ b/samples/DashboardDemo/src/DashboardDemo.Web/DashboardDemo.Web.csproj @@ -31,7 +31,7 @@ - + diff --git a/samples/MicroserviceDemo/applications/AuthServer.Host/AuthServer.Host.csproj b/samples/MicroserviceDemo/applications/AuthServer.Host/AuthServer.Host.csproj index 337657a831..47bf7813f8 100644 --- a/samples/MicroserviceDemo/applications/AuthServer.Host/AuthServer.Host.csproj +++ b/samples/MicroserviceDemo/applications/AuthServer.Host/AuthServer.Host.csproj @@ -12,7 +12,7 @@ - + diff --git a/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BackendAdminApp.Host.csproj b/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BackendAdminApp.Host.csproj index 911593b16a..a22e073228 100644 --- a/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BackendAdminApp.Host.csproj +++ b/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BackendAdminApp.Host.csproj @@ -12,7 +12,7 @@ - + diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/PublicWebSite.Host.csproj b/samples/MicroserviceDemo/applications/PublicWebSite.Host/PublicWebSite.Host.csproj index 5574e33b3b..3b4780b2cd 100644 --- a/samples/MicroserviceDemo/applications/PublicWebSite.Host/PublicWebSite.Host.csproj +++ b/samples/MicroserviceDemo/applications/PublicWebSite.Host/PublicWebSite.Host.csproj @@ -12,7 +12,7 @@ - + diff --git a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGateway.Host.csproj b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGateway.Host.csproj index 9d2d4c3cae..554555940d 100644 --- a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGateway.Host.csproj +++ b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGateway.Host.csproj @@ -12,7 +12,7 @@ - + diff --git a/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGateway.Host.csproj b/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGateway.Host.csproj index 8d7d8bf135..73479d93ad 100644 --- a/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGateway.Host.csproj +++ b/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGateway.Host.csproj @@ -12,7 +12,7 @@ - + diff --git a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGateway.Host.csproj b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGateway.Host.csproj index 2c01555e87..8ece4fe5f4 100644 --- a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGateway.Host.csproj +++ b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGateway.Host.csproj @@ -12,7 +12,7 @@ - + diff --git a/samples/MicroserviceDemo/microservices/BloggingService.Host/BloggingService.Host.csproj b/samples/MicroserviceDemo/microservices/BloggingService.Host/BloggingService.Host.csproj index 5a9c5375d0..cd5bbc8b01 100644 --- a/samples/MicroserviceDemo/microservices/BloggingService.Host/BloggingService.Host.csproj +++ b/samples/MicroserviceDemo/microservices/BloggingService.Host/BloggingService.Host.csproj @@ -12,7 +12,7 @@ - + diff --git a/samples/MicroserviceDemo/microservices/IdentityService.Host/IdentityService.Host.csproj b/samples/MicroserviceDemo/microservices/IdentityService.Host/IdentityService.Host.csproj index 09e91582ab..b9dd199a6c 100644 --- a/samples/MicroserviceDemo/microservices/IdentityService.Host/IdentityService.Host.csproj +++ b/samples/MicroserviceDemo/microservices/IdentityService.Host/IdentityService.Host.csproj @@ -12,7 +12,7 @@ - + diff --git a/samples/MicroserviceDemo/microservices/ProductService.Host/ProductService.Host.csproj b/samples/MicroserviceDemo/microservices/ProductService.Host/ProductService.Host.csproj index f871ed5983..dc4f6aface 100644 --- a/samples/MicroserviceDemo/microservices/ProductService.Host/ProductService.Host.csproj +++ b/samples/MicroserviceDemo/microservices/ProductService.Host/ProductService.Host.csproj @@ -12,7 +12,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index 173d10bbc2..d41d991542 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -10,7 +10,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj index f59176e5af..9c7f66798e 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj @@ -10,7 +10,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj index e040f9642d..6ff7bde240 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj @@ -32,7 +32,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index ecdd1446fa..0bff1f34fc 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -16,7 +16,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index 6cf7d25498..db3998cc62 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -32,7 +32,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index 07979b3f63..f041445109 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -10,7 +10,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj index 062dceabaf..2815d81262 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj @@ -8,7 +8,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index cacefbdb7c..6d6b11231a 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -10,7 +10,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj index 35fe11e53d..47f8629dde 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj @@ -10,7 +10,7 @@ - + From 9aece8dc421cb65a26c11b54f35e0a26ad573f80 Mon Sep 17 00:00:00 2001 From: mperk Date: Thu, 9 Jan 2020 14:44:10 +0300 Subject: [PATCH 08/61] updatable permissionGrant provider key --- .../Volo.Abp.PermissionManagement.sln | 4 ++-- .../PermissionManagement/IPermissionManager.cs | 2 ++ .../Abp/PermissionManagement/PermissionGrant.cs | 2 +- .../Abp/PermissionManagement/PermissionManager.cs | 6 ++++++ ....PermissionManagement.Application.Tests.csproj | 2 +- ....Abp.PermissionManagement.Domain.Tests.csproj} | 0 .../PermissionManager_Tests.cs | 15 +++++++++++++++ 7 files changed, 27 insertions(+), 4 deletions(-) rename modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/{Volo.Abp.PermissionManagement.Tests.csproj => Volo.Abp.PermissionManagement.Domain.Tests.csproj} (100%) diff --git a/modules/permission-management/Volo.Abp.PermissionManagement.sln b/modules/permission-management/Volo.Abp.PermissionManagement.sln index 5812918a3c..16071f9e10 100644 --- a/modules/permission-management/Volo.Abp.PermissionManagement.sln +++ b/modules/permission-management/Volo.Abp.PermissionManagement.sln @@ -19,7 +19,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManageme EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.Web", "src\Volo.Abp.PermissionManagement.Web\Volo.Abp.PermissionManagement.Web.csproj", "{97A386F8-DAE0-4BEA-ADE5-1D57C3336515}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.Tests", "test\Volo.Abp.PermissionManagement.Tests\Volo.Abp.PermissionManagement.Tests.csproj", "{48297098-79D0-413B-939C-6C432142C42D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.Domain.Tests", "test\Volo.Abp.PermissionManagement.Tests\Volo.Abp.PermissionManagement.Domain.Tests.csproj", "{48297098-79D0-413B-939C-6C432142C42D}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.TestBase", "test\Volo.Abp.PermissionManagement.TestBase\Volo.Abp.PermissionManagement.TestBase.csproj", "{49259427-CAEB-4FAE-81E4-848F789487EA}" EndProject @@ -33,7 +33,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManageme EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.HttpApi.Client", "src\Volo.Abp.PermissionManagement.HttpApi.Client\Volo.Abp.PermissionManagement.HttpApi.Client.csproj", "{1CD80519-9431-48DB-B0EA-291A73FF9F49}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.Application.Tests", "test\Volo.Abp.PermissionManagement.Application.Tests\Volo.Abp.PermissionManagement.Application.Tests.csproj", "{A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.Application.Tests", "test\Volo.Abp.PermissionManagement.Application.Tests\Volo.Abp.PermissionManagement.Application.Tests.csproj", "{A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManager.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManager.cs index 888f06235e..26310a12fe 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManager.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManager.cs @@ -13,5 +13,7 @@ namespace Volo.Abp.PermissionManagement Task> GetAllAsync([NotNull] string providerName, [NotNull] string providerKey); Task SetAsync(string permissionName, string providerName, string providerKey, bool isGranted); + + Task UpdateProviderKeyAsync(PermissionGrant permissionGrant, string providerKey); } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrant.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrant.cs index 7ec99fbe3a..4f951a92cc 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrant.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrant.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.PermissionManagement public virtual string ProviderName { get; protected set; } [CanBeNull] - public virtual string ProviderKey { get; protected set; } + public virtual string ProviderKey { get; protected internal set; } protected PermissionGrant() { diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs index d7d1dd70c1..4f7d177802 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs @@ -99,6 +99,12 @@ namespace Volo.Abp.PermissionManagement await provider.SetAsync(permissionName, providerKey, isGranted).ConfigureAwait(false); } + public async Task UpdateProviderKeyAsync(PermissionGrant permissionGrant, string providerKey) + { + permissionGrant.ProviderKey = providerKey; + return await PermissionGrantRepository.UpdateAsync(permissionGrant).ConfigureAwait(false); + } + protected virtual async Task GetInternalAsync(PermissionDefinition permission, string providerName, string providerKey) { var result = new PermissionWithGrantedProviders(permission.Name, false); diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj index 92cd6ddd5d..81e3861ed9 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo.Abp.PermissionManagement.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj similarity index 100% rename from modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo.Abp.PermissionManagement.Tests.csproj rename to modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs index 6b838a4fc0..66f0de1755 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs @@ -104,5 +104,20 @@ namespace Volo.Abp.PermissionManagement true).ConfigureAwait(false)).ConfigureAwait(false); } + [Fact] + public async Task UpdateProviderKey() + { + await _permissionGrantRepository.InsertAsync(new PermissionGrant( + Guid.NewGuid(), + "MyPermission1", + "Test", + "Test") + ).ConfigureAwait(false); + var permissionGrant = await _permissionGrantRepository.FindAsync("MyPermission1", "Test", "Test").ConfigureAwait(false); + permissionGrant.ProviderKey.ShouldBe("Test"); + + await _permissionManager.UpdateProviderKeyAsync(permissionGrant, "NewProviderKey").ConfigureAwait(false); + (await _permissionGrantRepository.FindAsync("MyPermission1", "Test", "NewProviderKey").ConfigureAwait(false)).ShouldNotBeNull(); + } } } From 27c565fc1efde688a7c956480acaf9084563e97e Mon Sep 17 00:00:00 2001 From: mperk Date: Thu, 9 Jan 2020 14:48:20 +0300 Subject: [PATCH 09/61] event permissions update when role update --- .../Volo/Abp/Identity/IdentityRole.cs | 16 +++++ .../Identity/IdentityRoleNameChangedEvent.cs | 8 +++ .../Volo/Abp/Identity/IdentityRoleStore.cs | 2 +- ...ermissionManagement.Domain.Identity.csproj | 1 + .../Identity/RoleUpdateEventHandler.cs | 42 ++++++++++++++ .../Abp/Identity/RoleChangingEvents_Test.cs | 58 +++++++++++++++++++ 6 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleNameChangedEvent.cs create mode 100644 modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleUpdateEventHandler.cs create mode 100644 modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/RoleChangingEvents_Test.cs diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs index 825266e993..dac173719a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs @@ -100,6 +100,22 @@ namespace Volo.Abp.Identity Claims.RemoveAll(c => c.ClaimType == claim.Type && c.ClaimValue == claim.Value); } + public virtual void ChangeName(string name) + { + Check.NotNullOrWhiteSpace(name, nameof(name)); + + var oldName = Name; + Name = name; + + AddLocalEvent( + new IdentityRoleNameChangedEvent + { + IdentityRole = this, + OldName = oldName + } + ); + } + public override string ToString() { return $"{base.ToString()}, Name = {Name}"; diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleNameChangedEvent.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleNameChangedEvent.cs new file mode 100644 index 0000000000..f14f0a71ed --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleNameChangedEvent.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.Identity +{ + public class IdentityRoleNameChangedEvent + { + public IdentityRole IdentityRole { get; set; } + public string OldName { get; set; } + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleStore.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleStore.cs index 1ca46b0830..004fc0c20c 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleStore.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleStore.cs @@ -165,7 +165,7 @@ namespace Volo.Abp.Identity Check.NotNull(role, nameof(role)); - role.Name = roleName; + role.ChangeName(roleName); return Task.CompletedTask; } diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj index ea663ba49b..ee8e336088 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj @@ -16,6 +16,7 @@ + diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleUpdateEventHandler.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleUpdateEventHandler.cs new file mode 100644 index 0000000000..8ee0d4c6d6 --- /dev/null +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleUpdateEventHandler.cs @@ -0,0 +1,42 @@ +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.EventBus; +using Volo.Abp.Identity; + +namespace Volo.Abp.PermissionManagement.Identity +{ + public class RoleUpdateEventHandler : + ILocalEventHandler, + ITransientDependency + { + protected IIdentityRoleRepository RoleRepository { get; } + protected IPermissionManager PermissionManager { get; } + protected IPermissionGrantRepository PermissionGrantRepository { get; } + + public RoleUpdateEventHandler( + IIdentityRoleRepository roleRepository, + IPermissionManager permissionManager, + IPermissionGrantRepository permissionGrantRepository) + { + RoleRepository = roleRepository; + PermissionManager = permissionManager; + PermissionGrantRepository = permissionGrantRepository; + } + + public async Task HandleEventAsync(IdentityRoleNameChangedEvent eventData) + { + var role = await RoleRepository.FindAsync(eventData.IdentityRole.Id, false).ConfigureAwait(false); + if (role == null) + { + return; + } + + var permissionGrantsInRole = await PermissionGrantRepository.GetListAsync("R", eventData.OldName).ConfigureAwait(false); + foreach (var permissionGrant in permissionGrantsInRole) + { + await PermissionManager.UpdateProviderKeyAsync(permissionGrant, eventData.IdentityRole.Name).ConfigureAwait(false); + } + } + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/RoleChangingEvents_Test.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/RoleChangingEvents_Test.cs new file mode 100644 index 0000000000..1a4405c9e4 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/RoleChangingEvents_Test.cs @@ -0,0 +1,58 @@ +using Microsoft.AspNetCore.Identity; +using Shouldly; +using System.Threading.Tasks; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Guids; +using Volo.Abp.PermissionManagement; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.Identity +{ + public class RoleChangingEvents_Test : AbpIdentityDomainTestBase + { + protected readonly IIdentityRoleRepository RoleRepository; + protected readonly IPermissionGrantRepository PermissionGrantRepository; + protected readonly IdentityRoleManager RoleManager; + protected readonly ILookupNormalizer LookupNormalizer; + protected readonly IGuidGenerator GuidGenerator; + protected readonly IUnitOfWorkManager UowManager; + + public RoleChangingEvents_Test() + { + RoleRepository = GetRequiredService(); ; + PermissionGrantRepository = GetRequiredService(); ; + RoleManager = GetRequiredService(); ; + LookupNormalizer = GetRequiredService(); ; + GuidGenerator = GetRequiredService(); + UowManager = GetRequiredService(); + } + + [Fact] + public async Task Role_Update_Event_Test() + { + var role = await RoleRepository + .FindByNormalizedNameAsync(LookupNormalizer.NormalizeName("moderator")) + .ConfigureAwait(false); + + var permissionGrantsInRole = await PermissionGrantRepository.GetListAsync("R", role.Name).ConfigureAwait(false); + permissionGrantsInRole.ShouldNotBeNull(); + permissionGrantsInRole.Count.ShouldBeGreaterThan(0); + var count = permissionGrantsInRole.Count; + + using (var uow = UowManager.Begin()) + { + var identityResult = await RoleManager.SetRoleNameAsync(role, "TestModerator").ConfigureAwait(false); + identityResult.Succeeded.ShouldBeTrue(); + var xx = await RoleRepository.UpdateAsync(role).ConfigureAwait(false); + await uow.CompleteAsync().ConfigureAwait(false); + } + + role = await RoleRepository.GetAsync(role.Id).ConfigureAwait(false); + role.Name.ShouldBe("TestModerator"); + + permissionGrantsInRole = await PermissionGrantRepository.GetListAsync("R", role.Name).ConfigureAwait(false); + permissionGrantsInRole.Count.ShouldBe(count); + } + } +} From 78e4429bcc3ea6e707097b3ba243072d5e3652ed Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 19:18:01 +0300 Subject: [PATCH 10/61] feat(theme-shared): add toast-container component related issue: #2537 --- .../toast-container.component.html | 11 +++++ .../toast-container.component.scss | 12 +++++ .../toast-container.component.ts | 46 +++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html new file mode 100644 index 0000000000..c3529e99ff --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html @@ -0,0 +1,11 @@ +
+ +
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss new file mode 100644 index 0000000000..facbd8b838 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss @@ -0,0 +1,12 @@ +.toast-container { + position: fixed; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-end; + min-width: 350px; + min-height: 80px; + &.new-on-top { + flex-direction: column-reverse; + } +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts new file mode 100644 index 0000000000..4c664bb5d2 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts @@ -0,0 +1,46 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Toaster } from '../../models'; +import { toastInOut } from '../../animations'; +import { ToasterService } from '../../services/toaster.service'; + +@Component({ + selector: 'abp-toast-container', + templateUrl: './toast-container.component.html', + styleUrls: ['./toast-container.component.scss'], + animations: [toastInOut], +}) +export class ToastContainerComponent implements OnInit { + toasts = [] as Toaster.Toast[]; + + @Input() + top: number; + + @Input() + right: number; + + @Input() + bottom: number; + + @Input() + left: number; + + @Input() + toastKey: string; + + constructor(private toastService: ToasterService) {} + + ngOnInit() { + this.toastService.toasts$.subscribe(toasts => { + this.toasts = this.toastKey + ? toasts.filter(t => { + return t.options && t.options.containerKey !== this.toastKey; + }) + : toasts; + }); + } + + trackByFunc(index, toast) { + if (!toast) return null; + return toast.options.id; + } +} From e34d9db20af5ae55412ce3dc377749f4fdffd7d0 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 19:19:03 +0300 Subject: [PATCH 11/61] refactor(theme-shared): change toast component and its style --- .../lib/components/toast/toast.component.html | 16 ++++ .../lib/components/toast/toast.component.scss | 77 ++++++++++++++++ .../lib/components/toast/toast.component.ts | 87 ++++++++++++++----- 3 files changed, 158 insertions(+), 22 deletions(-) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html new file mode 100644 index 0000000000..6e6aa2b641 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html @@ -0,0 +1,16 @@ +
+
+ +
+
+ +
+ {{ toast.title | abpLocalization: messageLocalizationParams }} +
+
+ {{ toast.message | abpLocalization: titleLocalizationParams }} +
+
+
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss new file mode 100644 index 0000000000..98ce628954 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss @@ -0,0 +1,77 @@ +@mixin fillColor($background, $color) { + border: 2px solid $background; + background-color: $background; + color: $color; + box-shadow: 0 0 10px -5px rgba(#000, 0.4); + &:hover { + border: 2px solid darken($background, 5); + background-color: darken($background, 5); + box-shadow: 0 0 15px -5px rgba(#000, 0.4); + } +} + +.toast { + display: grid; + grid-template-columns: 50px 1fr; + gap: 10px; + margin: 5px 0; + padding: 10px; + border-radius: 0px; + width: 350px; + @include fillColor(#f0f0f0, #000); + user-select: none; + box-shadow: 0 0 10px -5px rgba(#000, 0.4); + &.toast-success { + @include fillColor(#51a351, #fff); + } + &.toast-info { + @include fillColor(#2f96b4, #fff); + } + &.toast-warning { + @include fillColor(#f89406, #fff); + } + &.toast-error { + @include fillColor(#bd362f, #fff); + } + .toast-icon { + display: flex; + align-items: center; + justify-content: center; + .icon { + } + } + .toast-content { + position: relative; + .close-button { + position: absolute; + top: 0; + right: 0; + display: flex; + align-items: center; + justify-content: center; + margin: 0; + padding: 5px 10px 5px 5px; + width: 25px; + height: 25px; + border: none; + border-radius: 50%; + background: transparent; + &:focus { + outline: none; + } + .close-icon { + width: 16px; + height: 16px; + stroke: #000; + } + } + .toast-title { + margin: 0; + padding: 0; + font-size: 1rem; + font-weight: 600; + } + .toast-message { + } + } +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts index 5d21a535e8..afdf73ef88 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts @@ -1,26 +1,69 @@ -import { Component } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; +import { Toaster } from '../../models'; +import { ToasterService } from '../../services/toaster.service'; +import { LocalizationService } from '@abp/ng.core'; @Component({ selector: 'abp-toast', - // tslint:disable-next-line: component-max-inline-declarations - template: ` - - - -
-
{{ message.summary | abpLocalization: message.titleLocalizationParams }}
-
{{ message.detail | abpLocalization: message.messageLocalizationParams }}
-
-
-
- `, + templateUrl: './toast.component.html', + styleUrls: ['./toast.component.scss'], }) -export class ToastComponent {} +export class ToastComponent implements OnInit { + @Input() + toast: Toaster.Toast; + + get severityClass(): string { + if (!this.toast || !this.toast.severity) return ''; + return `toast-${this.toast.severity}`; + } + + get iconClass(): string { + switch (this.toast.severity) { + case 'success': + return 'fa-check-circle'; + case 'info': + return 'fa-info-circle'; + case 'warning': + return 'fa-exclamation-triangle'; + case 'error': + return 'fa-times-circle'; + default: + return 'fa-exclamation-circle'; + } + } + + get titleLocalizationParams(): string { + return this.localizationService.instant( + this.toast.title, + ...this.toast.options.titleLocalizationParams, + ); + } + + get messageLocalizationParams() { + return this.localizationService.instant( + this.toast.message, + ...this.toast.options.messageLocalizationParams, + ); + } + + constructor( + private toastService: ToasterService, + private localizationService: LocalizationService, + ) {} + + ngOnInit() { + if (this.toast.options && this.toast.options.sticky) return; + const timeout = this.toast.options.life || 5000; + setTimeout(() => { + this.close(); + }, timeout); + } + + close() { + this.toastService.remove(this.toast.options.id); + } + + tap() { + if (this.toast.options && this.toast.options.tapToDismiss) this.close(); + } +} From f085267d12b1693e233a0b6b30227f685e819ce5 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 19:19:52 +0300 Subject: [PATCH 12/61] refactor(theme-shared): remove abstract toaster class --- .../theme-shared/src/lib/abstracts/toaster.ts | 56 ------------------- 1 file changed, 56 deletions(-) delete mode 100644 npm/ng-packs/packages/theme-shared/src/lib/abstracts/toaster.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/abstracts/toaster.ts b/npm/ng-packs/packages/theme-shared/src/lib/abstracts/toaster.ts deleted file mode 100644 index d66c29fc3b..0000000000 --- a/npm/ng-packs/packages/theme-shared/src/lib/abstracts/toaster.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { MessageService } from 'primeng/components/common/messageservice'; -import { Observable, Subject } from 'rxjs'; -import { Toaster } from '../models/toaster'; -import { Config } from '@abp/ng.core'; - -export abstract class AbstractToaster { - status$: Subject; - - key = 'abpToast'; - - sticky = false; - - constructor(protected messageService: MessageService) {} - - info(message: Config.LocalizationParam, title: Config.LocalizationParam, options?: T): Observable { - return this.show(message, title, 'info', options); - } - - success(message: Config.LocalizationParam, title: Config.LocalizationParam, options?: T): Observable { - return this.show(message, title, 'success', options); - } - - warn(message: Config.LocalizationParam, title: Config.LocalizationParam, options?: T): Observable { - return this.show(message, title, 'warn', options); - } - - error(message: Config.LocalizationParam, title: Config.LocalizationParam, options?: T): Observable { - return this.show(message, title, 'error', options); - } - - protected show( - message: Config.LocalizationParam, - title: Config.LocalizationParam, - severity: Toaster.Severity, - options?: T, - ): Observable { - this.messageService.clear(this.key); - - this.messageService.add({ - severity, - detail: message || '', - summary: title || '', - ...options, - key: this.key, - ...(typeof (options || ({} as any)).sticky === 'undefined' && { sticky: this.sticky }), - }); - this.status$ = new Subject(); - return this.status$; - } - - clear(status?: Toaster.Status) { - this.messageService.clear(this.key); - this.status$.next(status || Toaster.Status.dismiss); - this.status$.complete(); - } -} From e8345efea2403442c29ccc1be00e3b40178c7fcd Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 19:20:52 +0300 Subject: [PATCH 13/61] refactor(theme-shared): change toaster types and interfaces related issue: #2537 --- .../theme-shared/src/lib/models/toaster.ts | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts index f029911dae..4f407d129d 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts @@ -1,17 +1,25 @@ export namespace Toaster { - export interface Options { - id?: any; - closable?: boolean; + export interface ToastOptions { life?: number; sticky?: boolean; - data?: any; + closable?: boolean; + tapToDismiss?: boolean; messageLocalizationParams?: string[]; titleLocalizationParams?: string[]; + id: any; + containerKey?: string; + } + + export interface Toast { + message: string; + title?: string; + severity?: string; + options?: ToastOptions; } - export type Severity = 'success' | 'info' | 'warn' | 'error'; + export type Severity = 'neutral' | 'success' | 'info' | 'warning' | 'error'; - export const enum Status { + export enum Status { confirm = 'confirm', reject = 'reject', dismiss = 'dismiss', From 13ed5e03aa013b65aa15a42ec133d9a29c4ca803 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 19:21:41 +0300 Subject: [PATCH 14/61] feat(theme-shared): import toast-container component to module related issue: #2537 --- .../theme-shared/src/lib/theme-shared.module.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts index b40a4ea05a..9cab044780 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts @@ -1,9 +1,10 @@ import { CoreModule, LazyLoadService } from '@abp/ng.core'; +import { DatePipe } from '@angular/common'; import { APP_INITIALIZER, Injector, ModuleWithProviders, NgModule } from '@angular/core'; +import { NgbDateParserFormatter } from '@ng-bootstrap/ng-bootstrap'; import { NgxValidateCoreModule } from '@ngx-validate/core'; import { MessageService } from 'primeng/components/common/messageservice'; import { ToastModule } from 'primeng/toast'; -import { forkJoin } from 'rxjs'; import { BreadcrumbComponent } from './components/breadcrumb/breadcrumb.component'; import { ButtonComponent } from './components/button/button.component'; import { ChartComponent } from './components/chart/chart.component'; @@ -13,16 +14,15 @@ import { LoaderBarComponent } from './components/loader-bar/loader-bar.component import { ModalComponent } from './components/modal/modal.component'; import { SortOrderIconComponent } from './components/sort-order-icon/sort-order-icon.component'; import { TableEmptyMessageComponent } from './components/table-empty-message/table-empty-message.component'; +import { ToastContainerComponent } from './components/toast-container/toast-container.component'; import { ToastComponent } from './components/toast/toast.component'; import styles from './constants/styles'; import { TableSortDirective } from './directives/table-sort.directive'; import { ErrorHandler } from './handlers/error.handler'; -import { chartJsLoaded$ } from './utils/widget-utils'; import { RootParams } from './models/common'; -import { HTTP_ERROR_CONFIG, httpErrorConfigFactory } from './tokens/http-error.token'; -import { NgbDateParserFormatter } from '@ng-bootstrap/ng-bootstrap'; +import { httpErrorConfigFactory, HTTP_ERROR_CONFIG } from './tokens/http-error.token'; import { DateParserFormatter } from './utils/date-parser-formatter'; -import { DatePipe } from '@angular/common'; +import { chartJsLoaded$ } from './utils/widget-utils'; export function appendScript(injector: Injector) { const fn = () => { @@ -47,6 +47,7 @@ export function appendScript(injector: Injector) { ModalComponent, TableEmptyMessageComponent, ToastComponent, + ToastContainerComponent, SortOrderIconComponent, TableSortDirective, ], @@ -59,6 +60,7 @@ export function appendScript(injector: Injector) { ModalComponent, TableEmptyMessageComponent, ToastComponent, + ToastContainerComponent, SortOrderIconComponent, TableSortDirective, ], From 547d1a8a205d8b8bddcd41173d7449ccda796aff Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 19:22:06 +0300 Subject: [PATCH 15/61] feat(theme-shared): add toast in and out animations --- .../src/lib/animations/toast.animations.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/animations/toast.animations.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/animations/toast.animations.ts b/npm/ng-packs/packages/theme-shared/src/lib/animations/toast.animations.ts new file mode 100644 index 0000000000..7ac6a7519b --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/animations/toast.animations.ts @@ -0,0 +1,17 @@ +import { animate, query, style, transition, trigger } from '@angular/animations'; + +export const toastInOut = trigger('toastInOut', [ + transition('* <=> *', [ + query( + ':enter', + [ + style({ opacity: 0, transform: 'translateY(20px)' }), + animate('350ms ease', style({ opacity: 1, transform: 'translateY(0)' })), + ], + { optional: true }, + ), + query(':leave', animate('450ms ease', style({ opacity: 0 })), { + optional: true, + }), + ]), +]); From dd93bee9b42c468ba15134e6f410088b4aa49169 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 19:23:10 +0300 Subject: [PATCH 16/61] refactor(theme-shared): use toast-container instead of toast component in layouts related issue: #2537 --- .../account-layout.component.ts | 2 +- .../application-layout.component.html | 29 ++++++++++++------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/account-layout.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/account-layout.component.ts index 57b8772304..105c756e54 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/account-layout.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/account-layout.component.ts @@ -6,7 +6,7 @@ import { eLayoutType } from '@abp/ng.core'; template: ` - + `, }) export class AccountLayoutComponent { diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html b/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html index 2730c0e2ef..890ed1baab 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html @@ -34,7 +34,8 @@ @@ -47,7 +48,9 @@ class="nav-item dropdown" display="static" (click)=" - navbarRootDropdown.expand ? (navbarRootDropdown.expand = false) : (navbarRootDropdown.expand = true) + navbarRootDropdown.expand + ? (navbarRootDropdown.expand = false) + : (navbarRootDropdown.expand = true) " >
-
+
- + {{ appInfo.name }} @@ -213,12 +220,12 @@ [class.d-block]="smallScreen" [class.abp-mh-25]="smallScreen && currentUserDropdown.isOpen()" > - {{ - 'AbpAccount::ManageYourProfile' | abpLocalization - }} - {{ - 'AbpUi::Logout' | abpLocalization - }} + {{ 'AbpAccount::ManageYourProfile' | abpLocalization }} + {{ 'AbpUi::Logout' | abpLocalization }}
From e8ac235a2906c5b267ecabd8f9fa2ffb826234b2 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 19:23:55 +0300 Subject: [PATCH 17/61] refactor(theme-shared): add new toaster service related issue: #2537 --- .../src/lib/services/toaster.service.ts | 99 +++++++++++++++++-- 1 file changed, 90 insertions(+), 9 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts index 9e5858007a..e7cd005990 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts @@ -1,15 +1,96 @@ import { Injectable } from '@angular/core'; -import { AbstractToaster } from '../abstracts/toaster'; -import { Message } from 'primeng/components/common/message'; -import { MessageService } from 'primeng/components/common/messageservice'; +import { Toaster } from '../models'; +import { ReplaySubject } from 'rxjs'; -@Injectable({ providedIn: 'root' }) -export class ToasterService extends AbstractToaster { - constructor(protected messageService: MessageService) { - super(messageService); +@Injectable({ + providedIn: 'root', +}) +export class ToasterService { + toasts$ = new ReplaySubject(1); + + private lastId = -1; + + private toasts = [] as Toaster.Toast[]; + + /** + * Creates an info toast with given parameters. + * @param message Content of the toast + * @param title Title of the toast + * @param options Spesific style or structural options for individual toast + */ + info(message: string, title?: string, options?: Partial) { + return this.show(message, title, 'info', options); + } + + /** + * Creates a success toast with given parameters. + * @param message Content of the toast + * @param title Title of the toast + * @param options Spesific style or structural options for individual toast + */ + success(message: string, title?: string, options?: Partial) { + return this.show(message, title, 'success', options); + } + + /** + * Creates a warning toast with given parameters. + * @param message Content of the toast + * @param title Title of the toast + * @param options Spesific style or structural options for individual toast + */ + warn(message: string, title?: string, options?: Partial) { + return this.show(message, title, 'warning', options); + } + + /** + * Creates an error toast with given parameters. + * @param message Content of the toast + * @param title Title of the toast + * @param options Spesific style or structural options for individual toast + */ + error(message: string, title?: string, options?: Partial) { + return this.show(message, title, 'error', options); + } + + /** + * Creates a toast with given parameters. + * @param message Content of the toast + * @param title Title of the toast + * @param severity Sets color of the toast. "success", "warning" etc. + * @param options Spesific style or structural options for individual toast + */ + + show( + message: string, + title: string = null, + severity: Toaster.Severity = 'neutral', + options: Partial = null, + ) { + const id = ++this.lastId; + this.toasts.push({ + message, + title, + severity, + options: { closable: true, ...options, id }, + }); + this.toasts$.next(this.toasts); + return id; + } + + /** + * Removes the toast with given id. + * @param id ID of the toast to be removed. + */ + remove(id: number) { + this.toasts = this.toasts.filter(toast => toast.options.id !== id); + this.toasts$.next(this.toasts); } - addAll(messages: Message[]): void { - this.messageService.addAll(messages.map(message => ({ key: this.key, ...message }))); + /** + * Removes all open toasts at once. + */ + removeAll() { + this.toasts = []; + this.toasts$.next(this.toasts); } } From 21d747e5d758167223968680bba3a583717b4588 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 19:24:34 +0300 Subject: [PATCH 18/61] refactor(theme-shared): add new confirmation component and its styles related issue: #2537 --- .../confirmation/confirmation.component.html | 32 ++++++ .../confirmation/confirmation.component.scss | 100 ++++++++++++++++++ .../confirmation/confirmation.component.ts | 100 +++++++++--------- 3 files changed, 183 insertions(+), 49 deletions(-) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html new file mode 100644 index 0000000000..b85fe4bc9b --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html @@ -0,0 +1,32 @@ +
+
+
+
+ +
+
+

+ {{ data.title | abpLocalization: titleLocalizationParams }} +

+

+ {{ data.message | abpLocalization: messageLocalizationParams }} +

+
+ +
+
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss new file mode 100644 index 0000000000..047b516d15 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss @@ -0,0 +1,100 @@ +.confirmation { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + display: none; + place-items: center; + &.show { + display: grid; + } + .confirmation-backdrop { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(#000, 0.7); + z-index: 1040; + } + .confirmation-dialog { + display: flex; + flex-direction: column; + margin: 20px auto; + padding: 0; + border: none; + border-radius: 10px; + min-width: 450px; + min-height: 300px; + background-color: #fff; + box-shadow: 0 0 10px -5px rgba(#000, 0.5); + z-index: 1050; + .icon-container { + display: flex; + align-items: center; + justify-content: center; + margin: 0 0 10px 0; + padding: 20px; + .icon { + width: 100px; + height: 100px; + stroke-width: 1; + stroke: #f89406; + fill: #fff; + } + } + .content { + flex-grow: 1; + display: block; + .title { + display: block; + margin: 0; + padding: 0; + font-size: 27px; + font-weight: 600; + text-align: center; + } + .message { + display: block; + margin: 10px auto; + padding: 0; + color: #777; + font-size: 16px; + font-weight: 400; + text-align: center; + } + } + .footer { + display: flex; + align-items: center; + justify-content: flex-end; + margin: 10px 0 0 0; + padding: 20px; + width: 100%; + .confirmation-button { + display: inline-block; + margin: 0px 5px; + padding: 10px 20px; + border: none; + border-radius: 6px; + color: #777; + font-size: 14px; + font-weight: 600; + background-color: #eee; + &:hover { + background-color: darken(#eee, 5); + } + &-reject { + } + &-approve { + background-color: #2f96b4; + color: #fff; + &:hover { + background-color: darken(#2f96b4, 5); + } + } + } + } + } +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts index 6ddb5899f1..aa68d027ee 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts @@ -1,61 +1,63 @@ import { Component } from '@angular/core'; import { ConfirmationService } from '../../services/confirmation.service'; -import { Toaster } from '../../models/toaster'; +import { Confirmation } from '../../models'; +import { LocalizationService } from '@abp/ng.core'; @Component({ selector: 'abp-confirmation', - // tslint:disable-next-line: component-max-inline-declarations - template: ` - - - -
- {{ message.summary | abpLocalization: message.titleLocalizationParams }} -
-
- {{ message.detail | abpLocalization: message.messageLocalizationParams }} -
- - -
-
- `, + templateUrl: './confirmation.component.html', + styleUrls: ['./confirmation.component.scss'], }) export class ConfirmationComponent { - confirm = Toaster.Status.confirm; - reject = Toaster.Status.reject; - dismiss = Toaster.Status.dismiss; + confirm = Confirmation.Status.confirm; + reject = Confirmation.Status.reject; + dismiss = Confirmation.Status.dismiss; - constructor(private confirmationService: ConfirmationService) {} + visible = false; - close(status: Toaster.Status) { + data: Confirmation.DialogData; + + get iconClass(): string { + switch (this.data.severity) { + case 'info': + return 'info-circle'; + case 'success': + return 'check-circle'; + case 'warning': + return 'exclamation-triangle'; + case 'error': + return 'times-circle'; + default: + return 'question-circle-o'; + } + } + + get titleLocalizationParams(): string { + return this.localizationService.instant( + this.data.title, + ...this.data.options.titleLocalizationParams, + ); + } + + get messageLocalizationParams(): string { + return this.localizationService.instant( + this.data.message, + ...this.data.options.messageLocalizationParams, + ); + } + + constructor( + private confirmationService: ConfirmationService, + private localizationService: LocalizationService, + ) { + this.confirmationService.confirmation$.subscribe(confirmation => { + this.data = confirmation; + this.visible = true; + }); + } + + close(status: Confirmation.Status) { this.confirmationService.clear(status); + this.visible = false; } } From 009bde83fd6263429812b4c3b8de11830eb7b865 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 19:25:06 +0300 Subject: [PATCH 19/61] refactor(theme-shared): add new confirmation types and interfaces related issue: #2537 --- .../src/lib/models/confirmation.ts | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/confirmation.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/confirmation.ts index 3249860214..67b6cf6ef7 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/confirmation.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/confirmation.ts @@ -2,10 +2,29 @@ import { Toaster } from './toaster'; import { Config } from '@abp/ng.core'; export namespace Confirmation { - export interface Options extends Toaster.Options { + export interface Options { + id?: any; + closable?: boolean; + messageLocalizationParams?: string[]; + titleLocalizationParams?: string[]; hideCancelBtn?: boolean; hideYesBtn?: boolean; cancelText?: Config.LocalizationParam; yesText?: Config.LocalizationParam; } + + export interface DialogData { + message: Config.LocalizationParam; + title?: Config.LocalizationParam; + severity?: Severity; + options?: Partial; + } + + export type Severity = 'neutral' | 'success' | 'info' | 'warning' | 'error'; + + export enum Status { + confirm = 'confirm', + reject = 'reject', + dismiss = 'dismiss', + } } From 5cb651a8bf55701b6f5422b89cacb431f09bd4d8 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 19:25:28 +0300 Subject: [PATCH 20/61] refactor(theme-shared): add new confirmation service --- .../src/lib/services/confirmation.service.ts | 69 +++++++++++++------ 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts index cceedc22cb..e3ad5bd509 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts @@ -1,43 +1,72 @@ import { Injectable } from '@angular/core'; -import { AbstractToaster } from '../abstracts/toaster'; import { Confirmation } from '../models/confirmation'; -import { MessageService } from 'primeng/components/common/messageservice'; -import { fromEvent, Observable, Subject } from 'rxjs'; +import { fromEvent, Observable, Subject, ReplaySubject } from 'rxjs'; import { takeUntil, debounceTime, filter } from 'rxjs/operators'; import { Toaster } from '../models/toaster'; +import { Config } from '@abp/ng.core'; @Injectable({ providedIn: 'root' }) -export class ConfirmationService extends AbstractToaster { - key = 'abpConfirmation'; +export class ConfirmationService { + status$: Subject | Subject; + confirmation$ = new ReplaySubject(1); - sticky = true; + info( + message: Config.LocalizationParam, + title: Config.LocalizationParam, + options?: Partial, + ): Observable | Observable { + return this.show(message, title, 'info', options); + } - destroy$ = new Subject(); + success( + message: Config.LocalizationParam, + title: Config.LocalizationParam, + options?: Partial, + ): Observable | Observable { + return this.show(message, title, 'success', options); + } - constructor(protected messageService: MessageService) { - super(messageService); + warn( + message: Config.LocalizationParam, + title: Config.LocalizationParam, + options?: Partial, + ): Observable | Observable { + return this.show(message, title, 'warning', options); + } + + error( + message: Config.LocalizationParam, + title: Config.LocalizationParam, + options?: Partial, + ): Observable | Observable { + return this.show(message, title, 'error', options); } show( - message: string, - title: string, - severity: Toaster.Severity, - options?: Confirmation.Options, - ): Observable { + message: Config.LocalizationParam, + title: Config.LocalizationParam, + severity?: Toaster.Severity, + options?: Partial, + ): Observable | Observable { this.listenToEscape(); - return super.show(message, title, severity, options); + this.confirmation$.next({ + message, + title: title || 'AbpUi:AreYouSure', + severity: severity || 'neutral', + options, + }); + this.status$ = new Subject(); + return this.status$; } - clear(status?: Toaster.Status) { - super.clear(status); - - this.destroy$.next(); + clear(status?: Toaster.Status | Confirmation.Status) { + this.status$.next(status || Confirmation.Status.dismiss); } listenToEscape() { fromEvent(document, 'keyup') .pipe( - takeUntil(this.destroy$), + takeUntil(this.status$), debounceTime(150), filter((key: KeyboardEvent) => key && key.key === 'Escape'), ) From ee4e0d9ad5c9d579df3d483c94ff24d5faf0a2db Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 19:25:54 +0300 Subject: [PATCH 21/61] feat(theme-shared): export new toast animation --- npm/ng-packs/packages/theme-shared/src/lib/animations/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/animations/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/animations/index.ts index 816afbaaa4..d625d76d8e 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/animations/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/animations/index.ts @@ -3,3 +3,4 @@ export * from './collapse.animations'; export * from './fade.animations'; export * from './modal.animations'; export * from './slide.animations'; +export * from './toast.animations'; From 72fee038a5b331db986aac6758b22faf0339d283 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 21:01:31 +0300 Subject: [PATCH 22/61] feat(theme-shared): add clear toasts by key functionality related issue: #2537 --- .../theme-shared/src/lib/services/toaster.service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts index e7cd005990..818b44bf97 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts @@ -71,7 +71,7 @@ export class ToasterService { message, title, severity, - options: { closable: true, ...options, id }, + options: { closable: true, id, ...options }, }); this.toasts$.next(this.toasts); return id; @@ -89,8 +89,8 @@ export class ToasterService { /** * Removes all open toasts at once. */ - removeAll() { - this.toasts = []; + clear(key?: string) { + this.toasts = !key ? [] : this.toasts.filter(toast => toast.options.containerKey !== key); this.toasts$.next(this.toasts); } } From 0f65dfb037ad6b7ac739e5e570099ec694f64c52 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 21:02:04 +0300 Subject: [PATCH 23/61] refactor(theme-shared): change return types of show confirmation methods --- .../src/lib/services/confirmation.service.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts index e3ad5bd509..b01c339a74 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts @@ -14,7 +14,7 @@ export class ConfirmationService { message: Config.LocalizationParam, title: Config.LocalizationParam, options?: Partial, - ): Observable | Observable { + ): Observable { return this.show(message, title, 'info', options); } @@ -22,7 +22,7 @@ export class ConfirmationService { message: Config.LocalizationParam, title: Config.LocalizationParam, options?: Partial, - ): Observable | Observable { + ): Observable { return this.show(message, title, 'success', options); } @@ -30,7 +30,7 @@ export class ConfirmationService { message: Config.LocalizationParam, title: Config.LocalizationParam, options?: Partial, - ): Observable | Observable { + ): Observable { return this.show(message, title, 'warning', options); } @@ -38,7 +38,7 @@ export class ConfirmationService { message: Config.LocalizationParam, title: Config.LocalizationParam, options?: Partial, - ): Observable | Observable { + ): Observable { return this.show(message, title, 'error', options); } @@ -47,7 +47,7 @@ export class ConfirmationService { title: Config.LocalizationParam, severity?: Toaster.Severity, options?: Partial, - ): Observable | Observable { + ): Observable { this.listenToEscape(); this.confirmation$.next({ message, From c94448e443adf99ddd57547e5e2e985cf73fe44e Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 21:13:45 +0300 Subject: [PATCH 24/61] refactor(theme-shared): remove Confirmation.Status enum Removed to not commit any breaking changes. --- .../confirmation/confirmation.component.ts | 10 +++++----- .../theme-shared/src/lib/models/confirmation.ts | 6 ------ .../src/lib/services/confirmation.service.ts | 16 ++++++++-------- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts index aa68d027ee..6de221e642 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core'; import { ConfirmationService } from '../../services/confirmation.service'; -import { Confirmation } from '../../models'; +import { Confirmation, Toaster } from '../../models'; import { LocalizationService } from '@abp/ng.core'; @Component({ @@ -9,9 +9,9 @@ import { LocalizationService } from '@abp/ng.core'; styleUrls: ['./confirmation.component.scss'], }) export class ConfirmationComponent { - confirm = Confirmation.Status.confirm; - reject = Confirmation.Status.reject; - dismiss = Confirmation.Status.dismiss; + confirm = Toaster.Status.confirm; + reject = Toaster.Status.reject; + dismiss = Toaster.Status.dismiss; visible = false; @@ -56,7 +56,7 @@ export class ConfirmationComponent { }); } - close(status: Confirmation.Status) { + close(status: Toaster.Status) { this.confirmationService.clear(status); this.visible = false; } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/confirmation.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/confirmation.ts index 67b6cf6ef7..6e890b8b19 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/confirmation.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/confirmation.ts @@ -21,10 +21,4 @@ export namespace Confirmation { } export type Severity = 'neutral' | 'success' | 'info' | 'warning' | 'error'; - - export enum Status { - confirm = 'confirm', - reject = 'reject', - dismiss = 'dismiss', - } } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts index b01c339a74..606ae83706 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts @@ -7,14 +7,14 @@ import { Config } from '@abp/ng.core'; @Injectable({ providedIn: 'root' }) export class ConfirmationService { - status$: Subject | Subject; + status$: Subject; confirmation$ = new ReplaySubject(1); info( message: Config.LocalizationParam, title: Config.LocalizationParam, options?: Partial, - ): Observable { + ): Observable { return this.show(message, title, 'info', options); } @@ -22,7 +22,7 @@ export class ConfirmationService { message: Config.LocalizationParam, title: Config.LocalizationParam, options?: Partial, - ): Observable { + ): Observable { return this.show(message, title, 'success', options); } @@ -30,7 +30,7 @@ export class ConfirmationService { message: Config.LocalizationParam, title: Config.LocalizationParam, options?: Partial, - ): Observable { + ): Observable { return this.show(message, title, 'warning', options); } @@ -38,7 +38,7 @@ export class ConfirmationService { message: Config.LocalizationParam, title: Config.LocalizationParam, options?: Partial, - ): Observable { + ): Observable { return this.show(message, title, 'error', options); } @@ -47,7 +47,7 @@ export class ConfirmationService { title: Config.LocalizationParam, severity?: Toaster.Severity, options?: Partial, - ): Observable { + ): Observable { this.listenToEscape(); this.confirmation$.next({ message, @@ -59,8 +59,8 @@ export class ConfirmationService { return this.status$; } - clear(status?: Toaster.Status | Confirmation.Status) { - this.status$.next(status || Confirmation.Status.dismiss); + clear(status?: Toaster.Status) { + this.status$.next(status || Toaster.Status.dismiss); } listenToEscape() { From 91b68e0bca3f437ff336ae9f639e87e50e937ffa Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Thu, 9 Jan 2020 21:14:26 +0300 Subject: [PATCH 25/61] test(theme-shared): removed test for primeng toaster and confirmation components --- .../lib/tests/confirmation.service.spec.ts | 44 -------------- .../src/lib/tests/toaster.service.spec.ts | 58 ------------------- 2 files changed, 102 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts index 361ec0c020..7ead79194b 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts @@ -3,7 +3,6 @@ import { Component } from '@angular/core'; import { RouterTestingModule } from '@angular/router/testing'; import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; import { NgxsModule } from '@ngxs/store'; -import { MessageService } from 'primeng/components/common/messageservice'; import { ConfirmationService } from '../services/confirmation.service'; import { ThemeSharedModule } from '../theme-shared.module'; @@ -23,53 +22,10 @@ describe('ConfirmationService', () => { const createComponent = createComponentFactory({ component: DummyComponent, imports: [CoreModule, ThemeSharedModule.forRoot(), NgxsModule.forRoot(), RouterTestingModule], - providers: [MessageService], }); beforeEach(() => { spectator = createComponent(); service = spectator.get(ConfirmationService); }); - - it('should display a confirmation popup', () => { - service.info('test', 'title'); - - spectator.detectChanges(); - - expect(spectator.query('p-toast')).toBeTruthy(); - expect(spectator.query('p-toastitem')).toBeTruthy(); - expect(spectator.query('div.abp-confirm-summary')).toHaveText('title'); - expect(spectator.query('div.abp-confirm-body')).toHaveText('test'); - }); - - it('should close with ESC key', done => { - service.info('test', 'title'); - spectator.detectChanges(); - - expect(spectator.query('p-toastitem')).toBeTruthy(); - - spectator.dispatchKeyboardEvent('abp-confirmation', 'keyup', 'Escape'); - service.destroy$.subscribe(() => { - // expect(spectator.query('p-toastitem')).toBeFalsy(); - spectator.detectComponentChanges(); - expect(spectator.query('p-toastitem')).toBeFalsy(); - done(); - }); - }); - - it('should close when click cancel button', done => { - service.info('test', 'title', { yesText: 'Sure', cancelText: 'Exit' }); - spectator.detectChanges(); - - expect(spectator.query('p-toastitem')).toBeTruthy(); - expect(spectator.query('button#cancel')).toHaveText('Exit'); - expect(spectator.query('button#confirm')).toHaveText('Sure'); - - service.status$.subscribe(() => { - spectator.detectComponentChanges(); - expect(spectator.query('p-toastitem')).toBeFalsy(); - done(); - }); - spectator.click('button#cancel'); - }); }); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts index 149ecd1fad..648d5a17f0 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts @@ -3,7 +3,6 @@ import { Component } from '@angular/core'; import { RouterTestingModule } from '@angular/router/testing'; import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; import { NgxsModule } from '@ngxs/store'; -import { MessageService } from 'primeng/components/common/messageservice'; import { ToasterService } from '../services/toaster.service'; import { ThemeSharedModule } from '../theme-shared.module'; @@ -23,67 +22,10 @@ describe('ToasterService', () => { const createComponent = createComponentFactory({ component: DummyComponent, imports: [CoreModule, ThemeSharedModule.forRoot(), NgxsModule.forRoot(), RouterTestingModule], - providers: [MessageService], }); beforeEach(() => { spectator = createComponent(); service = spectator.get(ToasterService); }); - - it('should display an error toast', () => { - service.error('test', 'title'); - - spectator.detectChanges(); - - expect(spectator.query('p-toast')).toBeTruthy(); - expect(spectator.query('p-toastitem')).toBeTruthy(); - expect(spectator.query('span.ui-toast-icon')).toHaveClass('pi-times'); - expect(spectator.query('div.ui-toast-summary')).toHaveText('title'); - expect(spectator.query('div.ui-toast-detail')).toHaveText('test'); - }); - - it('should display a warning toast', () => { - service.warn('test', 'title'); - spectator.detectChanges(); - expect(spectator.query('span.ui-toast-icon')).toHaveClass('pi-exclamation-triangle'); - }); - - it('should display a success toast', () => { - service.success('test', 'title'); - spectator.detectChanges(); - expect(spectator.query('span.ui-toast-icon')).toHaveClass('pi-check'); - }); - - it('should display an info toast', () => { - service.info('test', 'title'); - spectator.detectChanges(); - expect(spectator.query('span.ui-toast-icon')).toHaveClass('pi-info-circle'); - }); - - it('should display multiple toasts', () => { - service.addAll([ - { summary: 'summary1', detail: 'detail1' }, - { summary: 'summary2', detail: 'detail2' }, - ]); - spectator.detectChanges(); - expect(spectator.queryAll('div.ui-toast-summary').map(node => node.textContent.trim())).toEqual([ - 'summary1', - 'summary2', - ]); - expect(spectator.queryAll('div.ui-toast-detail').map(node => node.textContent.trim())).toEqual([ - 'detail1', - 'detail2', - ]); - }); - - it('should remove the opened toast', () => { - service.info('test', 'title'); - spectator.detectChanges(); - expect(spectator.query('p-toastitem')).toBeTruthy(); - - service.clear(); - spectator.detectChanges(); - expect(spectator.query('p-toastitem')).toBeFalsy(); - }); }); From f12b488c3fb4bda59225b37e4d2bf2173dbce5b9 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 10 Jan 2020 09:57:57 +0300 Subject: [PATCH 26/61] increase Password max length to 128 --- .../Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs | 7 ++++--- .../Volo/Abp/Identity/IdentityUserConsts.cs | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs index 5abb564b09..40b819e0e1 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Volo.Abp.Account.Settings; +using Volo.Abp.Identity; using Volo.Abp.Settings; using Volo.Abp.Uow; using IdentityUser = Volo.Abp.Identity.IdentityUser; @@ -55,16 +56,16 @@ namespace Volo.Abp.Account.Web.Pages.Account public class PostInput { [Required] - [StringLength(32)] + [StringLength(IdentityUserConsts.MaxUserNameLength)] public string UserName { get; set; } [Required] [EmailAddress] - [StringLength(255)] + [StringLength(IdentityUserConsts.MaxEmailLength)] public string EmailAddress { get; set; } [Required] - [StringLength(32)] + [StringLength(IdentityUserConsts.MaxPasswordLength)] [DataType(DataType.Password)] public string Password { get; set; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs index f56a59e967..ef2cc57ef4 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs @@ -18,7 +18,7 @@ namespace Volo.Abp.Identity public const int MaxPhoneNumberLength = AbpUserConsts.MaxPhoneNumberLength; - public const int MaxPasswordLength = 32; + public const int MaxPasswordLength = 128; public const int MaxPasswordHashLength = 256; From 52fc8ad3323582ce36338d7c82d358784b6d9a6e Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 10 Jan 2020 09:58:39 +0300 Subject: [PATCH 27/61] re-created application template migration --- ...9_Initial.Designer.cs => 20200110065439_Initial.Designer.cs} | 2 +- .../{20200106080719_Initial.cs => 20200110065439_Initial.cs} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200106080719_Initial.Designer.cs => 20200110065439_Initial.Designer.cs} (99%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200106080719_Initial.cs => 20200110065439_Initial.cs} (100%) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200106080719_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200110065439_Initial.Designer.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200106080719_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200110065439_Initial.Designer.cs index 252d7d8c3d..9a4a1a2023 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200106080719_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200110065439_Initial.Designer.cs @@ -10,7 +10,7 @@ using MyCompanyName.MyProjectName.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameMigrationsDbContext))] - [Migration("20200106080719_Initial")] + [Migration("20200110065439_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200106080719_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200110065439_Initial.cs similarity index 100% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200106080719_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200110065439_Initial.cs From b32718eec7d355199eea89add002a07ce6424c3f Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 10 Jan 2020 10:04:05 +0300 Subject: [PATCH 28/61] fix(theme-shared): fix confirmation and toaster type errors --- .../confirmation/confirmation.component.html | 14 +++++---- .../confirmation/confirmation.component.ts | 8 ++--- .../src/lib/models/confirmation.ts | 1 - .../theme-shared/src/lib/models/toaster.ts | 6 ++-- .../src/lib/services/confirmation.service.ts | 2 +- .../src/lib/services/toaster.service.ts | 29 +++++++++++++++---- .../src/lib/tests/error.handler.spec.ts | 13 +++++---- .../src/lib/tests/modal.component.spec.ts | 10 +++++-- 8 files changed, 54 insertions(+), 29 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html index b85fe4bc9b..82041d6b5a 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html @@ -6,26 +6,28 @@

- {{ data.title | abpLocalization: titleLocalizationParams }} + {{ title }}

- {{ data.message | abpLocalization: messageLocalizationParams }} + {{ message }}

diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts index 6de221e642..365f878f6d 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts @@ -32,17 +32,17 @@ export class ConfirmationComponent { } } - get titleLocalizationParams(): string { + get title(): string { return this.localizationService.instant( this.data.title, - ...this.data.options.titleLocalizationParams, + ...(this.data.options.titleLocalizationParams || []), ); } - get messageLocalizationParams(): string { + get message(): string { return this.localizationService.instant( this.data.message, - ...this.data.options.messageLocalizationParams, + ...(this.data.options.messageLocalizationParams || []), ); } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/confirmation.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/confirmation.ts index 6e890b8b19..40925c1b2c 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/confirmation.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/confirmation.ts @@ -1,4 +1,3 @@ -import { Toaster } from './toaster'; import { Config } from '@abp/ng.core'; export namespace Confirmation { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts index 4f407d129d..34fe04f351 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts @@ -1,3 +1,5 @@ +import { Config } from '@abp/ng.core'; + export namespace Toaster { export interface ToastOptions { life?: number; @@ -11,8 +13,8 @@ export namespace Toaster { } export interface Toast { - message: string; - title?: string; + message: Config.LocalizationParam; + title?: Config.LocalizationParam; severity?: string; options?: ToastOptions; } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts index 606ae83706..d90980c1bf 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts @@ -48,7 +48,6 @@ export class ConfirmationService { severity?: Toaster.Severity, options?: Partial, ): Observable { - this.listenToEscape(); this.confirmation$.next({ message, title: title || 'AbpUi:AreYouSure', @@ -56,6 +55,7 @@ export class ConfirmationService { options, }); this.status$ = new Subject(); + this.listenToEscape(); return this.status$; } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts index 818b44bf97..26d68a5e38 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { Toaster } from '../models'; import { ReplaySubject } from 'rxjs'; +import { Config } from '@abp/ng.core'; @Injectable({ providedIn: 'root', @@ -18,7 +19,11 @@ export class ToasterService { * @param title Title of the toast * @param options Spesific style or structural options for individual toast */ - info(message: string, title?: string, options?: Partial) { + info( + message: Config.LocalizationParam, + title?: Config.LocalizationParam, + options?: Partial, + ) { return this.show(message, title, 'info', options); } @@ -28,7 +33,11 @@ export class ToasterService { * @param title Title of the toast * @param options Spesific style or structural options for individual toast */ - success(message: string, title?: string, options?: Partial) { + success( + message: Config.LocalizationParam, + title?: Config.LocalizationParam, + options?: Partial, + ) { return this.show(message, title, 'success', options); } @@ -38,7 +47,11 @@ export class ToasterService { * @param title Title of the toast * @param options Spesific style or structural options for individual toast */ - warn(message: string, title?: string, options?: Partial) { + warn( + message: Config.LocalizationParam, + title?: Config.LocalizationParam, + options?: Partial, + ) { return this.show(message, title, 'warning', options); } @@ -48,7 +61,11 @@ export class ToasterService { * @param title Title of the toast * @param options Spesific style or structural options for individual toast */ - error(message: string, title?: string, options?: Partial) { + error( + message: Config.LocalizationParam, + title?: Config.LocalizationParam, + options?: Partial, + ) { return this.show(message, title, 'error', options); } @@ -61,8 +78,8 @@ export class ToasterService { */ show( - message: string, - title: string = null, + message: Config.LocalizationParam, + title: Config.LocalizationParam = null, severity: Toaster.Severity = 'neutral', options: Partial = null, ) { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts index 1be1e31d1c..ec23cd165e 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts @@ -73,10 +73,10 @@ describe('ErrorHandler', () => { it('should display the confirmation when not found error occurs', () => { store.dispatch(new RestOccurError(new HttpErrorResponse({ status: 404 }))); spectator.detectChanges(); - expect(spectator.query('.abp-confirm-summary')).toHaveText( + expect(spectator.query('.confirmation .title')).toHaveText( DEFAULT_ERROR_MESSAGES.defaultError404.title, ); - expect(spectator.query('.abp-confirm-body')).toHaveText( + expect(spectator.query('.confirmation .message')).toHaveText( DEFAULT_ERROR_MESSAGES.defaultError404.details, ); }); @@ -84,10 +84,10 @@ describe('ErrorHandler', () => { it('should display the confirmation when default error occurs', () => { store.dispatch(new RestOccurError(new HttpErrorResponse({ status: 412 }))); spectator.detectChanges(); - expect(spectator.query('.abp-confirm-summary')).toHaveText( + expect(spectator.query('.confirmation .title')).toHaveText( DEFAULT_ERROR_MESSAGES.defaultError.title, ); - expect(spectator.query('.abp-confirm-body')).toHaveText( + expect(spectator.query('.confirmation .message')).toHaveText( DEFAULT_ERROR_MESSAGES.defaultError.details, ); }); @@ -128,8 +128,9 @@ describe('ErrorHandler', () => { ); spectator.detectChanges(); - expect(spectator.query('.abp-confirm-summary')).toHaveText('test message'); - expect(spectator.query('.abp-confirm-body')).toHaveText('test detail'); + console.warn(spectator.query('.confirmation')); + expect(spectator.query('.title')).toHaveText('test message'); + expect(spectator.query('.confirmation .message')).toHaveText('test detail'); }); }); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/modal.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/modal.component.spec.ts index 08656ff2d7..ead6d29a23 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/modal.component.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/modal.component.spec.ts @@ -5,14 +5,18 @@ import { MessageService } from 'primeng/components/common/messageservice'; import { ToastModule } from 'primeng/toast'; import { timer } from 'rxjs'; import { ButtonComponent, ConfirmationComponent, ModalComponent } from '../components'; +import { RouterTestingModule } from '@angular/router/testing'; describe('ModalComponent', () => { - let spectator: SpectatorHost; + let spectator: SpectatorHost< + ModalComponent, + { visible: boolean; busy: boolean; ngDirty: boolean } + >; let appearFn; let disappearFn; const createHost = createHostFactory({ component: ModalComponent, - imports: [ToastModule], + imports: [ToastModule, RouterTestingModule], declarations: [ConfirmationComponent, LocalizationPipe, ButtonComponent], providers: [MessageService], mocks: [Store], @@ -82,7 +86,7 @@ describe('ModalComponent', () => { spectator.click('#abp-modal-close-button'); expect(disappearFn).not.toHaveBeenCalled(); - expect(spectator.query('p-toast')).toBeTruthy(); + expect(spectator.query('div.confirmation')).toBeTruthy(); spectator.click('button#cancel'); expect(spectator.query('div.modal')).toBeTruthy(); From 3715d8c43b27700c7b7d0388555e046724e99aef Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 10 Jan 2020 10:06:44 +0300 Subject: [PATCH 29/61] Revert "re-created application template migration" This reverts commit 52fc8ad3323582ce36338d7c82d358784b6d9a6e. --- ...9_Initial.Designer.cs => 20200106080719_Initial.Designer.cs} | 2 +- .../{20200110065439_Initial.cs => 20200106080719_Initial.cs} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200110065439_Initial.Designer.cs => 20200106080719_Initial.Designer.cs} (99%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200110065439_Initial.cs => 20200106080719_Initial.cs} (100%) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200110065439_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200106080719_Initial.Designer.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200110065439_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200106080719_Initial.Designer.cs index 9a4a1a2023..252d7d8c3d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200110065439_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200106080719_Initial.Designer.cs @@ -10,7 +10,7 @@ using MyCompanyName.MyProjectName.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameMigrationsDbContext))] - [Migration("20200110065439_Initial")] + [Migration("20200106080719_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200110065439_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200106080719_Initial.cs similarity index 100% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200110065439_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200106080719_Initial.cs From 423192e57f2d8bcbe12b0be7371d0655959eb69c Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 10 Jan 2020 10:09:04 +0300 Subject: [PATCH 30/61] fix(theme-shared): fix confirmation and toast localizations --- .../confirmation/confirmation.component.html | 4 ++-- .../confirmation/confirmation.component.ts | 14 -------------- .../src/lib/components/toast/toast.component.html | 4 ++-- .../src/lib/components/toast/toast.component.ts | 14 -------------- 4 files changed, 4 insertions(+), 32 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html index 82041d6b5a..e2bffd53d4 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html @@ -6,10 +6,10 @@

- {{ title }} + {{ data.title | abpLocalization: data.options?.titleLocalizationParams }}

- {{ message }} + {{ data.message | abpLocalization: data.options?.messageLocalizationParams }}

diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts index afdf73ef88..99fbb88033 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts @@ -32,20 +32,6 @@ export class ToastComponent implements OnInit { } } - get titleLocalizationParams(): string { - return this.localizationService.instant( - this.toast.title, - ...this.toast.options.titleLocalizationParams, - ); - } - - get messageLocalizationParams() { - return this.localizationService.instant( - this.toast.message, - ...this.toast.options.messageLocalizationParams, - ); - } - constructor( private toastService: ToasterService, private localizationService: LocalizationService, From 6217cd1d62e22659f13b15bac407f595ce13fe11 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Fri, 10 Jan 2020 10:34:42 +0300 Subject: [PATCH 31/61] feat(theme-basic): add toast-container component to layout related issue: #2537 --- .../src/lib/components/empty-layout/empty-layout.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts index c6082aadd4..4f1dac52ca 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts @@ -6,7 +6,7 @@ import { eLayoutType } from '@abp/ng.core'; template: ` - + `, }) export class EmptyLayoutComponent { From 6b3d7433cbc7ab50e575c989bec1780df1874d4e Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Fri, 10 Jan 2020 10:35:11 +0300 Subject: [PATCH 32/61] refactor(theme-shared): change opacity and icon size related issue: #2537 --- .../src/lib/components/toast/toast.component.scss | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss index 98ce628954..1bd780815c 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss @@ -18,9 +18,11 @@ padding: 10px; border-radius: 0px; width: 350px; - @include fillColor(#f0f0f0, #000); user-select: none; box-shadow: 0 0 10px -5px rgba(#000, 0.4); + z-index: 9999; + @include fillColor(#f0f0f0, #000); + opacity: 1; &.toast-success { @include fillColor(#51a351, #fff); } @@ -38,6 +40,7 @@ align-items: center; justify-content: center; .icon { + font-size: 36px; } } .toast-content { From 835a17b513ecafc1f257ec7bd9ed8f98c08c21fd Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Fri, 10 Jan 2020 10:35:55 +0300 Subject: [PATCH 33/61] fix(theme-shared): correct css class names for confirmation icons related issue: #2537 --- .../components/confirmation/confirmation.component.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts index 564c570904..4f16d528af 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts @@ -20,15 +20,15 @@ export class ConfirmationComponent { get iconClass(): string { switch (this.data.severity) { case 'info': - return 'info-circle'; + return 'fa-info-circle'; case 'success': - return 'check-circle'; + return 'fa-check-circle'; case 'warning': - return 'exclamation-triangle'; + return 'fa-exclamation-triangle'; case 'error': - return 'times-circle'; + return 'fa-times-circle'; default: - return 'question-circle-o'; + return 'fa-question-circle'; } } From f0158d4d50cb7f06dab401b6dcbb6d4c862ad296 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Fri, 10 Jan 2020 10:36:47 +0300 Subject: [PATCH 34/61] feat(theme-shared): change icon color to severity color related issue: #2537 --- .../confirmation/confirmation.component.html | 2 +- .../confirmation/confirmation.component.scss | 21 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html index e2bffd53d4..07faa3a8a7 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.html @@ -1,7 +1,7 @@
-
+
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss index 047b516d15..3b43c170de 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss @@ -40,8 +40,27 @@ width: 100px; height: 100px; stroke-width: 1; - stroke: #f89406; fill: #fff; + font-size: 80px; + text-align: center; + } + &.neutral .icon { + } + &.info .icon { + stroke: #2f96b4; + color: #2f96b4; + } + &.success .icon { + stroke: #51a351; + color: #51a351; + } + &.warning .icon { + stroke: #f89406; + color: #f89406; + } + &.error .icon { + stroke: #bd362f; + color: #bd362f; } } .content { From 3e40fc3a7b78aa2821b957a61ee0fb03555d124d Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Fri, 10 Jan 2020 10:45:00 +0300 Subject: [PATCH 35/61] fix(theme-shared): change z-index of container element related issue: #2537 --- .../lib/components/confirmation/confirmation.component.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss index 3b43c170de..04bc4d6f84 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss @@ -6,6 +6,7 @@ left: 0; display: none; place-items: center; + z-index: 1060; &.show { display: grid; } @@ -16,7 +17,7 @@ width: 100vw; height: 100vh; background-color: rgba(#000, 0.7); - z-index: 1040; + z-index: 1061 !important; } .confirmation-dialog { display: flex; @@ -29,7 +30,7 @@ min-height: 300px; background-color: #fff; box-shadow: 0 0 10px -5px rgba(#000, 0.5); - z-index: 1050; + z-index: 1062 !important; .icon-container { display: flex; align-items: center; From 75b32f21bc2d66c063f168b735c9f5ff8c6b725d Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 10 Jan 2020 10:47:13 +0300 Subject: [PATCH 36/61] tests(theme-shared): fix confirmation and toaster tests --- .../lib/tests/confirmation.service.spec.ts | 45 +++++++++++++- .../src/lib/tests/error.handler.spec.ts | 1 - .../src/lib/tests/toaster.service.spec.ts | 58 ++++++++++++++++++- 3 files changed, 101 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts index 90d22d4800..aa2481419d 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts @@ -3,9 +3,10 @@ import { Component } from '@angular/core'; import { RouterTestingModule } from '@angular/router/testing'; import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; import { NgxsModule } from '@ngxs/store'; -import { OAuthService } from 'angular-oauth2-oidc'; +import { MessageService } from 'primeng/components/common/messageservice'; import { ConfirmationService } from '../services/confirmation.service'; import { ThemeSharedModule } from '../theme-shared.module'; +import { OAuthModule, OAuthService } from 'angular-oauth2-oidc'; @Component({ selector: 'abp-dummy', @@ -23,6 +24,7 @@ describe('ConfirmationService', () => { const createComponent = createComponentFactory({ component: DummyComponent, imports: [CoreModule, ThemeSharedModule.forRoot(), NgxsModule.forRoot(), RouterTestingModule], + providers: [MessageService], mocks: [OAuthService], }); @@ -30,4 +32,45 @@ describe('ConfirmationService', () => { spectator = createComponent(); service = spectator.get(ConfirmationService); }); + + test('should display a confirmation popup', () => { + service.info('test', 'title'); + + spectator.detectChanges(); + + expect(spectator.query('div.confirmation .title')).toHaveText('title'); + expect(spectator.query('div.confirmation .message')).toHaveText('test'); + }); + + test('should close with ESC key', done => { + service.info('test', 'title').subscribe(() => { + setTimeout(() => { + spectator.detectComponentChanges(); + expect(spectator.query('div.confirmation')).toBeFalsy(); + done(); + }, 0); + }); + + spectator.detectChanges(); + expect(spectator.query('div.confirmation')).toBeTruthy(); + spectator.dispatchKeyboardEvent('div.confirmation', 'keyup', 'Escape'); + }); + + test('should close when click cancel button', done => { + service.info('test', 'title', { yesText: 'Sure', cancelText: 'Exit' }).subscribe(() => { + spectator.detectComponentChanges(); + setTimeout(() => { + expect(spectator.query('div.confirmation')).toBeFalsy(); + done(); + }, 0); + }); + + spectator.detectChanges(); + + expect(spectator.query('div.confirmation')).toBeTruthy(); + expect(spectator.query('button#cancel')).toHaveText('Exit'); + expect(spectator.query('button#confirm')).toHaveText('Sure'); + + spectator.click('button#cancel'); + }); }); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts index ec23cd165e..aa22e9c567 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts @@ -128,7 +128,6 @@ describe('ErrorHandler', () => { ); spectator.detectChanges(); - console.warn(spectator.query('.confirmation')); expect(spectator.query('.title')).toHaveText('test message'); expect(spectator.query('.confirmation .message')).toHaveText('test detail'); }); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts index 8004a5d7b8..d7fbd7219e 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts @@ -3,6 +3,7 @@ import { Component } from '@angular/core'; import { RouterTestingModule } from '@angular/router/testing'; import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; import { NgxsModule } from '@ngxs/store'; +import { MessageService } from 'primeng/components/common/messageservice'; import { ToasterService } from '../services/toaster.service'; import { ThemeSharedModule } from '../theme-shared.module'; import { OAuthService } from 'angular-oauth2-oidc'; @@ -10,7 +11,7 @@ import { OAuthService } from 'angular-oauth2-oidc'; @Component({ selector: 'abp-dummy', template: ` - + `, }) class DummyComponent { @@ -23,6 +24,7 @@ describe('ToasterService', () => { const createComponent = createComponentFactory({ component: DummyComponent, imports: [CoreModule, ThemeSharedModule.forRoot(), NgxsModule.forRoot(), RouterTestingModule], + providers: [MessageService], mocks: [OAuthService], }); @@ -30,4 +32,58 @@ describe('ToasterService', () => { spectator = createComponent(); service = spectator.get(ToasterService); }); + + test('should display an error toast', () => { + service.error('test', 'title'); + + spectator.detectChanges(); + + expect(spectator.query('div.toast')).toBeTruthy(); + expect(spectator.query('.toast-icon i')).toHaveClass('fa-times-circle'); + expect(spectator.query('div.toast-title')).toHaveText('title'); + expect(spectator.query('div.toast-message')).toHaveText('test'); + }); + + test('should display a warning toast', () => { + service.warn('test', 'title'); + spectator.detectChanges(); + expect(spectator.query('.toast-icon i')).toHaveClass('fa-exclamation-triangle'); + }); + + test('should display a success toast', () => { + service.success('test', 'title'); + spectator.detectChanges(); + expect(spectator.query('.toast-icon i')).toHaveClass('fa-check-circle'); + }); + + test('should display an info toast', () => { + service.info('test', 'title'); + spectator.detectChanges(); + expect(spectator.query('.toast-icon i')).toHaveClass('fa-info-circle'); + }); + + test('should display multiple toasts', () => { + service.info('detail1', 'summary1'); + service.info('detail2', 'summary2'); + + spectator.detectChanges(); + expect(spectator.queryAll('div.toast-title').map(node => node.textContent.trim())).toEqual([ + 'summary1', + 'summary2', + ]); + expect(spectator.queryAll('div.toast-message').map(node => node.textContent.trim())).toEqual([ + 'detail1', + 'detail2', + ]); + }); + + test('should remove the opened toasts', () => { + service.info('test', 'title'); + spectator.detectChanges(); + expect(spectator.query('div.toast')).toBeTruthy(); + + service.clear(); + spectator.detectChanges(); + expect(spectator.query('p-div.toast')).toBeFalsy(); + }); }); From 5246e60647db6192ff2e0357d32ea8d15775e869 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 10 Jan 2020 10:47:52 +0300 Subject: [PATCH 37/61] fix(theme-shared): fix closing confirmation with esc --- .../components/confirmation/confirmation.component.ts | 3 +-- .../src/lib/components/toast/toast.component.ts | 5 +++-- .../src/lib/services/confirmation.service.ts | 1 + .../theme-shared/src/lib/services/toaster.service.ts | 9 ++++++--- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts index 564c570904..6c4d232b99 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts @@ -38,12 +38,11 @@ export class ConfirmationComponent { ) { this.confirmationService.confirmation$.subscribe(confirmation => { this.data = confirmation; - this.visible = true; + this.visible = !!confirmation; }); } close(status: Toaster.Status) { this.confirmationService.clear(status); - this.visible = false; } } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts index 99fbb88033..6cda67167b 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts @@ -2,6 +2,7 @@ import { Component, Input, OnInit } from '@angular/core'; import { Toaster } from '../../models'; import { ToasterService } from '../../services/toaster.service'; import { LocalizationService } from '@abp/ng.core'; +import snq from 'snq'; @Component({ selector: 'abp-toast', @@ -38,8 +39,8 @@ export class ToastComponent implements OnInit { ) {} ngOnInit() { - if (this.toast.options && this.toast.options.sticky) return; - const timeout = this.toast.options.life || 5000; + if (snq(() => this.toast.options.sticky)) return; + const timeout = snq(() => this.toast.options.life) || 5000; setTimeout(() => { this.close(); }, timeout); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts index d90980c1bf..650019392b 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts @@ -60,6 +60,7 @@ export class ConfirmationService { } clear(status?: Toaster.Status) { + this.confirmation$.next(); this.status$.next(status || Toaster.Status.dismiss); } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts index 26d68a5e38..021aa60273 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { Toaster } from '../models'; import { ReplaySubject } from 'rxjs'; import { Config } from '@abp/ng.core'; +import snq from 'snq'; @Injectable({ providedIn: 'root', @@ -81,7 +82,7 @@ export class ToasterService { message: Config.LocalizationParam, title: Config.LocalizationParam = null, severity: Toaster.Severity = 'neutral', - options: Partial = null, + options = {} as Partial, ) { const id = ++this.lastId; this.toasts.push({ @@ -99,7 +100,7 @@ export class ToasterService { * @param id ID of the toast to be removed. */ remove(id: number) { - this.toasts = this.toasts.filter(toast => toast.options.id !== id); + this.toasts = this.toasts.filter(toast => snq(() => toast.options.id) !== id); this.toasts$.next(this.toasts); } @@ -107,7 +108,9 @@ export class ToasterService { * Removes all open toasts at once. */ clear(key?: string) { - this.toasts = !key ? [] : this.toasts.filter(toast => toast.options.containerKey !== key); + this.toasts = !key + ? [] + : this.toasts.filter(toast => snq(() => toast.options.containerKey) !== key); this.toasts$.next(this.toasts); } } From dc80d0687bbe4dc57a837e9891880ae48ec74543 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 10 Jan 2020 10:56:19 +0300 Subject: [PATCH 38/61] style(theme-shared): move modal styles to modal.component.scss and remove confirmation and toaster styles --- .../theme-basic/src/lib/constants/styles.ts | 6 - .../lib/components/modal/modal.component.scss | 25 ++++ .../lib/components/modal/modal.component.ts | 14 +- .../theme-shared/src/lib/constants/styles.ts | 130 ------------------ 4 files changed, 36 insertions(+), 139 deletions(-) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.scss diff --git a/npm/ng-packs/packages/theme-basic/src/lib/constants/styles.ts b/npm/ng-packs/packages/theme-basic/src/lib/constants/styles.ts index 269fd0071a..24c3e84e42 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/constants/styles.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/constants/styles.ts @@ -48,12 +48,6 @@ export default ` .container > .card { box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; } -.abp-confirm .abp-confirm-footer { - background-color: #f4f4f7 !important; -} -.abp-confirm .ui-toast-message-content { - background-color: #fff !important; -} @media screen and (min-width: 768px) { .navbar .dropdown:hover > .dropdown-menu { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.scss new file mode 100644 index 0000000000..023830ceeb --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.scss @@ -0,0 +1,25 @@ +.modal { + &.show { + display: block !important; + } + + &-backdrop { + background-color: rgba(0, 0, 0, 0.6); + } + + &::-webkit-scrollbar { + width: 7px; + } + + &::-webkit-scrollbar-track { + background: #ddd; + } + + &::-webkit-scrollbar-thumb { + background: #8a8686; + } + + &-dialog { + z-index: 1050; + } +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts index f95e0093b9..c3bdc2fecb 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts @@ -24,6 +24,7 @@ export type ModalSize = 'sm' | 'md' | 'lg' | 'xl'; selector: 'abp-modal', templateUrl: './modal.component.html', animations: [fadeAnimation], + styleUrls: ['./modal.component.scss'], }) export class ModalComponent implements OnDestroy { @Input() @@ -115,7 +116,8 @@ export class ModalComponent implements OnDestroy { } const nodes = getFlatNodes( - ((node || this.modalContent.nativeElement).querySelector('#abp-modal-body') as HTMLElement).childNodes, + ((node || this.modalContent.nativeElement).querySelector('#abp-modal-body') as HTMLElement) + .childNodes, ); if (hasNgDirty(nodes)) { @@ -123,7 +125,10 @@ export class ModalComponent implements OnDestroy { this.isConfirmationOpen = true; this.confirmationService - .warn('AbpAccount::AreYouSureYouWantToCancelEditingWarningMessage', 'AbpAccount::AreYouSure') + .warn( + 'AbpAccount::AreYouSureYouWantToCancelEditingWarningMessage', + 'AbpAccount::AreYouSure', + ) .subscribe((status: Toaster.Status) => { this.isConfirmationOpen = false; if (status === Toaster.Status.confirm) { @@ -162,7 +167,10 @@ export class ModalComponent implements OnDestroy { function getFlatNodes(nodes: NodeList): HTMLElement[] { return Array.from(nodes).reduce( - (acc, val) => [...acc, ...(val.childNodes && val.childNodes.length ? getFlatNodes(val.childNodes) : [val])], + (acc, val) => [ + ...acc, + ...(val.childNodes && val.childNodes.length ? getFlatNodes(val.childNodes) : [val]), + ], [], ); } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/constants/styles.ts b/npm/ng-packs/packages/theme-shared/src/lib/constants/styles.ts index 24f7a9a8ea..4458117d16 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/constants/styles.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/constants/styles.ts @@ -41,30 +41,6 @@ export default ` background: #8a8686; } -.modal.show { - display: block !important; -} - -.modal-backdrop { - background-color: rgba(0, 0, 0, 0.6); -} - -.modal::-webkit-scrollbar { - width: 7px; -} - -.modal::-webkit-scrollbar-track { - background: #ddd; -} - -.modal::-webkit-scrollbar-thumb { - background: #8a8686; -} - -.modal-dialog { - z-index: 1050; -} - .abp-ellipsis-inline { display: inline-block; overflow: hidden; @@ -78,112 +54,6 @@ export default ` white-space: nowrap; } -.abp-toast .ui-toast-message { - box-sizing: border-box; - border: 2px solid transparent; - border-radius: 4px; - color: #1b1d29; -} - -.abp-toast .ui-toast-message-content { - padding: 10px; -} - -.abp-toast .ui-toast-message-content .ui-toast-icon { - top: 0; - left: 0; - padding: 10px; -} - -.abp-toast .ui-toast-summary { - margin: 0; - font-weight: 700; -} - -body abp-toast .ui-toast .ui-toast-message.ui-toast-message-error { - border: 2px solid #ba1659; - background-color: #f4f4f7; -} - -body abp-toast .ui-toast .ui-toast-message.ui-toast-message-error .ui-toast-message-content .ui-toast-icon { - color: #ba1659; -} - -body abp-toast .ui-toast .ui-toast-message.ui-toast-message-warn { - border: 2px solid #ed5d98; - background-color: #f4f4f7; -} - -body abp-toast .ui-toast .ui-toast-message.ui-toast-message-warn .ui-toast-message-content .ui-toast-icon { - color: #ed5d98; -} - -body abp-toast .ui-toast .ui-toast-message.ui-toast-message-success { - border: 2px solid #1c9174; - background-color: #f4f4f7; -} - -body abp-toast .ui-toast .ui-toast-message.ui-toast-message-success .ui-toast-message-content .ui-toast-icon { - color: #1c9174; -} - -body abp-toast .ui-toast .ui-toast-message.ui-toast-message-info { - border: 2px solid #fccb31; - background-color: #f4f4f7; -} - -body abp-toast .ui-toast .ui-toast-message.ui-toast-message-info .ui-toast-message-content .ui-toast-icon { - color: #fccb31; -} - -.abp-confirm .ui-toast-message { - box-sizing: border-box; - padding: 0px; - border:0 none; - border-radius: 4px; - background-color: transparent !important; - font-family: "Poppins", sans-serif; - text-align: center; -} - -.abp-confirm .ui-toast-message-content { - padding: 0px; -} - -.abp-confirm .abp-confirm-icon { - margin: 32px 50px 5px !important; - color: #f8bb86 !important; - font-size: 52px !important; -} - -.abp-confirm .ui-toast-close-icon { - display: none !important; -} - -.abp-confirm .abp-confirm-summary { - display: block !important; - margin-bottom: 13px !important; - padding: 13px 16px 0px !important; - font-weight: 600 !important; - font-size: 18px !important; -} - -.abp-confirm .abp-confirm-body { - display: inline-block !important; - padding: 0px 10px !important; -} - -.abp-confirm .abp-confirm-footer { - display: block; - margin-top: 30px; - padding: 16px; - text-align: right; -} - -.abp-confirm .abp-confirm-footer .btn { - margin-left: 10px !important; -} - .ui-widget-overlay { z-index: 1000; } From 6a1cf21cd214328e0283ee53eed35b7118b7e41e Mon Sep 17 00:00:00 2001 From: mperk Date: Fri, 10 Jan 2020 11:02:48 +0300 Subject: [PATCH 39/61] replace "R" with RolePermissionValueProvider.ProviderName --- .../PermissionManagement/Identity/RoleUpdateEventHandler.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleUpdateEventHandler.cs b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleUpdateEventHandler.cs index 8ee0d4c6d6..54e8bec3b1 100644 --- a/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleUpdateEventHandler.cs +++ b/modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleUpdateEventHandler.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Entities.Events; using Volo.Abp.EventBus; @@ -32,7 +33,7 @@ namespace Volo.Abp.PermissionManagement.Identity return; } - var permissionGrantsInRole = await PermissionGrantRepository.GetListAsync("R", eventData.OldName).ConfigureAwait(false); + var permissionGrantsInRole = await PermissionGrantRepository.GetListAsync(RolePermissionValueProvider.ProviderName, eventData.OldName).ConfigureAwait(false); foreach (var permissionGrant in permissionGrantsInRole) { await PermissionManager.UpdateProviderKeyAsync(permissionGrant, eventData.IdentityRole.Name).ConfigureAwait(false); From 4026028151d2dc5efc6605c3e313072068f658d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 10 Jan 2020 11:30:27 +0300 Subject: [PATCH 40/61] Add Advanced Topics section to the validation document. --- docs/en/Validation.md | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/docs/en/Validation.md b/docs/en/Validation.md index cf00e9f205..15c3f13412 100644 --- a/docs/en/Validation.md +++ b/docs/en/Validation.md @@ -120,6 +120,39 @@ Once ABP determines a validation error, it throws an exception of type `AbpValid * Log level of the `AbpValidationException` is set to `Warning`. It logs all the validation errors to the [logging system](Logging.md). * `AbpValidationException` is automatically caught by the ABP framework and converted to a usable error into with HTTP 400 status code. See the [exception handling](Exception-Handling.md) document for more. +## Advanced Topics + +### IObjectValidator + +In addition to the automatic validation, you may want to manually validate an object. In this case, [inject](Dependency-Injection.md) and use the `IObjectValidator` service: + +* `Validate` method validates the given object based on the validation rules and throws an `AbpValidationException` if it is not in a valid state. +* `GetErrors` doesn't throw an exception, but only returns the validation errors. + +`IObjectValidator` is implemented by the `ObjectValidator` by default. `ObjectValidator` is extensible; you can implement `IObjectValidationContributor` interface to contribute a custom logic. Example: + +````csharp +public class MyObjectValidationContributor + : IObjectValidationContributor, ITransientDependency +{ + public void AddErrors(ObjectValidationContext context) + { + //Get the validating object + var obj = context.ValidatingObject; + + //Add the validation errors if available + context.Errors.Add(...); + } +} +```` + +* Remember to register your class to the [DI](Dependency-Injection.md) (implementing `ITransientDependency` does it just like in this example) +* ABP will automatically discover your class and use on any type of object validation (including automatic method call validation). + +### IMethodInvocationValidator + +`IMethodInvocationValidator` is used to validate a method call. It internally uses the `IObjectValidator` to validate objects passes to the method call. You normally don't need to this service since it is automatically used by the framework, but you may want to reuse or replace it on your application in rare cases. + ## FluentValidation Integration -Volo.Abp.FluentValidation package integrates the FluentValidation library to the validation system. See the [FluentValidation Integration document](FluentValidation.md) for more. \ No newline at end of file +Volo.Abp.FluentValidation package integrates the FluentValidation library to the validation system (by implementing the `IObjectValidationContributor`). See the [FluentValidation Integration document](FluentValidation.md) for more. \ No newline at end of file From 756e8588f3dd2d1035dbc22db3773653e28b1542 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 10 Jan 2020 11:41:40 +0300 Subject: [PATCH 41/61] fix(core): fix nullable control in the config state --- npm/ng-packs/packages/core/src/lib/states/config.state.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/states/config.state.ts b/npm/ng-packs/packages/core/src/lib/states/config.state.ts index 1e959b3e54..2232fd0419 100644 --- a/npm/ng-packs/packages/core/src/lib/states/config.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/config.state.ts @@ -137,6 +137,7 @@ export class ConfigState { key: string | Config.LocalizationWithDefault, ...interpolateParams: string[] ) { + if (!key) key = ''; let defaultValue: string; if (typeof key !== 'string') { @@ -144,8 +145,6 @@ export class ConfigState { key = key.key; } - if (!key) key = ''; - const keys = key.split('::') as string[]; const selector = createSelector([ConfigState], (state: Config.State) => { if (!state.localization) return defaultValue || key; From bf6426246a531b7ee75acb357ecb512d0b804346 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 10 Jan 2020 11:44:11 +0300 Subject: [PATCH 42/61] refactor(theme-shared): set right and bottom inputs 30px as default --- .../toast-container/toast-container.component.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts index 4c664bb5d2..a63a75a8fc 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts @@ -13,16 +13,16 @@ export class ToastContainerComponent implements OnInit { toasts = [] as Toaster.Toast[]; @Input() - top: number; + top: string; @Input() - right: number; + right: string = '30px'; @Input() - bottom: number; + bottom: string = '30px'; @Input() - left: number; + left: string; @Input() toastKey: string; From 681b359eb69e6c12ce2006818e7c079cc44c0ea3 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 10 Jan 2020 11:51:49 +0300 Subject: [PATCH 43/61] fix(theme-shared): fix lint errors --- .../components/toast-container/toast-container.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts index a63a75a8fc..72483622b6 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts @@ -16,10 +16,10 @@ export class ToastContainerComponent implements OnInit { top: string; @Input() - right: string = '30px'; + right = '30px'; @Input() - bottom: string = '30px'; + bottom = '30px'; @Input() left: string; From f59a2945b223a19750afd46da7e33deff2583328 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 10 Jan 2020 14:41:30 +0300 Subject: [PATCH 44/61] feat(theme-shared): trigger unload confirmation in the modal component when form is dirty --- .../core/src/lib/states/session.state.ts | 2 +- .../lib/components/modal/modal.component.ts | 35 +++++++++++++------ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/states/session.state.ts b/npm/ng-packs/packages/core/src/lib/states/session.state.ts index 7ceaa4a1bc..7ea742dce7 100644 --- a/npm/ng-packs/packages/core/src/lib/states/session.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/session.state.ts @@ -67,7 +67,7 @@ export class SessionState { this.store.dispatch(new ModifyOpenedTabCount('increase')); - fromEvent(window, 'beforeunload').subscribe(() => { + fromEvent(window, 'unload').subscribe(event => { this.store.dispatch(new ModifyOpenedTabCount('decrease')); }); }); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts index c3bdc2fecb..1c25529413 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts @@ -10,6 +10,7 @@ import { TemplateRef, ViewChild, ViewChildren, + HostListener, } from '@angular/core'; import { fromEvent, Subject } from 'rxjs'; import { debounceTime, filter, takeUntil } from 'rxjs/operators'; @@ -101,15 +102,7 @@ export class ModalComponent implements OnDestroy { destroy$ = new Subject(); - constructor(private renderer: Renderer2, private confirmationService: ConfirmationService) {} - - ngOnDestroy(): void { - this.destroy$.next(); - } - - close() { - if (this.busy) return; - + get isFormDirty(): boolean { let node: HTMLDivElement; if (!this.modalContent) { node = document.getElementById('modal-container') as HTMLDivElement; @@ -120,7 +113,19 @@ export class ModalComponent implements OnDestroy { .childNodes, ); - if (hasNgDirty(nodes)) { + return hasNgDirty(nodes); + } + + constructor(private renderer: Renderer2, private confirmationService: ConfirmationService) {} + + ngOnDestroy(): void { + this.destroy$.next(); + } + + close() { + if (this.busy) return; + + if (this.isFormDirty) { if (this.isConfirmationOpen) return; this.isConfirmationOpen = true; @@ -151,6 +156,16 @@ export class ModalComponent implements OnDestroy { this.close(); }); + fromEvent(window, 'beforeunload') + .pipe(takeUntil(this.destroy$)) + .subscribe(event => { + if (this.isFormDirty) { + event.returnValue = true; + } else { + delete event.returnValue; + } + }); + setTimeout(() => { if (!this.abpClose) return; fromEvent(this.abpClose.nativeElement, 'click') From e1842a56c8bbafe628f3277d83504406428b6585 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 10 Jan 2020 14:49:17 +0300 Subject: [PATCH 45/61] chore: remove unneccessary import --- .../theme-shared/src/lib/components/modal/modal.component.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts index 1c25529413..8aaaa58076 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts @@ -10,7 +10,6 @@ import { TemplateRef, ViewChild, ViewChildren, - HostListener, } from '@angular/core'; import { fromEvent, Subject } from 'rxjs'; import { debounceTime, filter, takeUntil } from 'rxjs/operators'; From dfe8e55f29de6bb312b562b0a1e917944dcc2088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 10 Jan 2020 15:47:35 +0300 Subject: [PATCH 46/61] Complete the FluentValidation Integration document. --- docs/en/FluentValidation.md | 53 ++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/docs/en/FluentValidation.md b/docs/en/FluentValidation.md index bb45fb96d8..c7004878aa 100644 --- a/docs/en/FluentValidation.md +++ b/docs/en/FluentValidation.md @@ -1,3 +1,54 @@ # FluentValidation Integration -TODO \ No newline at end of file +ABP Validation infrastructure is extensible. [Volo.Abp.FluentValidation](https://www.nuget.org/packages/Volo.Abp.FluentValidation) NuGet package extends the validation system to work with the [FluentValidation](https://fluentvalidation.net/) library. + +## Installation + +It is suggested to use the [ABP CLI](CLI.md) to install this package. + +### Using the ABP CLI + +Open a command line window in the folder of the project you want to install the Volo.Abp.FluentValidation NuGet package and type the following command: + +````bash +abp add-package Volo.Abp.FluentValidation +```` + +### Manual Installation + +If you want to manually install; + +1. Add the [Volo.Abp.FluentValidation](https://www.nuget.org/packages/Volo.Abp.FluentValidation) NuGet package to your project: + + ```` + Install-Package Volo.Abp.FluentValidation + ```` + +2. Add the `AbpFluentValidationModule` to the dependency list of your module: + +````csharp +[DependsOn( + //...other dependencies + typeof(AbpFluentValidationModule) //Add the FluentValidation module + )] +public class YourModule : AbpModule +{ +} +```` + +## Using the FluentValidation + +Follow [the FluentValidation documentation](https://fluentvalidation.net/) to create validator classes. Example: + +````csharp +public class CreateUpdateBookDtoValidator : AbstractValidator +{ + public CreateUpdateBookDtoValidator() + { + RuleFor(x => x.Name).Length(3, 10); + RuleFor(x => x.Price).ExclusiveBetween(0.0f, 999.0f); + } +} +```` + +ABP will automatically find this class and associate with the `CreateUpdateBookDto` on object validation. \ No newline at end of file From 9c9e224b0a2220884a3fa97b511de0ccac4fc8c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 10 Jan 2020 15:47:59 +0300 Subject: [PATCH 47/61] Add NuGetPackageTarget.Undefined. --- .../Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs | 1 + .../Volo/Abp/Cli/ProjectModification/ProjectFinder.cs | 4 +++- .../Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs index 66467bfa36..9af114dfff 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs @@ -2,6 +2,7 @@ { public enum NuGetPackageTarget : byte { + Undefined = 0, DomainShared = 1, Domain = 2, ApplicationContracts = 3, diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs index 9c6edf479d..9d155ba079 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs @@ -2,11 +2,13 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using JetBrains.Annotations; namespace Volo.Abp.Cli.ProjectModification { public static class ProjectFinder { + [CanBeNull] public static string FindNuGetTargetProjectFile(string[] projectFiles, NuGetPackageTarget target) { if (!projectFiles.Any()) @@ -40,7 +42,7 @@ namespace Volo.Abp.Cli.ProjectModification case NuGetPackageTarget.HttpApiClient: return FindProjectEndsWith(projectFiles, assemblyNames, ".HttpApi.Client"); default: - throw new ApplicationException($"{nameof(NuGetPackageTarget)}.{target} has not implemented!"); + return null; } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs index 5e20904812..012d5e7bcf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs @@ -68,7 +68,7 @@ namespace Volo.Abp.Cli.ProjectModification var targetProjectFile = ProjectFinder.FindNuGetTargetProjectFile(projectFiles, nugetPackage.Target); if (targetProjectFile == null) { - Logger.LogDebug($"Target project is not available for NuGet package '{nugetPackage.Name}'"); + Logger.LogDebug($"Target project is not available for this NuGet package '{nugetPackage.Name}'"); continue; } From 9911b7953fa073131ff5020bc92389a0f525e81b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 10 Jan 2020 15:53:32 +0300 Subject: [PATCH 48/61] Update FluentValidation.md --- docs/en/FluentValidation.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/en/FluentValidation.md b/docs/en/FluentValidation.md index c7004878aa..c087f8a185 100644 --- a/docs/en/FluentValidation.md +++ b/docs/en/FluentValidation.md @@ -1,6 +1,6 @@ # FluentValidation Integration -ABP Validation infrastructure is extensible. [Volo.Abp.FluentValidation](https://www.nuget.org/packages/Volo.Abp.FluentValidation) NuGet package extends the validation system to work with the [FluentValidation](https://fluentvalidation.net/) library. +ABP [Validation](Validation.md) infrastructure is extensible. [Volo.Abp.FluentValidation](https://www.nuget.org/packages/Volo.Abp.FluentValidation) NuGet package extends the validation system to work with the [FluentValidation](https://fluentvalidation.net/) library. ## Installation @@ -8,7 +8,7 @@ It is suggested to use the [ABP CLI](CLI.md) to install this package. ### Using the ABP CLI -Open a command line window in the folder of the project you want to install the Volo.Abp.FluentValidation NuGet package and type the following command: +Open a command line window in the folder of the project (.csproj file) and type the following command: ````bash abp add-package Volo.Abp.FluentValidation @@ -51,4 +51,8 @@ public class CreateUpdateBookDtoValidator : AbstractValidator Date: Fri, 10 Jan 2020 21:18:19 +0800 Subject: [PATCH 49/61] Translate validation document. --- docs/zh-Hans/FluentValidation.md | 3 + docs/zh-Hans/Logging.md | 5 + docs/zh-Hans/Validation.md | 164 ++++++++++++++++++++++++++++++- docs/zh-Hans/docs-nav.json | 9 +- 4 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 docs/zh-Hans/FluentValidation.md create mode 100644 docs/zh-Hans/Logging.md diff --git a/docs/zh-Hans/FluentValidation.md b/docs/zh-Hans/FluentValidation.md new file mode 100644 index 0000000000..2254e896d4 --- /dev/null +++ b/docs/zh-Hans/FluentValidation.md @@ -0,0 +1,3 @@ +# FluentValidation 集成 + +TODO \ No newline at end of file diff --git a/docs/zh-Hans/Logging.md b/docs/zh-Hans/Logging.md new file mode 100644 index 0000000000..247609fb41 --- /dev/null +++ b/docs/zh-Hans/Logging.md @@ -0,0 +1,5 @@ +# 日志 + +ABP框架没有实现任何日志基础设施. 它使用[ASP.NET Core日志系统](https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/logging). + +> .NET Core 的日志系统是独立于ASP.NET Core的,它可以在任何类型的应用程序中使用. \ No newline at end of file diff --git a/docs/zh-Hans/Validation.md b/docs/zh-Hans/Validation.md index c2b128f0bc..8aa81351ec 100644 --- a/docs/zh-Hans/Validation.md +++ b/docs/zh-Hans/Validation.md @@ -1,3 +1,163 @@ -## Validation +# 验证 -待添加 +验证系统用于验证对于特定的控制器操作或服务的方法的用户输入或客户端请求. + +ABP与ASP.NET Core模型验证系统系统兼容,[模型验证文档](https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation)中的内容对于基于ABP应用程序同样有效.所以本文主要集中在ABP特征,而不是重复微软文档. + +ABP增加了以下优点: + +* 定义 `IValidationEnabled` 向任意类添加自动验证. 所有的[应用服务](Application-Services.md)都实现了该接口,所以它们会被自动验证. +* 自动将数据注解属性的验证错误信息本地化. +* 提供可扩展的服务来验证方法调用或对象的状态。 +* 提供[FluentValidation](https://fluentvalidation.net/)的集成. + +## 验证DTO + +本节简要介绍了验证系统.有关详细信息请参阅[ASP.NET Core验证文档](https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/validation). + +### 数据注解 Attribute + +使用数据注解是一种以声明式对[DTO](Data-Transfer-Objects.md)进行验证的简单方法. +示例 : + +````csharp +public class CreateBookDto +{ + [Required] + [StringLength(100)] + public string Name { get; set; } + + [Required] + [StringLength(1000)] + public string Description { get; set; } + + [Range(0, 999.99)] + public decimal Price { get; set; } +} +```` + +当使用该类作为[应用服务](Application-Services.md)或控制器的参数时,将对其自动验证并抛出本地化异常(由ABP框架[处理](Exception-Handling.md)). + +### IValidatableObject + +`IValidatableObject` can be implemented by a DTO to perform custom validation logic. `CreateBookDto` in the following example implements this interface and checks if the `Name` is equals to the `Description` and returns a validation error in this case. +可以将DTO实现 `IValidatableObject` 接口进行自定义验证逻辑. 下面的示例中 `CreateBookDto` 实现了这个接口,并检查 `Name` 是否等于 `Description` 并返回一个验证错误. + +````csharp +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace Acme.BookStore +{ + public class CreateBookDto : IValidatableObject + { + [Required] + [StringLength(100)] + public string Name { get; set; } + + [Required] + [StringLength(1000)] + public string Description { get; set; } + + [Range(0, 999.99)] + public decimal Price { get; set; } + + public IEnumerable Validate( + ValidationContext validationContext) + { + if (Name == Description) + { + yield return new ValidationResult( + "Name and Description can not be the same!", + new[] { "Name", "Description" } + ); + } + } + } +} +```` + +#### 解析服务 + +如果你需要从[依赖注入系统](Dependency-Injection.md)解析服务,可以使用 `ValidationContext` 对象. +例: + +````csharp +var myService = validationContext.GetRequiredService(); +```` + +> 虽然可以在 `Validate` 方法中解析服务实现任何可能性,但在DTO中实现领域验证逻辑不是一个很好的做法. 应保持简单的DTO,他们的目的是传输数据(DTO:数据传输对象). + +## 验证基础设施 + +本节介绍了ABP框架提供的一些额外的服务. + +### IValidationEnabled 接口 + +`IValidationEnabled` 是可以由任何类来实现的空标记接口(注册到[DI](Dependency-Injection.md)并从中解析),让ABP框架为该类执行验证系统. +示例 : + +````csharp +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Validation; + +namespace Acme.BookStore +{ + public class MyService : ITransientDependency, IValidationEnabled + { + public virtual async Task DoItAsync(MyInput input) + { + //... + } + } +} +```` + +> ABP框架使用[动态代理/拦截](Dynamic-Proxying-Interceptors.md)系统来执行验证.为了使其工作,你的方法应该是 **virtual** 的,服务应该被注入并通过接口(如`IMyService`)使用. + +### AbpValidationException + +一旦ABP确定了一个验证错误,它就会抛出类型为 `AbpValidationException` 的异常. 你的应用程序代码可以抛出 `AbpValidationException`,但大多数情况不会使用它. + +* `ValidationErrors` 是 `AbpValidationException` 的属性,它包含了验证错误列表. +* `AbpValidationException` 的日志级别设置为 `Warning`. 它将所有验证错误记录到[日志系统](Logging.md). +* `AbpValidationException` 由ABP框架自动捕获并将HTTP状态码设置为400转换成可用的错误响应. 参阅[异常处理](Exception-Handling.md)文档了解更多. + +## 高级主题 + +### IObjectValidator + +除了自动验证你可能需要手动验证对象,这种情况下[注入](Dependency-Injection.md)并使用 `IObjectValidator` 服务: + +* `Validate` 方法根据验证​​规则验证给定对象,如果对象没有被验证通过会抛出 `AbpValidationException` 异常. +* `GetErrors` 不会抛出异常,只返回验证错误. + +`IObjectValidator` 默认由 `ObjectValidator` 实现. `ObjectValidator`是可扩展的; 可以实现`IObjectValidationContributor`接口提供自定义逻辑. +示例 : + +````csharp +public class MyObjectValidationContributor + : IObjectValidationContributor, ITransientDependency +{ + public void AddErrors(ObjectValidationContext context) + { + //Get the validating object + var obj = context.ValidatingObject; + + //Add the validation errors if available + context.Errors.Add(...); + } +} +```` + +* 记录将类注册到[DI](Dependency-Injection.md)(实现`ITransientDependency` 如同本例) +* ABP会自动发现验证类,并用于任何类型的对象验证(包括自动方法调用验证). + +### IMethodInvocationValidator + +`IMethodInvocationValidator` 用于验证方法调用. 它在内部使用 `IObjectValidator` 来验证传递给方法调用的对象. 由于框架会自动使用此服务,通常你并不需要此服务,但在少数情况下你可能在应用程序中重用或替换它. + +## FluentValidation Integration + +Volo.Abp.FluentValidation 包将FluentValidation库集成到了验证系统(通过实现 `IObjectValidationContributor`). 请参阅[FluentValidation集成文档](FluentValidation.md)了解更多信息. \ No newline at end of file diff --git a/docs/zh-Hans/docs-nav.json b/docs/zh-Hans/docs-nav.json index 301af0fd6a..72f92203db 100644 --- a/docs/zh-Hans/docs-nav.json +++ b/docs/zh-Hans/docs-nav.json @@ -75,7 +75,14 @@ "path": "Exception-Handling.md" }, { - "text": "验证" + "text": "验证", + "path": "Validation.md", + "items": [ + { + "text": "FluentValidation集成", + "path": "FluentValidation.md" + } + ] }, { "text": "授权" From 22f514d1d6989f2ecc0fae65f20b07828299248a Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Fri, 10 Jan 2020 17:12:21 +0300 Subject: [PATCH 50/61] fix(theme-shared): correct toast-container component z-index --- .../components/toast-container/toast-container.component.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss index facbd8b838..ee8289dc56 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss @@ -6,6 +6,7 @@ justify-content: flex-end; min-width: 350px; min-height: 80px; + z-index: 1900; &.new-on-top { flex-direction: column-reverse; } From d2fe08ba670b32cb0d707805ef333d215d9c63f6 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Fri, 10 Jan 2020 17:12:50 +0300 Subject: [PATCH 51/61] fix(theme-shared): change padding and width of the confirmation dialog --- .../lib/components/confirmation/confirmation.component.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss index 04bc4d6f84..752bb22eee 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss @@ -26,7 +26,7 @@ padding: 0; border: none; border-radius: 10px; - min-width: 450px; + width: 450px; min-height: 300px; background-color: #fff; box-shadow: 0 0 10px -5px rgba(#000, 0.5); @@ -78,7 +78,7 @@ .message { display: block; margin: 10px auto; - padding: 0; + padding: 20px; color: #777; font-size: 16px; font-weight: 400; From beb8cc113f3a171cfcabfce2ae3c37e5aad24971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 10 Jan 2020 17:57:45 +0300 Subject: [PATCH 52/61] Remove unused namespace. --- .../Abp/AspNetCore/Mvc/Validation/AbpValidationActionFilter.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/AbpValidationActionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/AbpValidationActionFilter.cs index 963459ab58..ae047fa30a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/AbpValidationActionFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/AbpValidationActionFilter.cs @@ -1,7 +1,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Filters; -using Volo.Abp.Aspects; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Mvc.Validation From e231f74db141c237013c5c2e84b960653fad879a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 10 Jan 2020 19:56:57 +0300 Subject: [PATCH 53/61] Update readmes of blogging and docs modules --- modules/blogging/README.md | 9 ++++++++- modules/docs/README.md | 20 +++++++++++--------- modules/docs/screenshot.png | Bin 120637 -> 0 bytes modules/docs/screenshot2.png | Bin 0 -> 266787 bytes 4 files changed, 19 insertions(+), 10 deletions(-) delete mode 100644 modules/docs/screenshot.png create mode 100644 modules/docs/screenshot2.png diff --git a/modules/blogging/README.md b/modules/blogging/README.md index 9eda941757..716713666f 100644 --- a/modules/blogging/README.md +++ b/modules/blogging/README.md @@ -1,3 +1,10 @@ # Blogging Module -This module is used for ABP blog: https://abp.io/blog/abp/ +This module adds a simple blog to your ABP application; + +* Allows to create multiple blogs in a single application. +* Supports the Markdown format. +* Allows to write comment for a post. +* Allows to assign tags to the blog posts. + +See the [blog.abp.io](https://blog.abp.io/) website as a live example of the blogging module. \ No newline at end of file diff --git a/modules/docs/README.md b/modules/docs/README.md index ee4e33a785..99117426d3 100644 --- a/modules/docs/README.md +++ b/modules/docs/README.md @@ -1,13 +1,15 @@ # Docs Module -This module is used to create technical documentation web sites. [abp.io](https://abp.io) web site uses this module for its documentation. +This module is used to create technical documentation web sites; -### Screenshot +* Built-in **GitHub integration**: Directly write and manage documents on GitHub. +* **Versioning** support directly integrated to GitHub releases. +* Supports **multi-language** (with fallback support to the default language). +* Supports the **Markdown** and HTML formats. +* Provides a **navigation** and an **outline** section. +* Allows to host **multiple projects** documentation in a single application. +* Links to the file on GitHub, so anyone can easily contribute by clicking to the **Edit link**. +* In addition to the GitHub source, allows to simply use a folder as the documentation source. -![screenshot](screenshot.png) +ABP Framework uses this module to host its documentation. See [docs.abp.io](https://docs.abp.io/). A screenshot from the ABP documentation: -### Main Features - -* Retrieves documents from a Github repository. -* Supports Markdown document formatting. -* Supports versioning (integrated to Github releases). -* Supports multiple projects. +![screenshot](screenshot2.png) diff --git a/modules/docs/screenshot.png b/modules/docs/screenshot.png deleted file mode 100644 index 55ff411f0c3821e3b5ae0c906fa02203b29321ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120637 zcmcG$byQT*`!|ZHAR-_jAT8Y>-5@y9A>G~G9U~$#LrQl@cXthqv~+_s3>`zqI~d>Z zZ{2&>UF*H?y892-IcN4h``P>1Pk#>Jk8~g;WM_^^xcvioKMkS1$_6YX^d8G z=>IrIJ7{|lhD)qG`ka%`leYRbEgi|b!N^Q-p8?2la1ao{D)VOV{MsnjYOb2q{%w5e zW@gXoV#&^l2XJw!8hqR$oHh(&Aqf{puwTkj%r91gQvz@16u_lsvz=E6iMdh5*ngfq zJl3K0d-V72Q_6dk7yo|QC6dzrcdftq5%KZA8~#A7*Z;1kd81qZUAGQ>e}eSy#uc6F z?Z4|Xr~mCKrn)9k{tcg)(k`{(;G3;)?C+4%*`J&k=Rb39FFizH3KSOp+o{Io{1`mG z8n^GfeazCqzJMGOcJ?h818-^LDlF93`J)psxRj^iwl;Mv?U{2vPlI5vD4y(Lm0}+P zG1`BYS>y73En~GT*YpX&eV8x&g&lF8sL1y6ddzpc*UKW<%`ThtVYb5!MP76Lz$N|QC0ky>Yx=lZUYZ9de{O?0@>=RhL z9(_XpPv5=ag?^gR=Lhx;$~yUXfdtG82?CsDwE;TSV;!EC*XQHJ*TtJp&igXW3cy=| zduB)mDwG21|6z!^*}kq28FSs<&BuwD0x`#5m*QgT+V>4AWh{l=z^jaRco|wxuYKPf zPo=IR361Z6hm9AP z@@jZ>+K8n1&KtEgy#(q1JtXOZylURTcm(V#-C&(d;I-IS=g8#dMgB4tE2YWiR?oA} z7c2-ADb^|fSh-cN;LT$MJknYE0cu?Y{ zU57s{{_m88JDj^mGdWNWY7aT}PR$NS6mLU?^pcod5u@9&z4xzjp*Y%Irv+jWy%z`MMNtr}h0gzre4frw61rx2a&R@X!~kPra?rg6HBh3o95F z&##ooRfr4@>+tUfFLYdFSvvw)aw->aH&jYxN?D{;^mHVqE9X$5AZPK<{<)AuO;h`+ zl9c(ol@}A7Na0E4hS!o}V(@Lp>$Vok1@_dePiZ)(%?VluV*EWYdvY#kg(s*nBf)C2 z&@;6USChjKpoal>90g10TiagJlQcK&Qe&T{OMA%7!2lMP0)#Bl$&HFm{($~mH@?i1 zOC{~jy1$L-sPug3!dVWu`W6qOeq(HyuQgCv$_V`c?3LTUJ%eU#||Y6`Byh?OIbdr)*?szOEw@?3?P%u zdKIVm9aPZys`CD1=Yz73uU)FlNJx^hleMgO{p!G%iAuW-AWU+$XZUu?;i=7>GI6sr zY?={-xaS>oG#S+-MV zF_w8cq;luEK2v-hd*wz&p2$@oZqum+$s%oHGi!U-K}!`lHq7D4s9Af5448J z_Oh%U#a`mSi2HRJZ5Jz)K~F53#OmO++Z2xKVl!lOy=1o8ASW|_{rw8de75RRiF;VD zVtrvSV%bh`U&8q)IOd-JIPQF<)QypNKhNSshTRrZ;jX?Vjl_L@qy)g>qYb&*`Z91n zwSy=}cy@mWnssN~iQ{f>2Z0L47J&>Wi=Eu(z5=o_V^u#|ec4lQZcY}4zgXBk>nG-i z8O_Gvqar0X4ii7Z6@9SG@b<28m36h3c2AqBM_fE)<)e*kF}V6$PN=741jN--_5RR- z0%W;ksX=hIGuGpmMI(=EzN0HACs#zaBX4XqB`=#51~a)S_?>t}u(TpU(I=u)`?#aFC}@p(&!pgr*uGrs`u z#PiG_ve#!TQ*GhRjuUk=i83>z-@60vTZ;1{Z_mcOSXxrZO6>|@3s&ec96e1@Mpj#^C*rn{p}6RFFdMJIaFDYWpqbj<-4`$zzKV zZHV$4#Dvq0EDFm9isZl!U1HfvX?-%(&-3vI$ii2j3Cky1rv=CTcc7g6346ITCXB?5 zvQG{3v$qorh@_Ro`l7Knf#qr<1sbTjC1@wqrKGZ@|a{xpfSMbqV?P)OyL&s;RWBI5mV)9Wi|S%<1y!r_f$K>*4I#g(Qw&MaWF_sJ`pMgu~~>7 zI-8fQUAzS`dri%oTKeS9hhc6__Hr!Z6?bN#Fvlh{(V zj_m~TzsN2>aKUCX-K$U50gd@FG(^! z{Ut%3VQ{iaz30CD3ySYF#GJf06>OWjbPX%N^P||ZEU6g;;bGz3V>L37(Qj;xvG>%w z=0Z=Fe4<=yCT}mJISs-903C6r`@@;fxk6fm_$fI2UPW5mSJJUb4vQx-!?Hn~)O7R1pV zyyWGk5&ydz?!S1%sESyMw9h-t?)gWG?>}QCk+u%Hh5R~9EycoEAcIbhQP@v*pQnYt zEyq?b?LD~tapZZvYS&44S3B3Xeg9R?ll3xts8<}FZPwYxc)LVLm(=dUIE{Ma8>_sX zx2wXJTG!B|)x&JP-4z@6>tG7Ho$y66yjH`gbzseu9Y?)-n4{OYVnr!!0Ef>?%DHyfx4sV$fcBT82(3iY z()zZgvZS`^k0@rzm@R$Lih?sMcfK9QG#+;zrQ*8OX?byZ%vPP3YR1$58-)-RK=rnE zQ_Rbp+L#xqG{&MySgi45dEEWLXa@B@d!3pQz=-EW5%a?&L^87g>{}SCKmr0re4sy9twD{0vx6H0*yQ0 z+O`Wx?;Vfw+X^%c!`_qVt;9zgm)V!=UEs0dOaGcPYXM?=&Ho$zj={s~y)Ac(i~0e-@wb7>W@3DvRDsFV5CxdtoUapK3kn zp&mLNX{vW%qhr;Xb$;xt{E9^|1s_a`vje22(vf;al=M@0j5dfq?$8QM=kZm;0?B0O zH4&jS9i4|K@0QMUidX$z|5pF5$5awU22#)!E+rvDlvDWXDg5nOf+#3-iQR4GU~qYe zRHVXVX=MdcppYb*m44f@XhB1FBu-|gz3w=E4OBx{N;DOU$PvIb2ph;uK|$#z{>Otv z>Ot&HC4HHQf|Wez zP$X5pm$w-g_)%TWrwc8&eHHf)90?`#88~O0NtiIxjb1+wnc5V?m2Uf&8kuFau(i~* zje-nIpLB{#;}o+AQLqWC8%th_CDO>rj@?fAVpYCP%%?a%xI3}d>_0>7?`Paz9j3|n zWzeZA9GPP_Ql`(g(2BUpR`_*Wt>QwVqkwH#Ge#Km=vrw4e-i1K{&*8Rq8AA_ zB*K?jfGge^mA>OTSvo?os7B7jM(GSn@~}@Hp@~&s_eU8oTiP=^2XwqDa}4q4aa-y? zg)khuvOUkL<*4Z0$4WTMV4P~ldJO@RM%ETtv9G0Mexdc%ZHOLMYE=Zi#;#F6M^uW+ zp-Byv1x0EpPxeVm{#X^KqNHAIHNE(|(!EqsW*Xf$andEqZYUF~|dT6g`5I zhdb#Jj*U_e7@Z$qttV1x220RI{Nz!1p_Uk>`Yo{=H3&E08wXAC8}UAj<){qh4FS1V z?No}SuL8EjCnrc=zo!jxk#*b0iw>;dyocPyH@MQPT&jCA+e zN{p89481xW;CutM$#{gRkaj0KKiM>Z_1#ju?3ca4M8bybXrHvjP>%lSY3G+OP90c@ z<-z}QcGI6kscF%ClwbIpWPkz_@u(Fc$PxNiTt?J#!Gjg zuK=Ae{O<{a+5FRMFSUi1>Ns+vjjhfR`y;S09efa*cPOc{O-$tc3a}y_Ugm3;^hzB> z^3L`zKX3MsVy|s)w=!$yFdfRbSn(cArd6u#;z?iJ(*9n%tvGV)#-0D6vh_mYyEAiy z1TYm>>+yC%1sLEhENiwirGg(q$oQdAR=)`W`7E5T5=Zz%7}^e@JKe&g8A z3PBLoUp~&FPS8uJ1b})nMHAY4ItAWR$jN!4Jy4J9tO7q_%nFu^4g+!`Y_Hotx#Cki zR@+*S)|3z#Y0%*97Kx7BRR(iC(=tA>sJ@sDb&TBr_bZncxoIUjr!9ar6%kRxWRoSm zutrr5juk5mv9XO3P@lmFB*xrgDLZM-47h%sTq@>AXKial=V=xG2$zbN)Ij;#v2LQ; z)%{gT($uq(oeGwtfAWROv_Kzft(+f-TBynO@}IDwZ6y$ATH8IA3)?fm2_>8VmOH<+S)-Pxbrx#`41l&zg}xa^2SW#SmS zmvJGW>-*i5g2}?RB^mFP^>hvjHTe#P0yPZ3jYd%-yR!y&^sTXlNJ7*b>UgC{mGs%U zC7x#|&!QAFc&EqL)t6@nb>6evqDnfQtjo&aSK7L9N=rSQ*e8`rnVO5O@0Tl20bEup}5h(O!_7$ zvS?S6C1PE^MA>Tje>exTu^CnAGQCb#ZA3M=f|&nKI6}Itgp(5LdLnmIx_O7-2;=8~ zZwQlq@IMdj@K>v-#Fl;8%l~x$-%a1AQ(XRbA3lX4|0jit@c$um|396NdgdCrzsy2N zhe@1tUOEmE>ORS5)HR(h_fdKVzKVt=7_#4ibjF;ZQbTpv>}EVGFZi z9<=;Vo*Uu1+ajhf`lcZIB9S0olvxeSp-AxSy5=Uq-n0MY(huK7z=anie#|%JU_b=k zul`n;B$r)G%Sy<;sp{a~)NqXTRL@05lYZ0VB$}=J<)tI}=)fzb-x>mLw*X|`9koHD zMjBYzmdblim|dQPwa!VBuWm(-pw5k(B-Y~&2K2`eiR8tx6@Dy1v-%dUh$EhwLSK7# zQ&HpppR&j_cQz%zifC5xJ50JAp6??RbpXX~tH_OwDHPGn0PV<)tOvc%$)fX^I;@r( z=f^8i<~RxZ!c~t(Ix48r=)Cvy5by?rRQP%v{e_TrK49h5o5b{dP5h?yt1n#_FEQbM zO}3)Jv$P0s#@d#{;4WKcS-lIrW_kCyg;t}50i zuN{w9A(E4)MuPg6?bib86|l{Q(`;(@<)KH@O*?uE@g2lD?lHo-2z3N{Ldu(MTJ5=xI_xv2zS-wAU z4FUrE4OUt@jjlHS0tlKhnVFgY%8UpINfr%HChMIxxqduOS23Wb_%mm#{|lFYjQc;+ zE7PnNsTbz??Li}sS(DF^Y@R*nD|57!Y(zZ_zf$og^#l8noM(Qefvs*91);~k)4g>p zH~I?CmL?_Np*oklAR_#<4C4AQAi>N%)z0o~cjXAF>FYUz4qN*|d$Uf~c&>nMWJu6Z`^fGUyAbXsgXzqM2cCarfGc<$tR%07k zr=V~B`c1&68j8WeQtU5csP&YCk_@!V0Vwq${(n5jE2acw{AjFfw<_8%S-cicA2bJK zn^~WIlGe{<)dM-y^}w=buo=<^Wu*73zZ6H`>JqTuIXB8JT~zZ$z-U-LSxOfE0+Ydz zujLxbp5UApNV?n$v-92M5Wd#QtXIGs?mYM*#V4P7V%R-P&ifXH^mjs|3O`?aXxYOF z47#vw`pi}@`ePl6?ijErAekT{-7P{5x6!4cO1WVuBZ;1diCS0hxMO>sO{Wq%9QL8WuZ36Gl zVM^Dok;~d|ttKGq=l71JynP)3pdS>D(a3ZhPHnHH=?=_m*P&D|VB0P`=az9I{-##{ zumF#mY>_Gls`ik-d_ezM+_-yiY5q=6+=Vc}HbVnAEdID|A|Ot3t7AtD;3>_CW*P+} zA^EkLQ%?#t9f(N{x=w@qE3?afl&Vmo0(7DVk+f}wKZ^{m9Hj(wVuoNW|8dUOXEZFZ z$VtL;_q#lQHsLz^aTyNMh!Uu_X?oqMt#9iwpy7!&z*(MttQQ`GjaeT~w2mh=+n$iA zB}{(Y?9_By-_-L(Cjr+!l|>jg zfkq#=g4dND(k`W9NCD1^d+YqJwlKSANEJKcT0+li5&f?MdfSbGdz8c{+KKZu=nEi= zme;dsNTrq2<>Oo&{+FXfPV}nBlZ<|tBXCCP)N`5sdPh#KsJd2LbT`p&r5qo3RejW= zZ+c3ySUOd_6mBuArmE|P_Umk0o?AJ)PzxCQdJ;0-gLhmHQ+1>clRWip8S)@5XNTNgO7bN9ZjxSPsVzpS>c=f0T<3))lmM|dSll%y zi^{_RDU*IsT~tzV7yel{YJCny%^UP8WL0KA4e`o8T^YHBhRFU;Wj`K;7&V~vK@VskiSbtYnibSxTd{9J?HjxlT>H-;h@c^+Y}xSAMlCAJRX6@7>p8@`xI$ z0fQW9@muM1yVy*1H|%U;&~y`Xj}*2z_w+s8sVrgt+Mwjb3p{T;>AcpvaSV$o5zl0{ zTOD(d+;k@WnUdIl**NuqSfE;@DPkSBKOEBN+@&h!wYTog&3***DNgaxW(?+c08S@UrPe0&8Bg)n{C)!Y#c$ zCU={@*_=4ClSUn_rSZA!5AEjP6b|xQzptte2bU7{Yl{J5_~W{LJrd04@7b_Pl*G3u z8}s|^cq&cKJ~MrAgBKR;JIAC=<)5vbzsVrP!w8OoEI6Hs8L3QK$v3ZbYFd(IB%WrY zxG|$mm(Q7PFRWa(hdT7v#ByQro)VK(zO}XN{1pg>&(<%oSa-51 zh*DY)t1@-{V=4D%)KH4{<@_^)rR@q@APu8>Ft-M_I6*8Jbak})4)>a}V)3?)5xXTC z4Yu&w>Mcwq^{%=CvYGjanh-%r7A(ZuC{*{+?m(=|!P?|Y-c!!x4$dD7g61nqAqKW265ceco)j=o>%FkS z6X%n>dE{nZ)2q%YBi#LOl91WcuA-4)&j>$?xtfTc6+73GXRf0#0yb02&YXIu+Gx&6 za9Adsb39*Of@%#P5Hg;9Rx)9u*@eiJnr311rT88y(yHC{)igXIU8 zFoo}7X@wfnOaOp#i%}0wTAj`k%b1K5;aUr&xpkS=>8{QCc>L|{;_-}h2=h>pf1%)$ z!lViR@0*~_TI*m`6S*QMHz2pq+s&f@{w&HlCZXd#5V(7R4Kh1oHF`zSz-#3{9~gqa z2fJCD(5R-IYi4ok0@>>%9Oqo@)v^_W^UN-;y%v28(@o!=i#Uj2Z;IQ*SK23WPI<;1 z$kne9-w&3oCu;5P!^x5PHis?mt0)&rbLOij6nuHxyAc0Pc~)ZW7h$cxT>rSb!+p7ErpW2qs%W$tXGU;A| zTe^LG!6Mx@ED=mTL8TawnG_D$n95)5Kt5`qGj8ZL(eZfHvR@E)EBMq_XUA@Vjj=(e z@Y{kRhmx70g%ASQGHhUu;f5GgaBh871p?(Qj|bZA=959`G;2+tI~kQGSL;&bU z*uFPE*9gR7=4}W&IRS#X%{@iHeBMy42IHp3m?=v@P`3W4L|Z8pJP@%AyX(h_!=NB9 zz&#LFx0^5Zu=T0EtaK!Ie5M)kqX=jbc#?3x52SGbDQDwOzJ4DEtQ*i*Fjc$HO(T#7 z05*>u?H27K2Y;QPCiRPk3P+b@X6ATdVoszo7_rFl1}{o-B(HaS87_vj007mw$IoB) z1h*`tDo6uL$_Zb?SkQ8R;SlP+o;{Yj*rCHd4-hm*wF^@6RqC^m8^OAyDbNg4=5 za&|;0F|)4BNJqowEmd$5oxnbge3;1T&ZM!m0or>?} zJ7uMpW+f+cOt>bgEa!Z%uTwL2n=2cte;Fc%f%=9|!nwIX%B^fm-SjEuNSQ{Zc%|CA zW^(e+LIP<^MNbCt1&xq)m`I=>a{It*+*yD`yX}!EaRM+1yZL7)%~csK^-4;Jpwwj4 zZ=UGKX&RBO72o(QjbK;yG~SGT-q!!^_6m8fS}(KKOl4^*|FHHfUWp5No{2C)r2*lx zn}@T&v}R4MBFr!zuBE6;(9>h;(SU|xApthGxR92^Uy!I^RNkCBOnyy0xZFuZi2rYIVhaH5su2$c=?Mifs^Po7UjWU5pp!Q3E! z<+wtOJOi_Bbx_8PP>|yjt-plhHhDy2o20xR>11=u4U#8T`AwdAV$xCwzIAw!vHRAS zODy%z&VdCGEF*oF00dBt{C)@z8&-SFh{LX8=6Q5`fL`!W%C)Q!ud+N#nT#7SE zZoGgYrgv;ZNzXUhDdZ{DjI+`VH4r5M%FY@p7|Z8&o(83B;r+Pi16-WF`GMOyYy55% zqoVu5^eotzFt;7Ef_X6jz#qvAGe)WSxaO!{PG@$aCCCNutSP4KPG3^TXv_w`!MWz* zC^0d-T5Y&yb^{_!({F~WSCaRJ+;M-dRD=ECHxFA&suxRb+@fheJ#v-^yInx$QTo7y z$$Lt;HM?N^K2G;mHkJL==}Jkbq-m`lbil?^)?^2|JUy7RsuiqFbl(}|&-vg#dtM=- zpAeqqO?3z^JVrWS#cdMa$o8Kk8pzIF*Yo3=DlO&A{r*RPB2Sf=G9$d>e{;VKgK1Q+ z{VX(_f+kiBPf~?nFY0HynbDwQVybACj2Mt{Vz zyI4;7!;e53;?7iGCQ=&O*hmuy+Bz=fHFX_OswLjqmH{Y7xNS(CRMJ5djiKW#c)k?m z;fn#9ZGnN%E*$%RebFvwAikaL%h+$QOC31m9(O-?qHF56T)Y3sM~y z4PLx2F=OyjASMN}BH&(((ijhvCNOBL)+twpv)-j7?}Jy>pB)SgfFG=_XkZI;Fe-HI zSF`gVyRPnVk#`dZYN2}lwOAV zSW@;rpgQU%uoT!N2YB_?ao~3Ue2r~G0Z5)Po94O~m1OQDeWNqWN$&WX-9u4p&v$~{ z?H;b(pi^mPO{Hoc8;^oXBCNm)6ykg@F;ir2Q=4DVFV#{Es^07Ql>$G)U$f&i#-;&D zLo;i+x-y>I_=AwB`3k4p{FRMH`LYZJCUC!?%NGFfbtvs@z~qeesbNmgc(Ox)*~roA z2g=fGt~xvs&7^;SdvIOjtyJW>$0Nj-C=Z~N);Q{GVPJe(+<@w(N=c$GzYR@QTN>af zlAeg$ci;0L&?JZQdX3!p?FtSKAh2=R-?h&Og7c0#uQnI?478sXvMe0+5hBL`)~XL@ z;?J5pJmUhDD=X!04L>Fnu*}yTV;3@gp^S@9h*B~68Op%DHi4g9EPQg=e?U~e;QK8z z)6@fQ_3kbpG1n!peTCN(?!C4PsW(}E=gU5&Sa`CO!E=T#`_`9HbqKSWz`M(yNxJFL ziOTD<#M#*Vr9*rpWNgd{JX`I?;<^ZUe0*O*RJ@4Q?{Ml=NDkDFP|!)d>5DD5V5rtI z@nD)gyt2!fz~|)5T?$5%BgVTPAL#L4@O-&Y=dPZ7vzJ;qZ+0$JYB}q2+IK(1TjhKn z+MPHMmoZEnf1PHQfe7z8vRCLK4!j`S)Azd>%7PJ2SDYN5+5X|YDjNlZwjlNXx=0n zgd|PA=FtB`ivgoAX^bg*WU84oDNX24B&50`ft^ouIFxcf8ZsYTKToS&3A^F1uPdiEf^kTmjj;$23l?!>E(p-vZLCIj;2m5Jr>b5rgsY=I zB<>FpA~(P%bZ@ES?REe~z053qSBcDi@Wih3f$dd1O&IEg-dn?aQUwC!*pRj>IwB8*Rxv~ogF(r5XH9n#YYE)?@ z`4D$n-sO)KcOHQ)*w`&M=BeRF(012us*Uxj@bwZN_4k~YT53YoDqihv*YzxmCs(Fl zV3vvk3M(50S`QJUMG;@^>K+yU;w0K6H?-JJ%~kHE&(fb$P3_)fPN+%9ZarL$V26c7 zO1JywT_alPJvr}gT>TOzChTCtx%S_&b$7o^tH*h?~y3b`>#w7DA*0IbD zGxJMY6C#&2t~y$;pQoZfW@l#~^4YMPlVM@0?7c~2mnUduLOv$a8Wa&Hohm3wFU}fP z1j`L2zdgoO@vcy{lP@a~8spv-K3ffR7(+ycL38*v;JKZT-)L>e!j~9f6R226-FL~P z*sB!Y9)g@ES+;^6{)jn(_uWGskgV zBd!PZzS3^K*Ne%Y9?78>pg%?oxMiwCY3hmH6F3?hQcLr-HV1a}&p7Q~&=9BJeE
  • ;{9x4|sZH1>?Up5()pDuK*OFiS*@GQ9=*?#n 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

      ilh;)MV3H4CE4oc4+?u`! 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

      >2%2r69y;J6TF%taZAI{TH?V7PWD9pf^ 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 LYO>`o%|8Awq5?Lg diff --git a/modules/docs/screenshot2.png b/modules/docs/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..0dcdf921b9407668747a9ae68c7be456d6f560f0 GIT binary patch literal 266787 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� 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

      8o1 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

      J}(TkA>&Au}7HtaH5P?TUBK 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¨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%0D`YjVlIC_<-BU^oI%B4AGCXrv9 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

      }76@w!#Xh8C~f&!j5G~*ewjd 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 F{{#Q#xo!Xe literal 0 HcmV?d00001 From f98913202fd109423c88796aa4ce242bcdbf0134 Mon Sep 17 00:00:00 2001 From: YinChang Date: Sat, 11 Jan 2020 18:30:06 +0800 Subject: [PATCH 54/61] samples/BookStore fix #2572 --- .../Acme.BookStore.Application/BookStoreApplicationModule.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs b/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs index a97917f774..80488be0e8 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs +++ b/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs @@ -1,4 +1,5 @@ -using Volo.Abp.AutoMapper; +using Volo.Abp.Account; +using Volo.Abp.AutoMapper; using Volo.Abp.FeatureManagement; using Volo.Abp.Identity; using Volo.Abp.Modularity; @@ -10,6 +11,7 @@ namespace Acme.BookStore [DependsOn( typeof(BookStoreDomainModule), typeof(BookStoreApplicationContractsModule), + typeof(AbpAccountApplicationModule), typeof(AbpIdentityApplicationModule), typeof(AbpPermissionManagementApplicationModule), typeof(AbpTenantManagementApplicationModule), From 40d0586d49dc6419eac820611b30e9afeec6b569 Mon Sep 17 00:00:00 2001 From: RayMMond Date: Mon, 13 Jan 2020 11:30:08 +0800 Subject: [PATCH 55/61] correct chinese localization --- .../Volo/Abp/Validation/Localization/zh-Hans.json | 4 ++-- .../Volo/Abp/Account/Localization/Resources/zh-Hans.json | 2 +- .../Volo/Abp/Identity/Localization/zh-Hans.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/zh-Hans.json b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/zh-Hans.json index ac0c014967..282423a44a 100644 --- a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/zh-Hans.json +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/zh-Hans.json @@ -8,7 +8,7 @@ "The {0} field only accepts files with the following extensions: {1}": "{0}字段只允许以下扩展名的文件: {1}", "The field {0} must be a string or array type with a maximum length of '{1}'.": "字段{0}必须是最大长度为'{1}'的字符串或数组.", "The field {0} must be a string or array type with a minimum length of '{1}'.": "字段{0}必须是最小长度为'{1}'的字符串或数组.", - "The {0} field is not a valid phone number.": "字段{0}不是有效的身份证号码.", + "The {0} field is not a valid phone number.": "字段{0}不是有效的手机号码.", "The field {0} must be between {1} and {2}.": "字段{0}值必须在{1}和{2}范围内.", "The field {0} must match the regular expression '{1}'.": "字段{0}必须匹配正则表达式'{1}'.", "The {0} field is required.": "字段{0}不可为空.", @@ -22,7 +22,7 @@ "ThisFieldOnlyAcceptsFilesWithTheFollowingExtensions:{0}": "字段只允许以下扩展名的文件: {0}", "ThisFieldMustBeAStringOrArrayTypeWithAMaximumLengthoOf{0}": "字段必须是最大长度为'{0}'的字符串或数组.", "ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}": "字段必须是最小长度为'{0}'的字符串或数组.", - "ThisFieldIsNotAValidPhoneNumber.": "字段不是有效的身份证号码.", + "ThisFieldIsNotAValidPhoneNumber.": "字段不是有效的手机号码.", "ThisFieldMustBeBetween{0}And{1}": "字段值必须在{0}和{1}范围内.", "ThisFieldMustMatchTheRegularExpression{0}": "字段必须匹配正则表达式'{0}'.", "ThisFieldIsRequired.": "字段不可为空.", diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json index 391dee0531..c778a28dd6 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json @@ -29,7 +29,7 @@ "DisplayName:Surname": "姓", "DisplayName:Password": "密码", "DisplayName:EmailAddress": "电子邮件地址", - "DisplayName:PhoneNumber": "电话号码", + "DisplayName:PhoneNumber": "手机号码", "PersonalSettings": "个人设置", "PersonalSettingsSaved": "个人设置已保存", "PasswordChanged": "修改密码", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json index f57029eb9e..4908f170fa 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json @@ -82,7 +82,7 @@ "DisplayName:Abp.Identity.Lockout.LockoutDuration": "锁定时间(秒)", "DisplayName:Abp.Identity.Lockout.MaxFailedAccessAttempts": "最大失败访问尝试次数", "DisplayName:Abp.Identity.SignIn.RequireConfirmedEmail": "要求验证的电子邮箱", - "DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "要求验证的电话号码", + "DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "要求验证的手机号码", "DisplayName:Abp.Identity.User.IsUserNameUpdateEnabled": "启用用户名更新", "DisplayName:Abp.Identity.User.IsEmailUpdateEnabled": "启用电子邮箱更新", "Description:Abp.Identity.Password.RequiredLength": "密码的最小长度.", @@ -95,7 +95,7 @@ "Description:Abp.Identity.Lockout.LockoutDuration": "当锁定发生时用户被的锁定的时间(秒).", "Description:Abp.Identity.Lockout.MaxFailedAccessAttempts": "如果启用锁定, 当用户被锁定前失败的访问尝试次数.", "Description:Abp.Identity.SignIn.RequireConfirmedEmail": "登录时是否需要验证的电子邮箱.", - "Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "登录时是否需要验证的电话号码.", + "Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "登录时是否需要验证的手机号码.", "Description:Abp.Identity.User.IsUserNameUpdateEnabled": "是否允许用户更新用户名.", "Description:Abp.Identity.User.IsEmailUpdateEnabled": "是否允许用户更新电子邮箱." From f58a127189d024eca9772a887e7305702c4806af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 13 Jan 2020 11:00:44 +0300 Subject: [PATCH 56/61] Create Blogging.md --- docs/en/Modules/Blogging.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/en/Modules/Blogging.md diff --git a/docs/en/Modules/Blogging.md b/docs/en/Modules/Blogging.md new file mode 100644 index 0000000000..0d2ab35c21 --- /dev/null +++ b/docs/en/Modules/Blogging.md @@ -0,0 +1,3 @@ +# IdentityServer Module + +TODO \ No newline at end of file From da4c91cabd5650646384cb8256d1166da96646e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 13 Jan 2020 13:10:15 +0300 Subject: [PATCH 57/61] #2597 Rename AbpSerilogModule to AbpAspNetCoreSerilogModule to bettern align the module name and the package name. --- .../Volo/Abp/AspNetCore/Serilog/AbpSerilogModule.cs | 2 +- .../Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs | 2 +- .../MyProjectNameHttpApiHostModule.cs | 2 +- .../MyProjectNameHttpApiHostModule.cs | 2 +- .../MyProjectNameIdentityServerModule.cs | 2 +- .../MyProjectNameWebModule.cs | 2 +- .../MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs | 2 +- .../MyProjectNameHttpApiHostModule.cs | 2 +- .../MyProjectNameIdentityServerModule.cs | 2 +- .../MyProjectNameWebHostModule.cs | 2 +- .../MyProjectNameWebUnifiedModule.cs | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogModule.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogModule.cs index 5012d54e30..2b718fcb84 100644 --- a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogModule.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.AspNetCore.Serilog typeof(AbpMultiTenancyModule), typeof(AbpAspNetCoreModule) )] - public class AbpSerilogModule : AbpModule + public class AbpAspNetCoreSerilogModule : AbpModule { } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs index 64ac0d76bc..736539b5db 100644 --- a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs @@ -13,7 +13,7 @@ namespace Volo.Abp.AspNetCore.App typeof(AbpAspNetCoreTestBaseModule), typeof(AbpAspNetCoreMvcModule), typeof(AbpAspNetCoreMultiTenancyModule), - typeof(AbpSerilogModule), + typeof(AbpAspNetCoreSerilogModule), typeof(AbpAutofacModule) )] public class AbpSerilogTestModule : AbpModule diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index 3db35cd20b..81745602d9 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -30,7 +30,7 @@ namespace MyCompanyName.MyProjectName typeof(AbpAspNetCoreMvcUiMultiTenancyModule), typeof(MyProjectNameApplicationModule), typeof(MyProjectNameEntityFrameworkCoreDbMigrationsModule), - typeof(AbpSerilogModule) + typeof(AbpAspNetCoreSerilogModule) )] public class MyProjectNameHttpApiHostModule : AbpModule { diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs index 73a9d01be6..769208b664 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs @@ -36,7 +36,7 @@ namespace MyCompanyName.MyProjectName typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAccountWebIdentityServerModule), - typeof(AbpSerilogModule) + typeof(AbpAspNetCoreSerilogModule) )] public class MyProjectNameHttpApiHostModule : AbpModule { diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs index 117386e588..47cc80fcca 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs @@ -37,7 +37,7 @@ namespace MyCompanyName.MyProjectName typeof(AbpAccountApplicationModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(MyProjectNameEntityFrameworkCoreDbMigrationsModule), - typeof(AbpSerilogModule) + typeof(AbpAspNetCoreSerilogModule) )] public class MyProjectNameIdentityServerModule : AbpModule { diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs index c30a3b5d88..f9b96fe5de 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs @@ -51,7 +51,7 @@ namespace MyCompanyName.MyProjectName.Web typeof(AbpHttpClientIdentityModelModule), typeof(AbpIdentityWebModule), typeof(AbpTenantManagementWebModule), - typeof(AbpSerilogModule) + typeof(AbpAspNetCoreSerilogModule) )] public class MyProjectNameWebModule : AbpModule { diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs index cd27c9ece2..43da5d0a49 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs @@ -49,7 +49,7 @@ namespace MyCompanyName.MyProjectName.Web typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpTenantManagementWebModule), - typeof(AbpSerilogModule) + typeof(AbpAspNetCoreSerilogModule) )] public class MyProjectNameWebModule : AbpModule { diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index 972ccc9708..9bf05a70b7 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -41,7 +41,7 @@ namespace MyCompanyName.MyProjectName typeof(AbpAuditLoggingEntityFrameworkCoreModule), typeof(AbpPermissionManagementEntityFrameworkCoreModule), typeof(AbpSettingManagementEntityFrameworkCoreModule), - typeof(AbpSerilogModule) + typeof(AbpAspNetCoreSerilogModule) )] public class MyProjectNameHttpApiHostModule : AbpModule { diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs index 7205fdf225..51e8935288 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs @@ -68,7 +68,7 @@ namespace MyCompanyName.MyProjectName typeof(AbpTenantManagementHttpApiModule), typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(MyProjectNameApplicationContractsModule), - typeof(AbpSerilogModule) + typeof(AbpAspNetCoreSerilogModule) )] public class MyProjectNameIdentityServerModule : AbpModule { diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs index cabb843736..8dc21d82c1 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs @@ -57,7 +57,7 @@ namespace MyCompanyName.MyProjectName typeof(AbpTenantManagementHttpApiClientModule), typeof(AbpFeatureManagementHttpApiClientModule), typeof(AbpPermissionManagementHttpApiClientModule), - typeof(AbpSerilogModule) + typeof(AbpAspNetCoreSerilogModule) )] public class MyProjectNameWebHostModule : AbpModule { diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs index ea653ca4a1..6040d7665f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs @@ -58,7 +58,7 @@ namespace MyCompanyName.MyProjectName typeof(AbpTenantManagementApplicationModule), typeof(AbpTenantManagementEntityFrameworkCoreModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), - typeof(AbpSerilogModule) + typeof(AbpAspNetCoreSerilogModule) )] public class MyProjectNameWebUnifiedModule : AbpModule { From c88cd2054e4b4aebafe69a97114a71d4cad9570a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 13 Jan 2020 13:20:18 +0300 Subject: [PATCH 58/61] #2597 Refactor AbpAspNetCoreSerilogOptions --- ...CoreSerilogApplicationBuilderExtensions.cs | 2 +- .../AbpAspNetCoreSerilogEnrichersOptions.cs | 21 ------------- ...odule.cs => AbpAspNetCoreSerilogModule.cs} | 1 - .../Serilog/AbpAspNetCoreSerilogOptions.cs | 30 +++++++++++++++++++ .../Serilog/AbpSerilogEnrichersConsts.cs | 10 ------- ...gMiddleware.cs => AbpSerilogMiddleware.cs} | 16 +++++----- .../Serilog/Serilog_Enrichers_Tests.cs | 16 +++++----- 7 files changed, 47 insertions(+), 49 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogEnrichersOptions.cs rename framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/{AbpSerilogModule.cs => AbpAspNetCoreSerilogModule.cs} (90%) create mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogOptions.cs delete mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogEnrichersConsts.cs rename framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/{SerilogMiddleware.cs => AbpSerilogMiddleware.cs} (71%) diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs index f9093ffaac..b7a02caa5c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs @@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Builder public static IApplicationBuilder UseSerilogEnrichers(this IApplicationBuilder app) { return app - .UseMiddleware(); + .UseMiddleware(); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogEnrichersOptions.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogEnrichersOptions.cs deleted file mode 100644 index 06453cb61f..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogEnrichersOptions.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Volo.Abp.AspNetCore.Serilog -{ - public class AbpAspNetCoreSerilogEnrichersOptions - { - public string TenantIdEnricherPropertyName { get; set; } - - public string UserIdEnricherPropertyName { get; set; } - - public string ClientIdEnricherPropertyName { get; set; } - - public string CorrelationIdPropertyName { get; set; } - - public AbpAspNetCoreSerilogEnrichersOptions() - { - TenantIdEnricherPropertyName = AbpSerilogEnrichersConsts.TenantIdEnricherPropertyName; - UserIdEnricherPropertyName = AbpSerilogEnrichersConsts.UserIdEnricherPropertyName; - ClientIdEnricherPropertyName = AbpSerilogEnrichersConsts.ClientIdEnricherPropertyName; - CorrelationIdPropertyName = AbpSerilogEnrichersConsts.CorrelationIdPropertyName; - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogModule.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogModule.cs similarity index 90% rename from framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogModule.cs rename to framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogModule.cs index 2b718fcb84..dc8e7c1ce4 100644 --- a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogModule.cs @@ -1,4 +1,3 @@ -using Volo.Abp.AspNetCore; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogOptions.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogOptions.cs new file mode 100644 index 0000000000..84f212ff4a --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogOptions.cs @@ -0,0 +1,30 @@ +namespace Volo.Abp.AspNetCore.Serilog +{ + public class AbpAspNetCoreSerilogOptions + { + public AllEnricherPropertyNames EnricherPropertyNames { get; } = new AllEnricherPropertyNames(); + + public class AllEnricherPropertyNames + { + ///

      + /// Default value: "TenantId". + /// + public string TenantId { get; set; } = "TenantId"; + + /// + /// Default value: "UserId". + /// + public string UserId { get; set; } = "UserId"; + + /// + /// Default value: "ClientId". + /// + public string ClientId { get; set; } = "ClientId"; + + /// + /// Default value: "CorrelationId". + /// + public string CorrelationId { get; set; } = "CorrelationId"; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogEnrichersConsts.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogEnrichersConsts.cs deleted file mode 100644 index bf2832b553..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogEnrichersConsts.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Volo.Abp.AspNetCore.Serilog -{ - public class AbpSerilogEnrichersConsts - { - public const string TenantIdEnricherPropertyName = "TenantId"; - public const string UserIdEnricherPropertyName = "UserId"; - public const string ClientIdEnricherPropertyName = "ClientId"; - public const string CorrelationIdPropertyName = "CorrelationId"; - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/SerilogMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogMiddleware.cs similarity index 71% rename from framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/SerilogMiddleware.cs rename to framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogMiddleware.cs index e03bcd5342..8a8f032766 100644 --- a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/SerilogMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogMiddleware.cs @@ -13,20 +13,20 @@ using Volo.Abp.Users; namespace Volo.Abp.AspNetCore.Serilog { - public class SerilogMiddleware : IMiddleware, ITransientDependency + public class AbpSerilogMiddleware : IMiddleware, ITransientDependency { private readonly ICurrentClient _currentClient; private readonly ICurrentTenant _currentTenant; private readonly ICurrentUser _currentUser; private readonly ICorrelationIdProvider _correlationIdProvider; - private readonly AbpAspNetCoreSerilogEnrichersOptions _options; + private readonly AbpAspNetCoreSerilogOptions _options; - public SerilogMiddleware( + public AbpSerilogMiddleware( ICurrentTenant currentTenant, ICurrentUser currentUser, ICurrentClient currentClient, ICorrelationIdProvider correlationIdProvider, - IOptions options) + IOptions options) { _currentTenant = currentTenant; _currentUser = currentUser; @@ -41,23 +41,23 @@ namespace Volo.Abp.AspNetCore.Serilog if (_currentTenant?.Id != null) { - enrichers.Add(new PropertyEnricher(_options.TenantIdEnricherPropertyName, _currentTenant.Id)); + enrichers.Add(new PropertyEnricher(_options.EnricherPropertyNames.TenantId, _currentTenant.Id)); } if (_currentUser?.Id != null) { - enrichers.Add(new PropertyEnricher(_options.UserIdEnricherPropertyName, _currentUser.Id)); + enrichers.Add(new PropertyEnricher(_options.EnricherPropertyNames.UserId, _currentUser.Id)); } if (_currentClient?.Id != null) { - enrichers.Add(new PropertyEnricher(_options.ClientIdEnricherPropertyName, _currentClient.Id)); + enrichers.Add(new PropertyEnricher(_options.EnricherPropertyNames.ClientId, _currentClient.Id)); } var correlationId = _correlationIdProvider.Get(); if (!string.IsNullOrEmpty(correlationId)) { - enrichers.Add(new PropertyEnricher(_options.CorrelationIdPropertyName, correlationId)); + enrichers.Add(new PropertyEnricher(_options.EnricherPropertyNames.CorrelationId, correlationId)); } using (LogContext.Push(enrichers.ToArray())) diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs index bc45eb7c51..0a7a189a35 100644 --- a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs @@ -22,14 +22,14 @@ namespace Volo.Abp.AspNetCore.Serilog private readonly string _testTenantName = "acme"; private readonly AbpAspNetCoreMultiTenancyOptions _tenancyOptions; - private readonly AbpAspNetCoreSerilogEnrichersOptions _serilogEnrichersOptions; + private readonly AbpAspNetCoreSerilogOptions _serilogOptions; private readonly ILogger _logger; public Serilog_Enrichers_Tests() { _tenancyOptions = ServiceProvider.GetRequiredService>().Value; - _serilogEnrichersOptions = - ServiceProvider.GetRequiredService>().Value; + _serilogOptions = + ServiceProvider.GetRequiredService>().Value; _logger = ServiceProvider.GetRequiredService>(); } @@ -56,7 +56,7 @@ namespace Volo.Abp.AspNetCore.Serilog var executedLogEvent = GetLogEvent(ExecutedEndpointLogEventText); executedLogEvent.ShouldNotBeNull(); - executedLogEvent.Properties.ContainsKey(_serilogEnrichersOptions.TenantIdEnricherPropertyName) + executedLogEvent.Properties.ContainsKey(_serilogOptions.EnricherPropertyNames.TenantId) .ShouldBe(false); } @@ -71,9 +71,9 @@ namespace Volo.Abp.AspNetCore.Serilog var executedLogEvent = GetLogEvent(ExecutedEndpointLogEventText); executedLogEvent.ShouldNotBeNull(); - executedLogEvent.Properties.ContainsKey(_serilogEnrichersOptions.TenantIdEnricherPropertyName) + executedLogEvent.Properties.ContainsKey(_serilogOptions.EnricherPropertyNames.TenantId) .ShouldBe(true); - ((ScalarValue) executedLogEvent.Properties[_serilogEnrichersOptions.TenantIdEnricherPropertyName]).Value + ((ScalarValue) executedLogEvent.Properties[_serilogOptions.EnricherPropertyNames.TenantId]).Value .ShouldBe(_testTenantId); } @@ -87,10 +87,10 @@ namespace Volo.Abp.AspNetCore.Serilog executedLogEvent.ShouldNotBeNull(); - executedLogEvent.Properties.ContainsKey(_serilogEnrichersOptions.CorrelationIdPropertyName) + executedLogEvent.Properties.ContainsKey(_serilogOptions.EnricherPropertyNames.CorrelationId) .ShouldNotBeNull(); - ((ScalarValue) executedLogEvent.Properties[_serilogEnrichersOptions.CorrelationIdPropertyName]).Value + ((ScalarValue) executedLogEvent.Properties[_serilogOptions.EnricherPropertyNames.CorrelationId]).Value .ShouldBe(result); } } From 32407660da28efc4b081f04f45864dbbe00068f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 13 Jan 2020 13:20:40 +0300 Subject: [PATCH 59/61] Create launchSettings.json --- .../Properties/launchSettings.json | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json new file mode 100644 index 0000000000..cb1bd6546c --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:61851/", + "sslPort": 44301 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Volo.Abp.AspNetCore.Serilog": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file From a8e8cf26f129d08c48ce7639c37ae11b0885a98d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 13 Jan 2020 13:24:38 +0300 Subject: [PATCH 60/61] #2597 Rename UseSerilogEnrichers to UseAbpSerilogEnrichers --- .../Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs | 2 +- .../Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs | 2 +- .../MyProjectNameHttpApiHostModule.cs | 2 +- .../MyProjectNameHttpApiHostModule.cs | 2 +- .../MyProjectNameIdentityServerModule.cs | 2 +- .../MyProjectNameWebModule.cs | 2 +- .../MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs | 2 +- .../MyProjectNameHttpApiHostModule.cs | 2 +- .../MyProjectNameIdentityServerModule.cs | 2 +- .../MyProjectNameWebHostModule.cs | 2 +- .../MyProjectNameWebUnifiedModule.cs | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs index b7a02caa5c..cf15367e15 100644 --- a/framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs @@ -4,7 +4,7 @@ namespace Microsoft.AspNetCore.Builder { public static class AbpAspNetCoreSerilogApplicationBuilderExtensions { - public static IApplicationBuilder UseSerilogEnrichers(this IApplicationBuilder app) + public static IApplicationBuilder UseAbpSerilogEnrichers(this IApplicationBuilder app) { return app .UseMiddleware(); diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs index 736539b5db..557288cd7d 100644 --- a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs @@ -32,7 +32,7 @@ namespace Volo.Abp.AspNetCore.App app.UseAuthorization(); app.UseMultiTenancy(); app.UseAuditing(); - app.UseSerilogEnrichers(); + app.UseAbpSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index 81745602d9..401c3641fc 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -180,7 +180,7 @@ namespace MyCompanyName.MyProjectName }); app.UseAuditing(); - app.UseSerilogEnrichers(); + app.UseAbpSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs index 769208b664..beeca41292 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs @@ -174,7 +174,7 @@ namespace MyCompanyName.MyProjectName }); app.UseAuditing(); - app.UseSerilogEnrichers(); + app.UseAbpSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs index 47cc80fcca..1dfe7f56eb 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs @@ -151,7 +151,7 @@ namespace MyCompanyName.MyProjectName app.UseAuthorization(); app.UseAbpRequestLocalization(); app.UseAuditing(); - app.UseSerilogEnrichers(); + app.UseAbpSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs index f9b96fe5de..d2b050644f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs @@ -243,7 +243,7 @@ namespace MyCompanyName.MyProjectName.Web }); app.UseAuditing(); - app.UseSerilogEnrichers(); + app.UseAbpSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs index 43da5d0a49..697abb9ce2 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs @@ -218,7 +218,7 @@ namespace MyCompanyName.MyProjectName.Web options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API"); }); app.UseAuditing(); - app.UseSerilogEnrichers(); + app.UseAbpSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index 9bf05a70b7..8ebec4ad9b 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -168,7 +168,7 @@ namespace MyCompanyName.MyProjectName options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API"); }); app.UseAuditing(); - app.UseSerilogEnrichers(); + app.UseAbpSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs index 51e8935288..4be099efaa 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs @@ -191,7 +191,7 @@ namespace MyCompanyName.MyProjectName options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API"); }); app.UseAuditing(); - app.UseSerilogEnrichers(); + app.UseAbpSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); SeedData(context); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs index 8dc21d82c1..41fb8fc7f2 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs @@ -251,7 +251,7 @@ namespace MyCompanyName.MyProjectName }); app.UseAuditing(); - app.UseSerilogEnrichers(); + app.UseAbpSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs index 6040d7665f..aa253e89d3 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs @@ -139,7 +139,7 @@ namespace MyCompanyName.MyProjectName app.UseAbpRequestLocalization(); app.UseAuditing(); - app.UseSerilogEnrichers(); + app.UseAbpSerilogEnrichers(); app.UseMvcWithDefaultRouteAndArea(); using (var scope = context.ServiceProvider.CreateScope()) From fd123ebde4a9f95fa66c41a192bcf05c8d808cf4 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 13 Jan 2020 13:32:22 +0300 Subject: [PATCH 61/61] fix: convert imports as relative --- .../core/src/lib/actions/replaceable-components.actions.ts | 3 +++ .../src/lib/components/confirmation/confirmation.component.ts | 3 ++- .../components/toast-container/toast-container.component.html | 2 +- .../components/toast-container/toast-container.component.ts | 4 ++-- .../theme-shared/src/lib/components/toast/toast.component.ts | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts b/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts index e611459960..3b948cf63d 100644 --- a/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts +++ b/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts @@ -1,5 +1,8 @@ import { ReplaceableComponents } from '../models/replaceable-components'; +/** + * @see usage: https://github.com/abpframework/abp/pull/2522#issue-358333183 + */ export class AddReplaceableComponent { static readonly type = '[ReplaceableComponents] Add'; constructor(public payload: ReplaceableComponents.ReplaceableComponent) {} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts index ad052a2772..afdb024888 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts @@ -1,7 +1,8 @@ import { Component } from '@angular/core'; import { ConfirmationService } from '../../services/confirmation.service'; -import { Confirmation, Toaster } from '../../models'; +import { Confirmation } from '../../models/confirmation'; import { LocalizationService } from '@abp/ng.core'; +import { Toaster } from '../../models/toaster'; @Component({ selector: 'abp-confirmation', diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html index c3529e99ff..88d45ff04b 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html @@ -5,7 +5,7 @@ [style.bottom]="bottom || 'auto'" [style.left]="left || 'auto'" [style.display]="toasts.length ? 'flex' : 'none'" - [@toastInOut]="toasts.length - 1 || 0" + [@toastInOut]="toasts.length" >
  • diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts index 72483622b6..124dcc5185 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts @@ -1,6 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; -import { Toaster } from '../../models'; -import { toastInOut } from '../../animations'; +import { Toaster } from '../../models/toaster'; +import { toastInOut } from '../../animations/toast.animations'; import { ToasterService } from '../../services/toaster.service'; @Component({ diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts index 6cda67167b..b4465934b6 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts @@ -1,5 +1,5 @@ import { Component, Input, OnInit } from '@angular/core'; -import { Toaster } from '../../models'; +import { Toaster } from '../../models/toaster'; import { ToasterService } from '../../services/toaster.service'; import { LocalizationService } from '@abp/ng.core'; import snq from 'snq';