Browse Source

Merge remote-tracking branch 'abpframework/dev' into Translate

pull/2646/head
liangshiwei 7 years ago
parent
commit
19f8056258
  1. 132
      docs/en/Blog-Posts/2020-01-15 v2_0_Release/Post.md
  2. 3
      docs/en/Modules/Blogging.md
  3. 16
      framework/Volo.Abp.sln
  4. 1
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/AbpValidationActionFilter.cs
  5. 13
      framework/src/Volo.Abp.AspNetCore.Serilog/Microsoft/AspNetCore/Builder/AbpAspNetCoreSerilogApplicationBuilderExtensions.cs
  6. 27
      framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json
  7. 27
      framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj
  8. 13
      framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogModule.cs
  9. 30
      framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogOptions.cs
  10. 69
      framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogMiddleware.cs
  11. 5
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs
  12. 7
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/HelpCommand.cs
  13. 3
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClient.cs
  14. 17
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs
  15. 12
      framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs
  16. 8
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedAggregateRootWithUser.cs
  17. 4
      framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/zh-Hans.json
  18. 2
      framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj
  19. 24
      framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj
  20. 39
      framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/AbpSerilogTestModule.cs
  21. 19
      framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/CollectingSink.cs
  22. 27
      framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/SerilogTestController.cs
  23. 20
      framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/App/Startup.cs
  24. 31
      framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/AbpSerilogTestBase.cs
  25. 97
      framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs
  26. 12
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json
  27. 2
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json
  28. 7
      modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs
  29. 9
      modules/blogging/README.md
  30. 2
      modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj
  31. 2
      modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj
  32. 20
      modules/docs/README.md
  33. 2
      modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj
  34. BIN
      modules/docs/screenshot.png
  35. BIN
      modules/docs/screenshot2.png
  36. 2
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs
  37. 4
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json
  38. 16
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs
  39. 8
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleNameChangedEvent.cs
  40. 2
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleStore.cs
  41. 1
      modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj
  42. 43
      modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleUpdateEventHandler.cs
  43. 58
      modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/RoleChangingEvents_Test.cs
  44. 4
      modules/permission-management/Volo.Abp.PermissionManagement.sln
  45. 2
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManager.cs
  46. 2
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrant.cs
  47. 6
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs
  48. 2
      modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj
  49. 0
      modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj
  50. 15
      modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs
  51. 2
      npm/lerna.json
  52. 38
      npm/ng-packs/CHANGELOG.md
  53. BIN
      npm/ng-packs/apps/dev-app/src/favicon.ico
  54. 6
      npm/ng-packs/lerna.version.json
  55. 26
      npm/ng-packs/package.json
  56. 2
      npm/ng-packs/packages/account-config/package.json
  57. 6
      npm/ng-packs/packages/account/package.json
  58. 2
      npm/ng-packs/packages/core/package.json
  59. 3
      npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts
  60. 4
      npm/ng-packs/packages/feature-management/package.json
  61. 2
      npm/ng-packs/packages/identity-config/package.json
  62. 8
      npm/ng-packs/packages/identity/package.json
  63. 4
      npm/ng-packs/packages/permission-management/package.json
  64. 2
      npm/ng-packs/packages/setting-management-config/package.json
  65. 6
      npm/ng-packs/packages/setting-management/package.json
  66. 2
      npm/ng-packs/packages/tenant-management-config/package.json
  67. 8
      npm/ng-packs/packages/tenant-management/package.json
  68. 4
      npm/ng-packs/packages/theme-basic/package.json
  69. 4
      npm/ng-packs/packages/theme-basic/src/lib/constants/styles.ts
  70. 4
      npm/ng-packs/packages/theme-shared/package.json
  71. 4
      npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss
  72. 3
      npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts
  73. 3
      npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.ts
  74. 2
      npm/ng-packs/packages/theme-shared/src/lib/components/table/table.component.html
  75. 4
      npm/ng-packs/packages/theme-shared/src/lib/components/table/table.component.ts
  76. 2
      npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html
  77. 1
      npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss
  78. 4
      npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts
  79. 6
      npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html
  80. 12
      npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss
  81. 2
      npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts
  82. 2
      npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts
  83. 2
      npm/ng-packs/packages/theme-shared/src/lib/tests/sort-order-icon.component.spec.ts
  84. 15
      npm/ng-packs/packages/theme-shared/src/lib/utils/date-parser-formatter.ts
  85. 1491
      npm/ng-packs/scripts/package-lock.json
  86. 6
      npm/ng-packs/scripts/package.json
  87. 9
      npm/ng-packs/scripts/publish.ts
  88. 151
      npm/ng-packs/yarn.lock
  89. 6
      npm/packs/anchor-js/package.json
  90. 6
      npm/packs/aspnetcore.mvc.ui.theme.basic/package.json
  91. 32
      npm/packs/aspnetcore.mvc.ui.theme.shared/package.json
  92. 4
      npm/packs/aspnetcore.mvc.ui/package.json
  93. 10
      npm/packs/blogging/package.json
  94. 4
      npm/packs/bootstrap-datepicker/package.json
  95. 6
      npm/packs/bootstrap/package.json
  96. 4
      npm/packs/chart.js/package.json
  97. 6
      npm/packs/clipboard/package.json
  98. 6
      npm/packs/codemirror/package.json
  99. 4
      npm/packs/core/package.json
  100. 6
      npm/packs/datatables.net-bs4/package.json

132
docs/en/Blog-Posts/2020-01-15 v2_0_Release/Post.md

