feat: improve admin responsive pages and teacher candidates

This commit is contained in:
2026-07-15 13:56:46 +08:00
parent fb9697bd05
commit d582d641c0
14 changed files with 406 additions and 87 deletions

View File

@@ -0,0 +1,44 @@
export interface TeacherCandidateRole {
code?: string | null;
name: string;
}
export interface TeacherCandidateUser {
id: number;
username: string;
name?: string | null;
isActive: boolean;
isArchived: boolean;
studentStatus?: string | null;
roles?: TeacherCandidateRole[];
profile?: { subjects?: string[] } | null;
}
const isSuperAdminRole = (role: TeacherCandidateRole) =>
role.code === 'super_admin' || role.name === '超级管理员' || role.name === '超管';
export const isTeacherCandidate = (user: TeacherCandidateUser) => {
if (!user.isActive || user.isArchived) return false;
if (user.studentStatus && user.studentStatus !== 'staff') return false;
return !(user.roles || []).some(isSuperAdminRole);
};
export const buildTeacherCandidateLabel = (user: TeacherCandidateUser) => {
const displayName = user.name?.trim();
const identity =
displayName && displayName !== user.username
? `${displayName}${user.username}`
: user.username;
const roleNames = [...new Set((user.roles || []).map((role) => role.name).filter(Boolean))];
const subjects = [
...new Set((user.profile?.subjects || []).map((subject) => subject.trim()).filter(Boolean)),
];
return [identity, roleNames.join('/'), subjects.join('/')].filter(Boolean).join(' · ');
};
export const buildTeacherCandidateOptions = (users: TeacherCandidateUser[]) =>
users.filter(isTeacherCandidate).map((user) => ({
value: user.id,
label: buildTeacherCandidateLabel(user),
}));