-
+
+
+
+
+ @for (song of songs; track trackBy($index, song)) {
+
+
{{ song.number }}
+
+ {{ song.title }}
+ @if (song.hasChordValidationIssues) {
+ *
+ }
- } @if (song.status === 'set') {
-
-
+
+
+ @if (song.status === 'draft') {
+
+
+
+ }
+ @if (song.status === 'set') {
+
+
+
+ }
+ @if (song.status === 'final') {
+
+
+
+ }
+
+ @if (song.legalType === 'open') {
+
+
+
+ }
- } @if (song.status === 'final') {
-
-
-
- }
-
- @if (song.legalType === 'open') {
-
- }
+ }
+
-
{{ song.key }}
-
- }
-
-
-
-
+
+
+
}
diff --git a/src/app/modules/songs/song-list/song-list.component.ts b/src/app/modules/songs/song-list/song-list.component.ts
index 2cbf11a..bf32da6 100644
--- a/src/app/modules/songs/song-list/song-list.component.ts
+++ b/src/app/modules/songs/song-list/song-list.component.ts
@@ -14,7 +14,7 @@ import {FilterComponent} from './filter/filter.component';
import {CardComponent} from '../../../widget-modules/components/card/card.component';
import {RoleDirective} from '../../../services/user/role.directive';
import {FaIconComponent} from '@fortawesome/angular-fontawesome';
-import {SidebarComponent} from '../../../widget-modules/components/sidebar/sidebar.component';
+import {PageFrameComponent} from '../../../widget-modules/components/sidebar/page-frame.component';
import {ButtonComponent} from '../../../widget-modules/components/button/button.component';
interface SongListItem extends Song {
@@ -27,7 +27,7 @@ interface SongListItem extends Song {
styleUrls: ['./song-list.component.less'],
changeDetection: ChangeDetectionStrategy.OnPush,
animations: [fade],
- imports: [FilterComponent, CardComponent, RouterLink, RoleDirective, FaIconComponent, AsyncPipe, SidebarComponent, ButtonComponent],
+ imports: [FilterComponent, CardComponent, RouterLink, RoleDirective, FaIconComponent, AsyncPipe, PageFrameComponent, ButtonComponent],
})
export class SongListComponent {
public faLegal = faBalanceScaleRight;
@@ -48,7 +48,7 @@ export class SongListComponent {
...song,
hasChordValidationIssues: this.textRenderingService.validateChordNotation(song.text ?? '').length > 0,
}));
- })
+ }),
);
public trackBy = (index: number, show: SongListItem) => show.id;
diff --git a/src/app/modules/songs/song/edit/edit-song/edit-song.component.less b/src/app/modules/songs/song/edit/edit-song/edit-song.component.less
index d92b086..e4430d8 100644
--- a/src/app/modules/songs/song/edit/edit-song/edit-song.component.less
+++ b/src/app/modules/songs/song/edit/edit-song/edit-song.component.less
@@ -24,6 +24,7 @@
textarea {
font-family: 'Ubuntu Mono', monospace;
+ line-height: 15px;
}
}
diff --git a/src/app/modules/songs/song/edit/edit.component.html b/src/app/modules/songs/song/edit/edit.component.html
index 70748b3..7ae55ae 100644
--- a/src/app/modules/songs/song/edit/edit.component.html
+++ b/src/app/modules/songs/song/edit/edit.component.html
@@ -1,5 +1,7 @@
-
+
+
+
diff --git a/src/app/modules/songs/song/edit/edit.component.ts b/src/app/modules/songs/song/edit/edit.component.ts
index 39ae3ba..502ee53 100644
--- a/src/app/modules/songs/song/edit/edit.component.ts
+++ b/src/app/modules/songs/song/edit/edit.component.ts
@@ -2,12 +2,13 @@ import {Component, ViewChild} from '@angular/core';
import {EditSongComponent} from './edit-song/edit-song.component';
import {EditFileComponent} from './edit-file/edit-file.component';
import {HistoryComponent} from './history/history.component';
+import {PageFrameComponent} from '../../../../widget-modules/components/sidebar/page-frame.component';
@Component({
selector: 'app-edit',
templateUrl: './edit.component.html',
styleUrls: ['./edit.component.less'],
- imports: [EditSongComponent, EditFileComponent, HistoryComponent],
+ imports: [EditSongComponent, EditFileComponent, HistoryComponent, PageFrameComponent],
})
export class EditComponent {
@ViewChild(EditSongComponent) public editSongComponent: EditSongComponent | null = null;
diff --git a/src/app/modules/songs/song/new/new.component.html b/src/app/modules/songs/song/new/new.component.html
index bdf2189..aadb6b7 100644
--- a/src/app/modules/songs/song/new/new.component.html
+++ b/src/app/modules/songs/song/new/new.component.html
@@ -1,16 +1,18 @@
-
-
-
- Nummer
-
-
-
- Titel
-
-
-
+
+
+
+
+ Nummer
+
+
+
+ Titel
+
+
+
-
- Anlegen
-
-
+
+ Anlegen
+
+
+
diff --git a/src/app/modules/songs/song/new/new.component.ts b/src/app/modules/songs/song/new/new.component.ts
index 1936073..a1ae3f8 100644
--- a/src/app/modules/songs/song/new/new.component.ts
+++ b/src/app/modules/songs/song/new/new.component.ts
@@ -1,6 +1,5 @@
-import {Component, OnInit, inject} from '@angular/core';
+import {Component, DestroyRef, inject, OnInit} from '@angular/core';
import {faSave} from '@fortawesome/free-solid-svg-icons';
-import {DestroyRef} from '@angular/core';
import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
import {FormControl, FormGroup, ReactiveFormsModule, Validators} from '@angular/forms';
import {SongService} from '../../services/song.service';
@@ -12,12 +11,13 @@ import {MatFormField, MatLabel} from '@angular/material/form-field';
import {MatInput} from '@angular/material/input';
import {ButtonRowComponent} from '../../../../widget-modules/components/button-row/button-row.component';
import {ButtonComponent} from '../../../../widget-modules/components/button/button.component';
+import {PageFrameComponent} from '../../../../widget-modules/components/sidebar/page-frame.component';
@Component({
selector: 'app-new',
templateUrl: './new.component.html',
styleUrls: ['./new.component.less'],
- imports: [CardComponent, ReactiveFormsModule, MatFormField, MatLabel, MatInput, ButtonRowComponent, ButtonComponent],
+ imports: [CardComponent, ReactiveFormsModule, MatFormField, MatLabel, MatInput, ButtonRowComponent, ButtonComponent, PageFrameComponent],
})
export class NewComponent implements OnInit {
private songService = inject(SongService);
diff --git a/src/app/modules/songs/song/song.component.html b/src/app/modules/songs/song/song.component.html
index ddf9a4d..c07a40a 100644
--- a/src/app/modules/songs/song/song.component.html
+++ b/src/app/modules/songs/song/song.component.html
@@ -1,61 +1,77 @@
-
- @if (song$ | async; as song) {
-
-
-
-
-
Typ: {{ song.type | songType }}
-
Tonart: {{ song.key }}
-
Tempo: {{ song.tempo }}
-
Status: {{ (song.status | status) || "entwurf" }}
- @if (song.legalOwner) {
-
Rechteinhaber: {{ song.legalOwner | legalOwner }}
- } @if (song.legalOwnerId && song.legalOwner === 'CCLI') {
+
+
+ @if (song$ | async; as song) {
+
+
-
CCLI Nummer: {{ song.legalOwnerId }}
+
+
Typ: {{ song.type | songType }}
+
Tonart: {{ song.key }}
+
Tempo: {{ song.tempo }}
+
Status: {{ (song.status | status) || "entwurf" }}
+ @if (song.legalOwner) {
+
Rechteinhaber: {{ song.legalOwner | legalOwner }}
+ }
+ @if (song.legalOwnerId && song.legalOwner === 'CCLI') {
+
+ }
+ @if (song.legalOwnerId && song.legalOwner !== 'CCLI') {
+
Rechteinhaber ID: {{ song.legalOwnerId }}
+ }
+ @if (song.artist) {
+
Künstler: {{ song.artist }}
+ }
+ @if (song.label) {
+
Verlag: {{ song.label }}
+ }
+ @if (song.origin) {
+
Quelle: {{ song.origin }}
+ }
+
Wie oft
+ verwendet: {{ songCount$ | async }}
+
+
- } @if (song.legalOwnerId && song.legalOwner !== 'CCLI') {
-
Rechteinhaber ID: {{ song.legalOwnerId }}
- } @if (song.artist) {
-
Künstler: {{ song.artist }}
- } @if (song.label) {
-
Verlag: {{ song.label }}
- } @if (song.origin) {
-
Quelle: {{ song.origin }}
+ @if (user$ | async; as user) {
+
}
-
Wie oft verwendet: {{ songCount$ | async }}
+
+ @for (flag of getFlags(song.flags); track flag) {
+ {{ flag }}
+ }
+
+
{{ song.comment }}
-
- @if (user$ | async; as user) {
-
- }
-
- @for (flag of getFlags(song.flags); track flag) {
- {{ flag }}
- }
-
- {{ song.comment }}
-
-
- Löschen
- Bearbeiten
-
- Zu Veranstaltung hinzufügen
-
- @for (show of privateShows$|async; track show.id) {
- {{ show.date.toDate() | date: "dd.MM.yyyy" }} {{ show.showType | showType }}
- }
-
-
-
-
- } @if (files$ | async; as files) { @if (files.length > 0) {
-
- @for (file of files$ | async; track file.id) {
-
-
-
+
+ Löschen
+ Bearbeiten
+
+ Zu Veranstaltung hinzufügen
+
+ @for (show of privateShows$|async; track show.id) {
+ {{ show.date.toDate() | date: "dd.MM.yyyy" }} {{ show.showType | showType }}
+
+ }
+
+
+
+
}
-
- } }
-
+ @if (files$ | async; as files) {
+ @if (files.length > 0) {
+
+ @for (file of files$ | async; track file.id) {
+
+
+
+ }
+
+ }
+ }
+
+
diff --git a/src/app/modules/songs/song/song.component.ts b/src/app/modules/songs/song/song.component.ts
index d5f95f0..e224251 100644
--- a/src/app/modules/songs/song/song.component.ts
+++ b/src/app/modules/songs/song/song.component.ts
@@ -1,4 +1,4 @@
-import {Component, OnInit, inject} from '@angular/core';
+import {Component, inject, OnInit} from '@angular/core';
import {ActivatedRoute, Router, RouterLink} from '@angular/router';
import {SongService} from '../services/song.service';
import {distinctUntilChanged, map, switchMap} from 'rxjs/operators';
@@ -26,6 +26,7 @@ import {LegalOwnerPipe} from '../../../widget-modules/pipes/legal-owner-translat
import {StatusPipe} from '../../../widget-modules/pipes/status-translater/status.pipe';
import {ShowTypePipe} from '../../../widget-modules/pipes/show-type-translater/show-type.pipe';
import {MatTooltip} from '@angular/material/tooltip';
+import {PageFrameComponent} from '../../../widget-modules/components/sidebar/page-frame.component';
@Component({
selector: 'app-song',
@@ -50,6 +51,7 @@ import {MatTooltip} from '@angular/material/tooltip';
StatusPipe,
ShowTypePipe,
MatTooltip,
+ PageFrameComponent,
],
})
export class SongComponent implements OnInit {
@@ -84,14 +86,14 @@ export class SongComponent implements OnInit {
const song$ = this.activatedRoute.params.pipe(
map(param => param as {songId: string}),
map(param => param.songId),
- switchMap(songId => this.songService.read$(songId))
+ switchMap(songId => this.songService.read$(songId)),
);
this.song$ = song$;
this.files$ = this.activatedRoute.params.pipe(
map(param => param as {songId: string}),
map(param => param.songId),
- switchMap(songId => this.fileService.read$(songId))
+ switchMap(songId => this.fileService.read$(songId)),
);
this.songCount$ = combineLatest([this.userService.user$, song$]).pipe(
@@ -102,7 +104,7 @@ export class SongComponent implements OnInit {
return user?.songUsage?.[song.id] ?? 0;
}),
- distinctUntilChanged()
+ distinctUntilChanged(),
);
this.songUsageShows$ = combineLatest([this.userService.user$, this.showService.list$(), song$]).pipe(
@@ -115,7 +117,7 @@ export class SongComponent implements OnInit {
.filter(show => show.owner === user.id)
.filter(show => (show.songIds ?? []).includes(song.id))
.sort((a, b) => b.date.toMillis() - a.date.toMillis());
- })
+ }),
);
this.songUsageTooltip$ = combineLatest([this.songCount$, this.songUsageShows$]).pipe(
@@ -129,7 +131,7 @@ export class SongComponent implements OnInit {
}
return shows.map(show => `${this.dateFormatter.format(show.date.toDate())} - ${this.showTypePipe.transform(show.showType)}`).join('\n');
- })
+ }),
);
}
diff --git a/src/app/modules/user/info/info.component.html b/src/app/modules/user/info/info.component.html
index 6ead0f5..6196781 100644
--- a/src/app/modules/user/info/info.component.html
+++ b/src/app/modules/user/info/info.component.html
@@ -1,25 +1,30 @@
-@if (user$ | async; as user) {
-
-
- @if (getUserRoles(user.role).length === 0) {
- Es wurden noch keine Berechtigungen zugeteilt, bitte wende Dich an den Administrator!
+
+
+ @if (user$ | async; as user) {
+
+
+ @if (getUserRoles(user.role).length === 0) {
+ Es wurden noch keine Berechtigungen zugeteilt, bitte wende Dich an den Administrator!
+ }
+ {{ transdormUserRoles(user.role) }}
+
+
+ bevorzugte Anzeige der Akkorde
+
+
+ nur den Liedtext anzeigen
+ in Strophen die Akkorde nur für die erste anzeigen
+ alle anzeigen
+
+ Das ist nur die Voreinstellung, die Anzeige kann für jedes Lied geändert werden.
+
+
+ Abmelden
+
+
}
-
{{ transdormUserRoles(user.role) }}
-
-
- bevorzugte Anzeige der Akkorde
-
-
- nur den Liedtext anzeigen
- in Strophen die Akkorde nur für die erste anzeigen
- alle anzeigen
-
- Das ist nur die Voreinstellung, die Anzeige kann für jedes Lied geändert werden.
-
-
- Abmelden
-
-
-}
-
+
+
+
diff --git a/src/app/modules/user/info/info.component.ts b/src/app/modules/user/info/info.component.ts
index e16fa29..34e277b 100644
--- a/src/app/modules/user/info/info.component.ts
+++ b/src/app/modules/user/info/info.component.ts
@@ -1,4 +1,4 @@
-import {Component, OnInit, inject} from '@angular/core';
+import {Component, inject, OnInit} from '@angular/core';
import {UserService} from '../../../services/user/user.service';
import {Observable} from 'rxjs';
import {User} from '../../../services/user/user';
@@ -17,6 +17,7 @@ import {ButtonComponent} from '../../../widget-modules/components/button/button.
import {RouterLink} from '@angular/router';
import {RoleDirective} from '../../../services/user/role.directive';
import {UsersComponent} from './users/users.component';
+import {PageFrameComponent} from '../../../widget-modules/components/sidebar/page-frame.component';
@Component({
selector: 'app-info',
@@ -37,6 +38,7 @@ import {UsersComponent} from './users/users.component';
RoleDirective,
UsersComponent,
AsyncPipe,
+ PageFrameComponent,
],
})
export class InfoComponent implements OnInit {
diff --git a/src/app/widget-modules/components/application-frame/navigation/navigation.component.less b/src/app/widget-modules/components/application-frame/navigation/navigation.component.less
index 21fa589..5225736 100644
--- a/src/app/widget-modules/components/application-frame/navigation/navigation.component.less
+++ b/src/app/widget-modules/components/application-frame/navigation/navigation.component.less
@@ -21,7 +21,7 @@ nav {
&.hidden {
@media screen and (max-width: 860px) {
- top: -60px;
+ // top: -60px;
}
}
diff --git a/src/app/widget-modules/components/card/card.component.html b/src/app/widget-modules/components/card/card.component.html
index 33b48b5..a50c891 100644
--- a/src/app/widget-modules/components/card/card.component.html
+++ b/src/app/widget-modules/components/card/card.component.html
@@ -1,12 +1,14 @@
@if (closeLink && !fullscreen) {
-
-
-
- } @if (heading && !fullscreen) {
-
{{ heading }}
- } @if (subheading && !fullscreen) {
-
{{ subheading }}
+
+
+
+ }
+ @if (heading && !fullscreen) {
+
{{ heading }}
+ }
+ @if (subheading && !fullscreen) {
+
{{ subheading }}
}
diff --git a/src/app/widget-modules/components/card/card.component.less b/src/app/widget-modules/components/card/card.component.less
index 2ab243e..622dd3c 100644
--- a/src/app/widget-modules/components/card/card.component.less
+++ b/src/app/widget-modules/components/card/card.component.less
@@ -1,7 +1,7 @@
@import "../../../../styles/shadow";
.card {
- margin: 20px;
+ margin: 20px 20px 0;
border-radius: 8px;
background: var(--surface);
backdrop-filter: blur(15px);
@@ -14,10 +14,8 @@
box-shadow: var(--shadow-card-3);
@media screen and (max-width: 860px) {
- width: 100vw;
- border-radius: 0;
- background: var(--surface-strong);
- margin: 0;
+ width: calc(100vw - 10px);
+ margin: 5px;
color: var(--text);
}
diff --git a/src/app/widget-modules/components/sidebar/page-frame.component.html b/src/app/widget-modules/components/sidebar/page-frame.component.html
new file mode 100644
index 0000000..9d4e1f8
--- /dev/null
+++ b/src/app/widget-modules/components/sidebar/page-frame.component.html
@@ -0,0 +1,27 @@
+@if (withMenu() || title()) {
+
+}
+@if (!collapsed) {
+
+}
+
+
+
+
diff --git a/src/app/widget-modules/components/sidebar/sidebar.component.less b/src/app/widget-modules/components/sidebar/page-frame.component.less
similarity index 75%
rename from src/app/widget-modules/components/sidebar/sidebar.component.less
rename to src/app/widget-modules/components/sidebar/page-frame.component.less
index f47203f..93f20a6 100644
--- a/src/app/widget-modules/components/sidebar/sidebar.component.less
+++ b/src/app/widget-modules/components/sidebar/page-frame.component.less
@@ -19,20 +19,20 @@
.sidebar-toggle {
--icon-button-color: var(--primary-hover);
- --icon-button-hover-color: var(--primary-active);
+ --icon-button-hover-color: var(--primary);
position: fixed;
top: calc(50px + var(--sidebar-toggle-offset));
left: var(--sidebar-toggle-offset);
z-index: 11;
color: var(--icon-button-color);
- background: var(--surface-strong);
box-shadow: none;
border-radius: 999px;
+ transition: all 150ms ease-in-out;
}
:host.collapsed .sidebar-toggle {
- --icon-button-color: var(--text);
- --icon-button-hover-color: var(--primary-active);
+ --icon-button-color: var(--surface);
+ --icon-button-hover-color: var(--surface-subtle);
}
.sidebar-toggle fa-icon {
@@ -92,7 +92,7 @@ aside.collapsed {
.sidebar-toggle {
top: calc(50px + 8px);
- left: 12px;
+ left: 5px;
right: auto;
z-index: 13;
}
@@ -121,6 +121,32 @@ aside.collapsed {
.content {
grid-column: auto;
width: 100%;
- padding-top: calc(var(--sidebar-toggle-size) + 6px);
+ }
+}
+
+.header {
+ @media screen and (max-width: 860px) {
+ height: 50px;
+ }
+}
+
+.title {
+ color: var(--surface);
+ font-size: 30px;
+ text-transform: uppercase;
+ text-align: right;
+ opacity: 0.5;
+ text-shadow: var(--shadow-card-3);
+
+ position: fixed;
+ right: 10px;
+ top: 61px;
+
+ transition: all 150ms ease-in-out;
+
+ @media screen and (min-width: 888px) {
+ transform-origin: top right;
+ transform: rotate(90deg) translateX(100%) translateX(10px);
+ text-shadow: 10px 0 20px rgba(0, 0, 0, 0.19), 6px 0 6px rgba(0, 0, 0, 0.23);
}
}
diff --git a/src/app/widget-modules/components/sidebar/sidebar.component.spec.ts b/src/app/widget-modules/components/sidebar/page-frame.component.spec.ts
similarity index 71%
rename from src/app/widget-modules/components/sidebar/sidebar.component.spec.ts
rename to src/app/widget-modules/components/sidebar/page-frame.component.spec.ts
index 269c1ba..3a7aed0 100644
--- a/src/app/widget-modules/components/sidebar/sidebar.component.spec.ts
+++ b/src/app/widget-modules/components/sidebar/page-frame.component.spec.ts
@@ -1,17 +1,17 @@
import {ComponentFixture, TestBed} from '@angular/core/testing';
-import {SidebarComponent} from './sidebar.component';
+import {PageFrameComponent} from './page-frame.component';
describe('SidebarComponent', () => {
- let component: SidebarComponent;
- let fixture: ComponentFixture;
+ let component: PageFrameComponent;
+ let fixture: ComponentFixture;
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [SidebarComponent],
+ imports: [PageFrameComponent],
}).compileComponents();
- fixture = TestBed.createComponent(SidebarComponent);
+ fixture = TestBed.createComponent(PageFrameComponent);
component = fixture.componentInstance;
await fixture.whenStable();
});
diff --git a/src/app/widget-modules/components/sidebar/sidebar.component.ts b/src/app/widget-modules/components/sidebar/page-frame.component.ts
similarity index 64%
rename from src/app/widget-modules/components/sidebar/sidebar.component.ts
rename to src/app/widget-modules/components/sidebar/page-frame.component.ts
index 066db18..0046738 100644
--- a/src/app/widget-modules/components/sidebar/sidebar.component.ts
+++ b/src/app/widget-modules/components/sidebar/page-frame.component.ts
@@ -1,21 +1,23 @@
-import {Component} from '@angular/core';
+import {Component, input} from '@angular/core';
import {MatIconButton} from '@angular/material/button';
import {FaIconComponent} from '@fortawesome/angular-fontawesome';
import {faBars, faChevronLeft} from '@fortawesome/free-solid-svg-icons';
@Component({
- selector: 'app-sidebar',
+ selector: 'app-page-frame',
imports: [MatIconButton, FaIconComponent],
- templateUrl: './sidebar.component.html',
- styleUrl: './sidebar.component.less',
+ templateUrl: './page-frame.component.html',
+ styleUrl: './page-frame.component.less',
host: {
'[class.collapsed]': 'collapsed',
},
})
-export class SidebarComponent {
+export class PageFrameComponent {
public collapsed = true;
public openIcon = faChevronLeft;
public closedIcon = faBars;
+ public title = input.required();
+ public withMenu = input(true);
public toggle(): void {
this.collapsed = !this.collapsed;
diff --git a/src/app/widget-modules/components/sidebar/sidebar.component.html b/src/app/widget-modules/components/sidebar/sidebar.component.html
deleted file mode 100644
index 686ef94..0000000
--- a/src/app/widget-modules/components/sidebar/sidebar.component.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-@if (!collapsed) {
-
-}
-
-
-
-
diff --git a/src/styles/styles.less b/src/styles/styles.less
index aed15a6..5acc806 100644
--- a/src/styles/styles.less
+++ b/src/styles/styles.less
@@ -14,6 +14,7 @@
--text-soft: #7a858c;
--text-inverse: #f7fbff;
+ --color-primary-dark: #48686e;
--color-primary: #6f8f95;
--color-primary-light: #85a4aa;
--primary-color: #6f8f95;
@@ -41,6 +42,7 @@
--mat-dialog-supporting-text-color: var(--text);
+ --mat-button-text-label-text-color: var(--color-primary-dark)
}
html {