/** * Admin Shifts Management Module * Handles shift CRUD operations, volunteer management, and email functionality */ // Shift state let editingShiftId = null; let currentShiftData = null; let allUsers = []; // Add shift management functions async function loadAdminShifts() { const list = document.getElementById('admin-shifts-list'); if (list) { list.innerHTML = '
Loading shifts...
'; } try { console.log('Loading admin shifts...'); const response = await fetch('/api/shifts/admin'); const data = await response.json(); if (data.success) { console.log('Successfully loaded', data.shifts.length, 'shifts'); displayAdminShifts(data.shifts); } else { console.error('Failed to load shifts:', data.error); if (list) { list.innerHTML = 'Failed to load shifts
'; } window.adminCore.showStatus('Failed to load shifts', 'error'); } } catch (error) { console.error('Error loading admin shifts:', error); if (list) { list.innerHTML = 'Error loading shifts
'; } window.adminCore.showStatus('Failed to load shifts', 'error'); } } function displayAdminShifts(shifts) { const list = document.getElementById('admin-shifts-list'); if (!list) { console.error('Admin shifts list element not found'); return; } if (shifts.length === 0) { list.innerHTML = 'No shifts created yet.
'; return; } list.innerHTML = shifts.map(shift => { const shiftDate = window.adminCore.createLocalDate(shift.Date); const signupCount = shift.signups ? shift.signups.length : 0; const isPublic = shift['Is Public'] !== false; console.log(`Shift "${shift.Title}" (ID: ${shift.ID}) has ${signupCount} volunteers:`, shift.signups?.map(s => s['User Email']) || []); return `📅 ${shiftDate.toLocaleDateString()} | ⏰ ${shift['Start Time']} - ${shift['End Time']}
📍 ${window.adminCore.escapeHtml(shift.Location || 'TBD')}
👥 ${signupCount}/${shift['Max Volunteers']} volunteers
${shift.Status || 'Open'}
${isPublic ? '🌐 Public' : '🔒 Private'}
${isPublic ? `