forked from wangziqi/gongxue-base
fix: I2 add studentNo to class listing, I4 replace attendance edit placeholder with working edit modal
This commit is contained in:
@@ -131,6 +131,31 @@ const AttendancePage: React.FC = () => {
|
|||||||
const [studentSearchResults, setStudentSearchResults] = useState<{ id: number; name: string }[]>([]);
|
const [studentSearchResults, setStudentSearchResults] = useState<{ id: number; name: string }[]>([]);
|
||||||
const [studentSearchLoading, setStudentSearchLoading] = useState(false);
|
const [studentSearchLoading, setStudentSearchLoading] = useState(false);
|
||||||
|
|
||||||
|
// Edit modal
|
||||||
|
const [editModalOpen, setEditModalOpen] = useState(false);
|
||||||
|
const [editRecord, setEditRecord] = useState<AttendanceRecordItem | null>(null);
|
||||||
|
const [editForm] = Form.useForm();
|
||||||
|
|
||||||
|
|
||||||
|
// ── Edit record ──
|
||||||
|
const handleEdit = (record: AttendanceRecordItem) => {
|
||||||
|
setEditRecord(record);
|
||||||
|
editForm.setFieldsValue({ session: record.session, status: record.status, remark: record.remark });
|
||||||
|
setEditModalOpen(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleEditSubmit = async () => {
|
||||||
|
try {
|
||||||
|
const values = await editForm.validateFields();
|
||||||
|
await api.put(`/attendance-records/${editRecord!.id}`, values);
|
||||||
|
message.success('更新成功');
|
||||||
|
setEditModalOpen(false);
|
||||||
|
fetchRecords();
|
||||||
|
} catch (e: any) {
|
||||||
|
message.error(e?.message || '更新失败');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// ── Fetch classes ──
|
// ── Fetch classes ──
|
||||||
const fetchClasses = useCallback(async () => {
|
const fetchClasses = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
@@ -343,7 +368,7 @@ const AttendancePage: React.FC = () => {
|
|||||||
width: 80,
|
width: 80,
|
||||||
fixed: 'right' as const,
|
fixed: 'right' as const,
|
||||||
render: (_: unknown, record: AttendanceRecordItem) => (
|
render: (_: unknown, record: AttendanceRecordItem) => (
|
||||||
<PermissionButton permission="attendance:edit" size="small" onClick={() => message.info('编辑功能开发中')}>
|
<PermissionButton permission="attendance:edit" size="small" onClick={() => handleEdit(record)}>
|
||||||
编辑
|
编辑
|
||||||
</PermissionButton>
|
</PermissionButton>
|
||||||
),
|
),
|
||||||
@@ -625,6 +650,22 @@ const AttendancePage: React.FC = () => {
|
|||||||
</Form.Item>
|
</Form.Item>
|
||||||
</Form>
|
</Form>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
||||||
|
{/* ── Edit modal ── */}
|
||||||
|
<Modal title="编辑考勤" open={editModalOpen} onOk={handleEditSubmit} onCancel={() => setEditModalOpen(false)}>
|
||||||
|
<Form form={editForm} layout="vertical">
|
||||||
|
<Form.Item name="session" label="时段" rules={[{ required: true }]}>
|
||||||
|
<Select options={SESSION_OPTIONS.map((s) => ({ value: s.value, label: s.label }))} />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item name="status" label="状态" rules={[{ required: true }]}>
|
||||||
|
<Select options={STATUS_OPTIONS} />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item name="remark" label="备注">
|
||||||
|
<Input.TextArea rows={2} />
|
||||||
|
</Form.Item>
|
||||||
|
</Form>
|
||||||
|
</Modal>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ export class ClassesService {
|
|||||||
id: s.id,
|
id: s.id,
|
||||||
studentId: s.studentId,
|
studentId: s.studentId,
|
||||||
studentName: s.student?.name,
|
studentName: s.student?.name,
|
||||||
|
studentNo: s.student?.studentNo,
|
||||||
joinDate: s.joinDate,
|
joinDate: s.joinDate,
|
||||||
leaveDate: s.leaveDate,
|
leaveDate: s.leaveDate,
|
||||||
status: s.status,
|
status: s.status,
|
||||||
|
|||||||
Reference in New Issue
Block a user