+
Depending on project size, the compilation may take a few minutes. When it is finished, the compiled output will be placed inside the _/dist_ folder. Voila! You have deployment-ready build artifacts.
diff --git a/docs/en/framework/ui/angular/settings.md b/docs/en/framework/ui/angular/settings.md
index dc352e96a1..28689ce5f4 100644
--- a/docs/en/framework/ui/angular/settings.md
+++ b/docs/en/framework/ui/angular/settings.md
@@ -7,7 +7,7 @@
# Settings
-You can get settings on the client-side using the [config state service](./config-state.md) if they are allowed by their setting definition on the server-side.
+You can get settings on the client-side using the [config state service](./config-state-service.md) if they are allowed by their setting definition on the server-side.
> This document only explains how settings work in the Angular UI projects. See the [settings document](../../infrastructure/settings.md) to understand the ABP setting system.
diff --git a/docs/en/framework/ui/angular/testing.md b/docs/en/framework/ui/angular/testing.md
index ab215f7eba..4ec5577f73 100644
--- a/docs/en/framework/ui/angular/testing.md
+++ b/docs/en/framework/ui/angular/testing.md
@@ -1,7 +1,7 @@
```json
//[doc-seo]
{
- "Description": "Learn how to unit test your ABP Angular UI applications with preconfigured Karma and Jasmine, plus ABP-specific testing topics."
+ "Description": "Learn how to unit test your ABP Angular UI applications with preconfigured Vitest and TestBed, plus ABP-specific testing topics."
}
```
@@ -9,89 +9,105 @@
ABP Angular UI is tested like any other Angular application. So, [the guide here](https://angular.dev/guide/testing) applies to ABP too. That said, we would like to point out some **unit testing topics specific to ABP Angular applications**.
-## Setup
+## Test Stack
-In Angular, unit tests use [Karma](https://karma-runner.github.io/) and [Jasmine](https://jasmine.github.io) by default. Although we like Jest more, we chose not to deviate from these defaults, so **the application template you download will have Karma and Jasmine preconfigured**. You can find the Karma configuration inside the _karma.conf.js_ file in the root folder. You don't have to do anything. Adding a spec file and running `npm test` will work.
+The application template you download is preconfigured for unit testing. You can add a `*.spec.ts` file and run `yarn test` without adding extra test infrastructure.
-## Basics
+| Package / API | Purpose |
+| --- | --- |
+| [Vitest](https://vitest.dev/) | Test runner and assertion library. |
+| [jsdom](https://github.com/jsdom/jsdom) | Browser-like DOM environment for component tests. |
+| `@angular/core/testing` (`TestBed`) | The standard testing utilities of Angular for components, services, and pipes. |
+| `@abp/ng.core/testing` | ABP testing module and helpers that replace real ABP services with mocks. |
+| `@abp/ng.theme.shared/testing` | Testing module for shared theme features such as validation. |
-An over-simplified spec file looks like this:
+ABP Angular packages in the [framework repository](https://github.com/abpframework/abp/tree/dev/npm/ng-packs) use the same Vitest setup. Library tests there also use [`@ngneat/spectator/vitest`](https://github.com/ngneat/spectator) for HTTP and component tests, but the application template uses `TestBed` directly.
-```js
-import { CoreTestingModule } from "@abp/ng.core/testing";
-import { ThemeBasicTestingModule } from "@abp/ng.theme.basic/testing";
-import { ThemeSharedTestingModule } from "@abp/ng.theme.shared/testing";
-import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing";
-import { NgxValidateCoreModule } from "@ngx-validate/core";
-import { MyComponent } from "./my.component";
+## Configuration
-describe("MyComponent", () => {
- let fixture: ComponentFixture
+
### Database Provider Options
@@ -84,7 +84,7 @@ ABP Platform provides tooling to help you in your daily development.
#### ABP CLI
-[ABP CLI](cli.md) is a command-line tool to create new solutions and automate the things with your ABP based solutions.
+[ABP CLI](./cli/index.md) is a command-line tool to create new solutions and automate the things with your ABP based solutions.
### Startup Templates
diff --git a/docs/en/modules/account.md b/docs/en/modules/account.md
index 3fc2c8e3aa..844e00e06f 100644
--- a/docs/en/modules/account.md
+++ b/docs/en/modules/account.md
@@ -43,6 +43,8 @@ Social/external login buttons becomes visible if you setup it. See the *Social/E

+> The host part of the password reset link is built from `AppUrlOptions.Applications["MVC"].RootUrl`. Configure it if the default `App:SelfUrl` isn't what you want users to see in emails — for example, when you use subdomain-based multi-tenancy and want the link to point to the tenant's subdomain. See [Application URLs](../framework/infrastructure/app-urls.md).
+
### Account Management
`/Account/Manage` page is used to change password and personal information of the user.
diff --git a/docs/en/modules/account/shared-user-accounts.md b/docs/en/modules/account/shared-user-accounts.md
index 6f028238c6..908b342de2 100644
--- a/docs/en/modules/account/shared-user-accounts.md
+++ b/docs/en/modules/account/shared-user-accounts.md
@@ -56,6 +56,8 @@ Users can leave a tenant. After leaving, the user is no longer a member of that
> When a user leaves and later re-joins the same tenant, the `UserId` does not change and tenant-related data (roles, permissions, etc.) is preserved.
+Tenant administrators with the `Identity.Users.Delete` permission can also remove a member from the tenant via the **Remove from tenant** action on the user list. This is a soft removal — the global account stays and the user can be re-invited later, exactly like the self-service Leave.
+
## Inviting Users to a Tenant
Tenant administrators can invite existing or not-yet-registered users to join a tenant. The invited user receives an email; clicking the link completes the join process. If the user doesn't have an account yet, they can register and join through the same flow.
@@ -156,9 +158,12 @@ The following operations can only be performed by a host administrator when Shar
- Enable or disable two-factor authentication
- Change `LockoutEnabled` or `ShouldChangePasswordOnNextLogin`
+> `Delete` here means deleting the **global user account**, not removing a user from a single tenant. Removing a member from one tenant is a tenant-level soft operation and is available to tenant administrators — see **Remove from tenant** below.
+
### What tenant admins can do
- Invite users to the tenant (see the Invitation flow above)
+- Remove users from the tenant (soft removal; the global account stays)
- Manage role and organization-unit assignments within the tenant
- View audit / security logs scoped to the tenant
@@ -172,4 +177,5 @@ If you plan to migrate an existing multi-tenant application from an isolated str
1. **Uniqueness check**: Before enabling Shared, ensure all existing usernames and emails are unique globally. ABP performs this check when you switch the strategy and reports conflicts.
2. **Tenants with separate databases**: If some tenants use separate databases, you must ensure the Host database contains matching user records in the `AbpUsers` table (and, if you use social login / passkeys, also sync `AbpUserLogins` and `AbpUserPasskeys`) so the Host-side records match the tenant-side data. After that, the framework can create/manage the user-to-tenant associations.
+ - **Important — each host-side shadow row must have a new primary key (`Id`) different from the tenant user's `Id`.** Generate a fresh `Guid` for every shadow row instead of reusing the tenant user's primary key. The framework relies on this to distinguish a separate-database tenant from a shared-database one; reusing the Id can mask "Leave Tenant" and external login / passkey synchronization on legacy data. The other identifying fields (`UserName`, `Email`, `PasswordHash`, `TenantId`, etc.) should still match the tenant-side row.
diff --git a/docs/en/modules/elsa-pro.md b/docs/en/modules/elsa-pro.md
index 6b93e42368..63e95bdb59 100644
--- a/docs/en/modules/elsa-pro.md
+++ b/docs/en/modules/elsa-pro.md
@@ -46,7 +46,7 @@ After adding the package references, open the module class of the project (e.g.:
### `AbpElsaAspNetCoreModule` and `AbpElsaIdentityModule`
-These two modules generally will be added to your authentication project. Please add `Volo.Elsa.Abp.AspNetCore` and `Volo.Elsa.Abp.Identity` packages to your project and add the `AbpElsaAspNetCoreModule` and `AbpElsaIdentityModule` to the `DependsOn` attribute of your module class based on your project structure:
+These two modules generally will be added to your authentication project. Please add `Volo.Abp.Elsa.AspNetCore` and `Volo.Abp.Elsa.Identity` packages to your project and add the `AbpElsaAspNetCoreModule` and `AbpElsaIdentityModule` to the `DependsOn` attribute of your module class based on your project structure:
```xml
+The React Native app is not started by the ABP Studio solution runner. Run `AuthServer`, `MobileGateway`, and the required backend services first, then start the mobile app with the standard React Native / Expo toolchain.
-
-### Profile Management
-
-Profile management allows users to view and update their personal profile picture and their passwords. It provides a seamless experience for users to manage their profiles within the mobile application without navigating to the authserver web application.
-
-The following screenshot was taken from the *Profile* page in the MAUI application:
-
-
-
-### Other Features
-
-#### Settings Page
-The settings page allows users to change the language and theme of the application, manage their profiles, change their passwords, and also to logout from the application.
-
-
-
-- **Language**: Applications implements ABP localization logic on the platforms. The language is automatically selected based on the device's language. Users can also change the language manually from the settings page.
-
-- **Dark/Light Theme**: ABP MAUI and React Native applications support both dark and light themes. The theme is automatically selected based on the device's theme. Users can also change the theme manually from the settings page.
-
-## Applications
-
-Following sections explain the structure of MAUI and React Native Applications.
-
-### The MAUI Application
-
-This is the mobile application that is built based on Microsoft's [MAUI framework](https://learn.microsoft.com/en-us/dotnet/maui). It will be in the solution only if you've selected the MAUI as your mobile application option.
-
-#### Project Structure
-Entire MAUI application is built on the AppShell pattern of MAUI. You can find the AppShell class in the `Acme.CloudCrm.Maui` project. It is the entry point of the application. It is responsible for initializing the application and registering the services. You find all the pages and routing information in the `AppShell.xaml` file.
-
-- **Pages**: Pages are located in the `Pages` folder of the project. Each page has a XAML & C# file. XAML file is responsible for the UI and C# file is responsible for the initialization of the page.
-
-- **ViewModels**: ViewModels are located in the `ViewModels` folder of the project. Each ViewModel has a C# file. ViewModels are responsible for the business logic of the pages.
-
-- **Oidc**: Oidc folder contains the logic for the authentication of the application. It contains the `MauiAuthenticationBrowser` class which manages the authentication process of the application.
-
-- **Localization**: Localization folder contains the localization logic of the application. It contains regular ABP Localization logic and the `LocalizationResourceManager` class which is wrapper for the ABP localization logic on MAUI.
-
-- **Messages**: Messages folder contains the message data for the communication inside application. Messages are used to send data between pages and viewmodels. It's designed on the [MVVM Toolkit Messenger](https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/messenger) feature.
-
-- **Storage**: Storage folder contains the storage logic of the application. It contains the `IStorage` class which is wrapper for the [SecureStorage](https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/storage/secure-storage) feature. It is used to store the authentication data of the user and preferences of the application.
-
-_Rest of the folders are MAUI default folders. You can check the [.NET MAUI single project documentatipon](https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/single-project?view=net-maui-8.0) for more information._
-
-#### Running the application
-Before running the MAUI Application, rest of the applications in the solution must be running. Such as AuthServer, MobileGateway and the microservices.
-
-Make sure that you prepared devices for debugging. You can check the following documentation for each platform.
-
-- [Android](https://learn.microsoft.com/en-us/dotnet/maui/android/emulator/)
-- [iOS](https://learn.microsoft.com/en-us/dotnet/maui/ios/pair-to-mac)
-- [MacCatalyst](https://learn.microsoft.com/en-us/dotnet/maui/mac-catalyst/cli)
-- [Windows](https://learn.microsoft.com/en-us/dotnet/maui/windows/setup)
-
-##### Network
-
-All the platforms including iOS, MacCataylst and Windows, runs the applications in the same network of the host. So, you can use the `localhost` address to connect to the applications.
-
-But in the **Android Emulator**, you need to use the `adb reverse` command to connect to the applications. You can use the following command to connect to the AuthServer application:
+For Android emulators or devices, map the development ports before testing:
```bash
-adb reverse tcp:44300 tcp:44300
+adb reverse tcp:Sorry, there's nothing at this address.
+