Skip to content

Commit a7cfef6

Browse files
authored
add college requirements to gradtrak (#1140)
* add checkmark meaning to ui * added rausser college reqs * added colleges of env design and chemistry * added school of edu * upper div check fixes
1 parent 0bafc8e commit a7cfef6

8 files changed

Lines changed: 285 additions & 35 deletions

File tree

apps/frontend/src/app/GradTrak/BtLLInterface/BtLLInterface.module.scss

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,3 +296,53 @@
296296
}
297297
}
298298
}
299+
300+
// Checkmark legend above accordions
301+
.legend {
302+
display: flex;
303+
flex-wrap: wrap;
304+
align-items: center;
305+
gap: 0.75rem 1.25rem;
306+
padding: 0.625rem 1rem;
307+
border-bottom: 1px solid var(--border-color);
308+
background: transparent;
309+
310+
.legendItem {
311+
display: flex;
312+
align-items: center;
313+
gap: 0.3rem;
314+
font-size: 0.7em;
315+
color: var(--paragraph-color);
316+
white-space: nowrap;
317+
}
318+
319+
.legendHint {
320+
font-style: italic;
321+
opacity: 0.7;
322+
margin-left: auto;
323+
}
324+
325+
.legendCheck {
326+
width: 1rem;
327+
height: 1rem;
328+
flex-shrink: 0;
329+
}
330+
331+
.legendEmpty {
332+
width: 1rem;
333+
height: 1rem;
334+
flex-shrink: 0;
335+
border: 1.5px dashed var(--border-color);
336+
border-radius: 2px;
337+
}
338+
339+
// Reuse existing check color classes
340+
.auto {
341+
color: var(--green-600);
342+
}
343+
344+
.manual {
345+
color: var(--heading-color);
346+
}
347+
}
348+

