@@ -59,6 +59,39 @@ $(document).ready(function () {
5959 }
6060 } ) ;
6161
62+ // Add event delegation for select user button in search results
63+ $ ( document ) . on ( "click" , ".select-user-btn" , function ( ) {
64+ const id = $ ( this ) . data ( "user-id" ) ;
65+ const name = $ ( this ) . data ( "user-name" ) ;
66+ const email = $ ( this ) . data ( "user-email" ) ;
67+ selectUserForAdd ( id , name , email ) ;
68+ } ) ;
69+
70+ // Add event delegation for remove member button
71+ $ ( document ) . on ( "click" , ".remove-member-btn" , function ( ) {
72+ const userId = $ ( this ) . data ( "user-id" ) ;
73+ removeMember ( userId ) ;
74+ } ) ;
75+
76+ // Add event delegation for change role button
77+ $ ( document ) . on ( "click" , ".change-role-btn" , function ( ) {
78+ const userId = $ ( this ) . data ( "user-id" ) ;
79+ const currentRole = $ ( this ) . data ( "user-role" ) ;
80+ openChangeRoleModal ( userId , currentRole ) ;
81+ $ ( "#changeRoleModal" ) . modal ( "show" ) ;
82+ } ) ;
83+
84+ // Add event delegation for approve/reject request buttons
85+ $ ( document ) . on ( "click" , ".approve-request-btn" , function ( ) {
86+ const requestId = $ ( this ) . data ( "request-id" ) ;
87+ approveRequest ( requestId ) ;
88+ } ) ;
89+
90+ $ ( document ) . on ( "click" , ".reject-request-btn" , function ( ) {
91+ const requestId = $ ( this ) . data ( "request-id" ) ;
92+ rejectRequest ( requestId ) ;
93+ } ) ;
94+
6295 // CSV Bulk Upload Events
6396 $ ( "#addBulkMemberBtn" ) . on ( "click" , function ( ) {
6497 $ ( "#csvBulkUploadModal" ) . modal ( "show" ) ;
@@ -407,17 +440,15 @@ function renderMemberActions(member) {
407440 } else {
408441 return `
409442 <button
410- class="btn btn-sm btn-danger me-1"
411- onclick="removeMember(' ${ member . userId } ') ">
443+ class="btn btn-sm btn-danger me-1 remove-member-btn "
444+ data-user-id=" ${ member . userId } ">
412445 Remove
413446 </button>
414447 <button
415448 type="button"
416- class="btn btn-sm btn-outline-secondary"
417- data-bs-toggle="modal"
418- data-bs-target="#changeRoleModal"
419- onclick="openChangeRoleModal('${ member . userId } ', '${ member . role } ')"
420- >
449+ class="btn btn-sm btn-outline-secondary change-role-btn"
450+ data-user-id="${ member . userId } "
451+ data-user-role="${ member . role } ">
421452 Change Role
422453 </button>
423454 ` ;
@@ -473,8 +504,10 @@ function loadPendingRequests() {
473504 <td>${ u . displayName } </td>
474505 <td>${ u . email } </td>
475506 <td>
476- <button class="btn btn-sm btn-success" onclick="approveRequest('${ u . userId } ')">Approve</button>
477- <button class="btn btn-sm btn-danger" onclick="rejectRequest('${ u . userId } ')">Reject</button>
507+ <button class="btn btn-sm btn-success approve-request-btn"
508+ data-request-id="${ u . userId } ">Approve</button>
509+ <button class="btn btn-sm btn-danger reject-request-btn"
510+ data-request-id="${ u . userId } ">Reject</button>
478511 </td>
479512 </tr>
480513 ` ;
@@ -522,66 +555,44 @@ function rejectRequest(requestId) {
522555 } ) ;
523556}
524557
558+ // Search users for manual add
525559function searchUsers ( ) {
526560 const term = $ ( "#userSearchTerm" ) . val ( ) . trim ( ) ;
527561 if ( ! term ) {
528- alert ( "Please enter a search term ." ) ;
562+ alert ( "Enter a name or email to search ." ) ;
529563 return ;
530564 }
531-
532- // UI state
533565 $ ( "#searchStatus" ) . text ( "Searching..." ) ;
534566 $ ( "#searchUsersBtn" ) . prop ( "disabled" , true ) ;
535567
536- $ . ajax ( {
537- url : "/api/userSearch" ,
538- method : "GET" ,
539- data : { query : term } ,
540- dataType : "json" ,
541- } )
542- . done ( function ( results ) {
543- renderUserSearchResults ( results ) ;
544- } )
545- . fail ( function ( jqXHR , textStatus , errorThrown ) {
546- console . error ( "User search error:" , textStatus , errorThrown ) ;
547-
548- if ( jqXHR . status === 401 ) {
549- // Session expired or no token → force re-login
550- window . location . href = "/login" ;
551- } else {
552- const msg = jqXHR . responseJSON ?. error
553- ? jqXHR . responseJSON . error
554- : "User search failed." ;
555- alert ( msg ) ;
556- }
568+ $ . get ( "/api/userSearch" , { query : term } )
569+ . done ( renderUserSearchResults )
570+ . fail ( function ( jq ) {
571+ const err = jq . responseJSON ?. error || jq . statusText ;
572+ alert ( "User search failed: " + err ) ;
557573 } )
558574 . always ( function ( ) {
559- // Restore UI state
560575 $ ( "#searchStatus" ) . text ( "" ) ;
561576 $ ( "#searchUsersBtn" ) . prop ( "disabled" , false ) ;
562577 } ) ;
563578}
564579
580+ // Render user-search results in add-member modal
565581function renderUserSearchResults ( users ) {
566582 let html = "" ;
567- if ( ! users || users . length === 0 ) {
568- html = `
569- <tr>
570- <td colspan="3" class="text-muted text-center">No results found</td>
571- </tr>
572- ` ;
583+ if ( ! users || ! users . length ) {
584+ html = `<tr><td colspan="3" class="text-center text-muted">No results.</td></tr>` ;
573585 } else {
574- users . forEach ( ( u ) => {
586+ users . forEach ( u => {
575587 html += `
576588 <tr>
577589 <td>${ u . displayName || "(no name)" } </td>
578590 <td>${ u . email || "" } </td>
579591 <td>
580- <button class="btn btn-sm btn-primary"
581- onclick="selectUserForAdd('${ u . id } ', '${ u . displayName } ', '${
582- u . email
583- } ')"
584- >
592+ <button class="btn btn-sm btn-primary select-user-btn"
593+ data-user-id="${ u . id } "
594+ data-user-name="${ u . displayName } "
595+ data-user-email="${ u . email } ">
585596 Select
586597 </button>
587598 </td>
@@ -592,9 +603,10 @@ function renderUserSearchResults(users) {
592603 $ ( "#userSearchResultsTable tbody" ) . html ( html ) ;
593604}
594605
595- function selectUserForAdd ( uid , displayName , email ) {
596- $ ( "#newUserId" ) . val ( uid ) ;
597- $ ( "#newUserDisplayName" ) . val ( displayName ) ;
606+ // Populate manual-add fields from search result
607+ function selectUserForAdd ( id , name , email ) {
608+ $ ( "#newUserId" ) . val ( id ) ;
609+ $ ( "#newUserDisplayName" ) . val ( name ) ;
598610 $ ( "#newUserEmail" ) . val ( email ) ;
599611}
600612
0 commit comments