96 lines
3.0 KiB
TypeScript
96 lines
3.0 KiB
TypeScript
import { computed, Injectable, signal } from '@angular/core';
|
|
import { Sitzplatz, Sitzreihe } from '@infinimotion/model-frontend';
|
|
import { TheaterLayoutDesignerComponent } from './theater-layout-designer/theater-layout-designer.component';
|
|
import { TheaterSeatState } from './model/theater-seat-state.model';
|
|
|
|
@Injectable({
|
|
providedIn: 'root',
|
|
})
|
|
export class SelectedSeatsService {
|
|
private selectedSeatsSignal = signal<Sitzplatz[]>([]);
|
|
private seatIsSelectableSignal = signal(true);
|
|
private committedSignal = signal(false);
|
|
private erroredSignal = signal(false);
|
|
private cancelledSignal = signal(false);
|
|
private debugSignal = signal(false);
|
|
private hadConflictSignal = signal(false);
|
|
|
|
readonly selectedSeats = this.selectedSeatsSignal.asReadonly();
|
|
readonly seatIsSelectable = this.seatIsSelectableSignal.asReadonly();
|
|
readonly committed = this.committedSignal.asReadonly();
|
|
readonly errored = this.erroredSignal.asReadonly();
|
|
readonly cancelled = this.cancelledSignal.asReadonly();
|
|
readonly debug = this.debugSignal.asReadonly();
|
|
readonly hadConflict = this.hadConflictSignal.asReadonly();
|
|
|
|
readonly totalSeats = computed(() => this.selectedSeats().length);
|
|
readonly totalPrice = computed(() =>
|
|
this.selectedSeats().reduce((sum, seat) => sum + seat.row.category.price, 0)
|
|
);
|
|
|
|
pushSelectedSeat(selectedSeat: Sitzplatz): void {
|
|
if (selectedSeat.id < 0) {
|
|
TheaterLayoutDesignerComponent.interceptSeatSelection(selectedSeat);
|
|
return;
|
|
}
|
|
this.selectedSeatsSignal.update((seats) => [...seats, selectedSeat]);
|
|
this.hadConflictSignal.set(false);
|
|
}
|
|
|
|
removeSelectedSeat(selectedSeat: Sitzplatz): void {
|
|
this.selectedSeatsSignal.update((seats) => seats.filter((seat) => seat.id !== selectedSeat.id));
|
|
this.hadConflictSignal.set(false);
|
|
}
|
|
|
|
getSeatsByCategory(categoryId: number): Sitzplatz[] {
|
|
return this.selectedSeats().filter((seat) => seat.row.category.id === categoryId);
|
|
}
|
|
|
|
clearSelection(): void {
|
|
this.selectedSeatsSignal.set([]);
|
|
this.committedSignal.set(false);
|
|
this.cancelledSignal.set(false);
|
|
this.erroredSignal.set(false);
|
|
this.hadConflictSignal.set(false);
|
|
}
|
|
|
|
getSeatIsSelectable(): boolean {
|
|
return this.seatIsSelectable();
|
|
}
|
|
|
|
setSeatSelectable(selectable: boolean): void {
|
|
this.seatIsSelectableSignal.set(selectable);
|
|
if (selectable) {
|
|
this.committedSignal.set(false);
|
|
this.cancelledSignal.set(false);
|
|
this.erroredSignal.set(false);
|
|
}
|
|
}
|
|
|
|
commit(): void {
|
|
this.erroredSignal.set(false);
|
|
this.committedSignal.set(true);
|
|
}
|
|
|
|
error(): void {
|
|
this.erroredSignal.set(true);
|
|
}
|
|
|
|
cancel(): void {
|
|
this.erroredSignal.set(false);
|
|
this.cancelledSignal.set(true);
|
|
}
|
|
|
|
toggleDebug(): void {
|
|
this.debugSignal.update((debug) => !debug);
|
|
}
|
|
|
|
isSeatSelected(seatId: number): boolean {
|
|
return this.selectedSeats().some((seat) => seat.id === seatId);
|
|
}
|
|
|
|
setConflict(value: boolean): void {
|
|
this.hadConflictSignal.set(value);
|
|
}
|
|
}
|