1
0
Fork 0
This repository has been archived on 2024-09-27. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
bearlypassing/frontend/src/components/dashboard/MissingAssignmentCard.tsx

64 lines
3.1 KiB
TypeScript
Raw Normal View History

2024-09-27 11:17:53 +01:00
import {Descending, Section, SortSettings, Term} from "../../interfaces";
import Card from "react-bootstrap/Card";
import DashboardCard from "./DashboardCard";
import AssignmentsTable, {AssignmentsTableColumn} from "../tables/AssignmentsTable";
import {useMemo, useState} from "react";
import SortSelect from "../input/SortSelect";
import OffcanvasDashboardCard from "./OffcanvasDashboardCard";
type MissingAssignmentCardsProps = { sections: Section[], term: Term | null }
const assignmentsTableColumns = [AssignmentsTableColumn.CLASSNAME, AssignmentsTableColumn.NAME, AssignmentsTableColumn.DUEDATE];
export default function MissingAssignmentCard({sections, term}: MissingAssignmentCardsProps) {
const [offcanvasSort, setOffcanvasSort] = useState<SortSettings<AssignmentsTableColumn>>({
order: Descending,
by: AssignmentsTableColumn.DUEDATE
});
const missingAssignments = useMemo(() => sections
.map(s => s.assignments) // Get assignments from sections
.flat(1) // Turn array of arrays of assignments into an array of assignments
.filter(a => a.score?.missing) // Filter for only missing assignments
.sort((a, b) => a.dueDate.getTime() - b.dueDate.getTime()) // Sort by due date
, [sections]);
// Get 5 assignments with the most recent due date
const assignmentsToDisplay = useMemo(() => missingAssignments
.sort((a, b) => b.dueDate.getTime() - a.dueDate.getTime())
.slice(0, 5)
, [missingAssignments]);
// Show button that displays list of all missing assignments (in offcanvas element)
const includeOffcanvas = missingAssignments.length > 5;
const cardBody = useMemo(() =>
term === null
?
<>
<Card.Title>No missing assignments</Card.Title>
<p>And I bet you're not <i>Missing</i> school either.</p>
</>
:
<>
<Card.Title>
{`${missingAssignments.length} missing assignment${missingAssignments.length === 1 ? '' : 's'} in ${term.title}`}
</Card.Title>
{missingAssignments.length === 0
? <p>No missing assignments! Nice job try-hard!</p>
: <AssignmentsTable assignments={assignmentsToDisplay} columns={assignmentsTableColumns}
sort={{order: Descending, by: AssignmentsTableColumn.DUEDATE}}/>
}
</>, [assignmentsToDisplay, term, missingAssignments]);
return includeOffcanvas
? <OffcanvasDashboardCard offcanvasTitle="Missing Assignments" offcanvasBody={
<>
<SortSelect settings={offcanvasSort} setSettings={setOffcanvasSort}
sortByOptions={assignmentsTableColumns}/>
<AssignmentsTable assignments={missingAssignments} columns={assignmentsTableColumns}
sort={offcanvasSort}/>
</>
}>{cardBody}</OffcanvasDashboardCard>
: <DashboardCard>{cardBody}</DashboardCard>
};