Skip to content

Commit eccb69f

Browse files
committed
feat: Modify event stacking logic
1 parent 357033c commit eccb69f

File tree

1 file changed

+42
-11
lines changed

1 file changed

+42
-11
lines changed

src/option/calendar.tsx

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -191,21 +191,52 @@ export function Calendar() {
191191
}, []);
192192

193193
const renderEvents = (day: Date, isCurrent: boolean) => {
194+
const weekStart = startOfWeek(day, { weekStartsOn: 0 });
195+
const weekEnd = addDays(weekStart, 6);
196+
197+
const weekEvents = eventsWithRow.filter((event) => event.end >= weekStart && event.start <= weekEnd);
198+
199+
const weekStack: { [eventId: string]: number } = {};
200+
weekEvents
201+
.sort((a, b) => a.start.getTime() - b.start.getTime())
202+
.forEach((event) => {
203+
let row = 0;
204+
while (
205+
Object.entries(weekStack).some(([id, assignedRow]) => {
206+
if (id === event.id) return false;
207+
const assignedEvent = weekEvents.find((e) => e.id === id);
208+
if (!assignedEvent) return false;
209+
const eventStartInWeek = event.start < weekStart ? weekStart : event.start;
210+
const eventEndInWeek = event.end > weekEnd ? weekEnd : event.end;
211+
const assignedStartInWeek = assignedEvent.start < weekStart ? weekStart : assignedEvent.start;
212+
const assignedEndInWeek = assignedEvent.end > weekEnd ? weekEnd : assignedEvent.end;
213+
return (
214+
assignedRow === row && eventStartInWeek <= assignedEndInWeek && assignedStartInWeek <= eventEndInWeek
215+
);
216+
})
217+
) {
218+
row++;
219+
}
220+
weekStack[event.id] = row;
221+
});
222+
194223
const typeFilterValues = typeFilters.map((f) => f.value);
195224
const selectedTypeFilters = selectedFilters.filter((f) => typeFilterValues.includes(f));
196225
const selectedTitleFilters = selectedFilters.filter((f) => !typeFilterValues.includes(f));
197226

198-
const eventsOfTheDay = eventsWithRow.filter((event) => {
199-
if (!isInEventRange(day, event)) return false;
200-
if (selectedTypeFilters.length > 0 && selectedTitleFilters.length > 0) {
201-
return selectedTypeFilters.includes(event.type) && selectedTitleFilters.includes(event.title);
202-
} else if (selectedTypeFilters.length > 0) {
203-
return selectedTypeFilters.includes(event.type);
204-
} else if (selectedTitleFilters.length > 0) {
205-
return selectedTitleFilters.includes(event.title);
206-
}
207-
return true;
208-
});
227+
const eventsOfTheDay = eventsWithRow
228+
.filter((event) => {
229+
if (!isInEventRange(day, event)) return false;
230+
if (selectedTypeFilters.length > 0 && selectedTitleFilters.length > 0) {
231+
return selectedTypeFilters.includes(event.type) && selectedTitleFilters.includes(event.title);
232+
} else if (selectedTypeFilters.length > 0) {
233+
return selectedTypeFilters.includes(event.type);
234+
} else if (selectedTitleFilters.length > 0) {
235+
return selectedTitleFilters.includes(event.title);
236+
}
237+
return true;
238+
})
239+
.map((event) => ({ ...event, row: weekStack[event.id] ?? 0 }));
209240

210241
const maxRow = eventsOfTheDay.length > 0 ? Math.max(...eventsOfTheDay.map((e) => e.row)) : -1;
211242
const numRows = maxRow + 1;

0 commit comments

Comments
 (0)