import { API, getAuthHeaders, ensureAuthenticated } from '/js/api-config.js'; // 인증 확인 ensureAuthenticated(); // 행 생성 function createRow(item, delHandler) { const tr = document.createElement('tr'); const label = `${item.material} / ${item.diameter_in} / ${item.schedule}`; tr.innerHTML = ` ${item.spec_id} ${label} `; tr.querySelector('.btn-delete').onclick = () => delHandler(item); return tr; } // 등록 document.getElementById('specForm')?.addEventListener('submit', async e => { e.preventDefault(); const material = document.getElementById('material').value.trim(); const diameter = document.getElementById('diameter_in').value.trim(); const schedule = document.getElementById('schedule').value.trim(); if (!material || !diameter || !schedule) { return alert('모든 항목을 입력하세요.'); } try { const res = await fetch(`${API}/pipespecs`, { method: 'POST', headers: getAuthHeaders(), body: JSON.stringify({ material, diameter_in: diameter, schedule }) }); const result = await res.json(); if (res.ok && result.success) { alert('✅ 등록 완료'); e.target.reset(); loadSpecs(); } else { alert('❌ 실패: ' + (result.error || '등록 실패')); } } catch (err) { alert('🚨 서버 오류: ' + err.message); } }); // 불러오기 async function loadSpecs() { const tbody = document.getElementById('specTableBody'); tbody.innerHTML = '불러오는 중...'; try { const res = await fetch(`${API}/pipespecs`, { headers: getAuthHeaders() }); if (!res.ok) { throw new Error(`HTTP error! status: ${res.status}`); } const list = await res.json(); tbody.innerHTML = ''; if (Array.isArray(list)) { list.forEach(item => { const row = createRow(item, async (spec) => { if (!confirm('삭제하시겠습니까?')) return; try { const delRes = await fetch(`${API}/pipespecs/${spec.spec_id}`, { method: 'DELETE', headers: getAuthHeaders() }); if (delRes.ok) { loadSpecs(); } else { alert('삭제 실패'); } } catch (err) { alert('삭제 중 오류: ' + err.message); } }); tbody.appendChild(row); }); } else { tbody.innerHTML = '데이터 형식 오류'; } } catch (err) { tbody.innerHTML = '로드 실패: ' + err.message + ''; } } window.addEventListener('DOMContentLoaded', loadSpecs);