Browse Source

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

pull/3533/head
liangshiwei 7 years ago
parent
commit
dd394fe080
  1. 9
      build/common.ps1
  2. 3
      docs/cs/AspNetCore/Widgets.md
  3. 4
      docs/cs/Contribution/Localization-Text-Files.md
  4. 2
      docs/cs/Getting-Started-AspNetCore-Application.md
  5. 2
      docs/cs/Getting-Started-Console-Application.md
  6. 1
      docs/en/CLI.md
  7. 4
      docs/en/Contribution/Localization-Text-Files.md
  8. 2
      docs/en/Entity-Framework-Core-Migrations.md
  9. 2
      docs/en/Getting-Started-AspNetCore-Application.md
  10. 2
      docs/en/Getting-Started-Console-Application.md
  11. 2
      docs/en/UI/AspNetCore/Widgets.md
  12. 2
      docs/pt-BR/Tutorials/Angular/Part-I.md
  13. 2
      docs/pt-BR/Tutorials/Angular/Part-II.md
  14. 2
      docs/pt-BR/Tutorials/Angular/Part-III.md
  15. 2
      docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-I.md
  16. 2
      docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-II.md
  17. 2
      docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-III.md
  18. 2
      docs/zh-Hans/CLI.md
  19. 4
      docs/zh-Hans/Contribution/Localization-Text-Files.md
  20. 2
      docs/zh-Hans/Entity-Framework-Core-Migrations.md
  21. 2
      docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md
  22. 14
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs
  23. 12
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Timeago/TimeagoScriptContributor.cs
  24. 4
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js
  25. 3
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs
  26. 56
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs
  27. 2
      framework/src/Volo.Abp.MailKit/Volo.Abp.MailKit.csproj
  28. 2
      framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json
  29. 9
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/EntityChangeWithUsername.cs
  30. 4
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/IAuditLogRepository.cs
  31. 25
      modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogRepository.cs
  32. 29
      modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/MongoAuditLogRepository.cs
  33. 225
      modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo/Abp/AuditLogging/AuditLogRepository_Tests.cs
  34. 2
      modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs
  35. 2
      npm/lerna.json
  36. 2
      npm/ng-packs/lerna.version.json
  37. 32
      npm/ng-packs/package.json
  38. 2
      npm/ng-packs/packages/account-config/package.json
  39. 6
      npm/ng-packs/packages/account/package.json
  40. 52
      npm/ng-packs/packages/account/src/lib/components/change-password/change-password.component.ts
  41. 46
      npm/ng-packs/packages/account/src/lib/components/register/register.component.ts
  42. 2
      npm/ng-packs/packages/core/package.json
  43. 4
      npm/ng-packs/packages/feature-management/package.json
  44. 2
      npm/ng-packs/packages/identity-config/package.json
  45. 8
      npm/ng-packs/packages/identity/package.json
  46. 43
      npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts
  47. 4
      npm/ng-packs/packages/permission-management/package.json
  48. 2
      npm/ng-packs/packages/setting-management-config/package.json
  49. 6
      npm/ng-packs/packages/setting-management/package.json
  50. 2
      npm/ng-packs/packages/tenant-management-config/package.json
  51. 8
      npm/ng-packs/packages/tenant-management/package.json
  52. 4
      npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts
  53. 4
      npm/ng-packs/packages/theme-basic/package.json
  54. 4
      npm/ng-packs/packages/theme-shared/package.json
  55. 21
      npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.html
  56. 13
      npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts
  57. 26
      npm/ng-packs/packages/theme-shared/src/lib/components/table/table.component.html
  58. 10
      npm/ng-packs/packages/theme-shared/src/lib/components/table/table.component.scss
  59. 2
      npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts
  60. 7
      npm/ng-packs/packages/theme-shared/src/lib/tests/table.component.spec.ts
  61. 52
      npm/ng-packs/packages/theme-shared/src/lib/tests/validation-utils.spec.ts
  62. 1
      npm/ng-packs/packages/theme-shared/src/lib/utils/index.ts
  63. 45
      npm/ng-packs/packages/theme-shared/src/lib/utils/validation-utils.ts
  64. 177
      npm/ng-packs/yarn.lock
  65. 6
      npm/packs/anchor-js/package.json
  66. 6
      npm/packs/aspnetcore.mvc.ui.theme.basic/package.json
  67. 32
      npm/packs/aspnetcore.mvc.ui.theme.shared/package.json
  68. 4
      npm/packs/aspnetcore.mvc.ui/package.json
  69. 10
      npm/packs/blogging/package.json
  70. 4
      npm/packs/bootstrap-datepicker/package.json
  71. 6
      npm/packs/bootstrap/package.json
  72. 4
      npm/packs/chart.js/package.json
  73. 6
      npm/packs/clipboard/package.json
  74. 6
      npm/packs/codemirror/package.json
  75. 4
      npm/packs/core/package.json
  76. 6
      npm/packs/datatables.net-bs4/package.json
  77. 6
      npm/packs/datatables.net/package.json
  78. 14
      npm/packs/docs/package.json
  79. 4
      npm/packs/flag-icon-css/package.json
  80. 6
      npm/packs/font-awesome/package.json
  81. 6
      npm/packs/highlight.js/package.json
  82. 6
      npm/packs/jquery-form/package.json
  83. 6
      npm/packs/jquery-validation-unobtrusive/package.json
  84. 6
      npm/packs/jquery-validation/package.json
  85. 6
      npm/packs/jquery/package.json
  86. 6
      npm/packs/lodash/package.json
  87. 4
      npm/packs/luxon/package.json
  88. 6
      npm/packs/malihu-custom-scrollbar-plugin/package.json
  89. 6
      npm/packs/markdown-it/package.json
  90. 6
      npm/packs/owl.carousel/package.json
  91. 6
      npm/packs/popper.js/package.json
  92. 6
      npm/packs/prismjs/package.json
  93. 6
      npm/packs/select2/package.json
  94. 6
      npm/packs/sweetalert/package.json
  95. 6
      npm/packs/timeago/package.json
  96. 6
      npm/packs/toastr/package.json
  97. 12
      npm/packs/tui-editor/package.json
  98. 4
      npm/packs/utils/package.json
  99. 25
      samples/BasicAspNetCoreApplication/BasicAspNetCoreApplication.sln
  100. 33
      samples/BasicAspNetCoreApplication/BasicAspNetCoreApplication/AppModule.cs

9
build/common.ps1

@ -21,15 +21,6 @@ $solutionPaths = (
"../modules/client-simulation",
"../templates/module/aspnet-core",
"../templates/app/aspnet-core",
"../samples/BasicAspNetCoreApplication",
"../samples/BasicConsoleApplication",
"../samples/BookStore",
"../samples/BookStore-Angular-MongoDb/aspnet-core",
"../samples/BookStore-Modular/modules/book-management",
"../samples/BookStore-Modular/application",
"../samples/DashboardDemo",
"../samples/EfCoreMigrationDemo",
"../samples/MicroserviceDemo",
"../samples/RabbitMqEventBus",
"../abp_io/AbpIoLocalization"
)

3
docs/cs/AspNetCore/Widgets.md

