diff --git a/web-ui/js/task-management.js b/web-ui/js/task-management.js index 88994ab..1aa1b36 100644 --- a/web-ui/js/task-management.js +++ b/web-ui/js/task-management.js @@ -103,9 +103,15 @@ function renderWorkTypeTabs() { tabsHtml += ` `; }); @@ -375,3 +381,126 @@ function showToast(message, type = 'info') { setTimeout(() => toast.remove(), 300); }, 3000); } + +// ==================== ๊ณต์ ๊ด๋ฆฌ ==================== + +let currentEditingWorkType = null; + +// ๊ณต์ ๋ชจ๋ฌ ์ด๊ธฐ (์ ๊ท) +function openWorkTypeModal() { + currentEditingWorkType = null; + document.getElementById('workTypeModalTitle').textContent = '๊ณต์ ์ถ๊ฐ'; + document.getElementById('workTypeId').value = ''; + document.getElementById('workTypeName').value = ''; + document.getElementById('workTypeCategory').value = ''; + document.getElementById('workTypeDescription').value = ''; + document.getElementById('deleteWorkTypeBtn').style.display = 'none'; + + document.getElementById('workTypeModal').style.display = 'flex'; + document.body.style.overflow = 'hidden'; +} +window.openWorkTypeModal = openWorkTypeModal; + +// ๊ณต์ ์์ ๋ชจ๋ฌ ์ด๊ธฐ +async function editWorkType(workTypeId) { + try { + const workType = workTypes.find(wt => wt.id === workTypeId); + if (!workType) { + showToast('๊ณต์ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.', 'error'); + return; + } + + currentEditingWorkType = workType; + document.getElementById('workTypeModalTitle').textContent = '๊ณต์ ์์ '; + document.getElementById('workTypeId').value = workType.id; + document.getElementById('workTypeName').value = workType.name || ''; + document.getElementById('workTypeCategory').value = workType.category || ''; + document.getElementById('workTypeDescription').value = workType.description || ''; + document.getElementById('deleteWorkTypeBtn').style.display = 'block'; + + document.getElementById('workTypeModal').style.display = 'flex'; + document.body.style.overflow = 'hidden'; + } catch (error) { + console.error('โ ๊ณต์ ์กฐํ ์ค๋ฅ:', error); + showToast('๊ณต์ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.', 'error'); + } +} +window.editWorkType = editWorkType; + +// ๊ณต์ ๋ชจ๋ฌ ๋ซ๊ธฐ +function closeWorkTypeModal() { + document.getElementById('workTypeModal').style.display = 'none'; + document.body.style.overflow = 'auto'; + currentEditingWorkType = null; +} +window.closeWorkTypeModal = closeWorkTypeModal; + +// ๊ณต์ ์ ์ฅ +async function saveWorkType() { + const workTypeId = document.getElementById('workTypeId').value; + const workTypeData = { + name: document.getElementById('workTypeName').value.trim(), + category: document.getElementById('workTypeCategory').value.trim() || null, + description: document.getElementById('workTypeDescription').value.trim() || null + }; + + if (!workTypeData.name) { + showToast('๊ณต์ ๋ช ์ ์ ๋ ฅํด์ฃผ์ธ์.', 'error'); + return; + } + + try { + let response; + if (workTypeId) { + // ์์ + response = await window.apiCall(`/daily-work-reports/work-types/${workTypeId}`, 'PUT', workTypeData); + } else { + // ์ ๊ท + response = await window.apiCall('/daily-work-reports/work-types', 'POST', workTypeData); + } + + if (response && response.success) { + showToast(workTypeId ? '๊ณต์ ์ด ์์ ๋์์ต๋๋ค.' : '๊ณต์ ์ด ์ถ๊ฐ๋์์ต๋๋ค.', 'success'); + closeWorkTypeModal(); + await loadAllData(); + } else { + throw new Error(response.message || '์ ์ฅ์ ์คํจํ์ต๋๋ค.'); + } + } catch (error) { + console.error('โ ๊ณต์ ์ ์ฅ ์ค๋ฅ:', error); + showToast('๊ณต์ ์ ์ฅ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.', 'error'); + } +} +window.saveWorkType = saveWorkType; + +// ๊ณต์ ์ญ์ +async function deleteWorkType() { + if (!currentEditingWorkType) return; + + // ์ด ๊ณต์ ์ ์ํ ์์ ์ด ์๋์ง ํ์ธ + const relatedTasks = tasks.filter(t => t.work_type_id === currentEditingWorkType.id); + if (relatedTasks.length > 0) { + showToast(`์ด ๊ณต์ ์ ${relatedTasks.length}๊ฐ์ ์์ ์ด ์ฐ๊ฒฐ๋์ด ์์ด ์ญ์ ํ ์ ์์ต๋๋ค.`, 'error'); + return; + } + + if (!confirm(`"${currentEditingWorkType.name}" ๊ณต์ ์ ์ญ์ ํ์๊ฒ ์ต๋๊น?`)) { + return; + } + + try { + const response = await window.apiCall(`/daily-work-reports/work-types/${currentEditingWorkType.id}`, 'DELETE'); + + if (response && response.success) { + showToast('๊ณต์ ์ด ์ญ์ ๋์์ต๋๋ค.', 'success'); + closeWorkTypeModal(); + await loadAllData(); + } else { + throw new Error(response.message || '์ญ์ ์ ์คํจํ์ต๋๋ค.'); + } + } catch (error) { + console.error('โ ๊ณต์ ์ญ์ ์ค๋ฅ:', error); + showToast('๊ณต์ ์ญ์ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.', 'error'); + } +} +window.deleteWorkType = deleteWorkType; diff --git a/web-ui/pages/admin/tasks.html b/web-ui/pages/admin/tasks.html index 8bfe771..6a84889 100644 --- a/web-ui/pages/admin/tasks.html +++ b/web-ui/pages/admin/tasks.html @@ -77,6 +77,10 @@