@ -0,0 +1,132 @@
# ABP Framework v2.0 and the ABP Commercial
ABP Framework v2.0 has been released this week. This post explains why we have released an **early major version** and what is changed with version 2.0.
In addition to the v2.0 release, we have also announced **ABP Commercial** which is a set of professional modules, tools, themes, and services built on top of the open-source ABP framework.
## ABP Framework v2.0
### Why 2.0 instead of 1.2?
It was planned to release v1.2 after the [v1.1.2](https://github.com/abpframework/abp/releases/tag/1.1.2) release. However, [it is reported](https://github.com/abpframework/abp/issues/2026) that v1.x has some **performance** and **stability** issues on Linux, especially when you deploy your application to **Linux** containers with **low CPU and memory** resources.
We have investigated the problem deeply and have seen that the root cause of the problem was related to the implementation of **intercepting `async` methods**. Besides, there were some **`async` over `sync`** usages that effected the thread pool optimization.
Finally, we **solved all the problems** with the great help of the **community**. But we also had some important **design decisions** which cause some **breaking changes** and we had to change the major version number of the framework because of the **semantic versioning**.
Most of the applications won't be affected by [the breaking changes](https://github.com/abpframework/abp/releases), or it will be trivial to make these necessary changes.
### Breaking Changes
#### Removed Some Sync APIs
Some of the interceptors are required to use `async` APIs. When they intercept `sync` methods, they need to call `async` over `sync`. This eventually ends up with `async` over `sync` problem. That's why we have [removed some sync APIs](https://github.com/abpframework/abp/pull/2464).
**`Async` over `sync`** pattern is a classical problem of `C#` when you need to **call an `async` method inside a `sync` method**. While there are some workarounds to this problem, they all have **disadvantages** and it is suggested to **not write** such code at all. You can find many documents related to this topic on the web.
To avoid this problem, we have removed:
- `sync` [repository](https://docs.abp.io/en/abp/latest/Repositories) methods (like `insert`, `update`, etc...),
- `sync` APIs of the [unit of work](https://docs.abp.io/en/abp/latest/Unit-Of-Work),
- `sync` APIs of the [background jobs](https://docs.abp.io/en/abp/latest/Background-Jobs),
- `sync` APIs of the [audit logging](https://docs.abp.io/en/abp/latest/Audit-Logging),
- some other rarely used `sync` APIs.
If you get any compile error, just use the `async` versions of these APIs.
#### Always Async!
Beginning from the v2.0, the ABP framework assumes that you are writing your application code `async` first. Otherwise, some framework functionalities may not properly work.
It is suggested to write `async` to all your [application services](https://docs.abp.io/en/abp/latest/Application-Services), [repository methods](https://docs.abp.io/en/abp/latest/Repositories), controller actions, page handlers.
Even if your application service method doesn't need to be `async` , set it as `async` , because interceptors perform `async` operations (for authorization, unit of work, etc...). You can return `Task.Completed` from a method that doesn't make an `async` call.
Example:
````csharp
public Task<int> GetValueAsync()
{
//this method doesn't make any async call.
return Task.CompletedTask(42);
}
````
The example above normally doesn't need to be `async` because it doesn't perform an `async` call. However, making it `async` helps the ABP framework to run interceptors without `async` over sync calls.
This rule doesn't force you to write every method `async` . This would not be good and would be tedious. It is only needed for the intercepted services (especially for [application services](https://docs.abp.io/en/abp/latest/Application-Services) and [repository methods](https://docs.abp.io/en/abp/latest/Repositories))
#### Other Breaking Changes
See [the release notes](https://github.com/abpframework/abp/releases/tag/2.0.0) for the other breaking changes. Most of them will not affect your application code.
### New Features
This release also contains some new features and tens of enhancements:
- [#2597](https://github.com/abpframework/abp/pull/2597) New `Volo.Abp.AspNetCore.Serilog` package.
- [#2526](https://github.com/abpframework/abp/issues/2526) Client-side validation for the dynamic `C#` client proxies.
- [#2374](https://github.com/abpframework/abp/issues/2374) `Async` background jobs.
- [#265](https://github.com/abpframework/abp/issues/265) Managing the application shutdown.
- [#2472](https://github.com/abpframework/abp/issues/2472) Implemented `DeviceFlowCodes` and `TokenCleanupService` for the `IdentityServer` module.
See [the release notes](https://github.com/abpframework/abp/releases/tag/2.0.0) for the complete list of features, enhancements and bug fixes.
### Documentation
We have completed some missing documentation with the v2.0 release. In the following weeks, we will mostly focus on the basic documentation and tutorials.
## ABP Commercial
[ABP Commercial](https://commercial.abp.io/) is a set of professional **modules, tools, themes, and services** built on top of the open-source ABP framework.
- It provides [professional modules](https://commercial.abp.io/modules) in addition to the ABP Framework's free & [open source modules](https://docs.abp.io/en/abp/latest/Modules/Index).
- It includes a beautiful a [UI theme](https://commercial.abp.io/themes).
- It provides [ABP Suite](https://commercial.abp.io/tools/suite); A tool to assist your development to make you more productive. It currently can create full-stack CRUD pages in a few seconds by configuring your entity properties. More functionalities will be added over time.
- [Premium support](https://commercial.abp.io/support) for enterprise companies.
In addition to these standard set of features, we will provide customer basis services. See the [commercial.abp.io](https://commercial.abp.io/) web site for other details.
### ABP Framework vs the ABP Commercial
The ABP Commercial **is not a paid version** of the ABP Framework. You can consider it as **set of additional benefits** for professional companies. You can use it to save your time and develop your product faster.
ABP Framework is open source & free and will always be free!
As a principle, we build the main infrastructure as open-source and sell additional pre-built application features, themes, and tools. The main idea similar to the [ASP.NET Boilerplate](https://aspnetboilerplate.com/) & the [ASP.NET Zero](https://aspnetzero.com/) products.
Buying a commercial license saves you significant time and effort and you can focus on your own business, besides you get dedicated and high priority support. Also, you will be supporting the ABP core team since we are spending most of our time to develop, maintain and support the open-source ABP Framework.
### Pricing
You can build **unlimited projects/products**, sell to **unlimited customers**, host **unlimited servers** without any restriction. Pricing is mostly based on the **developer count**, **support level** and **source code** requirement. There are three main packages;
- **Team license**: Includes all the modules, themes and tools. Allows developing your product with up to 3 developers. You can buy additional developer licenses.
- **Business license**: Allows downloading the source code of all the modules and the themes. Also, it includes 5 developer licenses by default. You can buy additional developer licenses.
- **Enterprise license**: Provides unlimited and private support in addition to the benefits of the business license.
See the [pricing page](https://commercial.abp.io/pricing) for details. In addition to the standard packages, we are also providing custom services and custom licensing. [Contact us](https://commercial.abp.io/contact) if you have further questions.
#### License Comparison
The license price changes based on your developer count, support level and source-code access.
##### The Source-Code
Team license doesn't include the source-code of the pre-built modules & themes. It uses all these modules as `NuGet` & `NPM` packages. In this way, you can easily get new features and bug fixes by just updating the package dependencies. But you can't access their source-code. So you don't have the possibility to embed a module's source code into your application and freely change the source-code.
Pre-built modules provide some level of customization and extensibility and allow you to override services, UI parts and so on. We are working on to make them much more customizable and extensible. If you don't need to make major changes in the pre-built modules, the team license will be ideal for you, because it is cheaper and allows you to easily get new features and bug fixes.
Business and Enterprise licenses allow you to download the source-code of any module or the theme when you need it. They also use the same startup template with the team license, so all modules are used as `NuGet` & `NPM` packages. But in case of need, you can remove the package dependencies for a module and embed its source-code into your own solution to completely customize it. In this case, upgrading the module will not be as easy as before when a new version is available. You don't have to upgrade it, surely! But if you want, you should do it yourself using some merge tool or `Git` branch system.
#### License Lifetime
ABP Commercial license is **perpetual**, which means you can **use it forever** and continue to develop your applications.
However, the following services are covered for one year:
- Premium **support** ends after one year. You can continue to get community support.
- You can not get **updates** of the modules & the themes after one year. You can continue to use the last obtained version. You can even get bug fixes and enhancements for your current major version.
- You can use the **ABP Suite** tool for one year.
If you want to continue to get these benefits, you can extend your license period. Renewing price is 20% less than the regular price.

3
docs/en/Modules/Blogging.md

@ -0,0 +1,3 @@
# IdentityServer Module
TODO

16
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 # Visual Studio Version 16
VisualStudioVersion = 16.0.28922.388 VisualStudioVersion = 16.0.28922.388
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
@ -256,6 +256,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Minify", "src\Volo
EndProject 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}" 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 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 Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -762,6 +766,14 @@ Global
{E69182B3-350A-43F5-A935-5EBBEBECEF97}.Debug|Any CPU.Build.0 = Debug|Any CPU {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.ActiveCfg = Release|Any CPU
{E69182B3-350A-43F5-A935-5EBBEBECEF97}.Release|Any CPU.Build.0 = 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
{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 EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -892,6 +904,8 @@ Global
{73559227-EBF0-475F-835B-1FF0CD9132AA} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {73559227-EBF0-475F-835B-1FF0CD9132AA} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{928DC30D-C078-4BB4-A9F8-FE7252C67DC6} = {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} {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 EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5}

1
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/AbpValidationActionFilter.cs

@ -1,7 +1,6 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
using Volo.Abp.Aspects;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
namespace Volo.Abp.AspNetCore.Mvc.Validation namespace Volo.Abp.AspNetCore.Mvc.Validation

13
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 UseAbpSerilogEnrichers(this IApplicationBuilder app)
{
return app
.UseMiddleware<AbpSerilogMiddleware>();
}
}
}

27
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"
}
}
}

27
framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj

@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Serilog</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Serilog</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.AspNetCore\Volo.Abp.AspNetCore.csproj" />
<ProjectReference Include="..\Volo.Abp.MultiTenancy\Volo.Abp.MultiTenancy.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Serilog" Version="2.8.0" />
</ItemGroup>
</Project>

13
framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpAspNetCoreSerilogModule.cs

@ -0,0 +1,13 @@
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.AspNetCore.Serilog
{
[DependsOn(
typeof(AbpMultiTenancyModule),
typeof(AbpAspNetCoreModule)
)]
public class AbpAspNetCoreSerilogModule : AbpModule
{
}
}

30
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
{
/// <summary>
/// Default value: "TenantId".
/// </summary>
public string TenantId { get; set; } = "TenantId";
/// <summary>
/// Default value: "UserId".
/// </summary>
public string UserId { get; set; } = "UserId";
/// <summary>
/// Default value: "ClientId".
/// </summary>
public string ClientId { get; set; } = "ClientId";
/// <summary>
/// Default value: "CorrelationId".
/// </summary>
public string CorrelationId { get; set; } = "CorrelationId";
}
}
}

69
framework/src/Volo.Abp.AspNetCore.Serilog/Volo/Abp/AspNetCore/Serilog/AbpSerilogMiddleware.cs

@ -0,0 +1,69 @@
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;
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 AbpSerilogMiddleware : IMiddleware, ITransientDependency
{
private readonly ICurrentClient _currentClient;
private readonly ICurrentTenant _currentTenant;
private readonly ICurrentUser _currentUser;
private readonly ICorrelationIdProvider _correlationIdProvider;
private readonly AbpAspNetCoreSerilogOptions _options;
public AbpSerilogMiddleware(
ICurrentTenant currentTenant,
ICurrentUser currentUser,
ICurrentClient currentClient,
ICorrelationIdProvider correlationIdProvider,
IOptions<AbpAspNetCoreSerilogOptions> options)
{
_currentTenant = currentTenant;
_currentUser = currentUser;
_currentClient = currentClient;
_correlationIdProvider = correlationIdProvider;
_options = options.Value;
}
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
var enrichers = new List<ILogEventEnricher>();
if (_currentTenant?.Id != null)
{
enrichers.Add(new PropertyEnricher(_options.EnricherPropertyNames.TenantId, _currentTenant.Id));
}
if (_currentUser?.Id != null)
{
enrichers.Add(new PropertyEnricher(_options.EnricherPropertyNames.UserId, _currentUser.Id));
}
if (_currentClient?.Id != null)
{
enrichers.Add(new PropertyEnricher(_options.EnricherPropertyNames.ClientId, _currentClient.Id));
}
var correlationId = _correlationIdProvider.Get();
if (!string.IsNullOrEmpty(correlationId))
{
enrichers.Add(new PropertyEnricher(_options.EnricherPropertyNames.CorrelationId, correlationId));
}
using (LogContext.Push(enrichers.ToArray()))
{
await next(context).ConfigureAwait(false);
}
}
}
}

5
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs

@ -45,5 +45,10 @@ namespace Volo.Abp.Cli.Auth
FileHelper.DeleteIfExists(CliPaths.AccessToken); FileHelper.DeleteIfExists(CliPaths.AccessToken);
return Task.CompletedTask; return Task.CompletedTask;
} }
public static bool IsLoggedIn()
{
return File.Exists(CliPaths.AccessToken);
}
} }
} }

7
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/HelpCommand.cs

@ -32,6 +32,13 @@ namespace Volo.Abp.Cli.Commands
return Task.CompletedTask; return Task.CompletedTask;
} }
if (!AbpCliOptions.Commands.ContainsKey(commandLineArgs.Target))
{
Logger.LogWarning($"There is no command named {commandLineArgs.Target}.");
Logger.LogInformation(GetUsageInfo());
return Task.CompletedTask;
}
var commandType = AbpCliOptions.Commands[commandLineArgs.Target]; var commandType = AbpCliOptions.Commands[commandLineArgs.Target];
using (var scope = ServiceScopeFactory.CreateScope()) using (var scope = ServiceScopeFactory.CreateScope())

3
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClient.cs

@ -3,6 +3,7 @@ using System.IO;
using System.Net.Http; using System.Net.Http;
using System.Text; using System.Text;
using IdentityModel.Client; using IdentityModel.Client;
using Volo.Abp.Cli.Auth;
namespace Volo.Abp.Cli.Http namespace Volo.Abp.Cli.Http
{ {
@ -29,7 +30,7 @@ namespace Volo.Abp.Cli.Http
private static void AddAuthentication(HttpClient client) private static void AddAuthentication(HttpClient client)
{ {
if (!File.Exists(CliPaths.AccessToken)) if (!AuthService.IsLoggedIn())
{ {
return; return;
} }

17
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs

@ -8,6 +8,7 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Polly; using Polly;
using Polly.Extensions.Http; using Polly.Extensions.Http;
using Volo.Abp.Cli.Auth;
using Volo.Abp.Cli.Http; using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding; using Volo.Abp.Cli.ProjectBuilding;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -31,6 +32,11 @@ namespace Volo.Abp.Cli.Licensing
public async Task<DeveloperApiKeyResult> GetApiKeyOrNullAsync(bool invalidateCache = false) public async Task<DeveloperApiKeyResult> GetApiKeyOrNullAsync(bool invalidateCache = false)
{ {
if (!AuthService.IsLoggedIn())
{
return null;
}
if (invalidateCache) if (invalidateCache)
{ {
_apiKeyResult = null; _apiKeyResult = null;
@ -81,17 +87,6 @@ namespace Volo.Abp.Cli.Licensing
var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
var apiKeyResult = JsonSerializer.Deserialize<DeveloperApiKeyResult>(responseContent); var apiKeyResult = JsonSerializer.Deserialize<DeveloperApiKeyResult>(responseContent);
if (apiKeyResult == null ||
string.IsNullOrEmpty(apiKeyResult.ApiKey))
{
_logger.LogError("Couldn't retrieve your NuGet API key!");
_logger.LogWarning(File.Exists(CliPaths.AccessToken)
? "Make sure you have an active session and license on commercial.abp.io. To re-sign in you can use the CLI command \"abp login <username>\"."
: "You are not signed in to commercial.abp.io. Use the CLI command \"abp login <username>\" to sign in.");
return null;
}
return apiKeyResult; return apiKeyResult;
} }
} }

12
framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs

@ -121,5 +121,17 @@ namespace Volo.Abp.Modularity
{ {
ServiceConfigurationContext.Services.PreConfigure(configureOptions); ServiceConfigurationContext.Services.PreConfigure(configureOptions);
} }
protected void PostConfigure<TOptions>(Action<TOptions> configureOptions)
where TOptions : class
{
ServiceConfigurationContext.Services.PostConfigure(configureOptions);
}
protected void PostConfigureAll<TOptions>(Action<TOptions> configureOptions)
where TOptions : class
{
ServiceConfigurationContext.Services.PostConfigureAll(configureOptions);
}
} }
} }

8
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedAggregateRootWithUser.cs

@ -4,12 +4,12 @@ using Volo.Abp.Auditing;
namespace Volo.Abp.Domain.Entities.Auditing namespace Volo.Abp.Domain.Entities.Auditing
{ {
/// <summary> /// <summary>
/// Implements <see cref="IFullAuditedObjectObject{TUser}"/> to be a base class for full-audited aggregate roots. /// Implements <see cref="IFullAuditedObject{TUser}"/> to be a base class for full-audited aggregate roots.
/// </summary> /// </summary>
/// <typeparam name="TUser">Type of the user</typeparam> /// <typeparam name="TUser">Type of the user</typeparam>
[Serializable] [Serializable]
public abstract class FullAuditedAggregateRootWithUser<TUser> : FullAuditedAggregateRoot, IFullAuditedObject<TUser> public abstract class FullAuditedAggregateRootWithUser<TUser> : FullAuditedAggregateRoot, IFullAuditedObject<TUser>
where TUser : IEntity<long> where TUser : IEntity<Guid>
{ {
/// <inheritdoc /> /// <inheritdoc />
public virtual TUser Deleter { get; set; } public virtual TUser Deleter { get; set; }
@ -22,13 +22,13 @@ namespace Volo.Abp.Domain.Entities.Auditing
} }
/// <summary> /// <summary>
/// Implements <see cref="IFullAuditedObjectObject{TUser}"/> to be a base class for full-audited aggregate roots. /// Implements <see cref="IFullAuditedObject{TUser}"/> to be a base class for full-audited aggregate roots.
/// </summary> /// </summary>
/// <typeparam name="TKey">Type of the primary key of the entity</typeparam> /// <typeparam name="TKey">Type of the primary key of the entity</typeparam>
/// <typeparam name="TUser">Type of the user</typeparam> /// <typeparam name="TUser">Type of the user</typeparam>
[Serializable] [Serializable]
public abstract class FullAuditedAggregateRootWithUser<TKey, TUser> : FullAuditedAggregateRoot<TKey>, IFullAuditedObject<TUser> public abstract class FullAuditedAggregateRootWithUser<TKey, TUser> : FullAuditedAggregateRoot<TKey>, IFullAuditedObject<TUser>
where TUser : IEntity<long> where TUser : IEntity<Guid>
{ {
/// <inheritdoc /> /// <inheritdoc />
public virtual TUser Deleter { get; set; } public virtual TUser Deleter { get; set; }

4
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 {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 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 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 be between {1} and {2}.": "字段{0}值必须在{1}和{2}范围内.",
"The field {0} must match the regular expression '{1}'.": "字段{0}必须匹配正则表达式'{1}'.", "The field {0} must match the regular expression '{1}'.": "字段{0}必须匹配正则表达式'{1}'.",
"The {0} field is required.": "字段{0}不可为空.", "The {0} field is required.": "字段{0}不可为空.",
@ -22,7 +22,7 @@
"ThisFieldOnlyAcceptsFilesWithTheFollowingExtensions:{0}": "字段只允许以下扩展名的文件: {0}", "ThisFieldOnlyAcceptsFilesWithTheFollowingExtensions:{0}": "字段只允许以下扩展名的文件: {0}",
"ThisFieldMustBeAStringOrArrayTypeWithAMaximumLengthoOf{0}": "字段必须是最大长度为'{0}'的字符串或数组.", "ThisFieldMustBeAStringOrArrayTypeWithAMaximumLengthoOf{0}": "字段必须是最大长度为'{0}'的字符串或数组.",
"ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}": "字段必须是最小长度为'{0}'的字符串或数组.", "ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}": "字段必须是最小长度为'{0}'的字符串或数组.",
"ThisFieldIsNotAValidPhoneNumber.": "字段不是有效的身份证号码.", "ThisFieldIsNotAValidPhoneNumber.": "字段不是有效的手机号码.",
"ThisFieldMustBeBetween{0}And{1}": "字段值必须在{0}和{1}范围内.", "ThisFieldMustBeBetween{0}And{1}": "字段值必须在{0}和{1}范围内.",
"ThisFieldMustMatchTheRegularExpression{0}": "字段必须匹配正则表达式'{0}'.", "ThisFieldMustMatchTheRegularExpression{0}": "字段必须匹配正则表达式'{0}'.",
"ThisFieldIsRequired.": "字段不可为空.", "ThisFieldIsRequired.": "字段不可为空.",

2
framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj

@ -9,7 +9,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" /> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="3.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
</ItemGroup> </ItemGroup>

24
framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.test.props" />
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Serilog.Tests</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Serilog.Tests</PackageId>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.AspNetCore.MultiTenancy\Volo.Abp.AspNetCore.MultiTenancy.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.AspNetCore.Mvc\Volo.Abp.AspNetCore.Mvc.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.AspNetCore.Serilog\Volo.Abp.AspNetCore.Serilog.csproj" />
<ProjectReference Include="..\Volo.Abp.AspNetCore.Tests\Volo.Abp.AspNetCore.Tests.csproj" />
</ItemGroup>
</Project>

39
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(AbpAspNetCoreSerilogModule),
typeof(AbpAutofacModule)
)]
public class AbpSerilogTestModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpMultiTenancyOptions>(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.UseAbpSerilogEnrichers();
app.UseMvcWithDefaultRouteAndArea();
}
}
}

19
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<LogEvent> Events { get; } = new List<LogEvent>();
public LogEvent SingleEvent => Events.Single();
public void Emit(LogEvent logEvent)
{
Events.Add(logEvent);
}
}
}

27
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());
}
}
}

