forked from wangziqi/gongxue-base
44 lines
1.4 KiB
TypeScript
44 lines
1.4 KiB
TypeScript
export interface TeacherCandidateRole {
|
||
code?: string | null;
|
||
name: string;
|
||
}
|
||
|
||
export interface TeacherCandidateUser {
|
||
id: number;
|
||
username: string;
|
||
name?: string | null;
|
||
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.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),
|
||
}));
|