diff --git a/src/app/modules/presentation/monitor/monitor.component.less b/src/app/modules/presentation/monitor/monitor.component.less
index d854d82..2fb8009 100644
--- a/src/app/modules/presentation/monitor/monitor.component.less
+++ b/src/app/modules/presentation/monitor/monitor.component.less
@@ -21,7 +21,54 @@
flex-direction: column;
justify-content: space-between;
- transition: 300ms all ease-in-out;
+ transition: 30ms all ease-in-out;
+}
+
+.bg-image {
+ z-index: 0;
+ opacity: 0;
+ background-size: cover;
+ transition: 5000ms opacity ease-in-out;
+}
+
+.bg-blue {
+ background-image: url("/assets/bg-dark-blue.jpg");
+ filter: blur(10px);
+ &.visible {
+ opacity: 0.5;
+ }
+}
+
+.bg-green {
+ background-image: url("/assets/bg-dark-green.jpg");
+ filter: blur(5px);
+ &.visible {
+ opacity: 0.9;
+ }
+}
+
+.bg-leder {
+ background-image: url("/assets/bg-leder.jpg");
+ filter: blur(5px);
+ &.visible {
+ opacity: 0.4;
+ }
+}
+
+.bg-praise {
+ background-image: url("/assets/bg-praise.jpg");
+ filter: blur(8px);
+ &.visible {
+ opacity: 0.2;
+ }
+}
+
+.bg-bible {
+ background-image: url("/assets/bg-bible.jpg");
+ filter: blur(8px);
+ &.visible {
+ opacity: 0.2;
+ }
}
.start {
@@ -56,4 +103,7 @@
filter: blur(30px);
opacity: 0.1;
transform: scale(0.8) translateY(-10%);
+ &.no-logo {
+ opacity: 0;
+ }
}
diff --git a/src/app/modules/presentation/monitor/monitor.component.ts b/src/app/modules/presentation/monitor/monitor.component.ts
index 97e6b1b..02c8278 100644
--- a/src/app/modules/presentation/monitor/monitor.component.ts
+++ b/src/app/modules/presentation/monitor/monitor.component.ts
@@ -1,5 +1,5 @@
import {Component, OnInit} from '@angular/core';
-import {distinctUntilChanged, filter, map, switchMap, tap} from 'rxjs/operators';
+import {debounceTime, distinctUntilChanged, filter, map, switchMap, tap} from 'rxjs/operators';
import {ShowService} from '../../shows/services/show.service';
import {SongService} from '../../songs/services/song.service';
import {Song} from '../../songs/services/song';
@@ -9,7 +9,7 @@ import {Observable} from 'rxjs';
import {ConfigService} from '../../../services/config.service';
import {songSwitch} from '../../../widget-modules/components/song-text/animation';
import {TextRenderingService} from '../../songs/services/text-rendering.service';
-import {Show} from '../../shows/services/show';
+import {PresentationBackground, Show} from '../../shows/services/show';
import {GlobalSettings} from '../../../services/global-settings';
import {ShowSongService} from '../../shows/services/show-song.service';
@@ -28,6 +28,7 @@ export class MonitorComponent implements OnInit {
public showType: string | null = null;
public date: Date | null = null;
public config$: Observable
;
+ public presentationBackground: PresentationBackground = 'none';
public constructor(
private showService: ShowService,
@@ -43,6 +44,7 @@ export class MonitorComponent implements OnInit {
public ngOnInit(): void {
this.globalSettingsService.get$
.pipe(
+ debounceTime(100),
filter(_ => !!_),
map(_ => _ as GlobalSettings),
map(_ => _.currentShow),
@@ -53,16 +55,15 @@ export class MonitorComponent implements OnInit {
switchMap(_ => this.showService.read$(_)),
filter(_ => !!_),
map(_ => _ as Show),
- tap(_ => (this.showType = _.showType)),
- tap(_ => (this.date = _.date.toDate())),
tap(_ => {
+ this.showType = _.showType;
+ this.date = _.date.toDate();
+ this.index = _.presentationSection;
+ this.presentationBackground = _.presentationBackground;
+ this.zoom = _.presentationZoom ?? 30;
if (this.songId !== _.presentationSongId) this.songId = 'empty';
setTimeout(() => (this.songId = _.presentationSongId), 300);
}),
- tap(_ => (this.index = _.presentationSection)),
- tap(_ => (this.zoom = _.presentationZoom ?? 30))
- )
- .pipe(
switchMap((_: Show) => this.showSongService.read$(_.id, _.presentationSongId)),
filter(_ => !!_),
map(_ => _ as Song)
diff --git a/src/app/modules/presentation/remote/remote.component.html b/src/app/modules/presentation/remote/remote.component.html
index 16fad92..90999cb 100644
--- a/src/app/modules/presentation/remote/remote.component.html
+++ b/src/app/modules/presentation/remote/remote.component.html
@@ -15,27 +15,29 @@
-
-
-
-
Leer
+
{{ song.title }}
@@ -60,9 +62,26 @@
-
+
+
+ Präsentation starten
+
+
+
+
+ Hintergrund
+
+ kein Hintergrund
+ Sternenhimmel
+ Blätter
+ Leder
+ Lobpreis
+ Bibel
+
+
+
{
- this.show = show;
- });
+ this.showService
+ .read$(change)
+ .pipe(debounceTime(100))
+ .subscribe(show => {
+ this.show = show;
+ });
combineLatest([this.showService.read$(change), this.showSongService.list$(change)]).subscribe(([show, list]) => {
this.showSongs = list;
@@ -106,7 +109,11 @@ export class RemoteComponent {
});
}
- public async onZoom(zoom: number): Promise {
- if (this.currentShowId != null) await this.showService.update$(this.currentShowId, {presentationZoom: zoom});
+ public async onZoom(presentationZoom: number): Promise {
+ if (this.currentShowId != null) await this.showService.update$(this.currentShowId, {presentationZoom});
+ }
+
+ public async onBackground(presentationBackground: PresentationBackground): Promise {
+ if (this.currentShowId != null) await this.showService.update$(this.currentShowId, {presentationBackground});
}
}
diff --git a/src/app/modules/shows/new/new.component.ts b/src/app/modules/shows/new/new.component.ts
index e0551bb..bebd5aa 100644
--- a/src/app/modules/shows/new/new.component.ts
+++ b/src/app/modules/shows/new/new.component.ts
@@ -5,7 +5,7 @@ import {Show} from '../services/show';
import {ShowService} from '../services/show.service';
import {FormControl, FormGroup, Validators} from '@angular/forms';
import {Router} from '@angular/router';
-import {faSave} from '@fortawesome/free-solid-svg-icons/faSave';
+import {faSave} from '@fortawesome/free-solid-svg-icons';
@Component({
selector: 'app-new',
@@ -36,7 +36,7 @@ export class NewComponent implements OnInit {
return;
}
- const id = await this.showService.new$(this.form.value);
+ const id = await this.showService.new$(this.form.value as Partial);
await this.router.navigateByUrl(`/shows/${id ?? ''}`);
}
}
diff --git a/src/app/modules/shows/services/show.ts b/src/app/modules/shows/services/show.ts
index 18922ce..8c295f3 100644
--- a/src/app/modules/shows/services/show.ts
+++ b/src/app/modules/shows/services/show.ts
@@ -1,6 +1,8 @@
import firebase from 'firebase/compat/app';
import Timestamp = firebase.firestore.Timestamp;
+export type PresentationBackground = 'none' | 'blue' | 'green' | 'leder' | 'praise';
+
export interface Show {
id: string;
showType: string;
@@ -15,4 +17,5 @@ export interface Show {
presentationSongId: string;
presentationSection: number;
presentationZoom: number;
+ presentationBackground: PresentationBackground;
}
diff --git a/src/app/modules/shows/show/show.component.html b/src/app/modules/shows/show/show.component.html
index d6e6e23..569b30e 100644
--- a/src/app/modules/shows/show/show.component.html
+++ b/src/app/modules/shows/show/show.component.html
@@ -8,7 +8,7 @@
{{show.public ? 'öffentliche' : 'geschlossene'}} Veranstaltung von
-
+
Text anzeigen
-
{{ iSong.title }}
+
{{ iSong.key }} - {{ iSong.title }}
{{ iSong.title }}
@@ -31,7 +31,7 @@
this.onFlagsChanged(_));
- this.onFlagsChanged(this.form.controls.flags.value);
+ this.form.controls.flags.valueChanges.subscribe(_ => this.onFlagsChanged(_ as string));
+ this.onFlagsChanged(this.form.controls.flags.value as string);
});
}
diff --git a/src/app/modules/songs/song/new/new.component.ts b/src/app/modules/songs/song/new/new.component.ts
index 20331ce..f6d524e 100644
--- a/src/app/modules/songs/song/new/new.component.ts
+++ b/src/app/modules/songs/song/new/new.component.ts
@@ -1,5 +1,5 @@
import {Component, OnDestroy, OnInit} from '@angular/core';
-import {faSave} from '@fortawesome/free-solid-svg-icons/faSave';
+import {faSave} from '@fortawesome/free-solid-svg-icons';
import {FormControl, FormGroup, Validators} from '@angular/forms';
import {SongService} from '../../services/song.service';
import {Song} from '../../services/song';
diff --git a/src/app/modules/songs/song/song.component.ts b/src/app/modules/songs/song/song.component.ts
index 689743d..75af592 100644
--- a/src/app/modules/songs/song/song.component.ts
+++ b/src/app/modules/songs/song/song.component.ts
@@ -8,8 +8,7 @@ import {FileDataService} from '../services/file-data.service';
import {File} from '../services/file';
import {UserService} from '../../../services/user/user.service';
import {User} from '../../../services/user/user';
-import {faEdit} from '@fortawesome/free-solid-svg-icons/faEdit';
-import {faTrash} from '@fortawesome/free-solid-svg-icons/faTrash';
+import {faEdit, faTrash} from '@fortawesome/free-solid-svg-icons';
@Component({
selector: 'app-song',
diff --git a/src/app/modules/user/info/info.component.ts b/src/app/modules/user/info/info.component.ts
index fe12049..b8827b6 100644
--- a/src/app/modules/user/info/info.component.ts
+++ b/src/app/modules/user/info/info.component.ts
@@ -3,7 +3,7 @@ import {UserService} from '../../../services/user/user.service';
import {Observable} from 'rxjs';
import {User} from '../../../services/user/user';
import {ChordMode} from '../../../widget-modules/components/song-text/song-text.component';
-import {faSignOutAlt} from '@fortawesome/free-solid-svg-icons/faSignOutAlt';
+import {faSignOutAlt} from '@fortawesome/free-solid-svg-icons';
import {RolePipe} from './role.pipe';
import {roles} from '../../../services/user/roles';
diff --git a/src/app/modules/user/info/users/user/user.component.ts b/src/app/modules/user/info/users/user/user.component.ts
index 8ec249c..85fc616 100644
--- a/src/app/modules/user/info/users/user/user.component.ts
+++ b/src/app/modules/user/info/users/user/user.component.ts
@@ -2,7 +2,7 @@ import {Component, Input} from '@angular/core';
import {User} from '../../../../../services/user/user';
import {UserService} from '../../../../../services/user/user.service';
import {ROLE_TYPES} from '../../../../../services/user/roles';
-import {faTimes} from '@fortawesome/free-solid-svg-icons/faTimes';
+import {faTimes} from '@fortawesome/free-solid-svg-icons';
@Component({
selector: 'app-user',
diff --git a/src/app/modules/user/login/login.component.ts b/src/app/modules/user/login/login.component.ts
index edf5efe..2567674 100644
--- a/src/app/modules/user/login/login.component.ts
+++ b/src/app/modules/user/login/login.component.ts
@@ -2,8 +2,7 @@ import {Component, OnInit} from '@angular/core';
import {FormControl, FormGroup, Validators} from '@angular/forms';
import {Router} from '@angular/router';
import {UserService} from '../../../services/user/user.service';
-import {faSignInAlt} from '@fortawesome/free-solid-svg-icons/faSignInAlt';
-import {faUserPlus} from '@fortawesome/free-solid-svg-icons/faUserPlus';
+import {faSignInAlt, faUserPlus} from '@fortawesome/free-solid-svg-icons';
@Component({
selector: 'app-login',
diff --git a/src/app/modules/user/new/new.component.ts b/src/app/modules/user/new/new.component.ts
index eee2cf5..be6bdae 100644
--- a/src/app/modules/user/new/new.component.ts
+++ b/src/app/modules/user/new/new.component.ts
@@ -1,7 +1,7 @@
import {Component, OnInit} from '@angular/core';
import {FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms';
import {UserService} from '../../../services/user/user.service';
-import {faUserPlus} from '@fortawesome/free-solid-svg-icons/faUserPlus';
+import {faUserPlus} from '@fortawesome/free-solid-svg-icons';
@Component({
selector: 'app-new',
diff --git a/src/app/modules/user/password/password.component.ts b/src/app/modules/user/password/password.component.ts
index d59a241..cdd7757 100644
--- a/src/app/modules/user/password/password.component.ts
+++ b/src/app/modules/user/password/password.component.ts
@@ -2,7 +2,7 @@ import {Component, OnInit} from '@angular/core';
import {FormControl, FormGroup, Validators} from '@angular/forms';
import {Router} from '@angular/router';
import {UserService} from '../../../services/user/user.service';
-import {faWindowRestore} from '@fortawesome/free-solid-svg-icons/faWindowRestore';
+import {faWindowRestore} from '@fortawesome/free-solid-svg-icons';
@Component({
selector: 'app-password',
diff --git a/src/app/services/filter.helper.ts b/src/app/services/filter.helper.ts
index 44469c2..3aee406 100644
--- a/src/app/services/filter.helper.ts
+++ b/src/app/services/filter.helper.ts
@@ -3,13 +3,13 @@ import {Song} from '../modules/songs/services/song';
export function filterSong(song: Song, filterValue: string): boolean {
if (!filterValue) return true;
- const textMatch = !!song.text && normalize(song.text).indexOf(normalize(filterValue)) !== -1;
- const titleMatch = !!song.title && normalize(song.title).indexOf(normalize(filterValue)) !== -1;
- const artistMatch = !!song.title && normalize(song.artist).indexOf(normalize(filterValue)) !== -1;
+ const textMatch = !!song.text && normalize(song.text)?.indexOf(normalize(filterValue)) !== -1;
+ const titleMatch = !!song.title && normalize(song.title)?.indexOf(normalize(filterValue)) !== -1;
+ const artistMatch = !!song.title && normalize(song.artist)?.indexOf(normalize(filterValue)) !== -1;
return textMatch || titleMatch || artistMatch;
}
function normalize(input: string): string {
- return input.toLowerCase().replace(/[\s?!.,']/g, '');
+ return input?.toLowerCase().replace(/[\s?!.,']/g, '');
}
diff --git a/src/app/widget-modules/components/card/card.component.less b/src/app/widget-modules/components/card/card.component.less
index 52086a7..9839bf8 100644
--- a/src/app/widget-modules/components/card/card.component.less
+++ b/src/app/widget-modules/components/card/card.component.less
@@ -3,7 +3,7 @@
.card {
margin: 20px;
border-radius: 8px;
- background: #fffb;
+ background: #fffe;
backdrop-filter: blur(12px);
overflow: hidden;
width: 800px;
@@ -11,8 +11,8 @@
@media screen and (max-width: 860px) {
width: 100vw;
- border-radius: 0px;
- background: #fffa;
+ border-radius: 0;
+ background: #fffe;
margin: 0;
}
diff --git a/src/app/widget-modules/components/card/card.component.ts b/src/app/widget-modules/components/card/card.component.ts
index f5ac135..b5a34c1 100644
--- a/src/app/widget-modules/components/card/card.component.ts
+++ b/src/app/widget-modules/components/card/card.component.ts
@@ -1,5 +1,5 @@
import {Component, Input} from '@angular/core';
-import {faTimes} from '@fortawesome/free-solid-svg-icons/faTimes';
+import {faTimes} from '@fortawesome/free-solid-svg-icons';
@Component({
selector: 'app-card',
diff --git a/src/app/widget-modules/components/list-header/list-header.component.ts b/src/app/widget-modules/components/list-header/list-header.component.ts
index b5be8a5..b3b6d04 100644
--- a/src/app/widget-modules/components/list-header/list-header.component.ts
+++ b/src/app/widget-modules/components/list-header/list-header.component.ts
@@ -1,6 +1,5 @@
import {Component, EventEmitter, Input, Output} from '@angular/core';
-import {faFilter} from '@fortawesome/free-solid-svg-icons/faFilter';
-import {faPlus} from '@fortawesome/free-solid-svg-icons/faPlus';
+import {faFilter, faPlus} from '@fortawesome/free-solid-svg-icons';
import {fade} from '../../../animations';
@Component({
diff --git a/src/app/widget-modules/components/menu-button/menu-button.component.ts b/src/app/widget-modules/components/menu-button/menu-button.component.ts
index 65c9604..ab85cb1 100644
--- a/src/app/widget-modules/components/menu-button/menu-button.component.ts
+++ b/src/app/widget-modules/components/menu-button/menu-button.component.ts
@@ -1,6 +1,6 @@
import {Component, Input} from '@angular/core';
import {IconProp} from '@fortawesome/fontawesome-svg-core';
-import {faCross} from '@fortawesome/free-solid-svg-icons/faCross';
+import {faCross} from '@fortawesome/free-solid-svg-icons';
@Component({
selector: 'app-menu-button',
diff --git a/src/app/widget-modules/components/song-text/song-text.component.less b/src/app/widget-modules/components/song-text/song-text.component.less
index 63910b7..4c08daf 100644
--- a/src/app/widget-modules/components/song-text/song-text.component.less
+++ b/src/app/widget-modules/components/song-text/song-text.component.less
@@ -27,7 +27,7 @@
.line {
opacity: 1;
- transition: 1000ms all ease-in-out;
+ transition: 100ms all ease-in-out;
&.disabled {
opacity: 0.5;
@@ -65,7 +65,7 @@
left: 40px;
right: 40px;
- transition: 1000ms all ease-in-out;
+ transition: 1000ms top ease-in-out;
}
.error {
diff --git a/src/app/widget-modules/pipes/legal-owner-translator/legal-owner.pipe.ts b/src/app/widget-modules/pipes/legal-owner-translator/legal-owner.pipe.ts
index 9738e04..92ab46b 100644
--- a/src/app/widget-modules/pipes/legal-owner-translator/legal-owner.pipe.ts
+++ b/src/app/widget-modules/pipes/legal-owner-translator/legal-owner.pipe.ts
@@ -1,10 +1,11 @@
import {Pipe, PipeTransform} from '@angular/core';
+import {SongLegalOwner} from '../../../modules/songs/services/song.service';
@Pipe({
name: 'legalOwner',
})
export class LegalOwnerPipe implements PipeTransform {
- public transform(legalOwnerKey: string): string {
+ public transform(legalOwnerKey: SongLegalOwner): string {
switch (legalOwnerKey) {
case 'CCLI':
return 'CCLI';
diff --git a/src/app/widget-modules/pipes/legal-type-translator/legal-type.pipe.ts b/src/app/widget-modules/pipes/legal-type-translator/legal-type.pipe.ts
index c723c45..ecac89c 100644
--- a/src/app/widget-modules/pipes/legal-type-translator/legal-type.pipe.ts
+++ b/src/app/widget-modules/pipes/legal-type-translator/legal-type.pipe.ts
@@ -1,10 +1,11 @@
import {Pipe, PipeTransform} from '@angular/core';
+import {SongLegalType} from '../../../modules/songs/services/song.service';
@Pipe({
name: 'legalType',
})
export class LegalTypePipe implements PipeTransform {
- public transform(legalTypeKey: string): string {
+ public transform(legalTypeKey: SongLegalType): string {
switch (legalTypeKey) {
case 'open':
return 'Klärung erforderlich ';
diff --git a/src/app/widget-modules/pipes/song-type-translater/song-type.pipe.ts b/src/app/widget-modules/pipes/song-type-translater/song-type.pipe.ts
index d655001..12fcab4 100644
--- a/src/app/widget-modules/pipes/song-type-translater/song-type.pipe.ts
+++ b/src/app/widget-modules/pipes/song-type-translater/song-type.pipe.ts
@@ -1,15 +1,18 @@
import {Pipe, PipeTransform} from '@angular/core';
+import {SongType} from '../../../modules/songs/services/song.service';
@Pipe({
name: 'songType',
})
export class SongTypePipe implements PipeTransform {
- public transform(songTypeKey: string): string {
+ public transform(songTypeKey: SongType): string {
switch (songTypeKey) {
case 'Worship':
return 'Anbetung';
case 'Praise':
return 'Lobpreis';
+ case 'Misc':
+ return 'sonstiges';
default:
return '';
}
diff --git a/src/assets/background.png b/src/assets/background.png
deleted file mode 100644
index e9296af..0000000
Binary files a/src/assets/background.png and /dev/null differ
diff --git a/src/assets/bg-bible.jpg b/src/assets/bg-bible.jpg
new file mode 100644
index 0000000..acdcc14
Binary files /dev/null and b/src/assets/bg-bible.jpg differ
diff --git a/src/assets/bg-dark-blue.jpg b/src/assets/bg-dark-blue.jpg
new file mode 100644
index 0000000..58ee659
Binary files /dev/null and b/src/assets/bg-dark-blue.jpg differ
diff --git a/src/assets/bg-dark-green.jpg b/src/assets/bg-dark-green.jpg
new file mode 100644
index 0000000..af2fce4
Binary files /dev/null and b/src/assets/bg-dark-green.jpg differ
diff --git a/src/assets/bg-leder.jpg b/src/assets/bg-leder.jpg
new file mode 100644
index 0000000..0b29e2b
Binary files /dev/null and b/src/assets/bg-leder.jpg differ
diff --git a/src/assets/bg-praise.jpg b/src/assets/bg-praise.jpg
new file mode 100644
index 0000000..aa6e59c
Binary files /dev/null and b/src/assets/bg-praise.jpg differ
diff --git a/src/styles/styles.less b/src/styles/styles.less
index 3571aa5..794d9b3 100644
--- a/src/styles/styles.less
+++ b/src/styles/styles.less
@@ -18,11 +18,8 @@ body {
overscroll-behavior-y: none;
color: #333;
- background: #373b44; /* fallback for old browsers */
- background: -webkit-linear-gradient(to bottom, #373b44, @primary-color); /* Chrome 10-25, Safari 5.1-6 */
- background: linear-gradient(to bottom, #373b44, @primary-color); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
background-attachment: fixed;
- background: url("/assets/background.png");
+ background-image: url("/assets/background.jpg");
background-size: cover;
}