@@ -12,6 +12,8 @@ document.addEventListener("DOMContentLoaded", () => {
1212
1313 // Clear loading message
1414 activitiesList . innerHTML = "" ;
15+ // Reset activity select so we don't duplicate options on refresh
16+ activitySelect . innerHTML = '<option value="">-- Select an activity --</option>' ;
1517
1618 // Populate activities list
1719 Object . entries ( activities ) . forEach ( ( [ name , details ] ) => {
@@ -26,9 +28,14 @@ document.addEventListener("DOMContentLoaded", () => {
2628 participantsHTML = `
2729 <div class="participants-section">
2830 <strong>Partecipanti:</strong>
29- <ul class="participants-list">
30- ${ details . participants . map ( p => `<li>${ p } </li>` ) . join ( "" ) }
31- </ul>
31+ <ul class="participants-list">
32+ ${ details . participants
33+ . map (
34+ ( p ) =>
35+ `<li><span class="participant-email">${ p } </span><button class="delete-participant" data-activity="${ name } " data-email="${ p } " aria-label="Unregister">✖</button></li>`
36+ )
37+ . join ( "" ) }
38+ </ul>
3239 </div>
3340 ` ;
3441 } else {
@@ -61,6 +68,46 @@ document.addEventListener("DOMContentLoaded", () => {
6168 }
6269 }
6370
71+ // Handle unregister/delete participant clicks using event delegation
72+ activitiesList . addEventListener ( "click" , async ( event ) => {
73+ const target = event . target ;
74+ if ( target . classList && target . classList . contains ( "delete-participant" ) ) {
75+ const activity = target . getAttribute ( "data-activity" ) ;
76+ const email = target . getAttribute ( "data-email" ) ;
77+
78+ if ( ! activity || ! email ) return ;
79+
80+ try {
81+ const response = await fetch (
82+ `/activities/${ encodeURIComponent ( activity ) } /participants?email=${ encodeURIComponent ( email ) } ` ,
83+ { method : "DELETE" }
84+ ) ;
85+
86+ const result = await response . json ( ) ;
87+
88+ if ( response . ok ) {
89+ messageDiv . textContent = result . message ;
90+ messageDiv . className = "success" ;
91+ // Refresh the activities list to reflect removal
92+ fetchActivities ( ) ;
93+ } else {
94+ messageDiv . textContent = result . detail || "An error occurred" ;
95+ messageDiv . className = "error" ;
96+ }
97+
98+ messageDiv . classList . remove ( "hidden" ) ;
99+ setTimeout ( ( ) => {
100+ messageDiv . classList . add ( "hidden" ) ;
101+ } , 5000 ) ;
102+ } catch ( err ) {
103+ console . error ( "Error unregistering:" , err ) ;
104+ messageDiv . textContent = "Failed to unregister. Please try again." ;
105+ messageDiv . className = "error" ;
106+ messageDiv . classList . remove ( "hidden" ) ;
107+ }
108+ }
109+ } ) ;
110+
64111 // Handle form submission
65112 signupForm . addEventListener ( "submit" , async ( event ) => {
66113 event . preventDefault ( ) ;
@@ -82,6 +129,8 @@ document.addEventListener("DOMContentLoaded", () => {
82129 messageDiv . textContent = result . message ;
83130 messageDiv . className = "success" ;
84131 signupForm . reset ( ) ;
132+ // Refresh activities immediately so UI reflects new participant
133+ fetchActivities ( ) ;
85134 } else {
86135 messageDiv . textContent = result . detail || "An error occurred" ;
87136 messageDiv . className = "error" ;
0 commit comments