20
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<AbpSerilogTestModule>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,ILoggerFactory loggerFactory)
{
app.InitializeApplication();
}
}
}

31
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<App.Startup>
{
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);
}
}
}

97
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 AbpAspNetCoreSerilogOptions _serilogOptions;
private readonly ILogger<Serilog_Enrichers_Tests> _logger;
public Serilog_Enrichers_Tests()
{
_tenancyOptions = ServiceProvider.GetRequiredService<IOptions<AbpAspNetCoreMultiTenancyOptions>>().Value;
_serilogOptions =
ServiceProvider.GetRequiredService<IOptions<AbpAspNetCoreSerilogOptions>>().Value;
_logger = ServiceProvider.GetRequiredService<ILogger<Serilog_Enrichers_Tests>>();
}
protected override IHostBuilder CreateHostBuilder()
{
return base.CreateHostBuilder().ConfigureServices(services =>
{
services.Configure<AbpDefaultTenantStoreOptions>(options =>
{
options.Tenants = new[]
{
new TenantConfiguration(_testTenantId, _testTenantName)
};
});
});
}
[Fact]
public async Task TenantId_Not_Set_Test()
{
var url = GetUrl<SerilogTestController>(nameof(SerilogTestController.Index));
var result = await GetResponseAsStringAsync(url).ConfigureAwait(false);
var executedLogEvent = GetLogEvent(ExecutedEndpointLogEventText);
executedLogEvent.ShouldNotBeNull();
executedLogEvent.Properties.ContainsKey(_serilogOptions.EnricherPropertyNames.TenantId)
.ShouldBe(false);
}
[Fact]
public async Task TenantId_Set_Test()
{
var url =
GetUrl<SerilogTestController>(nameof(SerilogTestController.Index)) +
$"?{_tenancyOptions.TenantKey}={_testTenantName}";
var result = await GetResponseAsStringAsync(url).ConfigureAwait(false);
var executedLogEvent = GetLogEvent(ExecutedEndpointLogEventText);
executedLogEvent.ShouldNotBeNull();
executedLogEvent.Properties.ContainsKey(_serilogOptions.EnricherPropertyNames.TenantId)
.ShouldBe(true);
((ScalarValue) executedLogEvent.Properties[_serilogOptions.EnricherPropertyNames.TenantId]).Value
.ShouldBe(_testTenantId);
}
[Fact]
public async Task CorrelationId_Enrichers_Test()
{
var url = GetUrl<SerilogTestController>(nameof(SerilogTestController.CorrelationId));
var result = await GetResponseAsStringAsync(url).ConfigureAwait(false);
var executedLogEvent = GetLogEvent(ExecutedEndpointLogEventText);
executedLogEvent.ShouldNotBeNull();
executedLogEvent.Properties.ContainsKey(_serilogOptions.EnricherPropertyNames.CorrelationId)
.ShouldNotBeNull();
((ScalarValue) executedLogEvent.Properties[_serilogOptions.EnricherPropertyNames.CorrelationId]).Value
.ShouldBe(result);
}
}
}

12
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json

@ -1,16 +1,16 @@
{ {
"culture": "en", "culture": "en",
"texts": { "texts": {
"UserName": "User name", "UserName": "Username",
"EmailAddress": "Email address", "EmailAddress": "Email address",
"UserNameOrEmailAddress": "User name or email address", "UserNameOrEmailAddress": "Username or email address",
"Password": "Password", "Password": "Password",
"RememberMe": "Remember me", "RememberMe": "Remember me",
"UseAnotherServiceToLogin": "Use another service to log in", "UseAnotherServiceToLogin": "Use another service to log in",
"UserLockedOutMessage": "The user account has been locked out due to invalid login attempts. Please wait a while and try again.", "UserLockedOutMessage": "The user account has been locked out due to invalid login attempts. Please wait a while and try again.",
"InvalidUserNameOrPassword": "Invalid username or password!", "InvalidUserNameOrPassword": "Invalid username or password!",
"LoginIsNotAllowed": "You are not allowed to login! You need to confirm your email/phone number.", "LoginIsNotAllowed": "You are not allowed to login! You need to confirm your email/phone number.",
"SelfRegistrationDisabledMessage": "Self user registration is disabled for this application. Contact to the application administrator to register a new user.", "SelfRegistrationDisabledMessage": "Self-registration is disabled for this application. Please contact the application administrator to register a new user.",
"Login": "Login", "Login": "Login",
"Cancel": "Cancel", "Cancel": "Cancel",
"Register": "Register", "Register": "Register",
@ -23,7 +23,7 @@
"DisplayName:NewPassword": "New password", "DisplayName:NewPassword": "New password",
"DisplayName:NewPasswordConfirm": "Confirm new password", "DisplayName:NewPasswordConfirm": "Confirm new password",
"PasswordChangedMessage": "Your password has been changed successfully.", "PasswordChangedMessage": "Your password has been changed successfully.",
"DisplayName:UserName": "User name", "DisplayName:UserName": "Username",
"DisplayName:Email": "Email", "DisplayName:Email": "Email",
"DisplayName:Name": "Name", "DisplayName:Name": "Name",
"DisplayName:Surname": "Surname", "DisplayName:Surname": "Surname",
@ -39,6 +39,6 @@
"DisplayName:Abp.Account.IsSelfRegistrationEnabled": "Is self-registration enabled", "DisplayName:Abp.Account.IsSelfRegistrationEnabled": "Is self-registration enabled",
"Description:Abp.Account.IsSelfRegistrationEnabled": "Whether a user can register the account by him or herself.", "Description:Abp.Account.IsSelfRegistrationEnabled": "Whether a user can register the account by him or herself.",
"DisplayName:Abp.Account.EnableLocalLogin": "Authenticate with a local account", "DisplayName:Abp.Account.EnableLocalLogin": "Authenticate with a local account",
"Description:Abp.Account.EnableLocalLogin": "Indicates if Server will allow users to authenticate with a local account." "Description:Abp.Account.EnableLocalLogin": "Indicates if the server will allow users to authenticate with a local account."
} }
} }

2
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json

@ -29,7 +29,7 @@
"DisplayName:Surname": "姓", "DisplayName:Surname": "姓",
"DisplayName:Password": "密码", "DisplayName:Password": "密码",
"DisplayName:EmailAddress": "电子邮件地址", "DisplayName:EmailAddress": "电子邮件地址",
"DisplayName:PhoneNumber": "电话号码", "DisplayName:PhoneNumber": "手机号码",
"PersonalSettings": "个人设置", "PersonalSettings": "个人设置",
"PersonalSettingsSaved": "个人设置已保存", "PersonalSettingsSaved": "个人设置已保存",
"PasswordChanged": "修改密码", "PasswordChanged": "修改密码",

