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"