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}}
+
+ |
+ >
)
})}