(onClose);
+ const added = record.addedCount;
+ const reason = record.reason?.trim();
+
+ return (
+
+
event.stopPropagation()}
+ >
+
+ {record.name}
+
+
+ {record.studentId} · {roomLabel(record.roomNumber)}
+
+
+
+
+ 추가된 봉사 횟수
+
+
+ {added === undefined ? "-" : `${added > 0 ? "+" : ""}${added}회`}
+
+
+
+
+
+ 사유
+
+
+ {reason || (
+
+ 입력한 사유가 없습니다.
+
+ )}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/web/src/components/admin/VolunteerDutyRow.tsx b/web/src/components/admin/VolunteerDutyRow.tsx
index 954d99b..b2162ec 100644
--- a/web/src/components/admin/VolunteerDutyRow.tsx
+++ b/web/src/components/admin/VolunteerDutyRow.tsx
@@ -5,6 +5,8 @@ type VolunteerDutyRowProps = {
student: RosterStudent;
onComplete: (studentId: string) => void;
onCancel: (studentId: string) => void;
+ /** 봉사를 하지 않고 사라진 학생. 횟수 추가·사유 다이얼로그를 연다(#334). */
+ onMissed: (studentId: string) => void;
};
/**
@@ -16,6 +18,7 @@ export function VolunteerDutyRow({
student,
onComplete,
onCancel,
+ onMissed,
}: VolunteerDutyRowProps) {
return (
@@ -39,6 +42,14 @@ export function VolunteerDutyRow({
>
완료
+