From c9249da9448c4aa313aee66c93ce8558b28fa425 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Wed, 1 Apr 2026 08:48:50 +0900 Subject: [PATCH] =?UTF-8?q?fix(monthly-comparison):=20=EB=AF=B8=EA=B2=80?= =?UTF-8?q?=ED=86=A0=E2=86=92=EA=B2=80=ED=86=A0=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?=EB=B1=83=EC=A7=80=20+=20=ED=99=95=EC=9D=B8=EB=B2=84=ED=8A=BC?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - admin_checked=1: "미검토" → "검토완료" 뱃지(파란색)로 변경 - "✓검토" 별도 뱃지 제거 - "확인 완료/문제 있음" 하단 버튼 항상 숨김 (관리자 페이지에서 불필요) - 새 상태 뱃지 CSS: admin_checked, review_sent, change_request Co-Authored-By: Claude Opus 4.6 (1M context) --- .../web/css/monthly-comparison.css | 3 ++ system1-factory/web/js/monthly-comparison.js | 53 ++++++++----------- .../pages/attendance/monthly-comparison.html | 2 +- 3 files changed, 25 insertions(+), 33 deletions(-) diff --git a/system1-factory/web/css/monthly-comparison.css b/system1-factory/web/css/monthly-comparison.css index 17d648c..b16735d 100644 --- a/system1-factory/web/css/monthly-comparison.css +++ b/system1-factory/web/css/monthly-comparison.css @@ -210,7 +210,10 @@ padding: 2px 8px; border-radius: 10px; } .mc-worker-status-badge.confirmed { background: #dcfce7; color: #166534; } +.mc-worker-status-badge.admin_checked { background: #dbeafe; color: #1e40af; } .mc-worker-status-badge.pending { background: #fef3c7; color: #92400e; } +.mc-worker-status-badge.review_sent { background: #e0e7ff; color: #3730a3; } +.mc-worker-status-badge.change_request { background: #fff7ed; color: #c2410c; } .mc-worker-status-badge.rejected { background: #fef2f2; color: #991b1b; } .mc-worker-reject-reason { font-size: 0.7rem; color: #991b1b; diff --git a/system1-factory/web/js/monthly-comparison.js b/system1-factory/web/js/monthly-comparison.js index 5e8a834..f09bc69 100644 --- a/system1-factory/web/js/monthly-comparison.js +++ b/system1-factory/web/js/monthly-comparison.js @@ -293,43 +293,31 @@ function renderConfirmationStatus(conf) { const statusEl = document.getElementById('confirmedStatus'); const badge = document.getElementById('statusBadge'); + // 관리자 페이지: 확인/문제 버튼 항상 숨김 (작업자는 my-monthly-confirm에서 처리) + actions.classList.add('hidden'); + if (!conf) { - // detail 모드(관리자가 타인의 기록 조회)에서는 버튼 숨김 - if (currentMode === 'detail') { - actions.classList.add('hidden'); - } else { - actions.classList.remove('hidden'); - } statusEl.classList.add('hidden'); + badge.textContent = ''; return; } - badge.textContent = { pending: '미확인', confirmed: '확인완료', rejected: '반려' }[conf.status] || ''; - badge.className = `mc-status-badge ${conf.status}`; + var displayStatus = (conf.status === 'pending' && conf.admin_checked) ? 'admin_checked' : conf.status; + var labels = { pending: '미검토', admin_checked: '검토완료', review_sent: '확인요청', confirmed: '확인완료', change_request: '수정요청', rejected: '반려' }; + badge.textContent = labels[displayStatus] || ''; + badge.className = 'mc-status-badge ' + displayStatus; - if (currentMode === 'detail') { - // 관리자 상세 뷰: 확인/반려 버튼 숨기고 상태만 표시 - actions.classList.add('hidden'); - if (conf.status !== 'pending') { - statusEl.classList.remove('hidden'); - const statusLabel = { confirmed: '확인 완료', rejected: '반려' }[conf.status] || ''; - const dt = conf.confirmed_at ? new Date(conf.confirmed_at).toLocaleString('ko') : ''; - const reason = conf.reject_reason ? ` (사유: ${conf.reject_reason})` : ''; - document.getElementById('confirmedText').textContent = `${dt} ${statusLabel}${reason}`; - } else { - statusEl.classList.add('hidden'); - } - } else if (conf.status === 'confirmed') { - actions.classList.add('hidden'); + if (conf.status === 'confirmed') { statusEl.classList.remove('hidden'); - const dt = conf.confirmed_at ? new Date(conf.confirmed_at).toLocaleString('ko') : ''; - document.getElementById('confirmedText').textContent = `${dt} 확인 완료`; + var dt = conf.confirmed_at ? new Date(conf.confirmed_at).toLocaleString('ko') : ''; + document.getElementById('confirmedText').textContent = dt + ' 확인 완료'; } else if (conf.status === 'rejected') { - // 재확인 가능 - actions.classList.remove('hidden'); - statusEl.classList.add('hidden'); + statusEl.classList.remove('hidden'); + document.getElementById('confirmedText').textContent = '반려: ' + (conf.reject_reason || '-'); + } else if (conf.status === 'change_request') { + statusEl.classList.remove('hidden'); + document.getElementById('confirmedText').textContent = '수정요청 접수됨'; } else { - actions.classList.remove('hidden'); statusEl.classList.add('hidden'); } } @@ -381,9 +369,10 @@ function renderWorkerList(workers) { } el.innerHTML = filtered.map(w => { - const statusLabels = { confirmed: '확인완료', pending: '미검토', review_sent: '확인요청', change_request: '수정요청', rejected: '반려' }; - const statusBadge = `${statusLabels[w.status] || ''}`; - const checkedBadge = w.admin_checked ? ' ✓검토' : ''; + // admin_checked면 "미검토" → "검토완료"로 표시 + var displayStatus = (w.status === 'pending' && w.admin_checked) ? 'admin_checked' : w.status; + const statusLabels = { confirmed: '확인완료', pending: '미검토', admin_checked: '검토완료', review_sent: '확인요청', change_request: '수정요청', rejected: '반려' }; + const statusBadge = `${statusLabels[displayStatus] || ''}`; const mismatchBadge = w.mismatch_count > 0 ? `⚠️ 불일치${w.mismatch_count}` : ''; const rejectReason = w.status === 'rejected' && w.reject_reason @@ -394,7 +383,7 @@ function renderWorkerList(workers) {
-
${escHtml(w.worker_name)}${checkedBadge} ${mismatchBadge}
+
${escHtml(w.worker_name)} ${mismatchBadge}
${escHtml(w.department_name)} · ${escHtml(w.job_type)}
diff --git a/system1-factory/web/pages/attendance/monthly-comparison.html b/system1-factory/web/pages/attendance/monthly-comparison.html index d812f0b..4abed0e 100644 --- a/system1-factory/web/pages/attendance/monthly-comparison.html +++ b/system1-factory/web/pages/attendance/monthly-comparison.html @@ -164,7 +164,7 @@ - +