@@ -10,8 +10,9 @@ document.addEventListener("DOMContentLoaded", () => {
1010 const response = await fetch ( "/activities" ) ;
1111 const activities = await response . json ( ) ;
1212
13- // Clear loading message
13+ // Clear loading message and reset dropdown
1414 activitiesList . innerHTML = "" ;
15+ activitySelect . innerHTML = '<option value="">-- Select an activity --</option>' ;
1516
1617 // Populate activities list
1718 Object . entries ( activities ) . forEach ( ( [ name , details ] ) => {
@@ -20,15 +21,74 @@ document.addEventListener("DOMContentLoaded", () => {
2021
2122 const spotsLeft = details . max_participants - details . participants . length ;
2223
24+ // Generate participants list
25+ let participantsList = '' ;
26+ if ( details . participants . length > 0 ) {
27+ participantsList = `
28+ <h5>Participants:</h5>
29+ <ul class="participants-list">
30+ ${ details . participants . map ( email => `
31+ <li>
32+ <span>${ email } </span>
33+ <button
34+ type="button"
35+ class="delete-participant"
36+ data-activity="${ name } "
37+ data-email="${ email } "
38+ aria-label="Remove ${ email } ">
39+ ×
40+ </button>
41+ </li>
42+ ` ) . join ( '' ) }
43+ </ul>
44+ ` ;
45+ }
46+
2347 activityCard . innerHTML = `
2448 <h4>${ name } </h4>
2549 <p>${ details . description } </p>
2650 <p><strong>Schedule:</strong> ${ details . schedule } </p>
2751 <p><strong>Availability:</strong> ${ spotsLeft } spots left</p>
52+ ${ participantsList }
2853 ` ;
2954
3055 activitiesList . appendChild ( activityCard ) ;
3156
57+ activityCard . addEventListener ( "click" , async ( event ) => {
58+ const button = event . target . closest ( ".delete-participant" ) ;
59+ if ( ! button ) return ;
60+
61+ const activityName = button . dataset . activity ;
62+ const email = button . dataset . email ;
63+
64+ try {
65+ const response = await fetch (
66+ `/activities/${ encodeURIComponent ( activityName ) } /participants/${ encodeURIComponent ( email ) } ` ,
67+ { method : "DELETE" }
68+ ) ;
69+
70+ const result = await response . json ( ) ;
71+
72+ if ( response . ok ) {
73+ messageDiv . textContent = result . message ;
74+ messageDiv . className = "success" ;
75+ fetchActivities ( ) ;
76+ } else {
77+ messageDiv . textContent = result . detail || "Unable to remove participant" ;
78+ messageDiv . className = "error" ;
79+ }
80+ } catch ( error ) {
81+ messageDiv . textContent = "Failed to remove participant. Please try again." ;
82+ messageDiv . className = "error" ;
83+ console . error ( "Error removing participant:" , error ) ;
84+ }
85+
86+ messageDiv . classList . remove ( "hidden" ) ;
87+ setTimeout ( ( ) => {
88+ messageDiv . classList . add ( "hidden" ) ;
89+ } , 5000 ) ;
90+ } ) ;
91+
3292 // Add option to select dropdown
3393 const option = document . createElement ( "option" ) ;
3494 option . value = name ;
@@ -62,6 +122,7 @@ document.addEventListener("DOMContentLoaded", () => {
62122 messageDiv . textContent = result . message ;
63123 messageDiv . className = "success" ;
64124 signupForm . reset ( ) ;
125+ fetchActivities ( ) ;
65126 } else {
66127 messageDiv . textContent = result . detail || "An error occurred" ;
67128 messageDiv . className = "error" ;
0 commit comments