diff --git a/frontend/src/pages/Planner.tsx b/frontend/src/pages/Planner.tsx index 47b2168..1dbab03 100644 --- a/frontend/src/pages/Planner.tsx +++ b/frontend/src/pages/Planner.tsx @@ -439,10 +439,10 @@ function SummaryTable({ bookings, pickup, onPickupChange }: SummaryProps) { {dates.map(d => ( - - Occ - D / S / A - + <> + Rooms + D / S / A + ))} @@ -471,65 +471,61 @@ function CatRows({ cat, dates, pickup, onPickupChange, isLast }: { onPickupChange: (date: string, delta: number) => void isLast: boolean }) { + const bbStyle = isLast ? '2px solid var(--card-border)' : undefined return ( - <> - {/* Row 1: Occ + Departs */} - - - {cat.name} - - {dates.map((date, di) => { - const d = cat.days[date] - const occupied = d.stays + d.arrivals - const vacant = Math.max(0, cat.total_rooms - occupied) - const pu = getDisplayPickup(pickup, cat.id, date, occupied, cat.total_rooms) - const prevDate = dates[di - 1] - const prevOcc = prevDate ? (cat.days[prevDate].stays + cat.days[prevDate].arrivals) : 0 - 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 + + {cat.name} + {dates.map((date, di) => { + const d = cat.days[date] + const occupied = d.stays + d.arrivals + const vacant = Math.max(0, cat.total_rooms - occupied) + const pu = getDisplayPickup(pickup, cat.id, date, occupied, cat.total_rooms) + const prevDate = dates[di - 1] + const prevOcc = prevDate ? (cat.days[prevDate].stays + cat.days[prevDate].arrivals) : 0 + 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 - return ( - - {(dNew > 0 || dCanc > 0) && ( -
- {dNew > 0 && ▲{dNew}} - {dCanc > 0 && ▼{dCanc}} -
- )} -
- {occupied} - {pu > 0 && +{pu}} + return ( + <> + {/* Left cell: Rooms / vac / pickup controls */} + +
+ {occupied}{pu > 0 && +{pu}}
-
+
{vacant} vac{pu > 0 && ({vacant - pu})}
- + {pu}
- {/* D/S/A breakdown: sits to the right via colSpan trick — shown as sub-rows via CSS */} -
- {d.departs}d{prevPu > 0 && +{prevPu}} - {' / '} - {d.stays}s - {' / '} - {d.arrivals}a{pu > 0 && +{pu}} + + {/* Right cell: D / S / A */} + + {(dNew > 0 || dCanc > 0) && ( +
+ {dNew > 0 && ▲{dNew}} + {dCanc > 0 && ▼{dCanc}} +
+ )} +
+ {d.departs}d{prevPu > 0 && +{prevPu}} +
+
+ {d.stays}s +
+
+ {d.arrivals}a{pu > 0 && +{pu}}
- ) - })} - - {/* Rows 2 & 3 are consumed by rowSpan — needed for tbody structure */} - - - + + ) + })} + ) } @@ -558,27 +554,31 @@ function TotalRows({ dates, cats, pickup }: { dCanc += d.delta_cancelled || 0 } return ( - - {(dNew > 0 || dCanc > 0) && ( -
- {dNew > 0 && ▲{dNew}} - {dCanc > 0 && ▼{dCanc}} + <> + +
+ {occupied}{pu > 0 && +{pu}}
- )} -
- {occupied}{pu > 0 && +{pu}} -
-
- {vacant} vac{pu > 0 && ({vacant - pu})} -
-
- {departs}d{prevPu > 0 && +{prevPu}} - {' / '} - {stays}s - {' / '} - {arrivals}a{pu > 0 && +{pu}} -
- +
+ {vacant} vac{pu > 0 && ({vacant - pu})} +
+ + + {(dNew > 0 || dCanc > 0) && ( +
+ {dNew > 0 && ▲{dNew}} + {dCanc > 0 && ▼{dCanc}} +
+ )} +
+ {departs}d{prevPu > 0 && +{prevPu}} +
+
{stays}s
+
+ {arrivals}a{pu > 0 && +{pu}} +
+ + ) })}