feat: 알림 시스템 및 시설설비 관리 기능 구현

- 알림 시스템 구축 (navbar 알림 아이콘, 드롭다운)
- 알림 수신자 설정 기능 (계정관리 페이지)
- 시설설비 관리 페이지 추가 (수리 워크플로우)
- 수리 신청 → 접수 → 처리중 → 완료 상태 관리
- 사이드바 메뉴 구조 개선 (공장 관리 카테고리)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-02-04 15:56:57 +09:00
parent d1aec517a6
commit b8ccde7f17
24 changed files with 3204 additions and 9 deletions

View File

@@ -1398,27 +1398,73 @@ function openPanelRepairModal() {
panelRepairCategories.forEach(item => {
select.innerHTML += `<option value="${item.item_id}">${item.item_name}</option>`;
});
// 새로 추가 옵션
select.innerHTML += '<option value="__new__">+ 새로 추가</option>';
document.getElementById('panelRepairDesc').value = '';
document.getElementById('panelRepairPhotoInput').value = '';
document.getElementById('newRepairTypeName').value = '';
document.getElementById('newRepairTypeGroup').style.display = 'none';
panelRepairPhotoBases = [];
document.getElementById('panelRepairModal').style.display = 'flex';
}
function onRepairTypeChange() {
const select = document.getElementById('panelRepairItem');
const newTypeGroup = document.getElementById('newRepairTypeGroup');
if (select.value === '__new__') {
newTypeGroup.style.display = 'block';
document.getElementById('newRepairTypeName').focus();
} else {
newTypeGroup.style.display = 'none';
}
}
function closePanelRepairModal() {
document.getElementById('panelRepairModal').style.display = 'none';
}
async function submitPanelRepair() {
const itemId = document.getElementById('panelRepairItem').value;
const selectValue = document.getElementById('panelRepairItem').value;
const description = document.getElementById('panelRepairDesc').value;
const newTypeName = document.getElementById('newRepairTypeName').value.trim();
if (!description) {
alert('수리 내용을 입력하세요.');
return;
}
let itemId = selectValue;
// 새 유형 추가하는 경우
if (selectValue === '__new__') {
if (!newTypeName) {
alert('새 수리 유형 이름을 입력하세요.');
return;
}
try {
const addResponse = await window.apiCall('/equipments/repair-categories', 'POST', {
item_name: newTypeName
});
if (addResponse && addResponse.success) {
itemId = addResponse.data.item_id;
// 목록에 추가
panelRepairCategories.push({ item_id: itemId, item_name: newTypeName });
} else {
alert('새 유형 추가에 실패했습니다.');
return;
}
} catch (error) {
console.error('새 유형 추가 실패:', error);
alert('새 유형 추가에 실패했습니다.');
return;
}
}
// 사진 처리
const fileInput = document.getElementById('panelRepairPhotoInput');
const photos = [];
@@ -1728,6 +1774,7 @@ window.confirmPanelMove = confirmPanelMove;
window.openPanelRepairModal = openPanelRepairModal;
window.closePanelRepairModal = closePanelRepairModal;
window.submitPanelRepair = submitPanelRepair;
window.onRepairTypeChange = onRepairTypeChange;
window.openPanelExportModal = openPanelExportModal;
window.closePanelExportModal = closePanelExportModal;
window.submitPanelExport = submitPanelExport;