Merge pull request #4959 from GabrielInTheWorld/projectorMaxTeller

Adds config to see a max number of next speakers
This commit is contained in:
Emanuel Schütze 2019-09-02 15:29:42 +02:00 committed by GitHub
commit 9685d04248
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 82 additions and 41 deletions

View File

@ -1,4 +1,4 @@
interface SlideSpeaker { export interface SlideSpeaker {
user: string; user: string;
marked: boolean; marked: boolean;
} }

View File

@ -1,11 +1,11 @@
.lastSpeakers { .lastSpeakers {
color: #9a9898; color: #9a9898;
margin-left: 33px; margin: 20px 0 10px 33px;
margin-bottom: 10px;
} }
.currentSpeaker { .currentSpeaker {
font-weight: bold; font-weight: bold;
margin: 20px 0 16px;
.mat-icon, .mat-icon,
span { span {
@ -17,10 +17,12 @@
} }
.nextSpeakers { .nextSpeakers {
margin-left: 13px !important; margin: 0;
margin-top: 10px !important; padding-left: 6px;
margin-top: 20px !important;
li { li {
list-style-position: inside;
line-height: 150%; line-height: 150%;
} }
} }

View File

@ -1,27 +1,15 @@
<div id="overlay" *ngIf="data"> <div id="overlay" *ngIf="currentSpeaker || nextSpeakers.length > 0">
<h3 translate>List of speakers</h3> <h3 translate>List of speakers</h3>
<!-- Last speakers --> <div *ngIf="currentSpeaker" class="currentSpeaker one-line">
<div *ngIf="data.data.finished && data.data.finished.length"> <mat-icon>mic</mat-icon>
<div *ngFor="let speaker of data.data.finished" class="lastSpeakers"> <span>{{ currentSpeaker.user }}</span>
</div>
<ol class="nextSpeakers">
<li *ngFor="let speaker of nextSpeakers" class="one-line">
{{ speaker.user }} {{ speaker.user }}
<mat-icon *ngIf="speaker.marked">star</mat-icon> <mat-icon *ngIf="speaker.marked">star</mat-icon>
</div> </li>
</div> </ol>
<!-- Current speaker -->
<div *ngIf="data.data.current" class="currentSpeaker">
<mat-icon>mic</mat-icon>
<span>{{ data.data.current.user }}</span>
</div>
<!-- Next speakers -->
<div *ngIf="data.data.waiting && data.data.waiting.length">
<ol class="nextSpeakers">
<li *ngFor="let speaker of data.data.waiting">
{{ speaker.user }}
<mat-icon *ngIf="speaker.marked">star</mat-icon>
</li>
</ol>
</div>
</div> </div>

View File

@ -6,12 +6,22 @@
bottom: 0; bottom: 0;
background-color: #d3d3d3; background-color: #d3d3d3;
width: 40%; width: 40%;
height: 200px; height: 210px;
margin: 10px; margin: 10px;
z-index: 20; z-index: 20;
border-radius: 7px; border-radius: 7px;
border: 1px solid #999; border: 1px solid #999;
padding: 0px 7px 10px 19px; padding: 10px 10px 10px 25px;
box-shadow: 3px 3px 10px 1px rgba(0, 0, 0, 0.5); box-shadow: 3px 3px 10px 1px rgba(0, 0, 0, 0.5);
overflow: hidden; overflow: hidden;
h3 {
margin-top: 0;
}
.one-line {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
} }

View File

@ -1,7 +1,7 @@
import { Component } from '@angular/core'; import { Component, Input } from '@angular/core';
import { BaseSlideComponent } from 'app/slides/base-slide-component'; import { BaseSlideComponent } from 'app/slides/base-slide-component';
import { CommonListOfSpeakersSlideData } from '../common/common-list-of-speakers-slide-data'; import { CommonListOfSpeakersSlideData, SlideSpeaker } from '../common/common-list-of-speakers-slide-data';
@Component({ @Component({
selector: 'os-current-list-of-speakers-overlay-slide', selector: 'os-current-list-of-speakers-overlay-slide',
@ -9,6 +9,31 @@ import { CommonListOfSpeakersSlideData } from '../common/common-list-of-speakers
styleUrls: ['./current-list-of-speakers-overlay-slide.component.scss'] styleUrls: ['./current-list-of-speakers-overlay-slide.component.scss']
}) })
export class CurrentListOfSpeakersOverlaySlideComponent extends BaseSlideComponent<CommonListOfSpeakersSlideData> { export class CurrentListOfSpeakersOverlaySlideComponent extends BaseSlideComponent<CommonListOfSpeakersSlideData> {
/**
* Gets the data. Sets necessary information for the list of speakers in the overlay.
*
* @param data The passed data to this overlay.
*/
@Input()
public set data(data: any) {
if (data.data.current) {
this.currentSpeaker = data.data.current;
}
if (data.data.waiting) {
this.nextSpeakers = data.data.waiting;
}
}
/**
* The current speaker.
*/
public currentSpeaker: SlideSpeaker;
/**
* List with the next speakers for this list.
*/
public nextSpeakers: SlideSpeaker[] = [];
public constructor() { public constructor() {
super(); super();
} }

View File

@ -23,7 +23,7 @@
.slidetitle { .slidetitle {
border-bottom: 2px solid #d3d3d3; border-bottom: 2px solid #d3d3d3;
padding-bottom: 20px; padding-bottom: 10px;
h1 { h1 {
margin-bottom: 0; margin-bottom: 0;
@ -34,7 +34,7 @@
h2 { h2 {
color: #9a9898; color: #9a9898;
margin-top: 10px; margin-top: 10px;
margin-bottom: 2px; margin-bottom: -10px;
font-size: 28px; font-size: 28px;
font-weight: normal; font-weight: normal;
display: block; display: block;

View File

@ -116,13 +116,25 @@ def get_config_variables():
validators=(MinValueValidator(0),), validators=(MinValueValidator(0),),
) )
yield ConfigVariable(
name="agenda_show_next_speakers",
default_value=-1,
input_type="integer",
label="Number of the next speakers to be shown on the projector",
help_text="Enter number of the next shown speakers. Choose -1 to show all next speakers.",
weight=222,
group="Agenda",
subgroup="List of speakers",
validators=(MinValueValidator(-1),),
)
yield ConfigVariable( yield ConfigVariable(
name="agenda_countdown_warning_time", name="agenda_countdown_warning_time",
default_value=0, default_value=0,
input_type="integer", input_type="integer",
label="Show orange countdown in the last x seconds of speaking time", label="Show orange countdown in the last x seconds of speaking time",
help_text="Enter duration in seconds. Choose 0 to disable warning color.", help_text="Enter duration in seconds. Choose 0 to disable warning color.",
weight=221, weight=224,
group="Agenda", group="Agenda",
subgroup="List of speakers", subgroup="List of speakers",
validators=(MinValueValidator(0),), validators=(MinValueValidator(0),),
@ -133,7 +145,7 @@ def get_config_variables():
default_value=60, default_value=60,
input_type="integer", input_type="integer",
label="Predefined seconds of new countdowns", label="Predefined seconds of new countdowns",
weight=222, weight=226,
group="Agenda", group="Agenda",
subgroup="List of speakers", subgroup="List of speakers",
) )
@ -144,7 +156,7 @@ def get_config_variables():
input_type="boolean", input_type="boolean",
label="Couple countdown with the list of speakers", label="Couple countdown with the list of speakers",
help_text="[Begin speech] starts the countdown, [End speech] stops the countdown.", help_text="[Begin speech] starts the countdown, [End speech] stops the countdown.",
weight=223, weight=228,
group="Agenda", group="Agenda",
subgroup="List of speakers", subgroup="List of speakers",
) )
@ -154,7 +166,7 @@ def get_config_variables():
default_value=False, default_value=False,
input_type="boolean", input_type="boolean",
label="Hide the amount of speakers in subtitle of list of speakers slide", label="Hide the amount of speakers in subtitle of list of speakers slide",
weight=224, weight=230,
group="Agenda", group="Agenda",
subgroup="List of speakers", subgroup="List of speakers",
) )
@ -164,7 +176,7 @@ def get_config_variables():
default_value=False, default_value=False,
input_type="boolean", input_type="boolean",
label="Only present participants can be added to the list of speakers", label="Only present participants can be added to the list of speakers",
weight=225, weight=232,
group="Agenda", group="Agenda",
subgroup="List of speakers", subgroup="List of speakers",
) )

View File

@ -152,12 +152,16 @@ async def get_list_of_speakers_slide_data(
speakers_finished = sorted(speakers_finished, key=lambda s: s["end_time"]) speakers_finished = sorted(speakers_finished, key=lambda s: s["end_time"])
number_of_last_speakers = await get_config(all_data, "agenda_show_last_speakers") number_of_last_speakers = await get_config(all_data, "agenda_show_last_speakers")
number_of_next_speakers = await get_config(all_data, "agenda_show_next_speakers")
if number_of_last_speakers == 0: if number_of_last_speakers == 0:
speakers_finished = [] speakers_finished = []
else: else:
speakers_finished = speakers_finished[ # Take the last speakers
-number_of_last_speakers: speakers_finished = speakers_finished[-number_of_last_speakers:]
] # Take the last speakers
if number_of_next_speakers != -1:
speakers_waiting = speakers_waiting[:number_of_next_speakers]
return { return {
"waiting": speakers_waiting, "waiting": speakers_waiting,