diff --git a/client/src/app/site/agenda/components/speaker-list/speaker-list.component.html b/client/src/app/site/agenda/components/speaker-list/speaker-list.component.html index d2e22018c..02b1a02bd 100644 --- a/client/src/app/site/agenda/components/speaker-list/speaker-list.component.html +++ b/client/src/app/site/agenda/components/speaker-list/speaker-list.component.html @@ -1,9 +1,12 @@
-

- List of speakers -

+

List of speakers

+
+
@@ -27,8 +30,12 @@  ( Start time : {{ speaker.begin_time }}) - @@ -40,30 +47,34 @@ play_arrow {{ activeSpeaker }} - -
+
- - Call {{ hasSpokenCount(item) + 1 }} + + + Call {{ hasSpokenCount(item) + 1 }} + - - + + mic Start - + {{ item.marked ? 'star' : 'star_border' }} @@ -92,12 +103,11 @@
-
+
-
+ + + + + + + + + + + diff --git a/client/src/app/site/agenda/components/speaker-list/speaker-list.component.ts b/client/src/app/site/agenda/components/speaker-list/speaker-list.component.ts index 28223c73e..e82780252 100644 --- a/client/src/app/site/agenda/components/speaker-list/speaker-list.component.ts +++ b/client/src/app/site/agenda/components/speaker-list/speaker-list.component.ts @@ -14,6 +14,7 @@ import { BaseViewComponent } from 'app/site/base/base-view'; import { Title } from '@angular/platform-browser'; import { TranslateService } from '@ngx-translate/core'; import { MatSnackBar } from '@angular/material'; +import { PromptService } from 'app/core/services/prompt.service'; /** * The list of speakers for agenda items. @@ -54,6 +55,22 @@ export class SpeakerListComponent extends BaseViewComponent implements OnInit { */ public addSpeakerForm: FormGroup; + /** + * @returns true if the items' speaker list is currently not open + */ + public get closedList(): boolean { + return this.viewItem && this.viewItem.item.speaker_list_closed; + } + + public get emptyList(): boolean { + if (this.speakers && this.speakers.length) { + return false; + } else if (this.finishedSpeakers && this.finishedSpeakers.length) { + return false; + } + return this.activeSpeaker ? false : true; + } + /** * Constructor for speaker list component * @param title @@ -71,7 +88,8 @@ export class SpeakerListComponent extends BaseViewComponent implements OnInit { private route: ActivatedRoute, private DS: DataStoreService, private itemRepo: AgendaRepositoryService, - private op: OperatorService + private op: OperatorService, + private promptService: PromptService ) { super(title, translate, snackBar); this.addSpeakerForm = new FormGroup({ user_id: new FormControl([]) }); @@ -117,7 +135,8 @@ export class SpeakerListComponent extends BaseViewComponent implements OnInit { this.speakers = allSpeakers.filter(speaker => speaker.state === SpeakerState.WAITING); this.finishedSpeakers = allSpeakers.filter(speaker => speaker.state === SpeakerState.FINISHED); - this.activeSpeaker = allSpeakers.find(speaker => speaker.state === SpeakerState.CURRENT); + const currentSpeaker = allSpeakers.find(speaker => speaker.state === SpeakerState.CURRENT); + this.activeSpeaker = currentSpeaker ? currentSpeaker : null; } }); } @@ -190,4 +209,41 @@ export class SpeakerListComponent extends BaseViewComponent implements OnInit { public hasSpokenCount(speaker: ViewSpeaker): number { return this.finishedSpeakers.filter(finishedSpeaker => finishedSpeaker.user.id === speaker.user.id).length; } + + /** + * Closes the current speaker list + */ + public closeSpeakerList(): Promise { + if (!this.viewItem.item.speaker_list_closed) { + return this.itemRepo.update({ speaker_list_closed: true }, this.viewItem); + } + } + + /** + * Opens the speaker list for the current item + */ + public openSpeakerList(): Promise { + if (this.viewItem.item.speaker_list_closed) { + return this.itemRepo.update({ speaker_list_closed: false }, this.viewItem); + } + } + + /** + * Clears the speaker list by removing all current, past and future speakers + * after a confirmation dialog + */ + public async clearSpeakerList(): Promise { + const content = this.translate.instant('This will clear all speakers from the list.'); + if (await this.promptService.open('Are you sure?', content)) { + this.speakers.forEach(speaker => { + this.itemRepo.deleteSpeaker(this.viewItem.item, speaker.id); + }); + this.finishedSpeakers.forEach(speaker => { + this.itemRepo.deleteSpeaker(this.viewItem.item, speaker.id); + }); + if (this.activeSpeaker) { + this.itemRepo.deleteSpeaker(this.viewItem.item, this.activeSpeaker.id); + } + } + } } diff --git a/client/src/app/site/agenda/services/agenda-repository.service.ts b/client/src/app/site/agenda/services/agenda-repository.service.ts index d77ae76c3..5f15ea3e2 100644 --- a/client/src/app/site/agenda/services/agenda-repository.service.ts +++ b/client/src/app/site/agenda/services/agenda-repository.service.ts @@ -125,6 +125,26 @@ export class AgendaRepositoryService extends BaseRepository { await this.httpService.delete(restUrl); } + /** + * Stops the current speaker + * + * @param agenda the target agenda item + */ + public async closeSpeakerList(agenda: Item): Promise { + const restUrl = `rest/agenda/item/${agenda.id}/speak/`; + await this.httpService.delete(restUrl); + } + + /** + * Stops the current speaker + * + * @param agenda the target agenda item + */ + public async openSpeakerList(agenda: Item): Promise { + const restUrl = `rest/agenda/item/${agenda.id}/speak/`; + await this.httpService.delete(restUrl); + } + /** * Marks the current speaker *