fix: enhance calendar event creation with double-click support and modal date handling

This commit is contained in:
Linus Rath
2026-03-18 18:13:33 +01:00
parent ef562bcaad
commit 6457b27125
3 changed files with 15 additions and 6 deletions
+8 -3
View File
@@ -236,10 +236,12 @@ export default function CalendarPage() {
const openCreateModal = useCallback((date?: Date, endDate?: Date) => { const openCreateModal = useCallback((date?: Date, endDate?: Date) => {
setEditEvent(null); setEditEvent(null);
setDefaultModalDate(date || selectedDate); const d = date || selectedDate;
setDefaultModalDate(d);
setDefaultModalEndDate(endDate); setDefaultModalEndDate(endDate);
setSelectedDate(d);
setShowEventModal(true); setShowEventModal(true);
}, [selectedDate]); }, [selectedDate, setSelectedDate]);
const openEditModal = useCallback((event: CalendarEvent) => { const openEditModal = useCallback((event: CalendarEvent) => {
setEditEvent(event); setEditEvent(event);
@@ -638,6 +640,7 @@ export default function CalendarPage() {
onSelectEvent={handleSelectEvent} onSelectEvent={handleSelectEvent}
onHoverEvent={handleHoverEvent} onHoverEvent={handleHoverEvent}
onHoverLeave={handleHoverLeave} onHoverLeave={handleHoverLeave}
onCreateAtTime={openCreateModal}
firstDayOfWeek={firstDayOfWeek} firstDayOfWeek={firstDayOfWeek}
isMobile={isMobile} isMobile={isMobile}
/> />
@@ -690,7 +693,7 @@ export default function CalendarPage() {
return ( return (
<div className="relative flex-1 flex flex-col overflow-hidden"> <div className="relative flex-1 flex flex-col overflow-hidden">
{viewContent} {viewContent}
{isLoadingEvents && calendars.length > 0 && ( {isLoadingEvents && calendars.length > 0 && events.length === 0 && (
<div className="absolute inset-0 bg-background/50 flex items-center justify-center pointer-events-none"> <div className="absolute inset-0 bg-background/50 flex items-center justify-center pointer-events-none">
<div className="h-5 w-5 border-2 border-primary border-t-transparent rounded-full animate-spin" /> <div className="h-5 w-5 border-2 border-primary border-t-transparent rounded-full animate-spin" />
</div> </div>
@@ -791,6 +794,7 @@ export default function CalendarPage() {
{!isMobile && showEventModal && ( {!isMobile && showEventModal && (
<div className="w-[400px] border-l border-border flex-shrink-0 overflow-hidden"> <div className="w-[400px] border-l border-border flex-shrink-0 overflow-hidden">
<EventModal <EventModal
key={editEvent?.id ?? 'new'}
event={editEvent} event={editEvent}
calendars={calendars} calendars={calendars}
defaultDate={defaultModalDate} defaultDate={defaultModalDate}
@@ -852,6 +856,7 @@ export default function CalendarPage() {
{showEventModal && isMobile && ( {showEventModal && isMobile && (
<EventModal <EventModal
key={editEvent?.id ?? 'new'}
event={editEvent} event={editEvent}
calendars={calendars} calendars={calendars}
defaultDate={defaultModalDate} defaultDate={defaultModalDate}
@@ -22,6 +22,7 @@ interface CalendarMonthViewProps {
onSelectEvent: (event: CalendarEvent, anchorRect: DOMRect) => void; onSelectEvent: (event: CalendarEvent, anchorRect: DOMRect) => void;
onHoverEvent?: (event: CalendarEvent, anchorRect: DOMRect) => void; onHoverEvent?: (event: CalendarEvent, anchorRect: DOMRect) => void;
onHoverLeave?: () => void; onHoverLeave?: () => void;
onCreateAtTime?: (date: Date) => void;
firstDayOfWeek?: number; firstDayOfWeek?: number;
isMobile?: boolean; isMobile?: boolean;
} }
@@ -34,6 +35,7 @@ export function CalendarMonthView({
onSelectEvent, onSelectEvent,
onHoverEvent, onHoverEvent,
onHoverLeave, onHoverLeave,
onCreateAtTime,
firstDayOfWeek = 1, firstDayOfWeek = 1,
isMobile, isMobile,
}: CalendarMonthViewProps) { }: CalendarMonthViewProps) {
@@ -165,6 +167,7 @@ export function CalendarMonthView({
aria-selected={selected} aria-selected={selected}
aria-label={fullDateLabel} aria-label={fullDateLabel}
onClick={() => onSelectDate(day)} onClick={() => onSelectDate(day)}
onDoubleClick={() => onCreateAtTime?.(day)}
onDragOver={(e) => handleCellDragOver(e, key)} onDragOver={(e) => handleCellDragOver(e, key)}
onDragLeave={handleCellDragLeave} onDragLeave={handleCellDragLeave}
onDrop={(e) => handleCellDrop(e, day)} onDrop={(e) => handleCellDrop(e, day)}
+4 -3
View File
@@ -239,9 +239,10 @@ export function useTimeGridInteractions({
clearTimeout(clickTimerRef.current); clearTimeout(clickTimerRef.current);
clickTimerRef.current = null; clickTimerRef.current = null;
} }
const key = format(day, "yyyy-MM-dd"); const d = new Date(day);
setQuickCreate({ dayKey: key, day, hour, top: hour * hourHeight }); d.setHours(hour, 0, 0, 0);
}, [hourHeight]); onCreateRange(d);
}, [onCreateRange]);
const handleQuickCreateSubmit = useCallback(async (title: string) => { const handleQuickCreateSubmit = useCallback(async (title: string) => {
if (!quickCreate) return; if (!quickCreate) return;