feat: add exam score management
This commit is contained in:
@@ -81,10 +81,12 @@ interface EnrollmentRecord {
|
||||
|
||||
interface ExamScoreRecord {
|
||||
id: number;
|
||||
examId?: number;
|
||||
exam?: { class?: { name?: string } };
|
||||
examType: string;
|
||||
examName?: string;
|
||||
subject: string;
|
||||
score: number;
|
||||
score: number | null;
|
||||
classAvg?: number;
|
||||
rank?: number;
|
||||
examDate?: string;
|
||||
@@ -865,6 +867,7 @@ const ExamScoresTab: React.FC<
|
||||
editor="select"
|
||||
options={EXAM_TYPE_OPTIONS}
|
||||
permission="student:edit"
|
||||
disabled={!!r.examId}
|
||||
required
|
||||
onSave={(next) => saveCell(r, 'examType', next)}
|
||||
>
|
||||
@@ -879,6 +882,7 @@ const ExamScoresTab: React.FC<
|
||||
<EditableCell
|
||||
value={v}
|
||||
permission="student:edit"
|
||||
disabled={!!r.examId}
|
||||
onSave={(next) => saveCell(r, 'examName', next)}
|
||||
>
|
||||
{v || '-'}
|
||||
@@ -893,6 +897,7 @@ const ExamScoresTab: React.FC<
|
||||
value={v}
|
||||
required
|
||||
permission="student:edit"
|
||||
disabled={!!r.examId}
|
||||
onSave={(next) => saveCell(r, 'subject', next)}
|
||||
>
|
||||
{v}
|
||||
@@ -902,16 +907,16 @@ const ExamScoresTab: React.FC<
|
||||
{
|
||||
title: '成绩',
|
||||
dataIndex: 'score',
|
||||
render: (v: number, r) => (
|
||||
render: (v: number | null, r) => (
|
||||
<EditableCell
|
||||
value={v}
|
||||
value={v ?? undefined}
|
||||
editor="number"
|
||||
min={0}
|
||||
required
|
||||
permission="student:edit"
|
||||
disabled={!!r.examId}
|
||||
onSave={(next) => saveCell(r, 'score', next)}
|
||||
>
|
||||
{v}
|
||||
{v ?? '-'}
|
||||
</EditableCell>
|
||||
),
|
||||
},
|
||||
@@ -924,6 +929,7 @@ const ExamScoresTab: React.FC<
|
||||
editor="number"
|
||||
min={0}
|
||||
permission="student:edit"
|
||||
disabled={!!r.examId}
|
||||
onSave={(next) => saveCell(r, 'classAvg', next)}
|
||||
>
|
||||
{v !== undefined ? v : '-'}
|
||||
@@ -939,6 +945,7 @@ const ExamScoresTab: React.FC<
|
||||
editor="number"
|
||||
min={1}
|
||||
permission="student:edit"
|
||||
disabled={!!r.examId}
|
||||
onSave={(next) => saveCell(r, 'rank', next)}
|
||||
>
|
||||
{v !== undefined ? v : '-'}
|
||||
@@ -953,6 +960,7 @@ const ExamScoresTab: React.FC<
|
||||
value={v}
|
||||
editor="date"
|
||||
permission="student:edit"
|
||||
disabled={!!r.examId}
|
||||
onSave={(next) => saveCell(r, 'examDate', next)}
|
||||
>
|
||||
{v || '-'}
|
||||
@@ -971,9 +979,11 @@ const ExamScoresTab: React.FC<
|
||||
label: formatEnrollmentDisplayName(item),
|
||||
}))}
|
||||
permission="student:edit"
|
||||
disabled={!!r.examId}
|
||||
onSave={(next) => saveCell(r, 'enrollmentId', next)}
|
||||
>
|
||||
{(() => {
|
||||
if (r.examId) return r.exam?.class?.name || '-';
|
||||
if (v === undefined) return '-';
|
||||
const enr = enrollments.find((e) => e.id === v);
|
||||
return enr ? formatEnrollmentDisplayName(enr) : String(v);
|
||||
|
||||
Reference in New Issue
Block a user