diff --git a/src/pages/BookingsPage.tsx b/src/pages/BookingsPage.tsx index 2340dd6..2620b7e 100644 --- a/src/pages/BookingsPage.tsx +++ b/src/pages/BookingsPage.tsx @@ -199,6 +199,17 @@ export function BookingsPage() { ) } + // Step-1 modal: occupied slots for selected object + date + const pickObj = rentalObjects.find(o => o.id === rentalPickObj) + const pickBookings = rentalBookings.filter( + b => b.objectId === rentalPickObj && b.date === rentalPickDate && b.status === 'confirmed', + ) + const pickOpenMin = (pickObj?.openHour ?? 8) * 60 + const pickCloseMin = (pickObj?.closeHour ?? 22) * 60 + const pickTotalMin = pickCloseMin - pickOpenMin + const pickHasFullDay = pickBookings.some(b => b.isFullDay) + const fmtPickMin = (m: number) => `${Math.floor(m / 60)}:${String(m % 60).padStart(2, '0')}` + return (
{/* Header */} @@ -506,6 +517,63 @@ export function BookingsPage() { setRentalPickDate(e.target.value)} />
+ + {/* Occupied slots preview */} + {pickObj && ( +
+

+ Занятость · {new Intl.DateTimeFormat('ru-RU', { day: 'numeric', month: 'long' }).format(new Date(rentalPickDate))} +

+ {pickHasFullDay ? ( +
+ + Весь день занят +
+ ) : pickBookings.length === 0 ? ( +
+ + Свободно весь день +
+ ) : ( +
+ {/* Timeline bar */} +
+ {pickBookings.filter(b => !b.isFullDay).map(b => { + const left = ((b.startHour - pickOpenMin) / pickTotalMin) * 100 + const width = ((b.endHour - b.startHour) / pickTotalMin) * 100 + return ( +
+ ) + })} +
+ {/* Hour labels */} +
+ {fmtPickMin(pickOpenMin)} + {fmtPickMin(Math.round((pickOpenMin + pickCloseMin) / 2))} + {fmtPickMin(pickCloseMin)} +
+ {/* Booking list */} +
+ {pickBookings.filter(b => !b.isFullDay).map(b => ( +
+ + + {fmtPickMin(b.startHour)}–{fmtPickMin(b.endHour)} + + {b.guestName} +
+ ))} +
+
+ )} +
+ )} +