| 113 | |
| 114 | /* default order: keep program grouping order, newest season first within program */ |
| 115 | function defaultSort(records) { |
| 116 | const programOrder = new Map(); |
| 117 | records.forEach((r) => { |
| 118 | if (!programOrder.has(r.ProgramID)) programOrder.set(r.ProgramID, programOrder.size); |
| 119 | }); |
| 120 | return [...records].sort((a, b) => ( |
| 121 | programOrder.get(a.ProgramID) - programOrder.get(b.ProgramID) || |
| 122 | b.ProgramYear - a.ProgramYear || |
| 123 | (SEMESTER_WEIGHT[b.Semester] ?? 0) - (SEMESTER_WEIGHT[a.Semester] ?? 0) |
| 124 | )); |
| 125 | } |
| 126 | |
| 127 | /* ------------------------------ virtuoso table --------------------------- */ |
| 128 | |