diff --git a/Directory.Packages.props b/Directory.Packages.props
index 8eec2671c6..252e424cde 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -18,10 +18,10 @@
-
-
-
-
+
+
+
+
@@ -46,7 +46,7 @@
-
+
@@ -136,7 +136,7 @@
-
+
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
index b53783a2ac..62f8304467 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
@@ -774,6 +774,7 @@
"Menu:TelemetryMenu": "Telemetry Reports",
"Menu:Studio": "Studio",
"Menu:Solutions": "Solutions",
- "Menu:Users": "Users"
+ "Menu:Users": "Users",
+ "Menu:UserReports": "Users"
}
}
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/1752664190317-min.jpeg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/1752664190317-min.jpeg
index de317b4647..7cd0f2aa47 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/1752664190317-min.jpeg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/1752664190317-min.jpeg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15941-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15941-min.jpg
index fe52494de8..8539d5be5c 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15941-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15941-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15944-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15944-min.jpg
index 2692dd576d..2502d8904c 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15944-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15944-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15947-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15947-min.jpg
index f3f6350c09..372f41e3a5 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15947-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15947-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15948-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15948-min.jpg
index c875ad61e3..9d98fe4585 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15948-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15948-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15949-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15949-min.jpg
index 69840520e0..dac9184cf3 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15949-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15949-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15959-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15959-min.jpg
index fb6d3f520c..af4c2b300a 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15959-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15959-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15963-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15963-min.jpg
index a9595acaa9..e2c3a297f7 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15963-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15963-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15995-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15995-min.jpg
index 60546b5c9f..bc4220f83a 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15995-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15995-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15996-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15996-min.jpg
index 147babb883..e5dd4c0c9d 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15996-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15996-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15998-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15998-min.jpg
index 7c2d080da7..d2ae92ff0e 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15998-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15998-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15999-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15999-min.jpg
index 0cf89bc0e4..22c32abd22 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15999-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15999-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16011-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16011-min.jpg
index c96d3a8d37..392a680bdf 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16011-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16011-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16012-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16012-min.jpg
index 62a16ac428..15a3fbf143 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16012-min.jpg and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16012-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/cover.png b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/cover.png
index 946fdc2ab0..595446cefa 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/cover.png and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/cover.png differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/image-20250722203102576.png b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/image-20250722203102576.png
index 175fd45289..8b8f3a978b 100644
Binary files a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/image-20250722203102576.png and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/image-20250722203102576.png differ
diff --git a/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/POST.md b/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/POST.md
new file mode 100644
index 0000000000..3acf9a7dd0
--- /dev/null
+++ b/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/POST.md
@@ -0,0 +1,79 @@
+# ABP.IO Platform 9.3 Final Has Been Released!
+
+We are glad to announce that [ABP](https://abp.io/) 9.3 stable version has been released today.
+
+## What's New With Version 9.3?
+
+All the new features were explained in detail in the [9.3 RC Announcement Post](https://abp.io/community/announcements/announcing-abp-9-3-release-candidate-4dqgiryf), so there is no need to review them again. You can check it out for more details.
+
+## Getting Started with 9.3
+
+### Creating New Solutions
+
+You can check the [Get Started page](https://abp.io/get-started) to see how to get started with ABP. You can either download [ABP Studio](https://abp.io/get-started#abp-studio-tab) (**recommended**, if you prefer a user-friendly GUI application - desktop application) or use the [ABP CLI](https://abp.io/docs/latest/cli) to create new solutions.
+
+> **Note**: ABP Studio **v1.2.1** has been released with support for **ABP 9.3**. If you already have ABP Studio installed, update it to v1.2.1 (or later, if available) to create new applications targeting 9.3. ABP Studio checks for updates automatically and will prompt you in-app modal to update to the latest version, or you can download the latest installer from the [Studio](https://abp.io/studio) page. See the [upgrading guide](https://abp.io/docs/latest/studio/installation#upgrading) for details. After updating, the New Solution wizard will create applications with ABP 9.3 by default. You can check the [ABP Studio and ABP Startup Template Version Mappings](https://abp.io/docs/latest/studio/version-mapping) documentation to see the corresponding ABP versions for other versions of Studio.
+
+### How to Upgrade an Existing Solution
+
+You can upgrade your existing solutions with either ABP Studio or ABP CLI. In the following sections, both approaches are explained:
+
+### Upgrading via ABP Studio
+
+If you are already using the ABP Studio, you can upgrade it to the latest version. ABP Studio periodically checks for updates in the background, and when a new version of ABP Studio is available, you will be notified through a modal. Then, you can update it by confirming the opened modal. See [the documentation](https://abp.io/docs/latest/studio/installation#upgrading) for more info.
+
+After upgrading the ABP Studio, then you can open your solution in the application, and simply click the **Upgrade ABP Packages** action button to instantly upgrade your solution:
+
+
+
+### Upgrading via ABP CLI
+
+Alternatively, you can upgrade your existing solution via ABP CLI. First, you need to install the ABP CLI or upgrade it to the latest version.
+
+If you haven't installed it yet, you can run the following command:
+
+```bash
+dotnet tool install -g Volo.Abp.Studio.Cli
+```
+
+Or to update the existing CLI, you can run the following command:
+
+```bash
+dotnet tool update -g Volo.Abp.Studio.Cli
+```
+
+After installing/updating the ABP CLI, you can use the [`update` command](https://abp.io/docs/latest/CLI#update) to update all the ABP related NuGet and NPM packages in your solution as follows:
+
+```bash
+abp update
+```
+
+You can run this command in the root folder of your solution to update all ABP related packages.
+
+## Migration Guides
+
+There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v9.2: [ABP Version 9.3 Migration Guide](https://abp.io/docs/9.3/release-info/migration-guides/abp-9-3)
+
+## Community News
+
+### New ABP Community Articles
+
+As always, exciting articles have been contributed by the ABP community. I will highlight some of them here:
+
+* [Fahri Gedik](https://abp.io/community/members/fahrigedik) has published 2 new articles:
+ * [A Modern Approach to Angular Dependency Injection using inject function](https://abp.io/community/articles/a-modern-approach-to-angular-dependency-injection-using-8np4o1ap)
+ * [Angular Application Builder: Transitioning from Webpack to Esbuild](https://abp.io/community/articles/angular-application-builder-transitioning-from-webpack-to-3yzhzfl0)
+* [Benjamin Fadina](https://abp.io/community/members/benjaminsqlserver@gmail.com) has published several videos on various topics such as **Blazor Web Assembly Using ABP.IO**, **CQRS Implementation with MediatR in ABP** and more. You can see all his videos [here](https://abp.io/community/members/benjaminsqlserver@gmail.com).
+* [Mansur Besleney](https://abp.io/community/members/mansur.besleney) has published [How to Build Persistent Background Jobs with ABP Framework and Quartz](https://abp.io/community/articles/how-to-build-persistent-background-jobs-with-abp-framework-n9aloh93)
+* [Halil Ibrahim Kalkan](https://x.com/hibrahimkalkan) has published [Multitenancy with Separate Databases in .NET and ABP](https://abp.io/community/articles/multitenancy-with-separate-databases-in-dotnet-and-abp-51nvl4u9)
+* [Alex Maiereanu](https://abp.io/community/members/alex.maiereanu@3sstudio.com) has published [ABP-Hangfire-AzurePostgreSQL](https://abp.io/community/articles/abphangfireazurepostgresql-s1jnf3yg)
+* [Jack Fistelmann](https://abp.io/community/members/jfistelmann) has published [ABP and maildev](https://abp.io/community/articles/abp-and-maildev-gy13cr1p)
+* [Harsh Gupta](https://abp.io/community/members/harshgupta) has published [How to Add a Module in the ABP.io Application?](https://abp.io/community/articles/how-to-add-a-module-in-the-abp.io-application-sdeajkn6)
+* [Tarık Özdemir](https://abp.io/community/members/mtozdemir) has published [AI-First Architecture for .NET Projects: A Modern Blueprint Inspired by McKinsey](https://abp.io/community/articles/AI-First%20Architecture%20for%20.NET%20Projects%3A%20A%20Modern%20Blueprint-h2wgcoq3)
+* [Liming Ma](https://github.com/maliming) has published [Using Hangfire Dashboard in ABP API Website](https://abp.io/community/articles/using-hangfire-dashboard-in-abp-api-website--r32ox497)
+
+Thanks to the ABP Community for all the content they have published. You can also [post your ABP related (text or video) content](https://abp.io/community/posts/create) to the ABP Community.
+
+## About the Next Version
+
+The next feature version will be 10.0. 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.
diff --git a/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/cover-image.png b/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/cover-image.png
new file mode 100644
index 0000000000..291da0d04f
Binary files /dev/null and b/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/cover-image.png differ
diff --git a/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/upgrade-abp-packages.png b/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/upgrade-abp-packages.png
new file mode 100644
index 0000000000..ad5e9bd462
Binary files /dev/null and b/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/upgrade-abp-packages.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-saas-tenants-page.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-saas-tenants-page.png
index 5b67b21bd1..9f3a0ce5ca 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-saas-tenants-page.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-saas-tenants-page.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-select-dbcontext.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-select-dbcontext.png
index 38c18c1221..17b89bee80 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-select-dbcontext.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-select-dbcontext.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-set-name.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-set-name.png
index f3f48c8e39..9ff5ea75f4 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-set-name.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-set-name.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration.png
index c509020c10..fe59e93230 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-browse.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-browse.png
index 7ea0ae2116..3134203343 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-browse.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-browse.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-context-selection.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-context-selection.png
index af47462005..dc1a993088 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-context-selection.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-context-selection.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-open-with-terminal.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-open-with-terminal.png
index 03cd29c3e1..17dd1fa4dd 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-open-with-terminal.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-open-with-terminal.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-solution-runner.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-solution-runner.png
index b965356dab..a246d01c81 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-solution-runner.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-solution-runner.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/acme-tenant-screen.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/acme-tenant-screen.png
index 1274c7e415..65f7aa5b48 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/acme-tenant-screen.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/acme-tenant-screen.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-main-context.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-main-context.png
index b6da1d9e58..a727bcea86 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-main-context.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-main-context.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-tenant-context.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-tenant-context.png
index b214b13f8c..f77c5e1e75 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-tenant-context.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-tenant-context.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/builder-check-tenant-side.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/builder-check-tenant-side.png
index bfc89e9dda..8b913d4292 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/builder-check-tenant-side.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/builder-check-tenant-side.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbcontext-factories.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbcontext-factories.png
index 17b7272435..b7f72d9a32 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbcontext-factories.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbcontext-factories.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbmigrator-logs.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbmigrator-logs.png
index 2fdfbcb45c..648d9ccaa8 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbmigrator-logs.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbmigrator-logs.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/hybrid-database-multi-tenancy.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/hybrid-database-multi-tenancy.png
index e5e5364302..45930e7fb9 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/hybrid-database-multi-tenancy.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/hybrid-database-multi-tenancy.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/multi-tenancy-dbcontext-structure.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/multi-tenancy-dbcontext-structure.png
index 0bd76b7d59..5bb7ad8410 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/multi-tenancy-dbcontext-structure.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/multi-tenancy-dbcontext-structure.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-1.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-1.png
index cc2e7b1975..76a2a33087 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-1.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-1.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-2.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-2.png
index 0c002b8718..614689552e 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-2.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-2.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-1.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-1.png
index bb1327fc34..5c6aee61d9 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-1.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-1.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-2.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-2.png
index 1f68b3d76b..9404e38a26 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-2.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-2.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/product-database-table.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/product-database-table.png
index cb5a1967f9..58ef8463f2 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/product-database-table.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/product-database-table.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-database.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-database.png
index 26a3bb3064..1ec6c36ad7 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-database.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-database.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-database-multi-tenancy.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-database-multi-tenancy.png
index 4df29f02ae..69c2bb4940 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-database-multi-tenancy.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-database-multi-tenancy.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-schema-option.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-schema-option.png
index bd7d86ce45..40c9c42770 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-schema-option.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-schema-option.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/single-shared-database.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/single-shared-database.png
index af51e1d423..4363dc792e 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/single-shared-database.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/single-shared-database.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-host-side.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-host-side.png
index 46c185901c..e4e5f8943d 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-host-side.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-host-side.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-tenant-dialog.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-tenant-dialog.png
index 36dd1c9a19..2828906d1e 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-tenant-dialog.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-tenant-dialog.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-acme-name.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-acme-name.png
index 94f159ed53..a08537ee4e 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-acme-name.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-acme-name.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-database.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-database.png
index 492c6a00cb..32f7292e3c 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-database.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-database.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-login.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-login.png
index 425ed5cc5f..39cdac5aaf 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-login.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-login.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-logout.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-logout.png
index 4b9d8e9e05..ae7885fa0e 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-logout.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-logout.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/users-table-new-tenant.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/users-table-new-tenant.png
index 0fc5eecda9..0433da73b5 100644
Binary files a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/users-table-new-tenant.png and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/users-table-new-tenant.png differ
diff --git a/docs/en/Community-Articles/2025-07-31-How-to-build-persistent-background-jobs-with-abp-framework-and-quartz/Post.md b/docs/en/Community-Articles/2025-07-31-How-to-build-persistent-background-jobs-with-abp-framework-and-quartz/Post.md
index 1c50a56c8f..eb69c93908 100644
--- a/docs/en/Community-Articles/2025-07-31-How-to-build-persistent-background-jobs-with-abp-framework-and-quartz/Post.md
+++ b/docs/en/Community-Articles/2025-07-31-How-to-build-persistent-background-jobs-with-abp-framework-and-quartz/Post.md
@@ -543,4 +543,6 @@ Complex background processing doesn't have to be complicated to implement. ABP's
Whether you're building subscription management, financial reporting, or data synchronization, these patterns provide a solid foundation for reliable, maintainable solutions.
+You can reach sample project's source code from [here](https://github.com/MansurBesleney/MySaaSApplication)
+
**Happy coding, and may your background jobs never miss a beat!** 🚀
diff --git a/docs/en/Community-Articles/2025-08-12-Integration-Services-Explained/integration-services.jpeg b/docs/en/Community-Articles/2025-08-12-Integration-Services-Explained/integration-services.jpeg
new file mode 100644
index 0000000000..19b1392843
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-12-Integration-Services-Explained/integration-services.jpeg differ
diff --git a/docs/en/Community-Articles/2025-08-12-Integration-Services-Explained/post.md b/docs/en/Community-Articles/2025-08-12-Integration-Services-Explained/post.md
new file mode 100644
index 0000000000..0e11c505da
--- /dev/null
+++ b/docs/en/Community-Articles/2025-08-12-Integration-Services-Explained/post.md
@@ -0,0 +1,138 @@
+# Integration Services in ABP — What they are, when to use them, and how they behave 🚦
+
+If you’ve been building with ABP for a while, you’ve probably used Application Services for your UI and APIs in your .NET and ASP.NET Core apps. Integration Services are similar—but with a different mission: they exist for service-to-service or module-to-module communication, not for end users.
+
+If you want the formal spec, see the official doc: [Integration Services](../../framework/api-development/integration-services.md). This post is the practical, no-fluff guide.
+
+## What is an Integration Service?
+
+An Integration Service is an application service or ASP.NET Core MVC controller marked with the `[IntegrationService]` attribute. That marker tells ABP “this endpoint is for internal communication.”
+
+- They are not exposed by default (safer for reusable modules and monoliths).
+- When exposed, their route prefix is `/integration-api` (so you can easily protect them at your gateway or firewall).
+- Auditing is disabled by default for them (less noise for machine-to-machine calls).
+
+Quick look:
+
+```csharp
+[IntegrationService]
+public interface IProductIntegrationService : IApplicationService
+{
+ Task> GetProductsByIdsAsync(List ids);
+}
+
+public class ProductIntegrationService : ApplicationService, IProductIntegrationService
+{
+ public Task> GetProductsByIdsAsync(List ids)
+ {
+ // fetch and return minimal product info for other services/modules
+ }
+}
+```
+
+## Are they HTTP endpoints?
+
+- By default: no (they won’t be reachable over HTTP in the ASP.NET Core routing pipeline).
+- If you need them over HTTP (typically for microservices), explicitly enable:
+
+```csharp
+Configure(options =>
+{
+ options.ExposeIntegrationServices = true;
+});
+```
+
+Once exposed, ABP puts them under `/integration-api/...` instead of `/api/...` in the ASP.NET Core routing pipeline. That’s your hint to restrict them from public internet access.
+
+## Enable auditing (optional)
+
+If you want audit logs for integration calls, enable it explicitly:
+
+```csharp
+Configure(options =>
+{
+ options.IsEnabledForIntegrationServices = true;
+});
+```
+
+## When should you use Integration Services?
+
+- Internal, synchronous operations between services or modules.
+- You need a “thin” API designed for other services (not for UI): minimal DTOs, no view concerns, predictable contracts.
+- You want to hide these endpoints from public clients, or only allow them inside your private network or k8s cluster.
+- You’re packaging a reusable module that might be used in both monolith and microservice deployments.
+
+## When NOT to use them
+
+- Public APIs or anything intended for browsers/mobile apps → use regular application services/controllers.
+- Asynchronous cross-service workflows → consider domain events + outbox/inbox; use Integration Services for sync calls.
+- Complex, chatty UI endpoints → those belong to your external API surface, not internal integration.
+
+## Common use-cases and examples
+
+- Identity lookups across services: an Ordering service needs basic user info from the Identity service.
+- Permission checks from another module: a CMS module asks a Permission service for access decisions.
+- Product data hydrations: a Cart service needs minimal product details (price, name) from Catalog.
+- Internal admin/maintenance operations that aren’t meant for end users but are needed by other services.
+
+## Example: microservice-to-microservice call
+
+1) Mark and expose the integration service in the target service:
+
+```csharp
+[IntegrationService]
+public interface IUserIntegrationService : IApplicationService
+{
+ Task FindByIdAsync(Guid id);
+}
+
+Configure(o => o.ExposeIntegrationServices = true);
+```
+
+2) In the caller service, add an HTTP client proxy only for Integration Services if you like to keep things clean:
+
+```csharp
+services.AddHttpClientProxies(
+ typeof(TargetServiceApplicationModule).Assembly,
+ remoteServiceConfigurationName: "TargetService",
+ asDefaultServices: true,
+ applicationServiceTypes: ApplicationServiceTypes.IntegrationServices);
+```
+
+3) Call it just like a local service (ABP’s HTTP proxy handles the wire):
+
+```csharp
+public class OrderAppService : ApplicationService
+{
+ private readonly IUserIntegrationService _userIntegrationService;
+
+ public OrderAppService(IUserIntegrationService userIntegrationService)
+ {
+ _userIntegrationService = userIntegrationService;
+ }
+
+ public async Task PlaceOrderAsync(CreateOrderDto input)
+ {
+ var user = await _userIntegrationService.FindByIdAsync(CurrentUser.GetId());
+ // validate user status, continue placing order...
+ }
+}
+```
+
+## Monolith vs. Microservices
+
+- Monolith: keep them unexposed and call via DI in-process. You get the same clear contract with zero network overhead.
+- Microservices: expose them and route behind your gateway. The `/integration-api` prefix makes it easy to firewall/gateway-restrict.
+
+## Practical tips
+
+- Keep integration DTOs lean and stable. These are machine contracts—don’t mix UI concerns.
+- Name them clearly (e.g., `UserIntegrationService`) so intent is obvious.
+- Guard your ASP.NET Core gateway application: block `/integration-api/*` from public traffic.
+- Enable auditing only if you truly need the logs for these calls.
+
+## Further reading
+
+- Official docs: [Integration Services](../../framework/api-development/integration-services.md)
+
+That’s it! Integration Services give you a clean, intentional way to design internal APIs—great in monoliths, essential in microservices.
diff --git a/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/0-cover.png b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/0-cover.png
new file mode 100644
index 0000000000..4864281a32
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/0-cover.png differ
diff --git a/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/1-pipeline-yaml.png b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/1-pipeline-yaml.png
new file mode 100644
index 0000000000..63cebfca62
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/1-pipeline-yaml.png differ
diff --git a/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/3-release.png b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/3-release.png
new file mode 100644
index 0000000000..a974610907
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/3-release.png differ
diff --git a/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/4-safe-deploy.png b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/4-safe-deploy.png
new file mode 100644
index 0000000000..c5771a8447
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/4-safe-deploy.png differ
diff --git a/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/5-summarizing.png b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/5-summarizing.png
new file mode 100644
index 0000000000..5afe59b991
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/5-summarizing.png differ
diff --git a/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/POST.md b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/POST.md
new file mode 100644
index 0000000000..e297aedb13
--- /dev/null
+++ b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/POST.md
@@ -0,0 +1,83 @@
+# 🚀 Best Practices for Azure DevOps CI/CD Pipelines
+
+**CI/CD (Continuous Integration / Continuous Delivery)** is not just fancy tech talk - it's now a must-have for modern software teams.
+Microsoft's **Azure DevOps** helps make these processes easier to manage.
+But how do you create pipelines that work well for your team? Let's look at some practical tips that will make your life easier.
+
+---
+
+## 1. 📜 Define Your Pipeline as Code
+
+Don't use the manual setup method that's hard to track. Azure DevOps lets you use **YAML files** for your pipelines, which gives you:
+
+- A record of all changes - who made them and when
+- The same setup across all environments
+- The ability to undo changes when something goes wrong
+
+This stops the common problem where something works on one computer but not another.
+
+
+
+---
+
+## 2. 🔑 Store Sensitive Information Safely
+
+Never put passwords directly in your code, even temporarily.
+Each environment should have its own settings, and keep sensitive information in **Azure Key Vault** or **Library Variable Groups**.
+
+You'll avoid security problems later.
+
+
+---
+
+## 3. 🏗️ Keep Building and Releasing Separate
+
+Think of **Building** like cooking a meal - you prepare everything and package it up.
+**Releasing** is like delivering that meal to different people.
+
+Keeping these as separate steps means:
+
+- You create your package once, then send it to multiple places
+- You save time and resources by not rebuilding the same thing over and over
+
+
+
+---
+
+## 4. 🧪 Add Automatic Testing
+
+Don't waste time testing the same things manually over and over.
+Set up **different types of tests** to run automatically. When tests run every time you make changes:
+
+- You catch problems before your customers do
+- Your software quality stays high without extra manual work
+
+Azure DevOps has tools to help you see test results easily without searching through technical logs.
+
+---
+
+## 5. 🛡️ Add Safety Checks
+
+Automatic doesn't mean pushing everything to your live system right away.
+For important environments, add **human approval steps** or **automatic checks** like security scans.
+
+This helps you avoid emergency problems in the middle of the night.
+
+
+
+
+---
+
+## ✅ Conclusion
+
+Good Azure DevOps pipelines aren't just about automation - they help you feel confident in your process.
+Remember these main points:
+
+✔ Use YAML files to keep everything visible and trackable
+✔ Keep passwords and sensitive data in secure storage (not in your code)
+✔ Build once, deploy to many places
+✔ Let automatic tests find problems before users do
+✔ Add safety checks for important systems
+
+
+---
diff --git a/docs/en/Community-Articles/2025-08-19-abp-now-supports-angular-standalone-applications/POST.md b/docs/en/Community-Articles/2025-08-19-abp-now-supports-angular-standalone-applications/POST.md
new file mode 100644
index 0000000000..1f5c284cb1
--- /dev/null
+++ b/docs/en/Community-Articles/2025-08-19-abp-now-supports-angular-standalone-applications/POST.md
@@ -0,0 +1,398 @@
+# ABP Now Supports Angular Standalone Applications
+
+We are excited to announce that **ABP now supports Angular’s standalone component structure** in the latest Studio update. This article walks you through how to generate a standalone application, outlines the migration steps, and highlights the benefits of this shift over traditional module-based architecture.
+
+---
+
+## Why Standalone?
+
+Angular's standalone component architecture, which is introduced in version 14 and made default in version 19, is a major leap forward for Angular development. Here is why it matters:
+
+### 🔧 Simplified Project Structure
+
+Standalone components eliminate the need for `NgModule` wrappers. This leads to:
+
+- Fewer files to manage
+- Cleaner folder organization
+- Reduced boilerplate
+
+Navigating and understanding your codebase becomes easier for everyone on your team.
+
+### 🚀 Faster Bootstrapping
+
+Standalone apps simplify app initialization:
+
+```ts
+bootstrapApplication(AppComponent, appConfig);
+```
+
+This avoids the need for `AppModule` and speeds up startup times.
+
+### 📦 Smaller Bundle Sizes
+
+Since components declare their own dependencies, Angular can more effectively tree-shake unused code. Result? Smaller bundle sizes and faster load times.
+
+### 🧪 Easier Testing & Reusability
+
+Standalone components are self-contained. They declare their dependencies within the `imports` array, making them:
+
+- Easier to test in isolation
+- Easier to reuse in different contexts
+
+### 🧠 Clearer Dependency Management
+
+Standalone components explicitly define what they need. No more hidden dependencies buried in shared modules.
+
+### 🔄 Gradual Adoption
+
+You can mix and match standalone and module-based components. This allows for **incremental migration**, reducing risk in larger codebases. Here is the related document for the [standalone migration](https://angular.dev/reference/migrations/standalone).
+
+---
+
+## Getting Started: Creating a Standalone Angular App
+
+Angular CLI makes it easy to start:
+
+```bash
+ng new my-app
+```
+
+With Angular 19, new apps follow this bootstrapping model:
+
+```ts
+// main.ts
+import { bootstrapApplication } from "@angular/platform-browser";
+import { appConfig } from "./app/app.config";
+import { AppComponent } from "./app/app.component";
+
+bootstrapApplication(AppComponent, appConfig).catch((err) =>
+ console.error(err)
+);
+```
+
+The `app.config.ts` file replaces `AppModule`:
+
+```ts
+// app.config.ts
+import { ApplicationConfig, provideZoneChangeDetection } from "@angular/core";
+import { provideRouter } from "@angular/router";
+import { routes } from "./app.routes";
+
+export const appConfig: ApplicationConfig = {
+ providers: [
+ provideZoneChangeDetection({ eventCoalescing: true }),
+ provideRouter(routes),
+ ],
+};
+```
+
+Routing is defined in a simple `Routes` array:
+
+```ts
+// app.routes.ts
+import { Routes } from "@angular/router";
+
+export const routes: Routes = [];
+```
+
+---
+
+## ABP Studio Support for Standalone Structure
+
+Starting with the latest release (insert version number here), ABP Studio fully supports Angular's standalone structure. While the new format is encouraged, module-based structure will continue to be supported for backwards compatibility.
+
+To try it out, simply update your ABP Studio to create apps with the latest version.
+
+---
+
+## What’s New in ABP Studio Templates?
+
+When you generate an app using the latest ABP Studio, the project structure aligns with Angular's standalone architecture.
+
+This migration is split into four parts:
+
+1. **Package updates**
+2. **Schematics updates**
+3. **Suite code generation updates**
+4. **Template refactors**
+
+---
+
+## Package Migration Details
+
+Migration has been applied to packages in the [ABP GitHub repository](https://github.com/abpframework/abp/tree/dev/npm/ng-packs/packages). Here is an example from the Identity package.
+
+### 🧩 Migrating Components
+
+Components are made standalone, using:
+
+```bash
+ng g @angular/core:standalone
+```
+
+Example:
+
+```ts
+@Component({
+ selector: 'abp-roles',
+ templateUrl: './roles.component.html',
+ providers: [...],
+ imports: [
+ ReactiveFormsModule,
+ LocalizationPipe,
+ ...
+ ],
+})
+export class RolesComponent implements OnInit { ... }
+```
+
+### 🛣 Updating Routing
+
+Old lazy-loaded routes using `forLazy()`:
+
+```ts
+{
+ path: 'identity',
+ loadChildren: () => import('@abp/ng.identity').then(m => m.IdentityModule.forLazy({...}))
+}
+```
+
+Now replaced with:
+
+```ts
+{
+ path: 'identity',
+ loadChildren: () => import('@abp/ng.identity').then(c => c.createRoutes({...}))
+}
+```
+
+### 🧱 Replacing Module Declarations
+
+The old setup:
+
+```ts
+// identity.module.ts
+@NgModule({
+ imports: [IdentityRoutingModule, RolesComponent, UsersComponent],
+})
+export class IdentityModule {...}
+```
+
+```ts
+//identity-routing.module
+const routes: Routes = [...];
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class IdentityRoutingModule {}
+```
+
+New setup:
+
+```ts
+// identity-routes.ts
+export function provideIdentity(options: IdentityConfigOptions = {}): Provider[] {
+ return [...];
+}
+export const createRoutes = (options: IdentityConfigOptions = {}): Routes => [
+ {
+ path: '',
+ component: RouterOutletComponent,
+ providers: provideIdentity(options),
+ children: [
+ {
+ path: 'roles',
+ component: ReplaceableRouteContainerComponent,
+ data: {
+ requiredPolicy: 'AbpIdentity.Roles',
+ replaceableComponent: {
+ key: eIdentityComponents.Roles,
+ defaultComponent: RolesComponent,
+ },
+ },
+ title: 'AbpIdentity::Roles',
+ },
+ ...
+ ],
+ },
+];
+```
+
+---
+
+## ABP Schematics Migration Details
+
+You can reach details by checking [ABP Schematics codebase](https://github.com/abpframework/abp/tree/dev/npm/ng-packs/packages/schematics).
+
+### 📚 Library creation
+
+When you run the `abp create-lib` command, the prompter will ask you the `templateType`. It supports both module and standalone templates.
+
+```ts
+"templateType": {
+ "type": "string",
+ "description": "Type of the template",
+ "enum": ["module", "standalone"],
+ "x-prompt": {
+ "message": "Select the type of template to generate:",
+ "type": "list",
+ "items": [
+ { "value": "module", "label": "Module Template" },
+ { "value": "standalone", "label": "Standalone Template" }
+ ]
+ }
+},
+```
+
+---
+
+## ABP Suite Code Generation Migration Details
+
+ABP Suite will also be supporting both structures. If you have a project that is generated with the previous versions, the Suite will detect the structure in that way and generate the related code accordingly. Conversely, here is what is changed for the standalone migration:
+
+**❌ Discarded module files**
+
+```ts
+// entity-one.module.ts
+@NgModule({
+ declarations: [],
+ imports: [EntityOneComponent, EntityOneRoutingModule],
+})
+export class EntityOneModule {}
+```
+
+```ts
+// entity-one-routing.module.ts
+export const routes: Routes = [
+ {
+ path: "",
+ component: EntityOneComponent,
+ canActivate: [authGuard, permissionGuard],
+ },
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class EntityOneRoutingModule {}
+```
+
+```ts
+// app-routing.module.ts
+{
+ path: 'entity-ones',
+ loadChildren: () =>
+ import('./entity-ones/entity-one/entity-one.module').then(m => m.EntityOneModule),
+},
+```
+
+**✅ Added routes configuration**
+
+```ts
+// entity-one.routes.ts
+export const ENTITY_ONE_ROUTES: Routes = [
+ {
+ path: "",
+ loadComponent: () => {
+ return import("./components/entity-one.component").then(
+ (c) => c.EntityOneComponent
+ );
+ },
+ canActivate: [authGuard, permissionGuard],
+ },
+];
+```
+
+```ts
+// app.routes.ts
+{ path: 'entity-ones', children: ENTITY_ONE_ROUTES },
+```
+
+---
+
+## Template Migration Details
+
+### 🧭 Routing: `app.routes.ts`
+
+```ts
+// app.routes.ts
+import { Routes } from '@angular/router';
+
+export const APP_ROUTES: Routes = [
+ {
+ path: '',
+ pathMatch: 'full',
+ loadComponent: () => import('./home/home.component').then(m => m.HomeComponent),
+ },
+ {
+ path: 'account',
+ loadChildren: () => import('@abp/ng.account').then(m => m.createRoutes()),
+ },
+ ...
+];
+```
+
+### ⚙ Configuration: `app.config.ts`
+
+```ts
+// app.config.ts
+export const appConfig: ApplicationConfig = {
+ providers: [
+ provideRouter(APP_ROUTES),
+ APP_ROUTE_PROVIDER,
+ provideAbpCore(
+ withOptions({
+ environment,
+ registerLocaleFn: registerLocale(),
+ ...
+ })
+ ),
+ provideAbpOAuth(),
+ provideAbpThemeShared(),
+ ...
+ ],
+};
+
+```
+
+### 🧼 Removed: `shared.module.ts`
+
+This file has been removed to reduce unnecessary shared imports. Components now explicitly import what they need—leading to better encapsulation and less coupling.
+
+---
+
+## Common Problems
+
+You may encounter these common problems that you would need to manage.
+
+### 1. Missing Imports
+
+In standalone structure, components must declare all their dependencies in `imports`. Forgetting this often causes template errors.
+
+### 2. Mixed Structures
+
+Combining modules and standalone in the same feature leads to confusion. Migrate features fully or keep them module-based.
+
+### 3. Routing Errors
+
+Incorrect migration from `forLazy()` to `createRoutes()` or `loadComponent` can break navigation. Double-check route configs.
+
+### 4. Service Injection
+
+Services provided in old modules may be missing. Add them in the component’s `providers` or `app.config.ts`.
+
+### 5. Shared Module Habit
+
+Reintroducing a shared module reduces the benefits of standalone. Import dependencies directly where needed.
+
+---
+
+## Conclusion
+
+Angular’s standalone component architecture is a significant improvement for scalability, simplicity, and performance. With latest version of ABP Studio, you can adopt this modern approach with ease—without losing support for existing module-based projects.
+
+**Ready to modernize your Angular development?**
+
+Update your ABP Studio today and start building with standalone power!
diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json
index 33f4315bf7..dc2412b529 100644
--- a/docs/en/docs-nav.json
+++ b/docs/en/docs-nav.json
@@ -2345,11 +2345,91 @@
},
{
"text": "CMS Kit",
- "path": "modules/cms-kit"
+ "isLazyExpandable": true,
+ "path": "modules/cms-kit",
+ "items": [
+ {
+ "text": "Overview",
+ "path": "modules/cms-kit.md",
+ "isIndex": true
+ },
+ {
+ "text": "Pages",
+ "path": "modules/cms-kit/pages.md"
+ },
+ {
+ "text": "Blogging",
+ "path": "modules/cms-kit/blogging.md"
+ },
+ {
+ "text": "Tag Management",
+ "path": "modules/cms-kit/tags.md"
+ },
+ {
+ "text": "Comments",
+ "path": "modules/cms-kit/comments.md"
+ },
+ {
+ "text": "Reaction System",
+ "path": "modules/cms-kit/reactions.md"
+ },
+ {
+ "text": "Rating System",
+ "path": "modules/cms-kit/ratings.md"
+ },
+ {
+ "text": "Menus",
+ "path": "modules/cms-kit/menus.md"
+ },
+ {
+ "text": "Global Resources",
+ "path": "modules/cms-kit/global-resources.md"
+ },
+ {
+ "text": "Dynamic Widget",
+ "path": "modules/cms-kit/dynamic-widget.md"
+ },
+ {
+ "text": "Marked Item System",
+ "path": "modules/cms-kit/marked-items.md"
+ }
+ ]
},
{
"text": "CMS Kit (Pro)",
- "path": "modules/cms-kit-pro"
+ "isLazyExpandable": true,
+ "path": "modules/cms-kit-pro",
+ "items": [
+ {
+ "text": "Overview",
+ "path": "modules/cms-kit-pro.md",
+ "isIndex": true
+ },
+ {
+ "text": "Newsletter System",
+ "path": "modules/cms-kit-pro/newsletter.md"
+ },
+ {
+ "text": "Contact Management",
+ "path": "modules/cms-kit-pro/contact-form.md"
+ },
+ {
+ "text": "URL Forwarding System",
+ "path": "modules/cms-kit-pro/URL-forwarding.md"
+ },
+ {
+ "text": "Poll System",
+ "path": "modules/cms-kit-pro/poll.md"
+ },
+ {
+ "text": "Page Feedback System",
+ "path": "modules/cms-kit-pro/page-feedback.md"
+ },
+ {
+ "text": "FAQ System",
+ "path": "modules/cms-kit-pro/faq.md"
+ }
+ ]
},
{
"text": "Docs",
diff --git a/docs/en/framework/architecture/multi-tenancy/index.md b/docs/en/framework/architecture/multi-tenancy/index.md
index 1bc151bddf..21bb054b6a 100644
--- a/docs/en/framework/architecture/multi-tenancy/index.md
+++ b/docs/en/framework/architecture/multi-tenancy/index.md
@@ -231,18 +231,20 @@ services.Configure(options =>
If you change the `TenantKey`, make sure to pass it to `provideAbpCore` via `withOptions` method in the Angular client as follows:
```js
-@NgModule({
+// app.config.ts
+// ...
+export const appConfig: ApplicationConfig = {
providers: [
+ // ...
provideAbpCore(
withOptions({
// ...
tenantKey: "MyTenantKey",
})
),
+ // ...
],
- // ...
-})
-export class AppModule {}
+};
```
If you need to access it, you can inject it as follows:
diff --git a/docs/en/framework/infrastructure/object-to-object-mapping.md b/docs/en/framework/infrastructure/object-to-object-mapping.md
index 5a9ea5f82a..01484b31fe 100644
--- a/docs/en/framework/infrastructure/object-to-object-mapping.md
+++ b/docs/en/framework/infrastructure/object-to-object-mapping.md
@@ -302,6 +302,23 @@ public partial class UserToUserDtoMapper : MapperBase
It is suggested to use the `MapExtraPropertiesAttribute` attribute if both classes are extensible objects (implement the `IHasExtraProperties` interface). See the [object extension document](../fundamentals/object-extensions.md) for more.
+### Property Setter Method
+
+Mapperly requires that properties of both source and destination objects have `setter` methods. Otherwise, the property will be ignored. You can use `protected set` or `private set` to control the visibility of the `setter` method, but each property must have a `setter` method.
+
+### Deep Cloning
+
+By default, Mapperly does not create deep copies of objects to improve performance. If an object can be directly assigned to the target, it will do so (e.g., if the source and target type are both `List`, the list and its entries will not be cloned). To create deep copies, set the `UseDeepCloning` property on the `MapperAttribute` to `true`.
+
+````csharp
+[Mapper(UseDeepCloning = true)]
+public partial class UserToUserDtoMapper : MapperBase
+{
+ public override partial UserDto Map(User source);
+ public override partial void Map(User source, UserDto destination);
+}
+````
+
### Lists and Arrays Support
ABP Mapperly integration also supports mapping lists and arrays as explained in the [IObjectMapper Interface](#iobjectmappertsource-tdestination-interface) section.
@@ -320,6 +337,165 @@ var users = await _userRepository.GetListAsync(); // returns List
var dtos = ObjectMapper.Map, List>(users); // creates List
````
+### Nested Mapping
+
+When working with nested object mapping, there's an important limitation to be aware of. If you have separate mappers for nested types like in the example below, the parent mapper (`SourceTypeToDestinationTypeMapper`) will not automatically use the nested mapper (`SourceNestedTypeToDestinationNestedTypeMapper`) to handle the mapping of nested properties. This means that configurations like the `MapperIgnoreTarget` attribute on the nested mapper will be ignored during the parent mapping operation.
+
+````csharp
+public class SourceNestedType
+{
+ public string Name { get; set; }
+
+ public string Ignored { get; set; }
+}
+
+public class SourceType
+{
+ public string Name { get; set; }
+
+ public SourceNestedType Nested { get; set; }
+}
+
+public class DestinationNestedType
+{
+ public string Name { get; set; }
+
+ public string Ignored { get; set; }
+}
+
+public class DestinationType
+{
+ public string Name { get; set; }
+
+ public DestinationNestedType Nested { get; set; }
+}
+
+[Mapper]
+public partial class SourceTypeToDestinationTypeMapper : MapperBase
+{
+ public override partial DestinationType Map(SourceType source);
+ public override partial void Map(SourceType source, DestinationType destination);
+}
+
+[Mapper]
+public partial class SourceNestedTypeToDestinationNestedTypeMapper : MapperBase
+{
+ [MapperIgnoreTarget(nameof(SourceNestedType.Ignored))]
+ public override partial DestinationNestedType Map(SourceNestedType source);
+
+ [MapperIgnoreTarget(nameof(SourceNestedType.Ignored))]
+ public override partial void Map(SourceNestedType source, DestinationNestedType destination);
+}
+````
+
+There are several ways to solve this nested mapping issue. Choose the approach that best fits your specific requirements:
+
+#### Solution 1: Multi-Interface Implementation
+
+Implement both mapping interfaces (`IAbpMapperlyMapper` and `IAbpMapperlyMapper`) in a single mapper class. This approach consolidates all related mapping logic into one class.
+
+**Important:** Remember to implement `ITransientDependency` to register the mapper class with the dependency injection container.
+
+````csharp
+[Mapper]
+public partial class SourceTypeToDestinationTypeMapper : IAbpMapperlyMapper, IAbpMapperlyMapper, ITransientDependency
+{
+ public partial DestinationType Map(SourceType source);
+ public partial void Map(SourceType source, DestinationType destination);
+ public void BeforeMap(SourceType source)
+ {
+ }
+
+ public void AfterMap(SourceType source, DestinationType destination)
+ {
+ }
+
+ [MapperIgnoreTarget(nameof(SourceNestedType.Ignored))]
+ public partial DestinationNestedType Map(SourceNestedType source);
+
+ [MapperIgnoreTarget(nameof(SourceNestedType.Ignored))]
+ public partial void Map(SourceNestedType source, DestinationNestedType destination);
+
+ public void BeforeMap(SourceNestedType source)
+ {
+ }
+
+ public void AfterMap(SourceNestedType source, DestinationNestedType destination)
+ {
+ }
+}
+````
+
+#### Solution 2: Consolidate Mapping Methods
+
+Copy the nested mapping methods from `SourceNestedTypeToDestinationNestedTypeMapper` to the parent `SourceTypeToDestinationTypeMapper` class. This ensures all mapping logic is contained within a single mapper.
+
+Example:
+
+````csharp
+[Mapper]
+public partial class SourceTypeToDestinationTypeMapper : MapperBase
+{
+ public override partial DestinationType Map(SourceType source);
+ public override partial void Map(SourceType source, DestinationType destination);
+
+ [MapperIgnoreTarget(nameof(SourceNestedType.Ignored))]
+ public override partial DestinationNestedType Map(SourceNestedType source);
+ [MapperIgnoreTarget(nameof(SourceNestedType.Ignored))]
+ public override partial void Map(SourceNestedType source, DestinationNestedType destination);
+}
+
+[Mapper]
+public partial class SourceNestedTypeToDestinationNestedTypeMapper : MapperBase
+{
+ [MapperIgnoreTarget(nameof(SourceNestedType.Ignored))]
+ public override partial DestinationNestedType Map(SourceNestedType source);
+
+ [MapperIgnoreTarget(nameof(SourceNestedType.Ignored))]
+ public override partial void Map(SourceNestedType source, DestinationNestedType destination);
+}
+````
+
+#### Solution 3: Dependency Injection Approach
+
+Inject the nested mapper as a dependency into the parent mapper and use it in the `AfterMap` method to handle nested object mapping manually.
+
+Example:
+
+````csharp
+[Mapper]
+public partial class SourceTypeToDestinationTypeMapper : MapperBase
+{
+ private readonly SourceNestedTypeToDestinationNestedTypeMapper _sourceNestedTypeToDestinationNestedTypeMapper;
+
+ public SourceTypeToDestinationTypeMapper(SourceNestedTypeToDestinationNestedTypeMapper sourceNestedTypeToDestinationNestedTypeMapper)
+ {
+ _sourceNestedTypeToDestinationNestedTypeMapper = sourceNestedTypeToDestinationNestedTypeMapper;
+ }
+
+ public override partial DestinationType Map(SourceType source);
+ public override partial void Map(SourceType source, DestinationType destination);
+
+ public override void AfterMap(SourceType source, DestinationType destination)
+ {
+ if (source.Nested != null)
+ {
+ destination.Nested = _sourceNestedTypeToDestinationNestedTypeMapper.Map(source.Nested);
+ }
+ }
+}
+````
+
+#### Choosing the Right Solution
+
+Each solution has its own advantages:
+
+- **Solution 1** consolidates all mapping logic in one place and works well when mappings are tightly related.
+- **Solution 2** is simple but can lead to code duplication if you need the nested mapper elsewhere.
+- **Solution 3** maintains separation of concerns and reusability but requires manual mapping in the `AfterMap` method.
+
+Choose the approach that best aligns with your application's architecture and maintainability requirements.
+
### More Mapperly Features
Most of Mapperly's features such as `Ignore` can be configured through its attributes. See the [Mapperly documentation](https://mapperly.riok.app/docs/intro/) for more details.
diff --git a/docs/en/framework/ui/angular/account-module.md b/docs/en/framework/ui/angular/account-module.md
index eb149af61e..05b670d4d2 100644
--- a/docs/en/framework/ui/angular/account-module.md
+++ b/docs/en/framework/ui/angular/account-module.md
@@ -17,36 +17,35 @@ npm install @abp/ng.account
> Make sure v4.3 or higher version is installed.
-Open the `app.module.ts` and add `provideAccountConfig()` to the providers array as shown below:
+Open the `app.config.ts` and add `provideAccountConfig()` to the providers array as shown below:
```js
-// app.module.ts
+// app.config.ts
import { provideAccountConfig } from "@abp/ng.account/config";
-//...
+// ...
-@NgModule({
+export const appConfig: ApplicationConfig = {
providers: [
- //...
+ // ...
provideAccountConfig(),
+ // ...
],
- //...
-})
-export class AppModule {}
+};
```
-Open the `app-routing.module.ts` and add the `account` route to `routes` array as follows:
+Open the `app.routes.ts` and add the `account` route to `APP_ROUTES` array as follows:
```js
-// app-routing.module.ts
-const routes: Routes = [
+// app.routes.ts
+export const APP_ROUTES: Routes = [
//...
{
path: 'account',
- loadChildren: () => import('@abp/ng.account').then(m => m.AccountModule.forLazy()),
+ loadChildren: () => import('@abp/ng.account').then(c => c.createRoutes()),
},
//...
-export class AppRoutingModule {}
+];
```
## Account Public Module Implementation for Commercial Templates
@@ -59,42 +58,42 @@ npm install @volo/abp.ng.account
> Make sure v4.3 or higher version is installed.
-Open the `app.module.ts` and add `AccountPublicConfigModule.forRoot()` to the imports array as shown below:
+Open the `app.config.ts` and add `provideAccountPublicConfig()` to the providers array as shown below:
-> Ensure that the `Account Layout Module` has been added if you are using the Lepton X theme. If you miss the step, you will get an error message that says `Account layout not found. Please check your configuration. If you are using LeptonX, please make sure you have added "AccountLayoutModule.forRoot()" to your app.module configuration.` when you try to access the account pages. Otherwise, you can skip adding the `AccountLayoutModule` step.
+> Ensure that the `Account Layout Provider` has been added if you are using the Lepton X theme. If you miss the step, you will get an error message that says `Account layout not found. Please check your configuration. If you are using LeptonX, please make sure you have added "provideAccountLayout()" to your app configuration.` Otherwise, you can skip adding the `provideAccountLayout()` step.
```js
-// app.module.ts
+// app.config.ts
-import { AccountPublicConfigModule } from "@volo/abp.ng.account/public/config";
-// if you are using or want to use Lepton X, you should add AccountLayoutModule
-// import { AccountLayoutModule } from '@volosoft/abp.ng.theme.lepton-x/account'
+import { provideAccountPublicConfig } from "@volo/abp.ng.account/public/config";
+// if you are using or want to use Lepton X, you should add provideAccountLayout
+// import { provideAccountLayout } from '@volosoft/abp.ng.theme.lepton-x/account'
//...
-@NgModule({
- imports: [
- //...
- AccountPublicConfigModule.forRoot(),
- // AccountLayoutModule.forRoot() // Only for Lepton X
+export const appConfig: ApplicationConfig = {
+ providers: [
+ // ...
+ provideAccountPublicConfig(),
+ provideAccountLayout() // Only for Lepton X
+ // ...
],
- //...
-})
-export class AppModule {}
+};
```
-Open the `app-routing.module.ts` and add the `account` route to `routes` array as follows:
+Open the `app.routes.ts` and add the `account` route to `APP_ROUTES` array as follows:
```js
-// app-routing.module.ts
-const routes: Routes = [
+// app.routes.ts
+
+export const APP_ROUTES: Routes = [
//...
{
path: 'account',
- loadChildren: () => import('@volo/abp.ng.account/public').then(m => m.AccountPublicModule.forLazy()),
+ loadChildren: () => import('@volo/abp.ng.account/public').then(c => c.createRoutes()),
},
//...
-export class AppRoutingModule {}
+];
```
## My Account Page
@@ -108,15 +107,15 @@ When the user changes their own data on the personal settings tab in My Account,
If you want to disable these warning, You should set `isPersonalSettingsChangedConfirmationActive` false
```js
-// app-routing.module.ts
-const routes: Routes = [
+// app.routes.ts
+export const APP_ROUTES: Routes = [
//...
{
path: 'account',
- loadChildren: () => import('@volo/abp.ng.account/public').then(m => m.AccountPublicModule.forLazy({ isPersonalSettingsChangedConfirmationActive:false })),
+ loadChildren: () => import('@volo/abp.ng.account/public').then(c => c.create({ isPersonalSettingsChangedConfirmationActive:false })),
},
//...
-export class AppRoutingModule {}
+];
```
## Security Logs Page [COMMERCIAL]
diff --git a/docs/en/framework/ui/angular/authorization.md b/docs/en/framework/ui/angular/authorization.md
index dcf6e0c67d..cef5dca7c4 100644
--- a/docs/en/framework/ui/angular/authorization.md
+++ b/docs/en/framework/ui/angular/authorization.md
@@ -61,15 +61,18 @@ The `AuthErrorFilterService` is an abstract service that needs to be replaced wi
### Usage
-#### 1.Create an auth-filter.provider
+#### 1.Create an auth filter provider
```js
-import { APP_INITIALIZER, inject } from '@angular/core';
+//auth-filter.provider.ts
+import { inject, provideAppInitializer } from '@angular/core';
import { AuthErrorFilter, AuthErrorEvent, AuthErrorFilterService } from '@abp/ng.core';
import { eCustomersAuthFilterNames } from '../enums';
export const CUSTOMERS_AUTH_FILTER_PROVIDER = [
- { provide: APP_INITIALIZER, useFactory: configureAuthFilter, multi: true },
+ provideAppInitializer(() => {
+ configureAuthFilter()
+ }),
];
type Reason = object & { error: { grant_type: string | undefined } };
@@ -100,20 +103,17 @@ function configureAuthFilter() {
- `executable:` a status for the filter object. If it's false then it won't work, yet it'll stay in the list
- `execute:` a function that stores the skip logic
-#### 2.Add to the FeatureConfigModule
+#### 2.Add to the customer configuration provider
```js
-import { ModuleWithProviders, NgModule } from "@angular/core";
-import { CUSTOMERS_AUTH_FILTER_PROVIDER } from "./providers/auth-filter.provider";
-
-@NgModule()
-export class CustomersConfigModule {
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: CustomersConfigModule,
- providers: [CUSTOMERS_AUTH_FILTER_PROVIDER],
- };
- }
+// customer-config.provider.ts
+import { EnvironmentProviders, makeEnvironmentProviders } from "@angular/core";
+import { CUSTOMERS_AUTH_FILTER_PROVIDER } from "./auth-filter.provider";
+
+export function provideCustomerConfig(): EnvironmentProviders {
+ return makeEnvironmentProviders([
+ CUSTOMERS_AUTH_FILTER_PROVIDER
+ ])
}
```
diff --git a/docs/en/framework/ui/angular/basic-theme.md b/docs/en/framework/ui/angular/basic-theme.md
index 6e32d4e6be..2332091cf0 100644
--- a/docs/en/framework/ui/angular/basic-theme.md
+++ b/docs/en/framework/ui/angular/basic-theme.md
@@ -11,10 +11,9 @@ The Basic Theme is a theme implementation for the Angular UI. It is a minimalist
If you need to manually this theme, follow the steps below:
* Install the [@abp/ng.theme.basic](https://www.npmjs.com/package/@abp/ng.theme.basic) NPM package to your Angular project.
-* Open the `src/app/app.module.ts` file, import `ThemeBasicModule`,`provideThemeBasicConfig` (it can be imported from `@abp/ng.theme.basic` package), and add `ThemeBasicModule` to the `imports` array and provide `provideThemeBasicConfig()` to the providers array.
-* Open the `src/app/shared/shared.module` file, import `ThemeBasicModule` (it can be imported from `@abp/ng.theme.basic` package), and add `ThemeBasicModule` to the `imports` and `exports` array.
+* Open the `src/app/app.config.ts` file, import `provideThemeBasicConfig` (it can be imported from `@abp/ng.theme.basic` package), and provide `provideThemeBasicConfig()` to the providers array.
-The `ThemeBasicModule` is registered own layouts (`ApplicationLayoutComponent`, `AccountLayoutComponent`, `EmptyLayoutComponent`) to a service which is exposed by `@abp/ng.core` package on application initialization.
+The `BASIC_THEME_STYLES_PROVIDERS` has registered three layouts being `ApplicationLayoutComponent`, `AccountLayoutComponent`, and `EmptyLayoutComponent`. These are provided inside `provideThemeBasicConfig()` function that is exposed by `@abp/ng.theme.basic` package on application initialization.
## Application Layout
diff --git a/docs/en/framework/ui/angular/caps-lock-directive.md b/docs/en/framework/ui/angular/caps-lock-directive.md
index f6a9c83931..179027022d 100644
--- a/docs/en/framework/ui/angular/caps-lock-directive.md
+++ b/docs/en/framework/ui/angular/caps-lock-directive.md
@@ -5,66 +5,27 @@ In password inputs, You may want to show if Caps Lock is on. To make this even e
## Getting Started
-`TrackCapsLockDirective` is standalone. In order to use the `TrackCapsLockDirective` in an HTML template, import it to related module or your standalone component:
-
-**Importing to NgModule**
-```ts
-import { TrackCapsLockDirective } from '@abp/ng.core';
-
-@NgModule({
- //...
- declarations: [
- ...,
- TestComponent
- ],
- imports: [
- ...,
- TrackCapsLockDirective
- ],
-})
-export class MyFeatureModule {}
-```
-
-## Usage
-
-The `TrackCapsLockDirective` is very easy to use. The directive's selector is **`abpCapsLock`**. By adding the `abpCapsLock` event to an element, you can track the status of Caps Lock. You can use this to warn user.
+`TrackCapsLockDirective` is standalone. In order to use the `TrackCapsLockDirective` in an HTML template, import it to related component. The selector of the directive is **`abpCapsLock`**. By adding the `abpCapsLock` event to an element, you can track the status of Caps Lock. You can use this to warn user.
See an example usage:
-**NgModule Component usage**
-```ts
-@Component({
- selector: 'test-component',
- template: `
-
`,
imports: [TrackCapsLockDirective]
})
-export class StandaloneComponent{
+export class SampleComponent{
capsLock = false;
}
```
diff --git a/docs/en/framework/ui/angular/card-component.md b/docs/en/framework/ui/angular/card-component.md
index ca056853ff..e8f1ba4d8e 100644
--- a/docs/en/framework/ui/angular/card-component.md
+++ b/docs/en/framework/ui/angular/card-component.md
@@ -23,27 +23,7 @@ In addition to these components, the Card component provides directives like `Ca
# Usage
-ABP Card Component is a part of the `ThemeSharedModule` module. If you've imported that module into your module, you don't need to import it again. If not, first import it as shown below:
-
-```ts
-// my-feature.module.ts
-
-import { ThemeSharedModule } from '@abp/ng.theme.shared';
-import { CardDemoComponent } from './card-demo.component';
-
-@NgModule({
- imports: [
- ThemeSharedModule ,
- // ...
- ],
- declarations: [CardDemoComponent],
- // ...
-})
-export class MyFeatureModule {}
-
-```
-
-Then, the `abp-card` component can be used. See the examples below:
+ABP Card Component is a part of the `theme-shared` package. Once you import the necessary components, you can use them. See the examples below:
## CardBody
@@ -51,16 +31,18 @@ Then, the `abp-card` component can be used. See the examples below:
// card-demo.component.ts
import { Component } from '@angular/core';
+import { CardComponent, CardBodyComponent } from '@abp/ng.theme.shared';
@Component({
selector: 'app-card-demo',
+ imports: [CardComponent, CardBodyComponent],
template: `
This is some text within a card body
`,
})
-export class CardDemoComponent { }
+export class CardDemoComponent {}
```
See the card body result below:
@@ -72,22 +54,36 @@ See the card body result below:
//card-demo.component.ts
import { Component } from '@angular/core';
+import {
+ CardComponent,
+ CardBodyComponent,
+ CardTitleDirective,
+ CardSubtitleDirective
+} from '@abp/ng.theme.shared';
@Component({
selector: 'app-card-demo',
+ imports: [
+ CardComponent,
+ CardBodyComponent,
+ CardTitleDirective,
+ CardSubtitleDirective
+ ],
template: `
Card Title
Card subtitle
-
Some quick example text to build on the card title and make up the bulk of the card's content.
+ Some quick example text to build on the card title and make up the bulk of the card's content.
+
+ Card link
+ Another link
`,
})
-export class CardDemoComponent { }
+export class CardDemoComponent {}
```
See the card title, text and link result below:
@@ -99,19 +95,23 @@ See the card title, text and link result below:
//card-demo.component.ts
import { Component } from '@angular/core';
+import { CardComponent, CardBodyComponent, CardImgTopDirective } from '@abp/ng.theme.shared';
@Component({
selector: 'app-card-demo',
+ imports: [CardComponent, CardBodyComponent, CardImgTopDirective],
template: `
-
Some quick example text to build on the card title and make up the bulk of the card's content.
+
+ Some quick example text to build on the card title and make up the bulk of the card's content.
+
`,
})
-export class CardDemoComponent { }
+export class CardDemoComponent {}
```
See the card image result below:
@@ -123,9 +123,11 @@ See the card image result below:
//card-demo.component.ts
import { Component } from '@angular/core';
+import { CardComponent } from '@abp/ng.theme.shared';
@Component({
selector: 'app-card-demo',
+ imports: [CardComponent],
template: `
@@ -136,7 +138,7 @@ import { Component } from '@angular/core';
`,
})
-export class CardDemoComponent { }
+export class CardDemoComponent {}
```
See the group list result below:
@@ -148,15 +150,29 @@ See the group list result below:
//card-demo.component.ts
import { Component } from '@angular/core';
+import {
+ CardComponent,
+ CardBodyComponent,
+ CardImgTopDirective,
+ CardTitleDirective
+} from '@abp/ng.theme.shared';
@Component({
selector: 'app-card-demo',
+ imports: [
+ CardComponent,
+ CardBodyComponent,
+ CardImgTopDirective,
+ CardTitleDirective
+ ],
template: `
Card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
+
+ Some quick example text to build on the card title and make up the bulk of the card's content.
+
An item
@@ -170,7 +186,7 @@ import { Component } from '@angular/core';
`,
})
-export class CardDemoComponent { }
+export class CardDemoComponent {}
```
See kitchen sink result below:
@@ -182,15 +198,31 @@ See kitchen sink result below:
//card-demo.component.ts
import { Component } from '@angular/core';
+import {
+ CardComponent,
+ CardHeaderComponent,
+ CardBodyComponent,
+ CardTitleDirective,
+ CardFooterComponent
+} from '@abp/ng.theme.shared';
@Component({
selector: 'app-card-demo',
+ imports: [
+ CardComponent,
+ CardHeaderComponent,
+ CardBodyComponent,
+ CardTitleDirective,
+ CardFooterComponent
+ ],
template: `
Featured
Special title treatment
-
With supporting text below as a natural lead-in to additional content.
+
+ With supporting text below as a natural lead-in to additional content.
+
Go somewhere
@@ -199,7 +231,7 @@ import { Component } from '@angular/core';
`,
})
-export class CardDemoComponent { }
+export class CardDemoComponent {}
```
See the header and footer result below:
diff --git a/docs/en/framework/ui/angular/chart-component.md b/docs/en/framework/ui/angular/chart-component.md
index e2bf2c2e1e..44007eef5b 100644
--- a/docs/en/framework/ui/angular/chart-component.md
+++ b/docs/en/framework/ui/angular/chart-component.md
@@ -6,34 +6,16 @@ ABP Chart component exposed by `@abp/ng.components/chart.js` is based on [`chart
## How to Use
-First of all, need to import the `ChartModule` to your feature module as follows:
-
-```ts
-// your-feature.module.ts
-
-import { ChartModule } from "@abp/ng.components/chart.js";
-import { ChartDemoComponent } from "./chart-demo.component";
-
-@NgModule({
- imports: [
- ChartModule,
- // ...
- ],
- declarations: [ChartDemoComponent],
- // ...
-})
-export class YourFeatureModule {}
-```
-
-Then, `abp-chart` component can be used. See an example:
+First of all, need to import the `ChartComponent` to your component. Then, `abp-chart` component can be used. See an example:
```ts
// chart-demo.component.ts
-
import { Component } from "@angular/core";
+import { ChartComponent } from "@abp/ng.components/chart.js";
@Component({
selector: "app-chart-demo",
+ imports: [ChartComponent],
template: ` `,
})
export class ChartDemoComponent {
@@ -62,9 +44,11 @@ See the result:
```ts
import { Component } from "@angular/core";
+import { ChartComponent } from "@abp/ng.components/chart.js";
@Component({
selector: "app-chart-demo",
+ imports: [ChartComponent],
template: `
+ />
`,
})
export class ChartDemoComponent {
@@ -119,16 +103,18 @@ Result:
```ts
import { Component } from "@angular/core";
+import { ChartComponent } from "@abp/ng.components/chart.js";
@Component({
selector: "app-chart-demo",
+ imports: [ChartComponent]
template: `
+ />
`,
})
export class ChartDemoComponent {
@@ -158,16 +144,18 @@ Result:
```ts
import { Component } from "@angular/core";
+import { ChartComponent } from "@abp/ng.components/chart.js";
@Component({
selector: "app-chart-demo",
+ imports: [ChartComponent]
template: `
+ />