7
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.Identity;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Account.Settings; using Volo.Abp.Account.Settings;
using Volo.Abp.Identity;
using Volo.Abp.Settings; using Volo.Abp.Settings;
using Volo.Abp.Uow; using Volo.Abp.Uow;
using IdentityUser = Volo.Abp.Identity.IdentityUser; using IdentityUser = Volo.Abp.Identity.IdentityUser;
@ -55,16 +56,16 @@ namespace Volo.Abp.Account.Web.Pages.Account
public class PostInput public class PostInput
{ {
[Required] [Required]
[StringLength(32)] [StringLength(IdentityUserConsts.MaxUserNameLength)]
public string UserName { get; set; } public string UserName { get; set; }
[Required] [Required]
[EmailAddress] [EmailAddress]
[StringLength(255)] [StringLength(IdentityUserConsts.MaxEmailLength)]
public string EmailAddress { get; set; } public string EmailAddress { get; set; }
[Required] [Required]
[StringLength(32)] [StringLength(IdentityUserConsts.MaxPasswordLength)]
[DataType(DataType.Password)] [DataType(DataType.Password)]
public string Password { get; set; } public string Password { get; set; }
} }

9
modules/blogging/README.md

@ -1,3 +1,10 @@
# Blogging Module # 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.

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

@ -12,7 +12,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Serilog.Extensions.Hosting" Version="3.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0-rc4" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0-rc4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0"/> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0"/>

2
modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj

@ -8,7 +8,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Serilog.Extensions.Hosting" Version="3.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
</ItemGroup> </ItemGroup>

20
modules/docs/README.md

@ -1,13 +1,15 @@
# Docs Module # 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 ![screenshot](screenshot2.png)
* Retrieves documents from a Github repository.
* Supports Markdown document formatting.
* Supports versioning (integrated to Github releases).
* Supports multiple projects.

2
modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj

@ -14,7 +14,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Serilog.Extensions.Hosting" Version="3.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0-rc4" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0-rc4" />
</ItemGroup> </ItemGroup>

BIN
modules/docs/screenshot.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

BIN
modules/docs/screenshot2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

2
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 MaxPhoneNumberLength = AbpUserConsts.MaxPhoneNumberLength;
public const int MaxPasswordLength = 32; public const int MaxPasswordLength = 128;
public const int MaxPasswordHashLength = 256; public const int MaxPasswordHashLength = 256;

4
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.LockoutDuration": "锁定时间(秒)",
"DisplayName:Abp.Identity.Lockout.MaxFailedAccessAttempts": "最大失败访问尝试次数", "DisplayName:Abp.Identity.Lockout.MaxFailedAccessAttempts": "最大失败访问尝试次数",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedEmail": "要求验证的电子邮箱", "DisplayName:Abp.Identity.SignIn.RequireConfirmedEmail": "要求验证的电子邮箱",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "要求验证的电话号码", "DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "要求验证的手机号码",
"DisplayName:Abp.Identity.User.IsUserNameUpdateEnabled": "启用用户名更新", "DisplayName:Abp.Identity.User.IsUserNameUpdateEnabled": "启用用户名更新",
"DisplayName:Abp.Identity.User.IsEmailUpdateEnabled": "启用电子邮箱更新", "DisplayName:Abp.Identity.User.IsEmailUpdateEnabled": "启用电子邮箱更新",
"Description:Abp.Identity.Password.RequiredLength": "密码的最小长度.", "Description:Abp.Identity.Password.RequiredLength": "密码的最小长度.",
@ -95,7 +95,7 @@
"Description:Abp.Identity.Lockout.LockoutDuration": "当锁定发生时用户被的锁定的时间(秒).", "Description:Abp.Identity.Lockout.LockoutDuration": "当锁定发生时用户被的锁定的时间(秒).",
"Description:Abp.Identity.Lockout.MaxFailedAccessAttempts": "如果启用锁定, 当用户被锁定前失败的访问尝试次数.", "Description:Abp.Identity.Lockout.MaxFailedAccessAttempts": "如果启用锁定, 当用户被锁定前失败的访问尝试次数.",
"Description:Abp.Identity.SignIn.RequireConfirmedEmail": "登录时是否需要验证的电子邮箱.", "Description:Abp.Identity.SignIn.RequireConfirmedEmail": "登录时是否需要验证的电子邮箱.",
"Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "登录时是否需要验证的电话号码.", "Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "登录时是否需要验证的手机号码.",
"Description:Abp.Identity.User.IsUserNameUpdateEnabled": "是否允许用户更新用户名.", "Description:Abp.Identity.User.IsUserNameUpdateEnabled": "是否允许用户更新用户名.",
"Description:Abp.Identity.User.IsEmailUpdateEnabled": "是否允许用户更新电子邮箱." "Description:Abp.Identity.User.IsEmailUpdateEnabled": "是否允许用户更新电子邮箱."

16
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); 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() public override string ToString()
{ {
return $"{base.ToString()}, Name = {Name}"; return $"{base.ToString()}, Name = {Name}";

8
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; }
}
}

2
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)); Check.NotNull(role, nameof(role));
role.Name = roleName; role.ChangeName(roleName);
return Task.CompletedTask; return Task.CompletedTask;
} }

1
modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj

@ -16,6 +16,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Volo.Abp.Identity.Domain.Shared\Volo.Abp.Identity.Domain.Shared.csproj" /> <ProjectReference Include="..\Volo.Abp.Identity.Domain.Shared\Volo.Abp.Identity.Domain.Shared.csproj" />
<ProjectReference Include="..\..\..\permission-management\src\Volo.Abp.PermissionManagement.Domain\Volo.Abp.PermissionManagement.Domain.csproj" /> <ProjectReference Include="..\..\..\permission-management\src\Volo.Abp.PermissionManagement.Domain\Volo.Abp.PermissionManagement.Domain.csproj" />
<ProjectReference Include="..\Volo.Abp.Identity.Domain\Volo.Abp.Identity.Domain.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

43
modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleUpdateEventHandler.cs

@ -0,0 +1,43 @@
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
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<IdentityRoleNameChangedEvent>,
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(RolePermissionValueProvider.ProviderName, eventData.OldName).ConfigureAwait(false);
foreach (var permissionGrant in permissionGrantsInRole)
{
await PermissionManager.UpdateProviderKeyAsync(permissionGrant, eventData.IdentityRole.Name).ConfigureAwait(false);
}
}
}
}

58
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<IIdentityRoleRepository>(); ;
PermissionGrantRepository = GetRequiredService<IPermissionGrantRepository>(); ;
RoleManager = GetRequiredService<IdentityRoleManager>(); ;
LookupNormalizer = GetRequiredService<ILookupNormalizer>(); ;
GuidGenerator = GetRequiredService<IGuidGenerator>();
UowManager = GetRequiredService<IUnitOfWorkManager>();
}
[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);
}
}
}

4
modules/permission-management/Volo.Abp.PermissionManagement.sln

@ -19,7 +19,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManageme
EndProject 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}" 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 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 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}" 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 EndProject
@ -33,7 +33,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManageme
EndProject 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}" 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 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 EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution

2
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManager.cs

@ -13,5 +13,7 @@ namespace Volo.Abp.PermissionManagement
Task<List<PermissionWithGrantedProviders>> GetAllAsync([NotNull] string providerName, [NotNull] string providerKey); Task<List<PermissionWithGrantedProviders>> GetAllAsync([NotNull] string providerName, [NotNull] string providerKey);
Task SetAsync(string permissionName, string providerName, string providerKey, bool isGranted); Task SetAsync(string permissionName, string providerName, string providerKey, bool isGranted);
Task<PermissionGrant> UpdateProviderKeyAsync(PermissionGrant permissionGrant, string providerKey);
} }
} }

2
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; } public virtual string ProviderName { get; protected set; }
[CanBeNull] [CanBeNull]
public virtual string ProviderKey { get; protected set; } public virtual string ProviderKey { get; protected internal set; }
protected PermissionGrant() protected PermissionGrant()
{ {

6
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); await provider.SetAsync(permissionName, providerKey, isGranted).ConfigureAwait(false);
} }
public async Task<PermissionGrant> UpdateProviderKeyAsync(PermissionGrant permissionGrant, string providerKey)
{
permissionGrant.ProviderKey = providerKey;
return await PermissionGrantRepository.UpdateAsync(permissionGrant).ConfigureAwait(false);
}
protected virtual async Task<PermissionWithGrantedProviders> GetInternalAsync(PermissionDefinition permission, string providerName, string providerKey) protected virtual async Task<PermissionWithGrantedProviders> GetInternalAsync(PermissionDefinition permission, string providerName, string providerKey)
{ {
var result = new PermissionWithGrantedProviders(permission.Name, false); var result = new PermissionWithGrantedProviders(permission.Name, false);

2
modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj

@ -10,7 +10,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.PermissionManagement.Application\Volo.Abp.PermissionManagement.Application.csproj" /> <ProjectReference Include="..\..\src\Volo.Abp.PermissionManagement.Application\Volo.Abp.PermissionManagement.Application.csproj" />
<ProjectReference Include="..\Volo.Abp.PermissionManagement.Tests\Volo.Abp.PermissionManagement.Tests.csproj" /> <ProjectReference Include="..\Volo.Abp.PermissionManagement.Tests\Volo.Abp.PermissionManagement.Domain.Tests.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

0
modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo.Abp.PermissionManagement.Tests.csproj → modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj

15
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); 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();
}
} }
} }

2
npm/lerna.json

@ -1,5 +1,5 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"packages": [ "packages": [
"packs/*" "packs/*"
], ],

38
npm/ng-packs/CHANGELOG.md

