From 473908245976f20d55f97e265bb84c6c428efc70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sven=20G=C3=BCnther?= Date: Sun, 14 Sep 2025 15:00:19 +0200 Subject: [PATCH 1/3] add paging to activity import dialog --- .../import-activities-dialog.component.ts | 13 ++++++++++++- .../import-activities-dialog.html | 4 +++- .../activities-table/activities-table.component.ts | 9 +++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts index b1794cb4a..03fc52af1 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -36,6 +36,7 @@ import { } from '@angular/material/dialog'; import { MatExpansionModule } from '@angular/material/expansion'; import { MatFormFieldModule } from '@angular/material/form-field'; +import { PageEvent } from '@angular/material/paginator'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSelectModule } from '@angular/material/select'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -90,8 +91,9 @@ export class GfImportActivitiesDialog implements OnDestroy { public holdings: PortfolioPosition[] = []; public importStep: ImportStep = ImportStep.UPLOAD_FILE; public isLoading = false; - public maxSafeInteger = Number.MAX_SAFE_INTEGER; public mode: 'DIVIDEND'; + public pageIndex = 0; + public pageSize = 10; public selectedActivities: Activity[] = []; public sortColumn = 'date'; public sortDirection: SortDirection = 'desc'; @@ -237,6 +239,7 @@ export class GfImportActivitiesDialog implements OnDestroy { this.activities = activities; this.dataSource = new MatTableDataSource(activities.reverse()); this.totalItems = activities.length; + this.pageIndex = 0; aStepper.next(); @@ -244,10 +247,16 @@ export class GfImportActivitiesDialog implements OnDestroy { }); } + public onPageChanged(event: PageEvent) { + this.pageIndex = event.pageIndex; + // Client-side pagination - no need to refetch data as all activities are in memory + } + public onReset(aStepper: MatStepper) { this.details = []; this.errorMessages = []; this.importStep = ImportStep.SELECT_ACTIVITIES; + this.pageIndex = 0; this.assetProfileForm.get('assetProfileIdentifier').enable(); aStepper.reset(); @@ -339,6 +348,7 @@ export class GfImportActivitiesDialog implements OnDestroy { this.activities = activities; this.dataSource = new MatTableDataSource(activities.reverse()); this.totalItems = activities.length; + this.pageIndex = 0; } catch (error) { console.error(error); this.handleImportError({ error, activities: content.activities }); @@ -357,6 +367,7 @@ export class GfImportActivitiesDialog implements OnDestroy { this.activities = data.activities; this.dataSource = new MatTableDataSource(data.activities.reverse()); this.totalItems = data.activities.length; + this.pageIndex = 0; } catch (error) { console.error(error); this.handleImportError({ diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html index 6b048e6c0..819293800 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -127,7 +127,8 @@ [hasPermissionToFilter]="false" [hasPermissionToOpenDetails]="false" [locale]="data?.user?.settings?.locale" - [pageSize]="maxSafeInteger" + [pageIndex]="pageIndex" + [pageSize]="pageSize" [showActions]="false" [showCheckbox]="true" [showSymbolColumn]="false" @@ -135,6 +136,7 @@ [sortDirection]="sortDirection" [sortDisabled]="true" [totalItems]="totalItems" + (pageChanged)="onPageChanged($event)" (selectedActivities)="updateSelection($event)" /> } diff --git a/libs/ui/src/lib/activities-table/activities-table.component.ts b/libs/ui/src/lib/activities-table/activities-table.component.ts index b38af615e..9ad3cf387 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.ts @@ -168,6 +168,10 @@ export class GfActivitiesTableComponent } public ngAfterViewInit() { + if (this.dataSource && this.paginator) { + this.dataSource.paginator = this.paginator; + } + this.sort.sortChange.subscribe((value: Sort) => { this.sortChanged.emit(value); }); @@ -206,6 +210,11 @@ export class GfActivitiesTableComponent if (this.dataSource) { this.isLoading = false; + + // Connect paginator when dataSource changes + if (this.paginator) { + this.dataSource.paginator = this.paginator; + } } } From d84383965c41a952b3a71f78d07adac7177a5831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sven=20G=C3=BCnther?= Date: Tue, 16 Sep 2025 08:34:27 +0200 Subject: [PATCH 2/3] added changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79389d1f6..6126647aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +- added paging to ImportAcitivitiesDialog + ### Added - Added a _Storybook_ story for the entity logo image component From f06603d228c56e0da00b2ee0852d76d24353ed32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sven=20G=C3=BCnther?= Date: Wed, 17 Sep 2025 10:22:47 +0200 Subject: [PATCH 3/3] applied feedback * changelog: add the category ### Added and harmonize with the style of the other entries * rearranged lines of code in import activities dialog component * changed parameter type for onPageChangedEvent handler * removed comments * removed defensive checks --- CHANGELOG.md | 4 +++- .../import-activities-dialog.component.ts | 11 +++++------ .../activities-table/activities-table.component.ts | 9 +-------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53b8de8c9..ec985b776 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -- added paging to ImportAcitivitiesDialog +### Added + +- Added paging of activities to import acitivities dialog ### Changed diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts index 03fc52af1..0e574d1b6 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -238,8 +238,8 @@ export class GfImportActivitiesDialog implements OnDestroy { .subscribe(({ activities }) => { this.activities = activities; this.dataSource = new MatTableDataSource(activities.reverse()); - this.totalItems = activities.length; this.pageIndex = 0; + this.totalItems = activities.length; aStepper.next(); @@ -247,9 +247,8 @@ export class GfImportActivitiesDialog implements OnDestroy { }); } - public onPageChanged(event: PageEvent) { - this.pageIndex = event.pageIndex; - // Client-side pagination - no need to refetch data as all activities are in memory + public onPageChanged({ pageIndex }: PageEvent) { + this.pageIndex = pageIndex; } public onReset(aStepper: MatStepper) { @@ -347,8 +346,8 @@ export class GfImportActivitiesDialog implements OnDestroy { }); this.activities = activities; this.dataSource = new MatTableDataSource(activities.reverse()); - this.totalItems = activities.length; this.pageIndex = 0; + this.totalItems = activities.length; } catch (error) { console.error(error); this.handleImportError({ error, activities: content.activities }); @@ -366,8 +365,8 @@ export class GfImportActivitiesDialog implements OnDestroy { }); this.activities = data.activities; this.dataSource = new MatTableDataSource(data.activities.reverse()); - this.totalItems = data.activities.length; this.pageIndex = 0; + this.totalItems = data.activities.length; } catch (error) { console.error(error); this.handleImportError({ diff --git a/libs/ui/src/lib/activities-table/activities-table.component.ts b/libs/ui/src/lib/activities-table/activities-table.component.ts index 9ad3cf387..3c6dd8072 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.ts @@ -168,9 +168,7 @@ export class GfActivitiesTableComponent } public ngAfterViewInit() { - if (this.dataSource && this.paginator) { - this.dataSource.paginator = this.paginator; - } + this.dataSource.paginator = this.paginator; this.sort.sortChange.subscribe((value: Sort) => { this.sortChanged.emit(value); @@ -210,11 +208,6 @@ export class GfActivitiesTableComponent if (this.dataSource) { this.isLoading = false; - - // Connect paginator when dataSource changes - if (this.paginator) { - this.dataSource.paginator = this.paginator; - } } }