feat(admin): 弹窗未保存内容保护与空状态引导扩展
- 新增 useDirtyGuard hook:关闭弹窗时若表单被修改,先确认再关闭 - 接入 17 个弹窗:账号/密码/档案、角色、教室、宿舍/床位/柜子、 考勤机、机构、班级、教师、考试、排课、入住/退宿/换房、费用 (子组件弹窗用 useEffect 在回填后快照,时序正确) - 学生列表空状态带「添加学生」引导动作 - 排课创建成功提示「同步钉钉」,考试创建成功提示「去详情录成绩」 aislop scan: 5 引擎 0 issues
This commit is contained in:
@@ -6,6 +6,7 @@ import dayjs, { Dayjs } from 'dayjs';
|
||||
import api from '../../api';
|
||||
import PermissionButton from '../../components/PermissionButton';
|
||||
import { QueryErrorState } from '../../components/QueryState';
|
||||
import { NextStepHint } from '../../components/NextStepHint';
|
||||
import { usePermission } from '../../hooks/usePermission';
|
||||
import { useVisibleRefetch } from '../../hooks/usePageVisible';
|
||||
import { message } from '../../ui/app-message';
|
||||
@@ -61,6 +62,8 @@ const SchedulesPage: React.FC = () => {
|
||||
const [submitting, setSubmitting] = useState(false);
|
||||
const [syncModalOpen, setSyncModalOpen] = useState(false);
|
||||
const [syncing, setSyncing] = useState(false);
|
||||
// 排课创建成功后的「下一步:同步钉钉」引导
|
||||
const [syncHint, setSyncHint] = useState(false);
|
||||
const [syncStatus, setSyncStatus] = useState<{
|
||||
activeSchedules: number;
|
||||
mappedClasses: number;
|
||||
@@ -108,8 +111,10 @@ const SchedulesPage: React.FC = () => {
|
||||
message.error(classification.message);
|
||||
} else if (classification.level === 'warning') {
|
||||
message.warning(classification.message);
|
||||
setSyncHint(false);
|
||||
} else {
|
||||
message.success(classification.message);
|
||||
setSyncHint(false);
|
||||
}
|
||||
} catch (e: unknown) {
|
||||
message.error(getErrorMessage(e, '同步失败'));
|
||||
@@ -346,6 +351,7 @@ const SchedulesPage: React.FC = () => {
|
||||
message.success(
|
||||
modalMode === 'edit' ? '排课更新成功,请重新同步到钉钉排班' : '排课创建成功',
|
||||
);
|
||||
if (modalMode === 'create') setSyncHint(true);
|
||||
setModalOpen(false);
|
||||
setEditingSchedule(null);
|
||||
} catch {
|
||||
@@ -416,6 +422,14 @@ const SchedulesPage: React.FC = () => {
|
||||
|
||||
return (
|
||||
<div>
|
||||
{syncHint && (
|
||||
<NextStepHint
|
||||
title="排课已创建"
|
||||
description="同步到钉钉后,教师端与考勤设备才能看到新排课。"
|
||||
action={{ label: '同步钉钉', onClick: () => void handleSyncSchedule() }}
|
||||
onClose={() => setSyncHint(false)}
|
||||
/>
|
||||
)}
|
||||
<div
|
||||
style={{
|
||||
marginBottom: 16,
|
||||
|
||||
Reference in New Issue
Block a user