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
|
// 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);
|
||||||
|
|||||||
Reference in New Issue
Block a user