fix permissions and teacher attendance workflows

This commit is contained in:
2026-07-10 20:40:52 +08:00
parent 247879f276
commit 8ed1682b90
95 changed files with 4745 additions and 1237 deletions

View File

@@ -2,13 +2,14 @@ import React, { useEffect, useState, useCallback } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import {
Card, Tabs, Descriptions, Table, Button, Space, Select, Modal, Tag,
Popconfirm, message, Form, Input, DatePicker, InputNumber, Row, Col, Statistic,
Popconfirm, Form, Input, DatePicker, InputNumber, Row, Col, Statistic,
} from 'antd';
import type { ColumnsType } from 'antd/es/table';
import { ArrowLeftOutlined, PlusOutlined, DownloadOutlined } from '@ant-design/icons';
import dayjs from 'dayjs';
import api from '../../api';
import PermissionButton from '../../components/PermissionButton';
import { message } from '../../ui/app-message';
// ---- Types ----
@@ -317,7 +318,7 @@ const ClassDetailPage: React.FC = () => {
title: '操作',
render: (_: unknown, r: ClassStudent) => (
<Popconfirm title="确认移除?" onConfirm={() => handleRemoveStudent(r.studentId)}>
<Button size="small" danger></Button>
<PermissionButton permission="class:edit" size="small" danger></PermissionButton>
</Popconfirm>
),
},
@@ -339,7 +340,7 @@ const ClassDetailPage: React.FC = () => {
title: '操作',
render: (_: unknown, r: ClassTeacher) => (
<Popconfirm title="确认移除?" onConfirm={() => handleRemoveTeacher(r.userId)}>
<Button size="small" danger></Button>
<PermissionButton permission="class:edit" size="small" danger></PermissionButton>
</Popconfirm>
),
},
@@ -430,9 +431,9 @@ const ClassDetailPage: React.FC = () => {
<Input.TextArea rows={3} />
</Form.Item>
<Space>
<Button type="primary" onClick={handleSaveInfo}>
<PermissionButton permission="class:edit" type="primary" onClick={handleSaveInfo}>
</Button>
</PermissionButton>
<Button onClick={() => setEditingInfo(false)}></Button>
</Space>
</Form>
@@ -443,10 +444,10 @@ const ClassDetailPage: React.FC = () => {
{TYPE_MAP[detail.classType]}
</Descriptions.Item>
<Descriptions.Item label="开班日期">
{detail.startDate || '-'}
{detail.startDate ? dayjs(detail.startDate).format('YYYY-MM-DD') : '-'}
</Descriptions.Item>
<Descriptions.Item label="结课日期">
{detail.endDate || '-'}
{detail.endDate ? dayjs(detail.endDate).format('YYYY-MM-DD') : '-'}
</Descriptions.Item>
<Descriptions.Item label="学员">
{detail.studentCount}/{detail.maxStudents || '-'}
@@ -487,14 +488,15 @@ const ClassDetailPage: React.FC = () => {
label: `花名册 (${students.filter((s) => s.status === 'active').length})`,
children: (
<div>
<Button
<PermissionButton
permission="class:edit"
icon={<PlusOutlined />}
type="primary"
onClick={openStudentModal}
style={{ marginBottom: 16, marginRight: 8 }}
>
</Button>
</PermissionButton>
<PermissionButton
permission="class:view"
icon={<DownloadOutlined />}
@@ -556,14 +558,15 @@ const ClassDetailPage: React.FC = () => {
label: `教师 (${teachers.length})`,
children: (
<div>
<Button
<PermissionButton
permission="class:edit"
icon={<PlusOutlined />}
type="primary"
onClick={openTeacherModal}
style={{ marginBottom: 16 }}
>
</Button>
</PermissionButton>
<Table<ClassTeacher>
columns={teacherColumns}
dataSource={teachers}

View File

@@ -1,7 +1,7 @@
import React, { useEffect, useState, useMemo, useCallback } from 'react';
import {
Table, Button, Input, Select, Space, Tag, Modal, Form, InputNumber,
DatePicker, Popconfirm, message, Card, Switch, Empty,
DatePicker, Popconfirm, Card, Switch, Empty,
} from 'antd';
import type { ColumnsType } from 'antd/es/table';
import { PlusOutlined, SearchOutlined, TeamOutlined, InboxOutlined } from '@ant-design/icons';
@@ -9,6 +9,7 @@ import { useNavigate } from 'react-router-dom';
import dayjs from 'dayjs';
import api from '../../api';
import PermissionButton from '../../components/PermissionButton';
import { message } from '../../ui/app-message';
// ---- Types ----