/* ===== Education Management ===== */ let educationList = []; let editingEducationId = null; async function loadEducation() { try { const dateFrom = document.getElementById('eduDateFrom')?.value || ''; const dateTo = document.getElementById('eduDateTo')?.value || ''; const targetType = document.getElementById('eduTargetType')?.value || ''; const params = new URLSearchParams(); if (dateFrom) params.set('date_from', dateFrom); if (dateTo) params.set('date_to', dateTo); if (targetType) params.set('target_type', targetType); const r = await api('/education?' + params.toString()); educationList = r.data || []; renderEducationList(); } catch (e) { showToast('교육 목록 로드 실패: ' + e.message, 'error'); } } function renderEducationList() { const tbody = document.getElementById('educationTableBody'); if (!educationList.length) { tbody.innerHTML = '등록된 안전교육이 없습니다'; return; } const typeLabels = { day_labor: '일용공', partner_schedule: '협력업체', manual: '수동등록' }; const statusLabels = { planned: '예정', completed: '완료', cancelled: '취소' }; const statusColors = { planned: 'badge-amber', completed: 'badge-green', cancelled: 'badge-gray' }; tbody.innerHTML = educationList.map(e => { const attendeeCount = e.attendees ? (typeof e.attendees === 'string' ? JSON.parse(e.attendees) : e.attendees).length : 0; return ` ${formatDate(e.education_date)} ${typeLabels[e.target_type] || e.target_type} ${escapeHtml(e.educator) || '-'} ${attendeeCount}명 ${statusLabels[e.status] || e.status} ${escapeHtml(e.notes) || '-'} `; }).join(''); } /* ===== Add education modal ===== */ function openAddEducation() { document.getElementById('addEducationModal').classList.remove('hidden'); } function closeAddEducation() { document.getElementById('addEducationModal').classList.add('hidden'); document.getElementById('addEducationForm').reset(); } async function submitAddEducation(e) { e.preventDefault(); const attendeesRaw = document.getElementById('newAttendees').value.trim(); const attendees = attendeesRaw ? attendeesRaw.split('\n').map(line => { const parts = line.split(',').map(s => s.trim()); return { name: parts[0] || '', company: parts[1] || '' }; }).filter(a => a.name) : []; const data = { target_type: document.getElementById('newTargetType').value, education_date: document.getElementById('newEducationDate').value, educator: document.getElementById('newEducator').value.trim() || null, attendees: attendees, status: document.getElementById('newEduStatus').value || 'planned', notes: document.getElementById('newEduNotes').value.trim() || null, }; if (!data.education_date) { showToast('교육일은 필수입니다', 'error'); return; } try { await api('/education', { method: 'POST', body: JSON.stringify(data) }); showToast('안전교육이 등록되었습니다'); closeAddEducation(); await loadEducation(); } catch (e) { showToast(e.message, 'error'); } } /* ===== Edit education ===== */ function openEditEducation(id) { const edu = educationList.find(x => x.id === id); if (!edu) return; editingEducationId = id; document.getElementById('editTargetType').value = edu.target_type; document.getElementById('editEducationDate').value = formatDate(edu.education_date); document.getElementById('editEducator').value = edu.educator || ''; document.getElementById('editEduStatus').value = edu.status; document.getElementById('editEduNotes').value = edu.notes || ''; const attendees = edu.attendees ? (typeof edu.attendees === 'string' ? JSON.parse(edu.attendees) : edu.attendees) : []; document.getElementById('editAttendees').value = attendees.map(a => `${a.name}${a.company ? ', ' + a.company : ''}`).join('\n'); document.getElementById('editEducationModal').classList.remove('hidden'); } function closeEditEducation() { document.getElementById('editEducationModal').classList.add('hidden'); editingEducationId = null; } async function submitEditEducation(e) { e.preventDefault(); if (!editingEducationId) return; const attendeesRaw = document.getElementById('editAttendees').value.trim(); const attendees = attendeesRaw ? attendeesRaw.split('\n').map(line => { const parts = line.split(',').map(s => s.trim()); return { name: parts[0] || '', company: parts[1] || '' }; }).filter(a => a.name) : []; const data = { target_type: document.getElementById('editTargetType').value, education_date: document.getElementById('editEducationDate').value, educator: document.getElementById('editEducator').value.trim() || null, attendees: attendees, status: document.getElementById('editEduStatus').value, notes: document.getElementById('editEduNotes').value.trim() || null, }; try { await api(`/education/${editingEducationId}`, { method: 'PUT', body: JSON.stringify(data) }); showToast('수정되었습니다'); closeEditEducation(); await loadEducation(); } catch (e) { showToast(e.message, 'error'); } } async function doDeleteEducation(id) { if (!confirm('이 교육 기록을 삭제하시겠습니까?')) return; try { await api(`/education/${id}`, { method: 'DELETE' }); showToast('삭제되었습니다'); await loadEducation(); } catch (e) { showToast(e.message, 'error'); } } function initEducationPage() { if (!initAuth()) return; document.getElementById('addEducationForm').addEventListener('submit', submitAddEducation); document.getElementById('editEducationForm').addEventListener('submit', submitEditEducation); document.getElementById('eduDateFrom')?.addEventListener('change', loadEducation); document.getElementById('eduDateTo')?.addEventListener('change', loadEducation); document.getElementById('eduTargetType')?.addEventListener('change', loadEducation); loadEducation(); }