diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml
index 062bf71d89..6ba3ad7a6d 100644
--- a/.github/workflows/build-and-test.yml
+++ b/.github/workflows/build-and-test.yml
@@ -17,7 +17,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-dotnet@master
with:
- dotnet-version: 5.0.100-rc.2.20479.15
+ dotnet-version: 5.0.100
- name: Build All
run: .\build-all.ps1
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
index 2a57c6b25d..e029499b06 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
@@ -30,6 +30,8 @@
"UserNameNotFound": "There is no user with username {0}",
"SuccessfullyAddedToNewsletter": "Thanks you for subscribing to our newsletter!",
"MyProfile": "My profile",
- "EmailNotValid": "Please enter a valid email address."
+ "EmailNotValid": "Please enter a valid email address.",
+ "JoinOurMarketingNewsletter": "Join our marketing newsletter",
+ "WouldLikeToReceiveMarketingMaterials": "I would like to receive marketing materials like product deals & special offers."
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
index 2d146db401..0c7a94424f 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
@@ -90,6 +90,15 @@
"LatestArticles": "Latest Articles",
"ArticleRequests": "Article Requests",
"AllArticleRequests": "See All Article Requests",
- "ArticleAssignRequest": "Want to write this article? Click here to assign yourself."
+ "ArticleAssignRequest": "assign yourself.",
+ "SubscribeToTheNewsletter": "Subscribe to the Newsletter",
+ "NewsletterEmailDefinition": "Get information about happenings in ABP like new releases, free sources, articles, and more.",
+ "NoThanks": "No, thanks",
+ "MaybeLater": "Maybe later",
+ "JoinOurArticleNewsletter": "Join our article newsletter",
+ "Community": "Community",
+ "Marketing": "Marketing",
+ "ArticleAssignMessage": "Want to write this article? Click here to",
+ "CommunityPrivacyPolicyConfirmation": "I agree to the Terms & Conditions and Privacy Policy."
}
}
diff --git a/common.DotSettings b/common.DotSettings
index 6f40d029a7..7edbd05e75 100644
--- a/common.DotSettings
+++ b/common.DotSettings
@@ -20,6 +20,17 @@
FalseFalseSQL
+ False
+ Never
+ Never
+ False
+ Never
+ Never
+ Never
+ Never
+ Never
+ True
+ TrueFalseFalseFalse
diff --git a/docs/en/Blog-Posts/2020-11-12 v4_0_Preview/POST.md b/docs/en/Blog-Posts/2020-11-12 v4_0_Preview/POST.md
new file mode 100644
index 0000000000..d8e7c0389f
--- /dev/null
+++ b/docs/en/Blog-Posts/2020-11-12 v4_0_Preview/POST.md
@@ -0,0 +1,142 @@
+# ABP Framework 4.0 RC Has Been Published based on .NET 5.0!
+
+Today, we have released the [ABP Framework](https://abp.io/) (and the [ABP Commercial](https://commercial.abp.io/)) `4.0.0-rc.1` that is based on the **.NET 5.0**. This blog post introduces the new features and important changes in the new version.
+
+> **The planned release date for the [4.0.0 final](https://github.com/abpframework/abp/milestone/45) version is November 26, 2020**.
+
+## Get Started with the 4.0 RC.1
+
+If you want to try the version `4.0.0-rc.1` today, follow the steps below;
+
+1) **Upgrade** the ABP CLI to the version `4.0.0-rc.1` using a command line terminal:
+
+````bash
+dotnet tool update Volo.Abp.Cli -g --version 4.0.0-rc.1
+````
+
+**or install** if you haven't installed before:
+
+````bash
+dotnet tool install Volo.Abp.Cli -g --version 4.0.0-rc.1
+````
+
+2) Create a **new application** with the `--preview` option:
+
+````bash
+abp new BookStore --preview
+````
+
+See the [ABP CLI documentation](https://docs.abp.io/en/abp/3.3/CLI) for all the available options.
+
+> You can also use the *Direct Download* tab on the [Get Started](https://abp.io/get-started) page by selecting the **Preview checkbox**.
+
+## Migrating From 3.x to 4.0
+
+The version 4.0 comes with some major changes including the **migration from .NET Core 3.1 to .NET 5.0**.
+
+We've prepared a **detailed [migration document](https://docs.abp.io/en/abp/4.0/Migration-Guides/Abp-4_0)** to explain all the changes and the actions you need to take while upgrading your existing solutions.
+
+## What's new with the ABP Framework 4.0
+
+### The Blazor UI
+
+The Blazor UI is now stable and officially supported. The [web application development tutorial](https://docs.abp.io/en/abp/4.0/Tutorials/Part-1?UI=Blazor) has been updated based on the version 4.0.
+
+#### abp bundle command
+
+Introducing the `abp bundle` CLI command to manage static JavaScript & CSS file dependencies of a Blazor application. This command is currently used to add the dependencies to the `index.html` file in the dependency order by respecting to modularity. In the next version it will automatically unify & minify the files. The documentation is being prepared.
+
+#### Removed the JQuery & Bootstrap JavaScript
+
+Removed JQuery & Bootstrap JavaScript dependencies for the Blazor UI.
+
+>There are some other changes in the startup template and some public APIs. Follow the [Migration Guide](https://docs.abp.io/en/abp/4.0/Migration-Guides/Abp-4_0) to apply changes for existing solutions that you're upgrading from the version 3.3. While we will continue to make improvements add new features, we no longer make breaking changes on the existing APIs until the version 5.0.
+
+#### Others
+
+A lot of minor and major improvements have been done for the Blazor UI. Some of them are listed below:
+
+* Implemented `IComponentActivator` to resolve the component from the `IServiceProvider`. So, you can now inject dependencies into the constructor of your razor component.
+* Introduced the `AbpComponentBase` base class that you derive your components from. It has useful base properties that you can use in your pages/components.
+* Introduced `IUiNotificationService` service to show toast notifications on the UI.
+* Improved the `IUiMessageService` to show message & confirmation dialogs.
+
+### System.Text.Json
+
+ABP Framework 4.0 uses the System.Text.Json by default as the JSON serialization library. It, actually, using a hybrid approach: Continues to use the Newtonsoft.Json when it needs to use the features not supported by the System.Text.Json.
+
+Follow the [Migration Guide](https://docs.abp.io/en/abp/4.0/Migration-Guides/Abp-4_0) to learn how to configure to use the Newtonsoft.Json for some specific types or switch back to the Newtonsoft.Json as the default JSON serializer.
+
+### Identity Server 4 Upgrade
+
+ABP Framework upgrades the [IdentityServer4](https://www.nuget.org/packages/IdentityServer4) library from 3.x to 4.1.1 with the ABP Framework version 4.0. IdentityServer 4.x has a lot of changes. Some of them are **breaking changes in the data structure**.
+
+Follow the [Migration Guide](https://docs.abp.io/en/abp/4.0/Migration-Guides/Abp-4_0) to upgrade existing solutions.
+
+### Creating a New Module Inside the Application
+
+ABP CLI has now a command to create a new module and add it to an existing solution. In this way, you can create modular applications easier than before.
+
+Example: Create a *ProductManagement* module into your solution.
+
+````bash
+abp add-module ProductManagement --new --add-to-solution-file
+````
+
+Execute this command in a terminal in the root folder of your solution. If you don't specify the `--add-to-solution-file` option, then the module projects will not be added to the main solution, but the project references still be added. In this case, you need to open the module's solution to develop the module.
+
+See the [CLI document](https://docs.abp.io/en/abp/4.0/CLI) for other options.
+
+### WPF Startup Template
+
+Introducing the WPF startup template for the ABP Framework. Use the ABP CLI new command to create a new WPF application:
+
+````bash
+abp new MyWpfApp -t wpf
+````
+
+This is a minimalist, empty project template that is integrated to the ABP Framework.
+
+### New Languages
+
+**Thanks to the contributors** from the ABP Community, the framework modules and the startup template have been localized to **German** (by [Alexander Pilhar](https://github.com/alexanderpilhar) & [Nico Lachmuth](https://github.com/tntwist)) and **Spanish** (by [Jose Manuel Gonzalez](https://github.com/jmglezgz)) languages.
+
+### Other Notes
+
+* Since [Mongo2Go](https://github.com/Mongo2Go/Mongo2Go) library not supports transactions, you can use transactions in unit tests for MongoDB.
+
+## What's new with the ABP Commercial 4.0
+
+### The Blazor UI
+
+The Blazor UI for the ABP Commercial is also becomes stable and feature rich with the version 4.0;
+
+* [ABP Suite](https://commercial.abp.io/tools/suite) now supports to generate CRUD pages for the Blazor UI.
+* Completed the [Lepton Theme](https://commercial.abp.io/themes) for the Blazor UI.
+* Implemented the [File Management](https://commercial.abp.io/modules/Volo.FileManagement) module for the Blazor UI.
+
+### The ABP Suite
+
+While creating create/edit modals with a navigation property, we had two options: A dropdown to select the target entity and a modal to select the entity by searching with a data table.
+
+Dropdown option now supports **lazy load, search and auto-complete**. In this way, selecting a navigation property becomes much easier and supports large data sets on the dropdown.
+
+**Example: Select an author while creating a new book**
+
+
+
+With the new version, you can **disable backend code generation** on CRUD page generation. This is especially useful if you want to regenerate the page with a different UI framework, but don't want to regenerate the server side code.
+
+### Identity Server Management UI Revised
+
+Completely revised the Identity Server Management UI based on the IDS 4.x changes.
+
+## About the Next Release
+
+The next feature version, `4.1.0`, will mostly focus on completing the missing documents, fixing bugs, performance optimizations and improving the Blazor UI features. The planned preview release date for the version `4.1.0` is December 10 and the final (stable) version release date is December 24.
+
+Follow the [GitHub milestones](https://github.com/abpframework/abp/milestones) for all the planned ABP Framework version release dates.
+
+## Feedback
+
+Please check out the ABP Framework 4.0.0 RC and [provide feedback](https://github.com/abpframework/abp/issues/new) to help us to release a more stable version. **The planned release date for the [4.0.0 final](https://github.com/abpframework/abp/milestone/45) version is November 26**.
diff --git a/docs/en/Blog-Posts/2020-11-12 v4_0_Preview/abp-suite-auto-complete-dropdown.png b/docs/en/Blog-Posts/2020-11-12 v4_0_Preview/abp-suite-auto-complete-dropdown.png
new file mode 100644
index 0000000000..2021ef42bd
Binary files /dev/null and b/docs/en/Blog-Posts/2020-11-12 v4_0_Preview/abp-suite-auto-complete-dropdown.png differ
diff --git a/docs/en/CLI.md b/docs/en/CLI.md
index df20031d71..48ec779c1e 100644
--- a/docs/en/CLI.md
+++ b/docs/en/CLI.md
@@ -178,7 +178,7 @@ abp add-module Volo.Blogging
* This example adds the `Volo.Blogging` module to the solution.
```bash
-abp add-module ProductManagement --new-template --add-to-solution-file
+abp add-module ProductManagement --new --add-to-solution-file
```
* This command creates a fresh new module customized for your solution (named `ProductManagement`) and adds it to your solution.
@@ -189,8 +189,8 @@ abp add-module ProductManagement --new-template --add-to-solution-file
* `--solution` or `-s`: Specifies the solution (.sln) file path. If not specified, CLI tries to find a .sln file in the current directory.
* `--skip-db-migrations`: For EF Core database provider, it automatically adds a new code first migration (`Add-Migration`) and updates the database (`Update-Database`) if necessary. Specify this option to skip this operation.
* `-sp` or `--startup-project`: Relative path to the project folder of the startup project. Default value is the current folder.
-* `--new-template`: Creates a fresh new module (customized for your solution) and adds it to your solution.
-* `--with-source-code`: Downloads the source code of the module to your solution folder and uses local project references instead of NuGet/NPM packages. This options is always `True` if `--new-template` is used.
+* `--new`: Creates a fresh new module (customized for your solution) and adds it to your solution.
+* `--with-source-code`: Downloads the source code of the module to your solution folder and uses local project references instead of NuGet/NPM packages. This options is always `True` if `--new` is used.
* `--add-to-solution-file`: Adds the downloaded/created module to your solution file, so you will also see the projects of the module when you open the solution on a IDE. (only available when `--with-source-code` is `True`.)
### get-source
diff --git a/docs/en/Customizing-Application-Modules-Overriding-Services.md b/docs/en/Customizing-Application-Modules-Overriding-Services.md
index 97df12a3a6..133b2e89eb 100644
--- a/docs/en/Customizing-Application-Modules-Overriding-Services.md
+++ b/docs/en/Customizing-Application-Modules-Overriding-Services.md
@@ -59,7 +59,6 @@ In most cases, you will want to change one or a few methods of the current imple
### Example: Overriding an Application Service
````csharp
-//[RemoteService(IsEnabled = false)] // If you use dynamic controller feature you can disable remote service. Prevent creating duplicate controller for the application service.
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IIdentityUserAppService), typeof(IdentityUserAppService), typeof(MyIdentityUserAppService))]
public class MyIdentityUserAppService : IdentityUserAppService
diff --git a/docs/en/Migration-Guides/Abp-4_0-Angular.md b/docs/en/Migration-Guides/Abp-4_0-Angular.md
new file mode 100644
index 0000000000..60f6e46de5
--- /dev/null
+++ b/docs/en/Migration-Guides/Abp-4_0-Angular.md
@@ -0,0 +1,11 @@
+# Angular UI 3.3 to 4.0 Migration Guide
+
+### Removed the Angular Account Module Public UI
+
+Angular UI is using the Authorization Code Flow to authenticate since the version 3.1.0 by default. Starting from the version 4.0, this is becoming the only option, because it is the recommended way of authenticating SPAs.
+
+If you haven't done it yet, see [this post](https://blog.abp.io/abp/ABP-Framework-v3.1-RC-Has-Been-Released) to change the authentication of your application.
+
+### Removed the SessionState
+
+Use `SessionStateService` instead of the `SessionState`. See [this issue](https://github.com/abpframework/abp/issues/5606) for details.
\ No newline at end of file
diff --git a/docs/en/Migration-Guides/Abp-4_0-Blazor.md b/docs/en/Migration-Guides/Abp-4_0-Blazor.md
new file mode 100644
index 0000000000..0f01899f7c
--- /dev/null
+++ b/docs/en/Migration-Guides/Abp-4_0-Blazor.md
@@ -0,0 +1,88 @@
+# Blazor UI 3.3 to 4.0 Migration Guide
+
+## Startup Template Changes
+
+These changes are required to manually applied in your own solution. It would be easier if you create a new solution based on 4.0 with the same name of your current solution then compare the files.
+
+### Csproj File / Dependencies
+
+* Add `true` to the `PropertyGroup` section of your project (`.csproj`) file.
+* Update the `Blazorise.*` packages to the latest version (to the latest RC for the ABP 4.0 preview).
+
+### wwwroot/index.html
+
+There are some changes made in the index.html file;
+
+* Removed JQuery & Bootstrap JavaScript dependencies
+* Replaced Bootstrap and FontAwesome imports with local files instead of CDN usages.
+* Re-arranged some ABP CSS file locations.
+* Introduced the `abp bundle` CLI command to manage global Style/Script file imports.
+
+Follow the steps below to apply the changes;
+
+1. Add the bundle contributor class into your project (it will be slightly different based on your solution namespaces):
+
+````csharp
+using Volo.Abp.Bundling;
+
+namespace MyCompanyName.MyProjectName.Blazor
+{
+ public class MyProjectNameBundleContributer : IBundleContributer
+ {
+ public void AddScripts(BundleContext context)
+ {
+ }
+
+ public void AddStyles(BundleContext context)
+ {
+ context.Add("main.css");
+ }
+ }
+}
+````
+
+If you are using another global style/script files, add them here.
+
+2. Remove all the `` elements and replace with the following comment tags:
+
+````html
+
+
+````
+
+3. Remove all the `` elements and replace with the following comment tags:
+
+````html
+
+
+````
+
+4. Execute the following command in a terminal in the root folder of the Blazor project (`.csproj`) file (ensure that you're using the ABP CLI version 4.0):
+
+````bash
+abp bundle
+````
+
+This will fill in the `Styles` and `Scripts` tags based on the dependencies.
+
+5. You can clean the `blazor-error-ui` related sections from your `main.css` file since they are not needed anymore.
+
+### The Root Element
+
+This change is optional but recommended.
+
+* Change `...` to `
...
` in the `wwwroot/index.html`.
+* Change `builder.RootComponents.Add("app");` to `builder.RootComponents.Add("#ApplicationContainer");` in the *YourProjectBlazorModule.cs*.
+
+## AbpCrudPageBase Changes
+
+If you've derived your pages from the `AbpCrudPageBase` class, then you may need to apply the following changes;
+
+- `OpenEditModalAsync` method gets `EntityDto` instead of id (`Guid`) parameter. Pass `context` instead of `context.Id`.
+- `DeleteEntityAsync` method doesn't display confirmation dialog anymore. You can use the new `EntityActions` component in Data Grids to show confirmation messages. You can also inject `IUiMessageService` to your page or component and call the `ConfirmAsync` explicitly.
+- Added `GetListInput` as a base property that is used to filter while getting the entities from the server.
+
+## Others
+
+- Refactored namespaces for some Blazor components ([#6015](https://github.com/abpframework/abp/issues/6015)).
+- Removed Async Suffix from IUiMessageService ([#6123](https://github.com/abpframework/abp/pull/6123)).
\ No newline at end of file
diff --git a/docs/en/Migration-Guides/Abp-4_0-MVC-Razor-Pages.md b/docs/en/Migration-Guides/Abp-4_0-MVC-Razor-Pages.md
new file mode 100644
index 0000000000..d2fa97ec5e
--- /dev/null
+++ b/docs/en/Migration-Guides/Abp-4_0-MVC-Razor-Pages.md
@@ -0,0 +1,6 @@
+# MVC / Razor Pages UI 3.3 to 4.0 Migration Guide
+
+## Use IBrandingProvider in the Volo.Abp.UI Package
+
+This will be a breaking change for MVC UI, but very easy to fix. `IBrandingProvider` is being moved from `Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Components` to `Volo.Abp.Ui.Branding` namespace. So, just update the namespace imports.
+
diff --git a/docs/en/Migration-Guides/Abp-4_0.md b/docs/en/Migration-Guides/Abp-4_0.md
index 4696dddeea..50d2d34bf1 100644
--- a/docs/en/Migration-Guides/Abp-4_0.md
+++ b/docs/en/Migration-Guides/Abp-4_0.md
@@ -1,53 +1,70 @@
# ABP Framework 3.3 to 4.0 Migration Guide
-## Auto API Controller Route Changes
+This document introduces the breaking changes done in the ABP Framework 4.0 and explains how to fix your 3.x based solutions while upgrading to the ABP Framework 4.0.
-The route calculation for the [Auto API Controllers](https://docs.abp.io/en/abp/latest/API/Auto-API-Controllers) is changing with the ABP Framework version 4.0 ([#5325](https://github.com/abpframework/abp/issues/5325)). Previously, **camelCase** route paths were being used. Beginning from the version 4.0, it uses **kebab-case** route paths where it is possible.
+> See this blog post (TODO: LINK) to learn what's new with the ABP Framework 4.0. This document only focuses on the breaking changes.
-**A typical auto API before v4.0**
+## Overall
-
+Here, the overall list of the changes;
-**camelCase route parts become kebab-case with 4.0**
+* Upgraded to the .NET 5.0 [(#6118](https://github.com/abpframework/abp/issues/6118)).
+* Moved from Newtonsoft.Json to System.Text.Json [(#1198](https://github.com/abpframework/abp/issues/1198)).
+* Upgraded to the Identity Server 4.1.1 ([#4461](https://github.com/abpframework/abp/issues/4461)).
+* Switched to `kebab-case` for conventional URLs for the auto API controller routes ([#5325](https://github.com/abpframework/abp/issues/5325)).
+* Removed Retry for the Dynamic HTTP Client Proxies ([#6090](https://github.com/abpframework/abp/issues/6090)).
+* Creation audit properties of the entities made read-only ([#6020](https://github.com/abpframework/abp/issues/6020)).
+* Changed type of the IHasExtraProperties.ExtraProperties ([#3751](https://github.com/abpframework/abp/issues/3751)).
+* Use IBrandingProvider in the Volo.Abp.UI package and remove the one in the Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared ([#5375](https://github.com/abpframework/abp/issues/5375)).
+* Removed the Angular Account Module Public UI (login, register... pages) since they are not being used in the default (authorization code) flow ([#5652](https://github.com/abpframework/abp/issues/5652)).
+* Removed the SessionState in the @abp/ng.core package ([#5606](https://github.com/abpframework/abp/issues/5606)).
+* Made some API revisions & startup template changes for the Blazor UI.
-
+## Upgraded to .NET 5.0
-If it is hard to change it for your application, you can continue to use the version 3.x route strategy, by following one of the approaches;
+ABP Framework has been moved to .NET 5.0. So, if you want to upgrade to the ABP Framework 4.0, you also need to upgrade to .NET 5.0.
-- Set `UseV3UrlStyle` to `true` in the options of the `options.ConventionalControllers.Create(...)` method. Example:
+See the [Migrate from ASP.NET Core 3.1 to 5.0](https://docs.microsoft.com/en-us/aspnet/core/migration/31-to-50) document to learn how to upgrade your solution to .NET 5.0.
-```csharp
-options.ConventionalControllers
- .Create(typeof(BookStoreApplicationModule).Assembly, opts =>
- {
- opts.UseV3UrlStyle = true;
- });
-```
+## Moved to System.Text.Json
-This approach effects only the controllers for the `BookStoreApplicationModule`.
+ABP Framework 4.0 uses the System.Text.Json by default as the JSON serialization library. It, actually, using a hybrid approach: Continues to use the Newtonsoft.Json when it needs to use features not supported by the System.Text.Json.
-- Set `UseV3UrlStyle` to `true` for the `AbpConventionalControllerOptions` to set it globally. Example:
+### Unsupported Types
-```csharp
-Configure(options =>
+If you want to use the Newtonsoft.Json to serialize/deserialize for some specific types, you can configure the `AbpSystemTextJsonSerializerOptions` in your module's `ConfigureServices` method.
+
+**Example: Use Newtonsoft.Json for `MySpecialClass`**
+
+````csharp
+Configure(options =>
{
- options.UseV3UrlStyle = true;
+ options.UnsupportedTypes.AddIfNotContains(typeof(MySpecialClass));
});
-```
+````
+
+### Always Use the Newtonsoft.Json
-Setting it globally effects all the modules in a modular application.
+If you want to continue to use the Newtonsoft.Json library for all the types, you can set `UseHybridSerializer` to false in the `PreConfigureServices` method of your module class:
-## Identity Server Changes
+````csharp
+PreConfigure(options =>
+{
+ options.UseHybridSerializer = false;
+});
+````
+
+## Upgraded to Identity Server 4.1.1
-ABP Framework upgrades the [IdentityServer4](https://www.nuget.org/packages/IdentityServer4) library from 3.x to 4.x with the ABP Framework version 4.0. IdentityServer 4.x has a lot of changes, some of them are **breaking changes in the data structure**.
+ABP Framework upgrades the [IdentityServer4](https://www.nuget.org/packages/IdentityServer4) library from 3.x to 4.1.1 with the ABP Framework version 4.0. IdentityServer 4.x has a lot of changes. Some of them are **breaking changes in the data structure**.
### Entity Changes
-Entity changed don't directly affect your application, however it is good to know.
+Entity changes don't directly affect your application; however, it is good to know.
#### ApiScope
-As the **most important breaking change**, Identity Server 4.x places the `ApiScope` as an independent aggregate root. Previously it was a part of the to `ApiResource` aggregate. This requires manual operation. See the _Database Changes_ section.
+As the **most critical breaking change**; Identity Server 4.x defines the `ApiScope` as an independent aggregate root. Previously, it was the child entity of the `ApiResource`. This change requires manual operation. See the _Database Changes_ section.
Also, added `Enabled(string)` and `Description(bool,true)` properties.
@@ -57,40 +74,40 @@ Also, added `Enabled(string)` and `Description(bool,true)` properties.
#### Client
-- Added `RequireRequestObject (bool)` and `AllowedIdentityTokenSigningAlgorithms (string)` properties.
-- Changed default value of `RequireConsent` from `true` to `false`.
-- Changed default value of `RequirePkce` from `false` to `true`.
+- Added `RequireRequestObject ` and `AllowedIdentityTokenSigningAlgorithms ` properties.
+- Changed the default value of `RequireConsent` from `true` to `false`.
+- Changed the default value of `RequirePkce` from `false` to `true`.
#### DeviceFlowCodes
-- Added `SessionId (string)` and `Description (string)` properties.
+- Added `SessionId ` and `Description ` properties.
#### PersistedGrant
-- Added `SessionId (string)` and `Description(string)` and `ConsumedTime (DateTime?)` properties
+- Added `SessionId `, `Description ` and `ConsumedTime ` properties
### Database Changes
> Attention: **Please backup your database** before the migration!
-**If you are upgrading from 3.x, then there are some change should be done in your database.**
+**If you are upgrading from 3.x, then there are some steps should be done in your database.**
#### Database Schema Migration
-If you are using **Entity Framework Core**, you need to add a new database migration, using the `Add-Migration` command, and apply changes to the database. Please **review the migration** script and read the sections below to understand if it affects your existing data. Otherwise, you may **loose some of your configuration**, which may not be easy to remember and re-configure.
+If you are using **Entity Framework Core**, you need to add a new database migration, using the `Add-Migration` command, and apply changes to the database. Please **review the migration** script and read the sections below to understand if it affects your existing data. Otherwise, you may **lose some of your configuration**, which may not be easy to remember and re-configure.
#### Seed Code
-If you haven't customize the `IdentityServerDataSeedContributor` and haven't customized the initial data inside the `IdentityServer*` tables;
+If you haven't customized the `IdentityServerDataSeedContributor` and haven't customized the initial data inside the `IdentityServer*` tables;
1. Update `IdentityServerDataSeedContributor` class by comparing to [the latest code](https://github.com/abpframework/abp/blob/dev/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs). You probably only need to add the `CreateApiScopesAsync` method and the code related to it.
-2. Then you can simply clear all the **table data** in these tables then execute the `DbMigrator` application again to fill it with the new configuration.
+2. Then you can simply clear all the **data** in these tables then execute the `DbMigrator` application to fill it with the new configuration.
#### Migrating the Configuration Data
-If you've customize your IdentityServer configuration in the database or in the seed data, you should understand the changes and upgrade your code/data accordingly. Especially, the following changes will affect your application:
+If you've customized your IdentityServer configuration in the database or in the seed data, you should understand the changes and upgrade your code/data accordingly. Especially, the following changes will affect your application:
-- `IdentityServerApiScopes` table's `Enabled` field is dropped and re-created. So, you need to manually enable the api scopes again.
+- `IdentityServerApiScopes` table's `Enabled` field is dropped and re-created. So, you need to enable the API scopes again manually.
- `IdentityServerApiResourceScopes` table is dropped and recreated. So, you need to backup and move your current data to the new table.
- `IdentityServerIdentityResourceClaims` table is dropped and recreated. So, you need to backup and move your current data to the new table.
@@ -98,9 +115,9 @@ You may need to perform additional steps based on how much you made custom confi
### Other IdentityServer Changes
-IdentityServer has removed the [public origin option](https://github.com/IdentityServer/IdentityServer4/pull/4335). It was resolving http/https conversion problems, but they decided to leave this to the developer. This is especially needed if you use a reverse proxy where your external protocol is HTTPS but internal protocol is HTTP.
+IdentityServer has removed the [public origin option](https://github.com/IdentityServer/IdentityServer4/pull/4335). It was resolving HTTP/HTTPS conversion issues, but they decided to leave this to the developer. This is especially needed if you use a reverse proxy where your external protocol is HTTPS but internal protocol is HTTP.
-One simple solution is to add such a middleware into your ASP.NET Core pipeline, at the beginning.
+One simple solution is to add such a middleware at the begingning of your ASP.NET Core pipeline.
```csharp
app.Use((httpContext, next) =>
@@ -117,9 +134,101 @@ app.Use((httpContext, next) =>
- https://leastprivilege.com/2020/06/19/announcing-identityserver4-v4-0/
- https://github.com/IdentityServer/IdentityServer4/issues/4592
-## Blazor UI
+## Auto API Controller Route Changes
+
+The route calculation for the [Auto API Controllers](https://docs.abp.io/en/abp/latest/API/Auto-API-Controllers) is changing with the ABP Framework version 4.0 ([#5325](https://github.com/abpframework/abp/issues/5325)). Before v4.0 the route paths were **camelCase**. After version 4.0, it's changed to **kebab-case** route paths where it is possible.
-### AbpCrudPageBase Changes
+**A typical auto API before v4.0**
+
+
+
+**camelCase route parts become kebab-case with 4.0**
+
+
+
+### How to Fix?
+
+You may not take any action for the MVC & Blazor UI projects.
+
+For the Angular UI, this change may effect your client UI. If you have used the [ABP CLI Service Proxy Generation](../UI/Angular/Service-Proxies.md), you can run the server side and re-generate the service proxies. If you haven't used this tool, you should manually update the related URLs in your application.
+
+If there are other type of clients (e.g. 3rd-party companies) using your APIs, they also need to update the URLs.
+
+### Use the v3.x style URLs
+
+If it is hard to change it in your application, you can still to use the version 3.x route strategy, by following one of the approaches;
+
+- Set `UseV3UrlStyle` to `true` in the options of the `options.ConventionalControllers.Create(...)` method. Example:
+
+```csharp
+options.ConventionalControllers
+ .Create(typeof(BookStoreApplicationModule).Assembly, opts =>
+ {
+ opts.UseV3UrlStyle = true;
+ });
+```
+
+This approach affects only the controllers for the `BookStoreApplicationModule`.
+
+- Set `UseV3UrlStyle` to `true` for the `AbpConventionalControllerOptions` to set it globally. Example:
+
+```csharp
+Configure(options =>
+{
+ options.UseV3UrlStyle = true;
+});
+```
+
+Setting it globally affects all the modules in a modular application.
+
+## Removed Retry for the Dynamic HTTP Client Proxies
+
+[Dynamic C# HTTP Client Proxies](../API/Dynamic-CSharp-API-Clients.md) were trying up to 3 times if a request fails using the [Polly](https://github.com/App-vNext/Polly) library. Starting from the version 4.0, this logic has been removed. If you need it, you should configure it in your own application, by configuring the `AbpHttpClientBuilderOptions` in the `PreConfigureServices` method of your module.
+
+**Example: Retry 3 times on failure by incremental waiting between tries**
+
+````csharp
+public override void PreConfigureServices(ServiceConfigurationContext context)
+{
+ PreConfigure(options =>
+ {
+ options.ProxyClientBuildActions.Add((remoteServiceName, clientBuilder) =>
+ {
+ clientBuilder.AddTransientHttpErrorPolicy(
+ policyBuilder => policyBuilder
+ .WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(Math.Pow(2, i)))
+ );
+ });
+ });
+}
+````
+
+This example uses the Microsoft.Extensions.Http.Polly NuGet package.
+
+If you create a new solution, you can find the same configuration in the `.HttpApi.Client.ConsoleTestApp` project's module class, as an example.
+
+## Creation Audit Properties Made Read-Only
+
+Removed setters from the `IHasCreationTime.CreationTime`, ` IMustHaveCreator.CreatorId` and `IMayHaveCreator.CreatorId` properties to accidently set the creation properties while updating an existing entity.
+
+Since the ABP Framework automatically sets these properties, you normally don't need to directly set them. If you want to set them, as a best practice, it is suggested to make it in the constructor to not provide a way to change it later.
+
+These properties implemented with `protected set` in the `Entity` and `AggregateRoot` base classes. That means you can still set in a derived class, if you need it. Alternatively, you can use reflection to set them (Or use `ObjectHelper.TrySetProperty` which internally uses reflection) out of the class if you have to do.
+
+## Changed type of the IHasExtraProperties.ExtraProperties
+
+`IHasExtraProperties.ExtraProperties` was a regular `Dictionary`. With the version 4.0, it is replaced with `ExtraPropertyDictionary` class which inherits the `Dictionary`.
+
+Most of the applications don't be affected by this change. If you've directly implemented this interface, replace the standard dictionary the the `ExtraPropertyDictionary`.
+
+## ASP.NET Core MVC / Razor Pages UI
+
+See the [ASP.NET Core MVC / Razor Pages UI Migration Guide](Abp-4_0-MVC-Razor-Pages.md).
+
+## Angular UI
+
+See the [Angular UI Migration Guide](Abp-4_0-Angular.md).
+
+## Blazor UI
-- `OpenEditModalAsync` method is requires `EntityDto` instead of id (`Guid`) parameter.
-- `DeleteEntityAsync` method doesn't display confirmation dialog anymore. You can use the new `EntityActions` component in DataGrids to show confirmation messages. You can also inject `IUiMessageService` to your page or component and call `ConfirmAsync` explicitly.
+See the [Blazor UI Migration Guide](Abp-4_0-Blazor.md).
\ No newline at end of file
diff --git a/docs/en/Road-Map.md b/docs/en/Road-Map.md
index 8670ba080b..3a45ca1767 100644
--- a/docs/en/Road-Map.md
+++ b/docs/en/Road-Map.md
@@ -1,17 +1,12 @@
# ABP Framework Road Map
-You can always check the milestone planning and the prioritized backlog issues on [the GitHub repository](https://github.com/abpframework/abp/milestones) for a detailed road map.
-
-While we will **continue to add other exciting features**, we will work on the following major items in the **middle term**:
-
-* **Blazor UI** for the framework and all the pre-built modules (in progress).
-* **.NET 5.0**! As Microsoft has announced that the .NET 5.0 will be released in November 2020, we will prepare for this change before and move to the .NET 5.0 just after Microsoft releases it. We hope a smooth transition.
-
-Beside this middle term goals, there are many features in the [backlog](https://github.com/abpframework/abp/milestone/2). Here, a list of some major items in the backlog;
+You can always check the milestone planning and the prioritized backlog issues on [the GitHub repository](https://github.com/abpframework/abp/milestones) for a detailed road map. Here, a list of some major items in the backlog;
* [#2882](https://github.com/abpframework/abp/issues/2882) / Providing a gRPC integration infrastructure (while it is [already possible](https://github.com/abpframework/abp-samples/tree/master/GrpcDemo) to create or consume gRPC endpoints for your application, we plan to create endpoints for the [standard application modules](https://docs.abp.io/en/abp/latest/Modules/Index))
* [#236](https://github.com/abpframework/abp/issues/236) Resource based authorization system
+* [#6132](https://github.com/abpframework/abp/issues/6132) A New Theme alternative to the Basic Theme
* [#1754](https://github.com/abpframework/abp/issues/1754) / Multi-lingual entities
+* [#497](https://github.com/abpframework/abp/issues/497) API Versioning system finalize & document
* [#633](https://github.com/abpframework/abp/issues/633) / Realtime notification system
* [#57](https://github.com/abpframework/abp/issues/57) / Built-in CQRS infrastructure
* [#336](https://github.com/abpframework/abp/issues/336) / Health Check abstraction
diff --git a/docs/en/UI/Angular/Component-Replacement.md b/docs/en/UI/Angular/Component-Replacement.md
index cf0041ab72..6df847d6d0 100644
--- a/docs/en/UI/Angular/Component-Replacement.md
+++ b/docs/en/UI/Angular/Component-Replacement.md
@@ -547,7 +547,3 @@ The final UI looks like below:
## See Also
- [How to Replace PermissionManagementComponent](./Permission-Management-Component-Replacement.md)
-
-## What's Next?
-
-- [Custom Setting Page](./Custom-Setting-Page.md)
diff --git a/docs/en/UI/Angular/Config-State.md b/docs/en/UI/Angular/Config-State.md
index b1a882d43a..8014cd9b14 100644
--- a/docs/en/UI/Angular/Config-State.md
+++ b/docs/en/UI/Angular/Config-State.md
@@ -190,7 +190,3 @@ Please refer to `Config.Environment` type for all the properties you can pass to
- [Settings](./Settings.md)
- [Features](./Features.md)
-
-## What's Next?
-
-- [HTTP Requests](./Http-Requests)
diff --git a/docs/en/UI/Angular/Confirmation-Service.md b/docs/en/UI/Angular/Confirmation-Service.md
index 16dfa9fd94..ef48332580 100644
--- a/docs/en/UI/Angular/Confirmation-Service.md
+++ b/docs/en/UI/Angular/Confirmation-Service.md
@@ -180,8 +180,3 @@ clear(
```
- `status` parameter is the value of the confirmation closing event.
-
-
-## What's Next?
-
-- [Toast Overlay](./Toaster-Service.md)
diff --git a/docs/en/UI/Angular/Content-Projection-Service.md b/docs/en/UI/Angular/Content-Projection-Service.md
index 7e03776835..ee64f57e20 100644
--- a/docs/en/UI/Angular/Content-Projection-Service.md
+++ b/docs/en/UI/Angular/Content-Projection-Service.md
@@ -71,8 +71,3 @@ projectContent | TemplateRef>(
- `projectionStrategy` parameter is the primary focus here and is explained above.
- `injector` parameter is the `Injector` instance you can pass to the projected content. It is not used in `TemplateProjectionStrategy`.
-
-
-## What's Next?
-
-- [Confirmation Popup](./Confirmation-Service.md)
diff --git a/docs/en/UI/Angular/Cross-Origin-Strategy.md b/docs/en/UI/Angular/Cross-Origin-Strategy.md
index e626bf5011..5edcbed9e6 100644
--- a/docs/en/UI/Angular/Cross-Origin-Strategy.md
+++ b/docs/en/UI/Angular/Cross-Origin-Strategy.md
@@ -51,10 +51,3 @@ CROSS_ORIGIN_STRATEGY.UseCredentials(integrity?: string)
```
`crossorigin` will be set as `"use-credentials"` and `integrity` is optional.
-
-
-
-
-## What's Next?
-
-- [LoadingStrategy](./Loading-Strategy.md)
diff --git a/docs/en/UI/Angular/Dom-Insertion-Service.md b/docs/en/UI/Angular/Dom-Insertion-Service.md
index d56e4f8b0e..78e01c59fb 100644
--- a/docs/en/UI/Angular/Dom-Insertion-Service.md
+++ b/docs/en/UI/Angular/Dom-Insertion-Service.md
@@ -134,7 +134,3 @@ has(content: string): boolean
The `has` method returns a boolean value that indicates the given content has already been added to the DOM or not.
- `content` parameter is the content of the inserted `HTMLScriptElement` or `HTMLStyleElement` element.
-
-## What's Next?
-
-- [Lazy Loading Scripts & Styles](./Lazy-Load-Service.md)
diff --git a/docs/en/UI/Angular/Environment.md b/docs/en/UI/Angular/Environment.md
index 1b78a11cc6..04bf8f98c4 100644
--- a/docs/en/UI/Angular/Environment.md
+++ b/docs/en/UI/Angular/Environment.md
@@ -101,8 +101,3 @@ export interface RemoteEnv {
* `customMergeFn`: You can also provide your own merge function as shown in the example. It will take two parameters, `localEnv: Partial` and `remoteEnv` and it needs to return a `Config.Environment` object.
* `method`: HTTP method to be used when retrieving environment config. Default: `GET`
* `headers`: If extra headers are needed for the request, it can be set through this field.
-
-
-## What's Next?
-
-- [About Feature Libraries](./Feature-Libraries.md)
diff --git a/docs/en/UI/Angular/Feature-Libraries.md b/docs/en/UI/Angular/Feature-Libraries.md
index 937bae7245..bdfff93371 100644
--- a/docs/en/UI/Angular/Feature-Libraries.md
+++ b/docs/en/UI/Angular/Feature-Libraries.md
@@ -90,9 +90,3 @@ Depending on the library, the `.forLazy` static method may also receive some opt
---
1 _Libraries expect to work at a predefined path. Please check [how to patch a navigation element](./Modifying-the-Menu.md#how-to-patch-or-remove-a-navigation-element), if you want to use a different path from the default one (e.g. '/identity')._ [↩](#a-modify-route)
-
----
-
-## What's Next?
-
-- [Service Proxies](./Service-Proxies.md)
diff --git a/docs/en/UI/Angular/Features.md b/docs/en/UI/Angular/Features.md
index 930fc2e527..3278bfd988 100644
--- a/docs/en/UI/Angular/Features.md
+++ b/docs/en/UI/Angular/Features.md
@@ -31,7 +31,3 @@ const defaultLang = this.config.getFeature("Identity.TwoFactor");
```
You can then check the value of the feature to perform your logic. Please note that **feature keys are case-sensitive**.
-
-## What's Next?
-
-- [Permission Management](./Permission-Management.md)
diff --git a/docs/en/UI/Angular/Form-Validation.md b/docs/en/UI/Angular/Form-Validation.md
new file mode 100644
index 0000000000..38e7969eea
--- /dev/null
+++ b/docs/en/UI/Angular/Form-Validation.md
@@ -0,0 +1,140 @@
+# Form Validation
+
+Reactive forms in ABP Angular UI are validated by [ngx-validate](https://www.npmjs.com/package/@ngx-validate/core) and helper texts are shown automatically based on validation rules and error blueprints. You do not have to add any elements or components to your templates. The library handles that for you. Here is how the experience is:
+
+
+
+## How to Add New Error Messages
+
+You can add a new error message by providing the `VALIDATION_BLUEPRINTS` injection token from your root module.
+
+```js
+import { VALIDATION_BLUEPRINTS } from "@ngx-validate/core";
+
+@NgModule({
+ // rest of the module metadata
+
+ providers: [
+ // other providers
+ {
+ provide: VALIDATION_BLUEPRINTS,
+ useValue: {
+ uniqueUsername: "::AlreadyExists[{%{{{ username }}}%}]",
+ },
+ },
+ ],
+})
+export class AppModule {}
+```
+
+When a [validator](https://angular.io/guide/form-validation#defining-custom-validators) or an [async validator](https://angular.io/guide/form-validation#creating-asynchronous-validators) returns an error with the key given to the error blueprints (`uniqueUsername` here), the validation library will be able to display an error message after localizing according to the given key and interpolation params. The result will look like this:
+
+
+
+In this example;
+
+- Localization key is `::AlreadyExists`.
+- The interpolation param is `username`.
+- Localization resource is defined as `"AlreadyExists": "Sorry, “{0}” already exists."`.
+- And the validator should return `{ uniqueUsername: { username: "admin" } }` as the error object.
+
+## How to Change Existing Error Messages
+
+You can overwrite an existing error message by providing `VALIDATION_BLUEPRINTS` injection token from your root module. Let's imagine you have a custom localization resource for required inputs.
+
+```json
+"RequiredInput": "Oops! We need this input."
+```
+
+To use this instead of the built-in required input message, all you need to do is the following.
+
+```js
+import { VALIDATION_BLUEPRINTS } from "@ngx-validate/core";
+
+@NgModule({
+ // rest of the module metadata
+
+ providers: [
+ // other providers
+ {
+ provide: VALIDATION_BLUEPRINTS,
+ useValue: {
+ required: "::RequiredInput",
+ },
+ },
+ ],
+})
+export class AppModule {}
+```
+
+The error message will look like this:
+
+
+
+## How to Disable Validation on a Form
+
+If you want to validate a form manually, you can always disable automatic validation on it. All you need to do is place `skipValidation` on the form element.
+
+```html
+
+```
+
+## How to Disable Validation on a Specific Field
+
+Validation works on any element or component with a `formControl` or `formControlName` directive. You can disable automatic validation on a specific field by placing `skipValidation` on the input element or component.
+
+```html
+
+```
+
+## How to Use a Custom Error Component
+
+First, build a custom error component. Extending the existing `ValidationErrorComponent` would make it easier.
+
+```js
+import { ValidationErrorComponent } from "@abp/ng.theme.basic";
+import { ChangeDetectionStrategy, Component } from "@angular/core";
+
+@Component({
+ selector: "app-validation-error",
+ template: `
+