feat(admin): 弹窗未保存内容保护与空状态引导扩展
- 新增 useDirtyGuard hook:关闭弹窗时若表单被修改,先确认再关闭 - 接入 17 个弹窗:账号/密码/档案、角色、教室、宿舍/床位/柜子、 考勤机、机构、班级、教师、考试、排课、入住/退宿/换房、费用 (子组件弹窗用 useEffect 在回填后快照,时序正确) - 学生列表空状态带「添加学生」引导动作 - 排课创建成功提示「同步钉钉」,考试创建成功提示「去详情录成绩」 aislop scan: 5 引擎 0 issues
This commit is contained in:
@@ -11,6 +11,7 @@ import PermissionButton from '../components/PermissionButton';
|
||||
import EditableCell from '../components/EditableCell';
|
||||
import { QueryErrorState } from '../components/QueryState';
|
||||
import { message } from '../ui/app-message';
|
||||
import { useDirtyGuard } from '../hooks/useDirtyGuard';
|
||||
|
||||
interface ClassroomOption {
|
||||
id: number;
|
||||
@@ -40,6 +41,7 @@ const AttendanceDevicesPage: React.FC = () => {
|
||||
const [saving, setSaving] = useState(false);
|
||||
const [keyword, setKeyword] = useState('');
|
||||
const [form] = Form.useForm();
|
||||
const formGuard = useDirtyGuard(form);
|
||||
|
||||
const {
|
||||
data: fetchResult = { devices: [], classrooms: [] },
|
||||
@@ -107,6 +109,7 @@ const AttendanceDevicesPage: React.FC = () => {
|
||||
setEditing(null);
|
||||
form.resetFields();
|
||||
form.setFieldsValue({ status: 'active' });
|
||||
formGuard.snapshot();
|
||||
setModalOpen(true);
|
||||
};
|
||||
|
||||
@@ -120,6 +123,7 @@ const AttendanceDevicesPage: React.FC = () => {
|
||||
location: record.location,
|
||||
notes: record.notes,
|
||||
});
|
||||
formGuard.snapshot();
|
||||
setModalOpen(true);
|
||||
};
|
||||
|
||||
@@ -325,10 +329,12 @@ const AttendanceDevicesPage: React.FC = () => {
|
||||
title={editing ? '编辑考勤机绑定' : '添加考勤机绑定'}
|
||||
open={modalOpen}
|
||||
onOk={handleSave}
|
||||
onCancel={() => {
|
||||
setModalOpen(false);
|
||||
setEditing(null);
|
||||
}}
|
||||
onCancel={() =>
|
||||
formGuard.confirmClose(() => {
|
||||
setModalOpen(false);
|
||||
setEditing(null);
|
||||
})
|
||||
}
|
||||
confirmLoading={saving}
|
||||
okText="保存"
|
||||
>
|
||||
|
||||
Reference in New Issue
Block a user