document.addEventListener('DOMContentLoaded', () => { // ───────────────────────────────────────────────────────────── // 스크립트 선택 시 XML 드롭다운 토글 // ───────────────────────────────────────────────────────────── const TARGET_SCRIPT = "02-set_config.py"; const scriptSelect = document.getElementById('script'); const xmlGroup = document.getElementById('xmlFileGroup'); function toggleXml() { if (!scriptSelect || !xmlGroup) return; if (scriptSelect.value === TARGET_SCRIPT) { xmlGroup.style.display = 'block'; xmlGroup.classList.add('fade-in'); } else { xmlGroup.style.display = 'none'; } } if (scriptSelect) { toggleXml(); scriptSelect.addEventListener('change', toggleXml); } // ───────────────────────────────────────────────────────────── // 파일 보기 모달 // ───────────────────────────────────────────────────────────── const modalEl = document.getElementById('fileViewModal'); const titleEl = document.getElementById('fileViewModalLabel'); const contentEl = document.getElementById('fileViewContent'); if (modalEl) { modalEl.addEventListener('show.bs.modal', async (ev) => { const btn = ev.relatedTarget; const folder = btn?.getAttribute('data-folder') || ''; const date = btn?.getAttribute('data-date') || ''; const filename = btn?.getAttribute('data-filename') || ''; titleEl.innerHTML = `${filename || '파일'}`; contentEl.textContent = '불러오는 중...'; const params = new URLSearchParams(); if (folder) params.set('folder', folder); if (date) params.set('date', date); if (filename) params.set('filename', filename); try { const res = await fetch(`/view_file?${params.toString()}`, { cache: 'no-store' }); if (!res.ok) throw new Error('HTTP ' + res.status); const data = await res.json(); contentEl.textContent = data?.content ?? '(빈 파일)'; } catch (e) { contentEl.textContent = '파일을 불러오지 못했습니다: ' + (e?.message || e); } }); } // ───────────────────────────────────────────────────────────── // 진행바 업데이트 // ───────────────────────────────────────────────────────────── window.updateProgress = function (val) { const bar = document.getElementById('progressBar'); if (!bar) return; const v = Math.max(0, Math.min(100, Number(val) || 0)); bar.style.width = v + '%'; bar.setAttribute('aria-valuenow', v); bar.innerHTML = `${v}%`; }; // ───────────────────────────────────────────────────────────── // CSRF 토큰 // ───────────────────────────────────────────────────────────── const csrfToken = document.querySelector('input[name="csrf_token"]')?.value || ''; // ───────────────────────────────────────────────────────────── // 공통 POST 함수 // ───────────────────────────────────────────────────────────── async function postFormAndHandle(url) { const res = await fetch(url, { method: 'POST', credentials: 'same-origin', headers: { 'X-CSRFToken': csrfToken, 'Accept': 'application/json, text/html;q=0.9,*/*;q=0.8', }, }); const ct = (res.headers.get('content-type') || '').toLowerCase(); if (ct.includes('application/json')) { const data = await res.json(); if (data.success === false) { throw new Error(data.error || ('HTTP ' + res.status)); } return data; } return { success: true, html: true }; } // ───────────────────────────────────────────────────────────── // MAC 파일 이동 // ───────────────────────────────────────────────────────────── const macForm = document.getElementById('macMoveForm'); if (macForm) { macForm.addEventListener('submit', async (e) => { e.preventDefault(); const btn = macForm.querySelector('button'); const originalHtml = btn.innerHTML; btn.disabled = true; btn.innerHTML = '처리 중...'; try { await postFormAndHandle(macForm.action); location.reload(); } catch (err) { alert('MAC 이동 중 오류: ' + (err?.message || err)); btn.disabled = false; btn.innerHTML = originalHtml; } }); } // ───────────────────────────────────────────────────────────── // GUID 파일 이동 // ───────────────────────────────────────────────────────────── const guidForm = document.getElementById('guidMoveForm'); if (guidForm) { guidForm.addEventListener('submit', async (e) => { e.preventDefault(); const btn = guidForm.querySelector('button'); const originalHtml = btn.innerHTML; btn.disabled = true; btn.innerHTML = '처리 중...'; try { await postFormAndHandle(guidForm.action); location.reload(); } catch (err) { alert('GUID 이동 중 오류: ' + (err?.message || err)); btn.disabled = false; btn.innerHTML = originalHtml; } }); } // ───────────────────────────────────────────────────────────── // 알림 자동 닫기 // ───────────────────────────────────────────────────────────── setTimeout(() => { document.querySelectorAll('.alert').forEach(alert => { const bsAlert = new bootstrap.Alert(alert); bsAlert.close(); }); }, 5000); });