feat: show next tour start in ticket search

This commit is contained in:
Marcel Arndt 2025-06-12 17:13:15 +02:00
parent b4854dff0f
commit 068fa9519c
1 changed files with 60 additions and 45 deletions

View File

@ -17,54 +17,51 @@ import {
} from '../../../core/data-access/graphql/generated/generated'; } from '../../../core/data-access/graphql/generated/generated';
import { TicketViewComponent } from '../ticket-view/ticket-view.component'; import { TicketViewComponent } from '../ticket-view/ticket-view.component';
import { TicketsService } from '../tickets.service'; import { TicketsService } from '../tickets.service';
import { format, isAfter } from 'date-fns';
@Component({ @Component({
template: `<div class="flex flex-col items-center justify-start p-4"> template: `<div class="flex flex-col items-center justify-start p-4">
<div class="text-lg font-bold pb-2">Ticket suchen</div> <div class="text-lg font-bold pb-2">Ticket suchen</div>
<hr /> <hr />
<mat-form-field class="w-full"> <mat-form-field class="w-full">
<mat-label>Einsatznummer oder Patient</mat-label> <mat-label>Einsatznummer oder Patient</mat-label>
<input class="w-full" matInput [formControl]="searchCtrl" name="search" /> <input class="w-full" matInput [formControl]="searchCtrl" name="search" />
</mat-form-field> </mat-form-field>
<hr /> <hr />
<div class="w-full"> <div class="w-full">
@for (ticket of tickets$ | async; track ticket) { @for (ticket of tickets$ | async; track ticket) {
<div <div
class="flex flex-col justify-between items-center py-2 border-b border-gray-200 cursor-pointer" class="flex flex-col justify-between items-center py-2 border-b border-gray-200 cursor-pointer"
(click)="showTicketView(ticket)" (click)="showTicketView(ticket)"
> >
<div class="w-full"> <div class="w-full flex justify-between">
{{ ticket.tours.at(0)?.ordinanceType }} <span>
@if (ticket.tours.at(0)?.category) { {{ ticket.tours.at(0)?.ordinanceType }}
<span @if (ticket.tours.at(0)?.category) {
class="text-sm text-gray-600" <span class="text-sm text-gray-600">
> ({{ ticket.tours.at(0)?.category }})
({{ ticket.tours.at(0)?.category }}) </span>
</span> }
} </span>
</div> <!-- <span class="text-sm text-gray-600">{{ getNextStart(ticket.tours) }}</span> -->
<div class="w-full flex justify-between"> </div>
<span> <div class="w-full flex justify-between">
{{ ticket.tours.at(0)?.patientName }} <span>
{{ ticket.tours.at(0)?.patientSurname }} {{ ticket.tours.at(0)?.patientName }}
</span> {{ ticket.tours.at(0)?.patientSurname }}
<span> </span>
{{ ticket.tours.length }} Tour{{ <span>
ticket.tours.length > 1 ? 'en' : '' {{ getToursLength(ticket) }} Tour{{
}} getToursLength(ticket) > 1 ? 'en' : ''
</span> }}
</div> </span>
</div> </div>
}
</div> </div>
</div>`, }
imports: [ </div>
MatFormFieldModule, </div>`,
MatInputModule, imports: [MatFormFieldModule, MatInputModule, ReactiveFormsModule, AsyncPipe],
ReactiveFormsModule, changeDetection: ChangeDetectionStrategy.OnPush,
AsyncPipe
],
changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class TicketsSearchDialogComponent { export class TicketsSearchDialogComponent {
private ticketsService = inject(TicketsService); private ticketsService = inject(TicketsService);
@ -89,4 +86,22 @@ export class TicketsSearchDialogComponent {
.pipe(tap((result) => result && this.showTicketView(result))) .pipe(tap((result) => result && this.showTicketView(result)))
.subscribe(); .subscribe();
} }
getToursLength(ticket: unknown) {
return (ticket as Ticket & { tours: Tour[] }).tours.filter(
({ check }) => check === 0
).length;
}
getNextStart(tours: Partial<Tour>[]) {
const sortedStartDates = [...tours.map(({startDate}) => new Date(startDate))].sort((a, b) => a.getTime() - b.getTime())
for(let i = 0; i < sortedStartDates.length; i++) {
const currentDate = sortedStartDates.at(i)
if(currentDate && isAfter(currentDate, new Date())) {
return format(currentDate, 'HH:mm | dd.MM.yy')
}
}
const latestDate = sortedStartDates.at(-1);
return latestDate ? format(latestDate, 'HH:mm | dd.MM.yy') : 'No Tours'
}
} }