fix: align permission navigation and page access

This commit is contained in:
2026-07-11 14:55:49 +08:00
parent 1e1c476bc3
commit b6fca99390
27 changed files with 434 additions and 49 deletions

View File

@@ -34,6 +34,7 @@ import {
import dayjs, { Dayjs } from 'dayjs';
import api from '../../api';
import PermissionButton from '../../components/PermissionButton';
import { usePermission } from '../../hooks/usePermission';
import { message } from '../../ui/app-message';
import {
buildSchedulePayload,
@@ -99,6 +100,7 @@ const WEEKDAY_NUMBERS = [1, 2, 3, 4, 5, 6, 7];
// ---- Component ----
const SchedulesPage: React.FC = () => {
const { hasPermission } = usePermission();
// View mode and navigation
const [viewMode, setViewMode] = useState<'week' | 'month'>('week');
const [viewDate, setViewDate] = useState<Dayjs>(() => dayjs().weekday(1).startOf('day'));
@@ -235,9 +237,8 @@ const SchedulesPage: React.FC = () => {
const fetchData = useCallback(async () => {
setLoading(true);
try {
const [classroomsRes, classesRes, schedulesRes] = await Promise.all([
api.get('/classrooms') as Promise<ClassroomItem[]>,
api.get('/classes') as Promise<ClassItem[]>,
const [lookups, schedulesRes] = await Promise.all([
api.get('/class-schedules/lookups') as Promise<{ classrooms: ClassroomItem[]; classes: ClassItem[] }>,
api.get('/class-schedules/weekly', {
params: {
startDate: startDateStr,
@@ -247,8 +248,8 @@ const SchedulesPage: React.FC = () => {
}) as Promise<Record<string, Record<string, ClassScheduleItem[]>>>,
]);
setClassrooms(classroomsRes);
setClasses(classesRes);
setClassrooms(lookups.classrooms);
setClasses(lookups.classes);
// Convert string keys to numbers
const typedMatrix: Record<number, Record<number, ClassScheduleItem[]>> = {};
@@ -326,7 +327,7 @@ const SchedulesPage: React.FC = () => {
setSelectedSchedules(schedules);
setModalMode('detail');
setModalOpen(true);
} else {
} else if (hasPermission('schedule:create')) {
setSelectedSchedules([]);
setEditingSchedule(null);
setModalMode('create');
@@ -948,7 +949,8 @@ const SchedulesPage: React.FC = () => {
}}
>
<span style={{ fontWeight: 500 }}></span>
<Button
<PermissionButton
permission="schedule:create"
type="primary"
icon={<PlusOutlined />}
onClick={() => {
@@ -964,7 +966,7 @@ const SchedulesPage: React.FC = () => {
}}
>
</Button>
</PermissionButton>
</div>
{selectedSchedules.length === 0 ? (
<Empty description="该时段暂无排课" />