From 50a2402956b2a5bdea76158e8b39dea4add21db1 Mon Sep 17 00:00:00 2001 From: Abhinegi2 Date: Tue, 5 May 2026 13:12:06 +0530 Subject: [PATCH 1/4] added download indicator --- .../export-dialog.component.html | 12 +++++- .../export-dialog/export-dialog.component.ts | 38 +++++++++++++------ src/app/core/export/query.service.ts | 2 +- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/app/core/export/export-dialog/export-dialog.component.html b/src/app/core/export/export-dialog/export-dialog.component.html index bcef35a6dd..3c15f7cdc0 100644 --- a/src/app/core/export/export-dialog/export-dialog.component.html +++ b/src/app/core/export/export-dialog/export-dialog.component.html @@ -3,6 +3,10 @@

+@if (isLoading()) { + +} +

Format

-
diff --git a/src/app/core/export/export-dialog/export-dialog.component.ts b/src/app/core/export/export-dialog/export-dialog.component.ts index 2ee774aa6a..3992d9b706 100644 --- a/src/app/core/export/export-dialog/export-dialog.component.ts +++ b/src/app/core/export/export-dialog/export-dialog.component.ts @@ -10,8 +10,10 @@ import { MatDialogRef, } from "@angular/material/dialog"; import { MatButtonModule } from "@angular/material/button"; +import { MatProgressBarModule } from "@angular/material/progress-bar"; import { MatRadioModule } from "@angular/material/radio"; import { FormsModule } from "@angular/forms"; +import { AlertService } from "../../alerts/alert.service"; import { DialogCloseComponent } from "../../common-components/dialog-close/dialog-close.component"; import { DownloadService, @@ -41,6 +43,7 @@ export interface ExportDialogData { imports: [ MatDialogModule, MatButtonModule, + MatProgressBarModule, MatRadioModule, FormsModule, DialogCloseComponent, @@ -51,21 +54,34 @@ export class ExportDialogComponent { inject>(MatDialogRef); data = inject(MAT_DIALOG_DATA); private readonly downloadService = inject(DownloadService); + private readonly alertService = inject(AlertService); format = signal("csv"); scope = signal<"filtered" | "all">("filtered"); + isLoading = signal(false); async download() { - const exportData = - this.data.filteredData && this.scope() === "filtered" - ? this.data.filteredData - : this.data.allEntities; - await this.downloadService.triggerDownload( - exportData, - this.format(), - this.data.filename, - this.data.exportConfig, - ); - this.dialogRef.close(); + this.isLoading.set(true); + await new Promise((resolve) => setTimeout(resolve)); + try { + const exportData = + this.data.filteredData && this.scope() === "filtered" + ? this.data.filteredData + : this.data.allEntities; + await this.downloadService.triggerDownload( + exportData, + this.format(), + this.data.filename, + this.data.exportConfig, + ); + this.dialogRef.close(); + } catch (e) { + console.error("Export download failed:", e); + this.alertService.addWarning( + $localize`Failed to download export [${e instanceof Error ? e.message : e}]`, + ); + } finally { + this.isLoading.set(false); + } } } diff --git a/src/app/core/export/query.service.ts b/src/app/core/export/query.service.ts index 76e39a1ca2..fa1482ed77 100644 --- a/src/app/core/export/query.service.ts +++ b/src/app/core/export/query.service.ts @@ -280,7 +280,7 @@ export class QueryService { return ids .filter((id) => { - if (typeof id !== "string") { + if (typeof id !== "string" || !id) { console.debug("invalid entity id in Query :toEntities", id); return false; } From 09aa7e8249ffd0667ad2f717a0dde606729bea9d Mon Sep 17 00:00:00 2001 From: Abhinegi2 Date: Wed, 6 May 2026 11:21:37 +0530 Subject: [PATCH 2/4] fix the feedback --- .../export-dialog/export-dialog.component.html | 4 ++++ .../export/export-dialog/export-dialog.component.ts | 13 ++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/app/core/export/export-dialog/export-dialog.component.html b/src/app/core/export/export-dialog/export-dialog.component.html index 3c15f7cdc0..30c7306840 100644 --- a/src/app/core/export/export-dialog/export-dialog.component.html +++ b/src/app/core/export/export-dialog/export-dialog.component.html @@ -59,4 +59,8 @@

> Cancel + + @if (downloadError()) { + {{ downloadError() }} + } diff --git a/src/app/core/export/export-dialog/export-dialog.component.ts b/src/app/core/export/export-dialog/export-dialog.component.ts index 3992d9b706..df92a33827 100644 --- a/src/app/core/export/export-dialog/export-dialog.component.ts +++ b/src/app/core/export/export-dialog/export-dialog.component.ts @@ -10,10 +10,11 @@ import { MatDialogRef, } from "@angular/material/dialog"; import { MatButtonModule } from "@angular/material/button"; +import { MatFormFieldModule } from "@angular/material/form-field"; import { MatProgressBarModule } from "@angular/material/progress-bar"; import { MatRadioModule } from "@angular/material/radio"; import { FormsModule } from "@angular/forms"; -import { AlertService } from "../../alerts/alert.service"; +import { Logging } from "../../logging/logging.service"; import { DialogCloseComponent } from "../../common-components/dialog-close/dialog-close.component"; import { DownloadService, @@ -43,6 +44,7 @@ export interface ExportDialogData { imports: [ MatDialogModule, MatButtonModule, + MatFormFieldModule, MatProgressBarModule, MatRadioModule, FormsModule, @@ -54,14 +56,15 @@ export class ExportDialogComponent { inject>(MatDialogRef); data = inject(MAT_DIALOG_DATA); private readonly downloadService = inject(DownloadService); - private readonly alertService = inject(AlertService); format = signal("csv"); scope = signal<"filtered" | "all">("filtered"); isLoading = signal(false); + downloadError = signal(null); async download() { this.isLoading.set(true); + this.downloadError.set(null); await new Promise((resolve) => setTimeout(resolve)); try { const exportData = @@ -76,9 +79,9 @@ export class ExportDialogComponent { ); this.dialogRef.close(); } catch (e) { - console.error("Export download failed:", e); - this.alertService.addWarning( - $localize`Failed to download export [${e instanceof Error ? e.message : e}]`, + Logging.warn("Export download failed:", e); + this.downloadError.set( + $localize`Download failed [${e instanceof Error ? e.message : e}]`, ); } finally { this.isLoading.set(false); From 6beab52a85376be8c76e67e8a46e3d1a499731e7 Mon Sep 17 00:00:00 2001 From: Abhishek Negi Date: Wed, 6 May 2026 11:59:00 +0530 Subject: [PATCH 3/4] Update src/app/core/export/export-dialog/export-dialog.component.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/app/core/export/export-dialog/export-dialog.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/core/export/export-dialog/export-dialog.component.ts b/src/app/core/export/export-dialog/export-dialog.component.ts index df92a33827..7e01ba06b4 100644 --- a/src/app/core/export/export-dialog/export-dialog.component.ts +++ b/src/app/core/export/export-dialog/export-dialog.component.ts @@ -81,7 +81,7 @@ export class ExportDialogComponent { } catch (e) { Logging.warn("Export download failed:", e); this.downloadError.set( - $localize`Download failed [${e instanceof Error ? e.message : e}]`, + $localize`Download failed [${e instanceof Error ? e.message : String(e)}]`, ); } finally { this.isLoading.set(false); From 04c4019078228720a554380306b9adde4f26a3e6 Mon Sep 17 00:00:00 2001 From: Abhinegi2 Date: Wed, 6 May 2026 12:10:37 +0530 Subject: [PATCH 4/4] moved error position --- .../export/export-dialog/export-dialog.component.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/core/export/export-dialog/export-dialog.component.html b/src/app/core/export/export-dialog/export-dialog.component.html index 30c7306840..dd5682b94c 100644 --- a/src/app/core/export/export-dialog/export-dialog.component.html +++ b/src/app/core/export/export-dialog/export-dialog.component.html @@ -40,6 +40,10 @@

} +@if (downloadError()) { + {{ downloadError() }} +} +
- - @if (downloadError()) { - {{ downloadError() }} - }