@@ -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 = `
+
+
+
+
+ Name |
+ Email |
+ Major |
+ Year |
+
+
+
+ ${attendees
+ .map(
+ (user) => `
+
+ ${user.name || "N/A"} |
+ ${user.email || "N/A"} |
+ ${user.major || "N/A"} |
+ ${user.year || "N/A"} |
+
+ `,
+ )
+ .join("")}
+
+
+
+ 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 },
);