From 97e99735ce027e9c4c09c52d862fc3c277e83d23 Mon Sep 17 00:00:00 2001 From: jtricerolph Date: Thu, 2 Jul 2026 14:44:35 +0000 Subject: [PATCH] Summary table: stronger day borders, weekend bg, and WP-accurate tooltips - 2px left border on Rooms th/td marks each day boundary clearly - Saturday/Sunday columns get a subtle blue-tinted background - Occupied number shows pickup-change context + prior week stats on hover - '+' pickup button shows prior week line (matching original WP plugin logic) Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/pages/Planner.tsx | 79 ++++++++++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 9 deletions(-) diff --git a/frontend/src/pages/Planner.tsx b/frontend/src/pages/Planner.tsx index 1dbab03..a4e1dee 100644 --- a/frontend/src/pages/Planner.tsx +++ b/frontend/src/pages/Planner.tsx @@ -34,6 +34,25 @@ function getDayName(date: string) { return ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'][(d.getDay() + 6) % 7] } +function fullDayName(date: string) { + const d = new Date(date + 'T00:00:00') + return ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'][d.getDay()] +} + +function isWeekend(date: string) { + const day = new Date(date + 'T00:00:00').getDay() + return day === 0 || day === 6 +} + +function priorLineFor(date: string, d: DayData): string { + const hint = d.pickup_hint ?? 0 + const lead = d.pickup_lead ?? 0 + const late = hint > 0 + ? `${hint} room${hint === 1 ? '' : 's'} picked up within ${lead} day${lead === 1 ? '' : 's'} of arrival` + : 'no late pickups' + return `Last ${fullDayName(date)}: ${d.prior_occ} occ (${d.prior_vac} vac) — ${late}` +} + function fmtDate(date: string) { return new Date(date + 'T00:00:00').toLocaleDateString('en-GB', { weekday: 'short', day: 'numeric', month: 'short', @@ -435,13 +454,26 @@ function SummaryTable({ bookings, pickup, onPickupChange }: SummaryProps) { Category - {dates.map(d => {fmtDayHeader(d)})} + {dates.map(d => ( + {fmtDayHeader(d)} + ))} {dates.map(d => ( <> - Rooms - D / S / A + Rooms + D / S / A ))} @@ -485,12 +517,28 @@ function CatRows({ cat, dates, pickup, onPickupChange, isLast }: { const prevPu = prevDate ? getDisplayPickup(pickup, cat.id, prevDate, prevOcc, cat.total_rooms) : 0 const dNew = d.delta_new || 0 const dCanc = d.delta_cancelled || 0 + const wknd = isWeekend(date) + const saved = pickup[cat.id]?.[date] + const priorLine = priorLineFor(date, d) + let occTooltip = '' + if (saved && saved.count) { + const savedBooked = saved.total - saved.count + const changeDesc = occupied > savedBooked ? 'changed' : 'unchanged' + const pickupDesc = occupied > savedBooked ? 'decreased' : 'remains' + occTooltip = `+${saved.count} pickup set when booked was ${savedBooked} (target ${saved.total}). Booked ${changeDesc}, so pickup ${pickupDesc}.` + } + occTooltip = (occTooltip ? occTooltip + ' | ' : '') + priorLine return ( <> {/* Left cell: Rooms / vac / pickup controls */} - -
+ +
{occupied}{pu > 0 && +{pu}}
@@ -500,12 +548,16 @@ function CatRows({ cat, dates, pickup, onPickupChange, isLast }: { {pu}
{/* Right cell: D / S / A */} - + {(dNew > 0 || dCanc > 0) && (
{dNew > 0 && ▲{dNew}} @@ -553,9 +605,14 @@ function TotalRows({ dates, cats, pickup }: { dNew += d.delta_new || 0 dCanc += d.delta_cancelled || 0 } + const wknd = isWeekend(date) return ( <> - +
{occupied}{pu > 0 && +{pu}}
@@ -563,7 +620,11 @@ function TotalRows({ dates, cats, pickup }: { {vacant} vac{pu > 0 && ({vacant - pu})}
- + {(dNew > 0 || dCanc > 0) && (
{dNew > 0 && ▲{dNew}}