diff --git a/src/components/dashboard/Officer_EventManagement.astro b/src/components/dashboard/Officer_EventManagement.astro index 69e9a48..b421f2a 100644 --- a/src/components/dashboard/Officer_EventManagement.astro +++ b/src/components/dashboard/Officer_EventManagement.astro @@ -147,6 +147,46 @@ declare global {
+ +
+
+
+
+ + + +
+ +
+
+
+
+
+ Per Page +
+ +
+
+
+
@@ -423,10 +463,40 @@ declare global { let currentPage = 1; let totalPages = 0; + let searchQuery = ""; + let perPage = 5; // Store temporary files let tempFiles: File[] = []; + // Add event listeners for filters + const searchInput = document.getElementById( + "searchInput", + ) as HTMLInputElement; + const perPageSelect = document.getElementById( + "perPageSelect", + ) as HTMLSelectElement; + + if (searchInput) { + let debounceTimeout: NodeJS.Timeout; + searchInput.addEventListener("input", () => { + clearTimeout(debounceTimeout); + debounceTimeout = setTimeout(() => { + searchQuery = searchInput.value; + currentPage = 1; // Reset to first page when searching + fetchEvents(); + }, 300); // Debounce for 300ms + }); + } + + if (perPageSelect) { + perPageSelect.addEventListener("change", () => { + perPage = parseInt(perPageSelect.value); + currentPage = 1; // Reset to first page when changing items per page + fetchEvents(); + }); + } + // Make openEditModal available globally window.openEditModal = function (event?: any) { // Convert event times to local time if event exists @@ -923,7 +993,7 @@ declare global { // Handle tab switching tabs.forEach((tab) => { - tab.addEventListener("click", () => { + tab.addEventListener("click", async () => { tabs.forEach((t) => t.classList.remove("tab-active")); tab.classList.add("tab-active"); @@ -932,10 +1002,83 @@ declare global { filesContent.classList.remove("hidden"); attendeesContent.classList.add("hidden"); filePreviewSection.classList.add("hidden"); - } else { + } else if (tabName === "attendees") { filesContent.classList.add("hidden"); attendeesContent.classList.remove("hidden"); filePreviewSection.classList.add("hidden"); + + // Show loading state + attendeesContent.innerHTML = ` +
+ +

Loading attendees...

+
+ `; + + try { + // Check if event has attendees + if (!localEvent.attendees || localEvent.attendees.length === 0) { + attendeesContent.innerHTML = ` +
+ + + +

No attendees for this event

+
+ `; + return; + } + + // Fetch user details for each attendee + const pb = auth.getPocketBase(); + const attendeePromises = localEvent.attendees.map( + (userId: string) => pb.collection("users").getOne(userId), + ); + const attendees = await Promise.all(attendeePromises); + + // Display attendees in a table + attendeesContent.innerHTML = ` +
+ + + + + + + + + + + ${attendees + .map( + (user) => ` + + + + + + + `, + ) + .join("")} + +
NameEmailMajorYear
${user.name || "N/A"}${user.email || "N/A"}${user.major || "N/A"}${user.year || "N/A"}
+
+ Total Attendees: ${attendees.length} +
+
+ `; + } catch (error) { + console.error("Failed to fetch attendees:", error); + attendeesContent.innerHTML = ` +
+ + + + Failed to load attendees. Please try again. +
+ `; + } } }); }); @@ -1005,16 +1148,6 @@ declare global { `; } - // TODO: Implement attendees list in the future - attendeesContent.innerHTML = ` -
- - - -

Attendees list coming soon

-
- `; - modal.showModal(); }; @@ -1072,11 +1205,17 @@ declare global { auth.setUpdating(true); try { + // Build filter string + let filter = ""; + if (searchQuery) { + filter = `event_name ~ "${searchQuery}" || event_code ~ "${searchQuery}" || location ~ "${searchQuery}"`; + } + const response = await get.getList( "events", currentPage, - 5, - "", + perPage, + filter, "-start_date", { disableAutoCancellation: true }, );