@ -1,3 +1,41 @@
# [2.0.0](https://github.com/abpframework/abp/compare/1.1.2...2.0.0) (2020-01-13)
### Bug Fixes
* **core:** fix flattedRoutes manipulation ([2b2e0be](https://github.com/abpframework/abp/commit/2b2e0be51d9fb37188348f390b56df286de7a6bc))
* **core:** fix nullable control in the config state ([756e858](https://github.com/abpframework/abp/commit/756e8588f3dd2d1035dbc22db3773653e28b1542))
* **core:** update flattedRoutes when patchRoute action dispatched ([15a8279](https://github.com/abpframework/abp/commit/15a82794ac5173bd080d3aec46efb43bfc0614ae))
* **permission-management:** fix twice executing problem of visible setter([ae16916](https://github.com/abpframework/abp/commit/ae16916ae2b03dfc25d9c4c5ceeb559dee34bde2))
* **theme-shared:** fix remember me functionality [(#2610)](https://github.com/abpframework/abp/pull/2610) ([189a77f](https://github.com/abpframework/abp/commit/189a77f4c421398b841e67280f6f19c4ef56649d)), closes [(#2602)](https://github.com/abpframework/abp/issues/2602)
### Code Refactoring
* remove deprecated functions, outputs, inputs etc. ([f1d0eba](https://github.com/abpframework/abp/commit/f1d0ebae856406213023af11632ed72849928b3e)), closes [#2476](https://github.com/abpframework/abp/issues/2476)
### Features
* add state actions to related state services ([#2431](https://github.com/abpframework/abp/pull/2431)), closes ([#2430](https://github.com/abpframework/abp/pull/2430))
* make some components replaceable ([#2522](https://github.com/abpframework/abp/pull/2522)), closes ([#2404](https://github.com/abpframework/abp/issues/2404))
* **account:** add autocomplete attiributes for chromium based browsers ([343c847](https://github.com/abpframework/abp/commit/343c847fb70d634218de1b156b3a15557e27acda))
* **account:** add the enableLocalLogin condition to auth-wrapper ([#2537](https://github.com/abpframework/abp/pull/2573)) ([0fb7ba4](https://github.com/abpframework/abp/commit/0fb7ba4614ebb64a00f19a9bef277a0fb9bee764))
* **core:** add init directive ([5ae1071](https://github.com/abpframework/abp/commit/5ae10717d73b1d76711dcd68201ed6b0609c4112))
* **core:** add ExtractFromGeneric type to ABP namespace ([1fe3b35](https://github.com/abpframework/abp/commit/1fe3b35076c5daddf9edc2a8396b62288cf105da))
* **core:** add init directive to emit an output when the element initialized ([31c224c](https://github.com/abpframework/abp/commit/31c224c9f9c015e94877d1eba382d1cd415704c7))
* **core:** fill the parentName property in flattedRoutes for child rotues ([17dd0a2](https://github.com/abpframework/abp/commit/17dd0a25a7dc2fa6268ce68f4f2f5d78f78a1f23))
* **core:** create AddRoute action to add new elements to top navigation ([#2425](https://github.com/abpframework/abp/pull/2425)), closes ([#2186](https://github.com/abpframework/abp/pull/2186))
* **theme-shared:** trigger unload confirmation in the modal component when form is dirty ([f59a294](https://github.com/abpframework/abp/commit/f59a2945b223a19750afd46da7e33deff2583328))
* **theme-shared:** create new toast and confirmation components ([#2606](https://github.com/abpframework/abp/pull/2606)), closes ([#2537](https://github.com/abpframework/abp/issues/2537))
* **theme-shared:** create table, pagination, loading components ([#2605](https://github.com/abpframework/abp/pull/2605)), related ([#2537](https://github.com/abpframework/abp/issues/2537))
### BREAKING CHANGES
* Deprecated functions, outputs, inputs addressed in issue #2476 are removed.
# [1.1.0](https://github.com/abpframework/abp/compare/1.0.2...1.1.0) (2019-12-06) # [1.1.0](https://github.com/abpframework/abp/compare/1.0.2...1.1.0) (2019-12-06)

BIN
npm/ng-packs/apps/dev-app/src/favicon.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 948 B

After

Width:  |  Height:  |  Size: 101 KiB

6
npm/ng-packs/lerna.version.json

@ -1,5 +1,7 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"packages": ["packages/*"], "packages": [
"packages/*"
],
"npmClient": "yarn" "npmClient": "yarn"
} }

26
npm/ng-packs/package.json

@ -21,19 +21,19 @@
"generate:changelog": "conventional-changelog -p angular -i CHANGELOG.md -s" "generate:changelog": "conventional-changelog -p angular -i CHANGELOG.md -s"
}, },
"devDependencies": { "devDependencies": {
"@abp/ng.account": "^1.1.1", "@abp/ng.account": "^2.0.0",
"@abp/ng.account.config": "^1.1.1", "@abp/ng.account.config": "^2.0.0",
"@abp/ng.core": "^1.1.1", "@abp/ng.core": "^2.0.0",
"@abp/ng.feature-management": "^1.1.1", "@abp/ng.feature-management": "^2.0.0",
"@abp/ng.identity": "^1.1.1", "@abp/ng.identity": "^2.0.0",
"@abp/ng.identity.config": "^1.1.1", "@abp/ng.identity.config": "^2.0.0",
"@abp/ng.permission-management": "^1.1.1", "@abp/ng.permission-management": "^2.0.0",
"@abp/ng.setting-management": "^1.1.1", "@abp/ng.setting-management": "^2.0.0",
"@abp/ng.setting-management.config": "^1.1.1", "@abp/ng.setting-management.config": "^2.0.0",
"@abp/ng.tenant-management": "^1.1.1", "@abp/ng.tenant-management": "^2.0.0",
"@abp/ng.tenant-management.config": "^1.1.1", "@abp/ng.tenant-management.config": "^2.0.0",
"@abp/ng.theme.basic": "^1.1.1", "@abp/ng.theme.basic": "^2.0.0",
"@abp/ng.theme.shared": "^1.1.1", "@abp/ng.theme.shared": "^2.0.0",
"@angular-builders/jest": "^8.2.0", "@angular-builders/jest": "^8.2.0",
"@angular-devkit/build-angular": "~0.803.21", "@angular-devkit/build-angular": "~0.803.21",
"@angular-devkit/build-ng-packagr": "~0.803.21", "@angular-devkit/build-ng-packagr": "~0.803.21",

2
npm/ng-packs/packages/account-config/package.json

@ -1,6 +1,6 @@
{ {
"name": "@abp/ng.account.config", "name": "@abp/ng.account.config",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",

6
npm/ng-packs/packages/account/package.json

@ -1,14 +1,14 @@
{ {
"name": "@abp/ng.account", "name": "@abp/ng.account",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/abpframework/abp.git" "url": "https://github.com/abpframework/abp.git"
}, },
"dependencies": { "dependencies": {
"@abp/ng.account.config": "^1.1.1", "@abp/ng.account.config": "^2.0.0",
"@abp/ng.theme.shared": "^1.1.1" "@abp/ng.theme.shared": "^2.0.0"
}, },
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"

2
npm/ng-packs/packages/core/package.json

@ -1,6 +1,6 @@
{ {
"name": "@abp/ng.core", "name": "@abp/ng.core",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",

3
npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts

@ -1,5 +1,8 @@
import { ReplaceableComponents } from '../models/replaceable-components'; import { ReplaceableComponents } from '../models/replaceable-components';
/**
* @see usage: https://github.com/abpframework/abp/pull/2522#issue-358333183
*/
export class AddReplaceableComponent { export class AddReplaceableComponent {
static readonly type = '[ReplaceableComponents] Add'; static readonly type = '[ReplaceableComponents] Add';
constructor(public payload: ReplaceableComponents.ReplaceableComponent) {} constructor(public payload: ReplaceableComponents.ReplaceableComponent) {}

4
npm/ng-packs/packages/feature-management/package.json

@ -1,13 +1,13 @@
{ {
"name": "@abp/ng.feature-management", "name": "@abp/ng.feature-management",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/abpframework/abp.git" "url": "https://github.com/abpframework/abp.git"
}, },
"dependencies": { "dependencies": {
"@abp/ng.theme.shared": "^1.1.1" "@abp/ng.theme.shared": "^2.0.0"
}, },
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"

2
npm/ng-packs/packages/identity-config/package.json

@ -1,6 +1,6 @@
{ {
"name": "@abp/ng.identity.config", "name": "@abp/ng.identity.config",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",

8
npm/ng-packs/packages/identity/package.json

@ -1,15 +1,15 @@
{ {
"name": "@abp/ng.identity", "name": "@abp/ng.identity",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/abpframework/abp.git" "url": "https://github.com/abpframework/abp.git"
}, },
"dependencies": { "dependencies": {
"@abp/ng.identity.config": "^1.1.1", "@abp/ng.identity.config": "^2.0.0",
"@abp/ng.permission-management": "^1.1.1", "@abp/ng.permission-management": "^2.0.0",
"@abp/ng.theme.shared": "^1.1.1" "@abp/ng.theme.shared": "^2.0.0"
}, },
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"

4
npm/ng-packs/packages/permission-management/package.json

@ -1,13 +1,13 @@
{ {
"name": "@abp/ng.permission-management", "name": "@abp/ng.permission-management",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/abpframework/abp.git" "url": "https://github.com/abpframework/abp.git"
}, },
"dependencies": { "dependencies": {
"@abp/ng.theme.shared": "^1.1.1" "@abp/ng.theme.shared": "^2.0.0"
}, },
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"

2
npm/ng-packs/packages/setting-management-config/package.json

@ -1,6 +1,6 @@
{ {
"name": "@abp/ng.setting-management.config", "name": "@abp/ng.setting-management.config",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",

6
npm/ng-packs/packages/setting-management/package.json

@ -1,14 +1,14 @@
{ {
"name": "@abp/ng.setting-management", "name": "@abp/ng.setting-management",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/abpframework/abp.git" "url": "https://github.com/abpframework/abp.git"
}, },
"dependencies": { "dependencies": {
"@abp/ng.setting-management.config": "^1.1.1", "@abp/ng.setting-management.config": "^2.0.0",
"@abp/ng.theme.shared": "^1.1.1" "@abp/ng.theme.shared": "^2.0.0"
}, },
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"

2
npm/ng-packs/packages/tenant-management-config/package.json

@ -1,6 +1,6 @@
{ {
"name": "@abp/ng.tenant-management.config", "name": "@abp/ng.tenant-management.config",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",

8
npm/ng-packs/packages/tenant-management/package.json

@ -1,15 +1,15 @@
{ {
"name": "@abp/ng.tenant-management", "name": "@abp/ng.tenant-management",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/abpframework/abp.git" "url": "https://github.com/abpframework/abp.git"
}, },
"dependencies": { "dependencies": {
"@abp/ng.feature-management": "^1.1.1", "@abp/ng.feature-management": "^2.0.0",
"@abp/ng.tenant-management.config": "^1.1.1", "@abp/ng.tenant-management.config": "^2.0.0",
"@abp/ng.theme.shared": "^1.1.1" "@abp/ng.theme.shared": "^2.0.0"
}, },
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"

4
npm/ng-packs/packages/theme-basic/package.json

@ -1,13 +1,13 @@
{ {
"name": "@abp/ng.theme.basic", "name": "@abp/ng.theme.basic",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/abpframework/abp.git" "url": "https://github.com/abpframework/abp.git"
}, },
"dependencies": { "dependencies": {
"@abp/ng.theme.shared": "^1.1.1" "@abp/ng.theme.shared": "^2.0.0"
}, },
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"

4
npm/ng-packs/packages/theme-basic/src/lib/constants/styles.ts

@ -64,4 +64,8 @@ export default `
.field-validation-error { .field-validation-error {
font-size: 0.8em; font-size: 0.8em;
} }
.ui-table .ui-table-tbody > tr.empty-row > div.empty-row-content {
border: 1px solid #c8c8c8;
}
`; `;

4
npm/ng-packs/packages/theme-shared/package.json

@ -1,13 +1,13 @@
{ {
"name": "@abp/ng.theme.shared", "name": "@abp/ng.theme.shared",
"version": "1.1.1", "version": "2.0.0",
"homepage": "https://abp.io", "homepage": "https://abp.io",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/abpframework/abp.git" "url": "https://github.com/abpframework/abp.git"
}, },
"dependencies": { "dependencies": {
"@abp/ng.core": "^1.1.1", "@abp/ng.core": "^2.0.0",
"@angular/cdk": "^8.2.3", "@angular/cdk": "^8.2.3",
"@fortawesome/fontawesome-free": "^5.11.2", "@fortawesome/fontawesome-free": "^5.11.2",
"@ng-bootstrap/ng-bootstrap": "^5.1.4", "@ng-bootstrap/ng-bootstrap": "^5.1.4",

4
npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.scss

@ -26,7 +26,7 @@
padding: 0; padding: 0;
border: none; border: none;
border-radius: 10px; border-radius: 10px;
min-width: 450px; width: 450px;
min-height: 300px; min-height: 300px;
background-color: #fff; background-color: #fff;
box-shadow: 0 0 10px -5px rgba(#000, 0.5); box-shadow: 0 0 10px -5px rgba(#000, 0.5);
@ -78,7 +78,7 @@
.message { .message {
display: block; display: block;
margin: 10px auto; margin: 10px auto;
padding: 0; padding: 20px;
color: #777; color: #777;
font-size: 16px; font-size: 16px;
font-weight: 400; font-weight: 400;

3
npm/ng-packs/packages/theme-shared/src/lib/components/confirmation/confirmation.component.ts

@ -1,7 +1,8 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { ConfirmationService } from '../../services/confirmation.service'; import { ConfirmationService } from '../../services/confirmation.service';
import { Confirmation, Toaster } from '../../models'; import { Confirmation } from '../../models/confirmation';
import { LocalizationService } from '@abp/ng.core'; import { LocalizationService } from '@abp/ng.core';
import { Toaster } from '../../models/toaster';
@Component({ @Component({
selector: 'abp-confirmation', selector: 'abp-confirmation',

3
npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.ts

@ -36,9 +36,8 @@ export class SortOrderIconComponent {
iconClass: string; iconClass: string;
get icon(): string { get icon(): string {
if (!this.selectedSortKey) return 'sorting';
if (this.selectedSortKey === this.sortKey) return `sorting_${this.order}`; if (this.selectedSortKey === this.sortKey) return `sorting_${this.order}`;
else return ''; else return 'sorting';
} }
sort(key: string) { sort(key: string) {

2
npm/ng-packs/packages/theme-shared/src/lib/components/table/table.component.html

@ -71,7 +71,7 @@
<ng-template #emptyTemplate> <ng-template #emptyTemplate>
<tr class="empty-row" #emptyRow> <tr class="empty-row" #emptyRow>
<div [style.width.px]="emptyRow.offsetWidth"> <div class="empty-row-content" [style.width.px]="emptyRow.offsetWidth">
{{ emptyMessage | abpLocalization }} {{ emptyMessage | abpLocalization }}
</div> </div>
</tr> </tr>

4
npm/ng-packs/packages/theme-shared/src/lib/components/table/table.component.ts

@ -25,8 +25,8 @@ import {
filter: none; filter: none;
} }
.ui-table .ui-table-tbody > tr.empty-row > div { .ui-table .ui-table-tbody > tr.empty-row > div.empty-row-content {
margin: 10px; padding: 10px;
text-align: center; text-align: center;
} }
`, `,

2
npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html

@ -5,7 +5,7 @@
[style.bottom]="bottom || 'auto'" [style.bottom]="bottom || 'auto'"
[style.left]="left || 'auto'" [style.left]="left || 'auto'"
[style.display]="toasts.length ? 'flex' : 'none'" [style.display]="toasts.length ? 'flex' : 'none'"
[@toastInOut]="toasts.length - 1 || 0" [@toastInOut]="toasts.length"
> >
<abp-toast [toast]="toast" *ngFor="let toast of toasts; trackBy: trackByFunc"></abp-toast> <abp-toast [toast]="toast" *ngFor="let toast of toasts; trackBy: trackByFunc"></abp-toast>
</div> </div>

1
npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss

@ -6,6 +6,7 @@
justify-content: flex-end; justify-content: flex-end;
min-width: 350px; min-width: 350px;
min-height: 80px; min-height: 80px;
z-index: 1900;
&.new-on-top { &.new-on-top {
flex-direction: column-reverse; flex-direction: column-reverse;
} }

4
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 { Component, Input, OnInit } from '@angular/core';
import { Toaster } from '../../models'; import { Toaster } from '../../models/toaster';
import { toastInOut } from '../../animations'; import { toastInOut } from '../../animations/toast.animations';
import { ToasterService } from '../../services/toaster.service'; import { ToasterService } from '../../services/toaster.service';
@Component({ @Component({

6
npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html

@ -3,14 +3,14 @@
<i class="fa icon" [ngClass]="iconClass"></i> <i class="fa icon" [ngClass]="iconClass"></i>
</div> </div>
<div class="toast-content"> <div class="toast-content">
<button class="close-button" (click)="close()" *ngIf="toast.options.closable"> <button class="toast-close-button" (click)="close()" *ngIf="toast.options.closable">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
</button> </button>
<div class="toast-title"> <div class="toast-title">
{{ toast.title | abpLocalization: toast.options?.titleLocalizationParams }} {{ toast.title | abpLocalization: toast.options?.titleLocalizationParams }}
</div> </div>
<div class="toast-message"> <p class="toast-message">
{{ toast.message | abpLocalization: toast.options?.messageLocalizationParams }} {{ toast.message | abpLocalization: toast.options?.messageLocalizationParams }}
</div> </p>
</div> </div>
</div> </div>

12
npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss

@ -45,7 +45,7 @@
} }
.toast-content { .toast-content {
position: relative; position: relative;
.close-button { .toast-close-button {
position: absolute; position: absolute;
top: 0; top: 0;
right: 0; right: 0;
@ -53,20 +53,16 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
margin: 0; margin: 0;
padding: 5px 10px 5px 5px; padding: 0px 5px 0 0;
width: 25px; width: 25px;
height: 25px; height: 25px;
border: none; border: none;
border-radius: 50%; border-radius: 50%;
background: transparent; background: transparent;
color: inherit;
&:focus { &:focus {
outline: none; outline: none;
} }
.close-icon {
width: 16px;
height: 16px;
stroke: #000;
}
} }
.toast-title { .toast-title {
margin: 0; margin: 0;
@ -75,6 +71,8 @@
font-weight: 600; font-weight: 600;
} }
.toast-message { .toast-message {
margin: 0;
padding: 0;
} }
} }
} }

2
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 { Component, Input, OnInit } from '@angular/core';
import { Toaster } from '../../models'; import { Toaster } from '../../models/toaster';
import { ToasterService } from '../../services/toaster.service'; import { ToasterService } from '../../services/toaster.service';
import { LocalizationService } from '@abp/ng.core'; import { LocalizationService } from '@abp/ng.core';
import snq from 'snq'; import snq from 'snq';

2
npm/ng-packs/packages/theme-shared/src/lib/services/confirmation.service.ts

@ -50,7 +50,7 @@ export class ConfirmationService {
): Observable<Toaster.Status> { ): Observable<Toaster.Status> {
this.confirmation$.next({ this.confirmation$.next({
message, message,
title: title || 'AbpUi:AreYouSure', title,
severity: severity || 'neutral', severity: severity || 'neutral',
options, options,
}); });

2
npm/ng-packs/packages/theme-shared/src/lib/tests/sort-order-icon.component.spec.ts

@ -32,7 +32,7 @@ describe('SortOrderIconComponent', () => {
component.sort(newKey); component.sort(newKey);
expect(component.selectedSortKey).toBe(newKey); expect(component.selectedSortKey).toBe(newKey);
expect(component.order).toBe('asc'); expect(component.order).toBe('asc');
expect(component.icon).toBe(''); expect(component.icon).toBe('sorting');
}); });
test('should change order correctly when sort function called', () => { test('should change order correctly when sort function called', () => {

15
npm/ng-packs/packages/theme-shared/src/lib/utils/date-parser-formatter.ts

@ -31,8 +31,17 @@ export class DateParserFormatter extends NgbDateParserFormatter {
return { year: toInteger(dateParts[0]), month: null, day: null }; return { year: toInteger(dateParts[0]), month: null, day: null };
} else if (dateParts.length === 2 && isNumber(dateParts[0]) && isNumber(dateParts[1])) { } else if (dateParts.length === 2 && isNumber(dateParts[0]) && isNumber(dateParts[1])) {
return { year: toInteger(dateParts[0]), month: toInteger(dateParts[1]), day: null }; return { year: toInteger(dateParts[0]), month: toInteger(dateParts[1]), day: null };
} else if (dateParts.length === 3 && isNumber(dateParts[0]) && isNumber(dateParts[1]) && isNumber(dateParts[2])) { } else if (
return { year: toInteger(dateParts[0]), month: toInteger(dateParts[1]), day: toInteger(dateParts[2]) }; dateParts.length === 3 &&
isNumber(dateParts[0]) &&
isNumber(dateParts[1]) &&
isNumber(dateParts[2])
) {
return {
year: toInteger(dateParts[0]),
month: toInteger(dateParts[1]),
day: toInteger(dateParts[2]),
};
} }
} }
return null; return null;
@ -40,7 +49,7 @@ export class DateParserFormatter extends NgbDateParserFormatter {
format(date: NgbDateStruct): string { format(date: NgbDateStruct): string {
if (date && this.datePipe) { if (date && this.datePipe) {
return this.datePipe.transform(new Date(date.year, date.month, date.day), 'shortDate'); return this.datePipe.transform(new Date(date.year, date.month - 1, date.day), 'shortDate');
} else { } else {
return date return date
? `${date.year}-${isNumber(date.month) ? padNumber(date.month) : ''}-${ ? `${date.year}-${isNumber(date.month) ? padNumber(date.month) : ''}-${

1491
npm/ng-packs/scripts/package-lock.json

File diff suppressed because it is too large

6
npm/ng-packs/scripts/package.json

@ -16,13 +16,13 @@
"commander": "^4.0.1", "commander": "^4.0.1",
"execa": "^2.0.3", "execa": "^2.0.3",
"fs-extra": "^8.1.0", "fs-extra": "^8.1.0",
"prompt-confirm": "^2.0.4", "prompt-confirm": "^2.0.4"
"typescript": "^3.7.4"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^13.1.2", "@types/node": "^13.1.2",
"esm": "^3.2.25", "esm": "^3.2.25",
"ts-node": "^8.5.4", "ts-node": "^8.5.4",
"tsconfig-paths": "^3.9.0" "tsconfig-paths": "^3.9.0",
"typescript": "^3.7.4"
} }
} }

9
npm/ng-packs/scripts/publish.ts

@ -5,15 +5,6 @@ const publish = async () => {
const versions = ['major', 'minor', 'patch', 'premajor', 'preminor', 'prepatch', 'prerelease']; const versions = ['major', 'minor', 'patch', 'premajor', 'preminor', 'prepatch', 'prerelease'];
let nextSemanticVersion = (process.argv[2] || '').toLowerCase(); let nextSemanticVersion = (process.argv[2] || '').toLowerCase();
if (versions.indexOf(nextSemanticVersion) < 0) {
console.log(
"Please enter the next semantic version like this: 'npm run publish patch'. Available versions:\n " +
JSON.stringify(versions),
);
process.exit(1);
}
try { try {
await execa('yarn', ['install-new-dependencies'], { stdout: 'inherit' }); await execa('yarn', ['install-new-dependencies'], { stdout: 'inherit' });

151
npm/ng-packs/yarn.lock

@ -2,26 +2,26 @@
# yarn lockfile v1 # yarn lockfile v1
"@abp/ng.account.config@^1.1.1": "@abp/ng.account.config@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.account.config/-/ng.account.config-1.1.1.tgz#43de54dd12606a6bc10caace9e430bdb136206b6" resolved "https://registry.yarnpkg.com/@abp/ng.account.config/-/ng.account.config-2.0.0.tgz#ed49d728e6cb5cac5bf562b2db6e65276a2d550c"
integrity sha512-d0Gj/BtB/YtsVMsyFJI+vcX+KE2CCKNpUQ6YC2rmIwPwOkbqV7UtbzMhxgHoG4lTTfh1pxclIOL6WFzQInI4kg== integrity sha512-r7n5NLaAg6xtMQK6KCoCwJALsj3+cftqbPU1mTJqoEiZQCejOUFA9Gk85i3t//MRUeD3j/ghzUYUa6b2elQwXQ==
dependencies: dependencies:
tslib "^1.9.0" tslib "^1.9.0"
"@abp/ng.account@^1.1.1": "@abp/ng.account@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-1.1.1.tgz#eddce66856d1133c4d7c04e861be019cfea6b25e" resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-2.0.0.tgz#ac1ea6b51190d68c647699fb9a6d185ad728ec3e"
integrity sha512-EUG7Hiv21KuOMmVSCxUBjMOlno4oYIUtrOUMNK/A/y42cr8UwUFmsu7HEx5J30Z0KWBn7w4vWvAy6KenqzMclQ== integrity sha512-UC/mTFermfrnAmm2Y6ZrsbKi4EyPzoASeRzoZ5LL0usyEIKb4N9l7Z7kxr5ih2+OPVSW9TmDfgw/zwn3HlrrWw==
dependencies: dependencies:
"@abp/ng.account.config" "^1.1.1" "@abp/ng.account.config" "^2.0.0"
"@abp/ng.theme.shared" "^1.1.1" "@abp/ng.theme.shared" "^2.0.0"
tslib "^1.9.0" tslib "^1.9.0"
"@abp/ng.core@^1.1.1": "@abp/ng.core@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-1.1.1.tgz#a08a06fff8fb58a913b619820120d93fa5120a1b" resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-2.0.0.tgz#9da38d0d3a32a5f7239034a37c3f4f14be745f30"
integrity sha512-oCYQJPmiYr6UjnW6L5Dhd7rl0wvE2ABjWYT70IDLSaFjxHRlQ2exA2kKft4RMkCT0iPNzEfmdHZyqX/8AHCy8Q== integrity sha512-pp3u+3bYMSygx88+t4929tkp7a5ja8k8IPeoho2SiJgC2ni546ecX10Yt02X1C8DBEhBr7b6Fn7eQI0VTA4zYA==
dependencies: dependencies:
"@ngxs/router-plugin" "^3.5.1" "@ngxs/router-plugin" "^3.5.1"
"@ngxs/storage-plugin" "^3.5.1" "@ngxs/storage-plugin" "^3.5.1"
@ -32,86 +32,86 @@
snq "^1.0.3" snq "^1.0.3"
tslib "^1.9.0" tslib "^1.9.0"
"@abp/ng.feature-management@^1.1.1": "@abp/ng.feature-management@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-1.1.1.tgz#d431a62fd677229421137c83e3ce1beb44f9d92c" resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-2.0.0.tgz#a9192bb24ca66d9eb0cf653695da2502ebaa7710"
integrity sha512-Pji1vp9jWQacrRawBFRh/ao1zXE3ktbGmj1X+nCQ3o6Q7EnNattC7/KC6osqvonpfFDxpjEZP4cMyb3H1wHRIA== integrity sha512-7DQapIj28Bh7MtSGKJLLd98i2vWGJgA/4hx3jjQ0WT94NnuyZPKsYwSGcJbVgbTV3PyLWcDCdmhh2NloL2O0lw==
dependencies: dependencies:
"@abp/ng.theme.shared" "^1.1.1" "@abp/ng.theme.shared" "^2.0.0"
tslib "^1.9.0" tslib "^1.9.0"
"@abp/ng.identity.config@^1.1.1": "@abp/ng.identity.config@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.identity.config/-/ng.identity.config-1.1.1.tgz#da264272ecebfbce99617443048951de317c23f9" resolved "https://registry.yarnpkg.com/@abp/ng.identity.config/-/ng.identity.config-2.0.0.tgz#4912b513e919778356cec45ceda4bc032e0cc9b6"
integrity sha512-d5BJBwfHsBoeEYF6dCHeoNVX/nRy1T7HOF6sjkFQN0Jihhk/XOv/r6CpgxnUKasXF0R2wadHrZZZOme6UL7AIw== integrity sha512-LfEwy57+Yx8nZXvzgFn8aYVnZSFrhBxFvD1twrTrddQRKltO+wSXV8p6boem8KRU2KWpbH0NYhnBNOxPYGHF6g==
dependencies: dependencies:
tslib "^1.9.0" tslib "^1.9.0"
"@abp/ng.identity@^1.1.1": "@abp/ng.identity@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-1.1.1.tgz#0776db2a4efe96953a7d46ea697689686c75fbf2" resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-2.0.0.tgz#33ba9c94042a48c7c004a4df499a669f75997a25"
integrity sha512-Gzz+/kgsDhTTrEMiNqDLSJvjTgk0ATy6Ud7uswoA3RCDlfcksbS5J7kHEsc6TRh6bZ1bC368Zj1F/XS7QAj/iA== integrity sha512-qjtiIJy+fpn9JDZjndqtNPnGWPNc1pMQP4cV+UVm8RUG5U3nMI8RfEYyuDKluSGPAF2Qncl3husjpmZjZaEO9w==
dependencies: dependencies:
"@abp/ng.identity.config" "^1.1.1" "@abp/ng.identity.config" "^2.0.0"
"@abp/ng.permission-management" "^1.1.1" "@abp/ng.permission-management" "^2.0.0"
"@abp/ng.theme.shared" "^1.1.1" "@abp/ng.theme.shared" "^2.0.0"
tslib "^1.9.0" tslib "^1.9.0"
"@abp/ng.permission-management@^1.1.1": "@abp/ng.permission-management@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-1.1.1.tgz#f0184639f9bf37a24c7dc3b18953bac0a521f926" resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-2.0.0.tgz#b7956a274945bac9b3bfb16cfcacd70af531d82e"
integrity sha512-3Omhdf/VrYjd4RA9R74ttFP4T+J4Kit8A/PjJIaiwV5j8DJ0WQeBek82P3Q3+EfhuS2ehWuSuz/DYmkcxkt1dw== integrity sha512-ZCuitlFgP1S/Y1Us5nIS9Fw9Jz9Jb7RRboTb6ysbMcLcOkgYJn2d806fnEQh/TkJHpTJDNZYIk27/DlaOQN2xg==
dependencies: dependencies:
"@abp/ng.theme.shared" "^1.1.1" "@abp/ng.theme.shared" "^2.0.0"
tslib "^1.9.0" tslib "^1.9.0"
"@abp/ng.setting-management.config@^1.1.1": "@abp/ng.setting-management.config@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management.config/-/ng.setting-management.config-1.1.1.tgz#6e19cb5f7894d2b6c5193f2e72abdac5be076356" resolved "https://registry.yarnpkg.com/@abp/ng.setting-management.config/-/ng.setting-management.config-2.0.0.tgz#4013b5d6bf7a34fc93ab1df3734c50bb60588b0e"
integrity sha512-QvWo8r+dL+IcQW0nRC7sPNhMCScSHcYPqJotUY1QCanEpXU56JIfPYkOKOtt3cJTA9U2jE2hBmv7fi8yTEy6Pg== integrity sha512-eVIzsSQHMz1+Y4Pri8dec31NP3pGwqeX9oFN6YdiIlXL7i0Lqvf9o1ZvMvZ6iIX7GJsOilTgd9Rw7ccZnZTaEQ==
dependencies: dependencies:
tslib "^1.9.0" tslib "^1.9.0"
"@abp/ng.setting-management@^1.1.1": "@abp/ng.setting-management@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-1.1.1.tgz#38cfd7c8b6cc0e29bd3a655e1aecff7e35aca10a" resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-2.0.0.tgz#9babb94b66aba3d95b44457e9301bbf2d7ea10b5"
integrity sha512-kwW9xC7xERo5ZDqGC4TaEXZKiHYZ3lIwGn8wVktX53ulGXrKT9N7BSVP8bBMJnJlIMNg7MpxjOYAR90gXrXdZw== integrity sha512-tRYRW/SlS52o9kO3yojJarYf0IFYNigXJaJPBOla1RPWW9fM63irCUq+NAI5bRUkxPHDQPfpE8qJC32DPM6a1Q==
dependencies: dependencies:
"@abp/ng.setting-management.config" "^1.1.1" "@abp/ng.setting-management.config" "^2.0.0"
"@abp/ng.theme.shared" "^1.1.1" "@abp/ng.theme.shared" "^2.0.0"
tslib "^1.9.0" tslib "^1.9.0"
"@abp/ng.tenant-management.config@^1.1.1": "@abp/ng.tenant-management.config@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management.config/-/ng.tenant-management.config-1.1.1.tgz#1aee4705e6ec06954d5d04ad78bb02c636dc36ae" resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management.config/-/ng.tenant-management.config-2.0.0.tgz#ee2357596263019eae9fcbefe8fd927242b81e87"
integrity sha512-KoYPIqsm7a/VrMZumfFKBKYwzZm1zzJeyoWpf84PZ2gvhkuh45gYwvXzMHzQu/HQ6FpJ9+NL7ro/uee1ka+DzQ== integrity sha512-HMZh7HBrFcMXLXGvEjwSOF0ncDcZUtUez1J4ll6oMBVbL4xgfJxIggODin9OMMdQOkLjzYY4BGS+Iwjzh5DR2g==
dependencies: dependencies:
tslib "^1.9.0" tslib "^1.9.0"
"@abp/ng.tenant-management@^1.1.1": "@abp/ng.tenant-management@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-1.1.1.tgz#b08a9498957f8dd54a2089d7d4cffafb48753508" resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-2.0.0.tgz#24dfbaf234e567244bdd4cc882ed6952d873e6b3"
integrity sha512-hjs8U+lRA0y2yVa1tVZgm02kxyQdsmyMtzG8ZB76MFJThmMtf3ogrLHRGZ0etgQHe0bmMjkpdC84wS1VtyK5VA== integrity sha512-Qn/JLJcCMYYZ+5IuF5jSHzwB9dprnQqoVv8i8vuXS1dyooBoqIIKNMs0E/GOsNu5MPABYrd24YODGi2Nso/OxA==
dependencies: dependencies:
"@abp/ng.feature-management" "^1.1.1" "@abp/ng.feature-management" "^2.0.0"
"@abp/ng.tenant-management.config" "^1.1.1" "@abp/ng.tenant-management.config" "^2.0.0"
"@abp/ng.theme.shared" "^1.1.1" "@abp/ng.theme.shared" "^2.0.0"
tslib "^1.9.0" tslib "^1.9.0"
"@abp/ng.theme.basic@^1.1.1": "@abp/ng.theme.basic@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-1.1.1.tgz#ee3c3a35f4254a0f727b11bb343ceab3aa975773" resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-2.0.0.tgz#c492bd513bb8a14d4df7b1ed24316543b41cb710"
integrity sha512-1z13+H2UhIGDsbsd5uyhuBi3v4lxim1yIECZ3HxFJxIKthHO1wlVb8ka8WrIrxj7JBOl6f9srMCzuCNm2rMGLg== integrity sha512-WH7DKzF8MkK1fG8uCYGQWJmkJPliyKi2/UwimmFie5UxFsII05rvZZAa+/EILVfMyob+4AkDeU79gZ/EWUJeZg==
dependencies: dependencies:
"@abp/ng.theme.shared" "^1.1.1" "@abp/ng.theme.shared" "^2.0.0"
tslib "^1.9.0" tslib "^1.9.0"
"@abp/ng.theme.shared@^1.1.1": "@abp/ng.theme.shared@^2.0.0":
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-1.1.1.tgz#436b9c909a25cc5722c2a639399d05668a241262" resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-2.0.0.tgz#d241d597d0bb58d50514522d133448f12672708f"
integrity sha512-eQDrznFKwD63cdO/HPSyGMwIFPmGhv4MAEgITyZkUY76g+owYa/tK+GEjpSqsvQsL//qrHqcG+nwuK9RrCBy+A== integrity sha512-akTvtNLKkpdWxLko6jMR261FSNEMNcRp1bvvOE2Auged9luXZYneNfaExnoLkBQhRuxmLKBYLPHyyueGRy2v2g==
dependencies: dependencies:
"@abp/ng.core" "^1.1.1" "@abp/ng.core" "^2.0.0"
"@angular/cdk" "^8.2.3" "@angular/cdk" "^8.2.3"
"@fortawesome/fontawesome-free" "^5.11.2" "@fortawesome/fontawesome-free" "^5.11.2"
"@ng-bootstrap/ng-bootstrap" "^5.1.4" "@ng-bootstrap/ng-bootstrap" "^5.1.4"
@ -119,7 +119,6 @@
bootstrap "^4.3.1" bootstrap "^4.3.1"
chart.js "^2.9.2" chart.js "^2.9.2"
font-awesome "^4.7.0" font-awesome "^4.7.0"
ngx-perfect-scrollbar "^8.0.0"
primeicons "^2.0.0" primeicons "^2.0.0"
primeng "^8.1.1" primeng "^8.1.1"
tslib "^1.9.0" tslib "^1.9.0"
@ -8488,14 +8487,6 @@ ng-packagr@^5.7.1:
terser "^4.1.2" terser "^4.1.2"
update-notifier "^3.0.0" update-notifier "^3.0.0"
ngx-perfect-scrollbar@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/ngx-perfect-scrollbar/-/ngx-perfect-scrollbar-8.0.0.tgz#19c1bbf9b1a36d89b00a68f7834e39427d29182f"
integrity sha512-IXoFbULQnxyJj0gdCcKCLE/6OW9HCP9KARzMCKS1kNxTuzG4DghjM2AaCBRM5/sFwdbn6rqOKMCINtHA8W8YCA==
dependencies:
perfect-scrollbar "^1.4.0"
resize-observer-polyfill "^1.5.0"
ngxs-reset-plugin@^1.2.0: ngxs-reset-plugin@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/ngxs-reset-plugin/-/ngxs-reset-plugin-1.2.0.tgz#38dd8363f45cad7410e00ce346a98001241944f8" resolved "https://registry.yarnpkg.com/ngxs-reset-plugin/-/ngxs-reset-plugin-1.2.0.tgz#38dd8363f45cad7410e00ce346a98001241944f8"
@ -9409,11 +9400,6 @@ pbkdf2@^3.0.3:
safe-buffer "^5.0.1" safe-buffer "^5.0.1"
sha.js "^2.4.8" sha.js "^2.4.8"
perfect-scrollbar@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.4.0.tgz#5d014ef9775e1f43058a1dbae9ed1daf0e7091f1"
integrity sha512-/2Sk/khljhdrsamjJYS5NjrH+GKEHEwh7zFSiYyxROyYKagkE4kSn2zDQDRTOMo8mpT2jikxx6yI1dG7lNP/hw==
performance-now@^2.1.0: performance-now@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@ -10251,11 +10237,6 @@ requires-port@^1.0.0:
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
resize-observer-polyfill@^1.5.0:
version "1.5.1"
resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
resolve-cwd@^2.0.0: resolve-cwd@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"

6
npm/packs/anchor-js/package.json

@ -1,12 +1,12 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"name": "@abp/anchor-js", "name": "@abp/anchor-js",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },
"dependencies": { "dependencies": {
"@abp/core": "^1.1.1", "@abp/core": "^2.0.0",
"anchor-js": "^4.2.2" "anchor-js": "^4.2.2"
}, },
"gitHead": "b926d7a3fed6365550493ec00bdfe9da9dd6c541" "gitHead": "407ad749bb735eb9b6cc1ef6dd310253b9680883"
} }

6
npm/packs/aspnetcore.mvc.ui.theme.basic/package.json

@ -1,11 +1,11 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"name": "@abp/aspnetcore.mvc.ui.theme.basic", "name": "@abp/aspnetcore.mvc.ui.theme.basic",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },
"dependencies": { "dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "^1.1.1" "@abp/aspnetcore.mvc.ui.theme.shared": "^2.0.0"
}, },
"gitHead": "b926d7a3fed6365550493ec00bdfe9da9dd6c541" "gitHead": "407ad749bb735eb9b6cc1ef6dd310253b9680883"
} }

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

@ -1,24 +1,24 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"name": "@abp/aspnetcore.mvc.ui.theme.shared", "name": "@abp/aspnetcore.mvc.ui.theme.shared",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },
"dependencies": { "dependencies": {
"@abp/aspnetcore.mvc.ui": "^1.1.1", "@abp/aspnetcore.mvc.ui": "^2.0.0",
"@abp/bootstrap": "^1.1.1", "@abp/bootstrap": "^2.0.0",
"@abp/bootstrap-datepicker": "^1.1.1", "@abp/bootstrap-datepicker": "^2.0.0",
"@abp/datatables.net-bs4": "^1.1.1", "@abp/datatables.net-bs4": "^2.0.0",
"@abp/font-awesome": "^1.1.1", "@abp/font-awesome": "^2.0.0",
"@abp/jquery-form": "^1.1.1", "@abp/jquery-form": "^2.0.0",
"@abp/jquery-validation-unobtrusive": "^1.1.1", "@abp/jquery-validation-unobtrusive": "^2.0.0",
"@abp/lodash": "^1.1.1", "@abp/lodash": "^2.0.0",
"@abp/luxon": "^1.1.1", "@abp/luxon": "^2.0.0",
"@abp/malihu-custom-scrollbar-plugin": "^1.1.1", "@abp/malihu-custom-scrollbar-plugin": "^2.0.0",
"@abp/select2": "^1.1.1", "@abp/select2": "^2.0.0",
"@abp/sweetalert": "^1.1.1", "@abp/sweetalert": "^2.0.0",
"@abp/timeago": "^1.1.1", "@abp/timeago": "^2.0.0",
"@abp/toastr": "^1.1.1" "@abp/toastr": "^2.0.0"
}, },
"gitHead": "b926d7a3fed6365550493ec00bdfe9da9dd6c541" "gitHead": "407ad749bb735eb9b6cc1ef6dd310253b9680883"
} }

4
npm/packs/aspnetcore.mvc.ui/package.json

@ -1,5 +1,5 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"name": "@abp/aspnetcore.mvc.ui", "name": "@abp/aspnetcore.mvc.ui",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
@ -12,5 +12,5 @@
"path": "^0.12.7", "path": "^0.12.7",
"rimraf": "^3.0.0" "rimraf": "^3.0.0"
}, },
"gitHead": "b926d7a3fed6365550493ec00bdfe9da9dd6c541" "gitHead": "407ad749bb735eb9b6cc1ef6dd310253b9680883"
} }

10
npm/packs/blogging/package.json

@ -1,13 +1,13 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"name": "@abp/blogging", "name": "@abp/blogging",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },
"dependencies": { "dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "^1.1.1", "@abp/aspnetcore.mvc.ui.theme.shared": "^2.0.0",
"@abp/owl.carousel": "^1.1.1", "@abp/owl.carousel": "^2.0.0",
"@abp/tui-editor": "^1.1.1" "@abp/tui-editor": "^2.0.0"
}, },
"gitHead": "b926d7a3fed6365550493ec00bdfe9da9dd6c541" "gitHead": "407ad749bb735eb9b6cc1ef6dd310253b9680883"
} }

4
npm/packs/bootstrap-datepicker/package.json

@ -1,5 +1,5 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"name": "@abp/bootstrap-datepicker", "name": "@abp/bootstrap-datepicker",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
@ -7,5 +7,5 @@
"dependencies": { "dependencies": {
"bootstrap-datepicker": "^1.9.0" "bootstrap-datepicker": "^1.9.0"
}, },
"gitHead": "b926d7a3fed6365550493ec00bdfe9da9dd6c541" "gitHead": "407ad749bb735eb9b6cc1ef6dd310253b9680883"
} }

6
npm/packs/bootstrap/package.json

@ -1,12 +1,12 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"name": "@abp/bootstrap", "name": "@abp/bootstrap",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },
"dependencies": { "dependencies": {
"@abp/core": "^1.1.1", "@abp/core": "^2.0.0",
"bootstrap": "^4.3.1" "bootstrap": "^4.3.1"
}, },
"gitHead": "b926d7a3fed6365550493ec00bdfe9da9dd6c541" "gitHead": "407ad749bb735eb9b6cc1ef6dd310253b9680883"
} }

4
npm/packs/chart.js/package.json

@ -1,5 +1,5 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"name": "@abp/chart.js", "name": "@abp/chart.js",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
@ -7,5 +7,5 @@
"dependencies": { "dependencies": {
"chart.js": "^2.9.3" "chart.js": "^2.9.3"
}, },
"gitHead": "b926d7a3fed6365550493ec00bdfe9da9dd6c541" "gitHead": "407ad749bb735eb9b6cc1ef6dd310253b9680883"
} }

6
npm/packs/clipboard/package.json

@ -1,12 +1,12 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"name": "@abp/clipboard", "name": "@abp/clipboard",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },
"dependencies": { "dependencies": {
"@abp/core": "^1.1.1", "@abp/core": "^2.0.0",
"clipboard": "^2.0.4" "clipboard": "^2.0.4"
}, },
"gitHead": "b926d7a3fed6365550493ec00bdfe9da9dd6c541" "gitHead": "407ad749bb735eb9b6cc1ef6dd310253b9680883"
} }

6
npm/packs/codemirror/package.json

@ -1,12 +1,12 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"name": "@abp/codemirror", "name": "@abp/codemirror",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },
"dependencies": { "dependencies": {
"@abp/core": "^1.1.1", "@abp/core": "^2.0.0",
"codemirror": "^5.49.2" "codemirror": "^5.49.2"
}, },
"gitHead": "b926d7a3fed6365550493ec00bdfe9da9dd6c541" "gitHead": "407ad749bb735eb9b6cc1ef6dd310253b9680883"
} }

4
npm/packs/core/package.json

@ -1,8 +1,8 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"name": "@abp/core", "name": "@abp/core",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },
"gitHead": "b926d7a3fed6365550493ec00bdfe9da9dd6c541" "gitHead": "407ad749bb735eb9b6cc1ef6dd310253b9680883"
} }

6
npm/packs/datatables.net-bs4/package.json

@ -1,12 +1,12 @@
{ {
"version": "1.1.1", "version": "2.0.0",
"name": "@abp/datatables.net-bs4", "name": "@abp/datatables.net-bs4",
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },
"dependencies": { "dependencies": {
"@abp/datatables.net": "^1.1.1", "@abp/datatables.net": "^2.0.0",
"datatables.net-bs4": "^1.10.20" "datatables.net-bs4": "^1.10.20"
}, },
"gitHead": "b926d7a3fed6365550493ec00bdfe9da9dd6c541" "gitHead": "407ad749bb735eb9b6cc1ef6dd310253b9680883"
} }

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

Loading…
Cancel
Save