diff --git a/docker/env.template.js b/docker/env.template.js index 71e9005..d448600 100644 --- a/docker/env.template.js +++ b/docker/env.template.js @@ -13,6 +13,7 @@ "TEILER_ADMIN_PHONE": "${TEILER_ADMIN_PHONE}", "TEILER_PROJECT": "${TEILER_PROJECT}", "EXPORTER_API_KEY": "${EXPORTER_API_KEY}", + "TEILER_ORCHESTRATOR_URL": "${TEILER_ORCHESTRATOR_URL}", "TEILER_DASHBOARD_HTTP_RELATIVE_PATH": "${TEILER_DASHBOARD_HTTP_RELATIVE_PATH}", "TEILER_ORCHESTRATOR_HTTP_RELATIVE_PATH": "${TEILER_ORCHESTRATOR_HTTP_RELATIVE_PATH}" }; diff --git a/src/app/embedded/quality-report/quality-report.component.css b/src/app/embedded/quality-report/quality-report.component.css index ffcb473..26087d4 100644 --- a/src/app/embedded/quality-report/quality-report.component.css +++ b/src/app/embedded/quality-report/quality-report.component.css @@ -20,25 +20,55 @@ h2{ } button{ color: white; - font-size: 14px; + font-size: 16px; border-radius: 10px; - padding: 0.5% 1%; - background-color: #002772; + padding: 1.5%; + background-color: white!important; } -.button{ - margin-top:1.5%; +.generate-div { + margin-top: 1.5%; + margin-bottom: 2%; text-align: left; font-size: 14px; width: 100%; - } -progress{ +.log-div { + margin-top: 20px; + display:flex; +} +.button-status { + display: flex; +} +.status { + margin: 1.4% 0 0 3%; +} +.log-exporter, .log-reporter { + border: 1px solid #333333; + width: 49%; + padding: 1% 2%; + background-color: white; + height: 300px; + display: none; +} +.log-exporter { + margin-left: 2%; +} +.log-header { + font-weight: bold; + margin-bottom: 10px; +} +.log-reports { + height: 250px; + max-height: 300px; + overflow: auto; +} +progress { background-color: blue; } .search{ font-size: 16px; - margin-top: 0.5%; + margin-top: 1.5%; margin-left: 80%; display: flex; } @@ -65,10 +95,57 @@ table{ font-size: 115%; text-align: center; } +.upload-button, .download-button, .generate-button, .cancel-button, .download-button { + display: none; +} +.download-button-div { + width: 10%; + margin-top: 15px; +} +.visible { + display: block; +} +.visible-button { + display: flex; +} +.file-input { + display: none; +} +.generate-button, .cancel-button, .download-button { + width: 200px; + height: 55px; + padding: 5px; +} +.download-button { + margin-left: 2%; +} +.file-upload { + text-transform: none !important; + width: 200px; + height: 55px; + font-size: 13px; + color: black; + display: flex; + padding: 5px; +} +.file-upload-text { + margin: 8px 5px; +} +.file-name { + color: black; + margin: 5px; + height: 20px; +} +.template_dropdown { + margin: 0 2%; + width: 20%; +} mat-paginator{ opacity: 0.75; } - +.template-select { + margin-top: 5px; +} @media(max-width : 1400px){ .search{ font-size: 16px; diff --git a/src/app/embedded/quality-report/quality-report.component.html b/src/app/embedded/quality-report/quality-report.component.html index 3638820..563f070 100644 --- a/src/app/embedded/quality-report/quality-report.component.html +++ b/src/app/embedded/quality-report/quality-report.component.html @@ -1,38 +1,63 @@ - +

Qualitätsbericht

-
- -
-


Startzeit: {{todayWithPipe}}
Verstrichene Laufzeit: 0 min
Restlaufzeit: 0 min

-

-
25%
+
+
+ + Template + + + + +
+ + +
+ + +
+ + QB wird erstellt ... + QB wurde erfolgreich erstellt. + QB wurde nicht gefunden. + Ein Fehler ist aufgetreten. +
+
+
+
+
Reporter Log:
+
{{log}}
+
+
+
Exporter Log:
+
{{log}}
-


-requesting local data management statistics
-requesting local data management results

-
-
- + - + + + + + + - - - + + + @@ -40,10 +65,10 @@

Qualitätsbericht

Zeitstempel
{{element.zeitstempel}} {{element.timestamp | date: 'medium'}}
Template-ID
{{element['template-id']}} Version {{element.version}} Link Download
- +
diff --git a/src/app/embedded/quality-report/quality-report.component.ts b/src/app/embedded/quality-report/quality-report.component.ts index 9c45f4e..0004500 100644 --- a/src/app/embedded/quality-report/quality-report.component.ts +++ b/src/app/embedded/quality-report/quality-report.component.ts @@ -1,16 +1,33 @@ -import {Component, OnInit, ViewChild} from '@angular/core'; +import {Component, OnDestroy, OnInit, ViewChild} from '@angular/core'; import {ActivatedRoute} from "@angular/router"; import {DatePipe} from '@angular/common'; import {MatTableDataSource} from "@angular/material/table"; import {MatPaginator} from "@angular/material/paginator"; - +import {QualityReportService, reportLog} from "../../teiler/quality-report.service"; +import {Subscription} from "rxjs"; export interface QualityReports { - zeitstempel: string; - version: string; + id: string; + path: string; + timestamp: string; + "template-id": string; } +export interface QBResponse { + responseUrl: URL; +} +export interface Templates { + value: string; + display: string +} +export enum QBStatus { + OK = "OK", + RUNNING = "RUNNING", + NOT_FOUND = "NOT_FOUND", + EMPTY = "EMPTY", + ERROR = "ERROR" +} @Component({ selector: 'quality-report-app', @@ -19,51 +36,33 @@ export interface QualityReports { }) -export class QualityReportComponent implements OnInit { - EmpData: QualityReports[] = [ - {zeitstempel: '2022-09-27 10:25:43', version: '002'}, - {zeitstempel: '2022-07-29 14:37:31', version: '002'}, - {zeitstempel: '2022-02-28 10:27:22', version: '002'}, - {zeitstempel: '2022-02-08 17:31:11', version: '002'}, - {zeitstempel: '2022-02-07 14:27:01', version: '002'}, - {zeitstempel: '2021-10-30 19:46:54', version: '002'}, - {zeitstempel: '2021-10-25 08:18:20', version: '002'}, - {zeitstempel: '2021-10-21 15:28:43', version: '002'}, - {zeitstempel: '2021-10-21 10:25:10', version: '002'}, - {zeitstempel: '2021-10-01 10:37:27', version: '002'}, - {zeitstempel: '2021-06-10 15:45:21', version: '002'}, - {zeitstempel: '2021-06-10 15:45:19', version: '002'}, - {zeitstempel: '2020-09-18 11:50:05', version: '002'}, - {zeitstempel: '2020-08-07 13:53:58', version: '002'}, - {zeitstempel: '2019-10-01 15:18:20', version: '002'}, - {zeitstempel: '2019-08-16 11:35:56', version: '002'}, - {zeitstempel: '2019-08-15 16:32:11', version: '002'}, - {zeitstempel: '2019-08-15 16:00:17', version: '002'}, - {zeitstempel: '2019-08-15 14:25:09', version: '002'}, - {zeitstempel: '2019-08-09 09:51:30', version: '002'}, - - ]; +export class QualityReportComponent implements OnInit, OnDestroy { //table - displayedColumns: string[] = ['zeitstempel', 'version']; - dataSource =new MatTableDataSource(this.EmpData); - numberOfItemsToBeDisplayedDefault = "zero"; - - //toggle - isShowDivIf = true; - - toggleDisplayDivIf() { - this.isShowDivIf = !this.isShowDivIf; - } + displayedColumns: string[] = ['timestamp', 'templateid', 'link']; + dataSource = new MatTableDataSource(); //generator title = 'appComponent'; - //date - today: Date = new Date(); - pipe = new DatePipe('en-US'); - todayWithPipe = null; + private subscriptionGenerateQB: Subscription | undefined + private subscriptionGetReports: Subscription | undefined + private subscriptionGetReportStatus: Subscription | undefined + private subscriptionFetchLogs: Subscription | undefined + private subscriptionGetRunningReports: Subscription | undefined + private subscriptionGetTemplateIDs: Subscription | undefined - constructor(private route: ActivatedRoute) { + private intervall: number | undefined + reportLog: reportLog[] = []; + QBStatus: typeof QBStatus = QBStatus; + qbStatus: QBStatus = QBStatus.EMPTY + reportUrl = ""; + buttonDisabled: boolean = false; + fileName: string | undefined; + importTemplate: string = ""; + selectedTemplate: string = "ccp"; + templateIDs: Templates[] = [] + + constructor(private route: ActivatedRoute, private qualityReportService: QualityReportService) { } // @ts-ignore @ViewChild('paginator') paginator: MatPaginator; @@ -72,8 +71,184 @@ export class QualityReportComponent implements OnInit { this.dataSource.paginator = this.paginator; } ngOnInit() { + this.reportUrl = this.qualityReportService.getReporterURL() + "/"; + this.getTemplateIDs(); + this.getReports(); + this.getRunningReports(); + } + + ngOnDestroy(): void { + this.subscriptionGenerateQB?.unsubscribe(); + this.subscriptionGetReports?.unsubscribe(); + this.subscriptionGetReportStatus?.unsubscribe(); + this.subscriptionFetchLogs?.unsubscribe(); + this.subscriptionGetRunningReports?.unsubscribe(); + this.subscriptionGetTemplateIDs?.unsubscribe(); + window.clearInterval(this.intervall); + } + + doImportFromFile(event: Event): void { // @ts-ignore - this.todayWithPipe = this.pipe.transform(Date.now(), 'dd/MM/yyyy h:mm:ss a zzzz'); + const file: File = (event.target as HTMLInputElement).files[0]; + const reader = new FileReader(); + reader.onload = this.onReaderLoad.bind(this); + reader.readAsText(file); + this.fileName = file.name; + } + onReaderLoad(event: any): void { + this.importTemplate = event.target.result; + this.generateQB(); + } + + generateQB() { + this.buttonDisabled = true; + this.subscriptionGenerateQB = this.qualityReportService.generateQB(this.selectedTemplate, this.importTemplate).subscribe({ + next: (response:QBResponse) => { + const url = new URL(response.responseUrl) + const id = url.searchParams.get("report-id"); + this.qbStatus = QBStatus.RUNNING + if (id) { + this.pollingStatusAndLogs(id, false); + } + }, + error: (error) => { + console.log(error); + }, + complete: () => {} + }); + } + + getReports(): void { + this.subscriptionGetReports?.unsubscribe(); + this.subscriptionGetReports = this.qualityReportService.getReports().subscribe({ + next: (reportList:QualityReports[]) => { + const tempQBs: QualityReports[] = []; + let tempID; + reportList.forEach((report) => { + report["template-id"] === "null" ? tempID = "unbekannt" : tempID = report["template-id"] + tempQBs.push({id: report.id, path: report.path, timestamp: this.transformDate(report.timestamp), "template-id": tempID}) + }) + tempQBs.sort((a,b) => Number(b.timestamp) - Number(a.timestamp)) + this.dataSource.data = tempQBs; + this.dataSource._updateChangeSubscription(); + }, + error: (error) => { + console.log(error); + }, + complete: () => {} + }) } + pollingStatusAndLogs(id: string, init: boolean): void { + this.subscriptionGenerateQB?.unsubscribe(); + this.subscriptionGetReportStatus?.unsubscribe(); + this.subscriptionFetchLogs?.unsubscribe(); + + const reportDiv = document.getElementById("reportDiv"); + const exportDiv = document.getElementById("exportDiv"); + this.intervall = window.setInterval(() => { + this.subscriptionGetReportStatus = this.qualityReportService.getReportStatus(id).subscribe({ + next: (status) => { + console.log(status) + if (!init || status !== QBStatus.OK) {this.qbStatus = status;} + if (status !== QBStatus.RUNNING) { + window.clearInterval(this.intervall); + this.buttonDisabled = false; + if (status === QBStatus.OK && !init) { + this.reportLog = []; + this.downloadReport(id); + this.getReports(); + } + } + }, + error: (error) => { + console.log(error); + }, + complete: () => {} + }); + if (this.qbStatus === QBStatus.RUNNING) { + init = false; + this.subscriptionFetchLogs = this.qualityReportService.fetchLogs(1000).subscribe({ + next: (response) => { + this.reportLog = response; + for (const repexpDiv of [reportDiv, exportDiv]) { + this.scrollToEndOfLog(repexpDiv) + } + }, + error: (error) => { + console.log(error); + }, + complete: () => { + } + }); + } + }, 2000) + } + + downloadReport(id: string): void { + window.location.href=this.reportUrl + 'report?report-id=' + id; + } + + transformDate(dateLog: string): string { + return new Date(dateLog.substring(0,4) + "-" + dateLog.substring(4,6) + "-" + dateLog.substring(6,8) + "T" + dateLog.substring(9,11) + ":" + dateLog.substring(12,14) + "+00:00").getTime().toString(); + } + + + scrollToEndOfLog(element: HTMLElement | null): void { + if (element) { + const isScrolledToBottomReport = element.scrollHeight - element.clientHeight <= element.scrollTop + 1; + setTimeout(function () { + if (isScrolledToBottomReport) { + element.scrollTop = element.scrollHeight - element.clientHeight; + } + }, 200); + } + } + + getRunningReports(): void { + this.subscriptionGetRunningReports?.unsubscribe(); + this.subscriptionGetRunningReports = this.qualityReportService.getRunningReports().subscribe({ + next: (reportList:QualityReports[]) => { + const tempQBs: QualityReports[] = [] + reportList.forEach((report) => { + tempQBs.push({id: report.id, path: report.path, timestamp: this.transformDate(report.timestamp), "template-id": report["template-id"]}) + }) + tempQBs.sort((a,b) => Number(b.timestamp) - Number(a.timestamp)) + if (tempQBs.length > 0) { + this.buttonDisabled = true; + this.pollingStatusAndLogs(tempQBs[0].id, true) + } + }, + error: (error) => { + console.log(error); + }, + complete: () => {} + }) + } + + getTemplateIDs(): void { + this.subscriptionGetTemplateIDs?.unsubscribe(); + this.subscriptionGetTemplateIDs = this.qualityReportService.getReportTemplates().subscribe({ + next: (templateList:string[]) => { + templateList.forEach((template) => { + this.templateIDs.push({value: template, display: template}) + }) + this.templateIDs.push({value: "custom", display:"Eigenes Template"}) + }, + error: (error) => { + console.log(error); + }, + complete: () => {} + }) + } + + cancelQB(): void { + window.clearInterval(this.intervall); + this.buttonDisabled = false; + this.qbStatus = QBStatus.EMPTY; + } + + downloadTemplate(): void { + window.location.href = this.reportUrl + 'report-template?template-id=' + this.selectedTemplate; + } } diff --git a/src/app/sidebar/sidebar.component.css b/src/app/sidebar/sidebar.component.css index 519c6a9..34a123e 100644 --- a/src/app/sidebar/sidebar.component.css +++ b/src/app/sidebar/sidebar.component.css @@ -4,7 +4,6 @@ flex: 1; z-index:1; position: relative; - overflow: hidden; } .main-content { display: flex; diff --git a/src/app/teiler-welcome/teiler-welcome.component.ts b/src/app/teiler-welcome/teiler-welcome.component.ts index ebc5725..107c00d 100644 --- a/src/app/teiler-welcome/teiler-welcome.component.ts +++ b/src/app/teiler-welcome/teiler-welcome.component.ts @@ -25,7 +25,7 @@ export class TeilerWelcomeComponent implements OnInit { welcomeTitle1: string = $localize`Willkommen auf Ihrem` welcomeTitle2: string = $localize`Brückenkopf` - welcomeTitle: string = this.welcomeTitle1 + " " + environment.config.TEILER_PROJECT + " " + this.welcomeTitle2; + welcomeTitle: string = this.welcomeTitle1 + " " + environment.config.TEILER_PROJECT.toUpperCase() + "-" + this.welcomeTitle2; welcomeMessage1: string = $localize` Sie befinden sich auf der Einstiegsseite des Brückenkopfes am Standort. diff --git a/src/app/teiler/quality-report.service.ts b/src/app/teiler/quality-report.service.ts index b532962..a3c6770 100644 --- a/src/app/teiler/quality-report.service.ts +++ b/src/app/teiler/quality-report.service.ts @@ -1,6 +1,15 @@ import {Injectable} from '@angular/core'; import {EmbeddedTeilerApp, EmbeddedTeilerApps, TeilerRole} from "./teiler-app"; import {Router} from "@angular/router"; +import {Observable, of} from "rxjs"; +import {HttpClient, HttpHeaders} from "@angular/common/http"; +import {environment} from "../../environments/environment"; +import {QBResponse, QBStatus, QualityReports} from "../embedded/quality-report/quality-report.component"; + +export interface reportLog { + source: string, + lastLines: String[] +} @Injectable({ providedIn: 'root' @@ -12,9 +21,70 @@ export class QualityReportService extends EmbeddedTeilerApp { iconSourceUrl: string | undefined = undefined; title: string = $localize`Qualitätsbericht`; roles: TeilerRole[] = [TeilerRole.TEILER_ADMIN]; - - constructor(router: Router) { + httpHeaders: HttpHeaders = new HttpHeaders().append("x-api-key", environment.config.EXPORTER_API_KEY); + httpHeadersXML: HttpHeaders = new HttpHeaders().append("x-api-key", environment.config.EXPORTER_API_KEY).append("Content-Type", "application/xml"); + constructor(router: Router, private http: HttpClient) { super(EmbeddedTeilerApps.QUALITY_REPORT, router); } + public generateQB(templateID: string, template?:string): Observable { + if (templateID === "custom") { + return this.http.post(this.getReporterURL()+"/generate", template, {headers: this.httpHeadersXML}); + } else { + return this.http.post(this.getReporterURL() + "/generate?template-id=" + templateID, null, {headers: this.httpHeaders}); + } + } + public fetchLogs(logSize: number, lastLineRep?: string, lastLineExp?: string): Observable { + const mock = [ + { + "source": "reporter", + "lastLines": [ + "Sending request to exporter...", + "Response URL: http://localhost:8095/report?report-id=GbYpfophYqcysQa", + "Fetching export... (Attempt: 1)", + "Fetching export... (Attempt: 2)", + "Fetching export... (Attempt: 3)", + "Fetching export... (Attempt: 4)", + "Fetching export... (Attempt: 5)", + "Fetching export... (Attempt: 6)", + "Fetching export... (Attempt: 7)", + "Fetching export... (Attempt: 8)", + "Fetching export... (Attempt: 9)", + "Fetching export... (Attempt: 10)", + "Fetching export... (Attempt: 11)", + "Fetching export... (Attempt: 12)", + "Sending request to exporter...", + "Response URL: http://localhost:8095/report?report-id=VGIQaAnEvmeDJcG", + "Fetching export... (Attempt: 1)", + "Random Number: " + Math.floor(Math.random() * 10000000) + ] + }, + { + "source": "exporter", + "lastLines": [ + "Response URL: http://exporter:8092/response?query-execution-id=6", + "Fetching first bundle...", + "Random Number: " + Math.floor(Math.random() * 10000000) + ] + } + ]; + //return of(mock); + return this.http.get(this.getReporterURL()+"/logs?logs-size=" + logSize ); + } + getReportStatus(reportID: string): Observable { + return this.http.get(this.getReporterURL()+"/report-status?report-id=" + reportID ); + } + + getReports(): Observable { + return this.http.get(this.getReporterURL()+"/reports-list" ); + } + getReporterURL(): string | undefined { + return this.backendUrl; + } + getRunningReports(): Observable { + return this.http.get(this.getReporterURL()+"/running-reports" ); + } + getReportTemplates(): Observable { + return this.http.get(this.getReporterURL() + "/report-template-ids"); + } } diff --git a/src/assets/env.js b/src/assets/env.js index bdb1e71..3d305f6 100644 --- a/src/assets/env.js +++ b/src/assets/env.js @@ -13,6 +13,7 @@ "TEILER_ADMIN_PHONE": "+49 123 456789", "TEILER_PROJECT": "DKTK", "EXPORTER_API_KEY": "ttsHGwSITs0Eq8L63YWtLVyHymBmULvZIihL6w4t42FBmzp6Eb9SGNd7fZmeUtAI", + "TEILER_ORCHESTRATOR_URL": "http://localhost:9000", "TEILER_DASHBOARD_HTTP_RELATIVE_PATH": "", "TEILER_ORCHESTRATOR_HTTP_RELATIVE_PATH": "" }; diff --git a/src/i18n/messages.en.xlf b/src/i18n/messages.en.xlf index 5358fca..d80b02d 100644 --- a/src/i18n/messages.en.xlf +++ b/src/i18n/messages.en.xlf @@ -60,7 +60,7 @@ src/app/embedded/event-log/event-log.component.html:22 - src/app/embedded/quality-report/quality-report.component.html:29 + src/app/embedded/quality-report/quality-report.component.html:49 Zeitstempel @@ -248,7 +248,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:16 + src/app/embedded/inquiries/inquiry/inquiry.component.html:18 Keine Validierung vornehmen. Das erzeugte Dokument kann deshalb Einträge enthalten, die nicht konform zu den MDR hinterlegten Validierungsinformationen sind. @@ -257,7 +257,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:19 + src/app/embedded/inquiries/inquiry/inquiry.component.html:21 Werte, die nicht konform zu den im MDR hinterlegten Validierungsinformationen sind, werden nicht in das erzeugte Dokument aufgenommen. @@ -266,7 +266,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:22 + src/app/embedded/inquiries/inquiry/inquiry.component.html:24 Werte, die nicht konform zu den im MDR hinterlegten Validierungsinformationen sind, werden im erzeugten Dokument orange hinterlegt. @@ -275,7 +275,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:26 + src/app/embedded/inquiries/inquiry/inquiry.component.html:28 Anfrage erneut ausfüllen @@ -284,7 +284,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:28 + src/app/embedded/inquiries/inquiry/inquiry.component.html:30 Ergebnisliste erzeugen (Excel) @@ -293,7 +293,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:29 + src/app/embedded/inquiries/inquiry/inquiry.component.html:31 Ergebnisliste erzeugen (CSV) @@ -302,25 +302,25 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:30 + src/app/embedded/inquiries/inquiry/inquiry.component.html:32 Nur Anzahl abfragen Request only statistics - + - src/app/embedded/inquiries/inquiry/inquiry.component.html:32 + src/app/embedded/inquiries/inquiry/inquiry.component.html:35,36 - Bereits beantwortet + Bereits beantwortet Already answered - src/app/embedded/inquiries/inquiry/inquiry.component.html:35 + src/app/embedded/inquiries/inquiry/inquiry.component.html:39 Archivieren @@ -329,7 +329,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:45 + src/app/embedded/inquiries/inquiry/inquiry.component.html:50 Der Anfragesteller hat keinen Beschreibungstext eingegeben. @@ -338,7 +338,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:47 + src/app/embedded/inquiries/inquiry/inquiry.component.html:53 Expóse herunterladen @@ -347,7 +347,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:50 + src/app/embedded/inquiries/inquiry/inquiry.component.html:56 Keine Dokumente angehängt @@ -356,7 +356,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:56 + src/app/embedded/inquiries/inquiry/inquiry.component.html:62 Name @@ -365,7 +365,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:57 + src/app/embedded/inquiries/inquiry/inquiry.component.html:63 Telefonnummer @@ -374,7 +374,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:58 + src/app/embedded/inquiries/inquiry/inquiry.component.html:64 E-Mail @@ -383,7 +383,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:59 + src/app/embedded/inquiries/inquiry/inquiry.component.html:65 Einrichtung @@ -392,7 +392,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:62 + src/app/embedded/inquiries/inquiry/inquiry.component.html:68 Beantwortet am @@ -401,7 +401,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:62 + src/app/embedded/inquiries/inquiry/inquiry.component.html:68 Antwort @@ -410,7 +410,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:74 + src/app/embedded/inquiries/inquiry/inquiry.component.html:80 Suchkriterien @@ -451,7 +451,6 @@ src/app/embedded/pop-ups/dialog-quali/dialog-quali.component.html:14 src/app/embedded/pop-ups/dialog-uploads/dialog-uploads.component.html:13 - src/app/embedded/quality-report/quality-report.component.html:14 src/app/embedded/uploads/uploads.component.html:74 @@ -490,29 +489,101 @@ src/app/embedded/quality-report/quality-report.component.html:4 - src/app/teiler/quality-report.service.ts:13 + src/app/teiler/quality-report.service.ts:22 Qualitätsbericht Quality Report - + + + src/app/embedded/quality-report/quality-report.component.html:14 + + + abbrechen + cancel + + + + + src/app/embedded/quality-report/quality-report.component.html:15 + + + neuen QB generieren + generate new QR + + + + + src/app/embedded/quality-report/quality-report.component.html:19 + + + Template auswählen und neuen QB generieren + select template and generate new QR + + + + + src/app/embedded/quality-report/quality-report.component.html:22 + + + Template herunterladen + download template + + + + + src/app/embedded/quality-report/quality-report.component.html:26 + + + QB wird erstellt ... + generating QR ... + + + + + src/app/embedded/quality-report/quality-report.component.html:27 + + + QB wurde erfolgreich erstellt. + QR successfully generated + + + + + src/app/embedded/quality-report/quality-report.component.html:28 + + + QB wurde nicht gefunden. + QR not found + + + + + src/app/embedded/quality-report/quality-report.component.html:29 + + + Ein Fehler ist aufgetreten. + failed + + + - src/app/embedded/quality-report/quality-report.component.html:7 + src/app/embedded/quality-report/quality-report.component.html:54 - Generieren - Generate + Template-ID + template-ID - + - src/app/embedded/quality-report/quality-report.component.html:34 + src/app/embedded/quality-report/quality-report.component.html:59 - Version - Version + Link + link @@ -831,7 +902,7 @@ - src/app/teiler/quality-report.service.ts:10 + src/app/teiler/quality-report.service.ts:19 Qualitätsberichte erzeugen und ansehen diff --git a/src/i18n/messages.xlf b/src/i18n/messages.xlf index d5eae96..2a68cbf 100644 --- a/src/i18n/messages.xlf +++ b/src/i18n/messages.xlf @@ -54,7 +54,7 @@ src/app/embedded/event-log/event-log.component.html:22 - src/app/embedded/quality-report/quality-report.component.html:29 + src/app/embedded/quality-report/quality-report.component.html:49 Zeitstempel @@ -215,7 +215,6 @@ src/app/embedded/inquiries/inquiries.component.html:8 src/app/embedded/inquiries/inquiries.component.html:8 src/app/embedded/inquiries/inquiries.component.html:8 - src/app/embedded/quality-report/quality-report.component.html:19 Suche @@ -223,7 +222,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:16 + src/app/embedded/inquiries/inquiry/inquiry.component.html:18 Keine Validierung vornehmen. Das erzeugte Dokument kann deshalb Einträge enthalten, die nicht konform zu den MDR hinterlegten Validierungsinformationen sind. @@ -231,7 +230,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:19 + src/app/embedded/inquiries/inquiry/inquiry.component.html:21 Werte, die nicht konform zu den im MDR hinterlegten Validierungsinformationen sind, werden nicht in das erzeugte Dokument aufgenommen. @@ -239,7 +238,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:22 + src/app/embedded/inquiries/inquiry/inquiry.component.html:24 Werte, die nicht konform zu den im MDR hinterlegten Validierungsinformationen sind, werden im erzeugten Dokument orange hinterlegt. @@ -247,7 +246,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:26 + src/app/embedded/inquiries/inquiry/inquiry.component.html:28 Anfrage erneut ausfüllen @@ -255,7 +254,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:28 + src/app/embedded/inquiries/inquiry/inquiry.component.html:30 Ergebnisliste erzeugen (Excel) @@ -263,7 +262,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:29 + src/app/embedded/inquiries/inquiry/inquiry.component.html:31 Ergebnisliste erzeugen (CSV) @@ -271,23 +270,23 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:30 + src/app/embedded/inquiries/inquiry/inquiry.component.html:32 Nur Anzahl abfragen - + - src/app/embedded/inquiries/inquiry/inquiry.component.html:32 + src/app/embedded/inquiries/inquiry/inquiry.component.html:35,36 - Bereits beantwortet + Bereits beantwortet - src/app/embedded/inquiries/inquiry/inquiry.component.html:35 + src/app/embedded/inquiries/inquiry/inquiry.component.html:39 Archivieren @@ -295,7 +294,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:45 + src/app/embedded/inquiries/inquiry/inquiry.component.html:50 Der Anfragesteller hat keinen Beschreibungstext eingegeben. @@ -303,7 +302,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:47 + src/app/embedded/inquiries/inquiry/inquiry.component.html:53 Expóse herunterladen @@ -311,7 +310,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:50 + src/app/embedded/inquiries/inquiry/inquiry.component.html:56 Keine Dokumente angehängt @@ -319,7 +318,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:56 + src/app/embedded/inquiries/inquiry/inquiry.component.html:62 Name @@ -327,7 +326,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:57 + src/app/embedded/inquiries/inquiry/inquiry.component.html:63 Telefonnummer @@ -335,7 +334,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:58 + src/app/embedded/inquiries/inquiry/inquiry.component.html:64 E-Mail @@ -343,7 +342,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:59 + src/app/embedded/inquiries/inquiry/inquiry.component.html:65 Einrichtung @@ -351,7 +350,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:62 + src/app/embedded/inquiries/inquiry/inquiry.component.html:68 Beantwortet am @@ -359,7 +358,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:62 + src/app/embedded/inquiries/inquiry/inquiry.component.html:68 Antwort @@ -367,7 +366,7 @@ - src/app/embedded/inquiries/inquiry/inquiry.component.html:74 + src/app/embedded/inquiries/inquiry/inquiry.component.html:80 Suchkriterien @@ -376,7 +375,6 @@ src/app/embedded/pop-ups/dialog-quali/dialog-quali.component.html:4 - src/app/embedded/quality-report/quality-report.component.html:9 Startzeit @@ -385,7 +383,6 @@ src/app/embedded/pop-ups/dialog-quali/dialog-quali.component.html:5 - src/app/embedded/quality-report/quality-report.component.html:9 Verstrichene Laufzeit @@ -394,7 +391,6 @@ src/app/embedded/pop-ups/dialog-quali/dialog-quali.component.html:6 - src/app/embedded/quality-report/quality-report.component.html:9 Restlaufzeit @@ -404,7 +400,6 @@ src/app/embedded/pop-ups/dialog-quali/dialog-quali.component.html:14 src/app/embedded/pop-ups/dialog-uploads/dialog-uploads.component.html:13 - src/app/embedded/quality-report/quality-report.component.html:14 src/app/embedded/uploads/uploads.component.html:74 @@ -439,26 +434,90 @@ src/app/embedded/quality-report/quality-report.component.html:4 - src/app/teiler/quality-report.service.ts:13 + src/app/teiler/quality-report.service.ts:22 Qualitätsbericht - + + + src/app/embedded/quality-report/quality-report.component.html:14 + + + abbrechen + + + + + src/app/embedded/quality-report/quality-report.component.html:15 + + + neuen QB generieren + + + + + src/app/embedded/quality-report/quality-report.component.html:19 + + + Template auswählen und neuen QB generieren + + + + + src/app/embedded/quality-report/quality-report.component.html:22 + + + Template herunterladen + + + + + src/app/embedded/quality-report/quality-report.component.html:26 + + + QB wird erstellt ... + + + + + src/app/embedded/quality-report/quality-report.component.html:27 + + + QB wurde erfolgreich erstellt. + + + + + src/app/embedded/quality-report/quality-report.component.html:28 + + + QB wurde nicht gefunden. + + + + + src/app/embedded/quality-report/quality-report.component.html:29 + + + Ein Fehler ist aufgetreten. + + + - src/app/embedded/quality-report/quality-report.component.html:7 + src/app/embedded/quality-report/quality-report.component.html:54 - Generieren + Template-ID - + - src/app/embedded/quality-report/quality-report.component.html:34 + src/app/embedded/quality-report/quality-report.component.html:59 - Version + Link @@ -736,7 +795,7 @@ - src/app/teiler/quality-report.service.ts:10 + src/app/teiler/quality-report.service.ts:19 Qualitätsberichte erzeugen und ansehen