diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor
index 19f95ca52a..8c9087d9fc 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor
@@ -90,6 +90,7 @@
+
@if (HasSendTestEmailPermission)
diff --git a/npm/ng-packs/packages/core/src/lib/services/router-events.service.ts b/npm/ng-packs/packages/core/src/lib/services/router-events.service.ts
index 5e2db89899..f41dc9bf5e 100644
--- a/npm/ng-packs/packages/core/src/lib/services/router-events.service.ts
+++ b/npm/ng-packs/packages/core/src/lib/services/router-events.service.ts
@@ -1,4 +1,4 @@
-import { Injectable, Type } from '@angular/core';
+import { Injectable, Type, inject, signal } from '@angular/core';
import {
NavigationCancel,
NavigationEnd,
@@ -6,8 +6,10 @@ import {
NavigationStart,
Router,
RouterEvent,
- Event
+ Event,
+ RouterState,
} from '@angular/router';
+import { Observable } from 'rxjs';
import { filter } from 'rxjs/operators';
export const NavigationEvent = {
@@ -19,12 +21,34 @@ export const NavigationEvent = {
@Injectable({ providedIn: 'root' })
export class RouterEvents {
- constructor(private router: Router) {}
+ protected readonly router = inject(Router);
- getEvents(...eventTypes: T) {
+ readonly #previousNavigation = signal(undefined);
+ previousNavigation = this.#previousNavigation.asReadonly();
+
+ readonly #currentNavigation = signal(undefined);
+ currentNavigation = this.#currentNavigation.asReadonly();
+
+ constructor() {
+ this.listenToNavigation();
+ }
- const filterRouterEvents = (event: Event) =>
- eventTypes.some(type => event instanceof type);
+ protected listenToNavigation(): void {
+ (
+ this.router.events.pipe(
+ filter(e => e instanceof NavigationEvent.End && !e.url.includes('error')),
+ ) as Observable
+ ).subscribe(event => {
+ // It must be "NavigationTransition" but it is not exported in Angular
+ //https://github.com/angular/angular/blob/9c486c96827a9282cbdbff176761bc95554a260b/packages/router/src/navigation_transition.ts#L282
+
+ this.#previousNavigation.set(this.#currentNavigation());
+ this.#currentNavigation.set(event.url);
+ });
+ }
+
+ getEvents(...eventTypes: T) {
+ const filterRouterEvents = (event: Event) => eventTypes.some(type => event instanceof type);
return this.router.events.pipe(filter(filterRouterEvents));
}
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts
index 83002a3a88..9f2c24915d 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts
@@ -72,6 +72,15 @@ export class HttpErrorWrapperComponent implements OnInit, AfterViewInit, OnDestr
});
customComponentRef.instance.errorStatus = this.status;
+
+ //In our custom "HttpErrorComponent", we have a "status" property.
+ //We used to have "errorStatus", but it wasn't signal type. "status" variable is signal type.
+ //I've checked because of backward compatibility. Developers might have their own custom HttpErrorComponent.
+ //We need to deprecated and remove "errorStatus" in the future.
+ if (customComponentRef.instance.status) {
+ customComponentRef.instance.status.set(this.status);
+ }
+
customComponentRef.instance.destroy$ = this.destroy$;
this.appRef.attachView(customComponentRef.hostView);
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts
index 577af2bd9c..b946ba2639 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts
@@ -102,7 +102,7 @@ export class NgxDatatableListDirective implements OnChanges, OnInit, DoCheck {
}
protected refreshPageIfDataExist() {
- if (this.table.rows.length < 1 && this.table.count > 0) {
+ if (this.table.rows?.length < 1 && this.table.count > 0) {
let maxPage = Math.floor(Number(this.table.count / this.list.maxResultCount));
if (this.table.count < this.list.maxResultCount) {