From dac8b43915cb1c8ff54da0fbed553b6470721d9f Mon Sep 17 00:00:00 2001 From: James Pattinson Date: Wed, 12 Nov 2025 21:04:00 +0000 Subject: [PATCH] Event editing --- frontend/src/App.css | 9 ++ frontend/src/pages/Dashboard.tsx | 188 ++++++++++++++++++++++++++++++- 2 files changed, 195 insertions(+), 2 deletions(-) diff --git a/frontend/src/App.css b/frontend/src/App.css index 7840182..38b6a5a 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -624,4 +624,13 @@ body { .event-card { padding: 12px; } + + /* Event modal responsive */ + .modal-content[style*="600px"] { + max-width: 95% !important; + } + + .modal-content div[style*="grid-template-columns"] { + grid-template-columns: 1fr !important; + } } diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx index 150743f..094135b 100644 --- a/frontend/src/pages/Dashboard.tsx +++ b/frontend/src/pages/Dashboard.tsx @@ -26,6 +26,16 @@ const Dashboard: React.FC = () => { const [eventRSVPs, setEventRSVPs] = useState([]); const [eventRSVPCounts, setEventRSVPCounts] = useState<{[eventId: number]: {attending: number, maybe: number, not_attending: number}}>({}); const [rsvpLoading, setRsvpLoading] = useState<{[eventId: number]: boolean}>({}); + const [showEventModal, setShowEventModal] = useState(false); + const [editingEvent, setEditingEvent] = useState(null); + const [eventFormData, setEventFormData] = useState({ + title: '', + description: '', + event_date: '', + event_time: '', + location: '', + max_attendees: '' + }); useEffect(() => { if (!authService.isAuthenticated()) { @@ -324,6 +334,82 @@ const Dashboard: React.FC = () => { } }; + const handleCreateEvent = () => { + setEditingEvent(null); + setEventFormData({ + title: '', + description: '', + event_date: '', + event_time: '', + location: '', + max_attendees: '' + }); + setShowEventModal(true); + }; + + const handleEditEvent = (event: Event) => { + setEditingEvent(event); + + // Convert event_date to YYYY-MM-DD format for date input + const dateObj = new Date(event.event_date); + const formattedDate = dateObj.toISOString().split('T')[0]; + + setEventFormData({ + title: event.title, + description: event.description || '', + event_date: formattedDate, + event_time: event.event_time || '', + location: event.location || '', + max_attendees: event.max_attendees?.toString() || '' + }); + setShowEventModal(true); + }; + + const handleEventFormChange = (field: string, value: string) => { + setEventFormData(prev => ({ + ...prev, + [field]: value + })); + }; + + const handleSaveEvent = async () => { + try { + const eventData = { + title: eventFormData.title, + description: eventFormData.description || undefined, + event_date: eventFormData.event_date, + event_time: eventFormData.event_time || undefined, + location: eventFormData.location || undefined, + max_attendees: eventFormData.max_attendees ? parseInt(eventFormData.max_attendees) : undefined + }; + + if (editingEvent) { + // Update existing event + await eventService.updateEvent(editingEvent.id, eventData); + } else { + // Create new event + await eventService.createEvent(eventData); + } + + // Reload events + const eventsData = await eventService.getAllEvents(); + setAllEvents(eventsData); + await loadEventRSVPCounts(eventsData); + + // Close modal + setShowEventModal(false); + setEditingEvent(null); + } catch (error) { + console.error('Failed to save event:', error); + alert('Failed to save event. Please try again.'); + } + }; + + const handleCloseEventModal = () => { + setShowEventModal(false); + setEditingEvent(null); + }; + const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-GB', { day: 'numeric', @@ -710,7 +796,7 @@ const Dashboard: React.FC = () => {
)} + + {/* Event Create/Edit Modal */} + {showEventModal && ( +
+
+

{editingEvent ? 'Edit Event' : 'Create New Event'}

+ +
+ + handleEventFormChange('title', e.target.value)} + required + placeholder="Annual General Meeting" + /> +
+ +
+ +