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 @@
+
+ + +