first commit

This commit is contained in:
Bastian Wagner
2026-07-31 21:02:47 +02:00
commit 6bea4f766a
512 changed files with 64459 additions and 0 deletions

View File

@@ -0,0 +1,99 @@
import { CurrencyPipe, registerLocaleData } from '@angular/common';
import localeDe from '@angular/common/locales/de';
import { Component, LOCALE_ID, computed, inject, signal } from '@angular/core';
import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
import { RouterLink } from '@angular/router';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { AuthStore } from '../../../core/auth/auth-store';
import { TeamStore } from '../../../core/team/team-store';
import { TeamsApi } from '../../../core/team/teams-api';
registerLocaleData(localeDe);
@Component({
selector: 'app-members',
imports: [
CurrencyPipe,
ReactiveFormsModule,
RouterLink,
MatButtonModule,
MatCardModule,
MatFormFieldModule,
MatIconModule,
MatInputModule,
MatSelectModule,
],
providers: [{ provide: LOCALE_ID, useValue: 'de-DE' }],
templateUrl: './members.html',
styleUrl: './members.scss',
})
export class Members {
private readonly authStore = inject(AuthStore);
private readonly formBuilder = inject(FormBuilder);
private readonly teamsApi = inject(TeamsApi);
private readonly teamStore = inject(TeamStore);
protected readonly team = this.teamStore.team;
protected readonly search = signal('');
protected readonly showInactive = signal(false);
protected readonly showCreateForm = signal(false);
protected readonly saving = signal(false);
protected readonly createForm = this.formBuilder.nonNullable.group({
firstName: ['', Validators.required],
lastName: ['', Validators.required],
teamRole: [1, Validators.required],
});
protected readonly canManage = computed(() => {
const user = this.authStore.currentUser();
if (user?.role?.id === 1) return true;
return (
this.team()?.players?.some(
(player) => player.user?.id === user?.id && (player.teamRole?.id ?? 0) >= 3,
) ?? false
);
});
protected readonly players = computed(() => {
const query = this.search().trim().toLocaleLowerCase('de');
return (this.team()?.players ?? [])
.filter((player) => this.showInactive() || player.active)
.filter((player) =>
`${player.firstName} ${player.lastName}`.toLocaleLowerCase('de').includes(query),
)
.sort((a, b) => a.lastName.localeCompare(b.lastName, 'de'));
});
protected createPlayer(): void {
const team = this.team();
if (!team || this.createForm.invalid || this.saving()) return;
this.saving.set(true);
this.teamsApi.createPlayer(team.id, this.createForm.getRawValue()).subscribe({
next: () => {
this.saving.set(false);
this.showCreateForm.set(false);
this.createForm.reset({ firstName: '', lastName: '', teamRole: 1 });
this.teamStore.refreshTeam();
},
error: () => this.saving.set(false),
});
}
protected roleName(role?: string): string {
return (
(
{
player: 'Spieler',
scnd_treasurer: '2. Kassenwart',
captain: 'Kapitän',
treasurer: 'Kassenwart',
coach: 'Trainer',
} as Record<string, string>
)[role ?? ''] ?? 'Spieler'
);
}
}