Skip to content

Commit b20b4ce

Browse files
maverick-g00semaverick-g00sekokrui
authored
feat(timetable): exclude hidden modules from being exported into iCal (#3682)
* Implement logic to exclude events from hidden modules during export * Pass hiddenModules: string[] as a parameter to icalUtils.default * Add new test for hidden module in iCalForTimetable * Pluralize hiddenModule to hiddenModules * Update hiddenModules type --------- Co-authored-by: maverick-g00se <[email protected]> Co-authored-by: kokrui <[email protected]>
1 parent e6a32fd commit b20b4ce

File tree

3 files changed

+17
-3
lines changed

3 files changed

+17
-3
lines changed

website/src/actions/export.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Module, Semester } from 'types/modules';
1+
import type { Module, ModuleCode, Semester } from 'types/modules';
22
import type { ExportData } from 'types/export';
33
import type { Dispatch, GetState } from 'types/redux';
44
import { hydrateSemTimetableWithLessons } from 'utils/timetables';
@@ -31,11 +31,12 @@ export function downloadAsIcal(semester: Semester) {
3131
.then(([ical, icalUtils]) => {
3232
const state = getState();
3333
const { modules } = state.moduleBank;
34+
const hiddenModules: ModuleCode[] = state.timetables.hidden[semester] || [];
3435

3536
const timetable = getSemesterTimetableLessons(state)(semester);
3637
const timetableWithLessons = hydrateSemTimetableWithLessons(timetable, modules, semester);
3738

38-
const events = icalUtils.default(semester, timetableWithLessons, modules);
39+
const events = icalUtils.default(semester, timetableWithLessons, modules, hiddenModules);
3940
const cal = ical.default({
4041
domain: 'nusmods.com',
4142
prodId: '//NUSMods//NUSMods//EN',

website/src/utils/ical.test.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,8 +307,18 @@ describe(iCalForTimetable, () => {
307307
CS1010S,
308308
CS3216,
309309
};
310-
const actual = iCalForTimetable(1, mockTimetable, moduleData);
310+
const actual = iCalForTimetable(1, mockTimetable, moduleData, []);
311311
// 5 lesson types for cs1010s, 1 for cs3216, 1 exam for cs1010s
312312
expect(actual).toHaveLength(7);
313313
});
314+
315+
test('should produce the correct number of lesson after excluding hidden mod', () => {
316+
const moduleData = {
317+
CS1010S,
318+
CS3216,
319+
};
320+
const actual = iCalForTimetable(1, mockTimetable, moduleData, ['CS3216']);
321+
// 5 lesson types for cs1010s, 1 exam for cs1010s, ( 1 lesson for cs3216 will be exluded)
322+
expect(actual).toHaveLength(6);
323+
});
314324
});

website/src/utils/ical.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ export default function iCalForTimetable(
174174
semester: Semester,
175175
timetable: SemTimetableConfigWithLessons,
176176
moduleData: { [moduleCode: string]: Module },
177+
hiddenModules: string[],
177178
academicYear: string = config.academicYear,
178179
): EventOption[] {
179180
const [year, month, day] = academicCalendar[academicYear][semester].start;
@@ -182,6 +183,8 @@ export default function iCalForTimetable(
182183
const events: EventOption[] = [];
183184

184185
_.each(timetable, (lessonConfig, moduleCode) => {
186+
if (hiddenModules.includes(moduleCode)) return;
187+
185188
_.each(lessonConfig, (lessons) => {
186189
lessons.forEach((lesson) => {
187190
events.push(iCalEventForLesson(lesson, moduleData[moduleCode], semester, firstDayOfSchool));

0 commit comments

Comments
 (0)