fix(home): show all active subjects in upcoming assessments

Use shared active-subject helpers from assessments overview instead of
the first folder with an active flag and code-only filtering.
This commit is contained in:
2026-06-22 21:22:19 +09:30
parent 4b7aa8da75
commit 6f7788497a
2 changed files with 91 additions and 16 deletions
@@ -101,6 +101,34 @@ export function assessmentBelongsToActiveSubjects(
return activeSubjects.some((subject) => subject.code === code); return activeSubjects.some((subject) => subject.code === code);
} }
export function activeSubjectForAssessment(
assessment: Record<string, unknown>,
activeSubjects: OverviewSubject[],
): OverviewSubject | undefined {
const programme = Number(
assessment.programmeID ?? assessment.programme,
);
const metaclass = Number(
assessment.metaclassID ?? assessment.metaclass,
);
if (
programme &&
metaclass &&
!Number.isNaN(programme) &&
!Number.isNaN(metaclass)
) {
const subject = activeSubjects.find(
(s) => s.programme === programme && s.metaclass === metaclass,
);
if (subject) return subject;
}
const code = String(assessment.code ?? assessment.subject ?? "").trim();
if (!code) return undefined;
return activeSubjects.find((s) => s.code === code);
}
export function filterAssessmentsForActiveSubjects<T extends Record<string, unknown>>( export function filterAssessmentsForActiveSubjects<T extends Record<string, unknown>>(
assessments: T[], assessments: T[],
activeSubjects: OverviewSubject[], activeSubjects: OverviewSubject[],
@@ -110,6 +138,24 @@ export function filterAssessmentsForActiveSubjects<T extends Record<string, unkn
); );
} }
/** Active subjects that have at least one assessment in the given list. */
export function subjectsWithUpcomingAssessments(
assessments: Record<string, unknown>[],
activeSubjects: OverviewSubject[],
): OverviewSubject[] {
const result: OverviewSubject[] = [];
const seen = new Set<string>();
for (const assessment of assessments) {
const subject = activeSubjectForAssessment(assessment, activeSubjects);
if (!subject || seen.has(subject.code)) continue;
seen.add(subject.code);
result.push(subject);
}
return result;
}
export function formatDate(dateStr: string, submitted?: boolean): string { export function formatDate(dateStr: string, submitted?: boolean): string {
const d = new Date(dateStr); const d = new Date(dateStr);
const now = new Date(); const now = new Date();
+45 -16
View File
@@ -14,6 +14,12 @@ import { FilterUpcomingAssessments } from "@/seqta/utils/FilterUpcomingAssessmen
import { getMockNotices } from "@/seqta/ui/dev/hideSensitiveContent"; import { getMockNotices } from "@/seqta/ui/dev/hideSensitiveContent";
import { setupFixedTooltips } from "@/seqta/utils/fixedTooltip"; import { setupFixedTooltips } from "@/seqta/utils/fixedTooltip";
import { verboseInfo } from "@/utils/verboseLog"; import { verboseInfo } from "@/utils/verboseLog";
import {
activeSubjectsFromLearnPayload,
activeSubjectForAssessment,
filterAssessmentsForActiveSubjects,
subjectsWithUpcomingAssessments,
} from "@/plugins/built-in/assessmentsOverview/utils";
let LessonInterval: any; let LessonInterval: any;
let currentSelectedDate = new Date(); let currentSelectedDate = new Date();
@@ -113,12 +119,11 @@ export async function loadHomePage() {
callHomeTimetable(TodayFormatted, true); callHomeTimetable(TodayFormatted, true);
const activeClass = classes.find((c: any) => c.hasOwnProperty("active")); const activeSubjects = activeSubjectsFromLearnPayload(classes);
const activeSubjects = activeClass?.subjects || []; const currentAssessments = filterAssessmentsForActiveSubjects(
const activeSubjectCodes = activeSubjects.map((s: any) => s.code); assessments,
const currentAssessments = assessments activeSubjects,
.filter((a: any) => activeSubjectCodes.includes(a.code)) ).sort(comparedate);
.sort(comparedate);
const upcomingItems = document.getElementById("upcoming-items"); const upcomingItems = document.getElementById("upcoming-items");
if (upcomingItems) { if (upcomingItems) {
@@ -919,8 +924,13 @@ async function CreateUpcomingSection(assessments: any, activeSubjects: any) {
} }
} }
for (let i = 0; i < activeSubjects.length; i++) { const filterSubjects = subjectsWithUpcomingAssessments(
const element = activeSubjects[i]; assessments,
activeSubjects,
);
for (let i = 0; i < filterSubjects.length; i++) {
const element = filterSubjects[i];
const colour = colours.find( const colour = colours.find(
(c: any) => c.name === `timetable.subject.colour.${element.code}`, (c: any) => c.name === `timetable.subject.colour.${element.code}`,
); );
@@ -934,7 +944,15 @@ async function CreateUpcomingSection(assessments: any, activeSubjects: any) {
} }
} }
CreateFilters(activeSubjects); CreateFilters(filterSubjects);
for (let i = 0; i < assessments.length; i++) {
const subject = activeSubjectForAssessment(
assessments[i],
activeSubjects,
);
assessments[i].filterCode = subject?.code ?? assessments[i].code;
}
for (let i = 0; i < assessments.length; i++) { for (let i = 0; i < assessments.length; i++) {
const element: any = assessments[i]; const element: any = assessments[i];
@@ -1018,7 +1036,7 @@ function createAssessmentDateDiv(date: string, value: any, datecase?: any) {
const element = assessments[i]; const element = assessments[i];
const item = document.createElement("div"); const item = document.createElement("div");
item.classList.add("upcoming-assessment"); item.classList.add("upcoming-assessment");
item.setAttribute("data-subject", element.code); item.setAttribute("data-subject", element.filterCode ?? element.code);
item.id = `assessment${element.id}`; item.id = `assessment${element.id}`;
item.style.cssText = element.colour; item.style.cssText = element.colour;
@@ -1110,15 +1128,24 @@ async function GetLessonColours() {
} }
} }
function CreateFilters(subjects: any) { function CreateFilters(subjects: { code: string }[]) {
const filteroptions = settingsState.subjectfilters; const filteroptions = { ...settingsState.subjectfilters };
const filterdiv = document.querySelector("#upcoming-filters"); const filterdiv = document.querySelector("#upcoming-filters");
if (!filterdiv) return;
filterdiv.innerHTML = "";
const activeCodes = new Set(subjects.map((s) => s.code));
for (const key of Object.keys(filteroptions)) {
if (!activeCodes.has(key)) {
delete filteroptions[key];
}
}
for (let i = 0; i < subjects.length; i++) { for (let i = 0; i < subjects.length; i++) {
const element = subjects[i]; const element = subjects[i];
if (!Object.prototype.hasOwnProperty.call(filteroptions, element.code)) { if (!Object.prototype.hasOwnProperty.call(filteroptions, element.code)) {
filteroptions[element.code] = true; filteroptions[element.code] = true;
settingsState.subjectfilters = filteroptions;
} }
filterdiv!.append( filterdiv!.append(
CreateSubjectFilter( CreateSubjectFilter(
@@ -1128,6 +1155,8 @@ function CreateFilters(subjects: any) {
), ),
); );
} }
settingsState.subjectfilters = filteroptions;
} }
function CreateSubjectFilter( function CreateSubjectFilter(
@@ -1146,9 +1175,9 @@ function CreateSubjectFilter(
label.append(input, span); label.append(input, span);
input.addEventListener("change", function (change) { input.addEventListener("change", function (change) {
const filters = settingsState.subjectfilters; const checked = (change.target as HTMLInputElement).checked;
const id = (change.target as HTMLInputElement).id.split("-")[1]; const filters = { ...settingsState.subjectfilters };
filters[id] = (change.target as HTMLInputElement).checked; filters[subjectcode] = checked;
settingsState.subjectfilters = filters; settingsState.subjectfilters = filters;
}); });