From 5393a137644927deefe5770dc8003f05b1aeb119 Mon Sep 17 00:00:00 2001
From: mechtelm <mechtel@iqb.hu-berlin.de>
Date: Tue, 11 Feb 2020 13:35:44 +0100
Subject: [PATCH] refurbishment of customtexts (implementing iqb-components
 version) - incomplete

---
 src/app/about/about.component.html            |   2 +-
 src/app/about/about.component.ts              |   4 +-
 src/app/app.component.ts                      |  23 ++--
 src/app/app.config.ts                         | 116 ++++++++++++++++++
 src/app/app.module.ts                         |   8 +-
 src/app/custom-text.pipe.spec.ts              |   8 --
 src/app/custom-text.pipe.ts                   |  14 ---
 src/app/maindata.service.ts                   |  69 -----------
 src/app/start/start.component.html            |   2 +-
 src/app/start/start.component.ts              |   8 +-
 .../environment-check.component.ts            |   4 +-
 .../network-check/network-check.component.ts  |   4 +-
 .../questionnaire.component.html              |   2 +-
 .../questionnaire/questionnaire.component.ts  |   6 +-
 src/app/sys-check/report/report.component.ts  |   4 +-
 src/app/sys-check/start.component.ts          |   4 +-
 ...a.service.ts => sys-check-data.service.ts} |   2 +-
 src/app/sys-check/sys-check.component.ts      |  15 ++-
 src/app/sys-check/sys-check.module.ts         |   8 +-
 .../sys-check/syscheck-data.service.spec.ts   |   6 +-
 .../unit-navi-buttons.component.ts            |   4 +-
 .../unit-check/unit-check.component.ts        |   4 +-
 .../test-controller.component.ts              |   7 +-
 23 files changed, 187 insertions(+), 137 deletions(-)
 create mode 100644 src/app/app.config.ts
 delete mode 100644 src/app/custom-text.pipe.spec.ts
 delete mode 100644 src/app/custom-text.pipe.ts
 rename src/app/sys-check/{syscheck-data.service.ts => sys-check-data.service.ts} (98%)

diff --git a/src/app/about/about.component.html b/src/app/about/about.component.html
index 51ae13ab..7a2f2ed3 100644
--- a/src/app/about/about.component.html
+++ b/src/app/about/about.component.html
@@ -11,7 +11,7 @@
       <!-- - - - - - - - - - - - - - - - - -->
       <mat-card-content>
         <p>Das <a href="http://www.iqb.hu-berlin.de" target="_blank">Institut zur Qualitätsentwicklung im Bildungswesen</a>
-          {{ mds.refreshCostumTexts | customText:'app_intro1' }}</p>
+          {{ 'app_intro1' | customtext:'app_intro1':cts.updateCount }}</p>
 
         <p>Die mit diesem System erhobenen Daten enthalten grundsätzlich keinen direkten
           Personenbezug. Es werden z. B. nie Namen gespeichert. Um Auskünfte zu einer bestimmten Befragung bzw. Studie
diff --git a/src/app/about/about.component.ts b/src/app/about/about.component.ts
index adf69666..675674ca 100644
--- a/src/app/about/about.component.ts
+++ b/src/app/about/about.component.ts
@@ -1,6 +1,7 @@
 import { MainDataService } from 'src/app/maindata.service';
 import { Component, Inject } from '@angular/core';
 import {Router} from "@angular/router";
