/* eslint-disable @next/next/no-img-element */ import Modal from "@/components/Modal"; import useStats from "@/hooks/useStats"; import useUsers from "@/hooks/useUsers"; import {CorporateUser, Group, MasterCorporateUser, Stat, User} from "@/interfaces/user"; import UserList from "@/pages/(admin)/Lists/UserList"; import {dateSorter} from "@/utils"; import moment from "moment"; import {useEffect, useState} from "react"; import { BsArrowLeft, BsClipboard2Data, BsClock, BsPaperclip, BsPersonFill, BsPencilSquare, BsPersonCheck, BsPeople, BsBank, BsEnvelopePaper, BsArrowRepeat, BsPlus, BsPersonFillGear, } from "react-icons/bs"; import UserCard from "@/components/UserCard"; import useGroups from "@/hooks/useGroups"; import {averageLevelCalculator, calculateAverageLevel, calculateBandScore} from "@/utils/score"; import {MODULE_ARRAY} from "@/utils/moduleUtils"; import {Module} from "@/interfaces"; import {groupByExam} from "@/utils/stats"; import IconCard from "./IconCard"; import GroupList from "@/pages/(admin)/Lists/GroupList"; import useFilterStore from "@/stores/listFilterStore"; import {useRouter} from "next/router"; import useCodes from "@/hooks/useCodes"; import useAssignments from "@/hooks/useAssignments"; import {Assignment} from "@/interfaces/results"; import AssignmentView from "./AssignmentView"; import AssignmentCreator from "./AssignmentCreator"; import clsx from "clsx"; import AssignmentCard from "./AssignmentCard"; import {createColumn, createColumnHelper} from "@tanstack/react-table"; import List from "@/components/List"; import {getUserCorporate} from "@/utils/groups"; import {getCorporateUser, getUserCompanyName} from "@/resources/user"; import {Switch} from "@headlessui/react"; import Checkbox from "@/components/Low/Checkbox"; import {uniq, uniqBy} from "lodash"; import Select from "@/components/Low/Select"; interface Props { user: MasterCorporateUser; } type StudentPerformanceItem = User & {corporate?: CorporateUser; group?: Group}; const StudentPerformanceList = ({items, stats, users, groups}: {items: StudentPerformanceItem[]; stats: Stat[]; users: User[]; groups: Group[]}) => { const [isShowingAmount, setIsShowingAmount] = useState(false); const [availableCorporates] = useState( uniqBy( items.map((x) => x.corporate), "id", ), ); const [selectedCorporate, setSelectedCorporate] = useState(null); const columnHelper = createColumnHelper(); const columns = [ columnHelper.accessor("name", { header: "Student Name", cell: (info) => info.getValue(), }), columnHelper.accessor("email", { header: "E-mail", cell: (info) => info.getValue(), }), columnHelper.accessor("demographicInformation.passport_id", { header: "ID", cell: (info) => info.getValue() || "N/A", }), columnHelper.accessor("group", { header: "Group", cell: (info) => info.getValue()?.name || "N/A", }), columnHelper.accessor("corporate", { header: "Corporate", cell: (info) => (!!info.getValue() ? getUserCompanyName(info.getValue() as User, users, groups) : "N/A"), }), columnHelper.accessor("levels.reading", { header: "Reading", cell: (info) => !isShowingAmount ? calculateBandScore( stats .filter((x) => x.module === "reading" && x.user === info.row.original.id) .reduce((acc, curr) => acc + curr.score.correct, 0), stats .filter((x) => x.module === "reading" && x.user === info.row.original.id) .reduce((acc, curr) => acc + curr.score.total, 0), "level", info.row.original.focus || "academic", ) || 0 : `${Object.keys(groupByExam(stats.filter((x) => x.module === "reading" && x.user === info.row.original.id))).length} exams`, }), columnHelper.accessor("levels.listening", { header: "Listening", cell: (info) => !isShowingAmount ? calculateBandScore( stats .filter((x) => x.module === "listening" && x.user === info.row.original.id) .reduce((acc, curr) => acc + curr.score.correct, 0), stats .filter((x) => x.module === "listening" && x.user === info.row.original.id) .reduce((acc, curr) => acc + curr.score.total, 0), "level", info.row.original.focus || "academic", ) || 0 : `${Object.keys(groupByExam(stats.filter((x) => x.module === "listening" && x.user === info.row.original.id))).length} exams`, }), columnHelper.accessor("levels.writing", { header: "Writing", cell: (info) => !isShowingAmount ? calculateBandScore( stats .filter((x) => x.module === "writing" && x.user === info.row.original.id) .reduce((acc, curr) => acc + curr.score.correct, 0), stats .filter((x) => x.module === "writing" && x.user === info.row.original.id) .reduce((acc, curr) => acc + curr.score.total, 0), "level", info.row.original.focus || "academic", ) || 0 : `${Object.keys(groupByExam(stats.filter((x) => x.module === "writing" && x.user === info.row.original.id))).length} exams`, }), columnHelper.accessor("levels.speaking", { header: "Speaking", cell: (info) => !isShowingAmount ? calculateBandScore( stats .filter((x) => x.module === "speaking" && x.user === info.row.original.id) .reduce((acc, curr) => acc + curr.score.correct, 0), stats .filter((x) => x.module === "speaking" && x.user === info.row.original.id) .reduce((acc, curr) => acc + curr.score.total, 0), "level", info.row.original.focus || "academic", ) || 0 : `${Object.keys(groupByExam(stats.filter((x) => x.module === "speaking" && x.user === info.row.original.id))).length} exams`, }), columnHelper.accessor("levels.level", { header: "Level", cell: (info) => !isShowingAmount ? calculateBandScore( stats .filter((x) => x.module === "level" && x.user === info.row.original.id) .reduce((acc, curr) => acc + curr.score.correct, 0), stats .filter((x) => x.module === "level" && x.user === info.row.original.id) .reduce((acc, curr) => acc + curr.score.total, 0), "level", info.row.original.focus || "academic", ) || 0 : `${Object.keys(groupByExam(stats.filter((x) => x.module === "level" && x.user === info.row.original.id))).length} exams`, }), columnHelper.accessor("levels", { id: "overall_level", header: "Overall", cell: (info) => !isShowingAmount ? averageLevelCalculator( users, stats.filter((x) => x.user === info.row.original.id), ).toFixed(1) : `${Object.keys(groupByExam(stats.filter((x) => x.user === info.row.original.id))).length} exams`, }), ]; const filterUsers = (data: StudentPerformanceItem[]) => { console.log(data, selectedCorporate); const filterByCorporate = (item: StudentPerformanceItem) => item.corporate?.id === selectedCorporate?.id; const filters: ((item: StudentPerformanceItem) => boolean)[] = []; if (selectedCorporate !== null) filters.push(filterByCorporate); return filters.reduce((d, f) => d.filter(f), data); }; return (