Browse Source

Merge branch 'dev' into maliming/suite-react-code-generation-docs

pull/25795/head
Ma Liming 3 months ago
committed by GitHub
parent
commit
d70e01f1ec
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      common.props
  2. BIN
      docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/gifs/eventflow-calendar-kanban-flow.gif
  3. BIN
      docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/gifs/eventflow-custom-endpoint-flow.gif
  4. BIN
      docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/gifs/eventflow-grid-form-flow.gif
  5. BIN
      docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/gifs/eventflow-hero-loop.gif
  6. BIN
      docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/gifs/eventflow-page-builder.gif
  7. BIN
      docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/screenshots/abp-studio-lowcode-system.png
  8. BIN
      docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/screenshots/admin-console-lowcode.png
  9. BIN
      docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/screenshots/overview-dashboard.png
  10. BIN
      docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/screenshots/sponsor-activation-form.png
  11. BIN
      docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/cover.png
  12. 225
      docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/post.md
  13. 1
      docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/summary.md
  14. 3
      docs/en/framework/infrastructure/artificial-intelligence/index.md
  15. 6
      docs/en/framework/ui/angular/quick-start.md
  16. 116
      docs/en/framework/ui/angular/release-notes/angular-22-typescript-6.md
  17. 2
      docs/en/framework/ui/react-native/index.md
  18. 193
      docs/en/release-info/migration-guides/abp-10-6-angular-22.md
  19. 21
      docs/en/release-info/release-notes.md
  20. 70
      docs/en/release-info/road-map.md
  21. 74
      docs/en/samples/index.md
  22. 2
      docs/en/studio/overview.md
  23. 4
      docs/en/tutorials/mobile/index.md
  24. 2
      docs/en/tutorials/mobile/react-native/index.md
  25. 12
      modules/basic-theme/Volo.Abp.BasicTheme.abpmdl
  26. 1
      modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.MudBlazorBasicTheme/Volo.Abp.AspNetCore.Components.Server.MudBlazorBasicTheme.abppkg
  27. 1
      modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.MudBlazorBasicTheme/Volo.Abp.AspNetCore.Components.Web.MudBlazorBasicTheme.abppkg
  28. 1
      modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.MudBlazorBasicTheme/Volo.Abp.AspNetCore.Components.WebAssembly.MudBlazorBasicTheme.abppkg
  29. 2
      modules/cms-kit/angular/package.json
  30. 94
      npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.html
  31. 6
      npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts
  32. 19
      npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts

4
common.props

@ -1,8 +1,8 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<Version>10.6.0-rc.1</Version> <Version>10.7.0-preview</Version>
<LeptonXVersion>5.6.0-rc.1</LeptonXVersion> <LeptonXVersion>5.7.0-preview</LeptonXVersion>
<NoWarn>$(NoWarn);CS1591;CS0436</NoWarn> <NoWarn>$(NoWarn);CS1591;CS0436</NoWarn>
<PackageIconUrl>https://abp.io/assets/abp_nupkg.png</PackageIconUrl> <PackageIconUrl>https://abp.io/assets/abp_nupkg.png</PackageIconUrl>
<PackageProjectUrl>https://abp.io/</PackageProjectUrl> <PackageProjectUrl>https://abp.io/</PackageProjectUrl>

BIN
docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/gifs/eventflow-calendar-kanban-flow.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

BIN
docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/gifs/eventflow-custom-endpoint-flow.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 KiB

BIN
docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/gifs/eventflow-grid-form-flow.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

BIN
docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/gifs/eventflow-hero-loop.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

BIN
docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/gifs/eventflow-page-builder.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB

BIN
docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/screenshots/abp-studio-lowcode-system.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/screenshots/admin-console-lowcode.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/screenshots/overview-dashboard.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/assets/screenshots/sponsor-activation-form.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/cover.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

225
docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/post.md

