From 7c8f6f792f8bb6a5c58aa7ef16021f3abbae32bc Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 16 Jul 2026 08:51:17 +0200 Subject: [PATCH] Migrate clone, create and edit activity dialogs to dedicated routes --- .../account-detail-dialog.component.ts | 15 ++++++++- .../holding-detail-dialog.component.ts | 15 +++++++-- .../activity-dialog-host.component.ts | 31 +++++++++++-------- libs/common/src/lib/routes/routes.ts | 2 -- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index fd1965b8b..ca5b1a6e3 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -40,6 +40,7 @@ import { PageEvent } from '@angular/material/paginator'; import { Sort, SortDirection } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; import { MatTabsModule } from '@angular/material/tabs'; +import { NavigationStart, Router } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; import { Big } from 'big.js'; import { format, parseISO } from 'date-fns'; @@ -51,7 +52,7 @@ import { } from 'ionicons/icons'; import { isNumber } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; -import { forkJoin } from 'rxjs'; +import { filter, forkJoin } from 'rxjs'; import { AccountDetailDialogParams } from './interfaces/interfaces'; @@ -112,9 +113,21 @@ export class GfAccountDetailDialogComponent implements OnInit { private readonly destroyRef = inject(DestroyRef); private readonly dialogRef = inject>(MatDialogRef); + private readonly router = inject(Router); private readonly userService = inject(UserService); public constructor() { + this.router.events + .pipe( + filter((event) => { + return event instanceof NavigationStart; + }), + takeUntilDestroyed(this.destroyRef) + ) + .subscribe(() => { + this.dialogRef.close(); + }); + this.userService.stateChanged .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((state) => { diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index e3c138d5b..43ba6edc0 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -63,7 +63,7 @@ import { PageEvent } from '@angular/material/paginator'; import { SortDirection } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; import { MatTabsModule } from '@angular/material/tabs'; -import { Router, RouterModule } from '@angular/router'; +import { NavigationStart, Router, RouterModule } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; import { Account, MarketData, Tag } from '@prisma/client'; import { isUUID } from 'class-validator'; @@ -80,7 +80,7 @@ import { } from 'ionicons/icons'; import { isNumber, round, uniqBy } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; -import { switchMap } from 'rxjs/operators'; +import { filter, switchMap } from 'rxjs/operators'; import { HoldingDetailDialogParams } from './interfaces/interfaces'; @@ -200,6 +200,17 @@ export class GfHoldingDetailDialogComponent implements OnInit { private readonly userService = inject(UserService); public constructor() { + this.router.events + .pipe( + filter((event) => { + return event instanceof NavigationStart; + }), + takeUntilDestroyed(this.destroyRef) + ) + .subscribe(() => { + this.dialogRef.close(); + }); + addIcons({ arrowDownCircleOutline, createOutline, diff --git a/apps/client/src/app/pages/portfolio/activities/activity-dialog-host/activity-dialog-host.component.ts b/apps/client/src/app/pages/portfolio/activities/activity-dialog-host/activity-dialog-host.component.ts index bde9f6f71..19e51eb41 100644 --- a/apps/client/src/app/pages/portfolio/activities/activity-dialog-host/activity-dialog-host.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/activity-dialog-host/activity-dialog-host.component.ts @@ -16,7 +16,7 @@ import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Observable, of } from 'rxjs'; -import { map, switchMap } from 'rxjs/operators'; +import { finalize, map, switchMap } from 'rxjs/operators'; import { GfCreateOrUpdateActivityDialogComponent } from '../create-or-update-activity-dialog/create-or-update-activity-dialog.component'; import { CreateOrUpdateActivityDialogParams } from '../create-or-update-activity-dialog/interfaces/interfaces'; @@ -106,22 +106,27 @@ export class GfActivityDialogHostComponent implements OnInit { .afterClosed() .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((result: CreateOrderDto | UpdateOrderDto | null) => { - if (result) { - const request$: Observable = isUpdate - ? this.dataService.putActivity(result as UpdateOrderDto) - : this.dataService.postActivity(result as CreateOrderDto); + if (!result) { + this.navigateBack(); + + return; + } - request$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({ + const request$: Observable = isUpdate + ? this.dataService.putActivity(result as UpdateOrderDto) + : this.dataService.postActivity(result as CreateOrderDto); + + request$ + .pipe( + finalize(() => { + this.navigateBack(); + }) + ) + .subscribe({ next: () => { - this.userService - .get(true) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(); + this.userService.get(true).subscribe(); } }); - } - - this.navigateBack(); }); } } diff --git a/libs/common/src/lib/routes/routes.ts b/libs/common/src/lib/routes/routes.ts index 4a2904187..ea6f216ea 100644 --- a/libs/common/src/lib/routes/routes.ts +++ b/libs/common/src/lib/routes/routes.ts @@ -127,7 +127,6 @@ export const internalRoutes = { routerLink: ['/portfolio', 'activities'], subRoutes: { clone: { - excludeFromAssistant: true, path: 'clone', title: $localize`Clone Activity` }, @@ -137,7 +136,6 @@ export const internalRoutes = { title: $localize`Add Activity` }, update: { - excludeFromAssistant: true, path: 'update', title: $localize`Update Activity` }