diff --git a/frontend/src/pages/AccessConsolePage.tsx b/frontend/src/pages/AccessConsolePage.tsx index e40fbf2..bb1c56f 100644 --- a/frontend/src/pages/AccessConsolePage.tsx +++ b/frontend/src/pages/AccessConsolePage.tsx @@ -6,9 +6,26 @@ import { searchApprovedForCheckIn, } from '../api'; import { AccessRecord, VisitRequestView } from '../types'; -import { formatShort } from '../status'; +import { STATUS_CLASS, STATUS_LABEL, formatShort } from '../status'; import { VisitRequestDetailDialog } from '../components/VisitRequestDetailDialog'; +const hasEnteredToday = (r: AccessRecord) => Boolean(r.checkInAt); +const hasExitedToday = (r: AccessRecord) => Boolean(r.checkOutAt); + +function accessBadge(record: AccessRecord): { className: string; label: string } { + if (record.inside) { + return { className: 'green', label: '재실중' }; + } + if (hasExitedToday(record)) { + return { className: 'gray', label: '퇴실' }; + } + const status = record.status ?? 'APPROVED'; + if (status === 'APPROVED') { + return { className: 'amber', label: '입장대기' }; + } + return { className: STATUS_CLASS[status], label: STATUS_LABEL[status] }; +} + /** * Staff access console (login: 담당자/보안/관리자). Name search → force check-in/out, * plus today's full access log (신청 입/퇴장 + 실제 입/퇴장, 퇴실자 포함). @@ -36,7 +53,7 @@ export const AccessConsolePage: React.FC = () => { const insideIds = new Set(records.filter((r) => r.inside).map((r) => r.visitRequestId)); // Entered and already left today → no re-entry allowed. - const exitedIds = new Set(records.filter((r) => !r.inside).map((r) => r.visitRequestId)); + const exitedIds = new Set(records.filter(hasExitedToday).map((r) => r.visitRequestId)); const wrap = async (fn: () => Promise) => { setError(null); @@ -184,12 +201,13 @@ export const AccessConsolePage: React.FC = () => { {formatShort(r.checkInAt)} {formatShort(r.checkOutAt)} - - {r.inside ? '재실중' : '퇴실'} - + {(() => { + const badge = accessBadge(r); + return {badge.label}; + })()} - {r.inside && ( + {r.inside && hasEnteredToday(r) && (