From 390c87e5c56c9b752f83f90aac46e4a1896544dc Mon Sep 17 00:00:00 2001 From: mechtelm <nicht@mehr.fragen> Date: Fri, 27 Mar 2020 18:49:42 +0100 Subject: [PATCH] Eureka (solved): ExpressionChangedAfterItHasBeenCheckedError (setTimeout) #88; sys-check adapted to app-root-approach --- src/app/app-root/about/about.component.css | 7 -- src/app/app-root/about/about.component.html | 86 +++++++++-------- src/app/app-root/about/about.component.ts | 7 +- src/app/app-root/app-root.component.css | 7 -- src/app/app-root/app-root.component.html | 45 +-------- src/app/app-root/app-root.component.spec.ts | 16 ---- src/app/app-root/app-root.component.ts | 3 +- .../app-status/app-status.component.css | 0 .../app-status/app-status.component.html | 1 + .../app-status/app-status.component.spec.ts | 25 +++++ .../app-status/app-status.component.ts | 15 +++ src/app/app-root/login/login.component.html | 41 ++++++++ .../login/login.component.spec.ts} | 18 ++-- src/app/app-root/login/login.component.ts | 57 +++++++++++ .../sys-check-starter.component.css | 15 +++ .../sys-check-starter.component.html | 33 +++++++ .../sys-check-starter.component.spec.ts | 25 +++++ .../sys-check-starter.component.ts | 55 +++++++++++ src/app/app-routing.module.ts | 14 ++- src/app/app.component.html | 2 +- src/app/app.component.ts | 7 +- src/app/app.interfaces.ts | 12 +++ src/app/app.module.ts | 8 +- src/app/backend.service.ts | 13 ++- src/app/maindata.service.ts | 10 +- src/app/sys-check/backend.service.ts | 14 --- src/app/sys-check/index.ts | 1 - src/app/sys-check/start.component.css | 19 ---- src/app/sys-check/start.component.html | 35 ------- src/app/sys-check/start.component.ts | 46 --------- src/app/sys-check/sys-check-data.service.ts | 29 +----- src/app/sys-check/sys-check-routing.module.ts | 11 +-- src/app/sys-check/sys-check.component.html | 28 ++---- src/app/sys-check/sys-check.component.ts | 94 ++++++++++--------- src/app/sys-check/sys-check.interfaces.ts | 7 -- src/app/sys-check/sys-check.module.ts | 5 - src/styles.css | 27 +++++- 37 files changed, 462 insertions(+), 376 deletions(-) delete mode 100644 src/app/app-root/about/about.component.css delete mode 100644 src/app/app-root/app-root.component.css create mode 100644 src/app/app-root/app-status/app-status.component.css create mode 100644 src/app/app-root/app-status/app-status.component.html create mode 100644 src/app/app-root/app-status/app-status.component.spec.ts create mode 100644 src/app/app-root/app-status/app-status.component.ts create mode 100644 src/app/app-root/login/login.component.html rename src/app/{sys-check/start.component.spec.ts => app-root/login/login.component.spec.ts} (57%) create mode 100644 src/app/app-root/login/login.component.ts create mode 100644 src/app/app-root/sys-check-starter/sys-check-starter.component.css create mode 100644 src/app/app-root/sys-check-starter/sys-check-starter.component.html create mode 100644 src/app/app-root/sys-check-starter/sys-check-starter.component.spec.ts create mode 100644 src/app/app-root/sys-check-starter/sys-check-starter.component.ts delete mode 100644 src/app/sys-check/index.ts delete mode 100644 src/app/sys-check/start.component.css delete mode 100644 src/app/sys-check/start.component.html delete mode 100644 src/app/sys-check/start.component.ts diff --git a/src/app/app-root/about/about.component.css b/src/app/app-root/about/about.component.css deleted file mode 100644 index 0b20083e..00000000 --- a/src/app/app-root/about/about.component.css +++ /dev/null @@ -1,7 +0,0 @@ -.about-frame { - margin: 90px; -} - -.status { - background-color: lightgrey; -} diff --git a/src/app/app-root/about/about.component.html b/src/app/app-root/about/about.component.html index f0e76db1..a377d402 100644 --- a/src/app/app-root/about/about.component.html +++ b/src/app/app-root/about/about.component.html @@ -1,48 +1,46 @@ -<div class="about-frame" fxLayout="row" fxLayoutAlign="center start"> - <mat-card fxFlex="0 0 500px"> - <mat-card-title>{{ 'app_title' | customtext:'app_title':cts.updateCount }} - Impressum/Datenschutz</mat-card-title> +<mat-card fxFlex="0 0 500px"> + <mat-card-title>{{ 'app_title' | customtext:'app_title':cts.updateCount }} - Impressum/Datenschutz</mat-card-title> - <!-- - - - - - - - - - - - - - - - - --> - <mat-card-content> - <p>Das <a href="http://www.iqb.hu-berlin.de" target="_blank">Institut zur Qualitätsentwicklung im Bildungswesen</a> - {{ 'app_intro1' | customtext:'app_intro1':cts.updateCount }}</p> + <!-- - - - - - - - - - - - - - - - - --> + <mat-card-content> + <p>Das <a href="http://www.iqb.hu-berlin.de" target="_blank">Institut zur Qualitätsentwicklung im Bildungswesen</a> + {{ '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 - zu erhalten, wenden Sie sich bitte an das <a href="mailto:mechtel@iqb.hu-berlin.de"> - IQB</a>. Wir benötigen dazu den ungefähren Zeitraum und das Bundesland, in dem die Befragung bzw. Studie - durchgeführt wurde.</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 + zu erhalten, wenden Sie sich bitte an das <a href="mailto:mechtel@iqb.hu-berlin.de"> + IQB</a>. Wir benötigen dazu den ungefähren Zeitraum und das Bundesland, in dem die Befragung bzw. Studie + durchgeführt wurde.</p> - <ul> - <li>Programmname: {{ appName }}</li> - <li>Programmversion: {{ appVersion }}</li> - <li>Copyright: {{ appPublisher }}</li> - </ul> + <ul> + <li>Programmname: {{ appName }}</li> + <li>Programmversion: {{ appVersion }}</li> + <li>Copyright: {{ appPublisher }}</li> + </ul> - <p> - <em>Postanschrift:</em><br/> - Humboldt-Universität zu Berlin<br/> - Institut zur Qualitätsentwicklung im Bildungswesen<br/> - Unter den Linden 6<br/> - 10099 Berlin</p> - <p> - <em>Sitz:</em><br/> - Luisenstr. 56<br/> - 10117 Berlin<br/> - Tel: +49 [30] 2093 - 46500 (Zentrale)<br/> - Fax: +49 [30] 2093 - 46599<br/> - E-Mail: <a href="mailto:iqboffice@iqb.hu-berlin.de">iqboffice@iqb.hu-berlin.de</a> - </p> - <p> - <em>Name und Anschrift der Datenschutzbeauftragten</em><br/> - Frau Gesine Hoffmann-Holland<br/> - Tel: +49 (30) 2093-2591<br/> - E-Mail: datenschutz@uv.hu-berlin.de<br/> - <a href="http://www.hu-berlin.de/de/datenschutz" target="_blank">www.hu-berlin.de/de/datenschutz</a> - </p> - </mat-card-content> - <mat-card-actions> - <button (click)="goBack()" mat-raised-button color="primary"><i class="material-icons">arrow_back</i> zurück zur Startseite</button> - </mat-card-actions> - </mat-card> -</div> + <p> + <em>Postanschrift:</em><br/> + Humboldt-Universität zu Berlin<br/> + Institut zur Qualitätsentwicklung im Bildungswesen<br/> + Unter den Linden 6<br/> + 10099 Berlin</p> + <p> + <em>Sitz:</em><br/> + Luisenstr. 56<br/> + 10117 Berlin<br/> + Tel: +49 [30] 2093 - 46500 (Zentrale)<br/> + Fax: +49 [30] 2093 - 46599<br/> + E-Mail: <a href="mailto:iqboffice@iqb.hu-berlin.de">iqboffice@iqb.hu-berlin.de</a> + </p> + <p> + <em>Name und Anschrift der Datenschutzbeauftragten</em><br/> + Frau Gesine Hoffmann-Holland<br/> + Tel: +49 (30) 2093-2591<br/> + E-Mail: datenschutz@uv.hu-berlin.de<br/> + <a href="http://www.hu-berlin.de/de/datenschutz" target="_blank">www.hu-berlin.de/de/datenschutz</a> + </p> + </mat-card-content> + <mat-card-actions> + <button [routerLink]="['/']" mat-raised-button color="primary"><i class="material-icons">arrow_back</i> zurück zur Startseite</button> + </mat-card-actions> +</mat-card> diff --git a/src/app/app-root/about/about.component.ts b/src/app/app-root/about/about.component.ts index 74692b86..ae714b6e 100644 --- a/src/app/app-root/about/about.component.ts +++ b/src/app/app-root/about/about.component.ts @@ -1,10 +1,9 @@ import { Component, Inject } from '@angular/core'; -import { Router } from '@angular/router'; import { CustomtextService } from 'iqb-components'; @Component({ templateUrl: './about.component.html', - styleUrls: ['./about.component.css'] + styles: ['mat-card {background-color: lightgray;}'] }) export class AboutComponent { @@ -12,11 +11,7 @@ export class AboutComponent { @Inject('APP_NAME') public appName: string, @Inject('APP_PUBLISHER') public appPublisher: string, @Inject('APP_VERSION') public appVersion: string, - private router: Router, public cts: CustomtextService ) { } - goBack() { - this.router.navigate(['/']); - } } diff --git a/src/app/app-root/app-root.component.css b/src/app/app-root/app-root.component.css deleted file mode 100644 index fd8e4a93..00000000 --- a/src/app/app-root/app-root.component.css +++ /dev/null @@ -1,7 +0,0 @@ -.root-frame { - padding: 80px; -} - -.root-frame mat-card { - margin: 10px; -} diff --git a/src/app/app-root/app-root.component.html b/src/app/app-root/app-root.component.html index 6a7b0607..4b415943 100644 --- a/src/app/app-root/app-root.component.html +++ b/src/app/app-root/app-root.component.html @@ -1,46 +1,3 @@ <div class="root-frame" fxLayout="row wrap" fxLayoutAlign="center stretch"> - - <!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --> - <mat-card fxFlex="0 0 400px" fxLayout="column" *ngIf="showLoginForm"> - <!-- - - - - - - - - - - - - - - - - --> - <form [formGroup]="loginForm" (ngSubmit)="login()"> - <mat-card-title>Anmelden</mat-card-title> - <mat-card-content fxLayout="column"> - <mat-form-field> - <input matInput formControlName="name" placeholder="Anmeldename" (keyup.enter)="pw.focus()"> - </mat-form-field> - <mat-form-field> - <input matInput #pw type="password" formControlName="pw" placeholder="Kennwort" (keyup.enter)="login()"> - </mat-form-field> - </mat-card-content> - <mat-card-actions> - <button mat-raised-button type="submit" [disabled]="loginForm.invalid" color="primary">Weiter</button> - </mat-card-actions> - </form> - </mat-card> - - - <!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --> - <!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --> - <mat-card fxFlex="0 2 400px" fxLayout="column" class="status"> - <mat-card-title>{{ 'app_title' | customtext:'app_title':cts.updateCount }}</mat-card-title> - - <!-- - - - - - - - - - - - - - - - - --> - <mat-card-content> - <div *ngIf="showLoginForm"> - <p>Das <a href="http://www.iqb.hu-berlin.de" target="_blank">Institut zur Qualitätsentwicklung im Bildungswesen</a> - {{ '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 - zu erhalten, wenden Sie sich bitte an das <a href="mailto:mechtel@iqb.hu-berlin.de"> - IQB</a>. Wir benötigen dazu den ungefähren Zeitraum und das Bundesland, in dem die Befragung bzw. Studie - durchgeführt wurde.</p> - </div> - </mat-card-content> - <mat-card-actions> - <button mat-raised-button color="foreground" [routerLink]="['/about']">Impressum/Datenschutz</button> - <button mat-raised-button color="foreground" [routerLink]="['/check']">System-Check</button> - </mat-card-actions> - </mat-card> + <router-outlet></router-outlet> </div> diff --git a/src/app/app-root/app-root.component.spec.ts b/src/app/app-root/app-root.component.spec.ts index 95001447..79d00922 100644 --- a/src/app/app-root/app-root.component.spec.ts +++ b/src/app/app-root/app-root.component.spec.ts @@ -1,12 +1,6 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { AppRootComponent } from './app-root.component'; -import {HttpClientModule} from "@angular/common/http"; -import {ReactiveFormsModule} from "@angular/forms"; -import {MatDialogModule} from "@angular/material/dialog"; -import {AppRoutingModule} from "../app-routing.module"; -import {IqbComponentsModule} from "iqb-components"; -import {BackendService} from "../backend.service"; describe('AppRootComponent', () => { let component: AppRootComponent; @@ -15,16 +9,6 @@ describe('AppRootComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ AppRootComponent ], - imports: [ - HttpClientModule, - ReactiveFormsModule, - MatDialogModule, - AppRoutingModule, - IqbComponentsModule - ], - providers: [ - BackendService - ] }) .compileComponents(); })); diff --git a/src/app/app-root/app-root.component.ts b/src/app/app-root/app-root.component.ts index 85763565..79aab753 100644 --- a/src/app/app-root/app-root.component.ts +++ b/src/app/app-root/app-root.component.ts @@ -6,10 +6,9 @@ import {CustomtextService} from "iqb-components"; @Component({ selector: 'app-app-root', templateUrl: './app-root.component.html', - styleUrls: ['./app-root.component.css'] + styles: ['.root-frame {padding: 80px;}'] }) export class AppRootComponent implements OnInit, OnDestroy { - showLoginForm = true; loginForm = new FormGroup({ name: new FormControl('', [Validators.required, Validators.minLength(3)]), pw: new FormControl('') diff --git a/src/app/app-root/app-status/app-status.component.css b/src/app/app-root/app-status/app-status.component.css new file mode 100644 index 00000000..e69de29b diff --git a/src/app/app-root/app-status/app-status.component.html b/src/app/app-root/app-status/app-status.component.html new file mode 100644 index 00000000..a36e38a5 --- /dev/null +++ b/src/app/app-root/app-status/app-status.component.html @@ -0,0 +1 @@ +<p>app-status works!</p> diff --git a/src/app/app-root/app-status/app-status.component.spec.ts b/src/app/app-root/app-status/app-status.component.spec.ts new file mode 100644 index 00000000..f97e369e --- /dev/null +++ b/src/app/app-root/app-status/app-status.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AppStatusComponent } from './app-status.component'; + +describe('AppStatusComponent', () => { + let component: AppStatusComponent; + let fixture: ComponentFixture<AppStatusComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AppStatusComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AppStatusComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-root/app-status/app-status.component.ts b/src/app/app-root/app-status/app-status.component.ts new file mode 100644 index 00000000..a2c6b53b --- /dev/null +++ b/src/app/app-root/app-status/app-status.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-app-status', + templateUrl: './app-status.component.html', + styleUrls: ['./app-status.component.css'] +}) +export class AppStatusComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/app-root/login/login.component.html b/src/app/app-root/login/login.component.html new file mode 100644 index 00000000..187ae83a --- /dev/null +++ b/src/app/app-root/login/login.component.html @@ -0,0 +1,41 @@ +<!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --> +<mat-card fxFlex="0 0 400px" fxLayout="column"> + <!-- - - - - - - - - - - - - - - - - --> + <form [formGroup]="loginForm" (ngSubmit)="login()"> + <mat-card-title>Anmelden</mat-card-title> + <mat-card-content fxLayout="column"> + <mat-form-field> + <input matInput formControlName="name" placeholder="Anmeldename" (keyup.enter)="pw.focus()"> + </mat-form-field> + <mat-form-field> + <input matInput #pw type="password" formControlName="pw" placeholder="Kennwort" (keyup.enter)="login()"> + </mat-form-field> + </mat-card-content> + <mat-card-actions> + <button mat-raised-button type="submit" [disabled]="loginForm.invalid" color="primary">Weiter</button> + </mat-card-actions> + </form> +</mat-card> + + +<!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --> +<!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --> +<mat-card fxFlex="0 2 400px" fxLayout="column" class="status-card" *ngIf="! returnTo"> + <mat-card-title>{{ 'app_title' | customtext:'app_title':cts.updateCount }}</mat-card-title> + + <!-- - - - - - - - - - - - - - - - - --> + <mat-card-content> + <p>Das <a href="http://www.iqb.hu-berlin.de" target="_blank">Institut zur Qualitätsentwicklung im Bildungswesen</a> + {{ '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 + zu erhalten, wenden Sie sich bitte an das <a href="mailto:mechtel@iqb.hu-berlin.de"> + IQB</a>. Wir benötigen dazu den ungefähren Zeitraum und das Bundesland, in dem die Befragung bzw. Studie + durchgeführt wurde.</p> + </mat-card-content> + <mat-card-actions> + <button mat-raised-button color="foreground" [routerLink]="['../about']">Impressum/Datenschutz</button> + <button mat-raised-button color="foreground" [routerLink]="['../check-starter']">System-Check</button> + </mat-card-actions> +</mat-card> diff --git a/src/app/sys-check/start.component.spec.ts b/src/app/app-root/login/login.component.spec.ts similarity index 57% rename from src/app/sys-check/start.component.spec.ts rename to src/app/app-root/login/login.component.spec.ts index 818d9bec..64c03ad0 100644 --- a/src/app/sys-check/start.component.spec.ts +++ b/src/app/app-root/login/login.component.spec.ts @@ -1,20 +1,22 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { StartComponent } from './start.component'; +import { LoginComponent } from './login.component'; import {HttpClientModule} from "@angular/common/http"; -import {BackendService} from "./backend.service"; -import {AppRoutingModule} from "../app-routing.module"; +import {ReactiveFormsModule} from "@angular/forms"; +import {AppRoutingModule} from "../../app-routing.module"; import {IqbComponentsModule} from "iqb-components"; +import {BackendService} from "../../backend.service"; -describe('StartComponent', () => { - let component: StartComponent; - let fixture: ComponentFixture<StartComponent>; +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture<LoginComponent>; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ StartComponent ], + declarations: [ LoginComponent ], imports: [ HttpClientModule, + ReactiveFormsModule, AppRoutingModule, IqbComponentsModule ], @@ -26,7 +28,7 @@ describe('StartComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(StartComponent); + fixture = TestBed.createComponent(LoginComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/app-root/login/login.component.ts b/src/app/app-root/login/login.component.ts new file mode 100644 index 00000000..afa6861b --- /dev/null +++ b/src/app/app-root/login/login.component.ts @@ -0,0 +1,57 @@ +import {Component, OnDestroy, OnInit} from '@angular/core'; +import {FormControl, FormGroup, Validators} from "@angular/forms"; +import {MainDataService} from "../../maindata.service"; +import {CustomtextService} from "iqb-components"; +import {ActivatedRoute, Router} from "@angular/router"; +import {Subscription} from "rxjs"; + +@Component({ + templateUrl: './login.component.html', + styles: [ + 'mat-card {margin: 10px;}', + 'mat-card:last-of-type {background-color: lightgray;}', + ] +}) + +export class LoginComponent implements OnInit, OnDestroy { + private routingSubscription: Subscription = null; + static oldLoginName = ''; + returnTo = ''; + + loginForm = new FormGroup({ + name: new FormControl(LoginComponent.oldLoginName, [Validators.required, Validators.minLength(3)]), + pw: new FormControl('') + }); + + constructor( + public mds: MainDataService, + public cts: CustomtextService, + private router: Router, + private route: ActivatedRoute + ) { } + + ngOnInit(): void { + this.routingSubscription = this.route.params.subscribe(params => { + this.returnTo = params['returnTo']; + }) + } + + login() { + const loginData = this.loginForm.value; + LoginComponent.oldLoginName = loginData['name']; + this.mds.appError$.next({ + label: loginData['name'], + description: loginData['pw'], + category: "FATAL" + }); + if (this.returnTo) { + this.router.navigateByUrl(this.returnTo); + } + } + + ngOnDestroy() { + if (this.routingSubscription !== null) { + this.routingSubscription.unsubscribe(); + } + } +} diff --git a/src/app/app-root/sys-check-starter/sys-check-starter.component.css b/src/app/app-root/sys-check-starter/sys-check-starter.component.css new file mode 100644 index 00000000..db1722e0 --- /dev/null +++ b/src/app/app-root/sys-check-starter/sys-check-starter.component.css @@ -0,0 +1,15 @@ +.check-title { + font-size: 16pt; + margin-bottom: 0; + height: 24px +} + +.check-description { + font-size: 9pt; + margin-top: 8px; + color: lightgray; + height: 24px; + margin-bottom: 18px; + white-space: normal; + line-height: 16px; +} diff --git a/src/app/app-root/sys-check-starter/sys-check-starter.component.html b/src/app/app-root/sys-check-starter/sys-check-starter.component.html new file mode 100644 index 00000000..7fbb6c99 --- /dev/null +++ b/src/app/app-root/sys-check-starter/sys-check-starter.component.html @@ -0,0 +1,33 @@ +<mat-card fxFlex="0 2 500px"> + <mat-card-title>{{ 'app_title' | customtext:'app_title':cts.updateCount }}: System-Check</mat-card-title> + <mat-card-content> + <p>Hier können Sie ermitteln, ob das Computersystem, das Sie gerade benutzen, für + die hier vorgesehenen Testungen geeignet ist.</p> + <p *ngIf="loading"> + Bitte warten... Konfiguration wird geladen + </p> + <span *ngIf="!loading"> + <p *ngIf="checkConfigList.length === 0"> + Auf diesem Server ist aktuell kein System-Check verfügbar. + </p> + <p *ngIf="checkConfigList.length > 1"> + Bitte wählen Sie einen Check aus! + </p> + <p *ngIf="checkConfigList.length === 1"> + Bitte klicken Sie auf den Schalter, um den Check zu starten! + </p> + </span> + <div fxLayout="column" fxLayoutGap="10px" *ngIf="checkConfigList?.length > 0"> + <button mat-raised-button color="primary" (click)="buttonStartCheck(c)" + *ngFor="let c of checkConfigList"> + <div fxLayout="column"> + <p class="check-title">{{c.label}}</p> + <p class="check-description">{{c.description}}</p> + </div> + </button> + </div> + </mat-card-content> + <mat-card-actions> + <button [routerLink]="['/']" mat-raised-button color="primary"><i class="material-icons">arrow_back</i> zurück zur Startseite</button> + </mat-card-actions> +</mat-card> diff --git a/src/app/app-root/sys-check-starter/sys-check-starter.component.spec.ts b/src/app/app-root/sys-check-starter/sys-check-starter.component.spec.ts new file mode 100644 index 00000000..e8a145d8 --- /dev/null +++ b/src/app/app-root/sys-check-starter/sys-check-starter.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SysCheckStarterComponent } from './sys-check-starter.component'; + +describe('SysCheckStarterComponent', () => { + let component: SysCheckStarterComponent; + let fixture: ComponentFixture<SysCheckStarterComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SysCheckStarterComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SysCheckStarterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/app-root/sys-check-starter/sys-check-starter.component.ts b/src/app/app-root/sys-check-starter/sys-check-starter.component.ts new file mode 100644 index 00000000..98606e0c --- /dev/null +++ b/src/app/app-root/sys-check-starter/sys-check-starter.component.ts @@ -0,0 +1,55 @@ +import {Component, OnInit} from '@angular/core'; +import {BackendService} from "../../backend.service"; +import {Router} from "@angular/router"; +import {MainDataService} from "../../maindata.service"; +import {SysCheckInfo} from "../../app.interfaces"; +import {CustomtextService} from "iqb-components"; + +@Component({ + templateUrl: './sys-check-starter.component.html', + styleUrls: ['./sys-check-starter.component.css'] +}) +export class SysCheckStarterComponent implements OnInit { + checkConfigList: SysCheckInfo[] = []; + loading = false; + + constructor( + public mds: MainDataService, + private bs: BackendService, + public cts: CustomtextService, + private router: Router + ) { } + + ngOnInit() { + setTimeout(() => { + this.loading = true; + this.mds.incrementDelayedProcessesCount(); + this.bs.getSysCheckInfo().subscribe(myConfigs => { + if (myConfigs) { + this.checkConfigList = myConfigs; + } else { + this.checkConfigList = [ + { + workspaceId: "20", + name: "UjjUUjj", + label: "Machbarkeit 2020", + description: "sijdsidjsi" + }, + { + workspaceId: "20", + name: "Ikkdie", + label: "jojojojojojo", + description: "sijdsidjsi" + } + ] + } + this.loading = false; + this.mds.decrementDelayedProcessesCount(); + }); + }) + } + + buttonStartCheck(checkInfo: SysCheckInfo) { + this.router.navigate([`/check/${checkInfo.workspaceId}/${checkInfo.name}`]); + } +} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 68ebdd24..e18980da 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -3,11 +3,21 @@ import { StartComponent } from './start/start.component'; import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import {AppRootComponent} from "./app-root/app-root.component"; +import {LoginComponent} from "./app-root/login/login.component"; +import {SysCheckStarterComponent} from "./app-root/sys-check-starter/sys-check-starter.component"; const routes: Routes = [ - {path: '', component: AppRootComponent, pathMatch: 'full'}, - {path: 'root', component: AppRootComponent}, + {path: '', redirectTo: 'r', pathMatch: 'full'}, + {path: 'r', component: AppRootComponent, + children: [ + {path: '', redirectTo: 'login', pathMatch: 'full'}, + {path: 'login/:returnTo', component: LoginComponent}, + {path: 'about', component: AboutComponent}, + {path: 'check-starter', component: SysCheckStarterComponent}, + {path: '**', component: LoginComponent} + ] + }, {path: 'start', component: StartComponent}, {path: 'about', component: AboutComponent}, {path: 'check', loadChildren: () => import('./sys-check/sys-check.module').then(m => m.SysCheckModule)}, diff --git a/src/app/app.component.html b/src/app/app.component.html index 68a82078..5cbd9ed0 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -10,7 +10,7 @@ <mat-icon>clear</mat-icon> </button> </div> -<div class="spinner" *ngIf="mds.showSpinner"> +<div class="spinner" *ngIf="(mds.delayedProcessesCount$ | async) > 0"> <mat-spinner></mat-spinner> </div> <router-outlet></router-outlet> diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 272eb095..ccba6872 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -9,7 +9,7 @@ import {Subscription} from "rxjs"; @Component({ selector: 'tc-root', templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] + // styleUrls: ['./app.component.scss'] }) @@ -18,7 +18,7 @@ export class AppComponent implements OnInit, OnDestroy { showError = false; constructor ( - private mds: MainDataService, + public mds: MainDataService, private bs: BackendService, private cts: CustomtextService ) { } @@ -47,7 +47,6 @@ export class AppComponent implements OnInit, OnDestroy { this.showError = true; } }); - // give a message to the central message broadcast window.addEventListener('message', (event: MessageEvent) => { const msgData = event.data; @@ -82,7 +81,7 @@ export class AppComponent implements OnInit, OnDestroy { if (personToken) { const bookletDbIdStr = AppComponent.getStringFromLocalStorage('bi'); if (bookletDbIdStr) { - bookletDbId = Number(bookletDbIdStr); + bookletDbId = Number(bookletDbIdStr); // TODO: not used after assigning? } } const code = AppComponent.getStringFromLocalStorage('c'); diff --git a/src/app/app.interfaces.ts b/src/app/app.interfaces.ts index 769da723..e4e53795 100644 --- a/src/app/app.interfaces.ts +++ b/src/app/app.interfaces.ts @@ -66,3 +66,15 @@ export interface AppError { description: string; category: 'WARNING' | 'FATAL' | 'PROBLEM' } + +export interface starterData { + id: string; + label: string +} + +export interface SysCheckInfo { + workspaceId: string; + name: string; + label: string; + description: string; +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts index d90180b9..8b6ec3e3 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -29,6 +29,9 @@ import {MatToolbarModule} from "@angular/material/toolbar"; import {MatTooltipModule} from "@angular/material/tooltip"; import {RouterModule} from "@angular/router"; import { AppRootComponent } from './app-root/app-root.component'; +import { SysCheckStarterComponent } from './app-root/sys-check-starter/sys-check-starter.component'; +import { LoginComponent } from './app-root/login/login.component'; +import { AppStatusComponent } from './app-root/app-status/app-status.component'; @@ -37,7 +40,10 @@ import { AppRootComponent } from './app-root/app-root.component'; AppComponent, StartComponent, AboutComponent, - AppRootComponent + AppRootComponent, + SysCheckStarterComponent, + LoginComponent, + AppStatusComponent ], imports: [ ApplicationModule, diff --git a/src/app/backend.service.ts b/src/app/backend.service.ts index 8d9f57b4..833e9d57 100644 --- a/src/app/backend.service.ts +++ b/src/app/backend.service.ts @@ -3,7 +3,7 @@ import { Injectable, Inject } from '@angular/core'; import {HttpClient, HttpParams} from '@angular/common/http'; import { Observable, of } from 'rxjs'; import {catchError, map, switchMap} from 'rxjs/operators'; -import {LoginData, BookletStatus, PersonTokenAndTestId, KeyValuePair, SysConfig} from './app.interfaces'; +import {LoginData, BookletStatus, PersonTokenAndTestId, KeyValuePair, SysConfig, SysCheckInfo} from './app.interfaces'; import {ErrorHandler, ServerError} from 'iqb-components'; // ============================================================================ @@ -70,6 +70,17 @@ export class BackendService { })); } + public getSysCheckInfo(): Observable<SysCheckInfo[]> { + + return this.http + .get<SysCheckInfo[]>(this.serverUrl + 'sys-checks') + .pipe( + catchError(() => { + const myreturn: SysCheckInfo[] = []; + return of(myreturn); + }) + ); + } getBookletState(bookletName: string, code = ''): Observable<BookletStatus | ServerError> { diff --git a/src/app/maindata.service.ts b/src/app/maindata.service.ts index 7a4d376c..f73a6dcf 100644 --- a/src/app/maindata.service.ts +++ b/src/app/maindata.service.ts @@ -31,7 +31,7 @@ export class MainDataService { public loginData$ = new BehaviorSubject<LoginData>(MainDataService.defaultLoginData); public globalErrorMsg$ = new BehaviorSubject<ServerError>(null); // TODO remove globalErrorMsg$ public appError$ = new BehaviorSubject<AppError>(null); - public showSpinner = false; + public delayedProcessesCount$ = new BehaviorSubject<number>(0); // set by app.component.ts public postMessage$ = new Subject<MessageEvent>(); @@ -50,6 +50,14 @@ export class MainDataService { private cts: CustomtextService ) {} + incrementDelayedProcessesCount() { + this.delayedProcessesCount$.next(this.delayedProcessesCount$.getValue() + 1); + } + + decrementDelayedProcessesCount() { + this.delayedProcessesCount$.next(this.delayedProcessesCount$.getValue() - 1); + } + // ensures consistency setNewLoginData(logindata?: LoginData) { const myLoginData: LoginData = MainDataService.defaultLoginData; diff --git a/src/app/sys-check/backend.service.ts b/src/app/sys-check/backend.service.ts index 861f8ddf..ced27bc0 100644 --- a/src/app/sys-check/backend.service.ts +++ b/src/app/sys-check/backend.service.ts @@ -1,5 +1,4 @@ import { - CheckConfigAbstract, CheckConfig, NetworkRequestTestResult, UnitAndPlayerContainer, @@ -23,19 +22,6 @@ export class BackendService { ) {} - public getCheckConfigs(): Observable<CheckConfigAbstract[]> { - - return this.http - .get<CheckConfigAbstract[]>(this.serverUrl + 'sys-checks') - .pipe( - catchError(() => { - const myreturn: CheckConfigAbstract[] = []; - return of(myreturn); - }) - ); - } - - public getCheckConfigData(workspaceId: number, sysCheckName: string): Observable<CheckConfig> { return this.http diff --git a/src/app/sys-check/index.ts b/src/app/sys-check/index.ts deleted file mode 100644 index d8b21a2c..00000000 --- a/src/app/sys-check/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { StartComponent } from './start.component'; diff --git a/src/app/sys-check/start.component.css b/src/app/sys-check/start.component.css deleted file mode 100644 index 60339677..00000000 --- a/src/app/sys-check/start.component.css +++ /dev/null @@ -1,19 +0,0 @@ -.check_title { - font-size: 16pt; - margin-bottom: 0px; - height: 24px - } - -.check_descr { - font-size: 9pt; - margin-top: 8px; - color: lightgray; - height: 24px; - margin-bottom: 18px; - white-space: normal; - line-height: 16px; - } - -.mat-card { - margin: 10px - } diff --git a/src/app/sys-check/start.component.html b/src/app/sys-check/start.component.html deleted file mode 100644 index 4e898166..00000000 --- a/src/app/sys-check/start.component.html +++ /dev/null @@ -1,35 +0,0 @@ -<div class="page-body"> - <div fxLayout="row" fxLayoutAlign="center start"> - <mat-card fxFlex="0 2 500px"> - <mat-card-title>{{ 'app_title' | customtext:'app_title':cts.updateCount }}: System-Check</mat-card-title> - <mat-card-content> - <p>Hier können Sie ermitteln, ob das Computersystem, das Sie gerade benutzen, für - die hier vorgesehenen Testungen geeignet ist.</p> - <p *ngIf="dataLoading"> - Bitte warten... Konfiguration wird geladen - </p> - <p *ngIf="!dataLoading && (checkConfigList.length === 0)"> - Auf diesem Server ist aktuell kein System-Check verfügbar. - </p> - <p *ngIf="!dataLoading && (checkConfigList.length > 1)"> - Bitte wählen Sie einen Check aus! - </p> - <p *ngIf="!dataLoading && (checkConfigList.length === 1)"> - Bitte klicken Sie auf den Schalter, um den Check zu starten! - </p> - <div fxLayout="column" fxLayoutGap="10px"> - <button mat-raised-button color="primary" (click)="buttonStartCheck(c)" - *ngFor="let c of checkConfigList"> - <div fxLayout="column"> - <p class="check_title">{{c.label}}</p> - <p class="check_descr">{{c.description}}</p> - </div> - </button> - </div> - </mat-card-content> - <mat-card-actions> - <button (click)="goBack()" mat-raised-button color="primary"><i class="material-icons">arrow_back</i> zurück zur Startseite</button> - </mat-card-actions> - </mat-card> - </div> -</div> diff --git a/src/app/sys-check/start.component.ts b/src/app/sys-check/start.component.ts deleted file mode 100644 index 6862c457..00000000 --- a/src/app/sys-check/start.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { SysCheckDataService } from './sys-check-data.service'; -import { Router, ActivatedRoute } from '@angular/router'; -import { BackendService } from './backend.service'; -import { Component, OnInit, SkipSelf } from '@angular/core'; -import { CheckConfigAbstract } from './sys-check.interfaces'; -import { CustomtextService } from 'iqb-components'; - - - -@Component({ - templateUrl: './start.component.html', - styleUrls: ['./start.component.css'] -}) - -export class StartComponent implements OnInit { - checkConfigList: CheckConfigAbstract[] = []; - public dataLoading = false; - - constructor( - private bs: BackendService, - private ds: SysCheckDataService, - private route: ActivatedRoute, - private router: Router, - @SkipSelf() public cts: CustomtextService) { } - - ngOnInit() { - this.dataLoading = true; - this.bs.getCheckConfigs().subscribe(myConfigs => { - this.checkConfigList = myConfigs; - this.dataLoading = false; - }); - } - - buttonStartCheck(checkConfigAbstract: CheckConfigAbstract) { - - console.log('checkConfigAbstract', checkConfigAbstract); - this.router.navigate( - [`../run/${checkConfigAbstract.workspaceId}/${checkConfigAbstract.name}`], - {relativeTo: this.route} - ); - } - - goBack() { - this.router.navigate(['/']); - } -} diff --git a/src/app/sys-check/sys-check-data.service.ts b/src/app/sys-check/sys-check-data.service.ts index 9b8d76e5..35cd1ac1 100644 --- a/src/app/sys-check/sys-check-data.service.ts +++ b/src/app/sys-check/sys-check-data.service.ts @@ -9,34 +9,7 @@ type Task = 'loadunit' | 'speedtest' | null; }) export class SysCheckDataService { - public checkConfig$ = new BehaviorSubject<CheckConfig>( - { - name: 'Basistest', - label: 'Basistest', - questions: [], - hasUnit: false, - canSave: false, - customTexts: [], - skipNetwork: false, - downloadSpeed : { - min: 1.875e+6, // 15Mbit/s ~> typical dl speed 4G CAT4 - good: 3.75e+6, // 30Mbit/s ~> typical dl speed 4G+ CAT6 - maxDevianceBytesPerSecond: 100000, - maxErrorsPerSequence: 0, - maxSequenceRepetitions: 15, - sequenceSizes: [400000, 800000, 1600000, 3200000] - }, - uploadSpeed : { - min: 250000, // 2Mbit/s - good: 1.25e+6, // 10Mbit/s - maxDevianceBytesPerSecond: 5000, - maxErrorsPerSequence: 0, - maxSequenceRepetitions: 15, - sequenceSizes: [100000, 200000, 400000, 800000] - }, - workspaceId: 0 - } - ); + public checkConfig$ = new BehaviorSubject<CheckConfig>(null); public task$ = new BehaviorSubject<Task>(null); public taskQueue: Task[]; diff --git a/src/app/sys-check/sys-check-routing.module.ts b/src/app/sys-check/sys-check-routing.module.ts index a7ff4fab..b0169122 100644 --- a/src/app/sys-check/sys-check-routing.module.ts +++ b/src/app/sys-check/sys-check-routing.module.ts @@ -1,19 +1,10 @@ import { SysCheckComponent } from './sys-check.component'; import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; -import { StartComponent } from './start.component'; const routes: Routes = [ { - path: '', - redirectTo: 'start' - }, - { - path: 'start', - component: StartComponent - }, - { - path: 'run/:workspace-id/:sys-check-name', + path: ':workspace-id/:sys-check-name', component: SysCheckComponent }]; diff --git a/src/app/sys-check/sys-check.component.html b/src/app/sys-check/sys-check.component.html index 1f86c79b..e468d098 100644 --- a/src/app/sys-check/sys-check.component.html +++ b/src/app/sys-check/sys-check.component.html @@ -1,35 +1,27 @@ -<div class="logo"> - <a [routerLink]="['/']"> - <img src="assets/IQB-LogoA.png" matTooltip="Startseite" alt="iqb-logo"/> - </a> +<div class="page-header"> + <p>System-Check: {{title}}</p> </div> -<div class="pagetitle">System-Check: {{title}}</div> - <div class="page-body"> - <div class="spinner-container-local" *ngIf="dataLoading"> - <mat-spinner></mat-spinner> - </div> <div fxLayout="column" fxLayoutAlign="center stretch" class="cardhost"> <div fxLayout="raw wrap" fxLayoutAlign="center stretch" fxFlex> - <mat-card fxFlex> + <mat-card fxFlex *ngIf="!loading"> <iqb-environment-check></iqb-environment-check> </mat-card> - <mat-card fxFlex="2 0 800px"> - <iqb-network-check [measureNetwork]="checks.network"></iqb-network-check> + <mat-card fxFlex="2 0 800px" *ngIf="networkCheck"> + <iqb-network-check [measureNetwork]="networkCheck"></iqb-network-check> </mat-card> </div> - <div fxLayout="row" fxLayoutAlign="center stretch"> - <mat-card [fxFlex]="(checks.questions) ? '2 0 800px' : ''" *ngIf="checks.unit"> + <div fxLayout="row" fxLayoutAlign="center stretch" *ngIf="unitCheck || questions"> + <mat-card [fxFlex]="(questions) ? '2 0 800px' : ''" *ngIf="unitCheck"> <iqb-unit-check></iqb-unit-check> </mat-card> - <mat-card fxFlex *ngIf="checks.questions"> + <mat-card fxFlex *ngIf="questions"> <iqb-questionnaire></iqb-questionnaire> </mat-card> </div> - <mat-card> - <iqb-report [canSave]="checks.report"></iqb-report> + <mat-card *ngIf="reportEnabled"> + <iqb-report [canSave]="reportEnabled"></iqb-report> </mat-card> </div> - </div> diff --git a/src/app/sys-check/sys-check.component.ts b/src/app/sys-check/sys-check.component.ts index 53e0d99b..700a3431 100644 --- a/src/app/sys-check/sys-check.component.ts +++ b/src/app/sys-check/sys-check.component.ts @@ -4,39 +4,30 @@ import {Component, OnDestroy, OnInit} from '@angular/core'; import { BackendService } from './backend.service'; import { Subscription } from 'rxjs'; import { CustomtextService } from 'iqb-components'; - - -interface Checks { - environment: boolean; - unit: boolean; - questions: boolean; - network: boolean; - report: boolean; -} +import {MainDataService} from "../maindata.service"; @Component({ - selector: 'app-run', templateUrl: './sys-check.component.html', styleUrls: ['./sys-check.component.scss'] }) + export class SysCheckComponent implements OnInit, OnDestroy { private taskSubscription: Subscription = null; - dataLoading = false; - checks: Checks = { - environment: true, - unit: false, - questions: false, - network: false, - report: true - }; + loading = false; + unitCheck = false; + questions = false; + networkCheck = false; + reportEnabled = false; + isError = false; - title: String = ''; + title = 'Lade - bitte warten'; constructor( private bs: BackendService, private ds: SysCheckDataService, private route: ActivatedRoute, + private mds: MainDataService, private cts: CustomtextService ) { } @@ -46,34 +37,47 @@ export class SysCheckComponent implements OnInit, OnDestroy { const sysCheckName = params.get('sys-check-name'); const workspaceId = parseInt(params.get('workspace-id')); - this.bs.getCheckConfigData(workspaceId, sysCheckName).subscribe(checkConfig => { - this.ds.checkConfig$.next(checkConfig); - - this.title = checkConfig.label; - this.checks.unit = checkConfig.hasUnit; - this.checks.network = !checkConfig.skipNetwork; - this.checks.questions = checkConfig.questions.length > 0; - this.checks.report = checkConfig.canSave; + setTimeout(() => { + this.mds.incrementDelayedProcessesCount(); + this.loading = true; + this.bs.getCheckConfigData(workspaceId, sysCheckName).subscribe(checkConfig => { + this.ds.checkConfig$.next(checkConfig); + if (checkConfig) { + this.title = checkConfig.label; + this.unitCheck = checkConfig.hasUnit; + this.networkCheck = !checkConfig.skipNetwork; + this.questions = checkConfig.questions.length > 0; + this.reportEnabled = checkConfig.canSave; - if (this.checks.unit) { - this.ds.taskQueue.push('loadunit'); - } - 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); + if (this.unitCheck) { + this.ds.taskQueue.push('loadunit'); + } + if (this.networkCheck) { + 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.loading = (typeof task !== 'undefined') && (this.ds.taskQueue.length > 0); + if (!this.loading) { + this.mds.decrementDelayedProcessesCount(); + } + }); + this.isError = false; + } else { + this.mds.decrementDelayedProcessesCount(); + this.title = 'Fehler beim Laden der Daten für den System-Check'; + this.loading = false; + this.isError = true; + } }); - - }); + }) }); } diff --git a/src/app/sys-check/sys-check.interfaces.ts b/src/app/sys-check/sys-check.interfaces.ts index 0159a0a4..f20a781c 100644 --- a/src/app/sys-check/sys-check.interfaces.ts +++ b/src/app/sys-check/sys-check.interfaces.ts @@ -1,10 +1,3 @@ -export interface CheckConfigAbstract { - workspaceId: string; - name: string; - label: string; - description: string; -} - export interface SpeedParameters { min: number; good: number; diff --git a/src/app/sys-check/sys-check.module.ts b/src/app/sys-check/sys-check.module.ts index 5e0d18ef..25193454 100644 --- a/src/app/sys-check/sys-check.module.ts +++ b/src/app/sys-check/sys-check.module.ts @@ -5,7 +5,6 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { SysCheckRoutingModule } from './sys-check-routing.module'; -import { StartComponent } from './start.component'; import { SysCheckComponent } from './sys-check.component'; import { FlexLayoutModule } from '@angular/flex-layout'; import {MatDividerModule} from '@angular/material/divider'; @@ -60,7 +59,6 @@ import {MatStepperModule} from "@angular/material/stepper"; IqbComponentsModule.forChild() ], declarations: [ - StartComponent, SysCheckComponent, EnvironmentCheckComponent, NetworkCheckComponent, @@ -72,9 +70,6 @@ import {MatStepperModule} from "@angular/material/stepper"; UnitNaviButtonsComponent, TcSpeedChartComponent ], - exports: [ - StartComponent - ], entryComponents: [ SaveReportComponent ], diff --git a/src/styles.css b/src/styles.css index 940755c7..8de9bd0c 100644 --- a/src/styles.css +++ b/src/styles.css @@ -44,7 +44,7 @@ z-index: 999; } -.spinner-container-local { +.spinner-container-local { /* TODO remove */ align-items: center; bottom: 0; display: flex; @@ -65,7 +65,7 @@ iframe.unitHost { margin: 0; } -p.unitMessage { +p.unitMessage { /* TODO why here? */ margin: 50px; text-align: center; } @@ -80,10 +80,29 @@ div.logo img { width: 100px; } -.pagetitle { +.page-header { position: absolute; left: 140px; - top: 18px; + width: calc(100% - 140px); + top: 0; + padding: 0 10px 0 0; +} + +.page-header mat-toolbar { + position: fixed; + z-index: 100; + top: 4px; + right: 90px; +} + +.page-header mat-icon { + position: relative; + top: -8px; + font-size: 36px; + padding: 2px; +} + +.page-header p { font-size: 1.5em; color: white; } -- GitLab