fix: instructor formatting errors (#425)

* fix: instructor formatting errors

* refactor: simplify logic in Instructor toString, remove unused formatters

* refactor: remove "unnecessary" else's after returns

I think it looks worse like this but whatever
This commit is contained in:
Samuel Gunter
2024-11-19 19:28:38 -06:00
committed by GitHub
parent 19e3838df2
commit 8b922082a7
4 changed files with 31 additions and 53 deletions

View File

@@ -16,25 +16,6 @@ export default class Instructor {
});
}
/**
* Get the URL to the instructor's directory page on the UT Directory website
*
* @returns A URL string to the instructor's directory page
*/
getDirectoryUrl(): string {
const name = this.toString({
format: 'full_name',
case: 'capitalize',
});
const url = new URL('https://directory.utexas.edu/index.php');
url.searchParams.set('q', name);
url.searchParams.set('scope', 'faculty/staff');
url.searchParams.set('submit', 'Search');
return url.toString();
}
/**
* Get a string representation of the instructor
*
@@ -43,32 +24,36 @@ export default class Instructor {
*/
toString(options: InstructorFormatOptions): string {
const { firstName, lastName, fullName } = this;
const { format, case: caseType } = options;
const { format } = options;
const process = (str: string) => {
if (caseType === 'lowercase') {
return str.toLowerCase();
}
if (caseType === 'uppercase') {
return str.toUpperCase();
}
return capitalize(str);
};
switch (format) {
case 'first_last':
if (firstName && lastName) {
return `${capitalize(firstName)} ${capitalize(lastName)}`;
}
if (format === 'abbr' && firstName && lastName && firstName[0]) {
return `${process(firstName[0])}. ${process(lastName)}`;
}
if (format === 'full_name' && fullName) {
return process(fullName);
}
if (format === 'first_last' && firstName && lastName) {
return `${process(firstName)} ${process(lastName)}`;
}
if (format === 'last' && lastName) {
return process(lastName);
}
if (lastName) {
return capitalize(lastName);
}
throw new Error(`Invalid Instructor String format: ${format}`);
if (fullName) {
return fullName;
}
return '';
case 'last':
if (lastName) {
return capitalize(lastName);
}
if (fullName) {
return fullName;
}
return '';
default:
throw new Error(`Invalid Instructor String format: ${format}`);
}
}
}
@@ -77,9 +62,5 @@ export default class Instructor {
*/
type InstructorFormatOptions = {
/** How do you want the names of the professors formatted */
format: 'abbr' | 'first_last' | 'last' | 'full_name';
/**
* What the case of the string should be
*/
case: 'capitalize' | 'lowercase' | 'uppercase';
format: 'first_last' | 'last';
};

View File

@@ -84,7 +84,7 @@ export default function PopupCourseBlock({
<Text className={clsx('flex-1 py-3.5 truncate', fontColor)} variant='h1-course'>
<span className='px-0.5 font-450'>{formattedUniqueId}</span> {course.department} {course.number}
{course.instructors.length > 0 ? <> &ndash; </> : ''}
{course.instructors.map(v => v.toString({ format: 'last', case: 'capitalize' })).join('; ')}
{course.instructors.map(v => v.toString({ format: 'last' })).join('; ')}
</Text>
{enableCourseStatusChips && course.status !== Status.OPEN && (
<div

View File

@@ -55,8 +55,7 @@ export default function HeadingAndActions({ course, activeSchedule, onClose }: H
const formattedUniqueId = uniqueId.toString().padStart(5, '0');
const isInCalendar = useCalendar();
const getInstructorFullName = (instructor: Instructor) =>
instructor.toString({ format: 'first_last', case: 'capitalize' });
const getInstructorFullName = (instructor: Instructor) => instructor.toString({ format: 'first_last' });
const handleCopy = () => {
navigator.clipboard.writeText(formattedUniqueId);

View File

@@ -98,9 +98,7 @@ function extractCourseInfo(course: Course) {
if (course.instructors.length > 0) {
courseDeptAndInstr += ' \u2013 ';
courseDeptAndInstr += course.instructors
.map(instructor => instructor.toString({ format: 'last', case: 'capitalize' }))
.join('; ');
courseDeptAndInstr += course.instructors.map(instructor => instructor.toString({ format: 'last' })).join('; ');
}
return { status, courseDeptAndInstr, meetings, course };