Browse Source

Merge branch 'dev' into IdentitySession

pull/18242/head
maliming 3 years ago
parent
commit
55f233bb54
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 2
      Directory.Packages.props
  2. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ar.json
  3. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
  4. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/fi.json
  5. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hu.json
  6. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json
  7. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json
  8. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
  9. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
  10. 84
      docs/en/Blog-Posts/2023-12-20 v8_0_Release_Stable/POST.md
  11. BIN
      docs/en/Blog-Posts/2023-12-20 v8_0_Release_Stable/abp-china-team.jpeg
  12. BIN
      docs/en/Blog-Posts/2023-12-20 v8_0_Release_Stable/awards.jpeg
  13. BIN
      docs/en/Blog-Posts/2023-12-20 v8_0_Release_Stable/cover-image.png
  14. 10
      docs/en/Entity-Cache.md
  15. 72
      docs/en/Entity-Framework-Core-Oracle-Devart.md
  16. 70
      docs/en/Entity-Framework-Core-Oracle-Official.md
  17. 2
      docs/en/Tutorials/Part-1.md
  18. 14
      docs/en/Tutorials/Part-10.md
  19. 55
      docs/en/Tutorials/Part-4.md
  20. 16
      docs/en/Tutorials/Part-6.md
  21. 52
      docs/en/Tutorials/Part-8.md
  22. 8
      docs/en/Tutorials/Part-9.md
  23. 2
      docs/en/UI/Common/Utils/Linked-List.md
  24. 2
      docs/zh-Hans/UI/Common/Utils/Linked-List.md
  25. 4
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectReferenceReplaceStep.cs
  26. 4
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs
  27. 9
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RandomizeAuthServerPassPhraseStep.cs
  28. 33
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs
  29. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs
  30. 2
      latest-versions.json
  31. 145
      modules/blogging/src/Volo.Blogging.Web/Pages/Members/Index.cshtml
  32. 31
      modules/blogging/src/Volo.Blogging.Web/Pages/Members/Index.css
  33. 4
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/uppy/uppy.js
  34. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js
  35. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js
  36. 4
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js
  37. 4
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js
  38. 5
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIDentityClaimTypeRepository.cs
  39. 7
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityClaimTypeRepository.cs
  40. 7
      modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityClaimTypeRepository.cs
  41. 8
      modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityClaimTypeRepository_Tests.cs
  42. 4
      npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts
  43. 3
      npm/ng-packs/packages/theme-shared/src/lib/constants/validation.ts
  44. 2
      npm/packs/uppy/package.json
  45. 100
      npm/scripts/change-package-version.ts
  46. 5
      npm/scripts/package.json
  47. 10
      npm/scripts/yarn.lock
  48. 2
      templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/Program.cs
  49. 2
      templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Program.cs
  50. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/OpenIddict/OpenIddictDataSeedContributor.cs

2
Directory.Packages.props

@ -6,7 +6,7 @@
<PackageVersion Include="AlibabaCloud.SDK.Dysmsapi20170525" Version="2.0.24" />
<PackageVersion Include="aliyun-net-sdk-sts" Version="3.1.2" />
<PackageVersion Include="Aliyun.OSS.SDK.NetCore" Version="2.13.0" />
<PackageVersion Include="AsyncKeyedLock" Version="6.2.2" />
<PackageVersion Include="AsyncKeyedLock" Version="6.2.4" />
<PackageVersion Include="Autofac" Version="7.1.0" />
<PackageVersion Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" />
<PackageVersion Include="Autofac.Extras.DynamicProxy" Version="7.1.0" />

2
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ar.json

@ -91,7 +91,7 @@
"JoinOurMarketingNewsletter": "انضم إلى النشرة الإخبارية التسويقية",
"CommunityPrivacyPolicyConfirmation": "أوافق على الشروط والأحكام و <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">سياسة الخصوصية</a>.",
"WouldLikeToReceiveNotification": "أرغب في تلقي آخر الأخبار من مواقع abp.io.",
"CommercialNewsletterConfirmationMessage": "أنا أوافق على <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/TermsConditions\">البنود و الظروف</a> و <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">سياسة الخصوصية</a>.",
"CommercialNewsletterConfirmationMessage": "أنا أوافق على <a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/TermsConditions\">البنود و الظروف</a> و <a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/Privacy\">سياسة الخصوصية</a>.",
"FreeDDDEBook": "كتاب تصميم مقاد بالنطاق DDD إلكتروني مجاني",
"AdditionalServices": "خدمات إضافية",
"Learn": "تعلم",

2
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json

@ -91,7 +91,7 @@
"JoinOurMarketingNewsletter": "Join our marketing newsletter",
"CommunityPrivacyPolicyConfirmation": "I agree to the Terms & Conditions and <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">Privacy Policy</a>.",
"WouldLikeToReceiveNotification": "I would like to receive the latest news from abp.io websites.",
"CommercialNewsletterConfirmationMessage": "I agree to the <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/TermsConditions\">Terms & Conditions</a> and <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">Privacy Policy</a>.",
"CommercialNewsletterConfirmationMessage": "I agree to the <a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/TermsConditions\">Terms & Conditions</a> and <a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/Privacy\">Privacy Policy</a>.",
"FreeDDDEBook": "Free DDD E-Book",
"AdditionalServices": "Additional Services",
"Learn": "Learn",

2
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/fi.json

@ -91,7 +91,7 @@
"JoinOurMarketingNewsletter": "Liity markkinointiuutiskirjeeseemme",
"CommunityPrivacyPolicyConfirmation": "Hyväksyn käyttöehdot ja <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">tietosuojakäytännön</a> .",
"WouldLikeToReceiveNotification": "Haluan saada viimeisimmät uutiset abp.io-sivustoilta.",
"CommercialNewsletterConfirmationMessage": "Hyväksyn <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/TermsConditions\">käyttöehdot</a> ja <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">tietosuojakäytännön</a>.",
"CommercialNewsletterConfirmationMessage": "Hyväksyn <a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/TermsConditions\">käyttöehdot</a> ja <a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/Privacy\">tietosuojakäytännön</a>.",
"FreeDDDEBook": "Ilmainen DDD e-kirja",
"AdditionalServices": "Lisäpalvelut",
"Learn": "Opi",

2
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hu.json

@ -91,7 +91,7 @@
"JoinOurMarketingNewsletter": "Csatlakozzon marketing hírlevelünkhöz",
"CommunityPrivacyPolicyConfirmation": "Elfogadom az Általános Szerződési Feltételeket és az <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">Adatvédelmi szabályzatot</a>.",
"WouldLikeToReceiveNotification": "Szeretném megkapni a legfrissebb híreket az abp.io webhelyekről.",
"CommercialNewsletterConfirmationMessage": "Elfogadom az <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/TermsConditions\">Általános Szerződési Feltételeket</a> és az <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">Adatvédelmi szabályzatot</a> .",
"CommercialNewsletterConfirmationMessage": "Elfogadom az <a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/TermsConditions\">Általános Szerződési Feltételeket</a> és az <a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/Privacy\">Adatvédelmi szabályzatot</a> .",
"FreeDDDEBook": "Ingyenes DDD e-könyv",
"AdditionalServices": "További szolgáltatások",
"Learn": "Tanulás",

