@@ -310,7 +310,218 @@ function submitCreateGroup(event) {
310310}
311311
312312function handleDeleteGroup ( groupId ) {
313- alert ( 'Not implemented' ) ;
313+ if ( ! currentToken ) {
314+ showError ( 'You must be logged in to delete a group' ) ;
315+ return ;
316+ }
317+ if ( ! currentGroup || currentGroup . id !== groupId ) {
318+ // Need to fetch group details first
319+ fetchGroupDetailsForDelete ( groupId ) ;
320+ } else {
321+ showDeleteGroupConfirmationModal ( currentGroup ) ;
322+ }
323+ }
324+
325+ function fetchGroupDetailsForDelete ( groupId ) {
326+ fetch ( `${ API_BASE } /groups/${ groupId } ` , {
327+ headers : {
328+ 'Authorization' : `Bearer ${ currentToken } `
329+ }
330+ } )
331+ . then ( response => {
332+ if ( ! response . ok ) {
333+ if ( response . status === 401 ) {
334+ logout ( ) ;
335+ throw new Error ( 'Authentication failed' ) ;
336+ }
337+ if ( response . status === 403 ) {
338+ throw new Error ( 'You do not have access to this group' ) ;
339+ }
340+ if ( response . status === 404 ) {
341+ throw new Error ( 'Group not found' ) ;
342+ }
343+ return response . json ( ) . then ( data => {
344+ throw new Error ( data . message || 'Failed to fetch group details' ) ;
345+ } ) ;
346+ }
347+ return response . json ( ) ;
348+ } )
349+ . then ( group => {
350+ showDeleteGroupConfirmationModal ( group ) ;
351+ } )
352+ . catch ( error => {
353+ console . error ( 'Error:' , error ) ;
354+ showError ( error . message || 'Failed to fetch group details' ) ;
355+ } ) ;
356+ }
357+
358+ function showDeleteGroupConfirmationModal ( group ) {
359+ // Create modal if it doesn't exist
360+ let modalOverlay = document . getElementById ( 'delete-group-modal' ) ;
361+ if ( ! modalOverlay ) {
362+ modalOverlay = document . createElement ( 'div' ) ;
363+ modalOverlay . id = 'delete-group-modal' ;
364+ modalOverlay . className = 'modal-overlay' ;
365+ modalOverlay . innerHTML = `
366+ <div class="modal">
367+ <div class="modal-header">
368+ <h2>Delete Group</h2>
369+ <button class="modal-close" onclick="closeDeleteGroupModal()">×</button>
370+ </div>
371+ <p>Are you sure you want to delete this group?</p>
372+ <p style="font-weight: 600; color: #333; margin: 10px 0;">"<span id="delete-group-name"></span>"</p>
373+ <p style="color: #6c757d; font-size: 0.9em;">This action cannot be undone. The group can only be deleted if it has no expenses.</p>
374+ <div class="form-actions">
375+ <button type="button" class="secondary" onclick="closeDeleteGroupModal()">Cancel</button>
376+ <button type="button" class="danger" id="confirm-delete-group-btn" onclick="confirmDeleteGroup()">Delete</button>
377+ </div>
378+ </div>
379+ ` ;
380+ document . body . appendChild ( modalOverlay ) ;
381+
382+ // Close modal when clicking outside
383+ modalOverlay . addEventListener ( 'click' , function ( event ) {
384+ if ( event . target === modalOverlay ) {
385+ closeDeleteGroupModal ( ) ;
386+ }
387+ } ) ;
388+ }
389+
390+ // Update group name in modal
391+ const nameEl = document . getElementById ( 'delete-group-name' ) ;
392+ if ( nameEl ) {
393+ nameEl . textContent = group . name || '' ;
394+ }
395+
396+ // Store group ID for deletion
397+ modalOverlay . dataset . groupId = group . id ;
398+
399+ modalOverlay . classList . add ( 'active' ) ;
400+ }
401+
402+ function closeDeleteGroupModal ( ) {
403+ const modalOverlay = document . getElementById ( 'delete-group-modal' ) ;
404+ if ( modalOverlay ) {
405+ modalOverlay . classList . remove ( 'active' ) ;
406+ }
407+ }
408+
409+ function showDeleteGroupErrorModal ( errorMessage ) {
410+ // Create modal if it doesn't exist
411+ let modalOverlay = document . getElementById ( 'delete-group-error-modal' ) ;
412+ if ( ! modalOverlay ) {
413+ modalOverlay = document . createElement ( 'div' ) ;
414+ modalOverlay . id = 'delete-group-error-modal' ;
415+ modalOverlay . className = 'modal-overlay' ;
416+ modalOverlay . innerHTML = `
417+ <div class="modal">
418+ <div class="modal-header">
419+ <h2>Error</h2>
420+ <button class="modal-close" onclick="closeDeleteGroupErrorModal()">×</button>
421+ </div>
422+ <p style="color: #dc3545; font-weight: 600; margin: 10px 0;"><span id="delete-group-error-message"></span></p>
423+ <div class="form-actions">
424+ <button type="button" class="secondary" onclick="closeDeleteGroupErrorModal()">Close</button>
425+ </div>
426+ </div>
427+ ` ;
428+ document . body . appendChild ( modalOverlay ) ;
429+
430+ // Close modal when clicking outside
431+ modalOverlay . addEventListener ( 'click' , function ( event ) {
432+ if ( event . target === modalOverlay ) {
433+ closeDeleteGroupErrorModal ( ) ;
434+ }
435+ } ) ;
436+ }
437+
438+ // Update error message in modal
439+ const messageEl = document . getElementById ( 'delete-group-error-message' ) ;
440+ if ( messageEl ) {
441+ messageEl . textContent = errorMessage ;
442+ }
443+
444+ modalOverlay . classList . add ( 'active' ) ;
445+ }
446+
447+ function closeDeleteGroupErrorModal ( ) {
448+ const modalOverlay = document . getElementById ( 'delete-group-error-modal' ) ;
449+ if ( modalOverlay ) {
450+ modalOverlay . classList . remove ( 'active' ) ;
451+ }
452+ }
453+
454+ function confirmDeleteGroup ( ) {
455+ const modalOverlay = document . getElementById ( 'delete-group-modal' ) ;
456+ if ( ! modalOverlay ) {
457+ return ;
458+ }
459+
460+ const groupId = parseInt ( modalOverlay . dataset . groupId ) ;
461+
462+ if ( ! groupId ) {
463+ showError ( 'Group information not available' ) ;
464+ return ;
465+ }
466+
467+ if ( ! currentToken ) {
468+ showError ( 'You must be logged in to delete a group' ) ;
469+ closeDeleteGroupModal ( ) ;
470+ return ;
471+ }
472+
473+ // Disable delete button during submission
474+ const deleteButton = document . getElementById ( 'confirm-delete-group-btn' ) ;
475+ const originalText = deleteButton . textContent ;
476+ deleteButton . disabled = true ;
477+ deleteButton . textContent = 'Deleting...' ;
478+
479+ fetch ( `${ API_BASE } /groups/${ groupId } ` , {
480+ method : 'DELETE' ,
481+ headers : {
482+ 'Authorization' : `Bearer ${ currentToken } `
483+ }
484+ } )
485+ . then ( response => {
486+ if ( ! response . ok ) {
487+ if ( response . status === 401 ) {
488+ logout ( ) ;
489+ throw new Error ( 'Authentication failed' ) ;
490+ }
491+ if ( response . status === 403 ) {
492+ throw new Error ( 'You do not have permission to delete this group' ) ;
493+ }
494+ if ( response . status === 404 ) {
495+ throw new Error ( 'Group not found' ) ;
496+ }
497+ if ( response . status === 409 ) {
498+ return response . json ( ) . then ( data => {
499+ throw new Error ( data . message || 'Cannot delete this group' ) ;
500+ } ) ;
501+ }
502+ return response . json ( ) . then ( data => {
503+ throw new Error ( data . message || 'Failed to delete group' ) ;
504+ } ) ;
505+ }
506+ // DELETE returns 204 No Content, so no JSON to parse
507+ return null ;
508+ } )
509+ . then ( ( ) => {
510+ closeDeleteGroupModal ( ) ;
511+ // Go back to groups list
512+ showGroupsList ( ) ;
513+ // Reload groups list
514+ fetchGroups ( ) ;
515+ } )
516+ . catch ( error => {
517+ console . error ( 'Error:' , error ) ;
518+ closeDeleteGroupModal ( ) ;
519+ showDeleteGroupErrorModal ( error . message || 'Failed to delete group' ) ;
520+ } )
521+ . finally ( ( ) => {
522+ deleteButton . disabled = false ;
523+ deleteButton . textContent = originalText ;
524+ } ) ;
314525}
315526
316527function viewGroupDetails ( groupId ) {
0 commit comments