diff --git a/src/app/components/moderator/moderator-comment-list/moderator-comment-list.component.html b/src/app/components/moderator/moderator-comment-list/moderator-comment-list.component.html index 7a657879196ab8e43a398e78d248c9158f3130ae..c52e0d1190b45ba74feba7248c427ad78b278783 100644 --- a/src/app/components/moderator/moderator-comment-list/moderator-comment-list.component.html +++ b/src/app/components/moderator/moderator-comment-list/moderator-comment-list.component.html @@ -9,7 +9,8 @@ (input)="searchComments()" [(ngModel)]="searchInput" aria-labelledby="search-box-input-description"/> <mat-placeholder class="placeholder">{{ searchPlaceholder }}</mat-placeholder> - <button mat-icon-button class="searchBarButton close" *ngIf="searchInput !== '' || search" + <button id="search_close-button" + mat-icon-button class="searchBarButton close" *ngIf="searchInput !== '' || search" (click)="hideCommentsList=false; searchInput = ''; search = false; searchPlaceholder = '';"> <mat-icon>close</mat-icon> </button> @@ -25,13 +26,15 @@ <mat-icon class="searchBarIcon">search</mat-icon> </button> - <button mat-icon-button class="searchBarButton" + <button id="sort-button" + mat-icon-button class="searchBarButton" *ngIf="!searchBox.value && comments && comments.length > 0 && !search" [matMenuTriggerFor]="sortMenu" matTooltip="{{ 'comment-list.sort-comments' | translate }}"> <mat-icon class="searchBarIcon">swap_vert</mat-icon> </button> - <button mat-icon-button class="searchBarButton" + <button id="filter-button" + mat-icon-button class="searchBarButton" *ngIf="!searchBox.value && comments && comments.length > 0 && !search" [matMenuTriggerFor]="filterMenu" matTooltip="{{ 'comment-list.filter-comments' | translate }}"> <mat-icon class="searchBarIcon">filter_list</mat-icon> diff --git a/src/app/components/moderator/moderator-comment-page/moderator-comment-page.component.ts b/src/app/components/moderator/moderator-comment-page/moderator-comment-page.component.ts index 4dc7a408afa7c9de9e72b3f6555f47a9a2353307..aee8fc94e0a7e4216888e6cc800c25fd204e2a06 100644 --- a/src/app/components/moderator/moderator-comment-page/moderator-comment-page.component.ts +++ b/src/app/components/moderator/moderator-comment-page/moderator-comment-page.component.ts @@ -1,26 +1,30 @@ -import { Component, OnInit, AfterContentInit, Renderer2 } from '@angular/core'; +import { Component, OnInit, Renderer2, OnDestroy, AfterContentInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { User } from '../../../models/user'; import { NotificationService } from '../../../services/util/notification.service'; import { AuthenticationService } from '../../../services/http/authentication.service'; import { LiveAnnouncer } from '@angular/cdk/a11y'; import { EventService } from '../../../services/util/event.service'; +import { KeyboardUtils } from '../../../utils/keyboard'; +import { KeyboardKey } from '../../../utils/keyboard/keys'; @Component({ selector: 'app-moderator-comment-page', templateUrl: './moderator-comment-page.component.html', styleUrls: ['./moderator-comment-page.component.scss'] }) -export class ModeratorCommentPageComponent implements OnInit, AfterContentInit { +export class ModeratorCommentPageComponent implements OnInit, OnDestroy, AfterContentInit { roomId: string; user: User; + listenerFn: () => void; + constructor(private route: ActivatedRoute, private notification: NotificationService, private authenticationService: AuthenticationService, - private liveAnnouncer: LiveAnnouncer, + public eventService: EventService, private _r: Renderer2, - public eventService: EventService) { } + private liveAnnouncer: LiveAnnouncer) { } ngAfterContentInit(): void { setTimeout( () => { @@ -30,11 +34,44 @@ export class ModeratorCommentPageComponent implements OnInit, AfterContentInit { ngOnInit(): void { this.roomId = localStorage.getItem('roomId'); this.user = this.authenticationService.getUser(); + this.announce(); + this.listenerFn = this._r.listen(document, 'keyup', (event) => { + if (KeyboardUtils.isKeyEvent(event, KeyboardKey.Digit1) === true && this.eventService.focusOnInput === false) { + document.getElementById('searchBox').focus(); + } else if (KeyboardUtils.isKeyEvent(event, KeyboardKey.Digit3) === true && this.eventService.focusOnInput === false) { + document.getElementById('sort-button').focus(); + } else if (KeyboardUtils.isKeyEvent(event, KeyboardKey.Digit4) === true && this.eventService.focusOnInput === false) { + document.getElementById('filter-button').focus(); + } else if (KeyboardUtils.isKeyEvent(event, KeyboardKey.Digit8) === true && this.eventService.focusOnInput === false) { + this.liveAnnouncer.announce('Aktueller Sitzungs-' + document.getElementById('shortId-header').textContent); + } else if ( + KeyboardUtils.isKeyEvent(event, KeyboardKey.Digit9, KeyboardKey.Escape) === true && + this.eventService.focusOnInput === false) { + this.announce(); + } else if ( + document.getElementById('search_close-button') && + KeyboardUtils.isKeyEvent(event, KeyboardKey.Escape) === true && + this.eventService.focusOnInput === true) { + document.getElementById('search_close-button').click(); + } else if (KeyboardUtils.isKeyEvent(event, KeyboardKey.Escape) === true && this.eventService.focusOnInput === true) { + this.eventService.makeFocusOnInputFalse(); + document.getElementById('sort-button').focus(); + } + }); + } + + ngOnDestroy() { + this.listenerFn(); + this.eventService.makeFocusOnInputFalse(); } public announce() { this.liveAnnouncer.clear(); - this.liveAnnouncer.announce('', 'assertive'); + this.liveAnnouncer.announce('Du befindest dich auf der Moderations-Seite deiner Sitzung. ' + + 'Drücke die Taste 2 um auf das Sitzungs-Menü zu gelangen, ' + + 'die Taste 8 um den aktuellen Sitzungs-Code zu hören, oder die Taste 0 um zurück zur Benutzer-Seite zu gelangen. ' + + 'Sobald mehrere Fragen vorhanden sind kannst du Fragen suchen und filtern. Mit Taste 1 gelangst du in das Suchfeld,' + + 'durch drücken der Escape-Taste wird die Sucheingabe gelöscht. Drücke die Taste 3 um Fragen zu sortieren, ' + + 'die Taste 4 um Fragen zu filtern, oder die Taste 9 um diese Ansage zu wiederholen.', 'assertive'); } - } diff --git a/src/app/components/moderator/room-moderator-page/room-moderator-page.component.html b/src/app/components/moderator/room-moderator-page/room-moderator-page.component.html index 77c3d19ffc76f832057441dc32020407e2299b37..5a348364c1be5d1838f85abb4da4a709a2dc2b77 100644 --- a/src/app/components/moderator/room-moderator-page/room-moderator-page.component.html +++ b/src/app/components/moderator/room-moderator-page/room-moderator-page.component.html @@ -6,7 +6,7 @@ <span class="fill-remaining-space"></span> <mat-card-header fxLayoutAlign="center"> <mat-card-title fxLayoutAlign="center"> - <h2>{{ room.name }}</h2> + <h1>{{ room.name }}</h1> </mat-card-title> <mat-card-subtitle fxLayoutAlign="center"> <mat-icon *ngIf="moderationEnabled" class="gavel"> @@ -24,25 +24,27 @@ </div> <mat-divider></mat-divider> <mat-card-content *ngIf="room.description" fxLayoutAlign="center"> - <h4>{{room.description.trim()}}</h4> + <h3>{{room.description.trim()}}</h3> </mat-card-content> <mat-grid-list cols="{{viewModuleCount}}" rowHeight="1:1"> <mat-grid-tile> - <button mat-icon-button [disableRipple]="true" + <button id="question_answer-button" + mat-icon-button [disableRipple]="true" routerLink="/moderator/room/{{ room.shortId }}/comments"> <mat-icon matBadge="{{commentCounter}}" class="main-icon" [ngClass]="{'desktop' : deviceType === 'desktop'}">question_answer </mat-icon> - <h3>{{ 'room-page.public-stream' | translate}}</h3> <!-- *ngIf="deviceType === 'desktop'" --> + <h2>{{ 'room-page.public-stream' | translate}}</h2> <!-- *ngIf="deviceType === 'desktop'" --> </button> </mat-grid-tile> <mat-grid-tile *ngIf="moderationEnabled"> - <button mat-icon-button [disableRipple]="true" + <button id="gavel-button" + mat-icon-button [disableRipple]="true" routerLink="/moderator/room/{{ room.shortId }}/moderator/comments"> <mat-icon matBadge="{{moderatorCommentCounter}}" class="main-icon" [ngClass]="{'desktop' : deviceType === 'desktop'}">gavel </mat-icon> - <h3>{{ 'room-page.moderating-stream' | translate}}</h3> <!-- *ngIf="deviceType === 'desktop'" --> + <h2>{{ 'room-page.moderating-stream' | translate}}</h2> <!-- *ngIf="deviceType === 'desktop'" --> </button> </mat-grid-tile> <!-- <mat-grid-tile> diff --git a/src/app/components/moderator/room-moderator-page/room-moderator-page.component.scss b/src/app/components/moderator/room-moderator-page/room-moderator-page.component.scss index a6e46c6d4e1ada7013c894b469791d554ccd4e49..c5fbc7d110ef8b22166ebb6fed99629cb84df2f1 100644 --- a/src/app/components/moderator/room-moderator-page/room-moderator-page.component.scss +++ b/src/app/components/moderator/room-moderator-page/room-moderator-page.component.scss @@ -79,7 +79,7 @@ mat-grid-list { margin-bottom: 20px !important; } -h2 { +h1 { font-size: large; color: var(--on-surface)!important; } @@ -88,7 +88,7 @@ p { color: var(--on-surface)!important; } -h4 { +h3 { font-size: medium; color: var(--on-surface)!important; padding: 0 1% 0 1%; diff --git a/src/app/components/moderator/room-moderator-page/room-moderator-page.component.ts b/src/app/components/moderator/room-moderator-page/room-moderator-page.component.ts index 7515c835c447c6c7df47dd5f4fa079474367876e..5449ff2679b7656b8a47d591023d955d0e0c52da 100644 --- a/src/app/components/moderator/room-moderator-page/room-moderator-page.component.ts +++ b/src/app/components/moderator/room-moderator-page/room-moderator-page.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, AfterContentInit, Renderer2 } from '@angular/core'; +import { Component, OnInit, Renderer2, OnDestroy, AfterContentInit } from '@angular/core'; import { Room } from '../../../models/room'; import { RoomPageComponent } from '../../shared/room-page/room-page.component'; import { Location } from '@angular/common'; @@ -12,13 +12,15 @@ import { Message } from '@stomp/stompjs'; import { NotificationService } from '../../../services/util/notification.service'; import { LiveAnnouncer } from '@angular/cdk/a11y'; import { EventService } from '../../../services/util/event.service'; +import { KeyboardUtils } from '../../../utils/keyboard'; +import { KeyboardKey } from '../../../utils/keyboard/keys'; @Component({ selector: 'app-room-moderator-page', templateUrl: './room-moderator-page.component.html', styleUrls: ['./room-moderator-page.component.scss'] }) -export class RoomModeratorPageComponent extends RoomPageComponent implements OnInit, AfterContentInit { +export class RoomModeratorPageComponent extends RoomPageComponent implements OnInit, OnDestroy, AfterContentInit { room: Room; isLoading = true; @@ -26,6 +28,8 @@ export class RoomModeratorPageComponent extends RoomPageComponent implements OnI moderatorCommentCounter: number; viewModuleCount = 1; + listenerFn: () => void; + constructor(protected location: Location, protected roomService: RoomService, protected route: ActivatedRoute, @@ -34,9 +38,9 @@ export class RoomModeratorPageComponent extends RoomPageComponent implements OnI protected wsCommentService: WsCommentServiceService, protected commentService: CommentService, protected notification: NotificationService, + public eventService: EventService, private liveAnnouncer: LiveAnnouncer, - private _r: Renderer2, - public eventService: EventService) { + private _r: Renderer2) { super(roomService, route, location, wsCommentService, commentService); langService.langEmitter.subscribe(lang => translateService.use(lang)); } @@ -99,6 +103,38 @@ export class RoomModeratorPageComponent extends RoomPageComponent implements OnI this.initializeRoom(params['roomId']); }); this.translateService.use(localStorage.getItem('currentLang')); + this.listenerFn = this._r.listen(document, 'keyup', (event) => { + if (KeyboardUtils.isKeyEvent(event, KeyboardKey.Digit1) === true && this.eventService.focusOnInput === false) { + document.getElementById('question_answer-button').focus(); + } else if (KeyboardUtils.isKeyEvent(event, KeyboardKey.Digit3) === true && this.eventService.focusOnInput === false) { + document.getElementById('gavel-button').focus(); + } else if (KeyboardUtils.isKeyEvent(event, KeyboardKey.Digit8) === true && this.eventService.focusOnInput === false) { + this.liveAnnouncer.clear(); + this.liveAnnouncer.announce('Aktueller Sitzungs-Name: ' + this.room.name + '. ' + + 'Aktueller Sitzungs-Code: ' + this.room.shortId.slice(0, 8)); + } else if ( + KeyboardUtils.isKeyEvent(event, KeyboardKey.Digit9, KeyboardKey.Escape) === true && + this.eventService.focusOnInput === false) { + this.announce(); + } else if (KeyboardUtils.isKeyEvent(event, KeyboardKey.Escape) === true && this.eventService.focusOnInput === true) { + this.eventService.makeFocusOnInputFalse(); + document.getElementById('question_answer-button').focus(); + } + }); + } + + ngOnDestroy() { + this.listenerFn(); + this.eventService.makeFocusOnInputFalse(); + } + + public announce() { + this.liveAnnouncer.announce('Du befindest dich in der Sitzung in der du als Moderator gewählt wurdest. ' + + 'Drücke die Taste 1 um auf die Fragen-Übersicht zu gelangen, ' + + 'die Taste 2 um das Sitzungs-Menü zu öffnen, die Taste 3 um in die Moderationsübersicht zu gelangen, ' + + 'die Taste 4 um Einstellungen an der Sitzung vorzunehmen, ' + + 'die Taste 8 um den aktuellen Sitzungs-Code zu hören, die Taste 0 um auf den Zurück-Button zu gelangen, ' + + 'oder die Taste 9 um diese Ansage zu wiederholen.', 'assertive'); } copyShortId(): void { @@ -117,9 +153,4 @@ export class RoomModeratorPageComponent extends RoomPageComponent implements OnI this.notification.show(msg, '', { duration: 2000 }); }); } - - public announce() { - this.liveAnnouncer.clear(); - this.liveAnnouncer.announce('', 'assertive'); - } } diff --git a/src/app/components/shared/comment-page/comment-page.component.ts b/src/app/components/shared/comment-page/comment-page.component.ts index 3c413f66651c053a6a3de83daa6be2fb4fa9a773..b7909fb5b3b32aa114d52d612a5d1e45f5cd6340 100644 --- a/src/app/components/shared/comment-page/comment-page.component.ts +++ b/src/app/components/shared/comment-page/comment-page.component.ts @@ -15,7 +15,6 @@ import { KeyboardKey } from '../../../utils/keyboard/keys'; }) export class CommentPageComponent implements OnInit, OnDestroy, AfterContentInit { roomId: string; - shortId: string; user: User; listenerFn: () => void; @@ -34,7 +33,6 @@ export class CommentPageComponent implements OnInit, OnDestroy, AfterContentInit } ngOnInit(): void { this.roomId = localStorage.getItem('roomId'); - this.shortId = localStorage.getItem('roomId'); this.user = this.authenticationService.getUser(); this.listenerFn = this._r.listen(document, 'keyup', (event) => { if (KeyboardUtils.isKeyEvent(event, KeyboardKey.Digit1) === true && this.eventService.focusOnInput === false) { @@ -51,7 +49,7 @@ export class CommentPageComponent implements OnInit, OnDestroy, AfterContentInit document.getElementById('filter-button').focus(); } else if (KeyboardUtils.isKeyEvent(event, KeyboardKey.Digit8) === true && this.eventService.focusOnInput === false) { this.liveAnnouncer.clear(); - this.liveAnnouncer.announce('Aktueller Sitzungs-Code:' + this.shortId.slice(0, 8)); + this.liveAnnouncer.announce('Aktueller Sitzungs-' + document.getElementById('shortId-header').textContent); } else if ( KeyboardUtils.isKeyEvent(event, KeyboardKey.Digit9, KeyboardKey.Escape) === true && this.eventService.focusOnInput === false @@ -85,9 +83,9 @@ export class CommentPageComponent implements OnInit, OnDestroy, AfterContentInit this.liveAnnouncer.announce('Du befindest dich auf der Fragen-Seite deiner Sitzung. ' + 'Drücke die Taste 1 um eine Frage zu stellen, die Taste 2 um auf das Sitzungs-Menü zu gelangen, ' + 'die Taste 8 um den aktuellen Sitzungs-Code zu hören, die Taste 0 um zurück zur Benutzer-Seite zu gelangen. ' + - 'Sobald mehrere Fragen vorhanden sind, kannst du Fragen suchen und filtern. Mit Taste 3 gelangst du in das Suchfeld,' + + 'Sobald mehrere Fragen vorhanden sind kannst du Fragen suchen und filtern. Mit Taste 3 gelangst du in das Suchfeld,' + 'durch drücken der Escape-Taste wird die Sucheingabe gelöscht. Drücke die Taste 4 um Fragen zu sortieren, ' + - 'oder die Taste 5 um Fragen zu filtern, oder die Taste 9 um diese Ansage zu wiederholen.', 'assertive'); + 'die Taste 5 um Fragen zu filtern, oder die Taste 9 um diese Ansage zu wiederholen.', 'assertive'); } } diff --git a/src/app/components/shared/header/header.component.html b/src/app/components/shared/header/header.component.html index ed93cf1f15c1940e88ffa0c04f6b506a4785ee1c..ec5e1809a326d53b842cdd7c21a87743f556dc9b 100644 --- a/src/app/components/shared/header/header.component.html +++ b/src/app/components/shared/header/header.component.html @@ -23,7 +23,7 @@ gavel </mat-icon> </span> - <h2 *ngIf="router.url.includes('comments')" fxLayoutAlign="center center"> + <h2 id="shortId-header" *ngIf="router.url.includes('comments')" fxLayoutAlign="center center"> {{'header.id' | translate}}: {{ shortId.slice(0, 4) }} {{ shortId.slice(4, 8) }} </h2> <span class="fill-remaining-space"></span>