diff --git a/src/dashboards/Admin.tsx b/src/dashboards/Admin.tsx index 105927eb..4ceb0751 100644 --- a/src/dashboards/Admin.tsx +++ b/src/dashboards/Admin.tsx @@ -51,8 +51,7 @@ export default function AdminDashboard({user}: Props) { // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(reload, [page]); - const inactiveCountryManagerFilter = (x: User) => - x.type === "agent" && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate)); + const inactiveCountryManagerFilter = (x: User) => x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate); const UserDisplay = (displayUser: User) => (
{ const filter = (x: User) => - x.type === "student" && - (!!selectedUser + !!selectedUser ? groups .filter((g) => g.admin === selectedUser.id || g.participants.includes(selectedUser.id)) .flatMap((g) => g.participants) .includes(x.id) - : true); + : true; return ( (
@@ -101,17 +100,17 @@ export default function AdminDashboard({user}: Props) { const TeachersList = () => { const filter = (x: User) => - x.type === "teacher" && - (!!selectedUser + !!selectedUser ? groups .filter((g) => g.admin === selectedUser.id || g.participants.includes(selectedUser.id)) .flatMap((g) => g.participants) .includes(x.id) || false - : true); + : true; return ( (
@@ -129,12 +128,10 @@ export default function AdminDashboard({user}: Props) { }; const AgentsList = () => { - const filter = (x: User) => x.type === "agent"; - return ( (
( x.type === "corporate"]} + type="corporate" renderHeader={(total) => (
{ const list = paid ? done : pending; - const filter = (x: User) => x.type === "corporate" && list.includes(x.id); + const filter = (x: User) => list.includes(x.id); return ( (
@@ -197,6 +195,7 @@ export default function AdminDashboard({user}: Props) { return ( (
@@ -214,11 +213,12 @@ export default function AdminDashboard({user}: Props) { }; const InactiveStudentsList = () => { - const filter = (x: User) => x.type === "student" && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate)); + const filter = (x: User) => x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate); return ( (
@@ -236,12 +236,13 @@ export default function AdminDashboard({user}: Props) { }; const InactiveCorporateList = () => { - const filter = (x: User) => x.type === "corporate" && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate)); + const filter = (x: User) => x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate); return ( (
(); - const {users, reload, isLoading} = useUsers(); const {groups} = useGroups({admin: user.id}); const {assignments, isLoading: isAssignmentsLoading, reload: reloadAssignments} = useAssignments({corporate: user.id}); const {balance} = useUserBalance(); + const {users: students, reload: reloadStudents, isLoading: isStudentsLoading} = useUsers({type: "student"}); + const {users: teachers, reload: reloadTeachers, isLoading: isTeachersLoading} = useUsers({type: "teacher"}); + const appendUserFilters = useFilterStore((state) => state.appendUserFilter); const router = useRouter(); @@ -173,26 +175,21 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) { const assignmentsUsers = useMemo( () => - users.filter( - (x) => - (x.type === "student" || x.type === "teacher") && - (!!selectedUser - ? groups - .filter((g) => g.admin === selectedUser.id) - .flatMap((g) => g.participants) - .includes(x.id) || false - : groups.flatMap((g) => g.participants).includes(x.id)), + [...teachers, ...students].filter((x) => + !!selectedUser + ? groups + .filter((g) => g.admin === selectedUser.id) + .flatMap((g) => g.participants) + .includes(x.id) || false + : groups.flatMap((g) => g.participants).includes(x.id), ), - [groups, users, selectedUser], + [groups, teachers, students, selectedUser], ); useEffect(() => { setShowModal(!!selectedUser && router.asPath === "/#"); }, [selectedUser, router.asPath]); - const studentFilter = (user: User) => user.type === "student" && groups.flatMap((g) => g.participants).includes(user.id); - const teacherFilter = (user: User) => user.type === "teacher" && groups.flatMap((g) => g.participants).includes(user.id); - const getStatsByStudent = (user: User) => stats.filter((s) => s.user === user.id); const UserDisplay = (displayUser: User) => ( @@ -228,13 +225,11 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) { }; const StudentPerformancePage = () => { - const students = users - .filter((x) => x.type === "student" && groups.flatMap((g) => g.participants).includes(x.id)) - .map((u) => ({ - ...u, - group: groups.find((x) => x.participants.includes(u.id))?.name || "N/A", - corporateName: getUserCompanyName(u, users, groups), - })); + const performanceStudents = students.map((u) => ({ + ...u, + group: groups.find((x) => x.participants.includes(u.id))?.name || "N/A", + corporateName: getUserCompanyName(user, [], groups), + })); return ( <> @@ -246,13 +241,13 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) { Back
Reload - +
- + ); }; @@ -260,7 +255,7 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) { const averageLevelCalculator = (studentStats: Stat[]) => { const formattedStats = studentStats .map((s) => ({ - focus: users.find((u) => u.id === s.user)?.focus, + focus: students.find((u) => u.id === s.user)?.focus, score: s.score, module: s.module, })) @@ -292,16 +287,18 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) {
router.push("/#students")} + isLoading={isStudentsLoading} Icon={BsPersonFill} label="Students" - value={users.filter(studentFilter).length} + value={students.length} color="purple" /> router.push("/#teachers")} + isLoading={isTeachersLoading} Icon={BsPencilSquare} label="Teachers" - value={users.filter(teacherFilter).length} + value={teachers.length} color="purple" /> groups.flatMap((g) => g.participants).includes(s.user))).toFixed(1)} color="purple" @@ -331,8 +329,9 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) { /> router.push("/#studentsPerformance")} /> @@ -354,8 +353,7 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) {
Latest students
- {users - .filter(studentFilter) + {students .sort((a, b) => dateSorter(a, b, "desc", "registrationDate")) .map((x) => ( @@ -365,8 +363,7 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) {
Latest teachers
- {users - .filter(teacherFilter) + {teachers .sort((a, b) => dateSorter(a, b, "desc", "registrationDate")) .map((x) => ( @@ -376,8 +373,7 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) {
Highest level students
- {users - .filter(studentFilter) + {students .sort((a, b) => calculateAverageLevel(b.levels) - calculateAverageLevel(a.levels)) .map((x) => ( @@ -387,8 +383,7 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) {
Highest exam count students
- {users - .filter(studentFilter) + {students .sort( (a, b) => Object.keys(groupByExam(getStatsByStudent(b))).length - Object.keys(groupByExam(getStatsByStudent(a))).length, @@ -412,7 +407,8 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) { loggedInUser={user} onClose={(shouldReload) => { setSelectedUser(undefined); - if (shouldReload) reload(); + if (shouldReload && selectedUser!.type === "student") reloadStudents(); + if (shouldReload && selectedUser!.type === "teacher") reloadTeachers(); }} onViewStudents={ selectedUser.type === "corporate" || selectedUser.type === "teacher" @@ -463,7 +459,7 @@ export default function CorporateDashboard({user, linkedCorporate}: Props) { {router.asPath === "/#students" && ( x.type === "student"]} + type="student" renderHeader={(total) => (
x.type === "teacher"]} + type="teacher" renderHeader={(total) => (
{ }; const CorporateStudentsLevels = () => { - const {users} = useUsers(); - const {groups} = useGroups({}); - - const corporateUsers = users.filter((u) => u.type === "corporate") as User[]; const [corporateId, setCorporateId] = React.useState(""); - const corporate = corporateUsers.find((u) => u.id === corporateId) || corporateUsers[0]; - const groupsFromCorporate = corporate ? groups.filter((g) => g.admin === corporate.id) : []; + const {users: students} = useUsers({type: "student"}); + const {users: corporates} = useUsers({type: "corporate"}); - const groupsParticipants = groupsFromCorporate - .flatMap((g) => g.participants) - .reduce((accm: User[], p) => { - const user = users.find((u) => u.id === p) as User; - if (user) { - return [...accm, user]; - } - return accm; - }, []); + const corporate = useMemo(() => corporates.find((u) => u.id === corporateId) || corporates[0], [corporates, corporateId]); return ( <>