2
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json

@ -83,7 +83,7 @@
"JoinOurMarketingNewsletter": "Pazarlama bültenimize katılın",
"CommunityPrivacyPolicyConfirmation": "Şartları, Koşulları ve <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">Gizlilik Politikasını</a> kabul ediyorum.",
"WouldLikeToReceiveNotification": "abp.io web sitelerinden en son haberleri almak istiyorum.",
"CommercialNewsletterConfirmationMessage": "<a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/TermsConditions\">Şartlar ve Koşulları</a> ve <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">Gizlilik Politikasını</a> kabul ediyorum.",
"CommercialNewsletterConfirmationMessage": "<a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/TermsConditions\">Şartlar ve Koşulları</a> ve <a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/Privacy\">Gizlilik Politikasını</a> kabul ediyorum.",
"FreeDDDEBook": "Ücretsiz DDD E-Kitabı",
"AdditionalServices": "Ek Hizmetler",
"Learn": "Öğren",

2
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json

@ -91,7 +91,7 @@
"JoinOurMarketingNewsletter": "加入我们市场推广时事通讯",
"CommunityPrivacyPolicyConfirmation": "我同意条款 & 条件和<a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">隐私政策 </a>。",
"WouldLikeToReceiveNotification": "我想从 abp.io 网站接收最新消息。",
"CommercialNewsletterConfirmationMessage": "我同意<a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/TermsConditions\">条款 & 条件</a > 和 <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">隐私政策</a>。",
"CommercialNewsletterConfirmationMessage": "我同意<a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/TermsConditions\">条款 & 条件</a > 和 <a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/Privacy\">隐私政策</a>。",
"FreeDDDEBook": "免费 DDD 电子书",
"AdditionalServices": "额外服务",
"Learn": "学习",

2
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json

@ -849,7 +849,7 @@
"BlazoriseSupportExplanation5": "You can post your questions on the support website and generate a product token for your application.",
"AbpLiveTrainingPackages": "ABP Live Training Packages",
"Releases": "Releases",
"ReleasesDescription": "Release logs of ABP Commercial.",
"ReleasesDescription": "This page contains detailed information about each release. You can see all the closed pull requests for a specific release. For overall milestone developments, you can check out the <a href=\"https://docs.abp.io/en/commercial/latest/release-notes\">brief release notes page</a>.",
"ReleaseDate": "Release Date",
"Labels": "Labels",
"PreRelease": "Pre-release",

2
abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json

@ -191,7 +191,7 @@
"DiscordPageTitle": "ABP Discord Community",
"ViewVideo": "View Video",
"AbpCommunityTitleContent": "ABP Community - Open Source ABP Framework",
"CommunitySlogan": "A unique community platform for <span class=\"d-inline-block d-md-block gradient-community\">ABP Lovers</span>",
"CommunitySlogan": "A unique community platform for <span class=\"{0}\">ABP Lovers</span>",
"RaffleIsNotActive": "Raffle is not active",
"YouAreAlreadyJoinedToThisRaffle": "You are already joined to this raffle",
"InvalidSubscriptionCode": "Invalid subscription code",

84
docs/en/Blog-Posts/2023-12-20 v8_0_Release_Stable/POST.md

