From 70a3f14e0a7208afe7f4b8b5e3bd2eb94896445b Mon Sep 17 00:00:00 2001 From: knownotunknown <78577376+knownotunknown@users.noreply.github.com> Date: Mon, 19 Feb 2024 22:39:26 -0600 Subject: [PATCH] Squashed commit of the following: commit c46e4a51c98fc183ef01ee1a579c2c013951d551 Author: Abhinav Chadaga Date: Mon Feb 19 21:37:46 2024 -0600 change from reducer pattern to state variables, remove chartData from state commit 36bcdd25224261e3efb54dc0cdd0f8d22502737d Author: Abhinav Chadaga Date: Mon Feb 19 21:15:41 2024 -0600 change grade distribution colors to match updated figma commit 11a50df88db28ba9d47c305debc779b1036df119 Merge: c16b301 b4c96a9 Author: Abhinav Chadaga Date: Mon Feb 19 17:57:13 2024 -0600 Merge branch 'hackathon' into abhinavchadaga/course-catalog-popup commit c16b301ff015af77faeb286ec79f4d67f74296af Author: Abhinav Chadaga Date: Mon Feb 19 17:47:21 2024 -0600 Kinda complete the handlers commit 1ac1d9095ae05cbe85df088d932006f230d1b227 Author: Abhinav Chadaga Date: Sun Feb 18 17:36:59 2024 -0600 Bunch of renaming commit 925829ad4114015845e1aa59cb9bad91ac0de534 Author: Abhinav Chadaga Date: Sun Feb 18 17:24:53 2024 -0600 Fix syllabi url Remove unused variable and unnecessary args to url commit f2e5d51eb3a87091d8a30d08d9de9e13d05a9098 Author: Abhinav Chadaga Date: Sun Feb 18 17:24:22 2024 -0600 Add TODO replace current grade colors with a tailwind palette commit 747ee44440360b325056455cce22e241bfaea698 Author: Abhinav Chadaga Date: Sun Feb 18 01:26:51 2024 -0600 Minor tweaks change style in header commit ddfe952a320af0de4189e84ad611ef8e7319d5cb Author: Abhinav Chadaga Date: Sun Feb 18 01:26:38 2024 -0600 Add Grade Distribution Stuff commit c27bf3c390930db584578e881b3cdc5152f462b0 Author: Abhinav Chadaga Date: Sun Feb 18 01:26:13 2024 -0600 Modify story to use proper course info commit 7afdbac1b8a621618a8f79d2dda361c4670c759e Author: Abhinav Chadaga Date: Sat Feb 17 16:37:01 2024 -0600 description stuff done commit 1a894322760ac4585fcb92a135dd043252eb104e Author: Abhinav Chadaga Date: Sat Feb 17 15:26:32 2024 -0600 Rename CoursePopup Old one to "Old", remove "2" from new one commit 4c2b31e61ac9b0eca518eab0412e435039f0b4bb Author: Abhinav Chadaga Date: Sat Feb 17 15:23:01 2024 -0600 add todo for calendar button commit 11b7a51deda96565479ed8063cdddce96e28d24f Author: Abhinav Chadaga Date: Sat Feb 17 15:22:18 2024 -0600 add course button onclick handlers commit f2dfcec838553a8cb7fb437620b3f8af4f4f0783 Author: Abhinav Chadaga Date: Sat Feb 17 14:52:38 2024 -0600 some unocss updates commit f9f375514b54a9a66e59ce151314859b0a9763fb Author: Abhinav Chadaga Date: Sat Feb 17 13:00:46 2024 -0600 Add rmp callback commit 122fc6dbdd84f8fce1c038b366d372d2cb3b405e Author: Abhinav Chadaga Date: Sat Feb 17 13:00:16 2024 -0600 Change test course to 314 commit 19b124b3bdac4cf4e7c3ac3aa633aaa78610b29c Author: Abhinav Chadaga Date: Sat Feb 17 12:19:21 2024 -0600 complete CourseHeaderAndActions Component added course buttons, using proper subcomponents now. commit 2eea01fc740bfa4db2dc45045c04033421a94297 Author: Abhinav Chadaga Date: Sat Feb 17 11:22:12 2024 -0600 use chip component in header commit 9cb13c8fd1a154ac1f982c7c49562664ed603732 Merge: a62b718 9392085 Author: Abhinav Chadaga Date: Sat Feb 17 11:21:12 2024 -0600 Merge branch 'hackathon' into abhinavchadaga/course-catalog-popup commit a62b718c43fac327be83b20420caba6f5ce9e0e9 Merge: 43d2675 7b7b858 Author: Abhinav Chadaga Date: Sat Feb 17 10:57:24 2024 -0600 Merge branch 'hackathon' into abhinavchadaga/course-catalog-popup commit 43d2675be5817225f4ba6164427b5345a702d4e5 Author: Abhinav Chadaga Date: Sat Feb 17 10:54:49 2024 -0600 some work on course popup update the stories and create the header component commit 31bcef3099a09f9460fb95a5e1aee8d19350101d Merge: 874f8d5 fa1d737 Author: Abhinav Chadaga Date: Wed Feb 14 14:33:16 2024 -0600 Merge branch 'main' into abhinavchadaga/course-catalog-popup pulling from main commit 874f8d56cbc7810b2894d6e0d5441a37efc31658 Author: Abhinav Chadaga Date: Wed Feb 14 14:30:24 2024 -0600 some work --- src/shared/util/themeColors.ts | 14 ++ .../CourseCatalogInjectedPopup.stories.ts | 69 +++++++ src/stories/injected/CoursePopup.stories.ts | 2 +- src/views/components/CourseCatalogMain.tsx | 2 +- src/views/components/common/Chip/Chip.tsx | 15 +- .../CourseCatalogInjectedPopup.tsx | 24 +++ .../Description.tsx | 30 ++++ .../GradeDistribution.tsx | 170 ++++++++++++++++++ .../HeadingAndActions.tsx | 136 ++++++++++++++ .../CourseDescription.module.scss | 0 .../CourseDescription/CourseDescription.tsx | 0 .../CourseButtons/CourseButtons.module.scss | 0 .../CourseButtons/CourseButtons.tsx | 0 .../CourseHeader/CourseHeader.module.scss | 0 .../CourseHeader/CourseHeader.tsx | 0 .../CoursePopup.module.scss | 0 .../CoursePopup.tsx | 0 .../GradeDistribution.module.scss | 0 .../GradeDistribution/GradeDistribution.tsx | 0 19 files changed, 458 insertions(+), 4 deletions(-) create mode 100644 src/stories/injected/CourseCatalogInjectedPopup.stories.ts create mode 100644 src/views/components/injected/CourseCatalogInjectedPopup/CourseCatalogInjectedPopup.tsx create mode 100644 src/views/components/injected/CourseCatalogInjectedPopup/Description.tsx create mode 100644 src/views/components/injected/CourseCatalogInjectedPopup/GradeDistribution.tsx create mode 100644 src/views/components/injected/CourseCatalogInjectedPopup/HeadingAndActions.tsx rename src/views/components/injected/{CoursePopup => CoursePopupOld}/CourseDescription/CourseDescription.module.scss (100%) rename src/views/components/injected/{CoursePopup => CoursePopupOld}/CourseDescription/CourseDescription.tsx (100%) rename src/views/components/injected/{CoursePopup => CoursePopupOld}/CourseHeader/CourseButtons/CourseButtons.module.scss (100%) rename src/views/components/injected/{CoursePopup => CoursePopupOld}/CourseHeader/CourseButtons/CourseButtons.tsx (100%) rename src/views/components/injected/{CoursePopup => CoursePopupOld}/CourseHeader/CourseHeader.module.scss (100%) rename src/views/components/injected/{CoursePopup => CoursePopupOld}/CourseHeader/CourseHeader.tsx (100%) rename src/views/components/injected/{CoursePopup => CoursePopupOld}/CoursePopup.module.scss (100%) rename src/views/components/injected/{CoursePopup => CoursePopupOld}/CoursePopup.tsx (100%) rename src/views/components/injected/{CoursePopup => CoursePopupOld}/GradeDistribution/GradeDistribution.module.scss (100%) rename src/views/components/injected/{CoursePopup => CoursePopupOld}/GradeDistribution/GradeDistribution.tsx (100%) diff --git a/src/shared/util/themeColors.ts b/src/shared/util/themeColors.ts index f52cba4c..17571b8f 100644 --- a/src/shared/util/themeColors.ts +++ b/src/shared/util/themeColors.ts @@ -16,6 +16,20 @@ export const colors = { red: '#af2e2d', black: '#1a2024', }, + gradeDistribution: { + a: '#22c55e', + aminus: '#a3e635', + bplus: '#84CC16', + b: '#FDE047', + bminus: '#FACC15', + cplus: '#F59E0B', + c: '#FB923C', + cminus: '#F97316', + dplus: '#EA580C', // TODO (achadaga): copilot generated, get actual color from Isaiah + d: '#DC2626', + dminus: '#B91C1C', + f: '#B91C1C', + }, } as const; type NestedKeys = { diff --git a/src/stories/injected/CourseCatalogInjectedPopup.stories.ts b/src/stories/injected/CourseCatalogInjectedPopup.stories.ts new file mode 100644 index 00000000..91faa2d7 --- /dev/null +++ b/src/stories/injected/CourseCatalogInjectedPopup.stories.ts @@ -0,0 +1,69 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { Course, Status } from 'src/shared/types/Course'; +import { CourseMeeting, DAY_MAP } from 'src/shared/types/CourseMeeting'; +import { CourseSchedule } from 'src/shared/types/CourseSchedule'; +import Instructor from 'src/shared/types/Instructor'; + +import CourseCatalogInjectedPopup from 'src/views/components/injected/CourseCatalogInjectedPopup/CourseCatalogInjectedPopup'; + +const exampleCourse: Course = new Course({ + uniqueId: 50805, + number: '314', + fullName: 'C S 314 DATA STRUCTURES', + courseName: 'DATA STRUCTURES', + department: 'C S', + creditHours: 3, + status: Status.OPEN, + instructors: [ + new Instructor({ fullName: 'SCOTT, MICHAEL', firstName: 'MICHAEL', lastName: 'SCOTT', middleInitial: 'D' }), + ], + isReserved: true, + description: [ + 'Second part of a two-part sequence in programming. Introduction to specifications, simple unit testing, and debugging; building and using canonical data structures; algorithm analysis and reasoning techniques such as assertions and invariants.', + 'Computer Science 314 and 314H may not both be counted.', + 'BVO 311C and 312H may not both be counted.', + 'Prerequisite: Computer Science 312 or 312H with a grade of at least C-.', + 'May be counted toward the Quantitative Reasoning flag requirement.', + ], + schedule: new CourseSchedule({ + meetings: [ + new CourseMeeting({ + days: [DAY_MAP.T, DAY_MAP.TH], + startTime: 480, + endTime: 570, + location: { building: 'UTC', room: '123' }, + }), + new CourseMeeting({ + days: [DAY_MAP.TH], + startTime: 570, + endTime: 630, + location: { building: 'JES', room: '123' }, + }), + ], + }), + url: 'https://utdirect.utexas.edu/apps/registrar/course_schedule/20242/12345/', + flags: ['Writing', 'Independent Inquiry'], + instructionMode: 'In Person', + semester: { + code: '12345', + year: 2024, + season: 'Spring', + }, +}); + +const meta: Meta = { + title: 'Components/Injected/CourseCatalogInjectedPopup', + component: CourseCatalogInjectedPopup, + argTypes: { + onClose: { action: 'onClose' }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + course: exampleCourse, + }, +}; diff --git a/src/stories/injected/CoursePopup.stories.ts b/src/stories/injected/CoursePopup.stories.ts index 3f5b3665..83377319 100644 --- a/src/stories/injected/CoursePopup.stories.ts +++ b/src/stories/injected/CoursePopup.stories.ts @@ -1,7 +1,7 @@ import { Course, Status } from 'src/shared/types/Course'; import { CourseMeeting } from 'src/shared/types/CourseMeeting'; import { UserSchedule } from 'src/shared/types/UserSchedule'; -import CoursePopup from 'src/views/components/injected/CoursePopup/CoursePopup'; +import CoursePopup from 'src/views/components/injected/CoursePopupOld/CoursePopup'; import type { Meta, StoryObj } from '@storybook/react'; import Instructor from 'src/shared/types/Instructor'; diff --git a/src/views/components/CourseCatalogMain.tsx b/src/views/components/CourseCatalogMain.tsx index c5e7e5da..723f5e7b 100644 --- a/src/views/components/CourseCatalogMain.tsx +++ b/src/views/components/CourseCatalogMain.tsx @@ -8,7 +8,7 @@ import { SiteSupport } from '../lib/getSiteSupport'; import { populateSearchInputs } from '../lib/populateSearchInputs'; import ExtensionRoot from './common/ExtensionRoot/ExtensionRoot'; import AutoLoad from './injected/AutoLoad/AutoLoad'; -import CoursePopup from './injected/CoursePopup/CoursePopup'; +import CoursePopup from './injected/CoursePopupOld/CoursePopup'; import RecruitmentBanner from './injected/RecruitmentBanner/RecruitmentBanner'; import TableHead from './injected/TableHead'; import TableRow from './injected/TableRow/TableRow'; diff --git a/src/views/components/common/Chip/Chip.tsx b/src/views/components/common/Chip/Chip.tsx index 90a6009c..b6701517 100644 --- a/src/views/components/common/Chip/Chip.tsx +++ b/src/views/components/common/Chip/Chip.tsx @@ -1,10 +1,21 @@ import React from 'react'; import Text from '../Text/Text'; -export const flags = ['WR', 'QR', 'GC', 'CD', 'E', 'II']; +/** + * A type that represents the flags that a course can have. + */ +export type Flag = 'WR' | 'QR' | 'GC' | 'CD' | 'E' | 'II'; +export const flagMap: Record = { + Writing: 'WR', + 'Quantitative Reasoning': 'QR', + 'Global Cultures': 'GC', + 'Cultural Diversity in the United States': 'CD', + Ethics: 'E', + 'Independent Inquiry': 'II', +}; interface Props { - label: string; + label: Flag; } /** diff --git a/src/views/components/injected/CourseCatalogInjectedPopup/CourseCatalogInjectedPopup.tsx b/src/views/components/injected/CourseCatalogInjectedPopup/CourseCatalogInjectedPopup.tsx new file mode 100644 index 00000000..0dfe7e26 --- /dev/null +++ b/src/views/components/injected/CourseCatalogInjectedPopup/CourseCatalogInjectedPopup.tsx @@ -0,0 +1,24 @@ +import Popup from '@views/components/common/Popup/Popup'; +import React from 'react'; +import { Course } from 'src/shared/types/Course'; +import { UserSchedule } from 'src/shared/types/UserSchedule'; +import Description from './Description'; +import GradeDistribution from './GradeDistribution'; +import HeadingAndActions from './HeadingAndActions'; + +interface CourseCatalogInjectedPopupProps { + course: Course; + activeSchedule?: UserSchedule; + onClose: () => void; +} + +const CourseCatalogInjectedPopup: React.FC = ({ course, activeSchedule, onClose }) => ( + +
+ + + +
+
+); +export default CourseCatalogInjectedPopup; diff --git a/src/views/components/injected/CourseCatalogInjectedPopup/Description.tsx b/src/views/components/injected/CourseCatalogInjectedPopup/Description.tsx new file mode 100644 index 00000000..0d8bb118 --- /dev/null +++ b/src/views/components/injected/CourseCatalogInjectedPopup/Description.tsx @@ -0,0 +1,30 @@ +import clsx from 'clsx'; +import React from 'react'; +import Text from '../../common/Text/Text'; + +interface DescriptionProps { + lines: string[]; +} + +const Description: React.FC = ({ lines }: DescriptionProps) => { + const keywords = ['prerequisite', 'restricted']; + return ( +
    + {lines.map(line => { + const isKeywordPresent = keywords.some(keyword => line.toLowerCase().includes(keyword)); + return ( +
    + +
  • + + {line} + +
  • +
    + ); + })} +
+ ); +}; + +export default Description; diff --git a/src/views/components/injected/CourseCatalogInjectedPopup/GradeDistribution.tsx b/src/views/components/injected/CourseCatalogInjectedPopup/GradeDistribution.tsx new file mode 100644 index 00000000..b1915d37 --- /dev/null +++ b/src/views/components/injected/CourseCatalogInjectedPopup/GradeDistribution.tsx @@ -0,0 +1,170 @@ +import Spinner from '@views/components/common/Spinner/Spinner'; +import Text from '@views/components/common/Text/Text'; +import Highcharts from 'highcharts'; +import HighchartsReact from 'highcharts-react-official'; +import React from 'react'; +import { Course } from 'src/shared/types/Course'; +import { Distribution, LetterGrade } from 'src/shared/types/Distribution'; +import { colors } from 'src/shared/util/themeColors'; +import { + NoDataError, + queryAggregateDistribution, + querySemesterDistribution, +} from 'src/views/lib/database/queryDistribution'; + +interface GradeDistributionProps { + course: Course; +} + +enum DataStatus { + LOADING = 'LOADING', + FOUND = 'FOUND', + NOT_FOUND = 'NOT_FOUND', + ERROR = 'ERROR', +} + +const GRADE_COLORS: Record = { + A: colors.gradeDistribution.a, + 'A-': colors.gradeDistribution.aminus, + 'B+': colors.gradeDistribution.bplus, + B: colors.gradeDistribution.b, + 'B-': colors.gradeDistribution.bminus, + 'C+': colors.gradeDistribution.cplus, + C: colors.gradeDistribution.c, + 'C-': colors.gradeDistribution.cminus, + 'D+': colors.gradeDistribution.dplus, + D: colors.gradeDistribution.d, + 'D-': colors.gradeDistribution.dminus, + F: colors.gradeDistribution.f, +}; + +const GradeDistribution: React.FC = ({ course }) => { + const [semester, setSemester] = React.useState('Aggregate'); + const [distributions, setDistributions] = React.useState>({}); + const [status, setStatus] = React.useState(DataStatus.LOADING); + const ref = React.useRef(null); + + const chartData = React.useMemo(() => { + if (status === DataStatus.FOUND && distributions[semester]) { + return Object.entries(distributions[semester]).map(([grade, count]) => ({ + y: count, + color: GRADE_COLORS[grade as LetterGrade], + })); + } + return []; + }, [distributions, semester, status]); + + React.useEffect(() => { + const fetchInitialData = async () => { + try { + const [aggregateDist, semesters] = await queryAggregateDistribution(course); + const initialDistributions: Record = { Aggregate: aggregateDist }; + const semesterPromises = semesters.map(semester => querySemesterDistribution(course, semester)); + const semesterDistributions = await Promise.all(semesterPromises); + semesters.forEach((semester, i) => { + initialDistributions[`${semester.season} ${semester.year}`] = semesterDistributions[i]; + }); + setDistributions(initialDistributions); + setStatus(DataStatus.FOUND); + } catch (e) { + console.error(e); + if (e instanceof NoDataError) { + setStatus(DataStatus.NOT_FOUND); + } else { + setStatus(DataStatus.ERROR); + } + } + }; + + fetchInitialData(); + }, [course]); + + const handleSelectSemester = (event: React.ChangeEvent) => { + setSemester(event.target.value); + }; + + const chartOptions: Highcharts.Options = { + title: { text: undefined }, + subtitle: { text: undefined }, + legend: { enabled: false }, + xAxis: { + title: { text: 'Grade' }, + categories: ['A', 'A-', 'B+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D', 'D-', 'F'], + crosshair: true, + }, + yAxis: { + min: 0, + title: { text: 'Number of Students' }, + }, + chart: { + style: { fontFamily: 'Roboto Flex', fontWeight: '600' }, + spacingBottom: 25, + spacingTop: 25, + height: 250, + }, + credits: { enabled: false }, + accessibility: { enabled: true }, + tooltip: { + headerFormat: '{point.key}', + pointFormat: + '', + footerFormat: '
{point.y:.0f} Students
', + shared: true, + useHTML: true, + }, + plotOptions: { + bar: { pointPadding: 0.2, borderWidth: 0 }, + series: { animation: { duration: 700 } }, + }, + series: [ + { + type: 'column', + name: 'Grades', + data: chartData, + }, + ], + }; + + return ( +
+ {status === DataStatus.LOADING && } + {status === DataStatus.NOT_FOUND && No grade distribution data found} + {status === DataStatus.ERROR && Error fetching grade distribution data} + {status === DataStatus.FOUND && ( + <> +
+ Grade distribution for {`${course.department} ${course.number}`} + +
+ + + )} +
+ ); +}; + +export default GradeDistribution; diff --git a/src/views/components/injected/CourseCatalogInjectedPopup/HeadingAndActions.tsx b/src/views/components/injected/CourseCatalogInjectedPopup/HeadingAndActions.tsx new file mode 100644 index 00000000..117fcfbe --- /dev/null +++ b/src/views/components/injected/CourseCatalogInjectedPopup/HeadingAndActions.tsx @@ -0,0 +1,136 @@ +import { Button } from '@views/components/common/Button/Button'; +import { Chip, flagMap } from '@views/components/common/Chip/Chip'; +import Divider from '@views/components/common/Divider/Divider'; +import Text from '@views/components/common/Text/Text'; +import React from 'react'; +import addCourse from 'src/pages/background/lib/addCourse'; +import openNewTab from 'src/pages/background/util/openNewTab'; +import { Course } from 'src/shared/types/Course'; +import { UserSchedule } from 'src/shared/types/UserSchedule'; +import Add from '~icons/material-symbols/add'; +import CalendarMonth from '~icons/material-symbols/calendar-month'; +import CloseIcon from '~icons/material-symbols/close'; +import Copy from '~icons/material-symbols/content-copy'; +import Description from '~icons/material-symbols/description'; +import Mood from '~icons/material-symbols/mood'; +import Reviews from '~icons/material-symbols/reviews'; + +interface HeadingAndActionProps { + /* The course to display */ + course: Course; + /* The active schedule */ + activeSchedule: UserSchedule; + /* The function to call when the popup should be closed */ + onClose: () => void; +} + +/** + * Renders the heading component for the CoursePopup component. + * + * @param {HeadingAndActionProps} props - The component props. + * @returns {JSX.Element} The rendered component. + */ +const HeadingAndActions: React.FC = ({ course, onClose, activeSchedule }) => { + const { courseName, department, number: courseNumber, uniqueId, instructors, flags, schedule } = course; + const instructorString = instructors + .map(instructor => { + const { firstName, lastName } = instructor; + if (firstName === '') return lastName; + return `${firstName} ${lastName}`; + }) + .join(', '); + const handleCopy = () => { + navigator.clipboard.writeText(uniqueId.toString()); + }; + const handleOpenCalendar = async () => { + const url = chrome.runtime.getURL('calendar.html'); + await openNewTab(url); + }; + const handleOpenRateMyProf = async () => { + const openTabs = instructors.map(instructor => { + const { fullName } = instructor; + const url = `https://www.ratemyprofessors.com/search/professors/1255?q=${fullName}`; + return openNewTab(url); + }); + await Promise.all(openTabs); + }; + const handleOpenCES = async () => { + // TODO: does not look up the professor just takes you to the page + const cisUrl = 'https://utexas.bluera.com/utexas/rpvl.aspx?rid=d3db767b-049f-46c5-9a67-29c21c29c580®l=en-US'; + await openNewTab(cisUrl); + }; + const handleOpenPastSyllabi = async () => { + // not specific to professor + const url = `https://utdirect.utexas.edu/apps/student/coursedocs/nlogon/?year=&semester=&department=${department}&course_number=${courseNumber}&course_title=${courseName}&unique=&instructor_first=&instructor_last=&course_type=In+Residence&search=Search`; + await openNewTab(url); + }; + const handleAddCourse = async () => { + await addCourse(activeSchedule.name, course); + }; + return ( +
+
+
+ + {courseName} + + + {' '} + ({department} {courseNumber}) + + + +
+
+ + with {instructorString} + +
+ {flags.map(flag => ( + + ))} +
+
+
+ {schedule.meetings.map(meeting => ( + + {meeting.getDaysString({ format: 'long', separator: 'long' })}{' '} + {meeting.getTimeString({ separator: ' to ', capitalize: false })} + {meeting.location && ( + <> + {` in `} + + {meeting.location.building} + + + )} + + ))} +
+
+
+ + + + +
+ +
+ ); +}; + +export default HeadingAndActions; diff --git a/src/views/components/injected/CoursePopup/CourseDescription/CourseDescription.module.scss b/src/views/components/injected/CoursePopupOld/CourseDescription/CourseDescription.module.scss similarity index 100% rename from src/views/components/injected/CoursePopup/CourseDescription/CourseDescription.module.scss rename to src/views/components/injected/CoursePopupOld/CourseDescription/CourseDescription.module.scss diff --git a/src/views/components/injected/CoursePopup/CourseDescription/CourseDescription.tsx b/src/views/components/injected/CoursePopupOld/CourseDescription/CourseDescription.tsx similarity index 100% rename from src/views/components/injected/CoursePopup/CourseDescription/CourseDescription.tsx rename to src/views/components/injected/CoursePopupOld/CourseDescription/CourseDescription.tsx diff --git a/src/views/components/injected/CoursePopup/CourseHeader/CourseButtons/CourseButtons.module.scss b/src/views/components/injected/CoursePopupOld/CourseHeader/CourseButtons/CourseButtons.module.scss similarity index 100% rename from src/views/components/injected/CoursePopup/CourseHeader/CourseButtons/CourseButtons.module.scss rename to src/views/components/injected/CoursePopupOld/CourseHeader/CourseButtons/CourseButtons.module.scss diff --git a/src/views/components/injected/CoursePopup/CourseHeader/CourseButtons/CourseButtons.tsx b/src/views/components/injected/CoursePopupOld/CourseHeader/CourseButtons/CourseButtons.tsx similarity index 100% rename from src/views/components/injected/CoursePopup/CourseHeader/CourseButtons/CourseButtons.tsx rename to src/views/components/injected/CoursePopupOld/CourseHeader/CourseButtons/CourseButtons.tsx diff --git a/src/views/components/injected/CoursePopup/CourseHeader/CourseHeader.module.scss b/src/views/components/injected/CoursePopupOld/CourseHeader/CourseHeader.module.scss similarity index 100% rename from src/views/components/injected/CoursePopup/CourseHeader/CourseHeader.module.scss rename to src/views/components/injected/CoursePopupOld/CourseHeader/CourseHeader.module.scss diff --git a/src/views/components/injected/CoursePopup/CourseHeader/CourseHeader.tsx b/src/views/components/injected/CoursePopupOld/CourseHeader/CourseHeader.tsx similarity index 100% rename from src/views/components/injected/CoursePopup/CourseHeader/CourseHeader.tsx rename to src/views/components/injected/CoursePopupOld/CourseHeader/CourseHeader.tsx diff --git a/src/views/components/injected/CoursePopup/CoursePopup.module.scss b/src/views/components/injected/CoursePopupOld/CoursePopup.module.scss similarity index 100% rename from src/views/components/injected/CoursePopup/CoursePopup.module.scss rename to src/views/components/injected/CoursePopupOld/CoursePopup.module.scss diff --git a/src/views/components/injected/CoursePopup/CoursePopup.tsx b/src/views/components/injected/CoursePopupOld/CoursePopup.tsx similarity index 100% rename from src/views/components/injected/CoursePopup/CoursePopup.tsx rename to src/views/components/injected/CoursePopupOld/CoursePopup.tsx diff --git a/src/views/components/injected/CoursePopup/GradeDistribution/GradeDistribution.module.scss b/src/views/components/injected/CoursePopupOld/GradeDistribution/GradeDistribution.module.scss similarity index 100% rename from src/views/components/injected/CoursePopup/GradeDistribution/GradeDistribution.module.scss rename to src/views/components/injected/CoursePopupOld/GradeDistribution/GradeDistribution.module.scss diff --git a/src/views/components/injected/CoursePopup/GradeDistribution/GradeDistribution.tsx b/src/views/components/injected/CoursePopupOld/GradeDistribution/GradeDistribution.tsx similarity index 100% rename from src/views/components/injected/CoursePopup/GradeDistribution/GradeDistribution.tsx rename to src/views/components/injected/CoursePopupOld/GradeDistribution/GradeDistribution.tsx