diff --git a/src/app/admin/workspace.component.html b/src/app/admin/workspace.component.html index 36d65e92a7555cb247d2fdcfe593fe70db4d6685..806da3409b9da517e7b4d74540f2e0ce4006a307 100644 --- a/src/app/admin/workspace.component.html +++ b/src/app/admin/workspace.component.html @@ -1,5 +1,8 @@ <p>WorkspaceComponent</p> <p>Eingeloggt als {{ (mds.loginData$ | async)?.loginname}}</p> <p>Workspace: {{myWorkspace}}</p> +<p> </p> +<p>Sorry - die Einbindung der Administrator-Funktionen in das Testcenter ist noch in Arbeit.</p> + <hr/> <router-outlet></router-outlet> diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 84b9d8bc89f44369d1d0e88eecb401a77dc7a2bc..9eaabf9ef4aeea796fc62768007f697da9c0bcd5 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -20,10 +20,20 @@ export class AppComponent implements OnInit { private cts: CustomtextService ) { } + private static getStringFromLocalStorage(key: string) { + const storageEntry = localStorage.getItem(key); + if (storageEntry !== null) { + if (storageEntry.length > 0) { + return (storageEntry as string); + } + } + return '' + } + ngOnInit() { - this.mds.setCustomtextsFromDefList(appconfig.customtextsApp); - this.mds.setCustomtextsFromDefList(appconfig.customtextsLogin); - this.mds.setCustomtextsFromDefList(appconfig.customtextsBooklet); + this.mds.addCustomtextsFromDefList(appconfig.customtextsApp); + this.mds.addCustomtextsFromDefList(appconfig.customtextsLogin); + this.mds.addCustomtextsFromDefList(appconfig.customtextsBooklet); // give a message to the central message broadcast @@ -39,28 +49,31 @@ export class AppComponent implements OnInit { this.bs.getSysConfig().subscribe(sc => { this.mds.setDefaultCustomtexts(sc); - this.mds.setCustomtextsFromDefList(appconfig.customtextsApp); + this.mds.addCustomtextsFromDefList(appconfig.customtextsApp); // restore login status if stored in localStorage - const loginToken = localStorage.getItem('lt'); - if (loginToken !== null) { - if (loginToken.length > 0) { - let adminToken = localStorage.getItem('at'); - let personToken = localStorage.getItem('pt'); - let bookletDbId = 0; - if (personToken !== null) { - if (personToken.length > 0) { - const bookletDbIdStr = localStorage.getItem('bi'); - if (bookletDbIdStr !== null) { - bookletDbId = Number(bookletDbIdStr); - } + const adminToken = AppComponent.getStringFromLocalStorage('at'); + if (adminToken) { + this.bs.getLoginDataAdmin(adminToken).subscribe( + (admindata: LoginData) => { + if (admindata instanceof ServerError) { + this.mds.setNewLoginData(); + } else { + this.mds.setNewLoginData(admindata); } - } else { - personToken = ''; } - let code = localStorage.getItem('c'); - if (code === null) { - code = ''; + ); + } else { + const loginToken = AppComponent.getStringFromLocalStorage('lt'); + if (loginToken) { + let personToken = AppComponent.getStringFromLocalStorage('pt'); + let bookletDbId = 0; + if (personToken) { + const bookletDbIdStr = AppComponent.getStringFromLocalStorage('bi'); + if (bookletDbIdStr) { + bookletDbId = Number(bookletDbIdStr); + } } + const code = AppComponent.getStringFromLocalStorage('c'); // bookletDbId is not yet checked by getLoginData, only passed-through this.bs.getLoginData(loginToken, personToken, bookletDbId).subscribe(ld => { @@ -82,13 +95,9 @@ export class AppComponent implements OnInit { }); } else { this.mds.setNewLoginData(); - this.mds.setCustomtextsFromDefList(appconfig.customtextsLogin); - this.mds.setCustomtextsFromDefList(appconfig.customtextsBooklet); + this.mds.addCustomtextsFromDefList(appconfig.customtextsLogin); + this.mds.addCustomtextsFromDefList(appconfig.customtextsBooklet); } - } else { - this.mds.setNewLoginData(); - this.mds.setCustomtextsFromDefList(appconfig.customtextsLogin); - this.mds.setCustomtextsFromDefList(appconfig.customtextsBooklet); } }); } diff --git a/src/app/backend.service.ts b/src/app/backend.service.ts index 0ca615c275d5ebe93a48056f7dd25eb9a634825a..74f8455f190d40826ed10a3fad84631db3878329 100644 --- a/src/app/backend.service.ts +++ b/src/app/backend.service.ts @@ -56,6 +56,14 @@ export class BackendService { ); } + getLoginDataAdmin(adminToken: string): Observable<LoginData | ServerError> { + return this.http + .post<LoginData>(this.serverSlimAdminUrl + 'login', {at: adminToken}) + .pipe( + catchError(ErrorHandler.handle) + ); + } + // BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB getSysConfig(): Observable<KeyValuePair> { return this.http.get<KeyValuePair>(this.serverSlimUrl + 'sysconfig') diff --git a/src/app/maindata.service.ts b/src/app/maindata.service.ts index 0c129ccbd3480db4656cf152b458504cffe402fe..abc48fc6d6960d316687f45d5b1e9fa72ba862bc 100644 --- a/src/app/maindata.service.ts +++ b/src/app/maindata.service.ts @@ -9,24 +9,26 @@ import {appconfig, customtextKeySeparator, CustomTextsDefList} from "./app.confi providedIn: 'root' }) export class MainDataService { - private static defaultLoginData: LoginData = { - logintoken: '', - persontoken: '', - mode: '', - groupname: '', - loginname: '', - name: '', - workspaceName: '', - booklets: null, - code: '', - booklet: 0, - bookletlabel: '', - customTexts: {}, - admintoken: '', - workspaces: [], - is_superadmin: false, - costumTexts: {} - }; + private static get defaultLoginData(): LoginData { + return { + logintoken: '', + persontoken: '', + mode: '', + groupname: '', + loginname: '', + name: '', + workspaceName: '', + booklets: null, + code: '', + booklet: 0, + bookletlabel: '', + customTexts: {}, + admintoken: '', + workspaces: [], + is_superadmin: false, + costumTexts: {} + } + } public loginData$ = new BehaviorSubject<LoginData>(MainDataService.defaultLoginData); public globalErrorMsg$ = new BehaviorSubject<ServerError>(null); @@ -50,63 +52,51 @@ export class MainDataService { // ensures consistency setNewLoginData(logindata?: LoginData) { - const myLoginData: LoginData = { - logintoken: MainDataService.defaultLoginData.logintoken, - persontoken: MainDataService.defaultLoginData.persontoken, - mode: MainDataService.defaultLoginData.mode, - groupname: MainDataService.defaultLoginData.groupname, - loginname: MainDataService.defaultLoginData.loginname, - name: MainDataService.defaultLoginData.name, - workspaceName: MainDataService.defaultLoginData.workspaceName, - booklets: MainDataService.defaultLoginData.booklets, - code: MainDataService.defaultLoginData.code, - booklet: MainDataService.defaultLoginData.booklet, - bookletlabel: MainDataService.defaultLoginData.bookletlabel, - customTexts: {}, // always ignored except right after getting from backend! - admintoken: '', - workspaces: [], - is_superadmin: false, - costumTexts: {} // always ignored except right after getting from backend! - }; + const myLoginData: LoginData = MainDataService.defaultLoginData; + if (!logindata) { + logindata = MainDataService.defaultLoginData; + } - if (logindata) { - if ((logindata.admintoken)) { //.length > 0) && (logindata.name.length > 0)) { - myLoginData.admintoken = logindata.admintoken; + if ((logindata.admintoken)) { //.length > 0) && (logindata.name.length > 0)) { + myLoginData.admintoken = logindata.admintoken; + if (logindata.name) { myLoginData.loginname = logindata.name; - myLoginData.workspaces = logindata.workspaces; - myLoginData.is_superadmin = logindata.is_superadmin; - } else if ( - (logindata.logintoken.length > 0) && - (logindata.loginname.length > 0) && - (logindata.mode.length > 0) && - (logindata.groupname.length > 0) && - (logindata.workspaceName.length > 0) && - (logindata.booklets)) { - - const validCodes = Object.keys(logindata.booklets); - if (validCodes.length > 0) { - myLoginData.logintoken = logindata.logintoken; - myLoginData.loginname = logindata.loginname; - myLoginData.mode = logindata.mode; - myLoginData.groupname = logindata.groupname; - myLoginData.workspaceName = logindata.workspaceName; - myLoginData.booklets = logindata.booklets; - if (logindata.code.length > 0) { - if (logindata.code in logindata.booklets) { - myLoginData.code = logindata.code; - } + } else { + myLoginData.loginname = logindata.loginname; + } + myLoginData.workspaces = logindata.workspaces; + myLoginData.is_superadmin = logindata.is_superadmin; + } else if ( + (logindata.logintoken.length > 0) && + (logindata.loginname.length > 0) && + (logindata.mode.length > 0) && + (logindata.groupname.length > 0) && + (logindata.workspaceName.length > 0) && + (logindata.booklets)) { + + const validCodes = Object.keys(logindata.booklets); + if (validCodes.length > 0) { + myLoginData.logintoken = logindata.logintoken; + myLoginData.loginname = logindata.loginname; + myLoginData.mode = logindata.mode; + myLoginData.groupname = logindata.groupname; + myLoginData.workspaceName = logindata.workspaceName; + myLoginData.booklets = logindata.booklets; + if (logindata.code.length > 0) { + if (logindata.code in logindata.booklets) { + myLoginData.code = logindata.code; } - if (logindata.persontoken.length > 0) { - myLoginData.persontoken = logindata.persontoken; - myLoginData.booklet = logindata.booklet; - if (myLoginData.booklet > 0) { - myLoginData.bookletlabel = logindata.bookletlabel; - } + } + if (logindata.persontoken.length > 0) { + myLoginData.persontoken = logindata.persontoken; + myLoginData.booklet = logindata.booklet; + if (myLoginData.booklet > 0) { + myLoginData.bookletlabel = logindata.bookletlabel; } } - } - + } } + this.loginData$.next(myLoginData); localStorage.setItem('lt', myLoginData.logintoken); localStorage.setItem('at', myLoginData.admintoken); @@ -167,7 +157,7 @@ export class MainDataService { return myLoginData.persontoken; } - public setCustomtextsFromDefList(customtextList: CustomTextsDefList) { + public addCustomtextsFromDefList(customtextList: CustomTextsDefList) { const myCustomTexts: {[key: string]: string} = {}; for (const ct of Object.keys(customtextList.defList)) { myCustomTexts[customtextList.keyPrefix + customtextKeySeparator + ct] = customtextList.defList[ct].defaultvalue; @@ -176,24 +166,26 @@ export class MainDataService { } public setDefaultCustomtexts(newTexts: {[key: string]: string;}) { - for (const ctKey of Object.keys(newTexts)) { - const sepIndex = ctKey.indexOf(customtextKeySeparator); - if (sepIndex > 1) { - const keyPrefix = ctKey.slice(0 , sepIndex-1); - const keyId = ctKey.slice(sepIndex+1); - - switch(keyPrefix) { - case 'app': { - appconfig.customtextsApp.defList[keyId].defaultvalue = newTexts[ctKey]; - break; - } - case 'login': { - appconfig.customtextsLogin.defList[keyId].defaultvalue = newTexts[ctKey]; - break; - } - case 'booklet': { - appconfig.customtextsBooklet.defList[keyId].defaultvalue = newTexts[ctKey]; - break; + if (newTexts) { + for (const ctKey of Object.keys(newTexts)) { + const sepIndex = ctKey.indexOf(customtextKeySeparator); + if (sepIndex > 1) { + const keyPrefix = ctKey.slice(0 , sepIndex-1); + const keyId = ctKey.slice(sepIndex+1); + + switch(keyPrefix) { + case 'app': { + appconfig.customtextsApp.defList[keyId].defaultvalue = newTexts[ctKey]; + break; + } + case 'login': { + appconfig.customtextsLogin.defList[keyId].defaultvalue = newTexts[ctKey]; + break; + } + case 'booklet': { + appconfig.customtextsBooklet.defList[keyId].defaultvalue = newTexts[ctKey]; + break; + } } } } diff --git a/src/app/start/start.component.html b/src/app/start/start.component.html index 2f1e06515c9f25373e1145506706023da1700366..c7b18b1fa9143f8edc1b2d19da7c29de525e1c52 100644 --- a/src/app/start/start.component.html +++ b/src/app/start/start.component.html @@ -1,6 +1,6 @@ <div class="logo"> <a [routerLink]="['/']"> - <img src="assets/IQB-LogoA.png" matTooltip="Startseite"/> + <img src="assets/IQB-LogoA.png" matTooltip="Startseite" alt=""IQB-Logo/> </a> </div> <div class="page-body"> @@ -51,7 +51,7 @@ <mat-card fxFlex="0 0 400px" fxLayout="column" *ngIf="showBookletButtons"> <mat-card-title>{{ bookletSelectTitle }}</mat-card-title> <mat-card-content> - <div fxLayout="row" fxLayoutGap="10px" fxLayout="column"> + <div fxLayoutGap="10px" fxLayout="column"> <p *ngIf="bookletlist.length === 0"> Für diese Anmeldung wurde kein Test gefunden. </p> @@ -82,7 +82,7 @@ <mat-card fxFlex="0 0 400px" fxLayout="column" *ngIf="showAdminSelection"> <mat-card-title>Studie wählen</mat-card-title> <mat-card-content> - <div fxLayout="row" fxLayoutGap="10px" fxLayout="column"> + <div fxLayoutGap="10px" fxLayout="column"> <p *ngIf="(mds.loginData$ | async)?.workspaces.length === 0"> Sie sind mit Administrator-Funktionen angemeldet. Aktuell sind keine Studien für Sie freigegeben. </p> @@ -94,7 +94,7 @@ </mat-card-content> <mat-card-actions> <button mat-raised-button color="foreground" *ngIf="(mds.loginData$ | async)?.is_superadmin" [routerLink]="['/superadmin']">Nutzer/Arbeitsbereiche</button> - <button mat-raised-button color="foreground" (click)="mds.setNewLoginData()">Anmeldung ändern</button> + <button mat-raised-button color="foreground" (click)="resetLogin()">Neu anmelden</button> </mat-card-actions> </mat-card> diff --git a/src/app/start/start.component.ts b/src/app/start/start.component.ts index bfa5434a6ad4952f9a9918ac0da48b8b63c7ac06..ab95f5e46fb4ae85c4212a93c1385a2c63459a14 100644 --- a/src/app/start/start.component.ts +++ b/src/app/start/start.component.ts @@ -56,9 +56,18 @@ export class StartComponent implements OnInit, OnDestroy { if (logindata.admintoken.length > 0) { this.showLoginForm = false; this.showAdminSelection = true; - + this.showCodeForm = false; + this.showBookletButtons = false; + this.showTestRunningButtons = false; + this.loginStatusText = []; + this.loginStatusText.push('Admin-Bereich '); + this.loginStatusText.push('angemeldet als ' + logindata.loginname); + if (logindata.is_superadmin) { + this.loginStatusText.push('Rechte auch für Anlegen/Löschen von Nutzern und Workspaces'); + } } else if (logindata.logintoken.length > 0) { // Statustext box + this.showAdminSelection = false; this.loginStatusText = []; this.loginStatusText.push('Studie: ' + logindata.workspaceName); this.loginStatusText.push('angemeldet als "' + @@ -176,6 +185,7 @@ export class StartComponent implements OnInit, OnDestroy { this.loginStatusText = ['nicht angemeldet']; this.showBookletButtons = false; this.showCodeForm = false; + this.showAdminSelection = false; this.showLoginForm = true; this.showTestRunningButtons = false; } @@ -200,7 +210,7 @@ export class StartComponent implements OnInit, OnDestroy { if (loginData instanceof ServerError) { const e = loginData as ServerError; this.mds.globalErrorMsg$.next(e); - this.mds.setCustomtextsFromDefList(appconfig.customtextsLogin); + this.mds.addCustomtextsFromDefList(appconfig.customtextsLogin); // no change in other data } else { this.mds.globalErrorMsg$.next(null); @@ -281,7 +291,6 @@ export class StartComponent implements OnInit, OnDestroy { } buttonGotoWorkspace(ws: WorkspaceData) { - console.log(ws); if (ws.role === 'MO') { this.router.navigateByUrl('/admin/' + ws.id.toString() + '/monitor'); } else { diff --git a/src/app/superadmin/superadmin.component.html b/src/app/superadmin/superadmin.component.html index b22701206e94730986be3f1f4f781800a25b8ac0..04ba540ada44067ff58dd17c42edfa52d094c846 100644 --- a/src/app/superadmin/superadmin.component.html +++ b/src/app/superadmin/superadmin.component.html @@ -1,2 +1,4 @@ <p>SuperadminComponent</p> <p>Eingeloggt als {{ (mds.loginData$ | async)?.loginname}}</p> +<p> </p> +<p>Sorry - die Einbindung der Administrator-Funktionen in das Testcenter ist noch in Arbeit.</p> diff --git a/src/app/sys-check/backend.service.ts b/src/app/sys-check/backend.service.ts index 5b8ffc5d2a474c80ae15942d5b15fb7b44bf37db..735123b4dce8926a95673d2dd00689a898fb08a7 100644 --- a/src/app/sys-check/backend.service.ts +++ b/src/app/sys-check/backend.service.ts @@ -29,7 +29,7 @@ export class BackendService { return this.http .post<CheckConfig[]>(this.serverUrl + 'getSysCheckConfigs.php', {}, httpOptions) .pipe( - catchError(() => { + catchError(err => { const myreturn: CheckConfig[] = []; return of(myreturn); }) diff --git a/src/app/sys-check/start.component.html b/src/app/sys-check/start.component.html index c4b9e78de787f89d799ee17731e0ff8f85700413..ca7c04bde32b020add633adf0cfd0dbc78b38d43 100644 --- a/src/app/sys-check/start.component.html +++ b/src/app/sys-check/start.component.html @@ -9,7 +9,7 @@ <div class="page-body"> <div fxLayout="row" fxLayoutAlign="center start"> <mat-card fxFlex="0 2 500px"> - <mat-card-title>System-Check: Starten {{ 'app_title' | customtext:'app_title':cts.updateCount }}</mat-card-title> + <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> diff --git a/src/app/sys-check/start.component.ts b/src/app/sys-check/start.component.ts index 6a974803e117732c8e622d40322171d17a106bf2..214684cf95dd3f06883d8b9b03f146e478d6e66d 100644 --- a/src/app/sys-check/start.component.ts +++ b/src/app/sys-check/start.component.ts @@ -27,8 +27,6 @@ export class StartComponent implements OnInit { this.dataLoading = true; this.bs.getCheckConfigs().subscribe(myConfigs => { this.checkConfigList = myConfigs; - // @ts-ignore - console.log(this.cts.getCustomText('app_title', 'tütü')) this.dataLoading = false; }); } 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 4b653c3f2531373f13c53f4b11656beb954732ed..cbd6d4d478a8a15c361d6919e5d898c942fee8ac 100644 --- a/src/app/sys-check/unit-check/unit-check.component.ts +++ b/src/app/sys-check/unit-check/unit-check.component.ts @@ -150,7 +150,7 @@ export class UnitCheckComponent implements OnInit, OnDestroy { this.ds.unitData$.next([ {id: '0', type: 'unit/player', label: 'loading time', value: unitAndPlayer.duration.toString(), warning: false} ]); - +console.log(unitAndPlayer); this.pendingItemDefinition$.next(unitAndPlayer.def); this.createPlayerElement(unitAndPlayer.player); diff --git a/src/app/test-controller/test-controller.component.ts b/src/app/test-controller/test-controller.component.ts index 4a217e0694642820712b93fed605604671d7b569..6ee45dce9eb849e7077c572f9c730415ea737fc9 100644 --- a/src/app/test-controller/test-controller.component.ts +++ b/src/app/test-controller/test-controller.component.ts @@ -480,7 +480,7 @@ export class TestControllerComponent implements OnInit, OnDestroy { if (myData instanceof ServerError) { const e = myData as ServerError; this.mds.globalErrorMsg$.next(e); - this.mds.setCustomtextsFromDefList(appconfig.customtextsBooklet); + this.mds.addCustomtextsFromDefList(appconfig.customtextsBooklet); this.tcs.dataLoading = false; } else { const bookletData = myData as BookletData;