@ -502,4 +502,5 @@ Configure<AbpWidgetOptions>(options =>
## Podívejte se také na
* [Příklad projektu (zdrojový kód)](https://github.com/abpframework/abp/tree/dev/samples/DashboardDemo).
* [Příklad projektu (zdrojový kód)](https://github.com/abpframework/abp-samples/tree/master/DashboardDemo).

4
docs/cs/Contribution/Localization-Text-Files.md

@ -29,8 +29,8 @@ Toto je seznam lokalizačních textových souborů pro každého kdo chce přisp
* https://github.com/abpframework/abp/tree/master/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Localization/Resources/AbpSettingManagement/en.json
* https://github.com/abpframework/abp/tree/master/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/Localization/ApplicationContracts/en.json
* https://github.com/abpframework/abp/tree/master/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/en.json
* https://github.com/abpframework/abp/tree/master/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json
* https://github.com/abpframework/abp/tree/master/samples/DashboardDemo/src/DashboardDemo.Domain/Localization/DashboardDemo/en.json
* https://github.com/abpframework/abp-samples/tree/master/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json
* https://github.com/abpframework/abp-samples/tree/master/DashboardDemo/src/DashboardDemo.Domain/Localization/DashboardDemo/en.json
* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/Localization/ApplicationContracts/en.json
* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/Localization/Domain/en.json
* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Localization/Resources/ProductManagement/en.json

2
docs/cs/Getting-Started-AspNetCore-Application.md

@ -153,5 +153,5 @@ namespace BasicAspNetCoreApplication
## Zdrojový kód
Získejte zdrojový kód vzorového projektu vytvořeného v tomto tutoriálů [z tohoto odkazu](https://github.com/abpframework/abp/tree/master/samples/BasicAspNetCoreApplication).
Získejte zdrojový kód vzorového projektu vytvořeného v tomto tutoriálů [z tohoto odkazu](https://github.com/abpframework/abp-samples/tree/master/BasicAspNetCoreApplication).

2
docs/cs/Getting-Started-Console-Application.md

@ -178,4 +178,4 @@ Stačí volat metodu `options.UseAutofac()` v možnostech `AbpApplicationFactory
## Zdrojový kód
Získejte zdrojový kód vzorového projektu vytvořeného v tomto tutoriálů [z tohoto odkazu](https://github.com/abpframework/abp/tree/master/samples/BasicConsoleApplication).
Získejte zdrojový kód vzorového projektu vytvořeného v tomto tutoriálů [z tohoto odkazu](https://github.com/abpframework/abp-samples/tree/master/BasicConsoleApplication).

1
docs/en/CLI.md

@ -61,6 +61,7 @@ abp new Acme.BookStore
* `--template-source` or `-ts`: Specifies a custom template source to use to build the project. Local and network sources can be used(Like `D\localTemplate` or `https://<your url>.zip`).
* `--create-solution-folder` or `-csf`: Specifies if the project will be in a new folder in the output folder or directly the output folder.
* `--connection-string` or `-cs`: Overwrites the default connection strings in all `appsettings.json` files. The default connection string is `Server=localhost;Database=MyProjectName;Trusted_Connection=True;MultipleActiveResultSets=true`. You can set your own connection string if you don't want to use the default. Be aware that the default database provider is `SQL Server`, therefore you can only enter connection string for SQL Server!
* `--local-framework-ref --abp-path`: keeps local references to projects instead of replacing with NuGet package references.
### add-package

4
docs/en/Contribution/Localization-Text-Files.md

@ -23,8 +23,8 @@ Here, a list of localization text files for anyone wants to contribute to locali
* https://github.com/abpframework/abp/tree/master/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json
* https://github.com/abpframework/abp/tree/master/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json
* https://github.com/abpframework/abp/tree/master/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en.json
* https://github.com/abpframework/abp/tree/master/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json
* https://github.com/abpframework/abp/tree/master/samples/DashboardDemo/src/DashboardDemo.Domain.Shared/Localization/DashboardDemo/en.json
* https://github.com/abpframework/abp-samples/tree/master/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json
* https://github.com/abpframework/abp-samples/tree/master/DashboardDemo/src/DashboardDemo.Domain.Shared/Localization/DashboardDemo/en.json
* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/Localization/ApplicationContracts/en.json
* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/Localization/Domain/en.json
* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Localization/Resources/ProductManagement/en.json

2
docs/en/Entity-Framework-Core-Migrations.md

@ -6,7 +6,7 @@ This document begins by **introducing the default structure** provided by [the a
### Source Code
You can find the source code of the example project referenced by this document [here](https://github.com/abpframework/abp/tree/dev/samples/EfCoreMigrationDemo). However, you need to read and understand this document in order to understand the example project's source code.
You can find the source code of the example project referenced by this document [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreMigrationDemo). However, you need to read and understand this document in order to understand the example project's source code.
## About the EF Core Code First Migrations

2
docs/en/Getting-Started-AspNetCore-Application.md

@ -153,5 +153,5 @@ namespace BasicAspNetCoreApplication
## Source Code
Get source code of the sample project created in this tutorial from [here](https://github.com/abpframework/abp/tree/master/samples/BasicAspNetCoreApplication).
Get source code of the sample project created in this tutorial from [here](https://github.com/abpframework/abp-samples/tree/master/BasicAspNetCoreApplication).

2
docs/en/Getting-Started-Console-Application.md

@ -178,4 +178,4 @@ Just called `options.UseAutofac()` method in the `AbpApplicationFactory.Create`
## Source Code
Get source code of the sample project created in this tutorial from [here](https://github.com/abpframework/abp/tree/master/samples/BasicConsoleApplication).
Get source code of the sample project created in this tutorial from [here](https://github.com/abpframework/abp-samples/tree/master/BasicConsoleApplication).

2
docs/en/UI/AspNetCore/Widgets.md

@ -502,4 +502,4 @@ Configure<AbpWidgetOptions>(options =>
## See Also
* [Example project (source code)](https://github.com/abpframework/abp/tree/dev/samples/DashboardDemo).
* [Example project (source code)](https://github.com/abpframework/abp-samples/tree/master/DashboardDemo).

2
docs/pt-BR/Tutorials/Angular/Part-I.md

@ -10,7 +10,7 @@ Esta é a primeira parte da série de tutoriais angulares. Veja todas as peças:
- [Parte II: Criar, atualizar e excluir livros](Part-II)
- [Parte III: Testes de Integração](Part-III)
Você pode acessar o **código fonte** do aplicativo no [repositório GitHub](https://github.com/abpframework/abp/tree/dev/samples/BookStore-Angular-MongoDb) .
Você pode acessar o **código fonte** do aplicativo no [repositório GitHub](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) .
### Criando o projeto

2
docs/pt-BR/Tutorials/Angular/Part-II.md

@ -8,7 +8,7 @@ Esta é a segunda parte da série de tutoriais angulares. Veja todas as peças:
- **Parte II: Criar, atualizar e excluir livros (este tutorial)**
- [Parte III: Testes de Integração](Part-III.md)
Você pode acessar o **código fonte** do aplicativo no [repositório GitHub](https://github.com/abpframework/abp/tree/dev/samples/BookStore-Angular-MongoDb) .
Você pode acessar o **código fonte** do aplicativo no [repositório GitHub](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) .
### Criando um novo livro

2
docs/pt-BR/Tutorials/Angular/Part-III.md

@ -8,7 +8,7 @@ Esta é a terceira parte da série de tutoriais Angular. Veja todas as peças:
- [Parte II: Criar, atualizar e excluir livros](Part-II.md)
- **Parte III: Testes de Integração (este tutorial)**
Esta parte abrange os testes do **lado** do **servidor** . Você pode acessar o **código fonte** do aplicativo no [repositório GitHub](https://github.com/abpframework/abp/tree/dev/samples/BookStore-Angular-MongoDb) .
Esta parte abrange os testes do **lado** do **servidor** . Você pode acessar o **código fonte** do aplicativo no [repositório GitHub](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) .
### Testar projetos na solução

2
docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-I.md

@ -10,7 +10,7 @@ Esta é a primeira parte da série de tutoriais do ASP.NET Core MVC. Veja todas
- [Parte II: Criar, atualizar e excluir livros](Part-II.md)
- [Parte III: Testes de Integração](Part-III.md)
Você pode acessar o **código fonte** do aplicativo [no repositório GitHub](https://github.com/abpframework/abp/tree/master/samples/BookStore) .
Você pode acessar o **código fonte** do aplicativo [no repositório GitHub](https://github.com/abpframework/abp-samples/tree/master/BookStore) .
> Você também pode assistir a [este curso em vídeo](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application) preparado por um membro da comunidade ABP, com base neste tutorial.

2
docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-II.md

@ -8,7 +8,7 @@ Esta é a segunda parte da série de tutoriais do ASP.NET Core MVC. Veja todas a
- **Parte II: Criar, atualizar e excluir livros (este tutorial)**
- [Parte III: Testes de Integração](https://docs.abp.io/en/abp/latest/Tutorials/AspNetCore-Mvc/Part-III)
Você pode acessar o **código fonte** do aplicativo [no repositório GitHub](https://github.com/volosoft/abp/tree/master/samples/BookStore) .
Você pode acessar o **código fonte** do aplicativo [no repositório GitHub](https://github.com/abpframework/abp-samples/tree/master/BookStore) .
> Você também pode assistir a [este curso em vídeo](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application) preparado por um membro da comunidade ABP, com base neste tutorial.

2
docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-III.md

@ -8,7 +8,7 @@ Esta é a terceira parte da série de tutoriais do ASP.NET Core MVC. Veja todas
- [Parte II: Criar, atualizar e excluir livros](https://docs.abp.io/en/abp/latest/Tutorials/AspNetCore-Mvc/Part-II)
- **Parte III: Testes de Integração (este tutorial)**
Você pode acessar o **código fonte** do aplicativo [no repositório GitHub](https://github.com/volosoft/abp/tree/master/samples/BookStore) .
Você pode acessar o **código fonte** do aplicativo [no repositório GitHub](https://github.com/abpframework/abp-samples/tree/master/BookStore).
> Você também pode assistir a [este curso em vídeo](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application) preparado por um membro da comunidade ABP, com base neste tutorial.

2
docs/zh-Hans/CLI.md

@ -56,12 +56,12 @@ abp new Acme.BookStore
* `mongodb`: MongoDB.
* `module`: [Module template](Startup-Templates/Module.md). 其他选项:
* `--no-ui`: 不包含UI.仅创建服务模块(也称为微服务 - 没有UI).
*
* `--output-folder` 或者 `-o`: 指定输出文件夹,默认是当前目录.
* `--version` 或者 `-v`: 指定ABP和模板的版本.它可以是 [release tag](https://github.com/abpframework/abp/releases) 或者 [branch name](https://github.com/abpframework/abp/branches). 如果没有指定,则使用最新版本.大多数情况下,您会希望使用最新的版本.
* `--template-source` 或者 `-ts`: 指定自定义模板源用于生成项目,可以使用本地源和网络源(例如 `D\localTemplate` 或 `https://<your url>.zip`).
* `--create-solution-folder` 或者 `-csf`: 指定项目是在输出文件夹中的新文件夹中还是直接在输出文件夹中.
* `--connection-string` 或者 `-cs`: 重写所有 `appsettings.json` 文件的默认连接字符串. 默认连接字符串是 `Server=localhost;Database=MyProjectName;Trusted_Connection=True;MultipleActiveResultSets=true`. 如果你不想使用默认,你可以设置自己的连接字符串. 默认的数据库提供程序是 `SQL Server`, 所以你只能输入SQL Server连接字符串!
* `--local-framework-ref --abp-path`: 使用对项目的本地引用,而不是替换为NuGet包引用.
### add-package

4
docs/zh-Hans/Contribution/Localization-Text-Files.md

@ -23,8 +23,8 @@
* https://github.com/abpframework/abp/tree/master/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json
* https://github.com/abpframework/abp/tree/master/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json
* https://github.com/abpframework/abp/tree/master/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en.json
* https://github.com/abpframework/abp/tree/master/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json
* https://github.com/abpframework/abp/tree/master/samples/DashboardDemo/src/DashboardDemo.Domain.Shared/Localization/DashboardDemo/en.json
* https://github.com/abpframework/abp-samples/tree/master/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json
* https://github.com/abpframework/abp-samples/tree/master/DashboardDemo/src/DashboardDemo.Domain.Shared/Localization/DashboardDemo/en.json
* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/Localization/ApplicationContracts/en.json
* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/Localization/Domain/en.json
* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Localization/Resources/ProductManagement/en.json

2
docs/zh-Hans/Entity-Framework-Core-Migrations.md

@ -7,7 +7,7 @@
### 源码
你可以在[这里](https://github.com/abpframework/abp/tree/dev/samples/EfCoreMigrationDemo)找到本文引用的示例项目的源代码; 但是为了理解示例项目的源代码,你需要阅读和理解这个文档.
你可以在[这里](https://github.com/abpframework/abp-samples/tree/master/EfCoreMigrationDemo)找到本文引用的示例项目的源代码; 但是为了理解示例项目的源代码,你需要阅读和理解这个文档.
## 关于EF Core 代码优先迁移

2
docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md

@ -10,7 +10,7 @@
- [Part II: 创建,编辑,删除书籍](Part-II.md)
- [Part III: 集成测试](Part-III.md)
你可以从[GitHub存储库](https://github.com/abpframework/abp/tree/master/samples/BookStore)访问应用程序的**源代码**.
你可以从[GitHub存储库](https://github.com/abpframework/abp-samples/tree/master/BookStore)访问应用程序的**源代码**.
> 你也可以观看由ABP社区成员为本教程录制的[视频课程](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application).

14
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs

@ -14,9 +14,9 @@ namespace Volo.Abp.AspNetCore.MultiTenancy
private readonly ITenantResolveResultAccessor _tenantResolveResultAccessor;
public MultiTenancyMiddleware(
ITenantResolver tenantResolver,
ITenantStore tenantStore,
ICurrentTenant currentTenant,
ITenantResolver tenantResolver,
ITenantStore tenantStore,
ICurrentTenant currentTenant,
ITenantResolveResultAccessor tenantResolveResultAccessor)
{
_tenantResolver = tenantResolver;
@ -34,11 +34,13 @@ namespace Volo.Abp.AspNetCore.MultiTenancy
if (resolveResult.TenantIdOrName != null)
{
tenant = await FindTenantAsync(resolveResult.TenantIdOrName);
if (tenant == null)
{
//TODO: A better exception?
throw new AbpException(
"There is no tenant with given tenant id or name: " + resolveResult.TenantIdOrName
throw new BusinessException(
code: "Volo.AbpIo.MultiTenancy:010001",
message: "Tenant not found!",
details: "There is no tenant with the tenant id or name: " + resolveResult.TenantIdOrName
);
}
}

12
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Timeago/TimeagoScriptContributor.cs

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Globalization;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.JQuery;
using Volo.Abp.Modularity;
@ -12,5 +13,16 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.Timeago
{
context.Files.AddIfNotContains("/libs/timeago/jquery.timeago.js");
}
public override void ConfigureDynamicResources(BundleConfigurationContext context)
{
var cultureName = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
var cultureFileName = $"/libs/timeago/locales/jquery.timeago.{cultureName}.js";
if (context.FileProvider.GetFileInfo(cultureFileName).Exists)
{
context.Files.Add(cultureFileName);
}
}
}
}

4
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js

@ -60,6 +60,8 @@
container: 'body'
});
args.$el.findWithSelf('.timeago').timeago();
enableFormFeatures(args.$el.findWithSelf('form'), true);
initializeScript(args.$el);
@ -82,6 +84,8 @@
container: 'body'
});
$('.timeago').timeago();
$('[data-auto-focus="true"]').first().findWithSelf('input,select').focus();
});

3
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs

@ -199,6 +199,8 @@ namespace Volo.Abp.Cli.Commands
sb.AppendLine("-o|--output-folder <output-folder> (default: current folder)");
sb.AppendLine("-v|--version <version> (default: latest version)");
sb.AppendLine("-ts|--template-source <template-source> (your local or network abp template source)");
sb.AppendLine("-csf|--create-solution-folder (default: true)");
sb.AppendLine("-cs|--connection-string <connection-string> (your database connection string)");
sb.AppendLine("--tiered (if supported by the template)");
sb.AppendLine("--no-ui (if supported by the template)");
sb.AppendLine("--separate-identity-server (if supported by the template)");
@ -217,6 +219,7 @@ namespace Volo.Abp.Cli.Commands
sb.AppendLine(" abp new Acme.BookStore -t module");
sb.AppendLine(" abp new Acme.BookStore -t module --no-ui");
sb.AppendLine(" abp new Acme.BookStore -ts \"D:\\localTemplate\\abp\"");
sb.AppendLine(" abp new Acme.BookStore -csf false");
sb.AppendLine(" abp new Acme.BookStore --local-framework-ref --abp-path \"D:\\github\\abp\"");
sb.AppendLine(" abp new Acme.BookStore --connection-string \"Server=myServerName\\myInstanceName;Database=myDatabase;User Id=myUsername;Password=myPassword\"");
sb.AppendLine("");

56
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs

@ -9,6 +9,7 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
@ -54,7 +55,7 @@ namespace Volo.Abp.Cli.ProjectModification
if (IsAngularProject(fileDirectory))
{
CreateNpmrcFile(Path.GetDirectoryName(file));
await CreateNpmrcFileAsync(Path.GetDirectoryName(file));
}
RunYarn(fileDirectory);
@ -68,21 +69,70 @@ namespace Volo.Abp.Cli.ProjectModification
}
}
private void CreateNpmrcFile(string directoryName)
private async Task CreateNpmrcFileAsync(string directoryName)
{
var fileName = Path.Combine(directoryName, ".npmrc");
var abpRegistry = "@abp:registry:https://www.myget.org/F/abp-nightly/npm";
var voloRegistry = await GetVoloRegistryAsync();
if (File.Exists(fileName))
{
var fileContent = File.ReadAllText(fileName);
if (!fileContent.Contains(abpRegistry))
{
fileContent += Environment.NewLine + abpRegistry;
}
if (!fileContent.Contains(voloRegistry))
{
fileContent += Environment.NewLine + voloRegistry;
}
File.WriteAllText(fileName, fileContent);
return;
}
using var fs = File.Create(fileName);
var content = new UTF8Encoding(true).GetBytes("@abp:registry:https://www.myget.org/F/abp-nightly/npm");
var content = new UTF8Encoding(true)
.GetBytes(abpRegistry + Environment.NewLine + voloRegistry);
fs.Write(content, 0, content.Length);
}
private async Task<string> GetVoloRegistryAsync()
{
var apikey = await GetApiKeyAsync();
if (string.IsNullOrWhiteSpace(apikey))
{
return "";
}
return "@volo:registry=https://www.myget.org/F/abp-commercial/auth/" + apikey + "/npm/";
}
public async Task<string> GetApiKeyAsync()
{
try
{
using (var client = new CliHttpClient(TimeSpan.FromMinutes(1)))
{
var responseMessage = await client.GetAsync(
$"{CliUrls.WwwAbpIo}api/myget/apikey/"
);
return Encoding.Default.GetString(await responseMessage.Content.ReadAsByteArrayAsync());
}
}
catch (Exception)
{
return "";
}
}
private bool IsAngularProject(string fileDirectory)
{
return File.Exists(Path.Combine(fileDirectory, "angular.json"));

2
framework/src/Volo.Abp.MailKit/Volo.Abp.MailKit.csproj

@ -15,7 +15,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MailKit" Version="2.5.2" />
<PackageReference Include="MailKit" Version="2.6.0" />
</ItemGroup>
<ItemGroup>

2
framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json

@ -45,7 +45,7 @@
"PagerInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
"PagerInfoEmpty": "Showing 0 to 0 of 0 entries",
"PagerInfoFiltered": "(filtered from _MAX_ total entries)",
"NoDataAvailableInDatatable": "No data available in table",
"NoDataAvailableInDatatable": "No data available",
"PagerShowMenuEntries": "Show _MENU_ entries",
"DatatableActionDropdownDefaultText": "Actions",
"ChangePassword": "Change password",

9
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/EntityChangeWithUsername.cs

@ -0,0 +1,9 @@
namespace Volo.Abp.AuditLogging
{
public class EntityChangeWithUsername
{
public EntityChange EntityChange { get; set; }
public string UserName { get; set; }
}
}

4
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/IAuditLogRepository.cs

@ -69,5 +69,9 @@ namespace Volo.Abp.AuditLogging
string entityId = null,
string entityTypeFullName = null,
CancellationToken cancellationToken = default);
Task<EntityChangeWithUsername> GetEntityChangeWithUsernameAsync(Guid entityChangeId);
Task<List<EntityChangeWithUsername>> GetEntityChangesWithUsernameAsync(string entityId, string entityTypeFullName);
}
}

25
modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogRepository.cs

@ -182,6 +182,31 @@ namespace Volo.Abp.AuditLogging.EntityFrameworkCore
return totalCount;
}
public virtual async Task<EntityChangeWithUsername> GetEntityChangeWithUsernameAsync(Guid entityChangeId)
{
var auditLog = await DbSet.AsNoTracking().IncludeDetails()
.Where(x => x.EntityChanges.Any(y => y.Id == entityChangeId)).FirstAsync();
return new EntityChangeWithUsername()
{
EntityChange = auditLog.EntityChanges.First(x => x.Id == entityChangeId),
UserName = auditLog.UserName
};
}
public virtual async Task<List<EntityChangeWithUsername>> GetEntityChangesWithUsernameAsync(string entityId, string entityTypeFullName)
{
var query = DbContext.Set<EntityChange>()
.AsNoTracking()
.IncludeDetails()
.Where(x => x.EntityId == entityId && x.EntityTypeFullName == entityTypeFullName);
return await (from e in query
join auditLog in DbSet on e.AuditLogId equals auditLog.Id
select new EntityChangeWithUsername() {EntityChange = e, UserName = auditLog.UserName})
.OrderByDescending(x => x.EntityChange.ChangeTime).ToListAsync();
}
protected virtual IQueryable<EntityChange> GetEntityChangeListQuery(
Guid? auditLogId = null,
DateTime? startTime = null,

29
modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/MongoAuditLogRepository.cs

@ -191,6 +191,35 @@ namespace Volo.Abp.AuditLogging.MongoDB
return count;
}
public virtual async Task<EntityChangeWithUsername> GetEntityChangeWithUsernameAsync(Guid entityChangeId)
{
var auditLog = (await GetMongoQueryable()
.Where(x => x.EntityChanges.Any(y => y.Id == entityChangeId))
.FirstAsync());
return new EntityChangeWithUsername()
{
EntityChange = auditLog.EntityChanges.First(x => x.Id == entityChangeId),
UserName = auditLog.UserName
};
}
public virtual async Task<List<EntityChangeWithUsername>> GetEntityChangesWithUsernameAsync(string entityId, string entityTypeFullName)
{
var auditLogs = await GetMongoQueryable()
.Where(x => x.EntityChanges.Any(y => y.EntityId == entityId && y.EntityTypeFullName == entityTypeFullName))
.As<IMongoQueryable<AuditLog>>()
.OrderByDescending(x => x.ExecutionTime)
.ToListAsync();
var entityChanges = auditLogs.SelectMany(x => x.EntityChanges).ToList();
entityChanges.RemoveAll(x => x.EntityId != entityId || x.EntityTypeFullName != entityTypeFullName);
return entityChanges.Select(x => new EntityChangeWithUsername()
{EntityChange = x, UserName = auditLogs.First(y => y.Id == x.AuditLogId).UserName}).ToList();
}
protected virtual IQueryable<AuditLog> GetEntityChangeListQuery(
Guid? auditLogId = null,
DateTime? startTime = null,

225
modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo/Abp/AuditLogging/AuditLogRepository_Tests.cs

@ -4,6 +4,7 @@ using System.Globalization;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Microsoft.VisualBasic;
using Shouldly;
using Volo.Abp.Auditing;
using Volo.Abp.Guids;
@ -761,5 +762,229 @@ namespace Volo.Abp.AuditLogging
entityChanges.ShouldNotBeNull();
entityChanges.Count.ShouldBe(1);
}
[Fact]
public async Task GetEntityChangesWithUsernameAsync()
{
// Arrange
var userId = new Guid("4456fb0d-74cc-4807-9eee-23e551e6cb06");
var userId2 = new Guid("4456fb0d-74cc-4807-9eee-23e551e6cb06");
var ipAddress = "153.1.7.61";
var firstComment = "first Comment";
var firstUser = "Douglas";
var secondUser = "John Doe";
var entityId = Guid.NewGuid().ToString();
var entityType = "Volo.Abp.AuditLogging.TestEntity";
var log1 = new AuditLogInfo
{
UserId = userId,
ImpersonatorUserId = Guid.NewGuid(),
ImpersonatorTenantId = Guid.NewGuid(),
ExecutionTime = DateTime.Today,
ExecutionDuration = 42,
ClientIpAddress = ipAddress,
ClientName = "MyDesktop",
BrowserInfo = "Chrome",
Comments = new List<string> { firstComment, "Second Comment" },
UserName = firstUser,
EntityChanges = {
new EntityChangeInfo
{
EntityId = entityId,
EntityTypeFullName = entityType,
ChangeType = EntityChangeType.Created,
ChangeTime = DateTime.Now,
PropertyChanges = new List<EntityPropertyChangeInfo>
{
new EntityPropertyChangeInfo
{
PropertyTypeFullName = typeof(string).FullName,
PropertyName = "Name",
NewValue = "New value",
OriginalValue = null
}
}
},
new EntityChangeInfo
{
EntityId = Guid.NewGuid().ToString(),
EntityTypeFullName = "Volo.Abp.AuditLogging.TestEntity",
ChangeType = EntityChangeType.Created,
ChangeTime = DateTime.Now,
PropertyChanges = new List<EntityPropertyChangeInfo>
{
new EntityPropertyChangeInfo
{
PropertyTypeFullName = typeof(string).FullName,
PropertyName = "Name",
NewValue = "New value",
OriginalValue = null
}
}
}
}
};
var log2 = new AuditLogInfo
{
UserId = userId2,
ImpersonatorUserId = Guid.NewGuid(),
ImpersonatorTenantId = Guid.NewGuid(),
ExecutionTime = DateTime.Today,
ExecutionDuration = 42,
ClientIpAddress = ipAddress,
ClientName = "MyDesktop",
BrowserInfo = "Chrome",
Comments = new List<string> { firstComment, "Second Comment" },
HttpStatusCode = (int?)HttpStatusCode.Accepted,
UserName = secondUser,
EntityChanges = {
new EntityChangeInfo
{
EntityId = entityId,
EntityTypeFullName = entityType,
ChangeType = EntityChangeType.Updated,
ChangeTime = DateTime.Now,
PropertyChanges = new List<EntityPropertyChangeInfo>
{
new EntityPropertyChangeInfo
{
PropertyTypeFullName = typeof(string).FullName,
PropertyName = "Name",
NewValue = "New value",
OriginalValue = null
}
}
}
}
};
await AuditLogRepository.InsertAsync(new AuditLog(GuidGenerator, log1));
await AuditLogRepository.InsertAsync(new AuditLog(GuidGenerator, log2));
//Assert
var entityHistory = await AuditLogRepository.GetEntityChangesWithUsernameAsync(entityId, entityType);
entityHistory.Count.ShouldBe(2);
var firstUserChange = entityHistory.First(x => x.UserName == firstUser);
firstUserChange.ShouldNotBeNull();
firstUserChange.EntityChange.ShouldNotBeNull();
firstUserChange.EntityChange.ChangeType.ShouldBe(EntityChangeType.Created);
var secondUserChange = entityHistory.First(x => x.UserName == secondUser);
secondUserChange.ShouldNotBeNull();
secondUserChange.EntityChange.ShouldNotBeNull();
secondUserChange.EntityChange.ChangeType.ShouldBe(EntityChangeType.Updated);
}
[Fact]
public async Task GetEntityChangeWithUsernameAsync()
{
// Arrange
var userId = new Guid("4456fb0d-74cc-4807-9eee-23e551e6cb06");
var userId2 = new Guid("4456fb0d-74cc-4807-9eee-23e551e6cb06");
var ipAddress = "153.1.7.61";
var firstComment = "first Comment";
var log1 = new AuditLogInfo
{
UserId = userId,
ImpersonatorUserId = Guid.NewGuid(),
ImpersonatorTenantId = Guid.NewGuid(),
ExecutionTime = DateTime.Today,
ExecutionDuration = 42,
ClientIpAddress = ipAddress,
ClientName = "MyDesktop",
BrowserInfo = "Chrome",
Comments = new List<string> { firstComment, "Second Comment" },
UserName = "Douglas",
EntityChanges = {
new EntityChangeInfo
{
EntityId = Guid.NewGuid().ToString(),
EntityTypeFullName = "Volo.Abp.AuditLogging.TestEntity_Deleted",
ChangeType = EntityChangeType.Deleted,
ChangeTime = new DateTime(1995, 3, 27),
PropertyChanges = new List<EntityPropertyChangeInfo>
{
new EntityPropertyChangeInfo
{
PropertyTypeFullName = typeof(string).FullName,
PropertyName = "Name",
NewValue = "New value",
OriginalValue = null
}
}
},
new EntityChangeInfo
{
EntityId = Guid.NewGuid().ToString(),
EntityTypeFullName = "Volo.Abp.AuditLogging.TestEntity_Created",
ChangeType = EntityChangeType.Created,
ChangeTime = DateTime.Now,
PropertyChanges = new List<EntityPropertyChangeInfo>
{
new EntityPropertyChangeInfo
{
PropertyTypeFullName = typeof(string).FullName,
PropertyName = "Name",
NewValue = "New value",
OriginalValue = null
}
}
}
}
};
var log2 = new AuditLogInfo
{
UserId = userId2,
ImpersonatorUserId = Guid.NewGuid(),
ImpersonatorTenantId = Guid.NewGuid(),
ExecutionTime = DateTime.Today,
ExecutionDuration = 42,
ClientIpAddress = ipAddress,
ClientName = "MyDesktop",
BrowserInfo = "Chrome",
Comments = new List<string> { firstComment, "Second Comment" },
HttpStatusCode = (int?)HttpStatusCode.BadGateway,
UserName = "John Doe",
EntityChanges = {
new EntityChangeInfo
{
EntityId = Guid.NewGuid().ToString(),
EntityTypeFullName = "Volo.Abp.AuditLogging.TestEntity_Updated",
ChangeType = EntityChangeType.Updated,
ChangeTime = DateTime.Now,
PropertyChanges = new List<EntityPropertyChangeInfo>
{
new EntityPropertyChangeInfo
{
PropertyTypeFullName = typeof(string).FullName,
PropertyName = "Name",
NewValue = "New value",
OriginalValue = null
}
}
}
}
};
await AuditLogRepository.InsertAsync(new AuditLog(GuidGenerator, log1));
await AuditLogRepository.InsertAsync(new AuditLog(GuidGenerator, log2));
var entityChanges = await AuditLogRepository.GetEntityChangeListAsync();
var entityHistory =
await AuditLogRepository.GetEntityChangeWithUsernameAsync(entityChanges.First().Id);
entityHistory.EntityChange.ChangeTime.ShouldBe(entityChanges.First().ChangeTime);
entityHistory.UserName.ShouldNotBeNull();
}
}
}

2
modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs

@ -70,7 +70,7 @@ namespace Volo.Docs.Documents
input.LanguageCode,
input.Version
);
}
}
public virtual async Task<DocumentWithDetailsDto> GetDefaultAsync(GetDefaultDocumentInput input)
{

2
npm/lerna.json

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

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

@ -1,5 +1,5 @@
{
"version": "2.4.0",
"version": "2.4.1",
"packages": [
"packages/*"
],

32
npm/ng-packs/package.json

@ -22,20 +22,20 @@
"generate:changelog": "conventional-changelog -p angular -i CHANGELOG.md -s"
},
"devDependencies": {
"@abp/ng.account": "~2.3.0",
"@abp/ng.account.config": "~2.3.0",
"@abp/ng.core": "^2.3.0",
"@abp/ng.feature-management": "^2.3.0",
"@abp/ng.identity": "~2.3.0",
"@abp/ng.identity.config": "~2.3.0",
"@abp/ng.permission-management": "^2.3.0",
"@abp/ng.setting-management": "~2.3.0",
"@abp/ng.setting-management.config": "~2.3.0",
"@abp/ng.tenant-management": "~2.3.0",
"@abp/ng.tenant-management.config": "~2.3.0",
"@abp/ng.theme.basic": "~2.3.0",
"@abp/ng.theme.shared": "^2.3.0",
"@abp/utils": "~2.3.0",
"@abp/ng.account": "~2.4.0",
"@abp/ng.account.config": "~2.4.0",
"@abp/ng.core": "^2.4.0",
"@abp/ng.feature-management": "^2.4.0",
"@abp/ng.identity": "~2.4.0",
"@abp/ng.identity.config": "~2.4.0",
"@abp/ng.permission-management": "^2.4.0",
"@abp/ng.setting-management": "~2.4.0",
"@abp/ng.setting-management.config": "~2.4.0",
"@abp/ng.tenant-management": "~2.4.0",
"@abp/ng.tenant-management.config": "~2.4.0",
"@abp/ng.theme.basic": "~2.4.0",
"@abp/ng.theme.shared": "^2.4.0",
"@abp/utils": "^2.4.0",
"@angular-builders/jest": "^8.2.0",
"@angular-devkit/build-angular": "~0.803.21",
"@angular-devkit/build-ng-packagr": "~0.803.21",
@ -47,7 +47,7 @@
"@angular/core": "~8.2.14",
"@angular/forms": "~8.2.14",
"@angular/language-service": "~8.2.14",
"@angular/localize": "~9.0.2",
"@angular/localize": "~9.1.0",
"@angular/platform-browser": "~8.2.14",
"@angular/platform-browser-dynamic": "~8.2.14",
"@angular/router": "~8.2.14",
@ -72,7 +72,7 @@
"jest": "^24.9.0",
"jest-canvas-mock": "^2.1.2",
"jest-preset-angular": "^7.1.1",
"just-clone": "3.1.0",
"just-clone": "^3.1.0",
"just-compare": "^1.3.0",
"lerna": "^3.19.0",
"ng-packagr": "^5.7.1",

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

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

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

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

52
npm/ng-packs/packages/account/src/lib/components/change-password/change-password.component.ts

@ -1,14 +1,14 @@
import { ChangePassword, ConfigState, ABP } from '@abp/ng.core';
import { ToasterService } from '@abp/ng.theme.shared';
import { ChangePassword } from '@abp/ng.core';
import { getPasswordValidators, ToasterService } from '@abp/ng.theme.shared';
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { comparePasswords, Validation, PasswordRules, validatePassword } from '@ngx-validate/core';
import { comparePasswords, Validation } from '@ngx-validate/core';
import { Store } from '@ngxs/store';
import snq from 'snq';
import { finalize } from 'rxjs/operators';
import snq from 'snq';
import { Account } from '../../models/account';
const { minLength, required, maxLength } = Validators;
const { required } = Validators;
const PASSWORD_FIELDS = ['newPassword', 'repeatNewPassword'];
@ -36,33 +36,7 @@ export class ChangePasswordComponent
) {}
ngOnInit(): void {
const passwordRules: ABP.Dictionary<string> = this.store.selectSnapshot(
ConfigState.getSettings('Identity.Password'),
);
const passwordRulesArr = [] as PasswordRules;
let requiredLength = 1;
if ((passwordRules['Abp.Identity.Password.RequireDigit'] || '').toLowerCase() === 'true') {
passwordRulesArr.push('number');
}
if ((passwordRules['Abp.Identity.Password.RequireLowercase'] || '').toLowerCase() === 'true') {
passwordRulesArr.push('small');
}
if ((passwordRules['Abp.Identity.Password.RequireUppercase'] || '').toLowerCase() === 'true') {
passwordRulesArr.push('capital');
}
if (
(passwordRules['Abp.Identity.Password.RequireNonAlphanumeric'] || '').toLowerCase() === 'true'
) {
passwordRulesArr.push('special');
}
if (Number.isInteger(+passwordRules['Abp.Identity.Password.RequiredLength'])) {
requiredLength = +passwordRules['Abp.Identity.Password.RequiredLength'];
}
const passwordValidations = getPasswordValidators(this.store);
this.form = this.fb.group(
{
@ -70,23 +44,13 @@ export class ChangePasswordComponent
newPassword: [
'',
{
validators: [
required,
validatePassword(passwordRulesArr),
minLength(requiredLength),
maxLength(128),
],
validators: [required, ...passwordValidations],
},
],
repeatNewPassword: [
'',
{
validators: [
required,
validatePassword(passwordRulesArr),
minLength(requiredLength),
maxLength(128),
],
validators: [required, ...passwordValidations],
},
],
},

46
npm/ng-packs/packages/account/src/lib/components/register/register.component.ts

@ -1,18 +1,15 @@
import { ConfigState, GetAppConfiguration, ABP, SessionState, AuthService } from '@abp/ng.core';
import { ToasterService } from '@abp/ng.theme.shared';
import { AuthService, ConfigState } from '@abp/ng.core';
import { getPasswordValidators, ToasterService } from '@abp/ng.theme.shared';
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Navigate } from '@ngxs/router-plugin';
import { Store } from '@ngxs/store';
import { OAuthService } from 'angular-oauth2-oidc';
import { from, throwError } from 'rxjs';
import { catchError, finalize, switchMap, take, tap } from 'rxjs/operators';
import { throwError } from 'rxjs';
import { catchError, finalize, switchMap } from 'rxjs/operators';
import snq from 'snq';
import { RegisterRequest } from '../../models';
import { AccountService } from '../../services/account.service';
import { PasswordRules, validatePassword } from '@ngx-validate/core';
import { HttpHeaders } from '@angular/common/http';
const { maxLength, minLength, required, email } = Validators;
const { maxLength, required, email } = Validators;
@Component({
selector: 'abp-register',
@ -53,40 +50,9 @@ export class RegisterComponent implements OnInit {
return;
}
const passwordRules: ABP.Dictionary<string> = this.store.selectSnapshot(
ConfigState.getSettings('Identity.Password'),
);
const passwordRulesArr = [] as PasswordRules;
let requiredLength = 1;
if ((passwordRules['Abp.Identity.Password.RequireDigit'] || '').toLowerCase() === 'true') {
passwordRulesArr.push('number');
}
if ((passwordRules['Abp.Identity.Password.RequireLowercase'] || '').toLowerCase() === 'true') {
passwordRulesArr.push('small');
}
if ((passwordRules['Abp.Identity.Password.RequireUppercase'] || '').toLowerCase() === 'true') {
passwordRulesArr.push('capital');
}
if (
(passwordRules['Abp.Identity.Password.RequireNonAlphanumeric'] || '').toLowerCase() === 'true'
) {
passwordRulesArr.push('special');
}
if (Number.isInteger(+passwordRules['Abp.Identity.Password.RequiredLength'])) {
requiredLength = +passwordRules['Abp.Identity.Password.RequiredLength'];
}
this.form = this.fb.group({
username: ['', [required, maxLength(255)]],
password: [
'',
[required, validatePassword(passwordRulesArr), minLength(requiredLength), maxLength(128)],
],
password: ['', [required, ...getPasswordValidators(this.store)]],
email: ['', [required, email]],
});
}

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

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

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

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

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

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

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

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

43
npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts

@ -1,5 +1,5 @@
import { ABP, ConfigState } from '@abp/ng.core';
import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared';
import { ABP } from '@abp/ng.core';
import { Confirmation, ConfirmationService, getPasswordValidators } from '@abp/ng.theme.shared';
import { Component, OnInit, TemplateRef, TrackByFunction, ViewChild } from '@angular/core';
import {
AbstractControl,
@ -9,7 +9,6 @@ import {
FormGroup,
Validators,
} from '@angular/forms';
import { PasswordRules, validatePassword } from '@ngx-validate/core';
import { Select, Store } from '@ngxs/store';
import { Observable } from 'rxjs';
import { finalize, pluck, switchMap, take } from 'rxjs/operators';
@ -23,8 +22,8 @@ import {
UpdateUser,
} from '../../actions/identity.actions';
import { Identity } from '../../models/identity';
import { IdentityState } from '../../states/identity.state';
import { IdentityService } from '../../services/identity.service';
import { IdentityState } from '../../states/identity.state';
@Component({
selector: 'abp-users',
templateUrl: './users.component.html',
@ -63,10 +62,6 @@ export class UsersComponent implements OnInit {
sortKey = '';
passwordRulesArr = [] as PasswordRules;
requiredPasswordLength = 1;
trackByFn: TrackByFunction<AbstractControl> = (index, item) => Object.keys(item)[0] || index;
onVisiblePermissionChange = event => {
@ -86,32 +81,6 @@ export class UsersComponent implements OnInit {
ngOnInit() {
this.get();
const passwordRules: ABP.Dictionary<string> = this.store.selectSnapshot(
ConfigState.getSettings('Identity.Password'),
);
if ((passwordRules['Abp.Identity.Password.RequireDigit'] || '').toLowerCase() === 'true') {
this.passwordRulesArr.push('number');
}
if ((passwordRules['Abp.Identity.Password.RequireLowercase'] || '').toLowerCase() === 'true') {
this.passwordRulesArr.push('small');
}
if ((passwordRules['Abp.Identity.Password.RequireUppercase'] || '').toLowerCase() === 'true') {
this.passwordRulesArr.push('capital');
}
if (
(passwordRules['Abp.Identity.Password.RequireNonAlphanumeric'] || '').toLowerCase() === 'true'
) {
this.passwordRulesArr.push('special');
}
if (Number.isInteger(+passwordRules['Abp.Identity.Password.RequiredLength'])) {
this.requiredPasswordLength = +passwordRules['Abp.Identity.Password.RequiredLength'];
}
}
onSearch(value: string) {
@ -146,11 +115,7 @@ export class UsersComponent implements OnInit {
),
});
const passwordValidators = [
validatePassword(this.passwordRulesArr),
Validators.minLength(this.requiredPasswordLength),
Validators.maxLength(128),
];
const passwordValidators = getPasswordValidators(this.store);
this.form.addControl('password', new FormControl('', [...passwordValidators]));

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

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

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

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

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

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

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

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

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

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

4
npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts

@ -1,5 +1,5 @@
import { ABP } from '@abp/ng.core';
import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared';
import { ConfirmationService, Confirmation, getPasswordValidators } from '@abp/ng.theme.shared';
import { Component, OnInit, TemplateRef, ViewChild, ChangeDetectorRef } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Select, Store } from '@ngxs/store';
@ -122,7 +122,7 @@ export class TenantsComponent implements OnInit {
const tenantForm = this.fb.group({
name: [this.selected.name || '', [Validators.required, Validators.maxLength(256)]],
adminEmailAddress: [null, [Validators.required, Validators.maxLength(256), Validators.email]],
adminPassword: [null, [Validators.required]],
adminPassword: [null, [Validators.required, ...getPasswordValidators(this.store)]],
});
if (this.hasSelectedTenant) {

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

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

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

@ -1,13 +1,13 @@
{
"name": "@abp/ng.theme.shared",
"version": "2.4.0",
"version": "2.4.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.core": "^2.4.0",
"@abp/ng.core": "^2.4.1",
"@fortawesome/fontawesome-free": "^5.12.1",
"@ng-bootstrap/ng-bootstrap": "^5.3.0",
"@ngx-validate/core": "^0.0.7",

21
npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.html

@ -1,5 +1,16 @@
<div #container id="abp-http-error-container" class="error" [style.backgroundColor]="backgroundColor">
<button *ngIf="!hideCloseIcon" id="abp-close-button" type="button" class="close mr-2" (click)="destroy()">
<div
#container
id="abp-http-error-container"
class="error"
[style.backgroundColor]="backgroundColor"
>
<button
*ngIf="!hideCloseIcon"
id="abp-close-button"
type="button"
class="close mr-2"
(click)="destroy()"
>
<span aria-hidden="true">&times;</span>
</button>
@ -11,7 +22,11 @@
{{ details | abpLocalization }}
</div>
<div class="error-actions">
<a (click)="destroy()" routerLink="/" class="btn btn-primary btn-md mt-2"
<a
*ngIf="isHomeShow"
(click)="destroy()"
routerLink="/"
class="btn btn-primary btn-md mt-2"
><span class="glyphicon glyphicon-home"></span>
{{ { key: '::Menu:Home', defaultValue: 'Home' } | abpLocalization }}
</a>

13
npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts

@ -42,6 +42,8 @@ export class HttpErrorWrapperComponent implements AfterViewInit, OnDestroy, OnIn
backgroundColor: string;
isHomeShow = true;
@ViewChild('container', { static: false })
containerRef: ElementRef<HTMLDivElement>;
@ -51,16 +53,21 @@ export class HttpErrorWrapperComponent implements AfterViewInit, OnDestroy, OnIn
ngOnInit() {
this.backgroundColor =
snq(() => window.getComputedStyle(document.body).getPropertyValue('background-color')) || '#fff';
snq(() => window.getComputedStyle(document.body).getPropertyValue('background-color')) ||
'#fff';
}
ngAfterViewInit() {
if (this.customComponent) {
const customComponentRef = this.cfRes.resolveComponentFactory(this.customComponent).create(this.injector);
const customComponentRef = this.cfRes
.resolveComponentFactory(this.customComponent)
.create(this.injector);
customComponentRef.instance.errorStatus = this.status;
customComponentRef.instance.destroy$ = this.destroy$;
this.appRef.attachView(customComponentRef.hostView);
this.containerRef.nativeElement.appendChild((customComponentRef.hostView as EmbeddedViewRef<any>).rootNodes[0]);
this.containerRef.nativeElement.appendChild(
(customComponentRef.hostView as EmbeddedViewRef<any>).rootNodes[0],
);
customComponentRef.changeDetectorRef.detectChanges();
}

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

@ -62,22 +62,20 @@
</ng-template>
<ng-template #body>
<tbody class="ui-table-tbody">
<ng-container *ngIf="value && value.length; else emptyTemplate">
<ng-template
#bodyTemplateWrapper
*ngFor="let val of slicedValue; let index = index; trackBy: trackByFn"
[ngTemplateOutlet]="bodyTemplate"
[ngTemplateOutletContext]="{ $implicit: val, rowIndex: index }"
></ng-template>
</ng-container>
<tbody class="ui-table-tbody" *ngIf="value && value.length; else emptyTemplate">
<ng-template
#bodyTemplateWrapper
*ngFor="let val of slicedValue; let index = index; trackBy: trackByFn"
[ngTemplateOutlet]="bodyTemplate"
[ngTemplateOutletContext]="{ $implicit: val, rowIndex: index }"
></ng-template>
</tbody>
</ng-template>
<ng-template #emptyTemplate>
<tr class="empty-row" #emptyRow>
<div class="empty-row-content" [style.width.px]="emptyRow.offsetWidth">
{{ emptyMessage | abpLocalization }}
</div>
</tr>
<caption class="ui-table-empty">
{{
emptyMessage | abpLocalization
}}
</caption>
</ng-template>

10
npm/ng-packs/packages/theme-shared/src/lib/components/table/table.component.scss

@ -6,13 +6,11 @@
filter: brightness(90%);
}
.ui-table-tbody > tr.empty-row:hover {
filter: none;
}
.ui-table-tbody > tr.empty-row > div.empty-row-content {
padding: 10px;
.ui-table-empty {
padding: 20px 0;
text-align: center;
border: 1px solid #e0e0e0;
border-top-width: 0;
}
.ui-table-caption,

2
npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts

@ -138,6 +138,8 @@ export class ErrorHandler {
key: 'AbpAccount::DefaultErrorMessage',
defaultValue: DEFAULT_ERROR_MESSAGES.defaultError.title,
},
details: err.message,
isHomeShow: false,
});
}
break;

7
npm/ng-packs/packages/theme-shared/src/lib/tests/table.component.spec.ts

@ -1,8 +1,7 @@
import { createHostFactory, SpectatorHost } from '@ngneat/spectator/jest';
import { PaginationComponent, TableComponent } from '../components';
import { Pipe, PipeTransform } from '@angular/core';
import { NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap';
import { createHostFactory, SpectatorHost } from '@ngneat/spectator/jest';
import { PaginationComponent, TableComponent } from '../components';
@Pipe({
name: 'abpLocalization',
@ -40,7 +39,7 @@ describe('TableComponent', () => {
});
it('should display the empty message', () => {
expect(spectator.query('tr.empty-row>div')).toHaveText(
expect(spectator.query('caption.ui-table-empty')).toHaveText(
'AbpAccount::NoDataAvailableInDatatable',
);
});

52
npm/ng-packs/packages/theme-shared/src/lib/tests/validation-utils.spec.ts

@ -0,0 +1,52 @@
import { ConfigState } from '@abp/ng.core';
import { Component } from '@angular/core';
import { createComponentFactory, Spectator } from '@ngneat/spectator';
import { NgxValidateCoreModule, validatePassword } from '@ngx-validate/core';
import { NgxsModule, Store } from '@ngxs/store';
import { HttpClient } from '@angular/common/http';
import { getPasswordValidators } from '../utils';
import { Validators } from '@angular/forms';
@Component({ template: '', selector: 'abp-dummy' })
class DummyComponent {}
describe('ValidationUtils', () => {
let spectator: Spectator<DummyComponent>;
const createComponent = createComponentFactory({
component: DummyComponent,
imports: [NgxsModule.forRoot([ConfigState]), NgxValidateCoreModule.forRoot()],
mocks: [HttpClient],
});
beforeEach(() => (spectator = createComponent()));
describe('#getPasswordValidators', () => {
it('should return password valdiators', () => {
const store = spectator.get(Store);
store.reset({
ConfigState: {
setting: {
values: {
'Abp.Identity.Password.RequiredLength': '6',
'Abp.Identity.Password.RequiredUniqueChars': '1',
'Abp.Identity.Password.RequireNonAlphanumeric': 'True',
'Abp.Identity.Password.RequireLowercase': 'True',
'Abp.Identity.Password.RequireUppercase': 'True',
'Abp.Identity.Password.RequireDigit': 'True',
},
},
},
});
const validators = getPasswordValidators(store);
const expectedValidators = [
validatePassword(['number', 'small', 'capital', 'special']),
Validators.minLength(6),
Validators.maxLength(128),
];
validators.forEach((validator, index) => {
expect(validator.toString()).toBe(expectedValidators[index].toString());
});
});
});
});

1
npm/ng-packs/packages/theme-shared/src/lib/utils/index.ts

@ -1,2 +1,3 @@
export * from './widget-utils';
export * from './date-parser-formatter';
export * from './validation-utils';

45
npm/ng-packs/packages/theme-shared/src/lib/utils/validation-utils.ts

@ -0,0 +1,45 @@
import { Store } from '@ngxs/store';
import { ABP, ConfigState } from '@abp/ng.core';
import { PasswordRules, validatePassword } from '@ngx-validate/core';
import { Validators, ValidatorFn } from '@angular/forms';
const { minLength, maxLength } = Validators;
export function getPasswordValidators(store: Store): ValidatorFn[] {
const getRule = getRuleFn(store);
const passwordRulesArr = [] as PasswordRules;
let requiredLength = 1;
if (getRule('RequireDigit') === 'true') {
passwordRulesArr.push('number');
}
if (getRule('RequireLowercase') === 'true') {
passwordRulesArr.push('small');
}
if (getRule('RequireUppercase') === 'true') {
passwordRulesArr.push('capital');
}
if (getRule('RequireNonAlphanumeric') === 'true') {
passwordRulesArr.push('special');
}
if (Number.isInteger(+getRule('RequiredLength'))) {
requiredLength = +getRule('RequiredLength');
}
return [validatePassword(passwordRulesArr), minLength(requiredLength), maxLength(128)];
}
function getRuleFn(store: Store) {
return (key: string) => {
const passwordRules: ABP.Dictionary<string> = store.selectSnapshot(
ConfigState.getSettings('Identity.Password'),
);
return (passwordRules[`Abp.Identity.Password.${key}`] || '').toLowerCase();
};
}

177
npm/ng-packs/yarn.lock

@ -2,27 +2,28 @@
# yarn lockfile v1
"@abp/ng.account.config@^2.3.0", "@abp/ng.account.config@~2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.account.config/-/ng.account.config-2.3.0.tgz#28d65e2eb889d8b44fc726edbed7509214e8034a"
integrity sha512-Vg4+8PvGfgUC+pFtPIS53ZekJM+O4JZ8wGPGaZ/ySLpk2oSfzC/5RFS2rKq3cmySeRCJunmQinCAlBCm5zir8A==
"@abp/ng.account.config@^2.4.0", "@abp/ng.account.config@~2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.account.config/-/ng.account.config-2.4.0.tgz#1319fe8eb3eb61c4787e69b3abaa589f9d3ce578"
integrity sha512-y+VDH9gDCoVYIGVB60HrWBm0W8GuwRrXZj8WSABUNdWF+6LmIKEs7dAHj0NQAbePqdiDrFgIMLCAxqTctIVveA==
dependencies:
tslib "^1.9.0"
"@abp/ng.account@~2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-2.3.0.tgz#9ca2a564c177c43b53f69f141405914baefbc7b2"
integrity sha512-kJCek8woGGEC1WTgo75Qr2ucyD5VV1nqqnkw8UMJ96/pqASpBJHczGTL8R4ug961i4vexKDnMbiv0SmfMlBDig==
"@abp/ng.account@~2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-2.4.0.tgz#f8d86f1bc352278c7fdbfed5d8b68f66da7f6c9e"
integrity sha512-tgnwX625ALauTU63CLkFyboVw1Z73/Ax7hFliP1wLZap1PbYsowijWtA2rN8qxYIjNTD9F7IIgELzMcnMcac0A==
dependencies:
"@abp/ng.account.config" "^2.3.0"
"@abp/ng.theme.shared" "^2.3.0"
"@abp/ng.account.config" "^2.4.0"
"@abp/ng.theme.shared" "^2.4.0"
tslib "^1.9.0"
"@abp/ng.core@^2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-2.3.0.tgz#96bad951da07e589f11a0345171e1a142463671e"
integrity sha512-6SsgcRJQWjXvyEZ7VO2ekOoVmKkFB17vJgTvQLiyB+j2t9guAo3LPDcMGGKNum/oInkiYczf8MY7sculrElyKQ==
"@abp/ng.core@^2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-2.4.0.tgz#e666445048e0e35d805957a959d51002d4444342"
integrity sha512-+scZSdVA6Lcp7N+91w/d/EaaKDhBbEeXJpvxa6PooWSTACHzmmMk8uIKLvDC/LHtoyzNXkETA8beHCtpb0mhYw==
dependencies:
"@abp/utils" "~2.3.0"
"@angular/localize" "~9.0.2"
"@ngxs/router-plugin" "^3.6.2"
"@ngxs/storage-plugin" "^3.6.2"
@ -31,88 +32,89 @@
just-clone "3.1.0"
just-compare "^1.3.0"
snq "^1.0.3"
ts-toolbelt "^6.3.6"
tslib "^1.9.0"
"@abp/ng.feature-management@^2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-2.3.0.tgz#91172fa9f308b3a792a2bf1e762e24560556f412"
integrity sha512-ShytiV1SC3PwP4Hs8Ss3bk2UAZBXteHKWcrIhAvqtWsOQ2aql6e7t+FutRA3wtUuRdX6PTrMRXbMRvhCwGZUKQ==
"@abp/ng.feature-management@^2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-2.4.0.tgz#305e6566cc379071dfb7699e7033dd9077fd79ff"
integrity sha512-Td4xEx/KuHq2O2Vzaclsw1py+enaerc7Mmyr0gingDLbdndj/8Sh+iwtGOW3OnacMdzELN5sm7cXdDU//5kpSQ==
dependencies:
"@abp/ng.theme.shared" "^2.3.0"
"@abp/ng.theme.shared" "^2.4.0"
tslib "^1.9.0"
"@abp/ng.identity.config@^2.3.0", "@abp/ng.identity.config@~2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.identity.config/-/ng.identity.config-2.3.0.tgz#e9f4904d60f94cc01b3254e0221d7cdb2274aa3b"
integrity sha512-bqCaPHCwaHUfAfNfFskGTJHGvv+hPK9Tmm7PouVa884AmeQs2j0Gwl3o93YHK2VwXENV09qb01feXapSVPsmTw==
"@abp/ng.identity.config@^2.4.0", "@abp/ng.identity.config@~2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.identity.config/-/ng.identity.config-2.4.0.tgz#a8b0e975277d4e41b1c628f75c2228bee26742ee"
integrity sha512-Co7PjGrkJux3TwjoX51inZ6JZDNcHr5Cm1Ac6gkQOZYzzUX0Hes6tEOBirs81PwFTARPXz7lqXfbKMmvYkAF7Q==
dependencies:
tslib "^1.9.0"
"@abp/ng.identity@~2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-2.3.0.tgz#c973f12f5490b1d29c80f510540b18343f998b8d"
integrity sha512-vBLLxCax7MoHilakpW9XMRFGUXcdMM0syiz0PtkgKmYADIQIQ9AzcfwslK2D6wwy447s6NIoGnThtfbshoRtLw==
"@abp/ng.identity@~2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-2.4.0.tgz#8d628316d07891338b6c8c743a2f66398aa6cbe2"
integrity sha512-O8S3kinhQ0qGDMWdwkOpWci8WF0z8YraZmw3TsPHOwaaU3IHJqKZ66ycZUmWGeeF8dPY+AwExyK0RxSTI9wVgA==
dependencies:
"@abp/ng.identity.config" "^2.3.0"
"@abp/ng.permission-management" "^2.3.0"
"@abp/ng.theme.shared" "^2.3.0"
"@abp/ng.identity.config" "^2.4.0"
"@abp/ng.permission-management" "^2.4.0"
"@abp/ng.theme.shared" "^2.4.0"
tslib "^1.9.0"
"@abp/ng.permission-management@^2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-2.3.0.tgz#16599a2e1583c9d6769edb1dc9b78a45b75b7402"
integrity sha512-vJSfcmXCXpBHMjeRb/0QoKlAcvpCQ/qS2quHFUr23nriXIeNxgEdCVHkTBZU8FMxfyTfwwrFRzF2oxn33gubbg==
"@abp/ng.permission-management@^2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-2.4.0.tgz#a9978fc94d9a4a638effc1334d98727da9eef415"
integrity sha512-fxJIKL+WaNyQrUHMICEOWxRKMlowCmU/Cmptl/XF3WoScsMDuvCqXBZRdFJWYoBQBC0lWA9CyXFIGMBKb+kghQ==
dependencies:
"@abp/ng.theme.shared" "^2.3.0"
"@abp/ng.theme.shared" "^2.4.0"
tslib "^1.9.0"
"@abp/ng.setting-management.config@^2.3.0", "@abp/ng.setting-management.config@~2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management.config/-/ng.setting-management.config-2.3.0.tgz#80b9ebc659c34be4c4c45cc6f2fe2b593f491aab"
integrity sha512-nj6Hl8hlzrGJFJZo4d9DWQtf1PCSFnXup/3ajqMOCPPE+oBItY3aNY05jDyGgdr2wEdyWo/u9Invy3Jsvq8itQ==
"@abp/ng.setting-management.config@^2.4.0", "@abp/ng.setting-management.config@~2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management.config/-/ng.setting-management.config-2.4.0.tgz#fea07f79124c921f5ea0cd04ffdba99f9b8d9df6"
integrity sha512-H2PNtudIDMLeW4gZrCjdjs5ugeWMLEgaNZ342mDa3yU/Is4sgcOfyPQ+b0b1mmf0ggxJfEHsOoAAnvHLivcx0Q==
dependencies:
tslib "^1.9.0"
"@abp/ng.setting-management@~2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-2.3.0.tgz#478c603f67416df763228bc958b6ea05e7d13dd7"
integrity sha512-xJk09NdpXeg3/KezvKl+h0B4T08Hy1SofOATQpVTrE4TIsFxyXKmasMcSY4i/3+wwE1umH+6TZJwPE+pXTu9Ng==
"@abp/ng.setting-management@~2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-2.4.0.tgz#46163c5a85c97d1773b8be10ddf1e976667f7f7d"
integrity sha512-ZQa4AhcI8LPI4FmijQs75FKYb44tvpvL+9kApT5seYF/h5gDHXRwgUEjzubtI8z1tdsIJYKhEKTEiZB2nThAPQ==
dependencies:
"@abp/ng.setting-management.config" "^2.3.0"
"@abp/ng.theme.shared" "^2.3.0"
"@abp/ng.setting-management.config" "^2.4.0"
"@abp/ng.theme.shared" "^2.4.0"
tslib "^1.9.0"
"@abp/ng.tenant-management.config@^2.3.0", "@abp/ng.tenant-management.config@~2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management.config/-/ng.tenant-management.config-2.3.0.tgz#8501a3a53f1abac8a65a87782752afb2ba648bb1"
integrity sha512-gGqg7rZd5X37z9glYF2lSiFpJ3Lyi1NdqHnaxdCTui+3/weMo/5RKlf+ilUAPqR5YAMVSLi4mBYYsuShWEBBIQ==
"@abp/ng.tenant-management.config@^2.4.0", "@abp/ng.tenant-management.config@~2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management.config/-/ng.tenant-management.config-2.4.0.tgz#46ef1ace585686b7de642417cd335cadd9f0515b"
integrity sha512-cnS5liA9/oWsPuKL7TbngO22s+buZcSHTzNMvn6voEloBgt2kUNLoDblQF0Z55o3XQq16jdxPMv666bZb/PDvA==
dependencies:
tslib "^1.9.0"
"@abp/ng.tenant-management@~2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-2.3.0.tgz#5ec092ad9c597d4aa9f2f849fc12e955d2d24696"
integrity sha512-LyJaXuzgZr2tfFPknuGz1spOzfxfaEhPuQ6zHBOhVfQ6KtMBeagsQQoEiLJMtcygR0MRox0kzmUiyTKm4H5DoA==
"@abp/ng.tenant-management@~2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-2.4.0.tgz#3e70bb32a45d3ac0962782d0c22db9891c46a757"
integrity sha512-iKOWU0aRTUwGujdQprluAW3aAb6OuAtxB09FI7fmWyK5svVzamLfHa12tl+f4nNpJ7U9de/4zMc3R6LQNnvp/A==
dependencies:
"@abp/ng.feature-management" "^2.3.0"
"@abp/ng.tenant-management.config" "^2.3.0"
"@abp/ng.theme.shared" "^2.3.0"
"@abp/ng.feature-management" "^2.4.0"
"@abp/ng.tenant-management.config" "^2.4.0"
"@abp/ng.theme.shared" "^2.4.0"
tslib "^1.9.0"
"@abp/ng.theme.basic@~2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-2.3.0.tgz#e5857864ae4c3274a57cc785b06cccd0ff3515a8"
integrity sha512-LuAlKqmqEFUUwI/ruB6aO1rhfsCD19Pt7PCE3M+vr/KvlYAKb89K1U8nphIfMV8PCz9IU07BwvTn/T2qIt39HQ==
"@abp/ng.theme.basic@~2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-2.4.0.tgz#a9b8b93e92f4a0307ca73d79f5b8bf6163be4740"
integrity sha512-+bkOC+nm8FXZx/emGrKxVBPJNRsd/jGCzc98B9YS9mGMncKGWXxS27pAfxB7XxYxALrQL3Kp8Ptuwx5Jkw/t8g==
dependencies:
"@abp/ng.theme.shared" "^2.3.0"
"@abp/ng.theme.shared" "^2.4.0"
tslib "^1.9.0"
"@abp/ng.theme.shared@^2.3.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-2.3.0.tgz#5b13b8e170fb0c2a4afca34434bd455ee8dfb9d6"
integrity sha512-keYnD17K8QkdSLqBbsATfeh7KwKNoUj/XsHZO8hawE3OfRuy4qYY9xghGFZUUqdIE5kF6gKlLKj4ZTZmuCvOmQ==
"@abp/ng.theme.shared@^2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-2.4.0.tgz#b9e4cda7b0c5ae95e00ca2ffa35d7a4b94ad2ee2"
integrity sha512-CnKPUzfiNWhnKs93YhUJxgotAqmJnZYht6IiyPc0Ymtu6pJsk+lQLLuKC3cFbzkq9ORoqJydBb1JZWwccDbDuA==
dependencies:
"@abp/ng.core" "^2.3.0"
"@abp/ng.core" "^2.4.0"
"@fortawesome/fontawesome-free" "^5.12.1"
"@ng-bootstrap/ng-bootstrap" "^5.3.0"
"@ngx-validate/core" "^0.0.7"
@ -120,6 +122,13 @@
chart.js "^2.9.3"
tslib "^1.9.0"
"@abp/utils@^2.4.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-2.4.0.tgz#2ca0666b9f6f2a442cf78d0812cdf1e3b63c41d0"
integrity sha512-viydYI0ArISItewH2cBHSj0M2f3YJ07a+TItOg970h6caSsMvDROK5Ai4VWoaB0r+Y2nz+n3msvrQK63P9Newg==
dependencies:
just-compare "^1.3.0"
"@abp/utils@~2.3.0":
version "2.3.1"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-2.3.1.tgz#728b978d598a98b643562250be54c92988b986e5"
@ -362,6 +371,15 @@
glob "7.1.2"
yargs "13.1.0"
"@angular/localize@~9.1.0":
version "9.1.1"
resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-9.1.1.tgz#267d7cecb288b3019482744330da0ef9e049c85d"
integrity sha512-5mYdSL7IwqFXWRgBXj9c5vHT15AQy2kjD40fJJsmUx4WUFr+uf0Ss9ADCfL2FjCHpATrjYKpiyJs1mAF60USPQ==
dependencies:
"@babel/core" "7.8.3"
glob "7.1.2"
yargs "15.3.0"
"@angular/platform-browser-dynamic@~8.2.14":
version "8.2.14"
resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.14.tgz#4439a79fe10ec45170e6940a28835e9ff0918950"
@ -7587,7 +7605,7 @@ jszip@^3.1.3:
readable-stream "~2.3.6"
set-immediate-shim "~1.0.1"
just-clone@3.1.0:
just-clone@3.1.0, just-clone@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/just-clone/-/just-clone-3.1.0.tgz#10efc422e9b041355c43b8076d7b768b7a09fbbd"
integrity sha512-sROn15yHaeNYSTG49HmfbQLtsZvMBb2COvVofNXbeUXx6GkERkdjG3dfejD0fe78gdHJLyS+fOz897H73S8LqA==
@ -12551,6 +12569,14 @@ yargs-parser@^16.1.0:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^18.1.0:
version "18.1.2"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1"
integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs@12.0.5:
version "12.0.5"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
@ -12586,6 +12612,23 @@ yargs@13.1.0:
y18n "^4.0.0"
yargs-parser "^13.0.0"
yargs@15.3.0:
version "15.3.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.0.tgz#403af6edc75b3ae04bf66c94202228ba119f0976"
integrity sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==
dependencies:
cliui "^6.0.0"
decamelize "^1.2.0"
find-up "^4.1.0"
get-caller-file "^2.0.1"
require-directory "^2.1.1"
require-main-filename "^2.0.0"
set-blocking "^2.0.0"
string-width "^4.2.0"
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^18.1.0"
yargs@^13.3.0:
version "13.3.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83"

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

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/anchor-js",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"anchor-js": "^4.2.2"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

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

@ -1,11 +1,11 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/aspnetcore.mvc.ui.theme.basic",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "^2.4.0"
"@abp/aspnetcore.mvc.ui.theme.shared": "^2.4.1"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

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

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

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

@ -1,5 +1,5 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/aspnetcore.mvc.ui",
"publishConfig": {
"access": "public"
@ -12,5 +12,5 @@
"path": "^0.12.7",
"rimraf": "^3.0.0"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

10
npm/packs/blogging/package.json

@ -1,13 +1,13 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/blogging",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "^2.4.0",
"@abp/owl.carousel": "^2.4.0",
"@abp/tui-editor": "^2.4.0"
"@abp/aspnetcore.mvc.ui.theme.shared": "^2.4.1",
"@abp/owl.carousel": "^2.4.1",
"@abp/tui-editor": "^2.4.1"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

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

@ -1,5 +1,5 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/bootstrap-datepicker",
"publishConfig": {
"access": "public"
@ -7,5 +7,5 @@
"dependencies": {
"bootstrap-datepicker": "^1.9.0"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/bootstrap/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/bootstrap",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"bootstrap": "^4.3.1"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

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

@ -1,5 +1,5 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/chart.js",
"publishConfig": {
"access": "public"
@ -7,5 +7,5 @@
"dependencies": {
"chart.js": "^2.9.3"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/clipboard/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/clipboard",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"clipboard": "^2.0.4"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/codemirror/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/codemirror",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"codemirror": "^5.49.2"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

4
npm/packs/core/package.json

@ -1,8 +1,8 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/core",
"publishConfig": {
"access": "public"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

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

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/datatables.net-bs4",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/datatables.net": "^2.4.0",
"@abp/datatables.net": "^2.4.1",
"datatables.net-bs4": "^1.10.20"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

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

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/datatables.net",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"datatables.net": "^1.10.20"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

14
npm/packs/docs/package.json

@ -1,15 +1,15 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/docs",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/anchor-js": "^2.4.0",
"@abp/clipboard": "^2.4.0",
"@abp/malihu-custom-scrollbar-plugin": "^2.4.0",
"@abp/popper.js": "^2.4.0",
"@abp/prismjs": "^2.4.0"
"@abp/anchor-js": "^2.4.1",
"@abp/clipboard": "^2.4.1",
"@abp/malihu-custom-scrollbar-plugin": "^2.4.1",
"@abp/popper.js": "^2.4.1",
"@abp/prismjs": "^2.4.1"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

4
npm/packs/flag-icon-css/package.json

@ -1,5 +1,5 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/flag-icon-css",
"publishConfig": {
"access": "public"
@ -7,5 +7,5 @@
"dependencies": {
"flag-icon-css": "^3.4.5"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/font-awesome/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/font-awesome",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"@fortawesome/fontawesome-free": "^5.11.2"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/highlight.js/package.json

@ -1,11 +1,11 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/highlight.js",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0"
"@abp/core": "^2.4.1"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/jquery-form/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/jquery-form",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery": "^2.4.0",
"@abp/jquery": "^2.4.1",
"jquery-form": "^4.2.2"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/jquery-validation-unobtrusive/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/jquery-validation-unobtrusive",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery-validation": "^2.4.0",
"@abp/jquery-validation": "^2.4.1",
"jquery-validation-unobtrusive": "^3.2.11"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/jquery-validation/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/jquery-validation",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery": "^2.4.0",
"@abp/jquery": "^2.4.1",
"jquery-validation": "^1.19.1"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/jquery/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/jquery",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"jquery": "^3.4.1"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/lodash/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/lodash",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"lodash": "^4.17.15"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

4
npm/packs/luxon/package.json

@ -1,5 +1,5 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/luxon",
"publishConfig": {
"access": "public"
@ -7,5 +7,5 @@
"dependencies": {
"luxon": "^1.21.3"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/malihu-custom-scrollbar-plugin/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/malihu-custom-scrollbar-plugin",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"malihu-custom-scrollbar-plugin": "^3.1.5"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/markdown-it/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/markdown-it",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"markdown-it": "^10.0.0"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/owl.carousel/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/owl.carousel",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"owl.carousel": "^2.3.4"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/popper.js/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/popper.js",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"popper.js": "^1.16.0"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/prismjs/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/prismjs",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"prismjs": "^1.17.1"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/select2/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/select2",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"select2": "^4.0.12"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/sweetalert/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/sweetalert",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "^2.4.0",
"@abp/core": "^2.4.1",
"sweetalert": "^2.1.2"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/timeago/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/timeago",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery": "^2.4.0",
"@abp/jquery": "^2.4.1",
"timeago": "^1.6.7"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

6
npm/packs/toastr/package.json

@ -1,12 +1,12 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/toastr",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery": "^2.4.0",
"@abp/jquery": "^2.4.1",
"toastr": "^2.1.4"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

12
npm/packs/tui-editor/package.json

@ -1,15 +1,15 @@
{
"version": "2.4.0",
"version": "2.4.1",
"name": "@abp/tui-editor",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/codemirror": "^2.4.0",
"@abp/highlight.js": "^2.4.0",
"@abp/jquery": "^2.4.0",
"@abp/markdown-it": "^2.4.0",
"@abp/codemirror": "^2.4.1",
"@abp/highlight.js": "^2.4.1",
"@abp/jquery": "^2.4.1",
"@abp/markdown-it": "^2.4.1",
"tui-editor": "^1.4.8"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

4
npm/packs/utils/package.json

@ -1,6 +1,6 @@
{
"name": "@abp/utils",
"version": "2.4.0",
"version": "2.4.1",
"scripts": {
"prepublish": "yarn install --ignore-scripts && node prepublish.js",
"ng": "ng",
@ -55,5 +55,5 @@
"dependencies": {
"just-compare": "^1.3.0"
},
"gitHead": "aadffb76ee4ac7aef2842074e4f9c9f425b3ebe7"
"gitHead": "0c72682d406026760da2f832a493145beae3a5c0"
}

25
samples/BasicAspNetCoreApplication/BasicAspNetCoreApplication.sln

@ -1,25 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29326.143
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BasicAspNetCoreApplication", "BasicAspNetCoreApplication\BasicAspNetCoreApplication.csproj", "{069D79DF-2340-4101-9B6E-32FEEC6893A8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{069D79DF-2340-4101-9B6E-32FEEC6893A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{069D79DF-2340-4101-9B6E-32FEEC6893A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{069D79DF-2340-4101-9B6E-32FEEC6893A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{069D79DF-2340-4101-9B6E-32FEEC6893A8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9AC9422D-35CC-4A8E-9F5B-D695565E9B45}
EndGlobalSection
EndGlobal

33
samples/BasicAspNetCoreApplication/BasicAspNetCoreApplication/AppModule.cs

@ -1,33 +0,0 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
namespace BasicAspNetCoreApplication
{
[DependsOn(typeof(AbpAspNetCoreMvcModule))]
[DependsOn(typeof(AbpAutofacModule))] //Add dependency to ABP Autofac module
public class AppModule : AbpModule
{
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseMvcWithDefaultRouteAndArea();
}
}
}

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

Loading…
Cancel
Save