feat: show transport bookings in day plan timeline — closes #37

Transport reservations (flights, trains, buses, cars, cruises) now appear
directly in the day plan timeline based on their reservation date/time.

- Transport cards display inline with places and notes, sorted by time
- Click to open detail modal with all booking data and linked files
- Persistent positioning via new day_plan_position field on reservations
- Free drag & drop: places can be moved between/around transport entries
- Arrow reorder works on the full visual list including transports
- Timed places show confirmation popup when reorder breaks chronology
- Custom delete confirmation popup for reservations
- DB migration adds day_plan_position column to reservations table
- New batch endpoint PUT /reservations/positions for position updates
- i18n keys added for DE and EN
This commit is contained in:
Maurice
2026-03-30 10:15:27 +02:00
parent b6f9664ec2
commit 3074724f2f
9 changed files with 721 additions and 61 deletions

View File

@@ -118,15 +118,22 @@ export interface Reservation {
trip_id: number
name: string
title?: string
type: string | null
type: string
status: 'pending' | 'confirmed'
date: string | null
time: string | null
reservation_time?: string | null
reservation_end_time?: string | null
location?: string | null
confirmation_number: string | null
notes: string | null
url: string | null
day_id?: number | null
place_id?: number | null
assignment_id?: number | null
accommodation_id?: number | null
metadata?: Record<string, string> | null
day_plan_position?: number | null
metadata?: Record<string, string> | string | null
created_at: string
}
@@ -148,6 +155,7 @@ export interface TripFile {
deleted_at?: string | null
created_at: string
reservation_title?: string
linked_reservation_ids?: number[]
url?: string
}
@@ -361,7 +369,7 @@ export function getApiErrorMessage(err: unknown, fallback: string): string {
// MergedItem used in day notes hook
export interface MergedItem {
type: 'assignment' | 'note'
type: 'assignment' | 'note' | 'place' | 'transport'
sortKey: number
data: Assignment | DayNote
data: Assignment | DayNote | Reservation
}