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:
@@ -223,13 +223,21 @@ export function CalendarGrid({
|
||||
// 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
|
||||
// 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
|
||||
.map(res => {
|
||||
const startIdx = calendarDays.findIndex(day => isSameDay(day, parseISO(res.start_date)));
|
||||
const endIdx = calendarDays.findIndex(day => isSameDay(day, parseISO(res.end_date)));
|
||||
const s = parseISO(res.start_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;
|
||||
return { res, startIdx, endIdx };
|
||||
return { res, startIdx, endIdx, isSingleDay: isSameDay(s, e) };
|
||||
})
|
||||
.filter((x): x is ResRange => x !== null);
|
||||
|
||||
@@ -237,7 +245,7 @@ export function CalendarGrid({
|
||||
const singleDayByCell = new Map<number, Reservation[]>();
|
||||
const multiDayRanges: ResRange[] = [];
|
||||
for (const r of resRanges) {
|
||||
if (r.startIdx === r.endIdx) {
|
||||
if (r.isSingleDay) {
|
||||
const arr = singleDayByCell.get(r.startIdx) ?? [];
|
||||
arr.push(r.res);
|
||||
singleDayByCell.set(r.startIdx, arr);
|
||||
|
||||
Reference in New Issue
Block a user