diff --git a/package.json b/package.json index 9f3dc6db..728946d4 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "@headlessui/react": "^2.1.2", "@mdi/js": "^7.1.96", "@mdi/react": "^1.6.1", - "@next/font": "13.1.6", "@paypal/paypal-js": "^7.1.0", "@paypal/react-paypal-js": "^8.1.3", "@radix-ui/react-icons": "^1.3.0", diff --git a/src/dashboards/AssignmentCard.tsx b/src/dashboards/AssignmentCard.tsx index 1886cedd..720708f7 100644 --- a/src/dashboards/AssignmentCard.tsx +++ b/src/dashboards/AssignmentCard.tsx @@ -11,8 +11,10 @@ import {useAssignmentArchive} from "@/hooks/useAssignmentArchive"; import {uniqBy} from "lodash"; import {useAssignmentUnarchive} from "@/hooks/useAssignmentUnarchive"; import {getUserName} from "@/utils/users"; +import {User} from "@/interfaces/user"; interface Props { + users: User[]; onClick?: () => void; allowDownload?: boolean; reload?: Function; @@ -35,9 +37,8 @@ export default function AssignmentCard({ reload, allowArchive, allowUnarchive, + users, }: Assignment & Props) { - const {users} = useUsers(); - const renderPdfIcon = usePDFDownload("assignments"); const renderArchiveIcon = useAssignmentArchive(id, reload); const renderUnarchiveIcon = useAssignmentUnarchive(id, reload); diff --git a/src/dashboards/Corporate.tsx b/src/dashboards/Corporate.tsx index d0d7099c..eb6a70d5 100644 --- a/src/dashboards/Corporate.tsx +++ b/src/dashboards/Corporate.tsx @@ -339,7 +339,7 @@ export default function CorporateDashboard({user}: Props) {

Active Assignments ({assignments.filter(activeFilter).length})

{assignments.filter(activeFilter).map((a) => ( - setSelectedAssignment(a)} key={a.id} /> + setSelectedAssignment(a)} key={a.id} /> ))}
@@ -355,6 +355,7 @@ export default function CorporateDashboard({user}: Props) { {assignments.filter(futureFilter).map((a) => ( { setSelectedAssignment(a); setIsCreatingAssignment(true); @@ -370,6 +371,7 @@ export default function CorporateDashboard({user}: Props) { {assignments.filter(pastFilter).map((a) => ( setSelectedAssignment(a)} key={a.id} allowDownload @@ -385,6 +387,7 @@ export default function CorporateDashboard({user}: Props) { {assignments.filter(archivedFilter).map((a) => ( setSelectedAssignment(a)} key={a.id} allowDownload diff --git a/src/dashboards/MasterCorporate.tsx b/src/dashboards/MasterCorporate.tsx index 0f00de7b..160f8dea 100644 --- a/src/dashboards/MasterCorporate.tsx +++ b/src/dashboards/MasterCorporate.tsx @@ -46,7 +46,7 @@ import List from "@/components/List"; import {getUserCorporate} from "@/utils/groups"; import {getCorporateUser, getUserCompanyName} from "@/resources/user"; import Checkbox from "@/components/Low/Checkbox"; -import {uniq, uniqBy} from "lodash"; +import {groupBy, uniq, uniqBy} from "lodash"; import Select from "@/components/Low/Select"; import {Menu, MenuButton, MenuItem, MenuItems} from "@headlessui/react"; import {Popover, PopoverContent, PopoverTrigger} from "@/components/ui/popover"; @@ -55,6 +55,12 @@ interface Props { user: MasterCorporateUser; } +const activeFilter = (a: Assignment) => + moment(a.endDate).isAfter(moment()) && moment(a.startDate).isBefore(moment()) && a.assignees.length > a.results.length; +const pastFilter = (a: Assignment) => (moment(a.endDate).isBefore(moment()) || a.assignees.length === a.results.length) && !a.archived; +const archivedFilter = (a: Assignment) => a.archived; +const futureFilter = (a: Assignment) => moment(a.startDate).isAfter(moment()); + 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); @@ -294,6 +300,7 @@ export default function MasterCorporateDashboard({user}: Props) { const [showModal, setShowModal] = useState(false); const [selectedAssignment, setSelectedAssignment] = useState(); const [isCreatingAssignment, setIsCreatingAssignment] = useState(false); + const [corporateAssignments, setCorporateAssignments] = useState<(Assignment & {corporate?: CorporateUser})[]>([]); const {stats} = useStats(); const {users, reload} = useUsers(); @@ -312,6 +319,17 @@ export default function MasterCorporateDashboard({user}: Props) { setShowModal(!!selectedUser && page === ""); }, [selectedUser, page]); + useEffect(() => { + setCorporateAssignments( + assignments.filter(activeFilter).map((a) => ({ + ...a, + corporate: !!users.find((x) => x.id === a.assigner) + ? getCorporateUser(users.find((x) => x.id === a.assigner)!, users, groups) + : undefined, + })), + ); + }, [assignments, groups, users]); + const studentFilter = (user: User) => user.type === "student" && corporateUserGroups.includes(user.id); const teacherFilter = (user: User) => user.type === "teacher" && corporateUserGroups.includes(user.id); @@ -447,12 +465,6 @@ export default function MasterCorporateDashboard({user}: Props) { }; const AssignmentsPage = () => { - const activeFilter = (a: Assignment) => - moment(a.endDate).isAfter(moment()) && moment(a.startDate).isBefore(moment()) && a.assignees.length > a.results.length; - const pastFilter = (a: Assignment) => (moment(a.endDate).isBefore(moment()) || a.assignees.length === a.results.length) && !a.archived; - const archivedFilter = (a: Assignment) => a.archived; - const futureFilter = (a: Assignment) => moment(a.startDate).isAfter(moment()); - return ( <> +
+ Active Assignments Status +
+ + Total: {assignments.filter(activeFilter).reduce((acc, curr) => acc + curr.results.length, 0)}/ + {assignments.filter(activeFilter).reduce((acc, curr) => curr.exams.length + acc, 0)} + + {Object.keys(groupBy(corporateAssignments, (x) => x.corporate?.id)).map((x) => ( +
+ {getUserCompanyName(users.find((u) => u.id === x)!, users, groups)}: + + {groupBy(corporateAssignments, (x) => x.corporate?.id)[x].reduce((acc, curr) => curr.results.length + acc, 0)}/ + {groupBy(corporateAssignments, (x) => x.corporate?.id)[x].reduce((acc, curr) => curr.exams.length + acc, 0)} + +
+ ))} +
+

Active Assignments ({assignments.filter(activeFilter).length})

{assignments.filter(activeFilter).map((a) => ( - setSelectedAssignment(a)} key={a.id} /> + setSelectedAssignment(a)} key={a.id} /> ))}
@@ -519,6 +549,7 @@ export default function MasterCorporateDashboard({user}: Props) { {assignments.filter(futureFilter).map((a) => ( { setSelectedAssignment(a); setIsCreatingAssignment(true); @@ -534,6 +565,7 @@ export default function MasterCorporateDashboard({user}: Props) { {assignments.filter(pastFilter).map((a) => ( setSelectedAssignment(a)} key={a.id} allowDownload @@ -549,6 +581,7 @@ export default function MasterCorporateDashboard({user}: Props) { {assignments.filter(archivedFilter).map((a) => ( setSelectedAssignment(a)} key={a.id} allowDownload diff --git a/src/dashboards/Teacher.tsx b/src/dashboards/Teacher.tsx index 860b74f0..243df376 100644 --- a/src/dashboards/Teacher.tsx +++ b/src/dashboards/Teacher.tsx @@ -63,7 +63,7 @@ export default function TeacherDashboard({user}: Props) { const {stats} = useStats(); const {users, reload} = useUsers(); - const {groups} = useGroups({admin: user.id}); + const {groups} = useGroups({adminAdmins: user.id}); const {permissions} = usePermissions(user.id); const {assignments, isLoading: isAssignmentsLoading, reload: reloadAssignments} = useAssignments({assigner: user.id}); @@ -193,7 +193,7 @@ export default function TeacherDashboard({user}: Props) { ? groups .filter((g) => g.admin === selectedUser.id) .flatMap((g) => g.participants) - .includes(x.id) || false + .includes(x.id) : groups.flatMap((g) => g.participants).includes(x.id)), )} assigner={user.id} @@ -222,7 +222,7 @@ export default function TeacherDashboard({user}: Props) {

Active Assignments ({assignments.filter(activeFilter).length})

{assignments.filter(activeFilter).map((a) => ( - setSelectedAssignment(a)} key={a.id} /> + setSelectedAssignment(a)} key={a.id} /> ))}
@@ -238,6 +238,7 @@ export default function TeacherDashboard({user}: Props) { {assignments.filter(futureFilter).map((a) => ( { setSelectedAssignment(a); setIsCreatingAssignment(true); @@ -253,6 +254,7 @@ export default function TeacherDashboard({user}: Props) { {assignments.filter(pastFilter).map((a) => ( setSelectedAssignment(a)} key={a.id} allowDownload @@ -268,6 +270,7 @@ export default function TeacherDashboard({user}: Props) { {assignments.filter(archivedFilter).map((a) => ( setSelectedAssignment(a)} key={a.id} allowDownload diff --git a/src/pages/api/assignments/corporate.ts b/src/pages/api/assignments/corporate.ts index 21d1767f..a70f3830 100644 --- a/src/pages/api/assignments/corporate.ts +++ b/src/pages/api/assignments/corporate.ts @@ -36,5 +36,5 @@ async function GET(req: NextApiRequest, res: NextApiResponse) { const assigners = await getAllAssignersByCorporate(id); const assignments = await getAssignmentsByAssigners([...assigners, id]); - res.status(200).json(assignments); + res.status(200).json(uniqBy(assignments, "id")); } diff --git a/yarn.lock b/yarn.lock index c22cbf21..cd0f49bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -979,11 +979,6 @@ dependencies: glob "7.1.7" -"@next/font@13.1.6": - version "13.1.6" - resolved "https://registry.npmjs.org/@next/font/-/font-13.1.6.tgz" - integrity sha512-AITjmeb1RgX1HKMCiA39ztx2mxeAyxl4ljv2UoSBUGAbFFMg8MO7YAvjHCgFhD39hL7YTbFjol04e/BPBH5RzQ== - "@next/swc-darwin-arm64@14.2.5": version "14.2.5" resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz#d0a160cf78c18731c51cc0bff131c706b3e9bb05"