import { Component, computed, inject, input, OnInit, output, signal } from '@angular/core'; import { firstValueFrom } from 'rxjs'; import { DanceGroup, Dancer } from '../core/api-models'; import { SchoolApi } from '../core/school-api'; import { apiError } from '../core/api-error'; import { DialogFrame } from './dialog-frame'; @Component({ selector: 'app-group-members', imports: [DialogFrame], template: `

Koppel dansers aan deze groep. Een danser kan in meerdere groepen zitten. Wijzigingen worden direct opgeslagen.

@if (error()) { }

{{ busy() ? 'Koppeling opslaan…' : memberIds().length + ' van ' + dancers().length + ' dansers gekoppeld' }}

@for (dancer of sortedDancers(); track dancer.id) { } @empty {

Er zijn nog geen dansers. Voeg eerst een danser toe via het tabblad Dansers.

}
`, }) export class GroupMembers implements OnInit { readonly revision = input(); private originalRevision?: number; readonly schoolId = input.required(); readonly group = input.required(); readonly dancers = input.required(); readonly closed = output(); readonly changed = output(); readonly memberIds = signal([]); readonly busy = signal(false); readonly error = signal(''); readonly sortedDancers = computed(() => [...this.dancers()].sort((a, b) => a.name.localeCompare(b.name, 'nl')), ); private readonly api = inject(SchoolApi); ngOnInit(): void { this.originalRevision = this.revision(); this.memberIds.set([...this.group().dancerIds]); } async toggle(dancerId: number, event: Event): Promise { const checkbox = event.target as HTMLInputElement; const add = checkbox.checked; if (this.busy()) { checkbox.checked = this.memberIds().includes(dancerId); return; } this.busy.set(true); this.error.set(''); try { await firstValueFrom( this.api.membership(this.schoolId(), this.group().id, dancerId, add, this.originalRevision), ); if (this.originalRevision !== undefined) this.originalRevision++; this.memberIds.update((ids) => add ? [...ids, dancerId] : ids.filter((id) => id !== dancerId), ); checkbox.checked = add; this.changed.emit(this.memberIds()); } catch (error: unknown) { checkbox.checked = this.memberIds().includes(dancerId); this.error.set(apiError(error)); } finally { this.busy.set(false); } } }