feat: add upcoming colles
All checks were successful
Deploy to Netlify / Deploy to Netlify (push) Successful in 1m15s
All checks were successful
Deploy to Netlify / Deploy to Netlify (push) Successful in 1m15s
This commit is contained in:
parent
a9a752ea83
commit
b5816155a4
2 changed files with 54 additions and 9 deletions
|
|
@ -67,12 +67,19 @@ export default function Home({ user }: { user: User }) {
|
|||
isLoading,
|
||||
} = useColles(startDate);
|
||||
|
||||
// Fetch upcoming colles from API
|
||||
const {
|
||||
classColles: upcomingClassColles,
|
||||
error: upcomingError,
|
||||
isLoading: upcomingIsLoading,
|
||||
} = useColles(DateTime.now());
|
||||
|
||||
// Error handling (after all hooks)
|
||||
if (error)
|
||||
if (error || upcomingError)
|
||||
return (
|
||||
<Error
|
||||
title="Impossible de charger les colles"
|
||||
message={error?.toString()}
|
||||
message={error?.toString() || upcomingError?.toString()}
|
||||
code={500}
|
||||
description="Une erreur s'est produite lors du chargement de la liste des colles."
|
||||
/>
|
||||
|
|
@ -98,6 +105,14 @@ export default function Home({ user }: { user: User }) {
|
|||
updateQuery("examiner", examiner);
|
||||
setExaminerFilter(examiner == "all" ? "" : examiner);
|
||||
};
|
||||
const rawStudent = query.get("student");
|
||||
const [studentFilter, setStudentFilter] = useState<string>(
|
||||
rawStudent === "all" ? "" : rawStudent || ""
|
||||
);
|
||||
const setStudent = (student: string) => {
|
||||
updateQuery("student", student);
|
||||
setStudentFilter(student == "all" ? "" : student);
|
||||
};
|
||||
const [sorted, setSort] = useState<string>(query.get("sort") || "desc");
|
||||
const toggleSort = () => {
|
||||
const newSort = sorted === "asc" ? "desc" : "asc";
|
||||
|
|
@ -106,21 +121,29 @@ export default function Home({ user }: { user: User }) {
|
|||
};
|
||||
|
||||
const generateFilter = (arr: string[], value: string) => {
|
||||
const unique = [...new Set(arr)];
|
||||
const unique = [...new Set(arr.filter(Boolean))];
|
||||
if (value && !unique.includes(value)) {
|
||||
unique.push(value);
|
||||
}
|
||||
unique.sort((a, b) => a.localeCompare(b));
|
||||
return unique;
|
||||
};
|
||||
|
||||
const currentClassColles =
|
||||
activeTab === "upcoming" ? upcomingClassColles : classColles;
|
||||
|
||||
const subjects = generateFilter(
|
||||
classColles.map((colle) => colle.subject?.name),
|
||||
currentClassColles.map((colle) => colle.subject?.name),
|
||||
subjectFilter
|
||||
);
|
||||
const examiners = generateFilter(
|
||||
classColles.map((colle) => colle.examiner?.name),
|
||||
currentClassColles.map((colle) => colle.examiner?.name),
|
||||
examinerFilter
|
||||
);
|
||||
const students = generateFilter(
|
||||
upcomingClassColles.map((colle) => colle.student?.fullName),
|
||||
studentFilter
|
||||
);
|
||||
|
||||
const applyFilters = (colles: any[]) => {
|
||||
return colles
|
||||
|
|
@ -133,7 +156,11 @@ export default function Home({ user }: { user: User }) {
|
|||
examinerFilter === "all" || !examinerFilter
|
||||
? true
|
||||
: colle.examiner?.name === examinerFilter;
|
||||
return subjectMatch && examinerMatch;
|
||||
const studentMatch =
|
||||
activeTab !== "upcoming" || studentFilter === "all" || !studentFilter
|
||||
? true
|
||||
: colle.student?.fullName === studentFilter;
|
||||
return subjectMatch && examinerMatch && studentMatch;
|
||||
})
|
||||
.sort((a, b) => {
|
||||
if (sorted === "asc") {
|
||||
|
|
@ -218,6 +245,22 @@ export default function Home({ user }: { user: User }) {
|
|||
</SelectContent>
|
||||
</Select>
|
||||
|
||||
{activeTab === "upcoming" && (
|
||||
<Select value={studentFilter} onValueChange={setStudent}>
|
||||
<SelectTrigger className="rounded-full data-[placeholder]:text-primary">
|
||||
<SelectValue placeholder="Élève" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="all">Tous</SelectItem>
|
||||
{students.map((student) => (
|
||||
<SelectItem key={student} value={student}>
|
||||
{student}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
)}
|
||||
|
||||
<Button
|
||||
variant="outline"
|
||||
size="sm"
|
||||
|
|
@ -271,10 +314,10 @@ export default function Home({ user }: { user: User }) {
|
|||
{activeTab === "upcoming" && (
|
||||
<TabContent
|
||||
tabTitle="Toutes les colles à venir"
|
||||
emptyCollesText="Cette fonctionnalité est en cours de développement. Bientôt, vous verrez ici toutes les colles à venir pour votre classe."
|
||||
isLoading={false}
|
||||
emptyCollesText="Aucune colle à venir n'a été trouvée."
|
||||
isLoading={upcomingIsLoading}
|
||||
isSorted={sorted === "desc"}
|
||||
colles={[]}
|
||||
colles={applyFilters(upcomingClassColles)}
|
||||
preferences={user.preferences}
|
||||
/>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -203,6 +203,7 @@ interface CollePayload {
|
|||
classColles: Colle[];
|
||||
studentColles: Colle[];
|
||||
favoriteColles: Colle[];
|
||||
upcomingClassColles: Colle[];
|
||||
healthyUntil: Date;
|
||||
lastSync: Date;
|
||||
}
|
||||
|
|
@ -238,6 +239,7 @@ export const useColles = (startDate: DateTime) => {
|
|||
classColles: [],
|
||||
studentColles: [],
|
||||
favoriteColles: [],
|
||||
upcomingClassColles: [],
|
||||
healthyUntil: new Date(0),
|
||||
lastSync: new Date(0),
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue