diff --git a/src/subject.ts b/src/subject.ts index 7a6ed53..09b5877 100644 --- a/src/subject.ts +++ b/src/subject.ts @@ -12,10 +12,9 @@ export function getSubject( } const status = - dreamCampusSubject.adjustName === '抽選対象' + dreamCampusSubject.lotResultName === '抽選対象' ? 'lot_pending' - : dreamCampusSubject.lotResultName && - dreamCampusSubject.lotResultName !== '当選' + : dreamCampusSubject.lotResultName === '抽選漏れ' ? 'lot_rejected' : dreamCampusSubject.cancelName === '【履修取消】' ? 'canceled' diff --git a/src/timetable.ts b/src/timetable.ts index cec9eba..f9d3116 100644 --- a/src/timetable.ts +++ b/src/timetable.ts @@ -1,4 +1,8 @@ -import type { DreamCampusTimetable, Timetable } from './schemas/index.js'; +import type { + DreamCampusTimetable, + Subject, + Timetable, +} from './schemas/index.js'; import { getSubject } from './subject.js'; export function getTimetable( @@ -32,20 +36,22 @@ export function getTimetable( const firstHalf = normal.map((row) => row.map((col) => getFirstOrNull( - col.filter((subject) => { - switch (term) { - case 'spring': - return ( - !subject.term?.includes('前期2') && - !subject.term?.includes('前2') - ); - case 'fall': - return ( - !subject.term?.includes('後期2') && - !subject.term?.includes('後2') - ); - } - }), + sortEnrolled( + col.filter((subject) => { + switch (term) { + case 'spring': + return ( + !subject.term?.includes('前期2') && + !subject.term?.includes('前2') + ); + case 'fall': + return ( + !subject.term?.includes('後期2') && + !subject.term?.includes('後2') + ); + } + }), + ), ), ), ); @@ -53,28 +59,31 @@ export function getTimetable( const secondHalf = normal.map((row) => row.map((col) => getFirstOrNull( - col.filter((subject) => { - switch (term) { - case 'spring': - return ( - !subject.term?.includes('前期1') && - !subject.term?.includes('前1') - ); - case 'fall': - return ( - !subject.term?.includes('後期1') && - !subject.term?.includes('後1') - ); - } - }), + sortEnrolled( + col.filter((subject) => { + switch (term) { + case 'spring': + return ( + !subject.term?.includes('前期1') && + !subject.term?.includes('前1') + ); + case 'fall': + return ( + !subject.term?.includes('後期1') && + !subject.term?.includes('後1') + ); + } + }), + ), ), ), ); const intensive = dreamCampusTimetable.others.map((row) => row.map((col) => { - const subject = getFirstOrNull(col); - return subject ? getSubject(subject) : null; + const subjects = col.flatMap((subject) => getSubject(subject) ?? []); + const subject = getFirstOrNull(sortEnrolled(subjects)); + return subject ? subject : null; }), ); @@ -94,3 +103,7 @@ export function getTimetable( function getFirstOrNull(arr: T[]): T | null { return arr.length > 0 ? arr[0] : null; } + +function sortEnrolled(arr: Subject[]): Subject[] { + return arr.toSorted((subject) => (subject.status === 'enrolled' ? -1 : 0)); +} diff --git a/tests/test0.expected.ts b/tests/test0.expected.ts index a22bb25..fbad526 100644 --- a/tests/test0.expected.ts +++ b/tests/test0.expected.ts @@ -50,7 +50,7 @@ export default { id: 'B10233610', name: '健康科学', url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B10233610&je_cd=1', - status: 'lot_rejected', + status: 'lot_pending', required: '[選択]', term: '後期', units: '2単位', @@ -64,7 +64,7 @@ export default { id: 'B10233553', name: '欧米文化論', url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B10233553&je_cd=1', - status: 'lot_rejected', + status: 'lot_pending', required: '[選択]', term: '後期', units: '2単位', @@ -95,7 +95,7 @@ export default { id: 'B1042504o', name: '国語表現法', url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B1042504o&je_cd=1', - status: 'lot_rejected', + status: 'lot_pending', required: '[選択必修Ⅱ]', term: '後期', units: '2単位', @@ -126,7 +126,7 @@ export default { id: 'B1033207a', name: 'フランス語Ⅲ', url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B1033207a&je_cd=1', - status: 'lot_rejected', + status: 'lot_pending', required: '[フランス語]', term: '後期', units: '1単位', @@ -341,7 +341,7 @@ export default { id: 'B10233610', name: '健康科学', url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B10233610&je_cd=1', - status: 'lot_rejected', + status: 'lot_pending', required: '[選択]', term: '後期', units: '2単位', @@ -355,7 +355,7 @@ export default { id: 'B10233553', name: '欧米文化論', url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B10233553&je_cd=1', - status: 'lot_rejected', + status: 'lot_pending', required: '[選択]', term: '後期', units: '2単位', @@ -386,7 +386,7 @@ export default { id: 'B1042504o', name: '国語表現法', url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B1042504o&je_cd=1', - status: 'lot_rejected', + status: 'lot_pending', required: '[選択必修Ⅱ]', term: '後期', units: '2単位', @@ -417,7 +417,7 @@ export default { id: 'B1033207a', name: 'フランス語Ⅲ', url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B1033207a&je_cd=1', - status: 'lot_rejected', + status: 'lot_pending', required: '[フランス語]', term: '後期', units: '1単位',