diff --git a/apps/admin/src/pages/Deposits/deposit-student-option.integration.test.ts b/apps/admin/src/pages/Deposits/deposit-student-option.integration.test.ts new file mode 100644 index 0000000..b876ebe --- /dev/null +++ b/apps/admin/src/pages/Deposits/deposit-student-option.integration.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from 'vitest'; +import { buildDepositStudentOption } from './deposit-student-option'; + +describe('deposit student option', () => { + it('uses the student number as the non-sensitive identifier', () => { + expect( + buildDepositStudentOption({ id: 23, name: '张三', studentNo: 'S2026001' }), + ).toEqual({ + value: 23, + label: '张三 (S2026001)', + }); + }); + + it('falls back to the internal id when the student number is missing', () => { + expect(buildDepositStudentOption({ id: 23, name: '张三', studentNo: null })).toEqual({ + value: 23, + label: '张三 (#23)', + }); + }); +}); diff --git a/apps/admin/src/pages/Deposits/deposit-student-option.ts b/apps/admin/src/pages/Deposits/deposit-student-option.ts new file mode 100644 index 0000000..732d6b2 --- /dev/null +++ b/apps/admin/src/pages/Deposits/deposit-student-option.ts @@ -0,0 +1,10 @@ +export interface DepositStudentLookup { + id: number; + name: string; + studentNo?: string | null; +} + +export const buildDepositStudentOption = (student: DepositStudentLookup) => ({ + value: student.id, + label: `${student.name} (${student.studentNo || `#${student.id}`})`, +}); diff --git a/apps/admin/src/pages/Deposits/index.tsx b/apps/admin/src/pages/Deposits/index.tsx index 16c29c0..3ddc854 100644 --- a/apps/admin/src/pages/Deposits/index.tsx +++ b/apps/admin/src/pages/Deposits/index.tsx @@ -19,6 +19,7 @@ import dayjs from 'dayjs'; import api from '../../api'; import PermissionButton from '../../components/PermissionButton'; import { message } from '../../ui/app-message'; +import { buildDepositStudentOption } from './deposit-student-option'; const statusMap: Record = { paid: { text: '已缴', color: 'green' }, @@ -90,10 +91,8 @@ const DepositsPage: React.FC = () => { const studentOptions = useMemo( () => students - .map((s: any) => ({ - value: s.id, - label: s.studentNo ? `${s.name} (${s.studentNo})` : s.name, - })), + .filter((s: any) => s.status === 'active') + .map(buildDepositStudentOption), [students], );