apps/frontend/src/app/GradTrak/BtLLInterface/index.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,25 @@ export default function BtLLGradTrakInterface({
707707

708708
return (
709709
<>
710+
{/* Color-code legend */}
711+
<div className={styles.legend}>
712+
<div className={styles.legendItem}>
713+
<Check className={classNames(styles.legendCheck, styles.auto)} />
714+
<span>Fulfilled</span>
715+
</div>
716+
<div className={styles.legendItem}>
717+
<Check className={classNames(styles.legendCheck, styles.manual)} />
718+
<span>Manually marked</span>
719+
</div>
720+
<div className={styles.legendItem}>
721+
<div className={styles.legendEmpty} />
722+
<span>Not fulfilled</span>
723+
</div>
724+
<div className={classNames(styles.legendItem, styles.legendHint)}>
725+
Click ✓ to toggle
726+
</div>
727+
</div>
728+
710729
{evaluatedGroups.map((group, index) => (
711730
<BtLLRequirementsAccordion
712731
key={`group-${index}`}

apps/frontend/src/app/GradTrak/Dashboard/EditPlanDialog.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ export default function EditPlanDialog({
8080
case "Journalism":
8181
return Colleges.Journ;
8282
case "Law":
83-
case "School of Law":
8483
return Colleges.Law;
8584
case "Natural Resources":
8685
return Colleges.Natres;

apps/frontend/src/app/GradTrak/Onboarding/AddColleges/colleges.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
"Optometry",
1515
"Public Health",
1616
"Public Policy",
17-
"School of Law",
1817
"Social Welfare"
1918
]
2019
}

apps/frontend/src/app/GradTrak/Onboarding/AddColleges/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ export default function AddColleges({ onNext }: AddCollegesProps) {
5252
case "Journalism":
5353
return Colleges.Journ;
5454
case "Law":
55-
case "School of Law":
5655
return Colleges.Law;
5756
case "Natural Resources":
5857
return Colleges.Natres;

migrations/seed-requirements.js

Lines changed: 88 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/BtLL/generate-mongosh-commands.ts

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,18 @@ import {
1111
APPLIED_MATH_REQ_BTLL,
1212
BUSINESS_REQ_BTLL,
1313
CDSS_REQ_BTLL,
14+
CHEMISTRY_REQ_BTLL,
1415
COE_REQ_BTLL,
1516
COMPSCI_REQ_BTLL,
1617
DATASCI_REQ_BTLL,
1718
ECON_REQ_BTLL,
19+
EDU_REQ_BTLL,
1820
EECS_REQ_BTLL,
21+
ENVDES_REQ_BTLL,
1922
HAAS_REQ_BTLL,
2023
LNS_REQ_BTLL,
2124
MECHE_REQ_BTLL,
25+
RCNR_REQ_BTLL,
2226
UC_REQ_BTLL,
2327
} from "./reference_gradtrak_reqs";
2428

@@ -64,6 +68,46 @@ const requirements: PlanRequirementSeed[] = [
6468
createdBy: "system",
6569
isOfficial: true,
6670
},
71+
{
72+
name: "School of Education Requirements",
73+
code: EDU_REQ_BTLL,
74+
isUcReq: false,
75+
college: "EDU",
76+
major: null,
77+
minor: null,
78+
createdBy: "system",
79+
isOfficial: true,
80+
},
81+
{
82+
name: "Rausser College of Natural Resources Requirements",
83+
code: RCNR_REQ_BTLL,
84+
isUcReq: false,
85+
college: "NATRES",
86+
major: null,
87+
minor: null,
88+
createdBy: "system",
89+
isOfficial: true,
90+
},
91+
{
92+
name: "College of Chemistry Requirements",
93+
code: CHEMISTRY_REQ_BTLL,
94+
isUcReq: false,
95+
college: "CHEM",
96+
major: null,
97+
minor: null,
98+
createdBy: "system",
99+
isOfficial: true,
100+
},
101+
{
102+
name: "College of Environmental Design Requirements",
103+
code: ENVDES_REQ_BTLL,
104+
isUcReq: false,
105+
college: "ENVDES",
106+
major: null,
107+
minor: null,
108+
createdBy: "system",
109+
isOfficial: true,
110+
},
67111
{
68112
name: "College of Computing, Data Science, and Society Requirements",
69113
code: CDSS_REQ_BTLL,
@@ -74,6 +118,16 @@ const requirements: PlanRequirementSeed[] = [
74118
createdBy: "system",
75119
isOfficial: true,
76120
},
121+
{
122+
name: "Haas School of Business Requirements",
123+
code: HAAS_REQ_BTLL,
124+
isUcReq: false,
125+
college: "HAAS",
126+
major: null,
127+
minor: null,
128+
createdBy: "system",
129+
isOfficial: true,
130+
},
77131
{
78132
name: "EECS Major Requirements",
79133
code: EECS_REQ_BTLL,
@@ -144,16 +198,6 @@ const requirements: PlanRequirementSeed[] = [
144198
createdBy: "system",
145199
isOfficial: true,
146200
},
147-
{
148-
name: "Haas School of Business Requirements",
149-
code: HAAS_REQ_BTLL,
150-
isUcReq: false,
151-
college: "HAAS",
152-
major: null,
153-
minor: null,
154-
createdBy: "system",
155-
isOfficial: true,
156-
},
157201
];
158202

159203
function escapeForMongosh(str: string): string {

packages/BtLL/reference_gradtrak_reqs.ts

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,78 @@ Function<List<Requirement>>() main (){
444444
}
445445
`;
446446

447+
export const EDU_REQ_BTLL = `${SEVEN_BREADTHS_BTLL}
448+
Function<List<Requirement>>() main (){
449+
List<Course> courses get_attr(this, "allCourses")
450+
451+
List<Requirement> breadth7 seven_breadths_requirements(courses)
452+
Requirement arts_and_lit get_element(breadth7, 0)
453+
Requirement biological_sciences get_element(breadth7, 1)
454+
Requirement historical_studies get_element(breadth7, 2)
455+
Requirement international_studies get_element(breadth7, 3)
456+
Requirement philosophy_and_values get_element(breadth7, 4)
457+
Requirement physical_sciences get_element(breadth7, 5)
458+
Requirement social_and_behavioral_sciences get_element(breadth7, 6)
459+
460+
List<Requirement> return [arts_and_lit, biological_sciences, historical_studies, international_studies, philosophy_and_values, physical_sciences, social_and_behavioral_sciences]
461+
}
462+
`;
463+
464+
export const ENVDES_REQ_BTLL = `
465+
`;
466+
467+
export const CHEMISTRY_REQ_BTLL = `
468+
`;
469+
470+
export const RCNR_REQ_BTLL = `${RNC_BTLL}
471+
Function<boolean>(Course) is_upper_div_course (course){
472+
string number get_attr(course, "number")
473+
boolean return or([regex_match(number, "^1[0-9][0-9]"), regex_match(number, "^2[0-9][0-9]"), regex_match(number, regex_match(number, "^C1[0-9][0-9]"), regex_match(number, "^C2[0-9][0-9]"), regex_match(number, "^W1[0-9][0-9]"), regex_match(number, "^W2[0-9][0-9]"), regex_match(number, "^N1[0-9][0-9]"), regex_match(number, "^N2[0-9][0-9]")])
474+
}
475+
476+
Function<boolean>(Course) is_rcnr_dept_course (course){
477+
string subject get_attr(course, "subject")
478+
boolean is_envecon equal([subject, "ENVECON"])
479+
boolean is_espm equal([subject, "ESPM"])
480+
boolean is_eneres equal([subject, "ENERES"])
481+
boolean is_nusctx equal([subject, "NUSCTX"])
482+
boolean is_plantbi equal([subject, "PLANTBI"])
483+
boolean return or([is_envecon, is_espm, is_eneres, is_nusctx, is_plantbi])
484+
}
485+
486+
Function<number>(number, Course) add_course_units (acc, course){
487+
number units get_attr(course, "units")
488+
number return add([acc, units])
489+
}
490+
491+
Function<List<Requirement>>() main (){
492+
List<Course> courses get_attr(this, "allCourses")
493+
494+
// Reading & Composition
495+
List<Requirement> rc_reqs rc_requirements(courses)
496+
Requirement rca get_element(rc_reqs, 0)
497+
Requirement rcb get_element(rc_reqs, 1)
498+
499+
// At least 36 upper-division units total
500+
List<Course> upper_div_courses filter(courses, (c) {
501+
boolean return is_upper_div_course(c)
502+
})
503+
number upper_div_units reduce(upper_div_courses, add_course_units, 0)
504+
NumberRequirement upper_div_total {upper_div_units, 36, "Total Upper Division Units"}
505+
506+
// At least 15 of those 36 upper division units must be in Rausser departments
507+
List<Course> rcnr_upper_div_courses filter(courses, (c) {
508+
boolean is_upper is_upper_div_course(c)
509+
boolean is_rcnr is_rcnr_dept_course(c)
510+
boolean return and([is_upper, is_rcnr])
511+
})
512+
number rcnr_upper_div_units reduce(rcnr_upper_div_courses, add_course_units, 0)
513+
NumberRequirement rcnr_upper_div {rcnr_upper_div_units, 15, "Rausser Upper Division Units"}
514+
515+
List<Requirement> return [rca, rcb, upper_div_total, rcnr_upper_div]
516+
}
517+
`;
518+
447519
export const EECS_REQ_BTLL = `
448520
Function<boolean>(Course) eecs_upper_div_finder (course){
449521
string subject get_attr(course, "subject")
@@ -500,7 +572,7 @@ Function<boolean>(Course) natural_science_upper_div_finder (course){
500572
number units get_attr(course, "units")
501573
502574
// Must be 3 units or more and upper division (100+)
503-
boolean is_upper_div or([regex_match(number, "^1[0-9][0-9]"), regex_match(number, "^2[0-9][0-9]"), regex_match(number, "^C[0-9]")])
575+
boolean is_upper_div or([regex_match(number, "^1[0-9][0-9]"), regex_match(number, "^2[0-9][0-9]"), regex_match(number, regex_match(number, "^C1[0-9][0-9]"), regex_match(number, "^C2[0-9][0-9]"), regex_match(number, "^W1[0-9][0-9]"), regex_match(number, "^W2[0-9][0-9]"), regex_match(number, "^N1[0-9][0-9]"), regex_match(number, "^N2[0-9][0-9]")])
504576
boolean has_enough_units or([greater_than(units, 3), equal([units, 3])])
505577
boolean is_valid_units and([is_upper_div, has_enough_units])
506578
@@ -857,7 +929,7 @@ Function<boolean>(Course) technical_elective_finder (course){
857929
number units get_attr(course, "units")
858930
859931
// Must be upper division (100+) or C### and NOT 195–199
860-
boolean is_upper_div or([regex_match(number, "^1[0-9][0-9]"), regex_match(number, "^2[0-9][0-9]"), regex_match(number, "^C[0-9][0-9]"), regex_match(number, "^C1[0-9][0-9]"), regex_match(number, "^C2[0-9][0-9]"), regex_match(number, "^W[0-9][0-9]"), regex_match(number, "^W1[0-9][0-9]"), regex_match(number, "^W2[0-9][0-9]"), regex_match(number, "^N[0-9][0-9]"), regex_match(number, "^N1[0-9][0-9]")])
932+
boolean is_upper_div or([regex_match(number, "^1[0-9][0-9]"), regex_match(number, "^2[0-9][0-9]"), regex_match(number, "^C1[0-9][0-9]"), regex_match(number, "^C2[0-9][0-9]"), regex_match(number, "^W1[0-9][0-9]"), regex_match(number, "^W2[0-9][0-9]"), regex_match(number, "^N1[0-9][0-9]"), regex_match(number, "^N2[0-9][0-9]")])
861933
boolean is_excluded_seminar regex_match(number, "^19[5-9]")
862934
boolean is_valid_number and([is_upper_div, not(is_excluded_seminar)])
863935

0 commit comments

Comments
 (0)