fix: pintar reservas que cruzan el borde del mes visible

findIndex devolvía -1 si start_date o end_date caían fuera del rango
visible, descartando la reserva entera. Ahora se clampa al rango del
calendario conservando la clasificación single/multi-día por las fechas
reales.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-13 16:40:55 +01:00
parent 4ce80b8fc0
commit 5656ad13ad

View File

@@ -223,13 +223,21 @@ export function CalendarGrid({
// misma celda, esa celda concreta se divide en N franjas horizontales (sin afectar // misma celda, esa celda concreta se divide en N franjas horizontales (sin afectar
// al resto de la fila). Las reservas multi-día se siguen renderizando como bandas // al resto de la fila). Las reservas multi-día se siguen renderizando como bandas
// que abarcan varios días a altura completa. // que abarcan varios días a altura completa.
type ResRange = { res: Reservation; startIdx: number; endIdx: number }; type ResRange = { res: Reservation; startIdx: number; endIdx: number; isSingleDay: boolean };
const calFirst = calendarDays[0];
const calLast = calendarDays[calendarDays.length - 1];
const resRanges: ResRange[] = reservations const resRanges: ResRange[] = reservations
.map(res => { .map(res => {
const startIdx = calendarDays.findIndex(day => isSameDay(day, parseISO(res.start_date))); const s = parseISO(res.start_date);
const endIdx = calendarDays.findIndex(day => isSameDay(day, parseISO(res.end_date))); const e = parseISO(res.end_date);
// Descartar reservas totalmente fuera de la vista
if (e < calFirst || s > calLast) return null;
const clampedStart = s < calFirst ? calFirst : s;
const clampedEnd = e > calLast ? calLast : e;
const startIdx = calendarDays.findIndex(day => isSameDay(day, clampedStart));
const endIdx = calendarDays.findIndex(day => isSameDay(day, clampedEnd));
if (startIdx === -1 || endIdx === -1) return null; if (startIdx === -1 || endIdx === -1) return null;
return { res, startIdx, endIdx }; return { res, startIdx, endIdx, isSingleDay: isSameDay(s, e) };
}) })
.filter((x): x is ResRange => x !== null); .filter((x): x is ResRange => x !== null);
@@ -237,7 +245,7 @@ export function CalendarGrid({
const singleDayByCell = new Map<number, Reservation[]>(); const singleDayByCell = new Map<number, Reservation[]>();
const multiDayRanges: ResRange[] = []; const multiDayRanges: ResRange[] = [];
for (const r of resRanges) { for (const r of resRanges) {
if (r.startIdx === r.endIdx) { if (r.isSingleDay) {
const arr = singleDayByCell.get(r.startIdx) ?? []; const arr = singleDayByCell.get(r.startIdx) ?? [];
arr.push(r.res); arr.push(r.res);
singleDayByCell.set(r.startIdx, arr); singleDayByCell.set(r.startIdx, arr);