+import {CustomtextService} from "iqb-components";
 
 @Component({
   templateUrl: './about.component.html'
@@ -12,7 +13,8 @@ export class AboutComponent {
     @Inject('APP_PUBLISHER') public appPublisher: string,
     @Inject('APP_VERSION') public appVersion: string,
     private router: Router,
-    public mds: MainDataService
+    public mds: MainDataService,
+    private cts: CustomtextService
   ) { }
 
   goBack() {
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 1afb1784..f5dd0528 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -2,7 +2,8 @@ import { MainDataService } from './maindata.service';
 import { Component, OnInit } from '@angular/core';
 import { BackendService } from './backend.service';
 import { LoginData } from './app.interfaces';
-import { ServerError } from 'iqb-components';
+import {CustomtextService, ServerError} from 'iqb-components';
+import {appconfig} from "./app.config";
 
 @Component({
   selector: 'tc-root',
@@ -15,11 +16,14 @@ export class AppComponent implements OnInit {
 
   constructor (
     private mds: MainDataService,
-    private bs: BackendService
+    private bs: BackendService,
+    private cts: CustomtextService
   ) { }
 
   ngOnInit() {
+    this.setDefaultCustomTexts();
     // give a message to the central message broadcast
+
     window.addEventListener('message', (event: MessageEvent) => {
       const msgData = event.data;
       const msgType = msgData['type'];
@@ -31,7 +35,7 @@ export class AppComponent implements OnInit {
     });
 
     this.bs.getSysConfig().subscribe(sc => {
-      this.mds.setCostumTextsApp(sc);
+      this.cts.addCustomTexts(sc);
       // restore login status if stored in localStorage
       const loginToken = localStorage.getItem('lt');
       if (loginToken !== null) {
@@ -57,7 +61,6 @@ export class AppComponent implements OnInit {
           this.bs.getLoginData(loginToken, personToken, bookletDbId).subscribe(ld => {
             if (ld instanceof ServerError) {
               this.mds.setNewLoginData();
-              this.mds.setCostumTextsLogin();
             } else {
               const loginData = ld as LoginData;
               loginData.logintoken = loginToken;
@@ -67,17 +70,23 @@ export class AppComponent implements OnInit {
                 loginData.booklet = 0;
               }
               this.mds.setNewLoginData(loginData);
-              this.mds.setCostumTextsLogin(loginData.costumTexts);
+              this.cts.addCustomTexts(loginData.costumTexts);
             }
           });
         } else {
           this.mds.setNewLoginData();
-          this.mds.setCostumTextsLogin();
         }
       } else {
         this.mds.setNewLoginData();
-        this.mds.setCostumTextsLogin();
       }
     });
   }
+
+  private setDefaultCustomTexts() {
+    const myCustomTexts: {[key: string]: string} = {};
+    for (const ct of Object.keys(appconfig.customtexts)) {
+      myCustomTexts[ct] = appconfig.customtexts[ct].defaultvalue;
+    }
+    this.cts.addCustomTexts(myCustomTexts);
+  }
 }
diff --git a/src/app/app.config.ts b/src/app/app.config.ts
new file mode 100644
index 00000000..3638259f
--- /dev/null
+++ b/src/app/app.config.ts
@@ -0,0 +1,116 @@
+export const appconfig = {
+  customtexts: <CustomTextDefs>{
+    'app_title': {
+      defaultvalue: 'IQB-Testcenter',
+      description: 'Titel der Hauptanwendung, z. B. Homepage'
+    },
+    'app_intro1': {
+      defaultvalue: 'betreibt auf diesen Seiten eine Pilotanwendung für das computerbasierte Leistungstesten von ' +
+        'Schülerinnen und Schülern. Der Zugang zu einem Test ist nur möglich, wenn Sie von Testverantwortlichen ' +
+        'Zugangsdaten erhalten haben, die Sie bitte links eingeben. Es sind keine weiteren Seiten öffentlich verfügbar.',
+      description: 'Begrüßungstext auf der Startseite'
+    },
+    'login_testRunningText': {
+      defaultvalue: 'Ein Testheft ist gestartet',
+      description: 'Nachricht, dass ein Test (Booklet) gestartet ist'
+    },
+    'login_testRunningLongText': {
+      defaultvalue: 'Es wird gerade ein Test ausgeführt. Bitte durch Klicken auf eine der beiden Schaltflächen ' +
+        'links wählen, ob der Test fortgesetzt oder beendet werden soll!',
+      description: 'Nachricht, dass ein Test (Booklet) gestartet ist, mit Aufforderung zum Klicken'
+    },
+    'login_testEndButtonText': {
+      defaultvalue: 'Test beenden',
+      description: 'Schalterbeschriftung für "Test beenden"'
+    },
+    'login_testReturnButtonText': {
+      defaultvalue: 'Zum Test zurückkehren',
+      description: 'Schalterbeschriftung für "Zurück zum Test"'
+    },
+    'login_bookletSelectPromptNull': {
+      defaultvalue: 'Beendet. Es können keine weiteren Testhefte gestartet werden.',
+      description: 'Nachricht für den Fall, dass Booklet(s) beendet wurden und keine weiteren zur Verfügung stehen'
+    },
+    'login_bookletSelectPromptOne': {
+      defaultvalue: 'Bitte klicke auf die Schaltfläche auf der linken Seite, um den Test zu starten!',
+      description: 'Aufforderung, aus einer Schalterliste einen Test auszusuchen'
+    },
+    'login_bookletSelectPromptMany': {
+      defaultvalue: 'Bitte klicke auf eine der Schaltflächen auf der linken Seite, um einen Test zu starten!',
+      description: ''
+    },
+    'login_codeInputPrompt': {
+      defaultvalue: 'Bitte Log-in eingeben, der auf dem Zettel steht!',
+      description: ''
+    },
+    'login_codeInputTitle': {
+      defaultvalue: 'Log-in eingeben',
+      description: ''
+    },
+    'booklet_msgPresentationNotCompleteTitleNext': {
+      defaultvalue: 'Weiterblättern nicht möglich!',
+      description: ''
+    },
+    'booklet_msgPresentationNotCompleteTextNext': {
+        defaultvalue: 'Du kannst erst weiterblättern, wenn Audio-Dateien vollständig abgespielt wurden '
+          + 'und wenn du in allen Fenstern bis ganz nach unten gescrollt hast.',
+      description: ''
+    },
+    'booklet_msgPresentationNotCompleteTitlePrev': {
+      defaultvalue: 'Zurückblättern - Warnung',
+      description: ''
+    },
+    'booklet_msgPresentationNotCompleteTextPrev': {
+        defaultvalue: 'Eine Audio-Datei ist noch nicht bis zu Ende abgespielt oder Seiten wurden noch nicht vollständig gezeigt. '
+          + 'Wenn du jetzt zurückblätterst, kannst Du später Audio-Dateien nicht nocheinmal starten.',
+      description: ''
+    },
+    'booklet_codeToEnterTitle': {
+      defaultvalue: 'Freigabewort',
+      description: ''
+    },
+    'booklet_codeToEnterPrompt': {
+      defaultvalue: 'Bitte gib das Freigabewort ein, das angesagt wurde!',
+      description: ''
+    },
+    'booklet_msgSoonTimeOver5Minutes': {
+      defaultvalue: 'Du hast noch 5 Minuten Zeit für die Bearbeitung der Aufgaben in diesem Abschnitt.',
+      description: ''
+    },
+    'booklet_msgSoonTimeOver1Minute': {
+      defaultvalue: 'Du hast noch 1 Minute Zeit für die Bearbeitung der Aufgaben in diesem Abschnitt.',
+      description: ''
+    },
+    'booklet_msgTimerStarted': {
+      defaultvalue: 'Die Bearbeitungszeit für diesen Abschnitt hat begonnen: ',
+      description: ''
+    },
+    'booklet_msgTimerCancelled': {
+      defaultvalue: 'Die Bearbeitung des Abschnittes wurde abgebrochen.',
+      description: ''
+    },
+    'booklet_msgTimeOver': {
+      defaultvalue: 'Die Bearbeitung des Abschnittes ist beendet.',
+      description: ''
+    },
+    'booklet_warningLeaveTimerBlockTitle': {
+      defaultvalue: 'Aufgabenabschnitt verlassen?',
+      description: ''
+    },
+    'booklet_warningLeaveTimerBlockPrompt': {
+      defaultvalue: 'Wenn du jetzt weiterblätterst, beendest ' +
+        'du vorzeitig die Bearbeitung dieses Aufgabenabschnitts und du kannst nicht mehr zurück.',
+      description: ''
+    },
+    'login_trialmodeText': {
+      defaultvalue: 'Ausführungsmodus "trial": Navigationsbeschränkungen sowie Zeit-Beschränkungen, ' +
+        'die eventuell für das Testheft oder bestimmte Aufgaben festgelegt wurden, gelten nicht.',
+      description: ''
+    },
+    'login_reviewmodeText': {
+      defaultvalue: 'Ausführungsmodus "review": Beschränkungen für Zeit und Navigation sind nicht wirksam. Antworten werden ' +
+        'nicht gespeichert. Sie können Kommentare über das Menü oben rechts speichern.',
+      description: ''
+    }
+  }
+};
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 23fe27f1..05c749e1 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -17,7 +17,7 @@ import { LocationStrategy, HashLocationStrategy } from '@angular/common';
 import { FlexLayoutModule } from '@angular/flex-layout';
 import { ErrormsgComponent } from './errormsg/errormsg.component';
 import { httpInterceptorProviders } from './app.interceptor';
-import { CustomTextPipe } from './custom-text.pipe';
+import {IqbComponentsModule} from "iqb-components";
 
 
 @NgModule({
@@ -25,8 +25,7 @@ import { CustomTextPipe } from './custom-text.pipe';
     AppComponent,
     StartComponent,
     AboutComponent,
-    ErrormsgComponent,
-    CustomTextPipe
+    ErrormsgComponent
   ],
   imports: [
     BrowserModule,
@@ -49,7 +48,8 @@ import { CustomTextPipe } from './custom-text.pipe';
     ReactiveFormsModule,
     HttpClientModule,
     MatToolbarModule,
-    AppRoutingModule
+    AppRoutingModule,
+    IqbComponentsModule
   ],
   providers: [
     BackendService,
diff --git a/src/app/custom-text.pipe.spec.ts b/src/app/custom-text.pipe.spec.ts
deleted file mode 100644
index 72be11de..00000000
--- a/src/app/custom-text.pipe.spec.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { CustomTextPipe } from './custom-text.pipe';
-
-describe('CustomTextPipe', () => {
-  it('create an instance', () => {
-    const pipe = new CustomTextPipe();
-    expect(pipe).toBeTruthy();
-  });
-});
diff --git a/src/app/custom-text.pipe.ts b/src/app/custom-text.pipe.ts
deleted file mode 100644
index 4dff10b2..00000000
--- a/src/app/custom-text.pipe.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { Pipe, PipeTransform } from '@angular/core';
-import { MainDataService } from './maindata.service';
-
-@Pipe({
-  name: 'customText'
-})
-export class CustomTextPipe implements PipeTransform {
-
-  constructor ( private mds: MainDataService ) {}
-
-  transform(valueForChangeDetection: any, key: string): string {
-    return this.mds.getCostumText(key);
-  }
-}
diff --git a/src/app/maindata.service.ts b/src/app/maindata.service.ts
index 02cf855b..bcd53310 100644
--- a/src/app/maindata.service.ts
+++ b/src/app/maindata.service.ts
@@ -22,47 +22,6 @@ export class MainDataService {
     bookletlabel: '',
     costumTexts: {}
   };
-  private static defaultCostumTexts: KeyValuePair = {
-    'app_title': 'IQB-Testcenter',
-    'app_intro1': 'betreibt auf diesen Seiten eine Pilotanwendung für das computerbasierte Leistungstesten von ' +
-        'Schülerinnen und Schülern. Der Zugang zu einem Test ist nur möglich, wenn Sie von Testverantwortlichen ' +
-        'Zugangsdaten erhalten haben, die Sie bitte links eingeben. Es sind keine weiteren Seiten öffentlich verfügbar.',
-    'login_testRunningText': 'Ein Testheft ist gestartet',
-    'login_testRunningLongText': 'Es wird gerade ein Test ausgeführt. Bitte durch Klicken auf eine der beiden Schaltflächen ' +
-              'links wählen, ob der Test fortgesetzt oder beendet werden soll!',
-    'login_testEndButtonText': 'Test beenden',
-    'login_testReturnButtonText': 'Zum Test zurückkehren',
-    'login_bookletSelectPromptNull': 'Beendet. Es können keine weiteren Testhefte gestartet werden.',
-    'login_bookletSelectPromptOne': 'Bitte klicke auf die Schaltfläche auf der linken Seite, um den Test zu starten!',
-    'login_bookletSelectPromptMany': 'Bitte klicke auf eine der Schaltflächen auf der linken Seite, um einen Test zu starten!',
-    'login_codeInputPrompt': 'Bitte Log-in eingeben, der auf dem Zettel steht!',
-    'login_codeInputTitle': 'Log-in eingeben',
-    'booklet_msgPresentationNotCompleteTitleNext':
-        'Weiterblättern nicht möglich!',
-    'booklet_msgPresentationNotCompleteTextNext':
-        'Du kannst erst weiterblättern, wenn Audio-Dateien vollständig abgespielt wurden '
-        + 'und wenn du in allen Fenstern bis ganz nach unten gescrollt hast.',
-    'booklet_msgPresentationNotCompleteTitlePrev':
-        'Zurückblättern - Warnung',
-    'booklet_msgPresentationNotCompleteTextPrev':
-        'Eine Audio-Datei ist noch nicht bis zu Ende abgespielt oder Seiten wurden noch nicht vollständig gezeigt. '
-        + 'Wenn du jetzt zurückblätterst, kannst Du später Audio-Dateien nicht nocheinmal starten.',
-    'booklet_codeToEnterTitle': 'Freigabewort',
-    'booklet_codeToEnterPrompt': 'Bitte gib das Freigabewort ein, das angesagt wurde!',
-    'booklet_msgSoonTimeOver5Minutes': 'Du hast noch 5 Minuten Zeit für die Bearbeitung der Aufgaben in diesem Abschnitt.',
-    'booklet_msgSoonTimeOver1Minute': 'Du hast noch 1 Minute Zeit für die Bearbeitung der Aufgaben in diesem Abschnitt.',
-    'booklet_msgTimerStarted': 'Die Bearbeitungszeit für diesen Abschnitt hat begonnen: ',
-    'booklet_msgTimerCancelled': 'Die Bearbeitung des Abschnittes wurde abgebrochen.',
-    'booklet_msgTimeOver': 'Die Bearbeitung des Abschnittes ist beendet.',
-    'booklet_warningLeaveTimerBlockTitle': 'Aufgabenabschnitt verlassen?',
-    'booklet_warningLeaveTimerBlockPrompt': 'Wenn du jetzt weiterblätterst, beendest ' +
-        'du vorzeitig die Bearbeitung dieses Aufgabenabschnitts und du kannst nicht mehr zurück.',
-    'login_trialmodeText': 'Ausführungsmodus "trial": Navigationsbeschränkungen sowie Zeit-Beschränkungen, ' +
-        'die eventuell für das Testheft oder bestimmte Aufgaben festgelegt wurden, gelten nicht.',
-    'login_reviewmodeText': 'Ausführungsmodus "review": Beschränkungen für Zeit und Navigation sind nicht wirksam. Antworten werden ' +
-            'nicht gespeichert. Sie können Kommentare über das Menü oben rechts speichern.'
-
-  };
 
   public loginData$ = new BehaviorSubject<LoginData>(MainDataService.defaultLoginData);
   public globalErrorMsg$ = new BehaviorSubject<ServerError>(null);
@@ -182,32 +141,4 @@ export class MainDataService {
     const myLoginData = this.loginData$.getValue();
     return myLoginData.persontoken;
   }
-
-  // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-  setCostumTextsApp(sc: KeyValuePair = {}) {
-    this.refreshCostumTexts = false;
-    this._costumTextsApp = sc;
-    this.refreshCostumTexts = true;
-  }
-  setCostumTextsLogin(sc: KeyValuePair = {}) {
-    this.refreshCostumTexts = false;
-    this._costumTextsLogin = sc;
-    this.refreshCostumTexts = true;
-  }
-  getCostumText(key: string): string {
-    if (this._costumTextsLogin) {
-      if (this._costumTextsLogin.hasOwnProperty(key)) {
-        return this._costumTextsLogin[key];
-      }
-    }
-    if (this._costumTextsApp) {
-      if (this._costumTextsApp.hasOwnProperty(key)) {
-        return this._costumTextsApp[key];
-      }
-    }
-    if (MainDataService.defaultCostumTexts.hasOwnProperty(key)) {
-      return MainDataService.defaultCostumTexts[key];
-    }
-    return key;
-  }
 }
diff --git a/src/app/start/start.component.html b/src/app/start/start.component.html
index 400d05d9..aeecb449 100644
--- a/src/app/start/start.component.html
+++ b/src/app/start/start.component.html
@@ -34,7 +34,7 @@
     <!-- - - - - - - - - - - - - - - - - -->
     <mat-card fxFlex="0 0 400px" *ngIf="showCodeForm">
       <form [formGroup]="codeinputform" (ngSubmit)="codeinput()">
-        <mat-card-title>{{ showCodeForm | customText:'login_codeInputTitle' }}</mat-card-title>
+        <mat-card-title>{{ 'login_codeInputTitle' | customtext:'login_codeInputTitle':cts.updateCount }}</mat-card-title>
         <mat-card-content>
           <mat-form-field>
             <input matInput formControlName="code" (keyup.enter)="codeinput()"> <!-- no placeholder! -->
diff --git a/src/app/start/start.component.ts b/src/app/start/start.component.ts
index 9d044b67..de27c9f5 100644
--- a/src/app/start/start.component.ts
+++ b/src/app/start/start.component.ts
@@ -1,6 +1,6 @@
 import { MainDataService } from '../maindata.service';
 import { Subscription, forkJoin } from 'rxjs';
-import { MessageDialogComponent, MessageDialogData, MessageType, ServerError } from 'iqb-components';
+import {CustomtextService, MessageDialogComponent, MessageDialogData, MessageType, ServerError} from 'iqb-components';
 import { MatDialog } from '@angular/material';
 import { BackendService } from '../backend.service';
 import { PersonTokenAndBookletDbId, LoginData } from '../app.interfaces';
@@ -44,8 +44,8 @@ export class StartComponent implements OnInit, OnDestroy {
     public mds: MainDataService,
     public messsageDialog: MatDialog,
     private router: Router,
-    private bs: BackendService) {
-
+    private bs: BackendService,
+    private cts: CustomtextService) {
   }
 
   ngOnInit() {
@@ -60,7 +60,7 @@ export class StartComponent implements OnInit, OnDestroy {
         this.loginStatusText.push('Gruppe: ' + logindata.groupname);
 
         if (logindata.mode === 'trial') {
-          const tmt = this.mds.getCostumText('login_trialmodeText');
+          const tmt = this.cts.getCostumText('login_trialmodeText');
           if (tmt.length > 0) {
             this.loginStatusText.push(tmt);
           }
diff --git a/src/app/sys-check/environment-check/environment-check.component.ts b/src/app/sys-check/environment-check/environment-check.component.ts
index 9531d640..f3c3c4f2 100644
--- a/src/app/sys-check/environment-check/environment-check.component.ts
+++ b/src/app/sys-check/environment-check/environment-check.component.ts
@@ -1,5 +1,5 @@
 import { Component, OnInit } from '@angular/core';
-import { SyscheckDataService } from '../syscheck-data.service';
+import { SysCheckDataService } from '../sys-check-data.service';
 import { ReportEntry } from '../sys-check.interfaces';
 
 @Component({
@@ -27,7 +27,7 @@ export class EnvironmentCheckComponent implements OnInit {
   };
 
   constructor(
-    private ds: SyscheckDataService
+    private ds: SysCheckDataService
   ) { }
 
   ngOnInit() {
diff --git a/src/app/sys-check/network-check/network-check.component.ts b/src/app/sys-check/network-check/network-check.component.ts
index fa887201..4dd99635 100644
--- a/src/app/sys-check/network-check/network-check.component.ts
+++ b/src/app/sys-check/network-check/network-check.component.ts
@@ -1,4 +1,4 @@
-import { SyscheckDataService } from '../syscheck-data.service';
+import { SysCheckDataService } from '../sys-check-data.service';
 import { Component, Input, OnInit, ViewChild } from '@angular/core';
 import {BackendService} from '../backend.service';
 import { combineLatest } from 'rxjs';
@@ -16,7 +16,7 @@ import {
 export class NetworkCheckComponent implements OnInit {
 
   constructor(
-    private ds: SyscheckDataService,
+    private ds: SysCheckDataService,
     private bs: BackendService
   ) {}
 
diff --git a/src/app/sys-check/questionnaire/questionnaire.component.html b/src/app/sys-check/questionnaire/questionnaire.component.html
index e227530c..1d51f4a0 100644
--- a/src/app/sys-check/questionnaire/questionnaire.component.html
+++ b/src/app/sys-check/questionnaire/questionnaire.component.html
@@ -1,6 +1,6 @@
 <mat-card-header>
   <mat-card-title>Fragen</mat-card-title>
-  <mat-card-subtitle>Bitte bearbeiten Sie die nachfolgenden Fragen.</mat-card-subtitle>
+  <mat-card-subtitle>{{'Bitte bearbeiten Sie die nachfolgenden Fragen.'| customtext:'QuestionsIntro':cts.updateCount}}</mat-card-subtitle>
 </mat-card-header>
 
 <mat-card-content style="height: 610px; overflow: auto">
diff --git a/src/app/sys-check/questionnaire/questionnaire.component.ts b/src/app/sys-check/questionnaire/questionnaire.component.ts
index 1359ecd9..ad953608 100644
--- a/src/app/sys-check/questionnaire/questionnaire.component.ts
+++ b/src/app/sys-check/questionnaire/questionnaire.component.ts
@@ -1,7 +1,8 @@
 import { FormControl, FormGroup } from '@angular/forms';
-import { SyscheckDataService } from '../syscheck-data.service';
+import { SysCheckDataService } from '../sys-check-data.service';
 import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
 import {FormDefEntry, ReportEntry} from "../sys-check.interfaces";
+import {CustomtextService} from "iqb-components";
 
 @Component({
   selector: 'iqb-questionnaire',
@@ -15,7 +16,8 @@ export class QuestionnaireComponent implements OnInit {
   form: FormGroup;
 
   constructor(
-    private ds: SyscheckDataService
+    private ds: SysCheckDataService,
+    private cts: CustomtextService
   ) {
   }
 
diff --git a/src/app/sys-check/report/report.component.ts b/src/app/sys-check/report/report.component.ts
index cf12bb93..b32a2468 100644
--- a/src/app/sys-check/report/report.component.ts
+++ b/src/app/sys-check/report/report.component.ts
@@ -1,5 +1,5 @@
 import {BackendService} from '../backend.service';
-import { SyscheckDataService } from '../syscheck-data.service';
+import { SysCheckDataService } from '../sys-check-data.service';
 import {Component, Input} from '@angular/core';
 import {SaveReportComponent} from './save-report/save-report.component';
 import {MatDialog, MatSnackBar} from '@angular/material';
@@ -30,7 +30,7 @@ export class ReportComponent {
 
   constructor(
     private bs: BackendService,
-    private ds: SyscheckDataService,
+    private ds: SysCheckDataService,
     private saveDialog: MatDialog,
     private snackBar: MatSnackBar
   ) {
diff --git a/src/app/sys-check/start.component.ts b/src/app/sys-check/start.component.ts
index 8873658b..760a2b9f 100644
--- a/src/app/sys-check/start.component.ts
+++ b/src/app/sys-check/start.component.ts
@@ -1,4 +1,4 @@
-import { SyscheckDataService } from './syscheck-data.service';
+import { SysCheckDataService } from './sys-check-data.service';
 import { Router, ActivatedRoute } from '@angular/router';
 import { BackendService } from './backend.service';
 import { Component, OnInit } from '@angular/core';
@@ -17,7 +17,7 @@ export class StartComponent implements OnInit {
 
   constructor(
     private bs: BackendService,
-    private ds: SyscheckDataService,
+    private ds: SysCheckDataService,
     private route: ActivatedRoute,
     private router: Router) { }
 
diff --git a/src/app/sys-check/syscheck-data.service.ts b/src/app/sys-check/sys-check-data.service.ts
similarity index 98%
rename from src/app/sys-check/syscheck-data.service.ts
rename to src/app/sys-check/sys-check-data.service.ts
index 480584ca..0acbf49b 100644
--- a/src/app/sys-check/syscheck-data.service.ts
+++ b/src/app/sys-check/sys-check-data.service.ts
@@ -7,7 +7,7 @@ type Task = 'loadunit' | 'speedtest' | null;
 @Injectable({
   providedIn: 'root'
 })
-export class SyscheckDataService {
+export class SysCheckDataService {
 
   public checkConfig$ = new BehaviorSubject<CheckConfigData>(
     {
diff --git a/src/app/sys-check/sys-check.component.ts b/src/app/sys-check/sys-check.component.ts
index 26fa5676..8166eb29 100644
--- a/src/app/sys-check/sys-check.component.ts
+++ b/src/app/sys-check/sys-check.component.ts
@@ -1,8 +1,9 @@
-import { SyscheckDataService } from './syscheck-data.service';
+import { SysCheckDataService } from './sys-check-data.service';
 import { ActivatedRoute, ParamMap } from '@angular/router';
 import { Component, OnInit} from '@angular/core';
 import {BackendService} from './backend.service';
 import {Subscription} from "rxjs";
+import {CustomtextService} from "iqb-components";
 
 
 interface Checks {
@@ -34,8 +35,9 @@ export class SysCheckComponent implements OnInit {
 
   constructor(
     private bs: BackendService,
-    private ds: SyscheckDataService,
-    private route: ActivatedRoute
+    private ds: SysCheckDataService,
+    private route: ActivatedRoute,
+    private cts: CustomtextService
   ) {
   }
 
@@ -57,6 +59,13 @@ export class SysCheckComponent implements OnInit {
         if (this.checks.network) {
           this.ds.taskQueue.push('speedtest');
         }
+        if (checkConfig.customtexts.length > 0) {
+          const myCustomTexts: {[key: string]: string} = {};
+          checkConfig.customtexts.forEach(ct => {
+            myCustomTexts[ct.key] = ct.value;
+          })
+          this.cts.addCustomTexts(myCustomTexts);
+        }
         this.ds.nextTask();
         this.taskSubscription = this.ds.task$.subscribe(task => {
           this.dataLoading = (typeof task !== 'undefined') && (this.ds.taskQueue.length > 0);
diff --git a/src/app/sys-check/sys-check.module.ts b/src/app/sys-check/sys-check.module.ts
index 83eaee88..71712ee8 100644
--- a/src/app/sys-check/sys-check.module.ts
+++ b/src/app/sys-check/sys-check.module.ts
@@ -1,5 +1,5 @@
 import { ResizeIFrameChildDirective } from './unit-check/resize-IFrameChild/resize-IFrameChild.directive';
-import { SyscheckDataService } from './syscheck-data.service';
+import { SysCheckDataService } from './sys-check-data.service';
 import { BackendService } from './backend.service';
 import { NgModule } from '@angular/core';
 import { CommonModule } from '@angular/common';
@@ -25,6 +25,7 @@ import { UnitNaviButtonsComponent } from './unit-check/tc-navi-buttons/unit-navi
 
 import { TcSpeedChartComponent } from './network-check/tc-speed-chart.component';
 import {MatTooltipModule} from "@angular/material/tooltip";
+import {IqbComponentsModule} from "iqb-components";
 
 @NgModule({
   imports: [
@@ -46,7 +47,8 @@ import {MatTooltipModule} from "@angular/material/tooltip";
     MatTooltipModule,
     MatSnackBarModule,
     MatDialogModule,
-    ReactiveFormsModule
+    ReactiveFormsModule,
+    IqbComponentsModule
   ],
   declarations: [
     StartComponent,
@@ -69,7 +71,7 @@ import {MatTooltipModule} from "@angular/material/tooltip";
   ],
   providers: [
     BackendService,
-    SyscheckDataService
+    SysCheckDataService
   ]
 })
 export class SysCheckModule { }
diff --git a/src/app/sys-check/syscheck-data.service.spec.ts b/src/app/sys-check/syscheck-data.service.spec.ts
index 3ea84d60..6b13c454 100644
--- a/src/app/sys-check/syscheck-data.service.spec.ts
+++ b/src/app/sys-check/syscheck-data.service.spec.ts
@@ -1,15 +1,15 @@
 import { TestBed, inject } from '@angular/core/testing';
 
-import { SyscheckDataService } from './syscheck-data.service';
+import { SysCheckDataService } from './sys-check-data.service';
 
 describe('SyscheckDataService', () => {
   beforeEach(() => {
     TestBed.configureTestingModule({
-      providers: [SyscheckDataService]
+      providers: [SysCheckDataService]
     });
   });
 
-  it('should be created', inject([SyscheckDataService], (service: SyscheckDataService) => {
+  it('should be created', inject([SysCheckDataService], (service: SysCheckDataService) => {
     expect(service).toBeTruthy();
   }));
 });
diff --git a/src/app/sys-check/unit-check/tc-navi-buttons/unit-navi-buttons.component.ts b/src/app/sys-check/unit-check/tc-navi-buttons/unit-navi-buttons.component.ts
index c8bd05a4..fc58ae7f 100644
--- a/src/app/sys-check/unit-check/tc-navi-buttons/unit-navi-buttons.component.ts
+++ b/src/app/sys-check/unit-check/tc-navi-buttons/unit-navi-buttons.component.ts
@@ -1,4 +1,4 @@
-import { SyscheckDataService } from '../../syscheck-data.service';
+import { SysCheckDataService } from '../../sys-check-data.service';
 import { Component, OnInit } from '@angular/core';
 
 @Component({
@@ -11,7 +11,7 @@ export class UnitNaviButtonsComponent {
   private pagePrevEnabled = false;
   private pageNextEnabled = false;
 
-  constructor(private ds: SyscheckDataService) {
+  constructor(private ds: SysCheckDataService) {
 
     this.ds.itemplayerValidPages$.subscribe((pages: string[]) => this.showPageNaviButtons = pages.length  > 1);
     this.ds.itemplayerCurrentPage$.subscribe((p: string) => {
diff --git a/src/app/sys-check/unit-check/unit-check.component.ts b/src/app/sys-check/unit-check/unit-check.component.ts
index d709c327..56778e2f 100644
--- a/src/app/sys-check/unit-check/unit-check.component.ts
+++ b/src/app/sys-check/unit-check/unit-check.component.ts
@@ -1,6 +1,6 @@
 import { MainDataService } from '../../maindata.service';
 import { BackendService } from '../backend.service';
-import { SyscheckDataService } from '../syscheck-data.service';
+import { SysCheckDataService } from '../sys-check-data.service';
 import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
 import { OnDestroy } from '@angular/core';
 import { Subscription, BehaviorSubject, combineLatest} from 'rxjs';
@@ -28,7 +28,7 @@ export class UnitCheckComponent implements OnInit, OnDestroy {
   public errorMessage = '';
 
   constructor(
-    private ds: SyscheckDataService,
+    private ds: SysCheckDataService,
     private bs: BackendService,
     private mds: MainDataService
   ) {
diff --git a/src/app/test-controller/test-controller.component.ts b/src/app/test-controller/test-controller.component.ts
index d97950a6..4f360201 100644
--- a/src/app/test-controller/test-controller.component.ts
+++ b/src/app/test-controller/test-controller.component.ts
@@ -11,7 +11,7 @@ import { UnitDef, Testlet, EnvironmentData, MaxTimerData } from './test-controll
 import { LastStateKey, LogEntryKey, BookletData, UnitData, MaxTimerDataType, TaggedString } from './test-controller.interfaces';
 import { Subscription, Observable, of, from } from 'rxjs';
 import { switchMap, concatMap } from 'rxjs/operators';
-import {ServerError} from "iqb-components";
+import {CustomtextService, ServerError} from "iqb-components";
 
 @Component({
   templateUrl: './test-controller.component.html',
@@ -42,7 +42,8 @@ export class TestControllerComponent implements OnInit, OnDestroy {
     private bs: BackendService,
     private reviewDialog: MatDialog,
     private snackBar: MatSnackBar,
-    private router: Router
+    private router: Router,
+    private cts: CustomtextService
   ) { }
 
   // ''''''''''''''''''''''''''''''''''''''''''''''''''''
@@ -51,7 +52,7 @@ export class TestControllerComponent implements OnInit, OnDestroy {
     if (value.length > 0) {
       return value;
     } else {
-      return this.mds.getCostumText(key);
+      return this.cts.getCustomText(key, key);
     }
   }
   // ''''''''''''''''''''''''''''''''''''''''''''''''''''
-- 
GitLab