feat: cockpit

This commit is contained in:
OpenSquared
2026-07-26 17:22:59 +02:00
parent 67793608e4
commit a08e8e1b11
2 changed files with 47 additions and 5 deletions

View File

@@ -275,7 +275,7 @@ export default function Dashboard() {
return groups
}
const { todayEvents, restOfWeekGrouped, nextWeekGrouped } = useMemo(() => {
const { todayEvents, restOfWeekGrouped, nextWeekGrouped, lastPastDayGrouped, isCurrentWeekEmpty } = useMemo(() => {
const all: any[] = (ecoCalendarData as any)?.events ?? []
const events = all.filter((ev: any) => ecoImpactFilter.has(ev.impact) && ecoCurrencyFilter.has(ev.currency))
const now = new Date()
@@ -295,7 +295,23 @@ export default function Dashboard() {
const restOfWeek = events.filter((ev: any) => ev.event_date > todayISO && ev.event_date <= weekEndISO)
const nextWeek = events.filter((ev: any) => ev.event_date > weekEndISO && ev.event_date <= nextWeekEndISO)
return { todayEvents: today, restOfWeekGrouped: groupByDate(restOfWeek), nextWeekGrouped: groupByDate(nextWeek) }
// Weekend / dead-week fallback: nothing today and nothing left this week (e.g. Sunday,
// when weekEndISO collapses to todayISO so restOfWeek is structurally always empty) —
// surface the most recent past day that actually had results instead of a blank card.
const currentWeekEmpty = today.length === 0 && restOfWeek.length === 0
let lastPastDay: any[] = []
if (currentWeekEmpty) {
const past = events
.filter((ev: any) => ev.event_date < todayISO)
.sort((a: any, b: any) => b.event_date.localeCompare(a.event_date))
const mostRecentDate = past[0]?.event_date
if (mostRecentDate) lastPastDay = past.filter((ev: any) => ev.event_date === mostRecentDate)
}
return {
todayEvents: today, restOfWeekGrouped: groupByDate(restOfWeek), nextWeekGrouped: groupByDate(nextWeek),
lastPastDayGrouped: groupByDate(lastPastDay), isCurrentWeekEmpty: currentWeekEmpty,
}
}, [ecoCalendarData, ecoImpactFilter, ecoCurrencyFilter])
return (
@@ -660,7 +676,9 @@ export default function Dashboard() {
+Next week
</button>
</div>
{(todayEvents.length > 0 || restOfWeekGrouped.length > 0 || (ecoShowNextWeek && nextWeekGrouped.length > 0)) ? (
{(todayEvents.length > 0 || restOfWeekGrouped.length > 0
|| (ecoShowNextWeek && nextWeekGrouped.length > 0)
|| (isCurrentWeekEmpty && (lastPastDayGrouped.length > 0 || nextWeekGrouped.length > 0))) ? (
<div className="mt-2 space-y-2 overflow-y-auto flex-1 min-h-0">
{todayEvents.length > 0 && (
<div>
@@ -682,7 +700,21 @@ export default function Dashboard() {
</div>
</div>
))}
{ecoShowNextWeek && nextWeekGrouped.length > 0 && (
{/* Weekend fallback: nothing today/this week left — show the last day that
actually had results (e.g. Friday, on a Sunday) instead of a blank card. */}
{isCurrentWeekEmpty && lastPastDayGrouped.length > 0 && (
<>
<div className="text-[8px] text-slate-600 uppercase tracking-wide pt-1 border-t border-slate-700/30">
Derniers résultats ({formatDateShort(lastPastDayGrouped[0].date)})
</div>
{lastPastDayGrouped.map(group => (
<div key={group.date} className="space-y-1 pl-0.5">
{group.events.map((ev: any, i: number) => <EcoEventRow key={i} ev={ev} showActual />)}
</div>
))}
</>
)}
{(ecoShowNextWeek || isCurrentWeekEmpty) && nextWeekGrouped.length > 0 && (
<>
<div className="text-[8px] text-slate-600 uppercase tracking-wide pt-1 border-t border-slate-700/30">Next week</div>
{nextWeekGrouped.map(group => (