@ -0,0 +1,225 @@
# Introducing ABP Low-Code: Build Real ABP Apps in Minutes
**Create runtime-managed pages, generated React screens, code-first C# entities, and Script API extensions without leaving the ABP application model.**
![ABP Low-Code runtime loop — grids, forms, calendars, and pipelines inside one ABP app](assets/gifs/eventflow-hero-loop.gif)
> **Want to try the same path?** Start from ABP Studio, enable the Low-Code runtime and designer, define pages in the Admin Console, and see them resolve inside the running ABP app.
---
## ABP Low-Code at a glance
| Runtime authoring | Generated screens | ABP-native extensibility | One application model |
| :---: | :---: | :---: | :---: |
| Define and update pages in the Admin Console | Grid, Form, Calendar, Kanban, Gallery, Dashboard | Code-first entities, Script API actions, and C# query paths | Runtime metadata, generated UI, and application code stay together |
---
## Built into the ABP Platform
Low-code is most useful when speed does not create a separate stack to maintain later.
That is where many low-code products start to strain. They move quickly at the beginning, then force a second implementation track when the app needs permissions, auditability, custom logic, or tighter integration with existing application code.
ABP Low-Code takes a different path. It runs **inside the ABP Platform**, so runtime-managed pages are part of an application foundation that already includes identity, permissions, audit logging, APIs, and code-level extensibility.
---
## Edit at runtime. See it in the app.
In the Low-Code Designer, you update a runtime-managed page. A few seconds later, the same application surface is visible in the live app. No rebuild loop. No parallel front-end implementation. No "we will wire it later" gap between authoring and runtime.
ABP Low-Code shortens the cycle from model change to running screen while keeping the output grounded in the same ABP application.
![ABP Low-Code designer workspace for a runtime page](assets/screenshots/admin-console-lowcode.png)
> **What this shows:** authoring and runtime are connected. Pages are defined in the designer and resolved in the running application.
---
## CRUD is table stakes
If low-code only saves you from drawing a table and a form, it is not enough. Business applications need richer operational surfaces.
In the generated app, the `Events` screen ships with search, actions, filters, and form-driven editing. The form structure already understands tabs, relations, validation, and business-shaped input instead of leaving you with a blank shell to finish by hand.
![Generated event grid and generated event form](assets/gifs/eventflow-grid-form-flow.gif)
The point is not just generated CRUD. It is generated CRUD that already looks like the operational screens teams maintain in real applications.
---
## One model, multiple operational screens
Business users do not think in one view. Operators want a calendar for scheduling, a kanban board for workflow, a grid for bulk operations, a gallery when media matters, and a dashboard when they need the state of the business at a glance.
ABP Low-Code keeps those surfaces attached to the same underlying model. The same `Session` model can appear as a **calendar** for planning and a **kanban pipeline** for operational flow. The same generated app can also include a **speaker gallery** and an **overview dashboard** for metrics.
![The same runtime model shown as calendar and kanban views](assets/gifs/eventflow-calendar-kanban-flow.gif)
![Overview dashboard in the live runtime app](assets/screenshots/overview-dashboard.png)
This is where ABP Low-Code starts to feel less like a form generator and more like a runtime application layer: one model, many working screens, no second implementation track for each view type.
---
## When low-code needs code
The real differentiator is not that ABP Low-Code can go fast. It is that **speed does not require isolation from the application foundation**.
When generated CRUD is not enough, you extend the same app instead of throwing the low-code layer away.
ABP Low-Code exposes a server-side **Script API** inside the same application model. That scripting surface can back:
- **Custom endpoints** when the UI needs an API-shaped response.
- **Interceptors** when create or update commands need validation or mutation.
- **Event handlers** when logic should react to runtime events.
- **Background jobs** when work should continue asynchronously.
- **Background workers** when operational logic should run on a schedule.
In this article, the visible proof happens to be `GET /api/custom/eventflow/highlights`. The GIF shows an endpoint because it is the easiest proof surface to read. But the broader point is that endpoints are only one consumer of the same low-code scripting layer.
That hybrid model matters in both directions:
- **Code-first ABP entities can be surfaced in low-code flows and runtime pages.**
- **Low-code-managed data and screens stay reachable from Script API actions, application services, repository queries, and custom endpoints.**
- **Teams do not lose architectural control just because they gained a faster authoring layer.**
![Endpoint result and runtime dashboard reading the same numbers](assets/gifs/eventflow-custom-endpoint-flow.gif)
The actual capability is the shared ABP application model behind it: script when runtime logic is enough, C# when typed application services and repository queries are the better fit.
This is the difference between "low-code as a shortcut" and "low-code as part of your application platform."
---
## From code-first entity to generated page
The first direction is code-first to low-code. A **code-first** `SponsorActivation` entity checked into the ASP.NET Core project can still become a working runtime page without forking into a separate low-code-only model.
The code-first entity carries the same metadata that ABP Low-Code uses to generate the page:
```csharp
[DynamicEntity(DefaultDisplayPropertyName = nameof(CompanyName))]
[DynamicEntityUI("Sponsor Activations")]
[DynamicEntityAttachments("application/pdf", "image/*", MaxFileCount = 4)]
public class SponsorActivation : DynamicEntityBase
{
[Required]
[DynamicPropertyUI(DisplayName = "Sponsor")]
public string CompanyName { get; private set; }
[Required]
[EmailAddress]
[DynamicPropertyUI(DisplayName = "Contact Email")]
public string ContactEmail { get; private set; }
public SponsorActivationStatus Status { get; set; }
[DynamicForeignKey("EventFlow.Events.Event", "Title")]
public Guid? EventId { get; set; }
[DynamicForeignKey("Volo.Abp.Identity.IdentityUser", nameof(IdentityUser.UserName), ForeignAccess.View)]
public Guid? OwnerUserId { get; set; }
[DynamicPropertyType(EntityPropertyType.Money)]
public decimal ActivationBudget { get; set; }
[DynamicPropertyImageOptions("image/png", "image/jpeg")]
public string? BrandLogo { get; set; }
[DynamicPropertyFileOptions("application/pdf", ".pptx", ".docx")]
public string? ActivationBrief { get; set; }
}
```
That class lives as normal C# source, gets migrated like the rest of the application, and is seeded with real records so the runtime page does not open as an empty shell.
Inside the designer, selecting the `SponsorActivation` entity auto-generates the page identity, binds the grid to the entity, and lands on a real runtime route at `/dynamic/sponsor-activation`. The generated surface includes sponsor, email, event lookup, owner lookup, budget, image, and file fields directly from the C# model.
![ABP Low-Code selecting the SponsorActivation C# entity, generating the page, and opening the resulting runtime surface](assets/gifs/eventflow-page-builder.gif)
![Generated SponsorActivation form showing lookups, budget, image, and file fields coming directly from the C# entity](assets/screenshots/sponsor-activation-form.png)
That is the distinction that matters: code-first ABP entities can move through low-code without becoming throwaway artifacts, and low-code-generated surfaces remain part of the same application story.
---
## Low-code data stays reachable from C#
The bridge also works in the other direction. A normal ABP application service can query a low-code model through `IRepository<DynamicEntity, Guid>`, apply real filters, and combine that result with code-first aggregates.
The service behind the endpoint in the previous section looks like this:
```csharp
public async Task<EventFlowLowCodeProofDto> GetHybridSummaryAsync()
{
var liveSessionQuery = (await _dynamicEntityRepository
.SetEntityName("EventFlow.Events.Session")
.GetQueryableAsync())
.Where("int(it[\"Status\"]) == @0", 2);
var publicSessionQuery = liveSessionQuery
.Where("bool(it[\"IsPublic\"]) == @0", true);
var sponsorQuery = (await _sponsorActivationRepository.GetQueryableAsync())
.Where(activation =>
activation.Status == SponsorActivationStatus.Approved ||
activation.Status == SponsorActivationStatus.Live);
var liveSessionCount = await AsyncExecuter.CountAsync(liveSessionQuery);
var publicSessionCount = await AsyncExecuter.CountAsync(publicSessionQuery);
var activeSponsorActivationCount = await AsyncExecuter.CountAsync(sponsorQuery);
return new EventFlowLowCodeProofDto
{
LiveSessionCount = liveSessionCount,
PublicSessionCount = publicSessionCount,
ActiveSponsorActivationCount = activeSponsorActivationCount
};
}
```
Here, low-code-managed `Session` rows are filtered from C# with real `Where(...)` clauses, then combined with the typed `SponsorActivation` repository. The endpoint and dashboard are just one presentation surface for that shared ABP query path.
That is the ABP difference: low-code data stays reachable from code, and code-first entities stay reachable from low-code.
---
## Why ABP Low-Code matters
The value is not novelty. It is a faster way to build real business applications without separating speed from the application foundation.
- **Speed without replatforming.** Runtime-managed screens reduce delivery time without moving the team onto a separate application stack.
- **Governance without friction.** Permissions, identity, auditability, and ABP platform foundations stay part of the story from day one.
- **Extensibility without rewrite pressure.** When custom behavior shows up, the same application can be extended instead of replacing the low-code output.
That is the core ABP Low-Code promise: faster delivery, still inside the application model you can extend.
---
## Try it yourself
The public starting point for ABP Low-Code is **ABP Studio**.
![ABP Studio new solution wizard with the Low-Code runtime and designer option enabled](assets/screenshots/abp-studio-lowcode-system.png)
1. Open **ABP Studio** and create a new solution.
2. In the solution wizard, enable **Include Low-Code runtime and designer**.
3. Complete the wizard, then run the generated backend and React UI from the solution.
4. Sign in with the administrator account created for that solution.
5. Open **Admin Console** to define runtime-managed entities, forms, pages, permissions, endpoints, and script actions.
6. Switch to the application side to see those changes resolve live in the running app.
---
## Further reading
- [ABP Low-Code Designer Documentation](https://abp.io/docs/latest/low-code/designer)
- [ABP Low-Code Configuration & Fluent API](https://abp.io/docs/latest/low-code/fluent-api)
- [ABP Low-Code Scripting API](https://abp.io/docs/latest/low-code/scripting-api)
- [ABP Low-Code Script Actions](https://abp.io/docs/latest/low-code/script-actions)
- [ABP Low-Code Interceptors](https://abp.io/docs/latest/low-code/interceptors)
- [ABP Studio Documentation](https://abp.io/docs/latest/studio)
- [Get Started with ABP: Creating a Layered Web Application](https://abp.io/docs/latest/get-started/layered-web-application)

1
docs/en/Community-Articles/2026-07-07-introducing-abp-low-code/summary.md

@ -0,0 +1 @@
Discover how ABP Low-Code blends runtime page building with code-first entities, C# queries, and extensible application logic.

3
docs/en/framework/infrastructure/artificial-intelligence/index.md

@ -10,6 +10,8 @@ ABP Framework provides integration for AI capabilities to your application by us
ABP introduces a concept called **AI Workspace**. A workspace allows you to configure isolated AI configurations for a named scope. You can then resolve AI services for a specific workspace when you need to use them. ABP introduces a concept called **AI Workspace**. A workspace allows you to configure isolated AI configurations for a named scope. You can then resolve AI services for a specific workspace when you need to use them.
If you want to see AI-assisted delivery used on a real application, take a look at [Hanova & Habitly](../../../samples/index.md#hanova--habitly), which were built with the ABP Studio AI Agent.
> ABP Framework can work with any AI library or framework that supports .NET development. However, the AI integration features explained in the following documents provide a modular and standard way to work with AI, which allows ABP developers to create reusable modules and components with AI capabilities in a standard way. > ABP Framework can work with any AI library or framework that supports .NET development. However, the AI integration features explained in the following documents provide a modular and standard way to work with AI, which allows ABP developers to create reusable modules and components with AI capabilities in a standard way.
## Installation ## Installation
@ -37,4 +39,3 @@ Check the following documentation to learn how to use these libraries with the A
- [ABP Microsoft.Extensions.AI integration](./microsoft-extensions-ai.md) - [ABP Microsoft.Extensions.AI integration](./microsoft-extensions-ai.md)
- [ABP Microsoft.Agents.AI (Agent Framework) integration](./microsoft-agent-framework.md) - [ABP Microsoft.Agents.AI (Agent Framework) integration](./microsoft-agent-framework.md)
- [ABP Microsoft.SemanticKernel integration](./microsoft-semantic-kernel.md) - [ABP Microsoft.SemanticKernel integration](./microsoft-semantic-kernel.md)

6
docs/en/framework/ui/angular/quick-start.md

@ -1,19 +1,19 @@
```json ```json
//[doc-seo] //[doc-seo]
{ {
"Description": "Learn how to set up your development environment for ABP Angular 21.x with this quick start guide, ensuring a smooth development experience." "Description": "Learn how to set up your development environment for ABP Angular 22.0.x with this quick start guide, ensuring a smooth development experience."
} }
``` ```
# ABP Angular Quick Start # ABP Angular Quick Start
**In this version ABP uses Angular [21.2.x](https://github.com/angular/angular/tree/21.2.x) version. You don't have to install Angular CLI globally** **In this version ABP uses Angular [22.0.x](https://github.com/angular/angular/tree/22.0.x) version. You don't have to install Angular CLI globally**
## How to Prepare Development Environment ## How to Prepare Development Environment
Please follow the steps below to prepare your development environment for Angular. Please follow the steps below to prepare your development environment for Angular.
1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js `v20.19+` installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system. 1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js `^22.22.3 || ^24.15.0 || ^26.0.0` installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system.
2. **[Optional] Install Yarn:** You may install Yarn v1.22+ (not v2) following the instructions on [the installation page](https://classic.yarnpkg.com/en/docs/install). Yarn v1 delivers an arguably better developer experience compared to npm v10 and below. You may skip this step and work with npm, which is built-in in Node.js, instead. 2. **[Optional] Install Yarn:** You may install Yarn v1.22+ (not v2) following the instructions on [the installation page](https://classic.yarnpkg.com/en/docs/install). Yarn v1 delivers an arguably better developer experience compared to npm v10 and below. You may skip this step and work with npm, which is built-in in Node.js, instead.
3. **[Optional] Install VS Code:** [VS Code](https://code.visualstudio.com/) is a free, open-source IDE which works seamlessly with TypeScript. Although you can use any IDE including Visual Studio or Rider, VS Code will most likely deliver the best developer experience when it comes to Angular projects. ABP project templates even contain plugin recommendations for VS Code users, which VS Code will ask you to install when you open the Angular project folder. Here is a list of recommended extensions: 3. **[Optional] Install VS Code:** [VS Code](https://code.visualstudio.com/) is a free, open-source IDE which works seamlessly with TypeScript. Although you can use any IDE including Visual Studio or Rider, VS Code will most likely deliver the best developer experience when it comes to Angular projects. ABP project templates even contain plugin recommendations for VS Code users, which VS Code will ask you to install when you open the Angular project folder. Here is a list of recommended extensions:
- [Angular Language Service](https://marketplace.visualstudio.com/items?itemName=angular.ng-template) - [Angular Language Service](https://marketplace.visualstudio.com/items?itemName=angular.ng-template)

116
docs/en/framework/ui/angular/release-notes/angular-22-typescript-6.md

@ -0,0 +1,116 @@
```json
//[doc-seo]
{
"Description": "Upgrade your ABP solutions to Angular version 22.0.x"
}
```
# Release Notes: Angular 22 and TypeScript 6 Upgrade
## Overview
This release updates ABP Angular UI applications to:
* Angular `22.x`
* TypeScript `6.x`
This upgrade aligns ABP projects with the latest Angular ecosystem and provides access to the newest framework improvements while ensuring long-term maintainability and support.
## What's Changed
### 1. Frontend Stack Upgrades
The core frontend stack has been updated:
* `@angular/*` packages have been upgraded to version 22
* `typescript` has been upgraded to version 6
* ABP and ABP Commercial npm packages must be upgraded to the corresponding ABP release line (version 10.6)
### 2. Change Detection Behavior
Angular 22 introduces updated change detection behavior.
* Components without explicit change detection configuration now follow OnPush-style behavior by default
* Some existing pages may no longer update automatically after asynchronous operations
* UI state should be managed using Angular Signals or the `async` pipe where appropriate
### 3. Stricter Type and Template Checks
Angular 22 and TypeScript 6 introduce additional compile-time validations.
* More template and type-related issues may be reported during builds
* Existing assumptions around nullable values and optional properties may require additional guards or type refinements
* Applications with strict template checking enabled may require code updates
### 4. Upload Progress Handling
Applications that rely on file upload progress events may require additional HTTP client configuration.
* Browser-side HTTP configuration may need `withXhr()` enabled to ensure upload progress events are emitted correctly
### 5. Chart Update Behavior
Chart components may require additional updates when used with asynchronous data sources.
* Under OnPush-style change detection, chart updates may not be detected automatically
* Consider using Signals for chart data bindings
* Calling `reinit()` after asynchronous data updates may be necessary in some scenarios
## Required Actions
### 1. Upgrade Related Packages Together
Keep Angular, TypeScript, ABP, and ABP Commercial packages on compatible versions.
To use Angular 22:
* Angular: `22.x`
* TypeScript: `6.x`
* ABP Framework: `10.6.x`
### 2. Review UI State Management
Review pages that depend on asynchronous state updates, including:
* List and table data
* Loading and busy indicators
* Modal dialog state
* Dashboard and chart data
Consider migrating these scenarios to Angular Signals or the `async` pipe.
### 3. Apply a Temporary TypeScript Compatibility Setting (If Needed)
If your project uses `downlevelIteration`, you may temporarily add the following configuration:
```json
{
"ignoreDeprecations": "6.0"
}
```
This can help ease the migration process while addressing TypeScript 6 deprecation warnings.
### 4. Perform Regression Testing
We recommend validating all critical application flows after upgrading, including:
* Authentication and account management pages
* CRUD list and detail pages
* Permission and feature management dialogs
* File upload workflows
* Dashboard and chart components
## Areas to Validate Carefully
Pay particular attention to the following scenarios:
* Busy or loading indicators not updating correctly
* Modal open/close state inconsistencies
* List pages not refreshing after asynchronous operations
* Upload progress events not being emitted
* Charts rendering without data after API responses
## References
* Detailed migration guide: [Upgrade ABP to 10.6](../../../../release-info/migration-guides/abp-10-6-angular-22.md)

2
docs/en/framework/ui/react-native/index.md

@ -69,6 +69,8 @@ abp new MyCompanyName.MyProjectName -csf -u <angular or mvc> -m react-native
This command creates a solution containing an **Angular** or **MVC** project (depending on your choice), a **.NET Core** project, and a **React Native** project. This command creates a solution containing an **Angular** or **MVC** project (depending on your choice), a **.NET Core** project, and a **React Native** project.
If you want to see the modern React Native template as a finished product, the [Habitly sample](../../../samples/index.md#hanova--habitly) is a good reference point.
## Run the Application ## Run the Application
You can choose how you want to run the mobile app: You can choose how you want to run the mobile app:

193
docs/en/release-info/migration-guides/abp-10-6-angular-22.md

@ -0,0 +1,193 @@
```json
//[doc-seo]
{
"Description": "Upgrade your ABP solutions to Angular version 22.0.x"
}
```
# Angular 22 and ABP 10.6 Upgrade Guide
This guide explains how to upgrade ABP Angular applications to **Angular 22** and **TypeScript 6**.
## 1. Target Versions
Update all frontend dependencies together to maintain compatibility:
- `@angular/*` → `~22.0.0`
- `typescript` → `~6.0.0`
- `@abp/*` → corresponding ABP version (10.6)
- `@volo/*`, `@volosoft/*` (if applicable) → corresponding ABP version (10.6)
- `angular-oauth2-oidc` (if applicable) → `~22.0.0`
Avoid mixing Angular 21 and Angular 22 packages within the same workspace.
## 2. Prerequisites
Before starting the upgrade:
1. Use a Node.js version supported by Angular 22.
2. Ensure your backend ABP version is compatible with the frontend package versions you plan to install.
3. Commit or back up your current project state.
## 3. Upgrade Process
1. Update package versions in `package.json`.
2. Run the Angular or Nx migration commands applicable to your project.
3. Remove existing installation artifacts:
- Delete `node_modules`
- Delete the lock file (`package-lock.json`, `yarn.lock`, or `pnpm-lock.yaml`)
4. Reinstall all dependencies.
5. Build the application and resolve any compilation or template errors.
## 4. Required Changes
### 4.1 TypeScript 6 Deprecation Handling
Projects that still use `downlevelIteration: true` may encounter TypeScript 6 deprecation diagnostics.
Add the following temporary setting to your root `tsconfig` file (and library production configurations if required):
```json
{
"compilerOptions": {
"downlevelIteration": true,
"ignoreDeprecations": "6.0"
}
}
```
As a long-term solution, remove `downlevelIteration` when your target runtime environment no longer requires it.
### 4.2 Updated Change Detection Behavior
Angular 22 introduces updated change detection behavior for components that do not explicitly configure a change detection strategy.
Common symptoms include:
- Loading indicators not updating
- Modal busy states not clearing
- Lists or charts not refreshing after asynchronous operations
Recommended approaches:
1. Use `signal()` for component state.
2. Use `toSignal()` when consuming observable streams.
3. Use the `async` pipe for observable-based UI state.
4. Use `ChangeDetectionStrategy.Eager` only as a temporary compatibility measure for legacy components.
### 4.3 ABP List Pages (`ListService`)
When working with `ListService`, prefer converting observable results to signals instead of manually subscribing.
```typescript
readonly data = toSignal(
this.list.hookToQuery(query => this.service.getList(query)),
{ initialValue: { items: [], totalCount: 0 } },
);
```
Update template bindings accordingly:
- `data.items` → `data().items`
- `data.totalCount` → `data().totalCount`
### 4.4 Modals and Loading States
For components such as `abp-modal`, `abp-button`, and permission or feature management dialogs, maintain state using signals.
```typescript
readonly isModalVisible = signal(false);
readonly modalBusy = signal(false);
```
```html
<abp-button [loading]="modalBusy()" />
<abp-modal
[visible]="isModalVisible()"
(visibleChange)="isModalVisible.set($event)"
[busy]="modalBusy()"
/>
```
If you use `*abpReplaceableTemplate`, pass signal values through `inputs.value` and update state through the corresponding event callbacks.
### 4.5 Template Type Checking
Angular 22 enables `strictTemplates` by default.
Resolve template typing issues where possible, or temporarily disable strict template checking:
```json
{
"angularCompilerOptions": {
"strictTemplates": false
}
}
```
Common adjustments include:
- Updating optional chaining (`?.`) and null coalescing (`??`) usage
- Guarding optional form references before binding
- Resolving duplicate input or output bindings
### 4.6 Upload Progress Events
Applications that rely on upload progress events should include the XHR backend in browser-side HTTP configuration:
```typescript
provideHttpClient(withFetch(), withXhr());
```
Do not enable the XHR backend in server-side rendering (SSR) bootstrap code.
### 4.7 Chart Components (`abp-chart`)
If charts do not update after asynchronous data loading:
- Store chart data in a signal
- Bind chart inputs using signal values (for example, `[data]="chartData()"`)
- Call `reinit()` after assigning new data rather than relying solely on `refresh()`
## 5. Custom or Forked UI Modules
If your project contains customized copies of ABP modules such as Identity, Tenant Management, Account, or CMS Kit:
1. Compare your implementation with the updated package versions.
2. Apply the recommended signal-based state management patterns.
3. Re-test CRUD pages, permission dialogs, feature dialogs, and account-related workflows.
## 6. Validation Checklist
After completing the upgrade, verify that:
- Dependencies are installed correctly without duplicate Angular versions
- The application builds successfully
- Unit tests pass (if applicable)
- Login, registration, and password recovery workflows function correctly
- CRUD list pages refresh as expected
- Modal loading and busy states behave correctly
- Permission and feature dialogs open and close correctly
- Upload progress events work as expected (if applicable)
- Dashboard charts render correctly after data is loaded
## 7. Troubleshooting
| Symptom | Likely Cause | Resolution |
| ----------------------------------------------------------------- | ----------------------------------------- | ----------------------------------------------------------- |
| Form type conflicts (`AbstractControl`, etc.) | Multiple Angular versions installed | Align package versions and perform a clean reinstall |
| TypeScript deprecation errors related to `downlevelIteration` | TypeScript 6 diagnostics | Add `ignoreDeprecations: "6.0"` temporarily |
| Errors involving optional configuration or environment properties | Stricter type checking | Add null checks and optional chaining where appropriate |
| DTO or library compilation issues | Type incompatibilities in DTO definitions | Prefer interfaces and optional properties where appropriate |
| Upload progress events are not emitted | Missing XHR backend configuration | Add `withXhr()` to browser-side HTTP configuration |
| Charts remain empty after data loads | State changes are not being detected | Use signals and call `reinit()` after updating chart data |
## 8. Summary
When upgrading to Angular 22, focus on the following areas:
1. Upgrade Angular, TypeScript, ABP, and commercial packages together.
2. Update UI state management to use signals, `toSignal()`, or the `async` pipe where appropriate.
3. Resolve TypeScript 6 and template type-checking issues.
4. Validate critical application workflows, including modals, list pages, uploads, and chart components.

21
docs/en/release-info/release-notes.md

@ -1,7 +1,7 @@
```json ```json
//[doc-seo] //[doc-seo]
{ {
"Description": "Explore the latest ABP Framework release notes, highlighting major features and enhancements for each version, including migration guidance." "Description": "Explore the latest ABP Framework release notes, highlighting major features and enhancements for each version, including migration guidance."
} }
``` ```
@ -14,9 +14,19 @@ Also see the following notes about ABP releases:
- [ABP Studio release notes](../studio/release-notes.md) - [ABP Studio release notes](../studio/release-notes.md)
- [Change logs for ABP pro packages](https://abp.io/pro-releases) - [Change logs for ABP pro packages](https://abp.io/pro-releases)
## 10.6 (2026-07-07)
See the detailed **[blog post / announcement](https://abp.io/community/announcements/announcing-abp-10-6-release-candidate-reoq6kzw)** for the v10.6 release.
- Background Jobs: Dedicated Workers, Parallel Execution, and Successful Job Retention
- API Definition and Proxy Improvements for Content Types and Multipart Uploads
- Angular UI: Angular has been upgraded to version 22. For a complete list of changes, including breaking changes, migration steps, and package updates, see the **[Angular Release Notes for v10.6](./../framework/ui/angular/release-notes/angular-22-typescript-6.md)**.
- Antiforgery and OpenIddict Security Improvements
- OpenIddict: Generate Access Token from the UI
## 10.5 (2026-06-30) ## 10.5 (2026-06-30)
See the detailed **[blog post / announcement](https://abp.io/community/articles/announcing-abp-10-5-release-candidate-k6oxdfle)** for the v10.5 release. See the detailed **[blog post / announcement](https://abp.io/community/announcements/announcing-abp-10-5-stable-release-2u589bsc)** for the v10.5 release.
- S3-Compatible Blob Storage Support - S3-Compatible Blob Storage Support
- OpenIddict: Default Scope Fallback Options - OpenIddict: Default Scope Fallback Options
@ -46,7 +56,7 @@ See the detailed **[blog post / announcement](https://abp.io/community/announcem
- Event Bus: String-Based Event Publishing with Dynamic Payload - Event Bus: String-Based Event Publishing with Dynamic Payload
- Background Jobs/Workers: String-Based Publishing with Dynamic Payload - Background Jobs/Workers: String-Based Publishing with Dynamic Payload
- API Definition Endpoint: Descriptions and Documentation Support - API Definition Endpoint: Descriptions and Documentation Support
- Entity Cache: New Batch APIs (`FindMany`* / `GetMany*`) - Entity Cache: New Batch APIs (`FindMany`_ / `GetMany_`)
- Angular: User/Tenant Sharing and Tenant Switch Experience - Angular: User/Tenant Sharing and Tenant Switch Experience
- Angular: Upgrade to 21.2 + TypeScript 5.9 - Angular: Upgrade to 21.2 + TypeScript 5.9
- Introducing the `Volo.Abp.LuckyPenny.AutoMapper` Provider - Introducing the `Volo.Abp.LuckyPenny.AutoMapper` Provider
@ -457,7 +467,7 @@ See the detailed **blog post / announcement** for the v2.8 release: [https://abp
## 2.7 (2020-05-07) ## 2.7 (2020-05-07)
See the detailed **blog post / announcement** for the v2.7 release: [https://abp.io/blog/ABP-Framework-v2_7_0-Has-Been-Released](https://abp.io/blog/ABP-Framework-v2_7_0-Has-Been-Released) See the detailed **blog post / announcement** for the v2.7 release: [https://abp.io/blog/ABP-Framework-v2_7_0-Has-Been-Released](https://abp.io/blog/ABP-Framework-v2_7_0-Has-Been-Released)
- New module: **Text template management** (with angular and mvc UI - document is [coming](../modules/text-template-management.md)). - New module: **Text template management** (with angular and mvc UI - document is [coming](../modules/text-template-management.md)).
- **Dynamically add properties** to current entities of the depended modules (see [module entity extensions](../framework/architecture/modularity/extending/module-entity-extensions.md)) - **Dynamically add properties** to current entities of the depended modules (see [module entity extensions](../framework/architecture/modularity/extending/module-entity-extensions.md))
@ -468,9 +478,8 @@ See the detailed **blog post / announcement** for the v2.7 release: [https://ab
- **Optimize database migrations** & seed code for multi-tenant multi-database systems. - **Optimize database migrations** & seed code for multi-tenant multi-database systems.
- ABP Suite: Make **menu item active** on navigation menu when selected. - ABP Suite: Make **menu item active** on navigation menu when selected.
- ABP Suite: Improve **enum usage** while creating new entities. - ABP Suite: Improve **enum usage** while creating new entities.
- Bug fixes in the [Lepton Theme](https://abp.io/themes), [ABP Suite](https://abp.io/tools/suite) and other modules. - Bug fixes in the [Lepton Theme](https://abp.io/themes), [ABP Suite](https://abp.io/tools/suite) and other modules.
## See Also ## See Also
- [Road map](road-map.md) - [Road map](road-map.md)

70
docs/en/release-info/road-map.md

@ -1,7 +1,7 @@
```json ```json
//[doc-seo] //[doc-seo]
{ {
"Description": "Explore the ABP Platform Road Map for insights on upcoming features, release schedules, and improvements in version 10.5, planned for June 2026." "Description": "Explore the ABP Platform Road Map for insights on upcoming features, release schedules, and improvements in version 10.7, planned for August 2026."
} }
``` ```
@ -11,28 +11,29 @@ This document provides a road map, release schedule, and planned features for th
## Next Versions ## Next Versions
### v10.6 ### v10.7
The next planned version will be 10.6, which is scheduled to be released as a stable version in July 2026. We will be mostly working on the following topics: The next planned version will be 10.7, which is scheduled to be released as a stable version in August 2026. Based on the currently open issues and pull requests across the ABP ecosystem, we will be mostly working on the following topics:
* Framework * Framework
* Token verification improvements with refresh token support and distributed locking * Cookie authentication: refresh token support and distributed locking ([#25011](https://github.com/abpframework/abp/issues/25011))
* Angular UI fixes and proxy generation improvements * jQuery 4.x upgrade, or removing jQuery as a dependency ([#25123](https://github.com/abpframework/abp/issues/25123))
* Better handling for extra properties, object mapping and auditing edge cases * AI agent skills distributed as versioned plugins ([#25712](https://github.com/abpframework/abp/issues/25712))
* Hybrid UI / page embedding infrastructure * Hybrid UI / page embedding infrastructure ([#23102](https://github.com/abpframework/abp/issues/23102), [#23161](https://github.com/abpframework/abp/issues/23161))
* Upgrading 3rd-party dependencies and evaluating replacements where needed * Microsoft Agent Framework migration and native agent skills support ([#24310](https://github.com/abpframework/abp/issues/24310), [#25194](https://github.com/abpframework/abp/issues/25194))
* General bug fixing and improvements in core framework packages * Better ExtraProperties mapping for EF Core ([#23546](https://github.com/abpframework/abp/issues/23546))
* Upgrading 3rd-party dependencies and general bug fixing in core framework packages
* ABP Suite * ABP Suite
* Improvements on generated codes for nullability * Replace the templating system with Scriban while preserving backward compatibility
* Improvements on master-detail page design (making it more compact) * Support for additional property types like `DateTimeOffset`, `TimeSpan` and numeric enums
* Display names and ordering for properties and navigation properties
* Filter on inherited properties and namespace-based UI foldering
* Low-Code system integration * Low-Code system integration
* Better support for additional property types like `DateTimeOffset`, `TimeSpan` and numeric enum scenarios * Improvements on generated code nullability, master-detail pages and file upload experiences
* Improvements for generated file upload, navigation property and display-name experiences
* ABP Studio * ABP Studio
* AI Coding Agent and MCP integration * Low-Code platform integration
* Modern solution wizard improvements and low-code support
* Theme Builder: live preview, project integration and import/export * Theme Builder: live preview, project integration and import/export
* Linux support and packaging improvements * Linux support and packaging improvements
* Better React / React Native / Thin UI template experience * Better React / React Native / Thin UI template experience
@ -41,11 +42,12 @@ The next planned version will be 10.6, which is scheduled to be released as a st
* Terminal, browser and built-in developer productivity enhancements * Terminal, browser and built-in developer productivity enhancements
* Application Modules * Application Modules
* AI Management: chat history, multi-tenancy and tenant-scoped workspace capabilities * AI Management: chat history
* AI Management: multi-tenancy and tenant-scoped workspace capabilities
* RAG: Cloudflare `/crawl` endpoint as a data source
* New module: Chat with your data * New module: Chat with your data
* Low-Code designer and low-code platform integrations
* CMS Kit and public website improvements
* Payment module e-mail notification improvements * Payment module e-mail notification improvements
* CMS Kit and public website improvements
* UI/UX improvements on existing application modules * UI/UX improvements on existing application modules
* Updating existing tutorials & documents (with other UI & DB options) * Updating existing tutorials & documents (with other UI & DB options)
@ -61,42 +63,46 @@ The *Next Versions* section above shows the main focus of the planned versions.
The ABP framework is [open source](https://github.com/abpframework/abp) and free for everyone. You can see its [public backlog](https://github.com/abpframework/abp/milestone/2). Here are some of the selected backlog items and longer-term topics: The ABP framework is [open source](https://github.com/abpframework/abp) and free for everyone. You can see its [public backlog](https://github.com/abpframework/abp/milestone/2). Here are some of the selected backlog items and longer-term topics:
* [#23102](https://github.com/abpframework/abp/issues/23102) / ABP Hybrid UI System: Re-using module UIs in different technologies * [#23102](https://github.com/abpframework/abp/issues/23102) / ABP Hybrid UI System: Re-using module UIs in different technologies
* [#23161](https://github.com/abpframework/abp/issues/23161) / Page Embedding Feature (aka Hybrid UI)
* [#25123](https://github.com/abpframework/abp/issues/25123) / Upgrade jQuery to 4.x, or consider removing it as dependency * [#25123](https://github.com/abpframework/abp/issues/25123) / Upgrade jQuery to 4.x, or consider removing it as dependency
* [#24742](https://github.com/abpframework/abp/issues/24742) / Add Support for LiteDB as a Database Provider * [#17093](https://github.com/abpframework/abp/issues/17093) / MVC UI: decouple jQuery
* [#24442](https://github.com/abpframework/abp/issues/24442) / Add Couchbase EF Core Provider Integration
* [#24310](https://github.com/abpframework/abp/issues/24310) / Migrate Volo.Abp.AI Semantic Kernel to Microsoft Agent Framework * [#24310](https://github.com/abpframework/abp/issues/24310) / Migrate Volo.Abp.AI Semantic Kernel to Microsoft Agent Framework
* [#25194](https://github.com/abpframework/abp/issues/25194) / Integrate Microsoft.Agents.AI for native Agent Skills support
* [#23575](https://github.com/abpframework/abp/issues/23575) / Support list/enumerable of complex types for ABP dynamic/static C# proxies on GET requests * [#23575](https://github.com/abpframework/abp/issues/23575) / Support list/enumerable of complex types for ABP dynamic/static C# proxies on GET requests
* [#23546](https://github.com/abpframework/abp/issues/23546) / Better ExtraProperties mapping for EF Core * [#23546](https://github.com/abpframework/abp/issues/23546) / Better ExtraProperties mapping for EF Core
* [#23935](https://github.com/abpframework/abp/issues/23935) / Hybrid Cache Support for EntityCache * [#23935](https://github.com/abpframework/abp/issues/23935) / Hybrid Cache Support for EntityCache
* [#22931](https://github.com/abpframework/abp/issues/22931) / Angular - Support dynamic URLs for breadcrumbs * [#22931](https://github.com/abpframework/abp/issues/22931) / Angular - Support dynamic URLs for breadcrumbs
* [#25032](https://github.com/abpframework/abp/issues/25032) / Guidance and infrastructure considerations for gRPC-based scenarios * [#24742](https://github.com/abpframework/abp/issues/24742) / Add Support for LiteDB as a Database Provider
* [#2882](https://github.com/abpframework/abp/issues/2882) / Providing a gRPC integration infrastructure * [#24442](https://github.com/abpframework/abp/issues/24442) / Add Couchbase EF Core Provider Integration
* [#57](https://github.com/abpframework/abp/issues/57) / Built-in CQRS infrastructure * [#2882](https://github.com/abpframework/abp/issues/2882) / ABP gRPC Integration
* [#57](https://github.com/abpframework/abp/issues/57) / CQRS infrastructure
* [#58](https://github.com/abpframework/abp/issues/58) / Content localization system (multilingual entities) * [#58](https://github.com/abpframework/abp/issues/58) / Content localization system (multilingual entities)
* [#4223](https://github.com/abpframework/abp/issues/4223) / WebHook system * [#4223](https://github.com/abpframework/abp/issues/4223) / WebHook System
* [#162](https://github.com/abpframework/abp/issues/162) / Azure ElasticDB integration for multitenancy * [#162](https://github.com/abpframework/abp/issues/162) / Azure ElasticDB Integration for multitenancy
* [#2296](https://github.com/abpframework/abp/issues/2296) / Feature toggling infrastructure * [#2296](https://github.com/abpframework/abp/issues/2296) / Implementing Feature Toggle
* [#15932](https://github.com/abpframework/abp/issues/15932) / Introduce ABP Diagnostics Module * [#15932](https://github.com/abpframework/abp/issues/15932) / Introduce ABP Diagnostics Module
* [#16744](https://github.com/abpframework/abp/issues/16744) / State Management API * [#16744](https://github.com/abpframework/abp/issues/16744) / State Management API
* [#119](https://github.com/abpframework/abp/issues/119) / REST API versioning improvements * [#119](https://github.com/abpframework/abp/issues/119) / REST API Versioning Improvements
* [#2087](https://github.com/abpframework/abp/issues/2087) / RavenDB database support * [#2087](https://github.com/abpframework/abp/issues/2087) / Add RavenDB Database support
### Application Modules / UI Themes ### Application Modules / UI Themes
ABP Platform provides many (free and commercial) [pre-built application modules](../modules/index.md) and modern [UI themes](../ui-themes/index.md). In every release, many enhancements and bugfixes are delivered for these modules and themes. Important backlog topics currently include: ABP Platform provides many (free and commercial) [pre-built application modules](../modules/index.md) and modern [UI themes](../ui-themes/index.md). In every release, many enhancements and bugfixes are delivered for these modules and themes. Important backlog topics currently include:
* AI Management module: chat history, multi-tenancy, tenant workspaces and operational hardening * AI Management module: chat history, multi-tenancy, tenant workspaces and operational hardening
* CMS Kit module: media gallery and richer public website capabilities * New module: Chat with your data
* RAG with external data sources such as website crawling
* Payment module: richer notifications and invoice-oriented scenarios * Payment module: richer notifications and invoice-oriented scenarios
* CMS Kit: Meta information for SEO
* Audit logging UI: filter redesign and UX improvements * Audit logging UI: filter redesign and UX improvements
* Identity Pro: richer filtering and organization-unit UX improvements * Identity Pro: richer filtering and organization-unit UX improvements
* LeptonX and existing UIs: new layouts, styles and usability refinements * LeptonX and existing UIs: new layouts, styles and usability refinements
* New module ideas: Chat with your data, AI Search, user notification and dynamic dashboard
### ABP Studio ### ABP Studio
[ABP Studio](../studio/index.md) is a cross-platform desktop application for ABP and .NET developers to simplify and automate daily tasks of developers. It has a community (free) edition as well as commercial capabilities. Here are some of the important planned features and active backlog topics for the next ABP Studio versions: [ABP Studio](../studio/index.md) is a cross-platform desktop application for ABP and .NET developers to simplify and automate daily tasks of developers. It has a community (free) edition as well as commercial capabilities. Here are some of the important planned features and active backlog topics for the next ABP Studio versions:
* Low-Code: ABP Studio Integration
* Theme builder for LeptonX, including live preview, management UI and project integration * Theme builder for LeptonX, including live preview, management UI and project integration
* Analyze user solutions to explore entities, domain services, application services, pages and other fundamental objects * Analyze user solutions to explore entities, domain services, application services, pages and other fundamental objects
* AI agent/browser capabilities and developer-assistant experiences * AI agent/browser capabilities and developer-assistant experiences
@ -107,16 +113,14 @@ ABP Platform provides many (free and commercial) [pre-built application modules]
* More options while creating new solutions, modules and services * More options while creating new solutions, modules and services
* Better environment-variable, deployment and Kubernetes experiences * Better environment-variable, deployment and Kubernetes experiences
* Compare changes on startup templates when a new ABP version is published * Compare changes on startup templates when a new ABP version is published
* Rapid application development and low-code oriented features
* ABP support integration and better diagnostics/error experiences * ABP support integration and better diagnostics/error experiences
### ABP Suite ### ABP Suite
[ABP Suite](../suite/index.md) is a GUI application that is mainly used to generate CRUD-style pages in your application. You define your entity and it can generate all the code from the database to the UI. Here are some of the important planned features for the next ABP Suite versions: [ABP Suite](../suite/index.md) is a GUI application that is mainly used to generate CRUD-style pages in your application. You define your entity and it can generate all the code from the database to the UI. Here are some of the important planned features for the next ABP Suite versions:
* Replace the current templating system with Scriban while preserving backward compatibility
* Better nullability support in generated code * Better nullability support in generated code
* MudBlazor support
* Replacing the current templating system with a text engine while preserving backward compatibility
* Support for additional property types like `DateTimeOffset` and `TimeSpan` * Support for additional property types like `DateTimeOffset` and `TimeSpan`
* Handle image properties for entities (in addition to file properties, which are already supported) * Handle image properties for entities (in addition to file properties, which are already supported)
* Allow to define display names and better ordering for properties and navigation properties * Allow to define display names and better ordering for properties and navigation properties

74
docs/en/samples/index.md

@ -1,7 +1,7 @@
```json ```json
//[doc-seo] //[doc-seo]
{ {
"Description": "Explore a variety of ABP Framework samples, complete with live demos, source code, and tutorials to enhance your development skills!" "Description": "Explore a variety of ABP Framework samples, complete with live demos, source code, and tutorials to enhance your development skills!"
} }
``` ```
@ -13,8 +13,8 @@ This document provides a list of samples built with ABP. Each sample is briefly
A reference application built with ABP. It implements the Domain Driven Design with multiple application layers. A reference application built with ABP. It implements the Domain Driven Design with multiple application layers.
* [Live demo](https://www.openeventhub.com/) - [Live demo](https://www.openeventhub.com/)
* [Source code](https://github.com/abpframework/eventhub) - [Source code](https://github.com/abpframework/eventhub)
![samples-event-hub](../images/samples-eventhub.png) ![samples-event-hub](../images/samples-eventhub.png)
@ -25,7 +25,7 @@ A reference application built with ABP. It implements the Domain Driven Design w
Reference microservice solution built with ABP and .NET. Reference microservice solution built with ABP and .NET.
* [Source code](https://github.com/abpframework/eShopOnAbp) - [Source code](https://github.com/abpframework/eShopOnAbp)
![eshoponabp](../images/samples-eshoponabp.png) ![eshoponabp](../images/samples-eshoponabp.png)
@ -33,8 +33,8 @@ Reference microservice solution built with ABP and .NET.
A minimal example website built with the [CMS Kit module](../modules/cms-kit/index.md). A minimal example website built with the [CMS Kit module](../modules/cms-kit/index.md).
* [Live demo](https://cms-kit-demo.abpdemo.com/) - [Live demo](https://cms-kit-demo.abpdemo.com/)
* [Source code](https://github.com/abpframework/cms-kit-demo) - [Source code](https://github.com/abpframework/cms-kit-demo)
![samples-cms-kit](../images/samples-cms-kit.png) ![samples-cms-kit](../images/samples-cms-kit.png)
@ -42,8 +42,8 @@ A minimal example website built with the [CMS Kit module](../modules/cms-kit/ind
A middle-size CRM application built with ABP. A middle-size CRM application built with ABP.
* [Live demo](http://easycrm.abp.io/) - [Live demo](http://easycrm.abp.io/)
* [Click here](easy-crm.md) to see the details and download the source code. - [Click here](easy-crm.md) to see the details and download the source code.
![samples-easy-crm](../images/samples-easycrm.png) ![samples-easy-crm](../images/samples-easycrm.png)
@ -51,20 +51,20 @@ A middle-size CRM application built with ABP.
A simple CRUD application to show basic principles of developing an application with ABP. The same sample was implemented with different technologies and different modules: A simple CRUD application to show basic principles of developing an application with ABP. The same sample was implemented with different technologies and different modules:
* **Book Store: Razor Pages UI & Entity Framework Core** - **Book Store: Razor Pages UI & Entity Framework Core**
* [Tutorial](../tutorials/book-store/part-01.md?UI=MVC&DB=EF) - [Tutorial](../tutorials/book-store/part-01.md?UI=MVC&DB=EF)
* [Source code](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) - [Source code](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* [Download source code (with PRO modules) *](https://abp.io/Account/Login?returnUrl=/api/download/samples/bookstore-mvc-ef) - [Download source code (with PRO modules) \*](https://abp.io/Account/Login?returnUrl=/api/download/samples/bookstore-mvc-ef)
* **Book Store: Blazor UI & Entity Framework Core** - **Book Store: Blazor UI & Entity Framework Core**
* [Tutorial](../tutorials/book-store/part-01.md?UI=Blazor&DB=EF) - [Tutorial](../tutorials/book-store/part-01.md?UI=Blazor&DB=EF)
* [Source code](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore) - [Source code](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Download source code (with PRO modules) *](https://abp.io/Account/Login?returnUrl=/api/download/samples/bookstore-blazor-efcore) - [Download source code (with PRO modules) \*](https://abp.io/Account/Login?returnUrl=/api/download/samples/bookstore-blazor-efcore)
* **Book Store: Angular UI & MongoDB** - **Book Store: Angular UI & MongoDB**
* [Tutorial](../tutorials/book-store/part-01.md?UI=NG&DB=Mongo) - [Tutorial](../tutorials/book-store/part-01.md?UI=NG&DB=Mongo)
* [Source code](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) - [Source code](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
* [Download source code (with PRO modules) *](https://abp.io/Account/Login?returnUrl=/api/download/samples/bookstore-angular-mongodb) - [Download source code (with PRO modules) \*](https://abp.io/Account/Login?returnUrl=/api/download/samples/bookstore-angular-mongodb)
* **Book Store: Modular application (Razor Pages UI & EF Core)** - **Book Store: Modular application (Razor Pages UI & EF Core)**
* [Source code](https://github.com/abpframework/abp-samples/tree/master/BookStore-Modular) - [Source code](https://github.com/abpframework/abp-samples/tree/master/BookStore-Modular)
If you want to create the BookStore application and generate CRUD pages automatically with ABP Suite, please refer to the [Book Store Application (with ABP Suite) tutorial](../tutorials/book-store-with-abp-suite/part-01.md). Also, you can follow the [Mobile Application Development Tutorials](../tutorials/mobile/index.md), if you want to implement the CRUD operations for [MAUI](../tutorials/mobile/maui/index.md) & [React Native](../tutorials/mobile/react-native/index.md) mobile applications. If you want to create the BookStore application and generate CRUD pages automatically with ABP Suite, please refer to the [Book Store Application (with ABP Suite) tutorial](../tutorials/book-store-with-abp-suite/part-01.md). Also, you can follow the [Mobile Application Development Tutorials](../tutorials/mobile/index.md), if you want to implement the CRUD operations for [MAUI](../tutorials/mobile/maui/index.md) & [React Native](../tutorials/mobile/react-native/index.md) mobile applications.
@ -74,9 +74,9 @@ If you want to create the BookStore application and generate CRUD pages automati
A modular monolith application that demonstrates how to create, compose, and communicate between application modules to build a modular web application: A modular monolith application that demonstrates how to create, compose, and communicate between application modules to build a modular web application:
* **ModularCRM: Razor Pages UI & Entity Framework Core** - **ModularCRM: Razor Pages UI & Entity Framework Core**
* [Tutorial](../tutorials/modular-crm/part-01.md?UI=MVC&DB=EF) - [Tutorial](../tutorials/modular-crm/part-01.md?UI=MVC&DB=EF)
* [Source code](https://github.com/abpframework/abp-samples/tree/master/ModularCRM) - [Source code](https://github.com/abpframework/abp-samples/tree/master/ModularCRM)
## CloudCrm ## CloudCrm
@ -84,13 +84,27 @@ A modular monolith application that demonstrates how to create, compose, and com
A microservice solution that shows how to start a new microservice solution, create services and communicate between these services. It's a reference tutorial to learn to use these services from a web application through an API gateway and automatically generate CRUD pages using the ABP Suite tool: A microservice solution that shows how to start a new microservice solution, create services and communicate between these services. It's a reference tutorial to learn to use these services from a web application through an API gateway and automatically generate CRUD pages using the ABP Suite tool:
* **CloudCRM: Razor Pages UI & Entity Framework Core** - **CloudCRM: Razor Pages UI & Entity Framework Core**
* [Tutorial](../tutorials/microservice/part-01.md?UI=MVC&DB=EF) - [Tutorial](../tutorials/microservice/part-01.md?UI=MVC&DB=EF)
* [Download source code](https://abp.io/api/download/samples/cloud-crm-mvc-ef) - [Download source code](https://abp.io/api/download/samples/cloud-crm-mvc-ef)
## Hanova & Habitly
> This sample application is available exclusively to users with an [ABP Business license or higher](https://abp.io/pricing).
Hanova and Habitly are production-ready sample applications generated from the ABP Studio templates using React and React Native. Their features were built using the [ABP Studio AI Agent](https://abp.io/docs/latest/studio/ai-agent), demonstrating how AI can accelerate the development of real-world applications.
- **[Hanova Source Code](https://abp.io/api/download/samples/Hanova)**
- **[Habitly Source Code](https://abp.io/api/download/samples/reactnative-efcore-psql-habitly)**
To learn more, see:
- [How the ABP AI Agent helps build production-ready applications](https://abp.io/community/articles/template-in-product-out-building-hanova-with-the-abp-ai-hcntpk3j#gsc.tab=0)
- [How we modernized React Native application development](https://abp.io/community/articles/new-abp-modern-react-native-template-rxjiyrpb#gsc.tab=0)
## Other Samples ## Other Samples
ABP Platform provides many sample applications demonstrating various use cases and integrations. You can: ABP Platform provides many sample applications demonstrating various use cases and integrations. You can:
* Browse all sample applications in the [abp-samples repository](https://github.com/abpframework/abp-samples). - Browse all sample applications in the [abp-samples repository](https://github.com/abpframework/abp-samples).
* Read detailed articles and tutorials in the [ABP Community](https://abp.io/community), which are shared by ABP Community & Contributors. - Read detailed articles and tutorials in the [ABP Community](https://abp.io/community), which are shared by ABP Community & Contributors.

2
docs/en/studio/overview.md

@ -112,6 +112,8 @@ Key features of the AI Agent include:
- **Attachments**: Attach supported files or images to provide task-specific context. - **Attachments**: Attach supported files or images to provide task-specific context.
- **Studio Integration**: Use enabled Studio tools for build, monitoring, applications, containers, tasks, proxies, migrations, and Git-related workflows. - **Studio Integration**: Use enabled Studio tools for build, monitoring, applications, containers, tasks, proxies, migrations, and Git-related workflows.
For a production example of this workflow in action, see the [Hanova & Habitly samples](../samples/index.md#hanova--habitly).
> **Note**: Review the Privacy Notice available in the AI Agent panel to understand how your data is handled. > **Note**: Review the Privacy Notice available in the AI Agent panel to understand how your data is handled.
For the technical AI Agent reference, see [ABP Studio: AI Agent](./ai-agent.md). For the technical AI Agent reference, see [ABP Studio: AI Agent](./ai-agent.md).

4
docs/en/tutorials/mobile/index.md

@ -11,6 +11,8 @@
Mobile application development tutorials are designed for developers who have completed [the web development part of the tutorial](../book-store/index.md) and wish to continue building the mobile version of the application. Mobile application development tutorials are designed for developers who have completed [the web development part of the tutorial](../book-store/index.md) and wish to continue building the mobile version of the application.
The React Native track follows the modernized ABP mobile template, and the [Habitly sample](../../samples/index.md#hanova--habitly) shows that stack in a production-ready app.
## Tutorials ## Tutorials
You can choose between two mobile applications: [**.NET MAUI**](../../framework/ui/maui/index.md) or [**React Native**](../../framework/ui/react-native/index.md). Choose your framework and continue building your mobile application! You can choose between two mobile applications: [**.NET MAUI**](../../framework/ui/maui/index.md) or [**React Native**](../../framework/ui/react-native/index.md). Choose your framework and continue building your mobile application!
@ -30,4 +32,4 @@ The .NET MAUI tutorial walks you through creating a mobile version of your books
The React Native tutorial provides instructions for building the bookstore app using JavaScript. The React Native tutorial provides instructions for building the bookstore app using JavaScript.
* [React Native - Mobile Application Tutorial](./react-native/index.md) * [React Native - Mobile Application Tutorial](./react-native/index.md)
* [Source Code](https://abp.io/Account/Login?returnUrl=/api/download/samples/bookstore-react-native-mongodb) * [Source Code](https://abp.io/Account/Login?returnUrl=/api/download/samples/bookstore-react-native-mongodb)

2
docs/en/tutorials/mobile/react-native/index.md

@ -18,6 +18,8 @@ The React Native mobile option is _available for_ **_Team_** _or higher licenses
- The mobile template was modernized in 2026: it now uses **NativeWind v4** (Tailwind CSS for React Native) for styling, **Bottom Tab navigation** by default, and the **Redux Toolkit** store with hook-based access (`useSelector` / `useDispatch`). The `connectToRedux` HOC, the `DrawerNavigator`, and the legacy `DataList`/`AbpSelect` components from earlier versions no longer ship with the template — this tutorial walks through building the new equivalents. - The mobile template was modernized in 2026: it now uses **NativeWind v4** (Tailwind CSS for React Native) for styling, **Bottom Tab navigation** by default, and the **Redux Toolkit** store with hook-based access (`useSelector` / `useDispatch`). The `connectToRedux` HOC, the `DrawerNavigator`, and the legacy `DataList`/`AbpSelect` components from earlier versions no longer ship with the template — this tutorial walks through building the new equivalents.
- Before starting, please make sure that the [React Native Development Environment](../../../framework/ui/react-native/index.md) is ready on your machine. - Before starting, please make sure that the [React Native Development Environment](../../../framework/ui/react-native/index.md) is ready on your machine.
If you'd like to inspect a complete implementation first, [Habitly](../../../samples/index.md#hanova--habitly) is the production-ready mobile sample that follows this modern template direction.
## Running the Application ## Running the Application
Before implementing UI changes, run the `Acme.BookStore` mobile application and verify that login works: Before implementing UI changes, run the `Acme.BookStore` mobile application and verify that login works:

12
modules/basic-theme/Volo.Abp.BasicTheme.abpmdl

@ -33,6 +33,18 @@
"Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests": { "Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests": {
"path": "test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.abppkg", "path": "test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.abppkg",
"folder": "test" "folder": "test"
},
"Volo.Abp.AspNetCore.Components.Server.MudBlazorBasicTheme": {
"path": "src/Volo.Abp.AspNetCore.Components.Server.MudBlazorBasicTheme/Volo.Abp.AspNetCore.Components.Server.MudBlazorBasicTheme.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Components.Web.MudBlazorBasicTheme": {
"path": "src/Volo.Abp.AspNetCore.Components.Web.MudBlazorBasicTheme/Volo.Abp.AspNetCore.Components.Web.MudBlazorBasicTheme.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Components.WebAssembly.MudBlazorBasicTheme": {
"path": "src/Volo.Abp.AspNetCore.Components.WebAssembly.MudBlazorBasicTheme/Volo.Abp.AspNetCore.Components.WebAssembly.MudBlazorBasicTheme.abppkg",
"folder": "src"
} }
} }
} }

1
modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.MudBlazorBasicTheme/Volo.Abp.AspNetCore.Components.Server.MudBlazorBasicTheme.abppkg

@ -0,0 +1 @@
{}

1
modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.MudBlazorBasicTheme/Volo.Abp.AspNetCore.Components.Web.MudBlazorBasicTheme.abppkg

@ -0,0 +1 @@
{}

1
modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.MudBlazorBasicTheme/Volo.Abp.AspNetCore.Components.WebAssembly.MudBlazorBasicTheme.abppkg

@ -0,0 +1 @@
{}

2
modules/cms-kit/angular/package.json

@ -15,7 +15,7 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@abp/ng.account": "~10.5.0", "@abp/ng.account": "~10.6.0-rc.1",
"@abp/ng.identity": "~10.6.0-rc.1", "@abp/ng.identity": "~10.6.0-rc.1",
"@abp/ng.setting-management": "~10.6.0-rc.1", "@abp/ng.setting-management": "~10.6.0-rc.1",
"@abp/ng.tenant-management": "~10.6.0-rc.1", "@abp/ng.tenant-management": "~10.6.0-rc.1",

94
npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.html

@ -1,55 +1,81 @@
@if (actionList.length > 1) { @if (actionList.length > 1) {
<div ngbDropdown container="body" class="d-inline-block"> <div ngbDropdown container="body" class="d-inline-block">
<button class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" ngbDropdownToggle> <button
<i [class]="icon()" [class.me-1]="icon()"></i>{{ text() | abpLocalization }} class="btn btn-primary btn-sm dropdown-toggle"
</button> data-toggle="dropdown"
<div ngbDropdownMenu> aria-haspopup="true"
@for (action of actionList; track action.text) { ngbDropdownToggle
<ng-container [ngTemplateOutlet]="dropDownBtnItemTmp" [ngTemplateOutletContext]="{ $implicit: action }"> >
</ng-container> <i [class]="icon()" [class.me-1]="icon()"></i>{{ text() | abpLocalization }}
} </button>
<div ngbDropdownMenu>
@for (action of actionList; track $index) {
<ng-container
[ngTemplateOutlet]="dropDownBtnItemTmp"
[ngTemplateOutletContext]="{ $implicit: action }"
/>
}
</div>
</div> </div>
</div>
} }
@if (actionList.length === 1) { @if (actionList.length === 1) {
<ng-container [ngTemplateOutlet]="btnTmp" <ng-container
[ngTemplateOutletContext]="{ $implicit: actionList.get(0).value }"></ng-container> [ngTemplateOutlet]="btnTmp"
[ngTemplateOutletContext]="{ $implicit: actionList.get(0).value }"
/>
} }
<ng-template #dropDownBtnItemTmp let-action> <ng-template #dropDownBtnItemTmp let-action>
@if (action.visible(data)) { @if (action.visible(data)) {
<button ngbDropdownItem *abpPermission="action.permission; runChangeDetection: false" (click)="action.action(data)" <button
type="button"> ngbDropdownItem
<ng-container *ngTemplateOutlet="buttonContentTmp; context: { $implicit: action }"></ng-container> *abpPermission="action.permission; runChangeDetection: false"
</button> (click)="action.action(data)"
type="button"
>
<ng-container *ngTemplateOutlet="buttonContentTmp; context: { $implicit: action }" />
</button>
} }
</ng-template> </ng-template>
<ng-template #buttonContentTmp let-action> <ng-template #buttonContentTmp let-action>
<i [class]="action.icon" [class.me-1]="action.icon && !action.showOnlyIcon"></i> <i [class]="action.icon" [class.me-1]="action.icon && !action.showOnlyIcon"></i>
@if (!action.showOnlyIcon) { @if (!action.showOnlyIcon) {
@if (action.icon) { @if (action.icon) {
<span>{{ action.text | abpLocalization }}</span> <span>{{ action.text | abpLocalization }}</span>
} @else { } @else {
<div abpEllipsis>{{ action.text | abpLocalization }}</div> <div abpEllipsis>{{ action.text | abpLocalization }}</div>
} }
} }
</ng-template> </ng-template>
<ng-template #btnTmp let-action> <ng-template #btnTmp let-action>
@if (action.visible(data)) { @if (action.visible(data)) {
@if (action.tooltip) { @if (action.tooltip) {
<button *abpPermission="action.permission; runChangeDetection: false" (click)="action.action(data)" type="button" <button
[class]="action.btnClass" [style]="action.btnStyle" [ngbTooltip]="action.tooltip.text | abpLocalization" *abpPermission="action.permission; runChangeDetection: false"
[placement]="action.tooltip.placement || 'auto'" triggers="hover" container="body"> (click)="action.action(data)"
<ng-container *ngTemplateOutlet="buttonContentTmp; context: { $implicit: action }"></ng-container> type="button"
</button> [class]="action.btnClass"
} @else { [style]="action.btnStyle"
<button *abpPermission="action.permission; runChangeDetection: false" (click)="action.action(data)" type="button" [ngbTooltip]="action.tooltip.text | abpLocalization"
[class]="action.btnClass" [style]="action.btnStyle"> [placement]="action.tooltip.placement || 'auto'"
<ng-container *ngTemplateOutlet="buttonContentTmp; context: { $implicit: action }"></ng-container> triggers="hover"
</button> container="body"
} >
<ng-container *ngTemplateOutlet="buttonContentTmp; context: { $implicit: action }" />
</button>
} @else {
<button
*abpPermission="action.permission; runChangeDetection: false"
(click)="action.action(data)"
type="button"
[class]="action.btnClass"
[style]="action.btnStyle"
>
<ng-container *ngTemplateOutlet="buttonContentTmp; context: { $implicit: action }" />
</button>
}
} }
</ng-template> </ng-template>

6
npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts

@ -9,7 +9,7 @@ import {
Type, Type,
ViewContainerRef, ViewContainerRef,
inject, inject,
input input,
} from '@angular/core'; } from '@angular/core';
import compare from 'just-compare'; import compare from 'just-compare';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
@ -30,7 +30,9 @@ export class ReplaceableTemplateDirective implements OnInit, OnChanges {
private replaceableComponents = inject(ReplaceableComponentsService); private replaceableComponents = inject(ReplaceableComponentsService);
private subscription = inject(SubscriptionService); private subscription = inject(SubscriptionService);
readonly data = input.required<ReplaceableComponents.ReplaceableTemplateDirectiveInput<any, any>>({ alias: "abpReplaceableTemplate" }); readonly data = input.required<ReplaceableComponents.ReplaceableTemplateDirectiveInput<any, any>>(
{ alias: 'abpReplaceableTemplate' },
);
providedData = { providedData = {
inputs: {}, inputs: {},

19
npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts

@ -3,11 +3,13 @@ import {
Component, Component,
computed, computed,
DOCUMENT, DOCUMENT,
effect,
inject, inject,
input, input,
output, output,
signal, signal,
TrackByFunction, TrackByFunction,
untracked,
} from '@angular/core'; } from '@angular/core';
import { NgStyle } from '@angular/common'; import { NgStyle } from '@angular/common';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
@ -224,6 +226,10 @@ export class PermissionManagementComponent {
} }
set visible(value: boolean) { set visible(value: boolean) {
this.setVisible(value);
}
private setVisible(value: boolean) {
if (value && this.isClosingModal) { if (value && this.isClosingModal) {
return; return;
} }
@ -303,6 +309,19 @@ export class PermissionManagementComponent {
this.disabledSelectAllInAllTabsState.set(false); this.disabledSelectAllInAllTabsState.set(false);
} }
// constructor() {
// effect(() => {
// this.setVisible(this.visibleInput());
// });
// }
constructor() {
effect(() => {
const visible = this.visibleInput();
untracked(() => this.setVisible(visible));
});
}
getChecked(name: string) { getChecked(name: string) {
return (this.permissionsState().find(per => per.name === name) || { isGranted: false }) return (this.permissionsState().find(per => per.name === name) || { isGranted: false })
.isGranted; .isGranted;

Loading…
Cancel
Save