diff --git a/frontend/src/app/compliance/compliance-latest-evaluations-view/components/compliance-latest-evaluation-view-detail/compliance-latest-evaluation-view-detail.component.html b/frontend/src/app/compliance/compliance-latest-evaluations-view/components/compliance-latest-evaluation-view-detail/compliance-latest-evaluation-view-detail.component.html index 4eeca19aa..5eec7521e 100644 --- a/frontend/src/app/compliance/compliance-latest-evaluations-view/components/compliance-latest-evaluation-view-detail/compliance-latest-evaluation-view-detail.component.html +++ b/frontend/src/app/compliance/compliance-latest-evaluations-view/components/compliance-latest-evaluation-view-detail/compliance-latest-evaluation-view-detail.component.html @@ -1,4 +1,10 @@
+ +
Compliance report scope:
-

{{ control.section.standard.standardName }}

diff --git a/frontend/src/app/compliance/compliance-report-viewer/compliance-report-viewer.component.html b/frontend/src/app/compliance/compliance-report-viewer/compliance-report-viewer.component.html index 4e9aa3e4b..660bd4722 100644 --- a/frontend/src/app/compliance/compliance-report-viewer/compliance-report-viewer.component.html +++ b/frontend/src/app/compliance/compliance-report-viewer/compliance-report-viewer.component.html @@ -11,10 +11,13 @@
- + + + {{ pdfExport ? 'Generating...' : 'Save to PDF' }} +
@@ -75,7 +78,7 @@
- + diff --git a/frontend/src/app/compliance/compliance-report-viewer/compliance-report-viewer.component.ts b/frontend/src/app/compliance/compliance-report-viewer/compliance-report-viewer.component.ts index 866977eb0..310de74ab 100644 --- a/frontend/src/app/compliance/compliance-report-viewer/compliance-report-viewer.component.ts +++ b/frontend/src/app/compliance/compliance-report-viewer/compliance-report-viewer.component.ts @@ -1,5 +1,5 @@ import {HttpErrorResponse} from '@angular/common/http'; -import {AfterViewInit, Component, HostListener, OnDestroy, OnInit} from '@angular/core'; +import {ViewChild, Component, HostListener, OnDestroy, OnInit} from '@angular/core'; import {ActivatedRoute, Router} from '@angular/router'; import {NgbModal, NgbModalOptions} from '@ng-bootstrap/ng-bootstrap'; import {NgxSpinnerService} from 'ngx-spinner'; @@ -17,13 +17,15 @@ import {CpStandardService} from '../shared/services/cp-standard.service'; import {ComplianceReportType} from '../shared/type/compliance-report.type'; import {ComplianceStandardSectionType} from '../shared/type/compliance-standard-section.type'; import {ComplianceStandardType} from '../shared/type/compliance-standard.type'; +import {ComplianceResultViewComponent} from '../compliance-result-view/compliance-result-view.component'; @Component({ selector: 'app-compliance-report-viewer', templateUrl: './compliance-report-viewer.component.html', styleUrls: ['./compliance-report-viewer.component.css'] }) -export class ComplianceReportViewerComponent implements OnInit, AfterViewInit, OnDestroy { +export class ComplianceReportViewerComponent implements OnInit, OnDestroy { + @ViewChild('compilanceRep') compilanceRep!: ComplianceResultViewComponent admin = ADMIN_ROLE; sections$: Observable; standard: ComplianceStandardType; @@ -114,8 +116,6 @@ export class ComplianceReportViewerComponent implements OnInit, AfterViewInit, O .subscribe((params) => this.report = params.template); } - ngAfterViewInit(): void { - } manageStandards() { const options: NgbModalOptions = { @@ -151,6 +151,13 @@ export class ComplianceReportViewerComponent implements OnInit, AfterViewInit, O } exportToPdf() { + + if(this.action=='reports'){ + this.compilanceRep.exportToPdf() + return + } + + this.spinner.show('buildPrintPDF'); const url = this.getUrl(); const fileName = this.report ? this.report.associatedDashboard.name.replace(/ /g, '_') : 'Reports'; @@ -176,7 +183,7 @@ export class ComplianceReportViewerComponent implements OnInit, AfterViewInit, O return '/dashboard/export-compliance/' + this.report.id; } else { const section = this.getActiveSectionParams(); - return encodeURIComponent('/compliance/print-view?section=' + section); + return '/compliance/print-view?section=' + section; // return encodeURIComponent('/compliance/evaluations-print-view=' + section); } } diff --git a/frontend/src/app/compliance/compliance-reports-view/components/compliance-print-view/compliance-print-view.component.html b/frontend/src/app/compliance/compliance-reports-view/components/compliance-print-view/compliance-print-view.component.html index bdb08cc26..1fdbede49 100644 --- a/frontend/src/app/compliance/compliance-reports-view/components/compliance-print-view/compliance-print-view.component.html +++ b/frontend/src/app/compliance/compliance-reports-view/components/compliance-print-view/compliance-print-view.component.html @@ -26,7 +26,7 @@
{{ report.associatedDashboard.description }}

Evidence:

diff --git a/frontend/src/app/compliance/compliance-reports-view/components/compliance-print-view/compliance-print-view.component.ts b/frontend/src/app/compliance/compliance-reports-view/components/compliance-print-view/compliance-print-view.component.ts index 178e41afd..780ff044a 100644 --- a/frontend/src/app/compliance/compliance-reports-view/components/compliance-print-view/compliance-print-view.component.ts +++ b/frontend/src/app/compliance/compliance-reports-view/components/compliance-print-view/compliance-print-view.component.ts @@ -23,6 +23,8 @@ export class CompliancePrintViewComponent implements OnInit, OnDestroy { selected: number; fields: SortByType[]; preparingPrint = true; + visualizationCount = 0; + loadedCount = 0; constructor(private reportsService: CpReportsService, private toastService: UtmToastService, @@ -51,6 +53,12 @@ export class CompliancePrintViewComponent implements OnInit, OnDestroy { }; }); }), + tap((reports) => { + this.visualizationCount = reports.reduce((acc, r) => acc + (r.visualization ? r.visualization.length : 0), 0); + if (this.visualizationCount === 0) { + this.preparingPrint = false; + } + }), catchError((err: HttpErrorResponse) => { this.toastService.showError('Error', 'Unable to retrieve the list of reports. Please try again or contact support.'); @@ -69,8 +77,11 @@ export class CompliancePrintViewComponent implements OnInit, OnDestroy { report.visualization = visualization; } - onVisualizationLoaded(){ - this.preparingPrint = false; + onVisualizationRun(){ + this.loadedCount += 1; + if (this.loadedCount >= this.visualizationCount) { + this.preparingPrint = false; + } } ngOnDestroy(): void { diff --git a/frontend/src/app/compliance/compliance-result-view/compliance-result-view.component.html b/frontend/src/app/compliance/compliance-result-view/compliance-result-view.component.html index eec426a59..1bfd4f130 100644 --- a/frontend/src/app/compliance/compliance-result-view/compliance-result-view.component.html +++ b/frontend/src/app/compliance/compliance-result-view/compliance-result-view.component.html @@ -79,13 +79,6 @@
- - - {{ pdfExport ? 'Generating...' : 'Save to PDF' }} - { this.spinner.show('buildPrintPDF'); const params = queryParams !== '' ? '?' + queryParams : ''; diff --git a/frontend/src/app/shared/services/util/export-pdf.service.ts b/frontend/src/app/shared/services/util/export-pdf.service.ts index c12d88d12..dc82cd74a 100644 --- a/frontend/src/app/shared/services/util/export-pdf.service.ts +++ b/frontend/src/app/shared/services/util/export-pdf.service.ts @@ -25,6 +25,31 @@ export class ExportPdfService { handlePdfResponse(response: any): void { const blob = new Blob([response.body], { type: 'application/pdf' }); const url = window.URL.createObjectURL(blob); - window.open(url, '_blank'); + this.printBlob(url) } + + printBlob(blobUrl) { + const iframe = document.createElement('iframe'); + + iframe.style.position = 'fixed'; + iframe.style.right = '0'; + iframe.style.bottom = '0'; + iframe.style.width = '0'; + iframe.style.height = '0'; + iframe.style.border = 'none'; + + iframe.src = blobUrl; + + document.body.appendChild(iframe); + + iframe.onload = function() { + iframe.contentWindow.focus(); + iframe.contentWindow.print(); + + setTimeout(() => { + document.body.removeChild(iframe); + }, 1000); }; +} + + }