@ -0,0 +1,84 @@
# ABP.IO Platform 8.0 Has Been Released Based on .NET 8.0
Today, [ABP Framework](https://abp.io/) and [ABP Commercial](https://commercial.abp.io/) 8.0 versions have been released based on [.NET 8.0](https://dotnet.microsoft.com/en-us/download/dotnet/8.0).
## What's New With Version 8.0?
All the new features were explained in detail in the [8.0 RC Announcement Post](https://blog.abp.io/abp/announcing-abp-8-0-release-candidate), so there is no need to review them again. You can check it out for more details.
## Getting Started with 8.0
### Creating New Solutions
You can create a new solution with the ABP Framework version 8.0 by either using the `abp new` command or generating the CLI command on the [get started page](https://abp.io/get-started).
> See the [getting started document](https://docs.abp.io/en/abp/latest/Getting-Started) for more.
### How to Upgrade an Existing Solution
#### Install/Update the ABP CLI
First, install the ABP CLI or upgrade it to the latest version.
If you haven't installed it yet:
```bash
dotnet tool install -g Volo.Abp.Cli
```
To update the existing CLI:
```bash
dotnet tool update -g Volo.Abp.Cli
```
#### Upgrading Existing Solutions with the ABP Update Command
[ABP CLI](https://docs.abp.io/en/abp/latest/CLI) provides a handy command to update all the ABP related NuGet and NPM packages in your solution with a single command:
```bash
abp update
```
Run this command in the root folder of your solution.
## Migration Guides
There are breaking changes in this version that may affect your application.
Please see the following migration documents if you are upgrading from v7.x or earlier:
* [ABP Framework 7.x to 8.0 Migration Guide](https://docs.abp.io/en/abp/8.0/Migration-Guides/Abp-8_0)
* [ABP Commercial 7.x to 8.0 Migration Guide](https://docs.abp.io/en/commercial/8.0/migration-guides/v8_0)
## Community News
### We were at China .NET Conf 2023
China's most influential .NET event officially kicked off on December 16, 2023. The conference has invited 30+ technical experts from various fields to share the new features of .NET 8, full-stack Blazor, AI, .NET MAUI, and more...
![](abp-china-team.jpeg)
As one of the community partners of .NET Conf China 2023, our ABP.IO China team was at the event. At the event, we showed developers the latest news and related updates on ABP.IO.
Through this event, we gained a lot and felt the enthusiasm and support of the developers community for ABP.IO. If you want to learn more, we have shared our impressions and takeaways in a blog post, which you can find at [https://blog.abp.io/abp/ABP-at-China-NET-Conf-2023](https://blog.abp.io/abp/ABP-at-China-NET-Conf-2023).
### ABP Commercial Won 5 Recognitions from Gartner
![](awards.jpeg)
2023 was the year for ABP.IO to strive with the community. On top of last year's [Software Advice's Front Runner of Application Development in 2022](https://blog.abp.io/abp/abpcommercial-2022-front-runner-in-app-development-category) and [GetApp's Application Development Category Leader in 2022](https://blog.abp.io/abp/abpcommercial-2022-category-leader-in-app-development-category), we won **5 awards** this year from **Gartner**!
> If you are interested in these awards and want to learn more, you can check out our [blog post](https://blog.abp.io/abp/ABP-Commercial-Won-5-Recognitions-from-Gartner-in-2023)!
### New ABP Community Posts
There are exciting articles contributed by the ABP community, as always. I will highlight some of them here:
* [Performance Optimization of .NET-based application](https://community.abp.io/posts/performance-optimization-of-.netbased-and-also-abpbased-application-pmdwhwxc) by [Leon Košak](https://github.com/leonkosak)
* [Video: ABP Framework Consuming HTTP APIs from a .NET Client](https://community.abp.io/videos/abp-framework-consuming-http-apis-from-a-.net-client-uzul9og4) by [Hamza Albreem](https://github.com/braim23)
Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://community.abp.io/articles/submit) to the ABP Community.
## About the Next Version
The next feature version will be 8.1. You can follow the [release planning here](https://github.com/abpframework/abp/milestones). Please [submit an issue](https://github.com/abpframework/abp/issues/new) if you have any problems with this version.

BIN
docs/en/Blog-Posts/2023-12-20 v8_0_Release_Stable/abp-china-team.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

BIN
docs/en/Blog-Posts/2023-12-20 v8_0_Release_Stable/awards.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
docs/en/Blog-Posts/2023-12-20 v8_0_Release_Stable/cover-image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

10
docs/en/Entity-Cache.md

@ -45,13 +45,13 @@ public class ProductAppService : ApplicationService, IProductAppService
}
```
> Note that we've used the `ObjectMapper` service to map from `Product` to `ProductDto`. You should configure that [object mapping](Object-To-Object-Mapping.md) to make that example service properly works.
> Note that we've used the `ObjectMapper` service to map from `Product` to `ProductDto`. You should configure that [object mapping](Object-To-Object-Mapping.md) to make that example service properly work.
That's all. The cache name (in the distributed cache server) will be full name (with namespace) of the `Product` class. You can use the `[CacheName]` attribute to change it. Please refer to the [caching document](Caching.md) for details.
That's all. The cache name (in the distributed cache server) will be the full name (with namespace) of the `Product` class. You can use the `[CacheName]` attribute to change it. Please refer to the [caching document](Caching.md) for details.
## Using a Cache Item Class
In the previous section, we've directly cached the `Product` entity. In that case, the `Product` class must be serializable to JSON (and deserializable from JSON). Sometimes that might not be possible or you may want to use another class to store the cache data. For example, we may want to use the `ProductDto` class instead of the `Product` class for the cached object if the `Product` entity.
In the previous section, we've directly cached the `Product` entity. In that case, the `Product` class must be serializable to JSON (and deserializable from JSON). Sometimes that might not be possible or you may want to use another class to store the cache data. For example, we may want to use the `ProductDto` class instead of the `Product` class for the cached object of the `Product` entity.
Assume that we've created a `ProductDto` class as shown below:
@ -102,7 +102,7 @@ public class ProductAppService : ApplicationService, IProductAppService
}
```
Notice that the `_productCache.GetAsync` method already returns a `ProductDto` object, so we could directly return it from out application service.
Notice that the `_productCache.GetAsync` method already returns a `ProductDto` object, so we could directly return it from our application service.
## Configuration
@ -122,7 +122,7 @@ context.Services.AddEntityCache<Product, ProductDto, Guid>(
## Additional Notes
* Entity classes should be serializable/deserializable to/from JSON to be cached (because it's serialized to JSON when saving in the [Distributed Cache](Caching.md)). If your entity class is not serializable, you can consider using a cache-item/DTO class instead, as explained before.
* Entity Caching System is designed as **read-only**. You should use the standard [repository](Repositories.md) methods to manipulate the entity if you need. If you need to manipulate (update) the entity, do not get it from the entity cache. Instead, read it from the repository, change it and update using the repository.
* Entity Caching System is designed as **read-only**. You should use the standard [repository](Repositories.md) methods to manipulate the entity if you need to. If you need to manipulate (update) the entity, do not get it from the entity cache. Instead, read it from the repository, change it and update using the repository.
## See Also

72
docs/en/Entity-Framework-Core-Oracle-Devart.md

@ -60,6 +60,78 @@ This will scaffold a new migration for Oracle.
Run the `.DbMigrator` project to create the database, apply the changes and seed the initial data.
## ORA-12899: value too large for column fix
Oracle limits strings to `NVARCHAR2(2000)` when the migration is created. Some of the entity properties may extend it. You can check the known and reported properties of ABP modules entities that can extend this limit. To prevent this problem, you need to convert the `string` type to `long` type first and generate a new migration. Then convert the `long` type to `clob` type with maximum length.
### First Migration
Update you application DbContext `OnModelCreating` method:
```csharp
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
/* Include modules to your migration db context */
builder.Entity<OpenIddictToken>(b =>
{
b.Property(q => q.Payload).HasColumnType("long").HasMaxLength(int.MaxValue);
});
builder.Entity<AuditLog>(b =>
{
b.Property(x => x.Exceptions).HasColumnType("long").HasMaxLength(int.MaxValue);
});
builder.Entity<AuditLogAction>(b =>
{
b.Property(x => x.Parameters).HasColumnType("long").HasMaxLength(int.MaxValue);
});
/* Configure your own tables/entities inside here */
}
```
Create a new migration using dotnet tooling under EntityFrameworkCore layer of your solution: `dotnet ef migrations add Oracle_Long_Conversion`
### Second Migration
Update you application DbContext `OnModelCreating` method:
```csharp
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
/* Include modules to your migration db context */
builder.Entity<OpenIddictToken>(b =>
{
b.Property(q => q.Payload).HasColumnType("clob").HasMaxLength(4000);
});
builder.Entity<AuditLog>(b =>
{
b.Property(x => x.Exceptions).HasColumnType("clob").HasMaxLength(4000);
});
builder.Entity<AuditLogAction>(b =>
{
b.Property(x => x.Parameters).HasColumnType("clob").HasMaxLength(4000);
});
/* Configure your own tables/entities inside here */
}
```
Create a new migration using dotnet tooling under EntityFrameworkCore layer of your solution: `dotnet ef migrations add Oracle_Clob_Conversion`
Run DbMigrator (or use dotnet tooling) to migrate the oracle database.
## Run the Application
It is ready. Just run the application and enjoy coding.

70
docs/en/Entity-Framework-Core-Oracle-Official.md

@ -55,6 +55,76 @@ This will scaffold a new migration for Oracle.
Run the `.DbMigrator` project to create the database, apply the changes and seed the initial data.
## ORA-12899: value too large for column fix
Oracle limits strings to `NVARCHAR2(2000)` when the migration is created. Some of the entity properties may extend it. You can check the known and reported properties of ABP modules entities that can extend this limit. To prevent this problem, you need to convert the `string` type to `long` type first and generate a new migration. Then convert the `long` type to `clob` type with maximum length.
### First Migration
Update you application DbContext `OnModelCreating` method:
```csharp
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
/* Include modules to your migration db context */
builder.Entity<OpenIddictToken>(b =>
{
b.Property(q => q.Payload).HasColumnType("long").HasMaxLength(int.MaxValue);
});
builder.Entity<AuditLog>(b =>
{
b.Property(x => x.Exceptions).HasColumnType("long").HasMaxLength(int.MaxValue);
});
builder.Entity<AuditLogAction>(b =>
{
b.Property(x => x.Parameters).HasColumnType("long").HasMaxLength(int.MaxValue);
});
/* Configure your own tables/entities inside here */
}
```
Create a new migration using dotnet tooling under EntityFrameworkCore layer of your solution: `dotnet ef migrations add Oracle_Long_Conversion`
### Second Migration
Update you application DbContext `OnModelCreating` method:
```csharp
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
/* Include modules to your migration db context */
builder.Entity<OpenIddictToken>(b =>
{
b.Property(q => q.Payload).HasColumnType("clob").HasMaxLength(4000);
});
builder.Entity<AuditLog>(b =>
{
b.Property(x => x.Exceptions).HasColumnType("clob").HasMaxLength(4000);
});
builder.Entity<AuditLogAction>(b =>
{
b.Property(x => x.Parameters).HasColumnType("clob").HasMaxLength(4000);
});
/* Configure your own tables/entities inside here */
}
```
Create a new migration using dotnet tooling under EntityFrameworkCore layer of your solution: `dotnet ef migrations add Oracle_Clob_Conversion`
Run DbMigrator (or use dotnet tooling) to migrate the oracle database.
## Run the Application
It is ready. Just run the application and enjoy coding.

2
docs/en/Tutorials/Part-1.md

@ -368,7 +368,7 @@ public class CreateUpdateBookDto
{
[Required]
[StringLength(128)]
public string Name { get; set; }
public string Name { get; set; } = string.Empty;
[Required]
public BookType Type { get; set; } = BookType.Undefined;

14
docs/en/Tutorials/Part-10.md

@ -614,19 +614,19 @@ using System.Threading.Tasks;
using Acme.BookStore.Authors;
using Shouldly;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Modularity;
using Volo.Abp.Validation;
using Xunit;
namespace Acme.BookStore.Books;
{{if DB=="Mongo"}}
[Collection(BookStoreTestConsts.CollectionDefinitionName)]{{end}}
public class BookAppService_Tests : BookStoreApplicationTestBase
public abstract class BookAppService_Tests<TStartupModule> : BookStoreApplicationTestBase<TStartupModule>
where TStartupModule : IAbpModule
{
private readonly IBookAppService _bookAppService;
private readonly IAuthorAppService _authorAppService;
public BookAppService_Tests()
protected BookAppService_Tests()
{
_bookAppService = GetRequiredService<IBookAppService>();
_authorAppService = GetRequiredService<IAuthorAppService>();
@ -643,7 +643,7 @@ public class BookAppService_Tests : BookStoreApplicationTestBase
//Assert
result.TotalCount.ShouldBeGreaterThan(0);
result.Items.ShouldContain(b => b.Name == "1984" &&
b.AuthorName == "George Orwell");
b.AuthorName == "George Orwell");
}
[Fact]
@ -788,7 +788,7 @@ public class CreateModalModel : BookStorePageModel
[Required]
[StringLength(128)]
public string Name { get; set; }
public string Name { get; set; } = string.Empty;
[Required]
public BookType Type { get; set; } = BookType.Undefined;
@ -871,7 +871,7 @@ public class EditModalModel : BookStorePageModel
[Required]
[StringLength(128)]
public string Name { get; set; }
public string Name { get; set; } = string.Empty;
[Required]
public BookType Type { get; set; } = BookType.Undefined;

55
docs/en/Tutorials/Part-4.md

@ -82,19 +82,18 @@ using System.Linq;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Modularity;
using Volo.Abp.Validation;
using Xunit;
namespace Acme.BookStore.Books;
{{if DB=="Mongo"}}
[Collection(BookStoreTestConsts.CollectionDefinitionName)]
{{end}}
public class BookAppService_Tests : BookStoreApplicationTestBase
public abstract class BookAppService_Tests<TStartupModule> : BookStoreApplicationTestBase<TStartupModule>
where TStartupModule : IAbpModule
{
private readonly IBookAppService _bookAppService;
public BookAppService_Tests()
protected BookAppService_Tests()
{
_bookAppService = GetRequiredService<IBookAppService>();
}
@ -114,6 +113,41 @@ public class BookAppService_Tests : BookStoreApplicationTestBase
}
````
{{if DB == "EF"}}
Add a new implementation class of `BookAppService_Tests` class, named `EfCoreBookAppService_Tests` in the `EntityFrameworkCore\Applications\Books` namespace (folder) of the `Acme.BookStore.EntityFrameworkCore.Tests` project:
````csharp
using Acme.BookStore.Books;
using Xunit;
namespace Acme.BookStore.EntityFrameworkCore.Applications.Books;
[Collection(BookStoreTestConsts.CollectionDefinitionName)]
public class EfCoreBookAppService_Tests : BookAppService_Tests<BookStoreEntityFrameworkCoreTestModule>
{
}
````
{{end}}
{{if DB == "Mongo"}}
Add a new implementation class of `BookAppService_Tests` class, named `MongoDBBookAppService_Tests` in the `MongoDb\Applications\Books` namespace (folder) of the `Acme.BookStore.MongoDB.Tests` project:
````csharp
using Acme.BookStore.MongoDB;
using Acme.BookStore.Books;
using Xunit;
namespace Acme.BookStore.MongoDb.Applications.Books;
[Collection(BookStoreTestConsts.CollectionDefinitionName)]
public class MongoDBBookAppService_Tests : BookAppService_Tests<BookStoreMongoDbTestModule>
{
}
````
{{end}}
* `Should_Get_List_Of_Books` test simply uses `BookAppService.GetListAsync` method to get and check the list of books.
* We can safely check the book "1984" by its name, because we know that this books is available in the database since we've added it in the seed data.
@ -174,19 +208,18 @@ using System.Linq;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Modularity;
using Volo.Abp.Validation;
using Xunit;
namespace Acme.BookStore.Books;
{{if DB=="Mongo"}}
[Collection(BookStoreTestConsts.CollectionDefinitionName)]
{{end}}
public class BookAppService_Tests : BookStoreApplicationTestBase
public abstract class BookAppService_Tests<TStartupModule> : BookStoreApplicationTestBase<TStartupModule>
where TStartupModule : IAbpModule
{
private readonly IBookAppService _bookAppService;
public BookAppService_Tests()
protected BookAppService_Tests()
{
_bookAppService = GetRequiredService<IBookAppService>();
}
@ -203,7 +236,7 @@ public class BookAppService_Tests : BookStoreApplicationTestBase
result.TotalCount.ShouldBeGreaterThan(0);
result.Items.ShouldContain(b => b.Name == "1984");
}
[Fact]
public async Task Should_Create_A_Valid_Book()
{

16
docs/en/Tutorials/Part-6.md

@ -75,9 +75,9 @@ public class Author : FullAuditedAggregateRoot<Guid>
internal Author(
Guid id,
[NotNull] string name,
string name,
DateTime birthDate,
[CanBeNull] string shortBio = null)
string? shortBio = null)
: base(id)
{
SetName(name);
@ -85,13 +85,13 @@ public class Author : FullAuditedAggregateRoot<Guid>
ShortBio = shortBio;
}
internal Author ChangeName([NotNull] string name)
internal Author ChangeName(string name)
{
SetName(name);
return this;
}
private void SetName([NotNull] string name)
private void SetName(string name)
{
Name = Check.NotNullOrWhiteSpace(
name,
@ -146,9 +146,9 @@ public class AuthorManager : DomainService
}
public async Task<Author> CreateAsync(
[NotNull] string name,
string name,
DateTime birthDate,
[CanBeNull] string shortBio = null)
string? shortBio = null)
{
Check.NotNullOrWhiteSpace(name, nameof(name));
@ -167,8 +167,8 @@ public class AuthorManager : DomainService
}
public async Task ChangeNameAsync(
[NotNull] Author author,
[NotNull] string newName)
Author author,
string newName)
{
Check.NotNull(author, nameof(author));
Check.NotNullOrWhiteSpace(newName, nameof(newName));

52
docs/en/Tutorials/Part-8.md

@ -123,12 +123,12 @@ public class CreateAuthorDto
{
[Required]
[StringLength(AuthorConsts.MaxNameLength)]
public string Name { get; set; }
public string Name { get; set; } = string.Empty;
[Required]
public DateTime BirthDate { get; set; }
public string ShortBio { get; set; }
public string? ShortBio { get; set; }
}
````
@ -146,12 +146,12 @@ public class UpdateAuthorDto
{
[Required]
[StringLength(AuthorConsts.MaxNameLength)]
public string Name { get; set; }
public string Name { get; set; } = string.Empty;
[Required]
public DateTime BirthDate { get; set; }
public string ShortBio { get; set; }
public string? ShortBio { get; set; }
}
````
@ -481,18 +481,17 @@ Finally, we can write some tests for the `IAuthorAppService`. Add a new class, n
using System;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Modularity;
using Xunit;
namespace Acme.BookStore.Authors;
{{if DB=="Mongo"}}
[Collection(BookStoreTestConsts.CollectionDefinitionName)]
{{end}}
public class AuthorAppService_Tests : BookStoreApplicationTestBase
public abstract class AuthorAppService_Tests<TStartupModule> : BookStoreApplicationTestBase<TStartupModule>
where TStartupModule : IAbpModule
{
private readonly IAuthorAppService _authorAppService;
public AuthorAppService_Tests()
protected AuthorAppService_Tests()
{
_authorAppService = GetRequiredService<IAuthorAppService>();
}
@ -554,6 +553,41 @@ public class AuthorAppService_Tests : BookStoreApplicationTestBase
}
````
{{if DB == "EF"}}
Add a new implementation class of `AuthorAppService_Tests` class, named `EfCoreAuthorAppService_Tests` in the `EntityFrameworkCore\Applications\Authors` namespace (folder) of the `Acme.BookStore.EntityFrameworkCore.Tests` project:
````csharp
using Acme.BookStore.Authors;
using Xunit;
namespace Acme.BookStore.EntityFrameworkCore.Applications.Authors;
[Collection(BookStoreTestConsts.CollectionDefinitionName)]
public class EfCoreAuthorAppService_Tests : AuthorAppService_Tests<BookStoreEntityFrameworkCoreTestModule>
{
}
````
{{end}}
{{if DB == "Mongo"}}
Add a new implementation class of `AuthorAppService_Tests` class, named `MongoDBAuthorAppService_Tests` in the `MongoDb\Applications\Authors` namespace (folder) of the `Acme.BookStore.MongoDB.Tests` project:
````csharp
using Acme.BookStore.MongoDB;
using Acme.BookStore.Authors;
using Xunit;
namespace Acme.BookStore.MongoDb.Applications.Authors;
[Collection(BookStoreTestConsts.CollectionDefinitionName)]
public class MongoDBAuthorAppService_Tests : AuthorAppService_Tests<BookStoreMongoDbTestModule>
{
}
````
{{end}}
Created some tests for the application service methods, which should be clear to understand.
## The Next Part

8
docs/en/Tutorials/Part-9.md

@ -331,14 +331,14 @@ public class CreateModalModel : BookStorePageModel
{
[Required]
[StringLength(AuthorConsts.MaxNameLength)]
public string Name { get; set; }
public string Name { get; set; } = string.Empty;
[Required]
[DataType(DataType.Date)]
public DateTime BirthDate { get; set; }
[TextArea]
public string ShortBio { get; set; }
public string? ShortBio { get; set; }
}
}
```
@ -454,14 +454,14 @@ public class EditModalModel : BookStorePageModel
[Required]
[StringLength(AuthorConsts.MaxNameLength)]
public string Name { get; set; }
public string Name { get; set; } = string.Empty;
[Required]
[DataType(DataType.Date)]
public DateTime BirthDate { get; set; }
[TextArea]
public string ShortBio { get; set; }
public string? ShortBio { get; set; }
}
}
```

2
docs/en/UI/Common/Utils/Linked-List.md

@ -958,7 +958,7 @@ list.addMany([{ x: 1 }, { x: 0 }, { x: 2 }, { x: 0 }, { x: 3 }]).tail();
// {"x":1} <-> {"x":0} <-> {"x":2} <-> {"x":0} <-> {"x":3}
list.dropByValue(0, (value, searchedValue) => value.x === searchedValue);
list.dropByValueAll(0, (value, searchedValue) => value.x === searchedValue);
// {"x":1} <-> {"x":2} <-> {"x":3}
```

2
docs/zh-Hans/UI/Common/Utils/Linked-List.md

@ -925,7 +925,7 @@ list.addMany([{ x: 1 }, { x: 0 }, { x: 2 }, { x: 0 }, { x: 3 }]).tail();
// {"x":1} <-> {"x":0} <-> {"x":2} <-> {"x":0} <-> {"x":3}
list.dropByValue(0, (value, searchedValue) => value.x === searchedValue);
list.dropByValueAll(0, (value, searchedValue) => value.x === searchedValue);
// {"x":1} <-> {"x":2} <-> {"x":3}
```

4
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectReferenceReplaceStep.cs

@ -73,6 +73,7 @@ public class ProjectReferenceReplaceStep : ProjectBuildPipelineStep
private readonly List<FileEntry> _entries;
private readonly bool _isMicroserviceServiceTemplate;
private readonly string _projectName;
protected bool CentralPackageManagement { get; }
protected ProjectReferenceReplacer(
ProjectBuildContext context,
@ -81,6 +82,7 @@ public class ProjectReferenceReplaceStep : ProjectBuildPipelineStep
_entries = context.Files;
_isMicroserviceServiceTemplate = MicroserviceServiceTemplateBase.IsMicroserviceServiceTemplate(context.Template?.Name);
_projectName = projectName;
CentralPackageManagement = context.Files.Any(x => x.Name.EndsWith("Directory.Packages.props"));
}
public void Run()
@ -165,7 +167,7 @@ public class ProjectReferenceReplaceStep : ProjectBuildPipelineStep
includeAttr.Value = ConvertToNugetReference(oldNodeIncludeValue);
newNode.Attributes.Append(includeAttr);
var versionAttr = doc.CreateAttribute("Version");
var versionAttr = doc.CreateAttribute(CentralPackageManagement ? "VersionOverride" : "Version");
versionAttr.Value = _nugetPackageVersion;
newNode.Attributes.Append(versionAttr);
return newNode;

4
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs

@ -431,7 +431,6 @@ public abstract class AppTemplateBase : TemplateInfo
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer"));
steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host"));
context.Symbols.Add("HostWithIds");
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305"));
}
}
@ -457,7 +456,6 @@ public abstract class AppTemplateBase : TemplateInfo
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer"));
steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host"));
context.Symbols.Add("HostWithIds");
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305"));
}
@ -551,7 +549,6 @@ public abstract class AppTemplateBase : TemplateInfo
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer"));
steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host"));
context.Symbols.Add("HostWithIds");
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305"));
}
@ -589,7 +586,6 @@ public abstract class AppTemplateBase : TemplateInfo
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer"));
steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host"));
context.Symbols.Add("HostWithIds");
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305"));
}
}

9
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RandomizeAuthServerPassPhraseStep.cs

@ -12,6 +12,8 @@ public class RandomizeAuthServerPassPhraseStep : ProjectBuildPipelineStep
private const string LocalhostPfx = "localhost.pfx -p 00000000-0000-0000-0000-000000000000";
private const string DotnetDevCerts = "openiddict.pfx -p 00000000-0000-0000-0000-000000000000";
private const string ProductionEncryptionAndSigningCertificate = "AddProductionEncryptionAndSigningCertificate(\"openiddict.pfx\", \"00000000-0000-0000-0000-000000000000\");";
private const string ReadmeCallout = "`00000000-0000-0000-0000-000000000000`";
private readonly static string RandomPassword = Guid.NewGuid().ToString("D");
public readonly static string RandomOpenIddictPassword = Guid.NewGuid().ToString("D");
@ -59,6 +61,13 @@ public class RandomizeAuthServerPassPhraseStep : ProjectBuildPipelineStep
RandomOpenIddictPassword));
}
if (lines[i].Contains(ReadmeCallout))
{
lines[i] = lines[i].Replace(ReadmeCallout,
ReadmeCallout.Replace(DefaultPassword,
RandomOpenIddictPassword));
}
if (lines[i].Contains(ProductionEncryptionAndSigningCertificate))
{
lines[i] = lines[i].Replace(ProductionEncryptionAndSigningCertificate,

33
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs

@ -12,7 +12,6 @@ public class RemoveUnnecessaryPortsStep : ProjectBuildPipelineStep
{
public override void Execute(ProjectBuildContext context)
{
RemoveUnnecessaryDbMigratorClients(context);
RemoveUnnecessaryHttpApiHostPorts(context);
}
@ -66,36 +65,4 @@ public class RemoveUnnecessaryPortsStep : ProjectBuildPipelineStep
httpApiHostAppSettings.SetLines(newlines);
}
private static void RemoveUnnecessaryDbMigratorClients(ProjectBuildContext context)
{
var dbMigratorAppSettings = context.Files
.FirstOrDefault(f =>
f.Name.Contains("MyCompanyName.MyProjectName.DbMigrator") && f.Name.EndsWith("appsettings.json"));
if (dbMigratorAppSettings == null)
{
return;
}
var appSettingsJsonObject = JObject.Parse(dbMigratorAppSettings.Content);
var authServerJsonObject = (JObject)appSettingsJsonObject?["IdentityServer"] ?? (JObject)appSettingsJsonObject["OpenIddict"];
var clientsJsonObject = (JObject)authServerJsonObject?["Clients"] ?? (JObject)authServerJsonObject?["Applications"];
if (clientsJsonObject == null)
{
return;
}
if (context.BuildArgs.UiFramework != UiFramework.Blazor)
{
clientsJsonObject.Remove("MyProjectName_Blazor");
}
if (!context.BuildArgs.PublicWebSite)
{
clientsJsonObject.Remove("MyProjectName_Web_Public");
}
dbMigratorAppSettings.SetContent(appSettingsJsonObject.ToString(Formatting.Indented));
}
}

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs

@ -220,7 +220,7 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase<CSharpServi
}
classTemplate.Replace($"{UsingPlaceholder}", string.Join(Environment.NewLine, classUsingNamespaceList.Distinct().OrderBy(x => x).Select(x => x)));
classTemplate.Replace($"{Environment.NewLine}{Environment.NewLine} {MethodPlaceholder}", string.Empty);
classTemplate.Replace($"{Environment.NewLine}{Environment.NewLine} {MethodPlaceholder}", string.Empty).Replace(MethodPlaceholder, string.Empty);
filePath = Path.Combine(args.WorkDirectory, folder, $"{clientProxyName}.Generated.cs");
Directory.CreateDirectory(Path.GetDirectoryName(filePath));

2
latest-versions.json

@ -1,6 +1,6 @@
[
{
"version": "7.4.4",
"version": "8.0.0",
"releaseDate": "",
"type": "stable",
"message": ""

145
modules/blogging/src/Volo.Blogging.Web/Pages/Members/Index.cshtml

@ -26,73 +26,81 @@
<div class="col-md-4 mb-5 mb-md-0">
<div class="card h-auto member-profile-info">
<div class="card-body">
<div class="d-inline-block position-relative">
<img gravatar-email="@Model.User.Email" default-image="Identicon" class="post-member-img rounded-circle d-block"/>
</div>
@if (Model.User.Name != null && Model.User.Surname != null)
{
<h2 class="m-1">@Model.User.Name @Model.User.Surname</h2>
}
@if (Model.User.Company != null)
{
<h4 class="m-2">@Model.User.Company</h4>
}
@if (Model.User.JobTitle != null)
{
<h4>@Model.User.JobTitle</h4>
}
<small class="d-block">@L["UserName"].Value.ToUpper()</small>
<h5>@Model.User.UserName</h5>
@if (Model.User.WebSite != null)
{
<small>@L["PersonalWebsite"].Value.ToUpper()</small>
<h5>
<a href="@Model.User.WebSite">@Model.User.WebSite</a>
</h5>
}
@if (Model.User.Twitter != null || Model.User.Github != null || Model.User.Linkedin != null)
{
<small>@L["Social"].Value.ToUpper()</small>
<ul class="d-flex justify-content-center">
@if (Model.User.Twitter != null)
{
<li class="mx-3">
<a href="https://twitter.com/@Model.User.Twitter">
<div class="icon-twitter-v1"></div>
</a>
</li>
}
@if (Model.User.Github != null)
{
<li class="mx-3">
<a href="https://github.com/@Model.User.Github">
<div class="icon-github large bg-dark"></div>
</a>
</li>
}
@if (Model.User.Linkedin != null)
{
<li class="mx-3">
<a href="@Model.User.Linkedin">
<div class="icon-linkedin-v1"></div>
</a>
</li>
}
</ul>
}
@if (Model.User.Biography != null)
{
<div class="m-2 mt-4">
<small>@L["Biography"].Value.ToUpper()</small>
<p>@Model.User.Biography</p>
<div class="text-center">
<div class="position-relative d-inline-block">
<img gravatar-email="@Model.User.Email" default-image="Identicon" id="profile-photo" class="post-member-img rounded-circle d-block mx-auto" />
</div>
}
</div>
<div class="d-inline-block align-top text-left ml-3">
@if (Model.User.Name != null && Model.User.Surname != null)
{
<h2 class="m-0 custom-heading">
@Model.User.Name @Model.User.Surname
</h2>}
@if (Model.User.Company != null)
{
<h4 class="m-0 company-jobtitle">@Model.User.Company</h4>
}
@if (Model.User.JobTitle != null)
{
<h4 class="company-jobtitle">@Model.User.JobTitle</h4>
}
<small class="d-block custom-small">@L["UserName"].Value.ToUpper()</small>
<h5 class="username-website">@Model.User.UserName</h5>
@if (Model.User.WebSite != null)
{
<small class="custom-small">@L["PersonalWebsite"].Value.ToUpper()</small>
<h5 class="username-website">
<a href="@Model.User.WebSite">@Model.User.WebSite</a>
</h5>
}
@if (Model.User.Twitter != null || Model.User.Github != null || Model.User.Linkedin != null)
{
<small>@L["Social"].Value.ToUpper()</small>
<ul class="d-flex list-unstyled mb-0">
@if (Model.User.Twitter != null)
{
<li class="mx-3">
<a href="https://twitter.com/@Model.User.Twitter">
<div class="icon-twitter-v1"></div>
</a>
</li>
}
@if (Model.User.Github != null)
{
<li class="mx-3">
<a href="https://github.com/@Model.User.Github">
<div class="icon-github large bg-dark"></div>
</a>
</li>
}
@if (Model.User.Linkedin != null)
{
<li class="mx-3">
<a href="@Model.User.Linkedin">
<div class="icon-linkedin-v1"></div>
</a>
</li>
}
</ul>
}
@if (Model.User.Biography != null)
{
<div class="m-0 mt-4">
<small>@L["Biography"].Value.ToUpper()</small>
<p>@Model.User.Biography</p>
</div>
}
</div>
</div>
</div>
</div>
<div class="col-md-8">
@ -106,16 +114,17 @@
@foreach (var post in Model.Posts)
{
<div class="post-item">
<div class="post-type-cont">
<div class="post-type-cont" style="text-align: center;">
<a href="@Model.GetMemberProfileUrl(Model.User)" class="text-decoration-none">
<img gravatar-email="@Model.User.Email" default-image="Identicon" class="post-member-img rounded-circle d-block"/>
<img gravatar-email="@Model.User.Email" default-image="Identicon" id="gravatar" class="post-member-img rounded-circle d-block" />
</a>
<span class="post-type">
<span class="post-type">
<i class="fas fa-pen-nib"></i>
@L["Blog"].Value.ToUpper()
</span>
</div>
<div class="post-detail-cont">
<div class="post-info fs-12 mb-2">
<a href="@Model.GetMemberProfileUrl(Model.User)" class="text-decoration-none">

31
modules/blogging/src/Volo.Blogging.Web/Pages/Members/Index.css

@ -1,3 +1,32 @@
.post-desc {
.post-desc {
overflow-wrap: break-word;
}
#gravatar {
margin: 10px;
}
#profile-photo {
margin-bottom: 10px;
}
.custom-heading {
margin-bottom: 20px !important;
font-size: 28px !important;
}
.company-jobtitle {
font-size: 16px !important;
font-weight: 300 !important;
margin-bottom: 20px;
}
.username-website {
font-size: 16px !important;
font-weight: 400 !important;
margin-bottom: 20px;
}
.custom-small {
display: block;
}

4
modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/uppy/uppy.js

@ -25442,7 +25442,7 @@ module.exports = (_temp = _class = /*#__PURE__*/function (_Plugin) {
_this.uppy.log(err);
});
_this.uppy.cancelAll();
_this.uppy.reset();
_this.uppy.setState({
recoveredState: null
@ -28560,7 +28560,7 @@ module.exports = (_temp = _class = /*#__PURE__*/function (_Plugin) {
// Implement monitors actions
switch (message.payload.type) {
case 'RESET':
_this2.uppy.reset();
_this2.UPPY.cancelAll();
return;

8
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js

@ -140,9 +140,9 @@ $(function () {
headers: getUppyHeaders()
};
var UPPY = Uppy.Core().use(Uppy.XHRUpload, UPPY_OPTIONS);
var UPPY = new Uppy.Uppy().use(Uppy.XHRUpload, UPPY_OPTIONS);
UPPY.reset();
UPPY.cancelAll();
var file = $fileInput[0].files[0];
@ -307,9 +307,9 @@ $(function () {
headers: getUppyHeaders()
};
var UPPY = Uppy.Core().use(Uppy.XHRUpload, UPPY_OPTIONS);
var UPPY = new Uppy.Uppy().use(Uppy.XHRUpload, UPPY_OPTIONS);
UPPY.reset();
UPPY.cancelAll();
UPPY.addFile({
id: "content-file",

8
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js

@ -104,9 +104,9 @@ $(function () {
headers: getUppyHeaders()
};
var UPPY = Uppy.Core().use(Uppy.XHRUpload, UPPY_OPTIONS);
var UPPY = new Uppy.Uppy().use(Uppy.XHRUpload, UPPY_OPTIONS);
UPPY.reset();
UPPY.cancelAll();
var file = $fileInput[0].files[0];
@ -218,9 +218,9 @@ $(function () {
headers: getUppyHeaders()
};
var UPPY = Uppy.Core().use(Uppy.XHRUpload, UPPY_OPTIONS);
var UPPY = new Uppy.Uppy().use(Uppy.XHRUpload, UPPY_OPTIONS);
UPPY.reset();
UPPY.cancelAll();
UPPY.addFile({
id: "content-file",

4
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js

@ -146,9 +146,9 @@ $(function () {
headers: getUppyHeaders()
};
var UPPY = Uppy.Core().use(Uppy.XHRUpload, UPPY_OPTIONS);
var UPPY = new Uppy.Uppy().use(Uppy.XHRUpload, UPPY_OPTIONS);
UPPY.reset();
UPPY.cancelAll();
UPPY.addFile({
id: "content-file",

4
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js

@ -116,9 +116,9 @@ $(function () {
headers: getUppyHeaders()
};
var UPPY = Uppy.Core().use(Uppy.XHRUpload, UPPY_OPTIONS);
var UPPY = new Uppy.Uppy().use(Uppy.XHRUpload, UPPY_OPTIONS);
UPPY.reset();
UPPY.cancelAll();
UPPY.addFile({
id: "content-file",

5
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIDentityClaimTypeRepository.cs

@ -35,4 +35,9 @@ public interface IIdentityClaimTypeRepository : IBasicRepository<IdentityClaimTy
string filter = null,
CancellationToken cancellationToken = default
);
Task<List<IdentityClaimType>> GetListByNamesAsync(
IEnumerable<string> names,
CancellationToken cancellationToken = default
);
}

7
modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityClaimTypeRepository.cs

@ -58,4 +58,11 @@ public class EfCoreIdentityClaimTypeRepository : EfCoreRepository<IIdentityDbCon
u.Name.Contains(filter)
).LongCountAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<IdentityClaimType>> GetListByNamesAsync(IEnumerable<string> names, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.Where(x => names.Contains(x.Name))
.ToListAsync(GetCancellationToken(cancellationToken));
}
}

7
modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityClaimTypeRepository.cs

@ -68,4 +68,11 @@ public class MongoIdentityClaimTypeRepository : MongoDbRepository<IAbpIdentityMo
.As<IMongoQueryable<IdentityClaimType>>()
.LongCountAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<IdentityClaimType>> GetListByNamesAsync(IEnumerable<string> names, CancellationToken cancellationToken = default)
{
return await (await GetMongoQueryableAsync(cancellationToken))
.Where(x => names.Contains(x.Name))
.ToListAsync(GetCancellationToken(cancellationToken));
}
}

8
modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityClaimTypeRepository_Tests.cs

@ -42,4 +42,12 @@ public abstract class IdentityClaimTypeRepository_Tests<TStartupModule> : AbpIde
{
(await ClaimTypeRepository.GetCountAsync("Age")).ShouldBe(1);
}
[Fact]
public async Task GetListAsyncByNames()
{
var result = await ClaimTypeRepository.GetListByNamesAsync(new List<string> { "Age", "Education" });
result.Count.ShouldBe(2);
}
}

4
npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts

@ -287,8 +287,4 @@ importMap.set(ThemeOptionsEnum.LeptonX, [
path: '@volosoft/abp.ng.theme.lepton-x/layouts',
importName: 'SideMenuLayoutModule.forRoot()',
},
{
path: '@volosoft/abp.ng.theme.lepton-x/account',
importName: 'AccountLayoutModule.forRoot()',
},
]);

3
npm/ng-packs/packages/theme-shared/src/lib/constants/validation.ts

@ -18,4 +18,5 @@ export const DEFAULT_VALIDATION_BLUEPRINTS = {
passwordRequiresDigit: 'AbpIdentity::Volo.Abp.Identity:PasswordRequiresDigit',
passwordRequiresNonAlphanumeric: 'AbpIdentity::Volo.Abp.Identity:PasswordRequiresNonAlphanumeric',
usernamePattern: 'AbpIdentity::Volo.Abp.Identity:InvalidUserName[{{ actualValue }}]',
};
customMessage: '{{ customMessage }}'
};

2
npm/packs/uppy/package.json

@ -6,7 +6,7 @@
},
"dependencies": {
"@abp/core": "~8.0.0",
"uppy": "^1.16.1"
"uppy": "^3.21.0"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

100
npm/scripts/change-package-version.ts

@ -0,0 +1,100 @@
import glob from "glob";
import fse from "fs-extra";
import {program} from "commander";
(function findPackageJsonFiles() {
setupCommander();
const options = {
ignore: [
"../../**/node_modules/**",
"../../**/dist/**",
"../../**/build/**",
"../../**/scripts/**",
"../../**/wwwroot/**"
]
};
const workingDir = "../../";
glob(`${workingDir}**/package.json`, options, (err, files) => {
if (err) throw err;
const {packageName,targetVersion}= program.opts();
for (const file of files) {
readPackageJsonFile(file, packageName, targetVersion);
}
});
})();
function readPackageJsonFile(path, key, newVersion) {
const replace = (block, key, newVersion) => {
const founded = Object.keys(block).filter(x => x === key);
if (founded.length > 0) {
let value = block[key];
value = value.replace(semverRegex, newVersion);
return [true, {
...block,
[key]:value
}];
}
return [false, block];
};
fse.readJson(path, (err, packageObj) => {
if (err) throw err;
const { dependencies, peerDependencies, devDependencies } = packageObj;
const results = [];
let result = { ...packageObj };
if (dependencies) {
const [founded, d] = replace(dependencies, key, newVersion);
results.push(founded);
result = {
...result, dependencies: d
};
}
if (peerDependencies) {
const [founded, p] = replace(peerDependencies, key, newVersion);
results.push(founded);
result = {
...result, peerDependencies: p
};
}
if (devDependencies) {
const [founded, d] = replace(devDependencies, key, newVersion);
results.push(founded);
result = {
...result, devDependencies: d
};
}
const anyChanges = !results.some(x => x);
if (anyChanges) {
return;
}
console.log("changed", path);
writeFile(path, result);
}
)
;
}
export const semverRegex =
/\d+\.\d+\.\d+(?:-[a-zA-Z0-9]+(?:\.[a-zA-Z0-9-]+)*)?(?:\+[a-zA-Z0-9]+(?:\.[a-zA-Z0-9-]+)*)?$/;
function writeFile(path, result) {
return fse.writeJson(path, result, { spaces: 2 });
}
function setupCommander() {
program
.option(
"-n, --packageName <packageName>",
"Package name"
)
.option(
"-v, --targetVersion <targetVersion>",
"Version number of the package"
);
program.parse(process.argv);
}

5
npm/scripts/package.json

@ -4,12 +4,13 @@
"description": "",
"scripts": {
"remove-lock-files": "yarn && ts-node -r tsconfig-paths/register remove-lock-files.ts",
"validate-versions": "yarn && ts-node -r tsconfig-paths/register validate-versions.ts"
"validate-versions": "yarn && ts-node -r tsconfig-paths/register validate-versions.ts",
"change-package-version": "ts-node -r tsconfig-paths/register change-package-version.ts -n @abp/ng.theme.lepton-x -v 3.0.0"
},
"dependencies": {
"axios": "^0.24.0",
"chalk": "^4.1.0",
"commander": "^8.3.0",
"commander": "^11.0.0",
"execa": "^5.1.1",
"fs-extra": "^9.0.1",
"glob": "^7.1.6",

10
npm/scripts/yarn.lock

@ -417,16 +417,16 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
dependencies:
delayed-stream "~1.0.0"
commander@^11.0.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906"
integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==
commander@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc"
integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==
commander@^8.3.0:
version "8.3.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"

2
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/Program.cs

@ -40,11 +40,11 @@ public class Program
builder.Host.AddAppSettingsSecretsJson()
.UseAutofac()
.UseSerilog();
await builder.AddApplicationAsync<MyProjectNameHostModule>();
if (IsMigrateDatabase(args))
{
builder.Services.AddDataMigrationEnvironment();
}
await builder.AddApplicationAsync<MyProjectNameHostModule>();
var app = builder.Build();
await app.InitializeApplicationAsync();

2
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Program.cs

@ -40,11 +40,11 @@ public class Program
builder.Host.AddAppSettingsSecretsJson()
.UseAutofac()
.UseSerilog();
await builder.AddApplicationAsync<MyProjectNameHostModule>();
if (IsMigrateDatabase(args))
{
builder.Services.AddDataMigrationEnvironment();
}
await builder.AddApplicationAsync<MyProjectNameHostModule>();
var app = builder.Build();
await app.InitializeApplicationAsync();

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/OpenIddict/OpenIddictDataSeedContributor.cs

@ -179,7 +179,6 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
}
//</TEMPLATE-REMOVE>
//<TEMPLATE-REMOVE IF-NOT='HostWithIds'>
// Swagger Client
var swaggerClientId = configurationSection["MyProjectName_Swagger:ClientId"];
if (!swaggerClientId.IsNullOrWhiteSpace())
@ -198,7 +197,6 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
clientUri: swaggerRootUrl
);
}
//</TEMPLATE-REMOVE>
}
private async Task CreateApplicationAsync(

Loading…
Cancel
Save