setDateRange({ start, end })} />
{/* KPI Cards */}
{/* Period comparison */}
Periodjamforelse
Belaggning (nuvarande)
{occupancyPct}%
Belaggning (foregaende)
{prevOccupancyPct}%
Foregaende period
{prevPeriod.start} — {prevPeriod.end}
Belagda rum (foregaende)
{prevDaysInRange > 0
? Math.round(prevTotalOccupied / prevDaysInRange)
: 0} snitt / dag
Dagar med data (foregaende)
{prevDaysInRange} dagar
{/* Entry form */}
{formExceedsTotal && (
Belagda rum ({formOccupied}) + ur drift ({formOoo}) = {formOccupied + formOoo} overstiger totalt antal rum ({totalRooms}).
)}
{/* Calendar heatmap */}
{calendarData.length > 0 && (
Belaggningskalender
{['Man', 'Tis', 'Ons', 'Tor', 'Fre', 'Lor', 'Son'].map(d => (
{d}
))}
{/* Offset for first day of month */}
{calendarData.length > 0 && Array.from({ length: (calendarData[0].dayOfWeek + 6) % 7 }).map((_, i) => (
))}
{calendarData.map(day => (
0 ? 'text-white' : 'text-muted-foreground'
)}
title={`${day.date}: ${day.occupancyPct}%`}
>
{parseInt(day.date.slice(-2))}
))}
)}
{/* Daily data table */}
Daglig data
{entries.length === 0 ? (
Ingen data registrerad i vald period.
) : (
Datum
Belagda
Ur drift
Orsak
Lediga
Belaggning
{entries.map(e => {
const pct = totalRooms > 0 ? Math.round((e.roomsOccupied / totalRooms) * 100) : 0
const available = totalRooms - e.roomsOccupied - e.roomsOutOfOrder
return (
{e.date}
{e.roomsOccupied} / {totalRooms}
{e.roomsOutOfOrder}
{e.roomsOutOfOrder > 0 ? (e.reason ?? '-') : '-'}
{available}
{pct}%
)
})}
)}
{/* Edit entry dialog */}
{/* Confirm delete dialog */}
{/* Settings dialog */}
setNewTotalRooms(e.target.value)}
/>
)
}