fix: enhance calendar event creation with double-click support and modal date handling
This commit is contained in:
@@ -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)}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user