mirror of
https://github.com/BetterSEQTA/BetterSEQTA-Plus.git
synced 2026-08-28 17:21:05 +00:00
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:
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user