Compare commits

...

495 Commits

Author SHA1 Message Date
Diego Perez
0939cab8f5 Merge branch 'main' into derek/settingsPageLag 2026-01-08 18:31:24 -06:00
doprz
518a3286fa feat(release): v2.3.0 2026-01-07 13:11:01 -06:00
Diego Perez
2d18553f98 feat: LHD birthday (#717)
* chore: add tsparticles/react

* fix: imports and lint issues

* fix: imports and format

* feat: refactor settings and add LHD birthday celebration

* chore: lint and format
2026-01-07 10:36:45 -06:00
doprz
68e3fe45fa chore(nix): update lock file 2026-01-06 12:47:27 -06:00
Diego Perez
38bb29b20b feat(nix): build UTRP (#714)
* feat(nix): build UTRP

* feat(nix): set fixed rev and sha256 + update lock file

* chore(nix): remove systems input

* chore: format

* chore(nix): add meta attribute

* feat(nix): add doprz as a maintainer
2026-01-06 12:39:34 -06:00
Diego Perez
8ccf7fb37e feat(nix): add prettier-version-match check (#713) 2025-12-26 13:24:22 -06:00
doprz
b406d4dd24 fix: .editorconfig syntax for nix files 2025-12-17 13:50:47 -06:00
doprz
d12c8bd7b7 chore: add treefmt/prettier note 2025-12-13 22:56:38 -06:00
doprz
ea5d1e2b16 chore: format 2025-12-13 22:49:09 -06:00
doprz
c2b43dc949 refactor(nix): use flake-parts (#642)
refactor(nix): split into flake parts module and add shell.nix

chore: add prettier to treefmt and pin version

chore(nix): add prettier exclude

chore(nix): bump pnpm to v10.18.2

feat(nix): add overlay for nodejs

feat(nix): add overlay for nodejs

chore: consolidate .editorconfig
2025-12-13 22:48:23 -06:00
8d2fdfa63c chore: feature request made better for the common student (#702)
I made these a less painful experience for the average non cs major who just wants to make an issue request

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-11-22 18:11:20 -06:00
c1ffd89dbe Refine bug report template for clarity and conciseness (#703)
Updated the bug report template to streamline the checklist and clarify sections.

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-11-22 18:10:40 -06:00
Aaron Park
dd8187d6da style: UTRP-14: Add a bigger "hitbox" to calendar sidebar buttons (#563)
* fix(sidebar): increase sidebar button hitbox

* chore(ui): change hitbox area for plus button

* chore(ui): update size of hitbox area

* fix: fix pnpm version conflict

* fix: pnpm version conflict

* chore(ui): update size of hitbox area for the social links

* feat: calendar footer story

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
Co-authored-by: Derek <derex1987@gmail.com>
2025-11-20 13:40:17 -06:00
5028d07f0b style: overflow no longer has the scroll because it is meant to be truncated (#704)
oh finally - DerexXD
2025-11-20 12:22:18 -06:00
4f5d8c6d20 fix: toSorted outdated chrome bug (#694)
* fix: polyfill

* fix: polyfill implemented

* chore: lint

* chore: replace polyfill with a single function replacement

* Delete src/polyfills.ts
2025-11-18 22:56:09 -06:00
f77f663fe7 feat: made a handler for github stats messages same way as the rest 2025-11-17 15:37:01 -06:00
Vincent Situ
6a67a32e4f feat: allow bypassing the 10-schedule limit (#675)
* feat: allow bypassing the 10-schedule limit

* feat: option to bypass 10 schedules- code done, not tested

* feat(ui): option to bypass 10 schedules

* feat(ui): button to lead to settings after reaching max limit

* Delete manifest.json

* Remove cross-env from build:watch script

* Remove cross-env and update caniuse-lite version

Removed cross-env dependency and updated caniuse-lite version.

* chore: lint

---------

Co-authored-by: Derek <derex1987@gmail.com>
2025-11-10 13:39:36 -06:00
Uthman
549c52a39f feat: add drag-and-drop import for schedules (#661)
* testing

* feat: add drag-and-drop support to FileUpload (#446)

* chore: remove testing comment

* chore: fix lint issues

* chore: format FileUpload.tsx with prettier

---------

Co-authored-by: Uthman Ogungbo <uthmanogungbo@Uthmans-MacBook-Pro.local>
Co-authored-by: Uthman Ogungbo <uthmanogungbo@wireless-10-148-166-229.public.utexas.edu>
Co-authored-by: Derek <derex1987@gmail.com>
2025-11-06 23:03:55 -06:00
doprz
36007b9d1a docs: add CODE_OF_CONDUCT.md (#651)
Added a Code of Conduct document to outline community guidelines and expectations.

Co-authored-by: Derek <derex1987@gmail.com>
2025-11-05 16:58:16 -06:00
cee5f0284f feat: condense resourceLinks course schedule (#676)
* chore: remove summer 2025 schedule list item

* feat: compress course schedules into one link

* Revise ResourceLinks with Spring '26 schedule

Updated course schedule links for Spring '26.
2025-11-05 16:38:00 -06:00
dependabot[bot]
e8a8b8e1ae chore(deps): bump the npm_and_yarn group across 1 directory with 4 updates (#639)
Bumps the npm_and_yarn group with 4 updates in the / directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite), [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers), [brace-expansion](https://github.com/juliangruber/brace-expansion) and [undici](https://github.com/nodejs/undici).


Updates `vite` from 5.4.14 to 5.4.20
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.20/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.20/packages/vite)

Updates `@babel/helpers` from 7.26.9 to 7.28.4
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.28.4/packages/babel-helpers)

Updates `brace-expansion` from 1.1.11 to 1.1.12
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)

Updates `undici` from 6.21.1 to 6.22.0
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v6.21.1...v6.22.0)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 5.4.20
  dependency-type: direct:development
  dependency-group: npm_and_yarn
- dependency-name: "@babel/helpers"
  dependency-version: 7.28.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: brace-expansion
  dependency-version: 1.1.12
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: undici
  dependency-version: 6.22.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-13 11:36:53 -05:00
doprz
c21cbd77f0 feat(release): v2.2.2 2025-10-13 11:20:01 -05:00
99a035e29d chore: remove summer 2025 schedule list item (#637) 2025-10-13 02:25:27 -05:00
doprz
64baa6d290 refactor(nix): dev shells (#634) 2025-10-12 22:47:47 -05:00
Samuel Gunter
46fe591fa7 fix: whitespace wrapping in semester warning (#629) 2025-10-07 18:28:41 -05:00
doprz
8f7e1bc0af feat(env): add SENTRY env vars 2025-10-07 16:11:14 -05:00
doprz
9fc1098ef7 chore(env): add .env.example 2025-10-07 16:00:40 -05:00
Warith Rahman
ae094416fc chore(ui): added spring 2026 course schedule (#628) 2025-10-07 15:26:15 -05:00
ishita778
2e7dac1e3e feat: show warning for courses of different semesters (#570)
* chore: removed extra space at calendar footer

* chore: fixed eslint issues

* chore: changed return type to react node

* chore: displaycourses true fixes and checks fixed

* chore: prettier fix

* feat: not working same semester course issue

* feat: modifying components to use the new hook

* feat: small fixes

* fix: remove comments and spaces

* fix: dialog error solved

* fix: add to new schedule

* fix: prettier

* fix: delete unnecessary custom hook and p[rettier

* fix: checks all passing

* fix: added requested changes

* fix: added new conditions

* fix: description fixed

* style: fix Roboto Flex not being used as font in dialog

* fix: made requested changes

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
Co-authored-by: Razboy20 <razboy20@gmail.com>
Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
2025-08-27 13:41:36 -05:00
doprz
7bea23a655 refactor: nix flake (#625)
* chore(nix): update flake

* chore(nix): remove just and update comment

* chore(nix): update node version + volta config

* refactor: nix flake
2025-08-25 11:33:44 -07:00
Samuel Gunter
3d28869e92 chore: spring 2025 grades (#624) 2025-08-18 00:29:59 -05:00
doprz
f0f1f0b365 chore: bump node and pnpm version (#620)
* chore(nix): update flake

* chore(nix): remove just and update comment

* chore(nix): update node version + volta config
2025-08-12 14:00:45 -05:00
be861b823c feat: search result shading (#617)
* feat: site support kws

* feat: function

* feat: stuff before bedtime

* feat: shading function

* feat: shading

* feat: shading the table children

* chore: fix lint issues

* feat: dependency array

* feat: remove

* feat: remove temp console log
2025-08-07 13:28:56 -05:00
Samuel Gunter
95de8df372 fix: fix or ignore various eslint warning (#609) 2025-07-16 07:54:40 -07:00
5994ded8be feat: export schedule button add to calendar (#594)
* feat: export schedule button add to calendar add to util too

* docs: hypen bruh

* chore: lowercase

* style: filecode icon

* chore: unused import

* refactor: use export json deleted old function

* chore: linting

* chore: remove useless import

---------

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
2025-06-17 11:57:48 -07:00
doprz
7b401add15 feat: add nix flake (#593)
Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
2025-06-08 23:16:43 -05:00
Samuel Gunter
2d92dd47f0 feat: support summer grades, fix summer course parser (#596)
* feat: support summer grades, fix summer course parser

* chore: lint

* docs: mention summer terms in Course::number description

* feat: Course::getNumberWithoutTerm, strip summer term indicator when displaying grades

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-06-08 21:10:05 -07:00
Aiyaz Mostofa
eb8141ee8c fix: limit height of schedule list dropdown in the extension popup (#543)
* fix: limit height of schedule list dropdown in the extension popup

* fix: limit the entire dropdown to 200px, not just the schedule list

* fix: use flexbox for dropdown and wedge scrollbar inside margin

* fix: use DisclosurePanel in schedule dropdown, do Uno class sorting

---------

Co-authored-by: Ethan Lanting <ethanlanting@gmail.com>
Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-06-08 20:54:36 -07:00
sjalkote
2a50f5580d feat: automatically select new or duplicated schedules (#583) (#589)
Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
2025-06-08 20:39:46 -07:00
doprz
65bfb1d129 docs: add pnpm and update versions (#597) 2025-06-08 15:57:12 -05:00
doprz
234f3d627d feat(release): v2.2.1 2025-06-03 19:46:36 -05:00
Ethan Lanting
be1dccfcb9 feat: add dining app promo (#598)
* feat: add DiningAppPromo component and integrate it into Calendar

* feat: update WhatsNewPopup with new features and app download link

* fix: remove outdated links

* chore: run lint

* chore: run prettier

* feat: enhance DiningAppPromo with close button and integrate user preference for promo visibility

* chore: run lint

* chore: run check types

* fix: correct promo visibility logic in Calendar component

* feat: centralize app store URLs in appUrls.ts

* chore: run lint

* feat: integrate UT Dining promo image

* chore: run lint

* fix: update logo in WhatsNew popup to use LD icon

* fix: convert URLs to URL objects for consistency

* fix: update LD icon in WhatsNew popup to new version

* fix: update description for Coffee Shops feature to clarify operating times

* fix: rename promo state and storage key to showUTDiningPromo for clarity

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-05-28 20:13:45 -05:00
Razboy20
454e5e807a fix: hide sentry instrumentation on debug builds (#604)
* fix: hide sentry instrumentation on debug builds

* fix: amend documentation to reference zip:to-public rather than zip
2025-05-27 23:35:11 -05:00
Razboy20
29d20d5c5a chore: setup dependabot configuration (#603)
* chore: setup dependabot configuration
2025-05-27 22:55:11 -05:00
doprz
e29546c727 chore: update issue templates 2025-05-27 21:55:36 -05:00
doprz
5a89be6238 chore: update issue templates 2025-05-27 21:53:42 -05:00
Samuel Gunter
cfb5faa09b fix: course columns on calendar (#587)
* fix: course columns on calendar

* test: new tests for course cell columns, extract calls to help function

* fix: gracefully handle async courses

* refactor: split course cell column logic into multiple functions, add comments, and derive fields

* chore: comments, for-index to for-of

* chore: fix typo

* fix: don't use sentry in storybook contexts

* fix: silence, brand

* refactor: don't rely on calculating columns, find as you go

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-05-06 16:07:27 -05:00
37471efb74 feat: inside jokes005 (#590)
* feat: moved some of my lines together removed one of mine and added jack black

* feat: just ctrl x ctrl v a few lines

* Update insideJokes.tsx
2025-04-13 21:33:52 -05:00
doprz
7a4f40a765 feat(release): v2.2.0 2025-04-06 18:11:27 -05:00
doprz
d11d55db66 chore: update exec list (#580)
* chore: update exec list

* chore: update roles

* chore: update h2

* fix: key

* chore: caps
2025-04-05 14:33:44 -05:00
Samuel Gunter
76b6aa7c15 fix: include logo in screenshot, fix screenshots on small/zoomed windows (#579)
* fix: include logo in screenshot

* fix: screenshots on small/zoomed windows, screenshots with no async/other

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2025-04-05 11:21:37 -05:00
Samuel Gunter
70d4fecad6 feat: recruitment banner for designer (#578) 2025-04-04 09:56:37 -05:00
Samuel Gunter
c3fa91752c chore: bump migration dialog message number, remove unused UpdateText component (#577) 2025-04-02 10:00:05 -05:00
Ethan Lanting
7c2beef193 feat: auto create empty schedule when deleted all schedules (#552)
* feat: enhance schedule deletion to create a new schedule if none remain

* feat: set active index to new schedule if only one exists

* chore: run lint

* feat: enhance schedule deletion to create a new schedule if none remain

* feat: set active index to new schedule if only one exists

* chore: run lint

* feat: reset schedules on update, refactor invariant to within deleteSchedule

* chore: pnpm lint

---------

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
Co-authored-by: Samuel Gunter <sgunter@utexas.edu>
2025-04-01 13:24:08 -05:00
Samuel Gunter
630d0d80d2 chore: professionalism in jokes (#572) 2025-03-26 14:16:06 -05:00
Samuel Gunter
695743104c feat: persist sidebar toggle state (#569) 2025-03-26 13:50:34 -05:00
Samuel Gunter
d014244b28 chore: pin volta pnpm version (#573) 2025-03-25 23:00:34 -05:00
Samuel Gunter
5cd56259f7 test: fix flaky sleep test (#571) 2025-03-24 02:28:41 -05:00
Samuel Gunter
fa9f78b46e feat: sticky calendar header and days (#568)
* feat: sticky calendar days

* feat: partial height borders for day labels

* feat: make calendar header actually sticky

* fix: remove unneeded gap

* refactor: add preston as co-author

Co-authored-by: Preston-Cook <preston.l.cook@gmail.com>

* fix: z-index issues with export sub-buttons

---------

Co-authored-by: Preston-Cook <preston.l.cook@gmail.com>
Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-03-23 19:49:11 -05:00
Samuel Gunter
4a5f67f0fd fix: ics calendar export dates (#535)
* feat: academicCalendars object

* feat: seemingly working start, end, and until dates

* feat: seemingly working everything

* style: removed unnecessary deps, reorganized code

* style: code comments yay

* chore: old version of pnpm?

* ci: force github actions to rerun

* feat: list instructors in ics string, basic tests

* feat: testable code for ICS, tests for ICS, filter excluded dates

* style: eslint autofix

* test: check for graceful handling of errors in ICS

* fix: actually use scheduleToIcsString

* chore: eslint didn't include a space where it should've

* fix: ensure tz everywhere

* refactor: move string util to string util file

* feat: em dash in calendar event title

* feat: academic calendars 22-23 and 23-24

* fix: en dash instead of em dash
2025-03-22 22:55:16 -05:00
Yash Kukrecha
3bed9cc27f fix(schedule): truncate long schedule names in popup (#564) 2025-03-22 21:10:21 -05:00
ishita778
0dcae25b93 chore: removed extra space at calendar footer (#557)
* chore: removed extra space at calendar footer

* chore: fixed eslint issues

* chore: changed return type to react node

* chore: displaycourses true fixes and checks fixed

* chore: prettier fix
2025-03-18 04:00:46 -05:00
beastgwert
ca734dcd39 feat: rework start time to checkboxes (#553)
* feat: replace dropdown with checkbox

* refactor: remove console logs

* refactor: eslint happy

* refactor: change daysValue from string to array

* style: match course schedule page styling

* style: remove label font-normal

* style: finalize course schedule page style match

---------

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
2025-03-15 22:37:51 -05:00
Samuel Gunter
9448072112 feat: ensure unique splash text on schedule change (#554) 2025-03-10 18:57:54 -05:00
ishita778
b1e98ca9d7 chore: Modify the schedule creation prompt (#550)
* chore: modify the schedule creation prompt

* chore: changed border color to offwhite

---------

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
2025-03-08 21:01:46 -06:00
Abdulrahman Alshahrani
f036d409e6 feat: implement a What's New prompt (#539)
* feat: create whats new initial component

* feat: create initial whats-new hook

* feat: create whats-new story

* feat: add button to open dialog in storybook

* feat: complete popup ui

* feat: add check for new updates or installs

* fix: fix linter issues

* fix: use proper features and add video

* fix: properly fetch version from manifest

* feat: add a link to open the popup

* fix: update spacing and features' content

* fix: update UTRP Map name

* fix: increase icon size and display version correctly

* feat: update the features video

* fix: update offwhite color

* fix: color typo

* fix: fixing colors again

* feat: use numbers instead of boolean

* fix: typo in import

* feat: add type safety to features array

* feat: cdn video url

* fix: delete mp4 video

* feat: handle video failure to load

* fix: make border outline tight to video

* feat: make design responsive

* fix: make features array readonly

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
Co-authored-by: Derek Chen <derex1987@gmail.com>
2025-03-08 15:41:09 -06:00
ishita778
5493c63f18 chore: Change the highlight color on-hover over grade distribution bars to off-white/50 (#547)
* chore: opacity changed to 50 percent

* chore: fix pnpm lock file

* chore: pnpm checks pass attempt

* chore: pnpm lock checks should work

* fix: opacity 50 and pnpm version

* chore: pnpm lock file fix
2025-03-07 13:31:23 -06:00
ishita778
6c3139bf0f fix: merge course labels across pages (#541)
* fix: merge course labels across pages

* fix: merge same course

* fix: all checks pass

* fix: updated addrows function

* fix: prettier check

* fix: all checks

* fix: all checks pass

* fix: moved query tbody outside

* fix: uses row element

* fix: checks pass now

---------

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
2025-03-05 15:08:33 -06:00
Krish Patel
28ebb69612 style: update delete schedule prompt (#546)
Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
2025-03-05 14:15:59 -06:00
Samuel Gunter
008cb40cb8 style: move input click style to central place (#532)
Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-03-05 14:05:34 -06:00
doprz
195d3a219a chore(release): v2.1.1 2025-03-02 21:01:18 -06:00
doprz
c6452c4f2b feat: add isDeveloper 2025-03-02 20:47:31 -06:00
doprz
3dbacf0d65 chore: pin node@20.9.0 (#540) 2025-03-01 12:54:31 -06:00
doprz
56a82baf40 chore: update lock file and set engine to use pnpm v10 (#536)
* chore: update lock file and set engine to use pnpm v10.5.2

* chore: set pnpm version to v10.x.x

* chore(ci): use pnpm v10

* chore: update Dockerfile to use pnpm@latest-10

* chore(ci): use pnpm/action-setup@v4
2025-02-28 22:54:46 -06:00
ishita778
20d210245b chore: rename unscheduled text at calendar footer (#538) 2025-02-28 11:46:19 -06:00
ishita778
21cbcf677a chore: changed text to data source (#537) 2025-02-28 11:07:19 -06:00
Samuel Gunter
8fb355d03b chore(cal): update course schedule links for fall and summer 2025 (#534) 2025-02-27 23:37:38 -06:00
doprz
218477404f feat: map page (#390)
* feat: add boilerplate

* feat: add working paths

* feat: improve building selection controls and add week schedule

Signed-off-by: doprz <52579214+doprz@users.noreply.github.com>

* fix: sort week schedule

Signed-off-by: doprz <52579214+doprz@users.noreply.github.com>

* feat(testing): improve pathfinding

* Revert "feat(testing): improve pathfinding"

This reverts commit 87998cedbf.

* feat: add pathfinding with building selection controls

Signed-off-by: doprz <52579214+doprz@users.noreply.github.com>

* feat: improve path finding algorithm thresholds

* feat: add DaySelector, PathStats, and WeekSchedule components

* feat: add working stats and daily schedule

* chore: refactor everything

* feat: add linear walkway node generation

* feat: add bezier curve walkway node generation

* feat: add circular walkway node generation

* docs: add docs

* feat: add individual path selection and bump version

* fix: tsdoc and updated components/utils

* chore(deps): update deps

* feat: add UTRP Map and Debug Page to Settings > Developer Mode

* chore: fix pr review comments

* chore: add showDebugNodes

* chore: add all buildings around the UT tower

* chore: add stadium POIs

* chore: add east mall buildings

* chore: update DaySelector to use proper button styling

* chore: add university ave walkway

* feat: add zoom, pan, and dev controls functionality

- Fix SVG Overlay Alignment
- Use SVG for map
- Add Dev Controls
- Fix day selector position
- Update the SVG's `preserveAspectRatio` attribute to `xMidYMid` meet to
ensure proper scaling
- Use `useCallback` for event handlers to prevent unnecessary re-renders
- Remove old PNG map

* feat: add dynamic rendering"

* feat: add dynamicRendering dev toggle and fullscreen support

* chore: update deps

* chore: disable viewport svg overlay culling if dynamic rendering is off

* chore: update pnpm-lock.yaml

* chore: add north mall buildings

* chore: add buildings next to JES

* refactor: map components into individual files

* fix: missing import

---------

Signed-off-by: doprz <52579214+doprz@users.noreply.github.com>
2025-02-27 19:44:03 -06:00
Ethan Lanting
766c0bc1b4 fix: import schedule file upload button (#515)
* fix: add active scale style and accept file prop

* chore: improve type safety using MIMEType

* fix: update FileUpload component to support multiple MIME types in accept prop

* chore: run lint

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-02-24 20:17:49 -06:00
Samuel Gunter
4a8d0666c2 chore: update grades as of fall 2024 (#508) 2025-02-21 16:09:53 -06:00
doprz
8fac10a743 chore(release): v2.1.0 2025-02-19 19:39:25 -06:00
doprz
1aa4e8c5fb feat(build): add vite-build-logger (#507)
* feat(build): add vite-build-logger

* chore: fix types

* chore: fix logic

---------

Co-authored-by: Preston-Cook <preston.l.cook@gmail.com>
2025-02-15 00:05:56 -06:00
Preston Cook
ee4c6ce699 feat(ui): update popup and course blocks (#506)
* feat(ui): add time and location to popup

* feat(ui): memoize meeting times

* feat(ui): remove resizing

* feat(ui): add no select to copy course id button

* feat(ui): complete update to popup and course blocks

* chore: update settings page

* chore: fix types

* fix(ui): update spacing, padding, and remove last updated section

* chore: fix type issues

* fix(ui): update borders to offwhite/50

* fix(ui): apply proper offwhite styling

* fix(ui): add unique key to async courses in bottom bar
2025-02-13 18:07:05 -06:00
Ethan Lanting
b171f01d01 feat(ui): Modify Calendar Footer design and Unscheduled courses (#503)
* feat: update styling and text for unscheduled courses in footer

* refactor: correct offwhite theme colors

* fix(ui): adjust em dash spacing, footer bottom padding, and vertically align course text

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-02-13 13:09:40 -06:00
Preston Cook
846070ebb5 fix(ui): stop import button dropdown from squishing (#504) 2025-02-07 20:52:03 -06:00
Preston Cook
9c766c2695 feat(ui): calendar header redesign (#479)
* feat(ui): calendar header redesign (WIP)

* feat(ui): calendar header redesign (WIP)

* chore: use path alias

* feat(ui): calendar header redesign

* implement Isaiah changes

* refactor to prevent unnecessary recreations of resize observer

* clean up resize observer and remove unnecessary checks

* remove offwhite border from toolbar

* merge

* complete toolbar

* update screenreader functionality

* ensure truncation works

* merge

* finish new toolbar

* remove unused screen size hook and .mjs file

* add in export button with options

* add static size for export button dropdown to prevent shrinking on smaller viewports

* change schedule section min width to prevent shrinkage

* change text for schedule section to match small caps

* fix truncating issues with small caps

* remove hidden overflow

* add padding

* add min height for hader

* reserve scrollbar width

* tmp

* add sticky positioning to header

* fix inert prop issue

* remove pnpm lock file

* fix scrollbar appearing too early

* fix vertical stickiness

* fix(ui): fix header spacing

* fix(ui): update total hours and courses to be h4

* fix(ui): reduce top spacing on header

* fix(ui): remove header top padding

* fix(ui): stop bottom scrollbar from shifting layout

* feat: add functionality to header and fix screenshot spacing

* feat: add functionality to header and fix screenshot spacing

* fix(ui): allow scrollbar in header and adjust padding to compensate for reserved space

* fix(ui): make export options container hug children

* fix(ui): add offwhite border

* chore: add back lock file from main branch :)

* feat(ui): add reduced motion for accessability

* feat(ui): change right scrollbar on calendar grid to be hidden when not necessary

* chore: make all buttons except export invisible

* chore: remove all buttons except export and adjust hardcoded pixel widths for responsiveness

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
Co-authored-by: Razboy20 <razboy20@gmail.com>
2025-02-05 23:53:16 -06:00
Preston Cook
4752f5860a fix(ui): fix longstanding drag-and-drop duplication issue (#502)
* fix(ui): fixed color switching on list reordering

* chore: remove lock file

* chore: add back lock file

* feat(ui): fix color duplication issue and prevent scrolling beyond parent

* feat(ui): add to storybook

* fix(ui): remove white background while dragging

* chore: remove dnd pangea from package.json

* chore: rebuild lock file

* chore: remove nested li element issue

* fix(ui): allow grabbing cursor while dragging

* fix(ui): address chromatic errors

* fix(ui): address chromatic errors

* fix(ui): address linting issues and pass tests

* fix(ui): create hook for modifying the cursor globally

* chore: add check for storybook env

* chore: add back unused import to AddAllButton

* fix: make cursor grabbing hook more explicit

* chore: move sortable list item into sortable list file

* fix: remove isStorybook prop from ScheduleListItem

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-02-04 17:28:54 -06:00
Ethan Lanting
c2328e461e feat(ui): color picker final touches (#491)
* fix: update CourseCellColorPicker.tsx background to white

* feat: add color picker to CalendarCourseCell component

* feat: add color picker functionality to update course colors

* fix: type issues with storybook components

* feat: add useColorPicker hook, isValidHexColor and updateCourseColors utilities

* refactor: color picker logic and UI components

* refactor: update useFlattenedCourseSchedule hook to include courseID property

* refactor: update storybook calendar components with updated props

* refactor: update color picker ui logic to account for position of cell

* fix: revert back to error handling for invalid rgb

* refactor: update jsdocs

* refactor: integrate ColorPickerContext into Calendar components and update props

* refactor: integrate ColorPickerContext into Calendar components and update related props

* refactor: change JSDocs comments and remove unused color inversion state

* refactor: update story components

* feat: add functionality for selecting secondary course colors

* refactor: enhance HexColorEditor to dynamically adjust tag icon color based on preview color

* refactor: simplify JSDoc comment in useColorPicker hook

* fix: revert Button component

* refactor: update CalendarCourseCell component positioning and styling

* fix: correct types in color.ts

* feat: add getDarkerShade function to compute darker shades of hex colors

* feat: add shadow to color picker button

* fix: update button size in ColorPatch component

* feat: implement debounced input for hex color editor and add useDebounce hook

* chore: utilize the logical and && operator instead of the ternary operator

* fix: imports and palette icon

* refactor: remove unused import

* fix: bug when course add fails with custom colors

* chore: run lint

* chore: run check-types

* feat: add HSL color type and conversion functions

* refactor: rename colorway to theme

* fix: hide color picker on screenshot

* fix: undo important syntax

* refactor: rename SomeFunction to DebouncedCallback

* refactor: remove inner function

* refactor: update return type to DebouncedCallback

* fix: adjust sizes for hash and palette button

* feat: create tests for hexToHSL and isValidHexColor

* refactor: update parameter type to use HexColor

* fix: increase size of palette button

* fix: update dependency array for hex code debounce

* fix: change colorPickerRef element ref

* feat: add Roboto Mono font

* fix: update input class to use monospace font

* feat: add getLighterShade function

* chore: run prettier and lint

* feat: synchronize local hex code with hexCode prop changes

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-01-29 20:32:06 -06:00
doprz
aa29bcf9fe feat: update SWE list 2025-01-27 19:39:59 -06:00
Preston Cook
f0b257aa12 feat(ui): add schedule list icons (#500) 2025-01-25 20:10:40 -06:00
Abdulrahman Alshahrani
93733e3721 feat: add open calendar button (#457)
* feat: add open calendar button

* fix: replace function to open calendar page

* fix: make open calendar function a one-liner

* fix: import correct calendar icon

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-01-24 21:27:53 -06:00
Ethan L
501f506677 feat(ui): course unique number copy button (#490)
* feat: add copy icon for course unique ID

* feat: update Button component to support event parameter in onClick handler

* feat: add copy functionality for course unique ID

* refactor: use Text component instead of span

* fix: remove duplicate course number

* fix: remove unnecessary event forwarding

* fix: remove unnecessary boolean type

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>

* fix: remove double space

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>

* refactor: reduce clipboard copy delay and use formatted unique ID

* feat: add copy animation to dialog

---------

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
Co-authored-by: nikshitak <nikkikurva@gmail.com>
2025-01-21 00:02:00 -06:00
Samuel Gunter
009de62828 feat(settings): add option to always open calendar in new tab (#488)
* feat(settings): add option to always open calendar in new tab

* fix: await setting

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-01-20 23:18:00 -06:00
Samuel Gunter
b74c698866 feat(settings): allow disabling of auto-loading courses (#489) 2025-01-20 23:04:14 -06:00
cd05e5e7fc feat: validate login passed to background and implemented into add all injected button (#443)
* docs: proper captializing

* docs: confirmed that the for loop is entered but on first startup something else

* feat: turns out - validate login status - not in background - pass background now

* feat: kronk.gif

* Update UserScheduleMessages.ts

* Update addCourseByURL.ts

* chore: format

* chore: chore

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-01-20 18:42:15 -06:00
doprz
f425510e11 docs: add repobeats and star history (#487)
* docs: add repobeats and star history

* chore: update alt
2025-01-20 18:21:32 -06:00
Ethan
1f635d2515 feat(ui): course color picker (#382)
* fix: update CourseCellColorPicker.tsx background to white

* feat: add color picker to CalendarCourseCell component

* feat: add color picker functionality to update course colors

* fix: type issues with storybook components

* feat: add useColorPicker hook, isValidHexColor and updateCourseColors utilities

* refactor: color picker logic and UI components

* refactor: update useFlattenedCourseSchedule hook to include courseID property

* refactor: update storybook calendar components with updated props

* refactor: update color picker ui logic to account for position of cell

* fix: revert back to error handling for invalid rgb

* refactor: update jsdocs

* refactor: integrate ColorPickerContext into Calendar components and update props

* refactor: integrate ColorPickerContext into Calendar components and update related props

* refactor: change JSDocs comments and remove unused color inversion state

* refactor: update story components

* feat: add functionality for selecting secondary course colors

* refactor: enhance HexColorEditor to dynamically adjust tag icon color based on preview color

* refactor: simplify JSDoc comment in useColorPicker hook

* fix: revert Button component

* refactor: update CalendarCourseCell component positioning and styling

* fix: correct types in color.ts

* feat: add getDarkerShade function to compute darker shades of hex colors

* feat: add shadow to color picker button

* fix: update button size in ColorPatch component

* feat: implement debounced input for hex color editor and add useDebounce hook

* chore: utilize the logical and && operator instead of the ternary operator

* fix: imports and palette icon

* refactor: remove unused import

* fix: bug when course add fails with custom colors

* chore: run lint

* chore: run check-types

* feat: add HSL color type and conversion functions

* refactor: rename colorway to theme

* fix: hide color picker on screenshot

* fix: undo important syntax

* refactor: rename SomeFunction to DebouncedCallback

* refactor: remove inner function

* refactor: update return type to DebouncedCallback

* fix: adjust sizes for hash and palette button

* feat: create tests for hexToHSL and isValidHexColor

* refactor: update parameter type to use HexColor

* fix: increase size of palette button

* fix: update dependency array for hex code debounce

* fix: change colorPickerRef element ref

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-01-20 17:48:52 -06:00
Abdulrahman Alshahrani
a61bddf0e8 feat(ui): redesign grade distribution tooltip (#485)
* feat(ui): redesign grade distribution tooltip

* chore: prettier

* fix: use theme color for graph background

---------

Co-authored-by: Derek Chen <derex1987@gmail.com>
Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-01-20 13:03:06 -06:00
Ethan
843cb5b443 feat(ui): calendar sidebar redesign (#464)
* feat: update calendar sidebar, footer, and header with Figma design

* chore: run lint

* feat: update header with Figma design

* chore: run lint

* chore: remove unused vars

* chore: fix types

* fix: adjust sidebar minimum width

* fix: update LogoIcon layout to ensure text is always displayed

* feat: add spacing constants

* fix: add sidebar styling with spacing system and sticky header

* fix: update spacing constants to use rem units

* refactor: replace padding with spacing system and colors with UTRP theme

* refactor: rename ImportantLinks to ResourceLinks

* refactor: simplify CalendarHeader button component by using icon prop

* feat: add sidebar open and close transition

* refactor: rename unused var

* fix: update social icon color

* feat: improve layout and spacing in calendar components

* refactor: remove unused GearSix icon and options handler

* feat: update calendar components with new icons and improved spacing

* fix: correct class name

* refactor: organize social links into array and update link styling

* refactor: remove unused import

* fix: adjust gap spacing in radio button

* fix: update divider component to use theme offwhite1

* fix: increase size of outward arrow icon

* feat: add getSpacingInPx function to convert rem to pixels

* fix: update gap spacing in CalendarSchedules component to use spacing system

* fix: rollback footer social icons to original icons

* fix: update Calendar styles to use theme offwhite1 and adjust padding to account for scrollbar

* fix: update LargeLogo component to use gap-spacing-3

* fix: update button variants to 'minimal' and adjust styles for consistency

* fix: adjust padding in Calendar component for better layout consistency

* fix: increase size of arrow icon

* fix: add shrink-0 to radio buttons
2025-01-19 18:34:20 -06:00
Aaron Chen
52347fd56d feat(ui): change red text when instructor not found (#483)
* feat(ui): change red text when instructor not found

* feat(ui): fix wrong &apos; usage

* feat(ui): changed/shortened text

* feat(ui): update text, get rid of formatting

* feat(ui): removed unintentional H character from testing

* feat(ui): add space

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-01-18 22:58:30 -06:00
Aaron Chen
a20332e53d feat(ui): added shadows to popup buttons and course blocks (#378)
* feat(ui): added shadows to popup buttons and course blocks

* feat(ui): keep shadow state while dragging course block

* feat(ui): fixed transition "flash" after dragging

* feat(ui): fix linting/styling

* Update src/views/components/PopupMain.tsx

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>

* fix(ui): change old icons to the new ones from main

* fix(ui): show flag icon instead of plus icon for feedback

* chore: fix button variants after merge

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
Co-authored-by: Samuel Gunter <sgunter@utexas.edu>
2025-01-08 02:20:10 -06:00
Preston Cook
0aa469af81 feat(ui): update button variants following figma (#482)
* feat(ui): update button variants following figma

* feat(ui): separate size prop to allow for regular and small sized button variants

* update type to no longer include minimal-small

* update uno css config to use new spacing system

* add variants and sizes to file upload; update button and file upload stories

* add mini button variant and update small button

* specify width on icon-only regular variant

* update plus buttons to be mini sizes

* remove redundant classnames

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-01-07 14:59:15 -06:00
Preston Cook
0d73b13b28 feat(ui): update theme colors #466 (#473)
* feat(ui): update theme colors

* remove kebab-casing from all colors

* remove ut-concrete and replace concrete with ut-gray throughout app

* feat(ui): update staticutrpblack to staticblack

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-01-02 20:23:40 -06:00
Long Phan
24256798ba fix: 4th attempt for: now able to delete schedule even if active (#435)
* fix: 2nd attempt for: now able to delete schedule even if active

* fix: 3rd attempt for: now able to delete schedule even if active

* fix: 4th attempt for: now able to delete schedule even if active

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-01-02 12:31:41 -06:00
Ethan
e61ab565c3 feat: add spacing system (#474)
* feat: add spacing system

* refactor: update spacing naming

* chore: add leading 0

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2025-01-01 22:12:00 -06:00
Samuel Gunter
9cbcfa4720 chore: migrate to new scss import syntax (#478)
Co-authored-by: Long Phan <75595656+Wizardbacon13@users.noreply.github.com>
2024-12-31 20:43:40 -06:00
doprz
c712fc741e chore: remove typo (#476)
Remove "hello" from "I Understand" button
2024-12-31 15:17:00 -06:00
Abdulrahman Alshahrani
ca5e4c13d3 feat: add 'new search' link to the course catalog page (#456)
Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-12-31 13:44:16 -06:00
Preston Cook
37bd7e79d9 feat(ui): change icons to phosphor-icons #467 (#469)
* change icons to phosphor-icons

* feat(ui): change icons to phosphor-icons

* feat(ui): change icons to phosphor-icons

* feat(ui): correct icon sizes, weights, and colors

* feat(ui): change arrow-up-right sizes to 16px
2024-12-31 13:36:08 -06:00
Ethan
918f4e419c feat: update text styles (#468)
Fixes #465
2024-12-28 14:21:58 -06:00
3abb11734a refactor: change a file name (#447)
* refactor: file upload component

* refactor: changed name of a function and added a new line
2024-11-23 00:14:49 -06:00
doprz
a5e921fd75 feat(build): add Docker support (#322)
* feat(build): add Docker support

* fix: pnpm patches

* chore: update readme

* chore: refactor Docker section into separate markdown file

* chore: remove polling and host 0.0.0.0

* feat: add .dockerignore

* feat: update .dockerignore
2024-11-21 22:41:52 -06:00
Warith Rahman
7dd93690d6 fix: place hours and courses under schedule name (#388)
* fix(header): bottom-aligned the schedule name + hours/courses in calendar

* feat: updated font style in header and dropdown

* fix: new hour/course styling per discussion

i love having 80 different ideas, hopefully after this there's like maybe a tiny commit left to do before this is done..

* feat(header): added icons to cal header

WORK IN PROGRESS

* style: updated layout of header and main popup

* fix: updated font and spacing for header and popup

* fix: updated cal + popup style details
- schedule title is now in normal casing w/ colon removed
- last updated on is now entirely deleted from everywhere
- hour and course numbers now h3 in calendar ONLY

* refactor: changed size for calendar header

* refactor: changed ut-black to theme-black

* refactor: remove hiding on small window sizes

* refactor: reduced spacing in popup

* refactor: updated unocss for small-caps configuration

* style: changed variant + className order

* fix: readded update time text

* style: auto formatter, unused imports, capitalization

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
Co-authored-by: Samuel Gunter <sgunter@utexas.edu>
Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-11-21 20:56:56 -06:00
7dbffc6eef feat: export/import functionality (backup/restore/share with friends) + a new input component (#433)
* feat: export schedule function to be added to handler

* feat: use UserScheduleStore and return json

* feat: download functionality

* feat: oh wow we already have a blob download util that is very very nice

* feat: return empty json if none found

* feat: import function completion

* feat: file uploading done

* feat: new input component-stories made-settings input replaced with component

* feat: attempt 1 to hook settings.tsx to importSchedule

* feat: it works horray aka using right Course constructor it works

* chore: fix jsdoc

* chore: comments and debug style

* docs: extra comment

* feat: name of schedule more user friendly

* feat: reworked how schedule is passed and check for file being schedule

* feat: color is kept on import

* fix: add sendResponse to exportSchedule

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-11-21 12:55:48 -06:00
Samuel Gunter
8b922082a7 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
2024-11-19 19:28:38 -06:00
Sean Sy
19e3838df2 Merge pull request #440
* style(ui): changed tick marks to match x-axis
2024-11-19 11:28:38 -06:00
25e3ba1ed4 docs: remove redundant sentence in readme (#439)
* Update README.md

Removed redundant line

* chore: add newline

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-11-17 23:02:44 -06:00
ali v
598bafe67f fix: transition added (#381) 2024-11-16 19:37:42 -06:00
ali v
ebcc0aa76a fix: updated text when time/location not provided (#289)
* fix: updated text when time/location not provided

* fix(issue): fixed text when time/loc isn't provided

* chore: lint and format

* fix: created location&time component

* fix: renamed component & restructured component

* chore: fix lint

* fix: variety of issues within DisplayMeetingInfo component

* fix: fixed lint error

* fix: ran prettier

* chore: locationInfo usage

* chore: cleanup

* fix: removed periods and added online info

* fix: wrapped in div to remove space

* fix: space now shows properly

* fix: spacing fixed

* chore: remove types from jsdoc

* fix: extra arg

* chore: fix lint

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-11-16 15:11:30 -06:00
doprz
e987fbbe8e feat: add eslint-plugin-tsdoc (#430)
* feat: add eslint-plugin-tsdoc

* feat(doc): update current jsdoc to tsdoc specification

* chore: update deps

* feat: update warn to error for jsdoc and tsdoc

* chore(doc): lint
2024-11-16 00:20:36 -06:00
c41467c617 feat: injected button - add all courses from MyUT AND passing URL to handler (#291)
* feat: first button attempt

* feat: fetching each course code

* feat: adding courses function from there but idk where to get the active schedule from

* docs: todo

* feat: retrieved active schedule

* feat: button tactics

* feat: add support for my.utexas.edu

* feat: inject button into MyUT

* feat: refactor code to render components dynamically based on site

* feat: scrape course ids from MyUT and remove duplicates

* feat: site support links for classlist

* feat: add utility function to add course by URL

* feat: support additional case for course cal

* feat: duplicates

* chore: cleanup

* feat: temporary checkpoint

* feat: reroute to use new add course by url

* feat: linking to new function, cleaning up, adding messaging for course url add

* chore: unused import

* feat: relinking addCourse function to the button fingers crossed

* feat: we did it!

* chore: remove comment

* chore: cleanup cleanup

* feat: tried to handle the async stuff because of that small bug but nothing fixed. doesnt hurt tho

* feat: i have fixed it holy kevinnn

* chore: delete unused file and organization

* chore: removed unused log

* feat: better log for course add

* chore: refactor via data destructuring

* chore: pass component as prop via React.ComponentType

---------

Co-authored-by: Ethan Lanting <ethanlanting@gmail.com>
Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-11-15 19:07:37 -06:00
Abdulrahman Alshahrani
9ad32390d1 feat: add explanation to grade distribution (#325)
* feat: add 'About the data' link to grade distribution chart

* chore: change the About the data text style/variant to small

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-11-15 14:54:19 -06:00
Tony Dinh
0d51cae4c8 feat: modify Course Block text style and time and location text (#409) 2024-11-15 13:43:41 -06:00
Aaron Chen
91fa78e2d0 fix(ui): reduce left side grade distribution margin/padding (#427)
* fix(ui): align left margin of grade distribution

* fix(ui): remove accidental linewidth change (not relevant to this pr)
2024-11-15 13:13:37 -06:00
doprz
b13e217a5b chore: remove extra package 2024-11-14 20:16:38 -06:00
Kabir Ramzan
b732a80eaa feat: add CacheStore for GitHub stats and use names instead of usernames (#405)
* feat: add CacheStore for GitHub stats and use names instead of usernames

* fix: only cache name for successful API queries

* chore: linting

* chore: refactor any with unknown and add jsdocs

* fix: use cached endpoint to avoid rate limiting issues

* fix: code style

* chore: add type assertion

* fix: use correct type

* Revert "fix: use correct type"

This reverts commit 74956c12f3.

* fix: use correct type

* fix: use URL Web API

* fix: add CONTRIBUTORS_API_ROUTE constant

---------

Co-authored-by: Derek Chen <derex1987@gmail.com>
Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-11-13 12:01:20 -06:00
doprz
46c76b1703 feat: add 404 page (#426)
* feat: add 404 page

* chore: lint and format

* fix: remove extra line
2024-11-12 21:57:59 -06:00
doprz
db04bbb52e feat(build): refactor gulpfile to use gulp-execa (#323)
* feat(build): refactor gulpfile to use gulp-execa

* chore: fix PR comments

* chore(deps): update deps
2024-11-10 19:23:19 -06:00
Isaiah David Rodriguez
e425daf041 chore: update issue templates (#327)
* Update issue templates

* feat: refactor bug and feature issue templates

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-11-05 18:32:58 -06:00
doprz
93548627a6 chore: bump v2.0.2 2024-11-04 18:15:09 -06:00
suhas
638ee88c96 feat: bold course number in grade distribution chart, change text to ut-black (#406)
* feat: bold course number in grade distribution chart, change text to text-ut-black

* fix: use !important instead of manual style

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>

* fix: use tailwind classname instead of manual font weight

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>

---------

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
2024-11-04 15:38:51 -06:00
adityamkk
50e88fa015 fix(ui): multiple instructors are formatted properly, displays last name only, and are capitalized in all course blocks (#342) (#403)
* fix(ui): updated multiple instructor name formatting in course blocks

* fix(ui): display instructor last names only in all course blocks

* refactor: use instructor toString when getting instructor full name

* refactor: toString in useFlattenedCourseSchedule without template literal

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>

* refactor: delete type hint and unnecessary comments

* fix(ui): instructor names semicolon delimiter in calendar course block

* fix(ui): removed 'unknown' when there are no instructors

* fix(ui): change - to &ndash

* fix(ui): changed - to ndash in hook

---------

Co-authored-by: Samuel Gunter <29130894+Samathingamajig@users.noreply.github.com>
2024-10-29 16:07:26 -05:00
adityamkk
b3ae91d8f3 fix(ui): placeholder text for no instructor course #400 (#402)
* fix(ui): placeholder text for no instructor course #400

* Update src/views/components/injected/CourseCatalogInjectedPopup/HeadingAndActions.tsx

Co-authored-by: Samuel Gunter <sgunter@utexas.edu>

---------

Co-authored-by: Samuel Gunter <sgunter@utexas.edu>
2024-10-29 12:12:51 -05:00
shehreenr
0077ae70d2 feat(ui): changed popup close icon to ut-black (#394)
* feat(ui): changed popup close icon to #333F48

* feat(ui): ran prettier

* feat(ui): changed hex code to ut-black

* feat(ui): change popup close button color

* feat(ui): got rid of extra space
2024-10-29 12:06:56 -05:00
Kabir Ramzan
94744e01b9 feat: use "copy of" for duplicated schedules and place them under the original schedule #358 (#397)
* feat: use "copy of" for duplicated schedules and place them under the original schedule #358

* fix: code style and consistency
2024-10-28 17:56:02 -05:00
Rishthegreat
8de88d6ad7 fix(ui): main popup now shows 0 for empty schedule (#395) 2024-10-27 17:11:51 -05:00
Razboy20
2d0804f90e fix: sentry issues (#389) 2024-10-23 14:15:47 -05:00
Samuel Gunter
d3577358d0 fix: typo in settings page (#386) 2024-10-22 23:23:06 -05:00
adityamkk
7346720894 fix(ui): duplicate schedule warning (#295)
* fix(ui): duplicate schedule warning

* fix(ui): duplicate schedule warning

* fix(ui): duplicate schedules

* fix(ui): schedule limit loophole refactored

* fix(ui): schedule bypass hooks

* fix(ui): useEnforceScheduleLimit hook created

* fix(ui): added useCallback to hook

* fix(ui): updated jsdoc comment on hook

* fix(ui): updated jsdoc comments on hook
2024-10-22 23:10:54 -05:00
Aditya Angajala
b00bf6c180 fix: change schedule total courses text color to UTRP black (#369) 2024-10-22 22:11:48 -05:00
Samuel Gunter
eb306787ae chore: fix lint warnings (#385) 2024-10-22 21:47:35 -05:00
Tony Dinh
643ea13207 feat: add more relevant links to the From the Team section (#380)
* feat: add more relevant links to the From the Team section

* feat: add CRXPages.ts

* chore: update to TS 4.9 satisfies

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-10-22 17:17:12 -05:00
suhas
6f1afc5b25 feat: add core curriculum chips to injected popup (#372)
* feat: add core curriculum chips to injected popup

* fix: add VP and MAcore indicators

* feat: core now defined in constructor

* fix: make core and flags closer together

* fix: stop empty core chip from showing when no core requirements

* fix: remove optional chaining for core chips

* feat: generalize Chip for both flags and core classes

* fix: change types for storybook and add new story for CoreChip

* fix: remove labelMap prop from Chip, chore: clean up imports

* feat: change tooltip for core curriculum requirement

---------

Co-authored-by: Derek Chen <derex1987@gmail.com>
2024-10-22 16:15:27 -05:00
Brianna-Flo
83d76f72da chore: One red color of #D10000 (#377)
* chore: change UTRP red color

* chore: change UTRP Red

* chore: change red update

* chore: utrp red, consistent capitalization

---------

Co-authored-by: Samuel Gunter <sgunter@utexas.edu>
2024-10-22 16:00:14 -05:00
Preston Cook
768ac776ed fix: remove screenshot padding class for png download for #344 (#376)
Fixes #334
2024-10-22 00:11:28 -05:00
Brianna-Flo
9995b93d2a chore: change UTRP red color (#373) 2024-10-21 22:23:10 -05:00
Long Phan
4f609aeec7 fix: changed the font-weight of h1-course (#370)
Fixes #347
2024-10-21 22:20:21 -05:00
Parth
b6eccaca6a feat: Add linkedin social to calendar (#368)
* feat: update calendar footer with kibedjkib

* fix: made it prettier

* Update src/views/components/calendar/CalendarFooter.tsx

Co-authored-by: Samuel Gunter <sgunter@utexas.edu>

---------

Co-authored-by: Samuel Gunter <sgunter@utexas.edu>
2024-10-21 22:16:55 -05:00
Warith Rahman
cef99c2d72 feat: update useful links (#367)
added and rearranged links on calendar sidebar
2024-10-21 19:13:11 -05:00
Yahya Kousa
86792eb56f fix(ui): add space before/after forward slash in "ASYNC/OTHER" text (#366)
* fix(ui): add space before/after forward slash in "ASYNC./OTHER" text

* fix(ui): add space before/after forward slash in "ASYNC./OTHER" text
2024-10-21 19:01:09 -05:00
Preston Cook
a715bbd933 fix: added descending sort for commits on contributor section in settings page (#365)
* fix: bug fix to address issue #363

* fix: bug fix to address issue #363

* fix: bug fix to sort LONGHORN_SWE constant

* fix: fix to sort LONGHORN_SWE constant

Resolves #363
2024-10-21 16:24:09 -05:00
Ethan
c2007ef090 fix: ensure input elements take full width of parent (#364) 2024-10-21 14:35:34 -05:00
doprz
b967240f8f feat: update senior swe admins (#326) 2024-10-18 22:17:47 -05:00
Samuel Gunter
839f9c6d6a feat: disable/some actions when no instructor (#319) 2024-10-17 12:03:57 -05:00
doprz
f29e3ef97d chore: update CHANGELOG.md 2024-10-16 23:50:52 -05:00
Samuel Gunter
79dd29cfc9 feat: spring 2024 instructors db (#317) 2024-10-16 23:47:04 -05:00
Razboy20
e082158592 build: sentry instrumentation (#316) 2024-10-16 22:18:18 -05:00
Razboy20
e261641e59 fix: add a little error checking to settings (#315)
* fix: add a little error checking to settings

* fix: add a little more
2024-10-16 22:16:17 -05:00
Razboy20
5634fbed8a chore: bump version 2024-10-16 17:17:56 -05:00
Samuel Gunter
ceba38b1ac fix: show calendar in active window (#312)
* fix: show calendar in active window

* fix: update calendarBackgroundHandler.ts

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-10-16 17:14:02 -05:00
Razboy20
05f00b23d2 fix: gulp zip (#314) 2024-10-16 17:13:44 -05:00
Samuel Gunter
59f173c4e7 style: remove ugly period after async (#313) 2024-10-16 17:13:33 -05:00
Razboy20
aeff5e09a2 fix: migration loop 2024-10-16 16:46:20 -05:00
doprz
4629626a31 feat: swe title updates (#310) 2024-10-15 00:46:01 -05:00
doprz
4cf8c3f964 feat: update admin titles 2024-10-15 00:14:58 -05:00
doprz
58eed49196 chore: remove extra console.log() 2024-10-14 22:12:11 -05:00
Razboy20
2983a0c0fd chore: get ready for release (#308)
* chore: get ready for release

* chore: update pnpm-lock.yaml

* chore(docs): update CHANGELOG.md

* chore: fix lint warnings and add notes

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-10-14 22:08:45 -05:00
doprz
d22237d561 feat: UTRP v2 migration (#292)
* feat: wip add course by url

* chore: update imports

* feat: add useCourseFromUrl hook

* chore: extract logic into async function

* feat: add checkLoginStatus.ts

* feat: add useCourseMigration hook

* feat: working course migration

* fix: active schedule bug

* feat: refactor logic and add to onUpdate

* feat: update ui style

* feat: add changelog functionality to settings

* chore: update packages

* feat: migration + sentry stuffs

* feat: improve migration flow

* docs: add sentry jsdocs

* chore: fix lint and format

* chore: cleanup + fix race condition

---------

Co-authored-by: Samuel Gunter <sgunter@utexas.edu>
Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-10-14 21:30:37 -05:00
e774f316e3 feat: splash text additions before v2 release (#296)
* feat: quote cleanup/organization

* feat: oblivion npc dialog

* feat: it is 4 in the morning

* chore: fix format

* chore: update spash text

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-10-14 14:19:15 -05:00
doprz
187a4c8555 docs: update to React v20.9.0 (LTS) 2024-10-13 11:17:21 -05:00
Sriram Hariharan
65ff6bfbbf feat: report issue popup (#261)
* feat: report issue popup

* style: modified styles in feedback form

* chore: minor UI fixes

* chore: update useEffect

* chore: change width to 400px

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
Co-authored-by: Isaiah David Rodriguez <51803892+IsaDavRod@users.noreply.github.com>
2024-10-12 20:31:26 -05:00
doprz
bd17e33537 feat: release notes (#283)
* feat: add release.ts

* feat: add utils

* chore: add scripts to tsconfig.json include

* feat: add changelog logic, component, storybook file, scripts, and update to Node v20.9.0 (LTS)

* chore: update packages

* feat: use conventionalcommits for changelog preset

* feat: update padding, width, and change font to mono

* feat: refactor to use DialogProvider

* chore: remove extra args

* feat: update CHANGELOG.md, add title, and add button

* refactor: use hook

* chore: fix typo
2024-10-12 17:05:37 -05:00
aede681d4b feat: migration update showing (#293)
* feat: update component!!!

* feat: made stories

* feat: whoops named props wrong

* feat: props for stories

* style: text styling

* feat: an underline

* feat: key change

* chore: small ui and arg updates

* chore: fix lint, format, and jsdoc

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-10-12 15:21:43 -05:00
Yahya Kousa
db1eac33a2 fix(ui): unhid settings button (#288) 2024-10-10 22:13:35 -05:00
doprz
90861d7ee7 docs: add improved dev get started info (#259)
* feat(docs): add nvm info

* feat(docs): add recommended VSCode extensions

* feat: add UTRP Social Preview and update docs

* chore: update readme
2024-10-10 22:08:54 -05:00
doprz
7a5c3a2e62 feat: settings page (#260)
* feat: setup settings page boilerplate

* feat: split view into halves

* feat: add preview for Customization Options section

* feat: add OptionStore logic and LD icon

* feat: add courseStatusChips functionality

* feat: migrate experimental settings to proper settings

* feat: center Preview children and add className override

* feat: add GitHub stats

* feat: open GitHub user profile onclick

* feat: get user GitHub stats

* feat: refactor into useGitHubStats hook

* feat: toggle GitHub stats when the user presses the 'S' key

* chore: update title

* fix: remove extra file

* feat: refactor and add DialogProvider

* fix: import

* test: this commit has issues

* fix: no schedule bug

* fix: longhorn developers icon not rendering in prod builds

* feat(pr-review): fix UI and comment out experimental code

* chore: run lint and prettier

* feat: add responsive design

* feat: use @octokit/rest and fix GitHub stats
2024-10-10 18:05:19 -05:00
Casey Charleston
d73615e281 fix: remove white space after duplicate schedule regex matching (#286) 2024-10-09 20:21:26 -05:00
Casey Charleston
dcc1d81a74 fix: disabled [object Object] hover message on dialog popups (#284) 2024-10-08 17:18:48 -05:00
doprz
b3632c0196 chore: add js-doc (#275) 2024-10-07 23:06:35 -05:00
668c8d0075 feat: async course adding and async/other course block adjustments (#273)
* feat: we do al il check to move sat and 7 am classes to async

* feat: it is 5 am ohhhhh boy i could go for some mighty mo's rn

* feat: a derek

* feat: undo

* chore: lint

* chore: lint x2

* feat: horizontal line

* feat: dash changed to —

* feat: remove conditional centering if no timeAndLocation found

* style: his majestys style changes

* style: 2

* style: x3

* style: x4

* style: x5
2024-10-06 20:15:18 -05:00
da6d86c785 feat: readme animation (#281) 2024-10-06 16:37:04 -05:00
doprz
575e92ead1 chore: add comment 2024-10-05 23:24:07 -05:00
doprz
5f3d25fd75 chore: add comment 2024-10-05 23:23:45 -05:00
doprz
952e14a5e7 build: add pnpm run build:watch (#280) 2024-10-05 22:50:59 -05:00
Samuel Gunter
895cd31d8e feat: sam's jokes (#278)
* feat: sam's jokes

* fix: typo in raccoon
2024-10-05 22:18:30 -05:00
Sriram Hariharan
0da27e2c46 feat: updating joke styling and updating jokes array (#277) 2024-10-05 17:35:11 -05:00
doprz
4936e9ca41 chore: format 2024-10-05 13:46:12 -05:00
Razboy20
290b841517 feat: limit schedules to 10 (#272) 2024-10-05 13:27:44 -05:00
Samuel Gunter
99c982d6e1 chore: remove unused imports and args (#271) 2024-10-05 00:20:59 -05:00
Casey Charleston
15fc3699cf feat: schedule list item action menu (#230)
* feat: action menu for schedule list item

* feat: schedule action menu functionality

* feat: dialog provider popups for delete

* feat: duplicate schedule satiesfies type

* refactor: change non-null assertion to early return for rename schedule

* refactor: move schedule list item dialog providers to util file

* style: run prettier

* chore: inline object with satisfies operator

* fix: border issues

* style: change popups to match figma

* fix: update import for schedule list item dialog providers

* style: change dropdown text style to match figma

* fix: add back dialog context

* style: rounded edges when hovering over action + soften border color

* chore: cleanup and improve styling

* fix: dialog in popupmain

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-10-04 23:15:51 -05:00
Sriram Hariharan
9ec05ef764 feat: lowercase instructor! (#268)
Co-authored-by: Derek Chen <derex1987@gmail.com>
2024-10-04 22:44:57 -05:00
Sriram Hariharan
88eeb620ae fix: doesn't autoload on pages that don't have pages to load (#270)
* fix: no autoload on singular pages without next page

* fix: formatted
2024-10-04 22:20:28 -05:00
Samuel Gunter
6a363aeb5c fix: grade dist when no instructor (#269) 2024-10-04 21:39:30 -05:00
Sriram Hariharan
c2cab407f3 feat: add skeleton loader for course description + distribution (#267)
* feat: add skeleton loading for course description

* feat: added to distribution
2024-10-04 21:22:19 -05:00
Razboy20
08652c4ac1 chore: update packages (#254) 2024-10-03 13:49:10 -05:00
Razboy20
1942508d8d fix: improve dialog handling and error management in list items (#257)
* fix: improve dialog handling and error management in list items

* chore: lint
2024-10-02 11:19:16 -05:00
a4d2856bfc style: getting it the way we need (#255) 2024-10-02 09:31:31 -05:00
Ethan
e8d2c2e142 fix: visual overflow bug when editing schedule name (#251)
* fix: visual bug on radio and exit buttons when editing schedule name

* fix: add max width to text input

* fix: non-static sizing

* fix: non-static width with w-full

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-10-01 23:08:31 -05:00
Samuel Gunter
4c8f03ca47 chore: update course schedules (#249) 2024-10-01 22:59:28 -05:00
9971435716 feat: splash text has arrived! (#246)
* feat: minecraft splash text brought to life!

* feat: bringing splash text to more life

* feat: wrong place oops

* feat: more styling and rendering conditionally when no course detected, and new joke

* feat: more splash text whew my wittyness is exhausted

* feat: padding for some finishing touches

* chore: lint

* feat: add more phrases

* chore: prettier

* Update PopupMain.tsx

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-10-01 22:17:58 -05:00
Sriram Hariharan
b4dd91ad25 feat: add react-loading-skeleton package (#244)
* feat: add react-loading-skeleton package

Add the react-loading-skeleton package to the project dependencies in package.json. This package will be used to display loading skeletons in the AutoLoad component.

* chore: remove body-max-line-length rule from commitlint.config.ts
2024-10-01 10:44:09 -05:00
Sriram Hariharan
8bb6f901dc refactor: improve error message and handle active schedule deletion (#243) 2024-10-01 10:42:36 -05:00
5ca24dab82 feat: missed one chip toggle there (#245)
* feat: missed one chip toggle there

* chore: linting
2024-10-01 10:41:21 -05:00
Samuel Gunter
3ff06e043b fix: support classes with no location (#242) 2024-09-30 22:43:09 -05:00
doprz
e2cbfa3f48 feat(docs): add extra acknowledgements 2024-09-30 21:54:02 -05:00
doprz
857007c13c docs: update readme for UTRP v2 prod release (#241)
* docs: add extra sections to readme

* chore: fix typo

* feat(docs): add shields io badges

* chore: reword acknowledgements section

* fix: missing dash

* Update README.md

* feat: add small bio to acknowledgements

---------

Co-authored-by: Isaiah David Rodriguez <51803892+IsaDavRod@users.noreply.github.com>
2024-09-30 21:41:50 -05:00
doprz
d16dfc1107 chore: add to insideJokes.tsx 2024-09-30 21:07:46 -05:00
abae7a5c22 feat: switch button (#229)
* fix: font weight added

* fix: change color hex

* fix: change color again

* fix: text-ut-burntorange

* fix: importance (tailwind wise)

* feat: switch button initial test

* feat: look at how this switch goes back and forth very mindful very demure

* fix: story

* feat: using type now

* chore: fix lint

* feat: button custom function prop

* fix: styling

* chore: fix lint error and add JSDoc

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-09-30 19:50:34 -05:00
Samuel Gunter
149fda3b72 fix: improper list data propagation (#240) 2024-09-30 19:16:47 -05:00
0ab83efd47 feat: Derek/disable updating (#239)
* feat: first conditional change

* feat: update conditionally 2

* feat: xd
2024-09-30 19:15:25 -05:00
vinsonzheng499
9eaff24cbb fix: added room number to course popup (#231) 2024-09-30 09:47:40 -05:00
Samuel Gunter
75ad4167b6 feat: newer grades and parameterized queries (#238)
previously, we were using template strings,
which had issues for professors with an apostrophe in their name
2024-09-29 21:15:30 -05:00
f34dd95d77 feat: experimental toggle for icons, left off for now (#237)
* feat: temporary removal of waitlist etc

* feat: experimental toggle for icons for now

* feat: popupmain toggle

* feat: cal header toggle

* feat: adjusted course cell for toggle

* feat: fine it'll be a constant

* chore: lint

* feat: other experimental options
2024-09-29 15:11:27 -05:00
d424ccce49 feat: temporary removal of waitlist etc (#236) 2024-09-28 23:05:52 -05:00
be87e41814 feat: one single exclamation mark did all that (#235) 2024-09-28 22:21:16 -05:00
438c82bfb5 feat: aesthetically pleasing squishier course blocks when compressed (#232) 2024-09-28 21:19:33 -05:00
f83e012d62 feat: link to your registered courses (#228) 2024-08-24 20:34:09 -04:00
Razboy20
bc5d68ce18 fix: dialog movement (#227)
* fix: dialog movement

* chore: lint
2024-06-03 20:53:39 -05:00
Samuel Gunter
863d980b2d feat: fall 2023 grades (#226) 2024-06-03 00:25:26 -05:00
Razboy20
f943e4801b chore: bump version 2024-05-27 21:12:58 -05:00
Samuel Gunter
78d749a8a9 feat: grades by professor (#225)
* feat: grades by professor

* chore(pr-review): extract into Distributions type

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-05-27 16:36:42 -05:00
bc354f3798 feat: additional changes to #201 (#224)
* fix: calendar weight change

* feat: small color change

* feat: stories for logo

* feat: align the logo

* feat: stupid imports

* fix: eslint styling

* Update CalenderHeader.tsx

* Update colors.module.scss

* chore: remove argTypes

* chore: remove argTypes

* chore: remove argTypes

* fix: lock

* chore: styled up logo stories

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-05-27 09:32:31 -05:00
8959e0d9f7 feat: rerouted directory to syllabus when click on professor name (#211)
* feat: testing names

* feat: rerouted instructor on click from directory to syllabus

* feat: removed number requirement

* fix: removed department
2024-05-23 15:08:54 -05:00
Razboy20
40ef92b230 style: add slight shadow on hover to calendar course cells (#217) 2024-05-21 23:08:04 -05:00
Razboy20
4f0ae43411 refactor: Update spinner design (#223) 2024-05-21 23:07:41 -05:00
Samuel Gunter
229a8a29e8 feat: bold red refresh error (#220)
* feat: bold red refresh error

* style: exclamation point location
2024-05-21 21:04:25 -05:00
Razboy20
2f9e9b1297 refactor: Update getCreditHours function to handle additional cases (#222)
* refactor: Update getCreditHours function to handle additional cases

* style: fix prettier
2024-05-21 20:59:08 -05:00
Samuel Gunter
6812d685d0 feat: popout icon for ccip in calendar (#221)
* feat: popout icon for ccip in calendar

* refactor: simplify context

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-05-21 10:50:31 -05:00
Samuel Gunter
a2303ee35f feat: updated calendar page and recruitment banner links (#219) 2024-05-20 22:31:09 -05:00
Razboy20
e3c2da36df style: always show scrollbar (#215)
* style: always show scrollbar

* fix: hide header scrollbar in specific instances

* hotfix: prettier fail

* style: always show scrollbar

* fix: hide header scrollbar in specific instances
2024-05-20 21:56:36 -05:00
Razboy20
0c7cd3e790 style: fix injected popup top/bottom padding (#218) 2024-05-20 21:49:18 -05:00
Razboy20
7a40008c1e fix: Fix popup drag hitbox (#216)
* hotfix: Fix popup drag hitbox

Somehow, the drags get "lost" within a button element. Converting the parent container to a div works to fix this.

* refactor: Update styling
2024-05-20 21:24:00 -05:00
Razboy20
07cadb8c62 hotfix: prettier fail 2024-05-20 20:14:45 -05:00
Razboy20
d4611952d4 build: update storybook (#214)
* chore: Update updatedAt dates in schedules

Set updatedAt dates to be fixed to '2024-01-01 12:00' for all schedules in
UserScheduleStore.

* build: update storybook

* chore: Removed unnecessary eslint-disable-next-line statements.
2024-05-20 17:08:36 -05:00
Razboy20
88c0061187 chore: update headlessui (#212) 2024-05-20 16:18:34 -05:00
Razboy20
3684ee5e9b build: update pnpm version to 9 (#213)
* ci: update pnpm version to 9 in workflow files

* build: Update lockfileVersion to '9.0' in pnpm-lock.yaml.
2024-05-20 15:59:28 -05:00
Samuel Gunter
d1b921a5b0 feat: DialogProvider component (#198)
* feat: somewhat working DialogProvider

* feat: handle multiple dialogs properly, initial focus

let's just ignore that showFocus=true doesn't work with "nested" dialogs

Co-authored-by: Razboy20 <Razboy20@users.noreply.github.com>

* feat: rework code

* feat: add default styles to prompts

* refactor: fix stylings

---------

Co-authored-by: Razboy20 <Razboy20@users.noreply.github.com>
Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-05-20 15:00:00 -05:00
Abhinav Chadaga
bcb5a8c469 fix: remove course name from the syllabi lookup (#200)
* fix: remove course name from the syllabi lookup

* fix: use instructor name in past syllabi lookup
2024-04-17 10:33:47 -05:00
0534f607a5 feat: Initial Splash Text Commit (#208)
* fix: font weight added

* fix: change color hex

* fix: change color again

* fix: text-ut-burntorange

* fix: importance (tailwind wise)

* feat: debauchery

* feat: modernizing some covid-era dialogue

* feat: and more

* feat: ok other people can add now

* feat: one last one

* feat: maybe this will fix it

* fix: unstyled line

* feat: add more phrases

* feat: moved to a .tsx file format

* fix: prettier formatting

* fix: add doprz's quotes back

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-04-16 10:14:09 -05:00
bae1da43d3 feat: some small changes for colors and font (#201)
* fix: font weight added

* fix: change color hex

* fix: change color again

* fix: text-ut-burntorange

* fix: importance (tailwind wise)
2024-03-30 11:44:15 -05:00
Samuel Gunter
a3f5e0f27f feat: better discord icon (#205) 2024-03-29 13:02:38 -05:00
Samuel Gunter
227de53e84 feat: show async courses in the bottom bar (#204)
* feat: show async courses in the bottom bar

* fix: hide "Async/Other" header when there are no async courses, off-by-n error

(where n is the number async courses)

* refactor: move types closer to map instead of weird "as boolean"

* refactor: move satisfies to return type
2024-03-29 00:01:23 -05:00
Samuel Gunter
d3f64ec79e feat: actually sum for duplicate semesters (different uniques) (#202) 2024-03-25 19:41:33 -05:00
doprz
8e79d6a6a8 fix: db with proper insertion order 2024-03-24 10:12:08 -05:00
doprz
60d1f48bd9 feat: add new db powered by UT_Grade_Parser (#163)
* feat: add new db powered by UT_Grade_Parser

* Merge branch 'main' of https://github.com/Longhorn-Developers/UT-Registration-Plus into feature/update-db

* feat: update db

* feat: update db handlers and types

Co-authored-by: Samuel Gunter <sgunter@utexas.edu>

* fix: type errors

* fix: add Other to grade dist

* fix: db with proper insertion order

* Merge branch 'main' of https://github.com/Longhorn-Developers/UT-Registration-Plus into feature/update-db

* chore: address PR comments

Co-Authored-By: Samuel Gunter <sgunter@utexas.edu>
2024-03-24 00:21:18 -05:00
Som Gupta
ee2b7c40b9 refactor: updated injected popup to match figma (#189)
* refactor: updated injected popup to match figma

* style: ran prettier

* style: fixed pr comments

* style: ran prettier

* refactor: tailwind style

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-23 19:22:49 -05:00
9b4d61c2b0 feat: added flag ;-; (#195)
Co-authored-by: Samuel Gunter <sgunter@utexas.edu>
2024-03-22 19:12:06 -05:00
Samuel Gunter
5b1e4513e2 fix: don't crash on cultural diversity flag (#196)
Co-authored-by: Som Gupta <78577376+knownotunknown@users.noreply.github.com>
2024-03-22 18:52:08 -05:00
Razboy20
0c42979423 feat: listed versioning for beta builds (#192) 2024-03-22 12:15:44 -05:00
Som Gupta
36ac8607a9 refactor: updated styling of conflict component to match figma (#190)
* refactor: updated styling of conflict component to match figma

* style: ran prettier

* refactor: slightly

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-22 11:34:25 -05:00
Razboy20
4f4f34e281 fix: reactivity (#188) 2024-03-21 19:43:55 -05:00
Razboy20
8a5e12ec63 feat: beta builds (#187)
* feat: beta builds

* fix: types
2024-03-21 19:21:33 -05:00
Samuel Gunter
7d4c5d7be8 feat: screenshot whole page, hide certain elements, screenshot fixed size (#180)
* feat: screenshot whole page, hide certain elements, screenshot fixed size

* refactor: use variants instead of groups and custom rules

* feat: scaled header, smaller body, weird padding/margin changes

* feat: consistent sizing & style regardless of zoom

* feat: use downloadBlob instead of hand-rolled image saving

* fix: be type safe is toBlob returns Promise<null>

* fix: revoke object url when it should be

* fix: animation scheduling

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-21 19:20:03 -05:00
doprz
2dfb10e57b feat: use downloadBlob util (#186)
* feat: use downloadBlob util

* chore: lint

* fix: revert saveCalAsPng

* feat: refactor downloadBlob

* chore: remove comments

* chore: lint and remove extra async

* refactor: cleanup

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-21 16:25:37 -05:00
Samuel Gunter
036cd628d3 refactor: move getTabInfo to calendar only (#185) 2024-03-21 16:19:44 -05:00
doprz
9ee567530f chore: remove todo.md 2024-03-21 15:00:13 -05:00
Razboy20
e080e93faa refactor: remove component subfolders (#184)
(and unused components)
2024-03-21 13:47:59 -05:00
doprz
efed1c0edb feat: enable TS strict mode (#168)
* feat: enable TS strict mode

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: colors bug with default

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: text type errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors - add definite assignment assertion

* fix: strict TS errors - add definite assignment assertion

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix(ESLint): error on no-explicit-any

* fix: type annotations for any types

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors (and remove packages)

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* fix: strict TS errors

* feat: enable React.StrictMode

* fix: strict TS errors (done!)

* fix: build error

* fix: replace no-explicit-any assertions

* refactor: cleanup

* refactor: more cleanup

* style: prettier

---------

Co-authored-by: Lukas Zenick <lukas@utexas.edu>
Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-21 13:19:40 -05:00
doprz
0c76052478 feat: add MIMEType 2024-03-21 10:27:07 -05:00
doprz
2af351efa8 feat: add downloadBlob util 2024-03-21 10:20:52 -05:00
Samuel Gunter
949bbb0835 fix: async course display size (#181) 2024-03-20 11:03:23 -05:00
Razboy20
5ed81e4be9 feat: course color generation (#179)
* feat: course color generation

* feat: add proper TS for hex colors

* refactor: fix oklab and improve contrast ratios

* fix: update HexColor type

* refactor: update color switch point

* refactor: color-related functions and types

* fix: imports and TS issues

* fix: imports and TS issues

* chore: add no-restricted-syntax ForInStatement

* chore(docs): add jsdoc

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-03-19 18:54:11 -05:00
c5fc6219e1 fix: idk why that comment was there (#177)
* fix: idk why that doc was there

* Update Calendar.tsx

* Update Calendar.tsx
2024-03-19 18:52:14 -05:00
ba2bc60add feat: Course Flag Tooltips (#178)
* feat: initial attempt at hover text

* feat: fixgin it

* fix: heading to master real quick

* feat: tooltip prop added

* feat: tooltip now reads from the map instead of just label. Think we're done!

* Update Chip.tsx
2024-03-18 17:15:02 -05:00
Razboy20
8027c3d1bf feat: match calendar designs & add functionality (#176)
* feat: match calendar designs

* refactor: update breakpoints
2024-03-18 10:06:23 -05:00
Samuel Gunter
dc77cc27da feat: course colors (#175)
* feat: course colors

* docs: fix typo in jsdoc
2024-03-17 02:05:59 -05:00
Samuel Gunter
afa634f085 fix: clean up #173 (#174) 2024-03-17 01:48:09 -05:00
Razboy20
791a42bcd4 feat: calendar matchings (#173)
* feat: calendar matchings

* fix: build

* refactor: resolve pr comments

* fix: destrucure editorRef

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-03-17 00:32:50 -05:00
Abhinav Chadaga
df1849180d feat: calendar-course-cell-color-picker (#157)
* feat: calendar-course-cell-color-picker done??

* fix: ensure hex code is lowercase

* fix: make hex codes lower case

* chore: convert px to rem in ColorPatch.tsx

* fix: add functionality to the invert colors button

* fix: some more lowercase stuff

* fix: remove hardcoded color patch hex codes, remove hardcoded pixel values

* chore: remove React.FC

* chore: modify docs

* fix: remove duplicate style

* fix: used name over size specified classes

* fix: grid over flex, elie feedback

* refactor: use color strings instead of indices

* refactor: remove console.log statements
2024-03-16 16:08:28 -05:00
27094846f7 feat: open an injected course page on course block click in popup main (#146)
* feat: Imports to popupcourseblock.tsx

* changing the blocks to accept parameters for clicking functionality which may or may not open the calendar

* put the click parameter in the div of popupcourseblock

* safely calling for onCourseClick in the event it is an undefined function

* handled other calls of popupcourseblock with empty functions for now, and i think popupmain opens calendar now when the course block is clicked

* feat: Testing out passing params to handleOpenCalendar

* url that takes in params to open calendar with params

* further work on url params; from popup main to handleopencalendar to calendar using urlsearchparams

* feat: small calendar shifting after merge:

* fix: merge handling and then references to new click parameter

* fix: optional params

* feat: split into two functions instead

* fix: changing proper usage of handleOpenCalendarWithCourse

* feat: show course popup when calendar opened

* chore: remove useless commented out code

* feat: close popup on calendar nav, fix build errors, remove useless comments/logs

* chore: chromatic so dumb fr why aren't you chrome

* fix: refactor listeners to build properly

* feat: exit early when not in chrome extension

* fix: function return type

* fix: function return type x2

* fix: generic type for useState

* refactor: extract calendar opening on click functions

* refactor: chrome runtime mock, omit question mark if no query params, rename calendar event

* refactor: move course click event into component directly instead of prop

* refactor: removed useless wrapper functions, made popup course block more accessible

* fix: i dont wanna talk about it

---------

Co-authored-by: Samuel Gunter <sgunter@utexas.edu>
2024-03-16 15:57:50 -05:00
Razboy20
ed4fbe5651 refactor: ccpopup (#172)
* refactor: dialog animation improvements

* refactor: update ccpopup to match designs
2024-03-15 23:49:26 -05:00
Razboy20
d04818ccd8 refactor: update text and link components to be polymorphic (#171) 2024-03-15 22:06:36 -05:00
Samuel Gunter
61c43962fb chore: ignore storybook build (#169)
* chore: ignore storybook build

* chore: make storybook-static explicitly a directory match

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-03-15 20:36:36 -05:00
Samuel Gunter
b4ad6870bf feat: pad unique ids to 5 digits (#170)
* feat: pad unique ids to 5 digits

* feat: also pad in popup course block
2024-03-15 19:23:27 -05:00
Razboy20
ea297d09bb build: allow unocss to run through dev mode (#167)
* build: allow unocss to run through dev mode

* build: Update unocss dependencies to latest versions

Updated dependencies '@unocss/eslint-config', '@unocss/postcss', '@unocss/preset-uno', '@unocss/preset-web-fonts', '@unocss/reset', '@unocss/transformer-directives', '@unocss/transformer-variant-group' to version 0.58.6 for consistency and compatibility.

* refactor: add note to readme

* refactor: improve readme

* refactor: update readme (again)

* Update README.md

Updates the UTRP description text

---------

Co-authored-by: Isaiah David Rodriguez <51803892+IsaDavRod@users.noreply.github.com>
2024-03-15 16:30:42 -05:00
Razboy20
85769e9d2c refactor(UserSchedule): index by a unique id rather than name (#166)
* refactor(UserSchedule): index by a unique id rather than name

* refactor: Update parameter names in schedule function jsdocs

* refactor: change more instances of .name to .id

* refactor: Fix typo in variable name and update references

* refactor: Remove console.log statement

* fix(chromatic): Update ScheduleListItem story

* refactor: remove unused eslint rule
2024-03-14 23:09:04 -05:00
Som Gupta
5714ed16d7 fix: list component fixed (#162)
* fix: list component fixed

* style: ran prettier

* Update List.tsx

* refactor: remove console log

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-14 00:17:47 -05:00
Razboy20
e919e96c53 feat: proper injected styles (#164) 2024-03-14 00:10:41 -05:00
Razboy20
442be8cbee feat: update dialog component to headlessui (#159) 2024-03-13 23:09:43 -05:00
Som Gupta
df7a7c65d6 fix: Fixed typescript error (#161)
* fix: fixed bug where activeSchedule doesn't update correctly

* refactor: always returning activeSchedule

* style: prettier

* fix: fixed typescript error

* style: prettier
2024-03-13 23:03:22 -05:00
Som Gupta
a409090b90 fix: fixed bug where activeSchedule doesn't update correctly (#158)
* fix: fixed bug where activeSchedule doesn't update correctly

* refactor: always returning activeSchedule

* style: prettier
2024-03-13 22:15:02 -05:00
Samuel Gunter
5cce1c79fc feat: calendar header formatting and data displaying (#160) 2024-03-13 21:38:40 -05:00
Razboy20
61c1e88dcf style: fix centering of radio item (#156) 2024-03-13 17:29:11 -05:00
Razboy20
038ebaa268 feat: list reordering (#154) 2024-03-13 16:45:32 -05:00
Samuel Gunter
91f62e1943 fix: correct parsing of noon (#155) 2024-03-13 16:09:31 -05:00
Samuel Gunter
7986549fdd feat: fix save as button dividers (#153)
* feat: fix save as button dividers

* fix: only show left divider when there are async classes
2024-03-13 16:08:58 -05:00
Razboy20
1d8da6579e refactor(popup): match styles/reduce paint flicker (#136)
* refactor: match popup styles/reduce paint flicker

* fix: useSchedules hook

* feat: popup 

* fix: repaint issue on popup body

* fix: initial active schedule

* fix: center justification

* fix: reactivity error
2024-03-13 12:33:54 -05:00
Casey Charleston
0dff12232c feat: async text hiding on Calendar's Bottom Bar when there are no async courses (#152)
* feat: async text not visible when no async courses

* refactor: converted useState to boolean

* fix: remove unused import

* fix: maintain component height when hiding is enabled

* refactor: match stylings to figma

* refactor: padding change to match when there are courses to display

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-12 23:13:27 -05:00
Sriram Hariharan
a5e9e3c214 feat: update badge count when schedule changes (#150)
* feat: update badge count when schedule changes

* fix: fixed linting issues
2024-03-12 00:59:14 -05:00
Sriram Hariharan
8e181b3010 feat: added scrapedAt property (#149)
* feat: added scrapedAt property

* fix: type-check
2024-03-12 00:57:00 -05:00
Abhinav Chadaga
44af9e16e4 feat: abhinavchadaga/reusable-popup-prompt (#148)
* feat: some work on popup prompt

* feat: add some stuff

* feat: reusable prompt component

Takes a title, description, and button children.

* fix: pr feedback

* fix: import ReactElement
2024-03-12 00:01:56 -05:00
Som Gupta
7760e3acf4 refactor: doesn't crash tab, and doesn't cause errors (#143)
* refactor: doesn't crash tab, and doesn't cause errors

* Revert "fix: options page (#131)"

This reverts commit dc100b5d3a.

* refactor: Simplify CourseSchedule constructor

* refactor: Refactor CourseSchedule constructor (again)

* Reapply "fix: options page (#131)"

This reverts commit 969c5a234f.

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-11 23:59:15 -05:00
Dhruv
a8ea3bc683 fix: conflict row bug (#130)
* fix: temp fixes, need to still work on it

* fix: im a god at css otl

* fix: handle edge case where they have conflicting classes in their schedule

* fix: got it working

* fix: don't change the font size of course names

* fix: remove unused prop

* fix: lint errs

* fix: remove unused code
2024-03-11 23:41:20 -05:00
Lukas Zenick
4c61ebd3fc fix: Calendar View/Scaling Issues (#144)
* fix: calendar looks normal now; scaling

* fix: array indexing

* chore: eslint

* chore: lint

* feat: team Links and scrolling
2024-03-11 23:34:38 -05:00
Lukas Zenick
591687eee8 fix: injection not working from som/elie commit (#145) 2024-03-11 15:53:45 -05:00
Razboy20
261d2f2e84 refactor: match dropdown to figma & fix issues (#142) 2024-03-09 23:16:56 -06:00
Razboy20
3839bff29e feat: add chrome.storage api mocks for storybook use (#141) 2024-03-09 23:15:50 -06:00
Razboy20
78a6939929 fix: chromatic builds on PRs (#140) 2024-03-09 21:20:41 -06:00
Som Gupta
3406e9a0e2 fix: fixed issues involving course meeting objects not being recognized as course meeting objects (#132)
* fix: coursemeeting objects now created properly. course popup works on calendar

* refactor: removed duplicated getTimeString method in useFlattenedHook

* refactor: meeting constructor

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-09 20:21:38 -06:00
Lukas Zenick
c51e6881d1 fix: Schedule Switching Bugs (#138)
* style: course selection fix

* fix: generic bugs on course selection

* fix: schedule switch lag when popup is open for too long

* fix: storybook bug

* chore: remove unnecessary dependency
2024-03-09 19:54:51 -06:00
Lukas Zenick
d70011016a fix: non-determinstic options page generation (#137)
* fix: non-determinstic options page generation

* fix: remove console log
2024-03-09 15:01:37 -06:00
Razboy20
f67280127a refactor: remove listWidth prop from List component and associated components (#135) 2024-03-09 00:37:31 -06:00
Razboy20
f932168f66 refactor: replace logo image imports with LogoIcon component (#134) 2024-03-09 00:36:52 -06:00
Lukas Zenick
dc100b5d3a fix: options page (#131)
* fix: options page

* chore: rename title of options page

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-08 20:58:52 -06:00
Razboy20
10eb9e4456 chore: prettier 2024-03-07 19:46:39 -06:00
Razboy20
2f537b4f3e fix: theme colors 2024-03-07 18:36:55 -06:00
Razboy20
11303daebc fix: chromatic build 2024-03-07 18:34:35 -06:00
Razboy20
60ab140c55 fix: build 2024-03-07 18:25:57 -06:00
Razboy20
51bbd6590b revert: color palette for calendar (#118) 2024-03-07 18:20:46 -06:00
Razboy20
346b9ced97 chore: remove unused components
(and duplicated calendar components)
2024-03-07 18:08:25 -06:00
Razboy20
2992e784b0 chore: merge and fix conflicts 2024-03-07 17:53:13 -06:00
doprz
2593b371d5 chore: lint and format repo - 1 lint error left 2024-03-07 16:45:35 -06:00
Razboy20
8f360206fb chore: cleanup/resolve PR comments 2024-03-07 16:45:26 -06:00
doprz
0c44849e15 feat: refactor all components in injected 2024-03-06 15:12:44 -06:00
doprz
f93a98e46a fix: delete storybook timestamp file 2024-03-06 15:12:44 -06:00
doprz
e5443122b4 feat: refactor all components in common 2024-03-06 15:12:44 -06:00
doprz
28f192472b feat: refactor calendar 2024-03-06 15:12:40 -06:00
Abhinav Chadaga
745f9dd6fb feat: abhinavchadaga/course-catalog-popup (#128)
* some work

* some work on course popup

update the stories and create the header component

* use chip component in header

* complete CourseHeaderAndActions Component

added course buttons, using proper subcomponents now.

* Change test course to 314

* Add rmp callback

* some unocss updates

* add course button onclick handlers

* add todo for calendar button

* Rename CoursePopup

Old one to "Old", remove "2" from new one

* description stuff done

* Modify story to use proper course info

* Add Grade Distribution Stuff

* Minor tweaks

change style in header

* Add TODO

replace current grade colors with a tailwind palette

* Fix syllabi url

Remove unused variable and unnecessary args to url

* Bunch of renaming

* Kinda complete the handlers

* change grade distribution colors to match updated figma

* change from reducer pattern to state variables, remove chartData from state

* add additional story

* disabled add when course is not open

* use array fill

* Some changes with the instructor names

* trying to get the CES stuff to work

* CES button is working

* remove a todo

* add actual color for dminus

* fix description, start no distribution state

* post merge fixes

* small fixes

* fix: import as type

* fix: some better typescript stuff i think

* fix: manifest.ts

* fix: pr feedback

* fix: remove old CoursePopup component

* fix: course catalog injected popup story should useScott's 314 class since it actually has data

* fix: build error in background.ts:

* chore: run eslint autofix on CourseCatalogInjectedPopup.stories.ts

* chore: run prettier on CourseCatalogInjectedPopup.stories.ts
2024-03-06 15:12:14 -06:00
Abhinav Chadaga
471e55dcea feat: color palette for calendar (#118)
* feat: work on the palette

* feat: palette basically done?

* fix: lint warnings and errors

* fix: minor fixes

* fix: color patch colors and shades

* fix: prettier issue

* chore: use TS satisfies

* chore: remove eslint-disable comment

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-03-06 15:12:13 -06:00
doprz
adbe8ac163 chore: remove custom-eslint-rules 2024-03-06 15:12:13 -06:00
doprz
e44223084a chore: lint and format repo 2024-03-06 15:12:13 -06:00
doprz
7718d76be9 chore: regenerate lock file 2024-03-06 15:12:13 -06:00
Som Gupta
f22a3cd7c0 fix: fixed bug with course cells after 12 PM extending past midnight (#122)
* Temporarily uninstalling husky cause github desktop has issues with it

* Cleaned up some code. Removed unnecessary state value on injected popup

* Should've fixed popup alignment issue. Still need to integrate course schedule with calendar. Still debugging.

* Updated CalendarGridStories

* Fix: change to ExampleCourse from exampleCourse

* setCourse and calendar header need work

* Update as part of merge

* Fix: fixed build errors

* Fix: Added Todo

* Chore: Cleaned up useFlattenedCourseSchedule hook

* fix: List now keeps track of state when existing items are switched, while adding new items to the end

* Added back husky

* Update src/views/components/calendar/Calendar/Calendar.tsx

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

* refactor: added type-safety, destructuring, etc. ready for re-review

* refactor: got rid of ts-ignore in openNewTabFromContentScript

* Update src/views/components/calendar/CalendarHeader/CalenderHeader.tsx

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

* refactor: using path aliasing

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

* refactor: using path aliasing

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

* refactor: using satisfies instead of as

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

* refactor: using satisfies instead of as

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

* style: reformatted spacing

* style: eslint import order

* refactor: added new constructor for UserSchedule to avoid passing down null values to child props

* fix: fixed bug with course cell times starting and after 12 PM. commented in CourseMeeting class

* Update src/views/hooks/useFlattenedCourseSchedule.ts

* fix: fixed build errors by removing old apis

* refactor: added type-safety and destructuring

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-03-06 15:12:13 -06:00
doprz
5abb2a4d4f chore: fix lint errors 2024-03-06 15:12:12 -06:00
doprz
74e6379d93 chore: use eslint-plugin-import-essentials and update packages 2024-03-06 15:11:58 -06:00
Lukas Zenick
7f2a5893d4 feat: popup schedule select (#126)
* feat: sexy arrow animation

* feat: dropdown technically works

* fix: scss clarity

* feat: beautiful dropdown

* feat: proper switching; fix: no duplicates allowed

* fix: lag using async

* style: schedule options

* fix: can select same schedule again

* fix: annoying build error
2024-03-06 15:11:32 -06:00
Abhinav Chadaga
89d03f4244 feat: course-catalog-injected-popup (#98)
* some work

* some work on course popup

update the stories and create the header component

* use chip component in header

* complete CourseHeaderAndActions Component

added course buttons, using proper subcomponents now.

* Change test course to 314

* Add rmp callback

* some unocss updates

* add course button onclick handlers

* add todo for calendar button

* Rename CoursePopup

Old one to "Old", remove "2" from new one

* description stuff done

* Modify story to use proper course info

* Add Grade Distribution Stuff

* Minor tweaks

change style in header

* Add TODO

replace current grade colors with a tailwind palette

* Fix syllabi url

Remove unused variable and unnecessary args to url

* Bunch of renaming

* Kinda complete the handlers

* change grade distribution colors to match updated figma

* change from reducer pattern to state variables, remove chartData from state

* add additional story

* disabled add when course is not open

* use array fill

* Some changes with the instructor names

* trying to get the CES stuff to work

* CES button is working

* remove a todo

* add actual color for dminus

* fix description, start no distribution state

* post merge fixes

* small fixes

* fix: import as type

* fix: some better typescript stuff i think

* fix: manifest.ts

* fix: pr feedback

* Apply suggestions from code review

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-03-06 15:11:32 -06:00
Lukas Zenick
0c5bec8002 fix: calendar storybook issue (#125)
Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-03-06 15:11:32 -06:00
doprz
265652c420 feat: check-path-alias autofix (#124)
* feat: add autofix

* chore: autofix repo with new custom ESLint rule
2024-03-06 15:11:31 -06:00
doprz
208103d708 feat: add check-path-alias custom ESLint rule (#123) 2024-03-06 15:11:31 -06:00
Dhruv
6ba8b68654 fix: remove extra spacing (#121) 2024-03-06 15:11:31 -06:00
Samuel Gunter
eba5d9f508 feat: dividers in calendar bottom bar (#120)
* feat: added dividers to CalendarBottomBar

* fix: fix import order
2024-03-06 15:11:31 -06:00
Lukas Zenick
d9ee23c5bb feat: working PNG and CAL downloads (#119)
* working save as PNG

* cleanup

* feat(cal): working ICS file
2024-03-06 15:11:31 -06:00
doprz
d62b8d1af1 chore: lint and format the repo 2024-03-06 15:11:31 -06:00
doprz
62f0851406 fix: refactor AST parsing for custom ESLint rule 2024-03-06 15:11:30 -06:00
doprz
7ab5b157b1 chore: regenerate pnpm-lock.yaml 2024-03-06 15:11:30 -06:00
Som Gupta
a99a55788a feat: Calendar Schedule component finished, fix: list didn't allow updates when adding a new schedule (#115)
* Temporarily uninstalling husky cause github desktop has issues with it

* Cleaned up some code. Removed unnecessary state value on injected popup

* Should've fixed popup alignment issue. Still need to integrate course schedule with calendar. Still debugging.

* Updated CalendarGridStories

* Fix: change to ExampleCourse from exampleCourse

* setCourse and calendar header need work

* Update as part of merge

* Fix: fixed build errors

* Fix: Added Todo

* Chore: Cleaned up useFlattenedCourseSchedule hook

* fix: List now keeps track of state when existing items are switched, while adding new items to the end

* Added back husky

* Update src/views/components/calendar/Calendar/Calendar.tsx

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

* refactor: added type-safety, destructuring, etc. ready for re-review

* refactor: got rid of ts-ignore in openNewTabFromContentScript

* Update src/views/components/calendar/CalendarHeader/CalenderHeader.tsx

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

* refactor: using path aliasing

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

* refactor: using path aliasing

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

* refactor: using satisfies instead of as

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

* refactor: using satisfies instead of as

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>

* style: reformatted spacing

* style: eslint import order

* refactor: added new constructor for UserSchedule to avoid passing down null values to child props

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-03-06 15:11:30 -06:00
doprz
3a48859ddd fix: openTabFromContentScript TS issue 2024-03-06 15:11:30 -06:00
doprz
ced29975b2 fix: chromatic storybook - CourseCatalogInjectedPopup (#106)
* chore: add pnpm peer deps

* fix: merge conflict and rebase

* chore: remove deps
2024-03-06 15:11:29 -06:00
Dhruv
84e8320e8f fix: divider usage in HeaderAndActions (#113)
* fix: use StatusType

* fix: use AutoLoadStatus

* fix: use typof SiteSupport.*

* fix: one more of Status to StatusType

* fix: use import type

* fix: use path alias imports

* fix: use Extract

* fix: remove unnecessary import

* fix: **revert this later** - comment out build errs

* fix: add schedule to story

* feat: add props for dividers

* revert: un-comment build errors

This reverts commit 082e9e0269.

* Revert "fix: remove unnecessary import"

This reverts commit 9230346d26.

* Revert "fix: use Extract"

This reverts commit f6aa80d411.

* Revert "fix: use path alias imports"

This reverts commit ea9bf3c635.

* Revert "fix: use import type"

This reverts commit 27fee47778.

* Revert "Merge branch 'fix/Status-to-StatusType' into fix/divider-usage"

This reverts commit b1715ea360, reversing
changes made to 9ccc43ca27.

* fix: dont use magic number

* fix: lint errs

* fix: reorder imports
2024-03-06 15:11:29 -06:00
Dhruv
5f1c0231e4 fix: remote react-window fully (from List component) (#114)
* chore: pnpm i react-window

* Revert "chore: pnpm i react-window"

This reverts commit 2234d39dbb.

* fix: remote ref to react-window (for good)
2024-03-06 15:11:29 -06:00
Dhruv
b17c3fae6d fix: cleanup imports (#112)
* fix: use path alias

* fix: more path alias

* fix: even more path aliasing

* fix: even moreeeee path aliasing

* fix: sort imports

* fix: sort imports (again)
2024-03-06 15:11:29 -06:00
Dhruv
19fe070491 fix: type issues by using correct import (#111)
* fix: use StatusType

* fix: use AutoLoadStatus

* fix: use typof SiteSupport.*

* fix: one more of Status to StatusType

* fix: use import type

* fix: use path alias imports

* fix: use Extract

* fix: remove unnecessary import
2024-03-06 15:11:29 -06:00
doprz
8c069b7ad3 feat: add custom ESLint rule restrict-import-depth (#110) 2024-03-06 15:11:28 -06:00
Dhruv
87799d8f02 feat: fix icons on PopupMain and convert to tailwind (#108)
* feat: fix icons on PopupMain

* fix: use text-white

* fix: move TestColors

* fix: convert to tailwind

* fix: finish moving TestColors out

* chore: add path alias

* chore: lint PR

* feat: create storybook.ts and move tailwindColorways there

---------

Co-authored-by: doprz <52579214+doprz@users.noreply.github.com>
2024-03-06 15:11:28 -06:00
07ec5abc3e feat: alignment on calendar and header (#109)
* feat: corrected date updated text

* feat: whew alignment looks way better

* feat: aligned the bars and made the latter half justify-end

* fix: limt

* fix: removed broken divider vinson did u do this
2024-03-06 15:11:28 -06:00
doprz
ee37897df4 fix: vitest path alias bug 2024-03-06 15:11:27 -06:00
doprz
8a6e9070e0 chore: lint-format-docs-tests-bugfixes (#105)
* docs: add jsdoc

* feat: change enums to as const objects

* chore(test): add themeColors.test.ts

* fix: fix tests and bugs with strings.ts util

* fix: path alias imports and tsconfig file bug

* fix: remove --max-warnings 0
2024-03-06 15:11:27 -06:00
Samuel Gunter
8ab60c9f01 feat: updated divider component (#99)
* feat: updated divider component

* refactor: inlined Divider's classes, simplified stories

* fix: style to unocss in story

* style: renamed variant to orientation for buttons

* docs: updated comments in Divider after prop name change
2024-03-06 15:11:27 -06:00
doprz
5eb7be246c feat: Best Practices (#102)
* feat: best practices

* feat: add tests workflow

* feat: add best-practices workflow

* fix: wrong indentation in workflow
2024-03-06 15:11:27 -06:00
doprz
fe599dfe75 feat: Conventional Commits (#103)
* feat: add commitlint and husky hook

* chore: fix indentation
2024-03-06 15:11:27 -06:00
knownotunknown
23632d3c09 chore: update CalendarGrid.tsx 2024-03-06 15:11:21 -06:00
knownotunknown
2a0150600f fix: bugs 2024-03-06 15:10:51 -06:00
4d387e8063 fix: old icon removed in .tsx 2024-03-06 15:10:42 -06:00
3b588c2039 feat: icon added successfully 2024-03-06 15:10:36 -06:00
Samuel Gunter
e73c9fe417 fix: change Chromatic action to build current branch, not base branch (#100) 2024-03-06 15:10:36 -06:00
knownotunknown
35fab34445 feat: can open tabs, updated injected popup heading. basically done 2024-03-06 15:10:30 -06:00
knownotunknown
35f3c72250 feat: chrome extension works 2024-03-06 15:09:30 -06:00
knownotunknown
c4a738f281 Squashed commit of the following:
commit c46e4a51c9
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Mon Feb 19 21:37:46 2024 -0600

    change from reducer pattern to state variables, remove chartData from state

commit 36bcdd2522
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Mon Feb 19 21:15:41 2024 -0600

    change grade distribution colors to match updated figma

commit 11a50df88d
Merge: c16b301 b4c96a9
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Mon Feb 19 17:57:13 2024 -0600

    Merge branch 'hackathon' into abhinavchadaga/course-catalog-popup

commit c16b301ff0
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Mon Feb 19 17:47:21 2024 -0600

    Kinda complete the handlers

commit 1ac1d9095a
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sun Feb 18 17:36:59 2024 -0600

    Bunch of renaming

commit 925829ad41
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sun Feb 18 17:24:53 2024 -0600

    Fix syllabi url

    Remove unused variable and unnecessary args to url

commit f2e5d51eb3
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sun Feb 18 17:24:22 2024 -0600

    Add TODO

    replace current grade colors with a tailwind palette

commit 747ee44440
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sun Feb 18 01:26:51 2024 -0600

    Minor tweaks

    change style in header

commit ddfe952a32
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sun Feb 18 01:26:38 2024 -0600

    Add Grade Distribution Stuff

commit c27bf3c390
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sun Feb 18 01:26:13 2024 -0600

    Modify story to use proper course info

commit 7afdbac1b8
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sat Feb 17 16:37:01 2024 -0600

    description stuff done

commit 1a89432276
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sat Feb 17 15:26:32 2024 -0600

    Rename CoursePopup

    Old one to "Old", remove "2" from new one

commit 4c2b31e61a
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sat Feb 17 15:23:01 2024 -0600

    add todo for calendar button

commit 11b7a51ded
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sat Feb 17 15:22:18 2024 -0600

    add course button onclick handlers

commit f2dfcec838
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sat Feb 17 14:52:38 2024 -0600

    some unocss updates

commit f9f375514b
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sat Feb 17 13:00:46 2024 -0600

    Add rmp callback

commit 122fc6dbdd
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sat Feb 17 13:00:16 2024 -0600

    Change test course to 314

commit 19b124b3bd
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sat Feb 17 12:19:21 2024 -0600

    complete CourseHeaderAndActions Component

    added course buttons, using proper subcomponents now.

commit 2eea01fc74
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sat Feb 17 11:22:12 2024 -0600

    use chip component in header

commit 9cb13c8fd1
Merge: a62b718 9392085
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sat Feb 17 11:21:12 2024 -0600

    Merge branch 'hackathon' into abhinavchadaga/course-catalog-popup

commit a62b718c43
Merge: 43d2675 7b7b858
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sat Feb 17 10:57:24 2024 -0600

    Merge branch 'hackathon' into abhinavchadaga/course-catalog-popup

commit 43d2675be5
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Sat Feb 17 10:54:49 2024 -0600

    some work on course popup

    update the stories and create the header component

commit 31bcef3099
Merge: 874f8d5 fa1d737
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Wed Feb 14 14:33:16 2024 -0600

    Merge branch 'main' into abhinavchadaga/course-catalog-popup

    pulling from main

commit 874f8d56cb
Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu>
Date:   Wed Feb 14 14:30:24 2024 -0600

    some work
2024-03-06 15:09:03 -06:00
doprz
e0212d5109 feat: add Calendar Component 2024-03-06 15:09:01 -06:00
knownotunknown
152bc45776 fix: import error 2024-03-06 15:07:47 -06:00
doprz
91d930ee92 chore: merge in finished CalendarGrid 2024-03-06 15:07:45 -06:00
knownotunknown
c6a48dd3f6 fix: build errors and restructure Calendar page 2024-03-06 15:05:48 -06:00
knownotunknown
39947b3694 fix: build errors and merge in Casey's branch (driodiwb) 2024-03-06 15:05:38 -06:00
doprz
8df9ea55a9 feat: use React-icons 2024-03-06 15:05:35 -06:00
DhruvArora-03
bec2649fc1 feat: add button to the rows, use new ConflictsWithWarning component 2024-03-06 15:05:02 -06:00
DhruvArora-03
1599e48d75 fix: ConflictsWithWarning 2024-03-06 15:04:57 -06:00
Lukas Zenick
bda02826b1 feat: html2canvas -> htmlToImage and fix derick's bugs 2024-03-06 15:04:32 -06:00
58c2b4634a feat: Derek/export png (#95)
* Attempting to use more lightweight version

* Did not work.

* This is not what I wanted

* The image saves correctly. Needs padding

* Padding !!

* Removed downloadjs

* Padding more
2024-03-06 15:04:31 -06:00
Lukas Zenick
a30fecf8ec fix: README.md 2024-03-06 15:04:24 -06:00
Lukas Zenick
b27b21bbfc fix: README.md 2024-03-06 15:04:15 -06:00
12d09b54cb feat: Derek vinson/calendar header (#94)
* CalendarHeader alignment progress

* Boom

* css

* Between

* Lol

* Gap fix

* whitespace-nowrap

* Gaps

* Finished alignment of CourseStatus and Buttons

* Colors

* ESLint auto format

* Color UT Registration Plus text

* Reverting vscode

---------

Co-authored-by: Vinson Zheng <vinsonzheng499@gmail.com>
2024-03-06 15:04:15 -06:00
Abhinav Chadaga
25b35846e9 sort the flattened course schedule (#93)
first by dayIndex, then startIndex, then endIndex.
2024-03-06 15:04:14 -06:00
DhruvArora-03
0f43796cd8 fix: extra space 2024-03-06 15:04:09 -06:00
doprz
0f730d6c50 feat: bottom bar for the calendar page (#91) 2024-03-06 15:04:00 -06:00
Lukas Zenick
92462cf0df fix: broken file 2024-03-06 15:03:14 -06:00
DhruvArora-03
c49b094068 chore: reorder classnames 2024-03-06 15:03:03 -06:00
Lukas Zenick
b34aacb067 fix: broken close bracket 2024-03-06 15:02:56 -06:00
vivek12311
103d2e0323 chore: add styled-components 2024-03-06 15:02:30 -06:00
vivek12311
ad83ba4cdc feat: create empty Popup story 2024-03-06 15:02:03 -06:00
doprz
e95ac42d57 chore: WIP 2024-03-06 15:01:59 -06:00
Lukas Zenick
ad18fbd162 feat: save as PNG functionality 2024-03-06 15:00:48 -06:00
Lukas Zenick
bc3054aa43 chore: adjust location of svg files 2024-03-06 15:00:30 -06:00
Lukas Zenick
53e7c7feda feat: add cal save buttons (no functionality) 2024-03-06 15:00:23 -06:00
DhruvArora-03
f8691207e3 chore: cleanup useFlattenedCourseSchedule 2024-03-06 15:00:18 -06:00
knownotunknown
5ad72af566 chore: add courseCells and improve types 2024-03-06 14:59:29 -06:00
Casey Charleston
d1a336e903 feat: add Calendar schedules component (clicking on storybook not working) 2024-03-06 14:59:21 -06:00
DhruvArora-03
5be79730b3 chore: working on course popup - stopping because abhinav already doing 2024-03-06 14:59:00 -06:00
DhruvArora-03
9d0f210548 feat: add empty settings component - waiting on design 2024-03-06 14:58:46 -06:00
Abhinav Chadaga
387b508e40 chore: update CalendarCourseCell.tsx 2024-03-06 14:58:27 -06:00
doprz
0ed8d9c82d chore: add args to default story 2024-03-06 14:58:24 -06:00
doprz
23276e5c7c feat: add CalendarHeader and its Storybook, need to resize 2024-03-06 13:49:32 -06:00
doprz
37b5101e44 chore: update default story 2024-03-06 13:48:12 -06:00
Razboy20
f04ff2fe26 chore: update course block names 2024-03-06 13:47:36 -06:00
doprz
13c69ef862 fix: CalendarCourseCell spacing 2024-03-06 13:47:34 -06:00
knownotunknown
27d945f57c fix: revert last commit
This reverts commit 3c7b35d5f3.
2024-03-06 13:46:12 -06:00
knownotunknown
aef8c3d987 fix: revert "chore: add default story"
This reverts commit 8edd062588.
2024-03-06 13:45:47 -06:00
doprz
115d794ef9 chore: add default story 2024-03-06 13:45:44 -06:00
Abhinav Chadaga
bc935cc80a chore: update CalendarCourseCell.tsx 2024-03-06 13:44:15 -06:00
Abhinav Chadaga
e54f488b17 feat: implement flatten course schedule helper function
takes a course schedule and returns an array of objects that can be used to render all the individual course
2024-03-06 13:44:09 -06:00
Razboy20
cc7138949c fix: margins on list component 2024-03-06 13:44:05 -06:00
Razboy20
74be880f9d fix: calendar course cell colors 2024-03-06 13:43:57 -06:00
DhruvArora-03
5dbee6f0c3 feat: add ImportantLinks Component 2024-03-06 13:43:34 -06:00
knownotunknown
cbb190bf4b fix: made list draggable only by handle 2024-03-06 13:42:55 -06:00
Razboy20
4375118cd9 chore: add eslint on save 2024-03-06 13:42:37 -06:00
Lukas Zenick
9aa78a02a5 fix: undefined color case 2024-03-06 13:42:31 -06:00
Razboy20
1269731b55 chore: update button stylings 2024-03-06 13:42:26 -06:00
Razboy20
79d7832d09 fix: unocss theme color namings 2024-03-06 13:42:17 -06:00
knownotunknown
64fa12b10c chore: use export function instead of React.FC 2024-03-06 13:41:23 -06:00
doprz
56306ab944 fix: revert CalendarGrid and CalendarGridCell back to SCSS from Tailwind 2024-03-06 13:41:21 -06:00
DhruvArora-03
923c673988 chore(docs): add JSdoc to calendar page 2024-03-06 13:40:22 -06:00
doprz
7e2f5eaed7 feat: migrate styles to TailwindCSS 2024-03-06 13:39:53 -06:00
4dc8957c45 fix: align timeBlock div 2024-03-06 13:38:47 -06:00
cbb89c0db5 chore: add comment 2024-03-06 13:38:20 -06:00
ecdaadb83e fix: update daysOfWeek with new DAY_MAP keys 2024-03-06 13:37:59 -06:00
b480fa28b2 chore: shorten DAY_MAP keys 2024-03-06 13:37:12 -06:00
8493b482c4 chore: refactor 2024-03-06 13:36:37 -06:00
18406b0c94 fix: add margin-top: -10px to p
Correcting text
2024-03-06 13:36:11 -06:00
8b9cb065c2 feat: add tickmarks to day div 2024-03-06 13:35:36 -06:00
7ee732b31e chore: polish up code 2024-03-06 13:35:14 -06:00
e49fc295ba feat: finally fix grid JSX.Element generation 2024-03-06 13:34:51 -06:00
b691bf3231 fix: grid JSX.Element generation 2024-03-06 13:34:17 -06:00
0777b822b3 chore: refactor grid with Array.from() 2024-03-06 13:32:18 -06:00
fc5af56bb7 chore: fix alignment 2024-03-06 13:32:04 -06:00
doprz
c9d46b60ec chore: small style adjustments 2024-03-06 13:32:00 -06:00
fd91c3b12e feat: add story for CalendarGridCell 2024-03-06 13:31:11 -06:00
1bb6191244 feat: align day labels and add to grid 2024-03-06 13:30:32 -06:00
063349d96d feat: use filter() instead of pop() 2024-03-06 13:30:05 -06:00
d377afbf8b chore: format correctly 2024-03-06 13:29:14 -06:00
ded3d96aae chore: revert settings.json 2024-03-06 13:29:02 -06:00
doprz
56f6456ce8 feat: add CSS for timeLabelContainer div 2024-03-06 13:28:59 -06:00
95e0544b73 feat: add timeAndGrid div 2024-03-06 13:27:48 -06:00
9d6821127e feat: add time column to Calendar Component 2024-03-06 13:27:15 -06:00
doprz
0ba61534cb feat: add CSS for hourLine div 2024-03-06 13:27:13 -06:00
doprz
6cdcf4930d feat: add CSS for calendarCell div 2024-03-06 13:26:48 -06:00
b535a6eb32 feat: use display: grid for calendarGrid 2024-03-06 13:21:38 -06:00
doprz
0036dc5c80 chore: trying some CSS 2024-03-06 13:21:35 -06:00
doprz
dcc8a6d249 chore: refactor 2024-03-06 13:13:32 -06:00
203b3bb340 chore: center div using display flex 2024-03-06 13:12:02 -06:00
200f67a1eb chore: revert changes in stylesheet 2024-03-06 13:11:39 -06:00
doprz
9105bcba15 chore: add css class 2024-03-06 13:11:36 -06:00
doprz
07f75914bf chore: refactor 2024-03-06 13:10:20 -06:00
doprz
cb3cb5d5fc feat: add Storybook story 2024-03-06 13:08:57 -06:00
doprz
4165d484bf chore: refactor 2024-03-06 13:06:46 -06:00
doprz
7f138dafd0 chore: colors modules switch 2024-03-06 13:04:55 -06:00
doprz
5a8f6a8f1f chore: add docs 2024-03-06 13:03:05 -06:00
doprz
e7ce014c70 chore: format 2024-03-06 13:00:38 -06:00
doprz
40ece9f425 chore: use camelCase for CSS modules 2024-03-06 12:59:44 -06:00
DhruvArora-03
bd73e27db4 chore: undo dummy commit 2024-03-06 12:55:42 -06:00
DhruvArora-03
0695c70dbf chore: dummy commit 2024-03-06 12:55:10 -06:00
knownotunknown
9e0f9df9de feat: convert all LabelsAndDetails Components to Tailwind 2024-03-06 12:54:58 -06:00
Samuel Gunter
8e3aa7ef33 fix: only show button hover effects when not disabled 2024-03-06 12:54:57 -06:00
Samuel Gunter
1fdbe6294e chore: suppress useless TS warnings 2024-03-06 12:54:57 -06:00
doprz
93b65ac2ed feat: add buttons with icons in tailwind 2024-03-06 12:54:30 -06:00
doprz
28d93b3c25 feat: add tailwind version of Button component 2024-03-06 12:52:56 -06:00
doprz
863521fb3b feat: update Button to v2 design 2024-03-06 12:51:09 -06:00
doprz
837fddf804 fix: non-virtual dnd 2024-03-06 10:48:51 -06:00
knownotunknown
677aa624d7 feat: early iteration of non-virtual list 2024-03-06 10:47:32 -06:00
knownotunknown
d390af3c79 chore: update CalendarCourse.stories.tsx 2024-03-06 10:47:26 -06:00
knownotunknown
6af805ba3a fix: eslint and remove React-beautiful-dnd 2024-03-06 10:46:52 -06:00
doprz
cd34601379 feat: made List more extensible 2024-03-06 10:46:47 -06:00
doprz
b800c58502 chore: update packages 2024-03-06 10:45:53 -06:00
knownotunknown
34a6449529 feat: drag only on vertical axis
Made this change a while ago, but didn't push since it looks like we might switch to Elie's DnD. Pushing since it looks like there might still be reviewers.
2024-03-06 10:44:28 -06:00
knownotunknown
0273a23913 fix: revert "rename to course block and fix line height for styling"
This reverts commit 77a1d67af3.
2024-03-06 10:44:15 -06:00
doprz
e6b4049403 feat: add List component 2024-03-06 10:44:09 -06:00
abhinavchadaga
b602b0b895 fix: rename to course block and fix line height for styling 2024-03-06 10:41:32 -06:00
abhinavchadaga
4ca97abd06 chore: change the default course 2024-03-06 10:41:20 -06:00
abhinavchadaga
da9e7aac41 feat: basic CalendarCourseMeeting component laid out - missing Text and Right Icon 2024-03-06 10:39:58 -06:00
knownotunknown
3568b8eb5e feat: change Chip to tailwind css. Fixed eslint for ConflictsWithWarning 2024-03-06 10:39:45 -06:00
knownotunknown
fa05d9c492 chore: update Chip.stories.tsx 2024-03-06 10:39:35 -06:00
knownotunknown
7cf34f2956 chore: delete unnecessary imports 2024-03-06 10:39:20 -06:00
knownotunknown
23e881f14c feat: implement Chip component
Styled inline since I'll need to rewrite in TailwindCSS anyways
2024-03-06 10:38:48 -06:00
knownotunknown
7eb3113ada fix: update alignment 2024-03-06 10:37:57 -06:00
knownotunknown
f3a8a7db56 feat: update with TailwindCSS 2024-03-06 10:36:59 -06:00
knownotunknown
12f680d7e9 feat: finish ScheduleTotalHoursAndCourses 2024-03-06 10:27:44 -06:00
knownotunknown
21b643000d feat: implemented InfoCard 2024-03-06 10:27:20 -06:00
knownotunknown
7dec3c0c2a chore: update ConflictsWithWarning.tsx 2024-03-06 10:27:10 -06:00
knownotunknown
93f3a307b4 feat: implemented ConflictsWithWarning 2024-03-06 10:26:40 -06:00
knownotunknown
babc925967 feat: build without errors 2024-03-06 10:26:12 -06:00
Som Gupta
58d7df499c feat: CourseStatus Component implemented (#83)
Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-06 10:26:11 -06:00
Razboy20
b0512e392b ci: update pnpm action (#86)
* ci: update pnpm action

* hotfix: change action type
2024-03-06 10:26:11 -06:00
Razboy20
b7878d81c6 ci: chromatic builds (#84)
* ci: chromatic builds

* hotfix: add pnpm install to workflow

* hotfix: add pnpm version
2024-03-06 10:26:11 -06:00
Dhruv
9accd17bd4 feat: PopupCourseBlock Component (#79)
Co-authored-by: Razboy20 <Razboy20@users.noreply.github.com>
Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-06 10:26:11 -06:00
doprz
bfeb2398aa feat: calendar grid and grid cells (#81) 2024-03-06 10:26:05 -06:00
Razboy20
2321540e97 refactor: replace classnames with clsx (#78) 2024-03-06 10:24:58 -06:00
Dhruv
ccea0f4bd1 feat: Create icon helper (#77)
* create icon helper

* change getStatusIcon to StatusIcon react component

---------

Co-authored-by: Razboy20 <razboy20@gmail.com>
2024-03-06 10:24:57 -06:00
Abhinav Chadaga
00e00197ef feat: calendar course block component (#75) 2024-03-06 10:24:57 -06:00
Razboy20
85c7f7817c feat: UnoCSS (TailwindCSS) (Storybook only) (#61)
* feat: unocss (wip)

* feat: unocss (storybook only)

* cleanup unocss config

* revert button.stories.tsx changes
2024-03-06 10:24:57 -06:00
Razboy20
bb3b313fd2 fix: icon library resolution (#74) 2024-03-06 10:24:52 -06:00
Razboy20
52e34cb830 fix: change material icons to material symbols (#71) 2024-03-06 10:24:42 -06:00
Samuel Gunter
8b8433deaf feat: updated Text component to latest design specification (#70) 2024-03-06 10:24:41 -06:00
doprz
4faca8c43b feat: calendar components 3rd attempt at merging (#60) 2024-03-06 10:24:27 -06:00
Razboy20
4455b10cc7 chore: update dependencies (#67) 2024-03-06 10:20:40 -06:00
Razboy20
2d67b1218f feat: unplugin-icons (#62) 2024-03-06 10:20:40 -06:00
72b7a9d7b1 Calendar Components 3rd Attempt at Merging 2024-01-30 21:17:19 -06:00
385 changed files with 41096 additions and 37253 deletions

242
.dockerignore Normal file
View File

@@ -0,0 +1,242 @@
# File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig
# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,macos,node,react,storybookjs
# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,macos,node,react,storybookjs
### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### macOS Patch ###
# iCloud generated files
*.icloud
### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
.env.*
!.env.example
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-te
node_modulesst
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
### Node Patch ###
# Serverless Webpack directories
.webpack/
# Optional stylelint cache
# SvelteKit build / generate output
.svelte-kit
### react ###
.DS_*
**/*.backup.*
**/*.back.*
*.sublime*
psd
thumb
sketch
### VisualStudioCode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
### VisualStudioCode Patch ###
# Ignore all local history of files
.history
.ionide
# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,macos,node,react,storybookjs
# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option)
package-lock.json
storybook-static/
package/
# Version control
.git
.gitignore
.gitattributes
# Dependencies
.pnpm-store
!pnpm-lock.yaml
# Testing
coverage
.nyc_output
# OS files
.DS_Store
Thumbs.db
# Docker
Dockerfile
.dockerignore
docker-compose*
# Documentation
README.md
CHANGELOG.md
DOCKER_DEV_SETUP.md
docs/

12
.editorconfig Normal file
View File

@@ -0,0 +1,12 @@
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_size = 4
indent_style = space
[*.{nix,yaml,yml}]
indent_size = 2

View File

@@ -1 +0,0 @@
MANIFEST_KEY=

3
.env.example Normal file
View File

@@ -0,0 +1,3 @@
SENTRY_ORG=longhorn-developers
SENTRY_PROJECT=ut-registration-plus
SENTRY_AUTH_TOKEN=

1
.envrc Normal file
View File

@@ -0,0 +1 @@
use flake

215
.eslintrc
View File

@@ -1,215 +0,0 @@
{
"root": true,
"env": {
"browser": true,
"es6": true,
"node": true,
"webextensions": true
},
"ignorePatterns": [
"*.html",
"tsconfig.json"
],
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"plugin:react-hooks/recommended",
"plugin:storybook/recommended",
"airbnb-base",
"airbnb/rules/react",
"airbnb-typescript",
"@unocss",
"prettier",
],
"plugins": [
"import",
"jsdoc",
"react-prefer-function-component"
],
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly",
"debugger": true,
"browser": true,
"context": true,
"JSX": true
},
"parser": "@typescript-eslint/parser",
"parserOptions": {
"project": "./tsconfig.json",
"ecmaVersion": 2022,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true,
"modules": true,
"experimentalObjectRestSpread": true
}
},
"settings": {
"react": {
"version": "detect"
},
"jsdoc": {
"mode": "typescript"
},
"import/parsers": {
"@typescript-eslint/parser": [
".ts",
".tsx"
]
},
"import/resolver": {
"typescript": {
"alwaysTryTypes": true,
"project": "./tsconfig.json"
}
}
},
"rules": {
"prefer-const": [
"off",
{
"destructuring": "any",
"ignoreReadBeforeAssign": false
}
],
"no-inner-declarations": "off",
"sort-imports": "off",
"no-case-declarations": "off",
"no-unreachable": "warn",
"no-constant-condition": "error",
"space-before-function-paren": "off",
"no-undef": "off",
"no-return-await": "off",
"@typescript-eslint/return-await": "off",
"@typescript-eslint/no-shadow": [
"off"
],
"@typescript-eslint/no-use-before-define": [
"off"
],
"class-methods-use-this": "off",
"react-hooks/exhaustive-deps": "warn",
"@typescript-eslint/lines-between-class-members": "off",
"no-param-reassign": [
"error",
{
"props": false
}
],
"no-console": "off",
"consistent-return": "off",
"react/destructuring-assignment": "off",
"import/prefer-default-export": "off",
"no-promise-executor-return": "off",
"import/no-cycle": "off",
"import/no-extraneous-dependencies": "off",
"react/jsx-props-no-spreading": "off",
"keyword-spacing": [
"error",
{
"before": true,
"after": true
}
],
"no-continue": "off",
"space-before-blocks": [
"error",
{
"functions": "always",
"keywords": "always",
"classes": "always"
}
],
"react/jsx-filename-extension": [
1,
{
"extensions": [
".tsx"
]
}
],
"react/no-deprecated": "warn",
"react/prop-types": "off",
"react-prefer-function-component/react-prefer-function-component": [
"warn",
{
"allowComponentDidCatch": false
}
],
"react/function-component-definition": "off",
"react/button-has-type": "off",
"jsdoc/require-param-type": "off",
"jsdoc/require-returns-type": "off",
"jsdoc/newline-after-description": "off",
"react/require-default-props": "off",
"jsdoc/require-jsdoc": [
"warn",
{
"enableFixer": false,
"publicOnly": true,
"checkConstructors": false,
"require": {
"ArrowFunctionExpression": true,
"ClassDeclaration": true,
"ClassExpression": true,
"FunctionExpression": true
},
"contexts": [
"MethodDefinition:not([key.name=\"componentDidMount\"]):not([key.name=\"render\"])",
"ArrowFunctionExpression",
"ClassDeclaration",
"ClassExpression",
"ClassProperty:not([key.name=\"state\"]):not([key.name=\"componentDidMount\"])",
"FunctionDeclaration",
"FunctionExpression",
"TSDeclareFunction",
"TSEnumDeclaration",
"TSInterfaceDeclaration",
"TSMethodSignature",
"TSModuleDeclaration",
"TSTypeAliasDeclaration"
]
}
],
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-unused-vars": "warn",
"@typescript-eslint/naming-convention": "off",
"@typescript-eslint/space-before-function-paren": "off",
"@typescript-eslint/ban-ts-comment": "off",
"@typescript-eslint/no-empty-interface": "warn",
"import/no-restricted-paths": [
"error",
{
"zones": [
{
"target": "./src/background",
"from": "./src/views",
"message": "You cannot import into the `background` directory from the `views` directory (i.e. content script files) because it will break the build!"
},
{
"target": "./src/views",
"from": "./src/background",
"message": "You cannot import into the `views` directory from the `background` directory (i.e. background script files) because it will break the build!"
},
{
"target": "./src/shared",
"from": "./",
"except": [
"./src/shared",
"./node_modules"
],
"message": "You cannot import into `shared` from an external directory."
}
]
}
],
"import/extensions": "off",
"no-restricted-syntax": [
"error",
"ForInStatement",
"LabeledStatement",
"WithStatement"
]
}
}

232
.eslintrc.cjs Normal file
View File

@@ -0,0 +1,232 @@
module.exports = {
root: true,
env: {
browser: true,
es6: true,
node: true,
webextensions: true,
},
ignorePatterns: ['*.html', 'tsconfig.json'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'plugin:storybook/recommended',
'airbnb-base',
'airbnb/rules/react',
'airbnb-typescript',
'@unocss',
'prettier',
],
plugins: [
'import',
'import-essentials',
'jsdoc',
'eslint-plugin-tsdoc',
'react-prefer-function-component',
'@typescript-eslint',
'simple-import-sort',
],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly',
debugger: true,
browser: true,
context: true,
JSX: true,
},
parser: '@typescript-eslint/parser',
parserOptions: {
project: './tsconfig.json',
ecmaVersion: 2022,
sourceType: 'module',
ecmaFeatures: {
jsx: true,
modules: true,
experimentalObjectRestSpread: true,
},
},
settings: {
react: {
version: 'detect',
},
jsdoc: {
mode: 'typescript',
},
'import/parsers': {
'@typescript-eslint/parser': ['.ts', '.tsx'],
},
'import/resolver': {
typescript: {
alwaysTryTypes: true,
project: './tsconfig.json',
},
},
},
rules: {
'prefer-const': [
'off',
{
destructuring: 'any',
ignoreReadBeforeAssign: false,
},
],
'no-plusplus': 'off',
'no-inner-declarations': 'off',
'sort-imports': 'off',
'no-case-declarations': 'off',
'no-unreachable': 'warn',
'no-constant-condition': 'error',
'space-before-function-paren': 'off',
'no-undef': 'off',
'no-return-await': 'off',
'@typescript-eslint/return-await': 'off',
'@typescript-eslint/no-shadow': ['off'],
'@typescript-eslint/no-use-before-define': ['off'],
'class-methods-use-this': 'off',
'react-hooks/exhaustive-deps': 'warn',
'@typescript-eslint/lines-between-class-members': 'off',
'no-param-reassign': [
'error',
{
props: false,
},
],
'no-console': 'off',
'consistent-return': 'off',
'react/destructuring-assignment': 'off',
'import/prefer-default-export': 'off',
'no-promise-executor-return': 'off',
'import/no-cycle': 'off',
'import/no-extraneous-dependencies': 'off',
'react/jsx-props-no-spreading': 'off',
'react/jsx-no-useless-fragment': [
'error',
{
allowExpressions: true,
},
],
'keyword-spacing': [
'error',
{
before: true,
after: true,
},
],
'no-continue': 'off',
'space-before-blocks': [
'error',
{
functions: 'always',
keywords: 'always',
classes: 'always',
},
],
'react/jsx-filename-extension': [
1,
{
extensions: ['.tsx'],
},
],
'react/no-deprecated': 'warn',
'react/prop-types': 'off',
'react-prefer-function-component/react-prefer-function-component': [
'warn',
{
allowComponentDidCatch: false,
},
],
'react/function-component-definition': 'off',
'react/button-has-type': 'off',
'jsdoc/require-param-type': 'off',
'jsdoc/require-returns-type': 'off',
'jsdoc/newline-after-description': 'off',
'react/require-default-props': 'off',
'jsdoc/require-jsdoc': [
'error',
{
enableFixer: false,
publicOnly: true,
checkConstructors: false,
require: {
ArrowFunctionExpression: true,
ClassDeclaration: true,
ClassExpression: true,
FunctionExpression: true,
},
contexts: [
'MethodDefinition:not([key.name="componentDidMount"]):not([key.name="render"])',
'ArrowFunctionExpression',
'ClassDeclaration',
'ClassExpression',
'ClassProperty:not([key.name="state"]):not([key.name="componentDidMount"])',
'FunctionDeclaration',
'FunctionExpression',
'TSDeclareFunction',
'TSEnumDeclaration',
'TSInterfaceDeclaration',
'TSMethodSignature',
'TSModuleDeclaration',
'TSTypeAliasDeclaration',
],
},
],
'tsdoc/syntax': 'error',
'@typescript-eslint/no-explicit-any': 'error',
'@typescript-eslint/no-unused-vars': [
'warn',
{
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
},
],
'@typescript-eslint/naming-convention': 'off',
'@typescript-eslint/space-before-function-paren': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/no-empty-interface': 'warn',
'import/no-restricted-paths': [
'error',
{
zones: [
{
target: './src/background',
from: './src/views',
message:
'You cannot import into the `background` directory from the `views` directory (i.e. content script files) because it will break the build!',
},
{
target: './src/views',
from: './src/background',
message:
'You cannot import into the `views` directory from the `background` directory (i.e. background script files) because it will break the build!',
},
{
target: './src/shared',
from: './',
except: ['./src/shared', './node_modules'],
message: 'You cannot import into `shared` from an external directory.',
},
],
},
],
'import/extensions': 'off',
'no-restricted-syntax': [
'error',
'ForInStatement',
'LabeledStatement',
'WithStatement',
{
selector: 'TSEnumDeclaration',
message: "Don't declare enums",
},
],
'@typescript-eslint/consistent-type-exports': 'error',
'@typescript-eslint/consistent-type-imports': 'error',
'simple-import-sort/imports': 'error',
'simple-import-sort/exports': 'error',
'import-essentials/restrict-import-depth': 'error',
'import-essentials/check-path-alias': 'error',
},
};

58
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,58 @@
---
name: Bug report
about: Create a report to help us improve
title: '[BUG] '
labels: ''
assignees: ''
---
**Pre-submission Checklist**
<!-- Please check all applicable boxes before submitting your issue -->
- [ ] I have searched existing issues to make sure this is not a duplicate
- [ ] I have cleared my browser cache and confirmed the issue persists
- [ ] I have checked this issue affects the latest version of the extension
- [ ] I have disabled other extensions to ensure this isn't a conflict issue
- [ ] I have included all the information requested below
**Bug Description**
<!-- A clear and concise description of what the bug is -->
**Steps To Reproduce**
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected Behavior**
<!-- What you expected to happen -->
**Current Behavior**
<!-- What actually happened -->
**Screenshots**
<!-- If applicable, add screenshots to help explain your problem -->
**Debug Information**
- UTRP Extension Version: [e.g. 1.2.0]
- Browser Info: [e.g. Chrome 120.0.0]
- OS: [e.g. Windows 11, macOS Sonoma]
**Console Logs**
<!-- Please check the browser console (F12) and paste any relevant error messages -->
```
// Paste console logs here
```
**Additional Context**
<!-- Add any other context about the problem here -->

View File

@@ -0,0 +1,29 @@
---
name: Feature Request
about: Suggest an idea for this project
title: '[FEATURE] '
labels: feature
assignees: ''
---
**Pre-submission Checklist**
<!-- Please check all applicable boxes before submitting your feature request -->
- [ ] I have searched existing issues to ensure this feature hasn't been requested
- [ ] I have searched closed issues to check if this was previously rejected/implemented
- [ ] I have checked the project roadmap (if available) for planned similar features
- [ ] I have reviewed the documentation to confirm this feature doesn't exist
- [ ] I have completed all sections below with detailed information
**Your Idea**
<!-- A clear and concise description of the feature you'd like to see, and how it would work -->
**UI/UX Considerations**
<!-- If this feature involves UI changes (aka how it looks), please describe the visual aspects -->
**Other**
<!-- Any other comments you have can go here! -->

View File

@@ -0,0 +1,11 @@
---
name: Updating Build Dependencies
about: Updating Build Dependencies
title: ''
labels: build, dependencies
assignees: doprz, Razboy20
---
- [ ] Updated Nix Flake
- [ ] Update Dockerfile
- [ ] Update Docs

20
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,20 @@
version: 2
updates:
- package-ecosystem: 'npm'
directory: '/'
schedule:
interval: 'weekly'
day: 'monday'
time: '09:00'
timezone: 'America/Chicago'
groups:
minor-and-patch-updates:
update-types:
- 'minor'
- 'patch'
major-updates:
update-types:
- 'major'
ignore:
- dependency-name: '@crxjs/vite-plugin'
- dependency-name: '@unocss/vite'

33
.github/workflows/best-practices.yml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: Best Practices
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Install dependencies
run: pnpm install
- name: Run ESLint
run: pnpm run lint
format:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Install dependencies
run: pnpm install
- name: Run Prettier
run: pnpm run prettier

18
.github/workflows/check-types.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: Type Check
on: [push, pull_request]
jobs:
type-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Install dependencies
run: pnpm install
- name: Run tests
run: pnpm run check-types

View File

@@ -1,7 +1,5 @@
name: "Chromatic"
on: [push, pull_request_target]
name: 'Chromatic'
on: [push, pull_request]
jobs:
chromatic:
runs-on: ubuntu-latest
@@ -11,16 +9,14 @@ jobs:
with:
fetch-depth: 0
- name: Setup pnpm
uses: pnpm/action-setup@v3
uses: pnpm/action-setup@v4
with:
version: 8
version: 10
- name: Install dependencies
run: pnpm install
- name: Publish to Chromatic
uses: chromaui/action@latest
with:
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
projectToken: chpt_e8bd07b0b27d8eb
exitZeroOnChanges: true
autoAcceptChanges: "main"
autoAcceptChanges: 'main'

View File

@@ -1,25 +1,24 @@
name: Create Release
on:
push:
branches:
- production
- preview
push:
branches:
- production
- preview
jobs:
build:
name: build extension & create release
runs-on: ubuntu-latest
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
steps:
- uses: actions/checkout@master
- name: Get file permission
run: chmod -R 777 .
- name: Install dependencies
run: npm ci
- name: Release with semantic-release
id: semantic-release
run: npx --no-install semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
build:
name: build extension & create release
runs-on: ubuntu-latest
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
steps:
- uses: actions/checkout@master
- name: Get file permission
run: chmod -R 777 .
- name: Install dependencies
run: npm ci
- name: Release with semantic-release
id: semantic-release
run: npx --no-install semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

18
.github/workflows/tests.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Install dependencies
run: pnpm install
- name: Run tests
run: pnpm test

View File

@@ -1,43 +1,40 @@
name: Validate PR Title
# thank you ben limmer for this workflow:
# https://github.com/blimmer/semantic-release-demo-2/blob/main/.github/workflows/lint-pr.yml
on:
pull_request_target:
types:
- opened
- reopened
- edited
- synchronize
pull_request_target:
types:
- opened
- reopened
- edited
- synchronize
jobs:
main:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v3.2.6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Post Conventional Commit Comment (on failure)
uses: jungwinter/comment@v1
id: conventional-commit-help
with:
type: create
issue_number: ${{ github.event.pull_request.number }}
token: ${{ secrets.GITHUB_TOKEN }}
body: |
Your pull request title did not conform to [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) standards. Our upcoming automated release pipeline will automatically determine
the proper release version based on your pull request title.
**Cheat Sheet**
- feat: A new feature
- fix: A bug fix
- docs: Documentation only changes
- style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
- refactor: A code change that neither fixes a bug nor adds a feature
- perf: A code change that improves performance
- test: Adding missing tests or correcting existing tests
- build: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
- ci: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)
- chore: Other changes that don't modify src or test files
- revert: Reverts a previous commit
if: ${{ failure() }}
main:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v3.2.6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Post Conventional Commit Comment (on failure)
uses: jungwinter/comment@v1
id: conventional-commit-help
with:
type: create
issue_number: ${{ github.event.pull_request.number }}
token: ${{ secrets.GITHUB_TOKEN }}
body: |
Your pull request title did not conform to [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) standards. Our upcoming automated release pipeline will automatically determine
the proper release version based on your pull request title.
**Cheat Sheet**
- feat: A new feature
- fix: A bug fix
- docs: Documentation only changes
- style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
- refactor: A code change that neither fixes a bug nor adds a feature
- perf: A code change that improves performance
- test: Adding missing tests or correcting existing tests
- build: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
- ci: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)
- chore: Other changes that don't modify src or test files
- revert: Reverts a previous commit
if: ${{ failure() }}

9
.gitignore vendored
View File

@@ -208,4 +208,13 @@ sketch
# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,macos,node,react,storybookjs
# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option)
package-lock.json
storybook-static/
package/
# Nix
result
result-*
# direnv
.direnv

1
.husky/commit-msg Normal file
View File

@@ -0,0 +1 @@
npx --no -- commitlint --edit $1

2
.nvmrc
View File

@@ -1 +1 @@
v18.12.1
v20.9.0

View File

@@ -34,4 +34,4 @@
}
]
]
}
}

View File

@@ -2,7 +2,13 @@ import type { StorybookConfig } from '@storybook/react-vite';
const config: StorybookConfig = {
stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
addons: ['@storybook/addon-links', '@storybook/addon-essentials', '@storybook/addon-designs'],
addons: [
'@storybook/addon-links',
'@storybook/addon-essentials',
'@storybook/addon-designs',
'@storybook/test',
'@chromatic-com/storybook',
],
framework: {
name: '@storybook/react-vite',
options: {

View File

@@ -1,24 +1,178 @@
import { UserScheduleStore } from '@shared/storage/UserScheduleStore';
import type { Preview } from '@storybook/react';
import ExtensionRoot from '@views/components/common/ExtensionRoot/ExtensionRoot';
import React from 'react';
import ExtensionRoot from 'src/views/components/common/ExtensionRoot/ExtensionRoot';
const preview: Preview = {
parameters: {
actions: { argTypesRegex: '^on[A-Z].*' },
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
parameters: {
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
},
},
decorators: [
Story => (
<ExtensionRoot>
<Story />
</ExtensionRoot>
),
],
decorators: [
Story => (
<React.StrictMode>
<ExtensionRoot>
<Story />
</ExtensionRoot>
</React.StrictMode>
),
],
};
let localData = {};
type ListenerFunction = (
changes: { [key: string]: chrome.storage.StorageChange },
areaName: chrome.storage.AreaName
) => void;
const localDataListeners = new Map<
ListenerFunction, // key to remove listener
(changes: { [key: string]: chrome.storage.StorageChange }) => void
>();
// mock chrome api
globalThis.chrome = {
storage: {
local: {
/**
* Removes all items from storage.
* @param callback Optional.
* Callback on success, or on failure (in which case runtime.lastError will be set).
*/
async clear() {
localData = {};
},
/**
* Gets one or more items from storage.
* @param keys A single key to get, list of keys to get, or a dictionary specifying default values.
* An empty list or object will return an empty result object. Pass in null to get the entire contents of storage.
* @return A Promise that resolves with an object containing items
*/
async get(keys?: string | string[] | { [key: string]: any } | null) {
if (keys === null) {
return localData;
}
if (Array.isArray(keys)) {
return keys.reduce((acc, key) => {
acc[key] = localData[key];
return acc;
}, {} as string); // funny types
}
if (typeof keys === 'string') {
return { [keys]: localData[keys] };
}
return keys;
},
/**
* Gets the amount of space (in bytes) being used by one or more items.
* @param keys Optional. A single key or list of keys to get the total usage for. An empty list will return 0. Pass in null to get the total usage of all of storage.
* @param callback Callback with the amount of space being used by storage, or on failure (in which case runtime.lastError will be set).
* Parameter bytesInUse: Amount of space being used in storage, in bytes.
*/
async getBytesInUse() {
return 0;
},
/**
* Removes one or more items from storage.
* @param keys A single key or a list of keys for items to remove.
* @param callback Optional.
* Callback on success, or on failure (in which case runtime.lastError will be set).
*/
async remove(keys: string | string[]) {
if (Array.isArray(keys)) {
keys.forEach(key => {
for (const listener of localDataListeners.values()) {
listener({ [key]: { oldValue: localData[key], newValue: undefined } });
}
delete localData[key];
});
} else {
for (const listener of localDataListeners.values()) {
listener({ [keys]: { oldValue: localData[keys], newValue: undefined } });
}
delete localData[keys];
}
},
/**
* Sets multiple items.
* @param items An object which gives each key/value pair to update storage with. Any other key/value pairs in storage will not be affected.
* Primitive values such as numbers will serialize as expected. Values with a typeof "object" and "function" will typically serialize to {}, with the exception of Array (serializes as expected), Date, and Regex (serialize using their String representation).
* @param callback Optional.
* Callback on success, or on failure (in which case runtime.lastError will be set).
*/
async set(items: { [key: string]: any }) {
for (const key in items) {
const oldValue = localData[key];
localData[key] = JSON.parse(JSON.stringify(items[key]));
for (const listener of localDataListeners.values()) {
listener({ [key]: { oldValue: oldValue, newValue: localData[key] } });
}
}
},
},
onChanged: {
/**
* Registers an event listener callback to an event.
* @param callback Called when an event occurs. The parameters of this function depend on the type of event.
*/
addListener(
listener: (
changes: { [key: string]: chrome.storage.StorageChange },
areaName: chrome.storage.AreaName
) => void
) {
localDataListeners.set(listener, (changes: { [key: string]: chrome.storage.StorageChange }) => {
listener(changes, 'local');
});
},
/**
* Deregisters an event listener callback from an event.
* @param callback Listener that shall be unregistered.
*/
removeListener(listener: ListenerFunction) {
localDataListeners.delete(listener);
},
},
},
runtime: {
id: 'fake-id',
getManifest(): chrome.runtime.Manifest {
return {
manifest_version: 3,
name: 'fake-name',
version: '0.0.0',
};
},
onMessage: {
/**
* Registers an event listener callback to an event.
* @param callback Called when an event occurs. The parameters of this function depend on the type of event.
*/
addListener<T extends Function>(callback: T) {},
/**
* Deregisters an event listener callback from an event.
* @param callback Listener that shall be unregistered.
*/
removeListener<T extends Function>(callback: T) {},
},
},
} as typeof chrome;
// set updatedAt dates to be fixed
UserScheduleStore.get('schedules').then(schedules => {
schedules.forEach(schedule => {
schedule.updatedAt = new Date('2024-01-01 12:00').getTime();
});
UserScheduleStore.set('schedules', schedules);
});
export default preview;

View File

@@ -1,5 +1,9 @@
{
"recommendations": [
"clinyong.vscode-css-modules"
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"antfu.unocss",
"editorconfig.editorconfig",
"figma.figma-vscode-extension"
]
}
}

10
.vscode/launch.json vendored
View File

@@ -6,13 +6,9 @@
"request": "launch",
"name": "Run current script",
"runtimeExecutable": "npx",
"runtimeArgs": [
"tsx"
],
"runtimeArgs": ["tsx"],
"program": "${file}",
"skipFiles": [
"<node_internals>/**"
],
"skipFiles": ["<node_internals>/**"]
}
]
}
}

View File

@@ -1,5 +1,8 @@
{
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
@@ -23,7 +26,7 @@
"navigation": "Routes",
"logging": "log",
"popup": "Layout",
"storage": "Database",
"storage": "Database"
},
"material-icon-theme.files.associations": {
"tsconfig.extension.json": "tsconfig",
@@ -33,5 +36,5 @@
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"typescript.tsdk": "node_modules/typescript/lib",
}
"typescript.tsdk": "node_modules/typescript/lib"
}

View File

@@ -1,13 +0,0 @@
declare module '*.module.css' {
const classes: { [key: string]: string };
export default classes;
}
declare module '*.module.scss' {
const classes: { [key: string]: string };
export default classes;
}
declare module '*.mp3' {
const src: string;
export default src;
}

View File

@@ -1,22 +0,0 @@
declare global {
namespace NodeJS {
interface ProcessEnv {
NODE_ENV: 'development' | 'production';
CI?: string;
/** set this to make sure the extension id is the same for unpacked extensions
* @see https://developer.chrome.com/docs/apps/app_identity/#copy_key */
MANIFEST_KEY?: string;
/**
* The Node semantic versioning-compatible version of the extension. For preview-style releases, this variable
* converts versions like 1.0.0.100 to 1.0.0-beta.1.
*/
SEMANTIC_VERSION?: string;
}
}
type Environment = typeof process.env.NODE_ENV;
}
// If this file has no import/export statements (i.e. is a script)
// convert it into a module by adding an empty export statement.
export {};

View File

@@ -1,6 +0,0 @@
declare module "*.svg" {
import { ReactElement, SVGProps } from "react";
const ReactComponent: (props: SVGProps<SVGElement>) => ReactElement;
export default ReactComponent;
}

11
@types/vite-env.d.ts vendored Normal file
View File

@@ -0,0 +1,11 @@
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_PACKAGE_VERSION: string;
readonly VITE_SENTRY_ENVIRONMENT: string;
readonly VITE_BETA_BUILD?: 'true';
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}

406
CHANGELOG.md Normal file
View File

@@ -0,0 +1,406 @@
## [2.3.0](https://github.com/Longhorn-Developers/UT-Registration-Plus/compare/v2.2.2...v2.3.0) (2026-01-07)
### Features
* add drag-and-drop import for schedules ([#661](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/661)) ([549c52a](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/549c52a39fee718f2bb07cfce33a294835a2246b)), closes [#446](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/446)
* allow bypassing the 10-schedule limit ([#675](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/675)) ([6a67a32](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/6a67a32e4f50a5bdd20aa43789f199b822483e2d))
* condense resourceLinks course schedule ([#676](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/676)) ([cee5f02](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/cee5f0284f09f39ca5ae64559d0b697646c77e74))
* LHD birthday ([#717](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/717)) ([2d18553](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2d18553f98c5146fa18699ae20462e7dcbc9d35c))
* **nix:** add prettier-version-match check ([#713](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/713)) ([8ccf7fb](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8ccf7fb37e769ba445f39c140ca9c1c4245cc1c1))
* **nix:** build UTRP ([#714](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/714)) ([38bb29b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/38bb29b20b97ed3cf8fd6511df16553fed1d58bb))
### Bug Fixes
* .editorconfig syntax for nix files ([b406d4d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b406d4dd244a25688c2b9621cf5d441228bd8913))
* toSorted outdated chrome bug ([#694](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/694)) ([4f5d8c6](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/4f5d8c6d20e3cfeb7b62520ba1819e297d2cc60f))
## [2.2.2](https://github.com/Longhorn-Developers/UT-Registration-Plus/compare/v2.2.1...v2.2.2) (2025-10-13)
### Features
* add nix flake ([#593](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/593)) ([7b401ad](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7b401add1565ff401bad99745ff9e53b9a7f899f))
* automatically select new or duplicated schedules ([#583](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/583)) ([#589](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/589)) ([2a50f55](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2a50f5580d3dbeb0d66546c23cf29bbb37d80da2))
* **env:** add SENTRY env vars ([8f7e1bc](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8f7e1bc0af6336549068e02b80df21d4e8f4ef9c))
* export schedule button add to calendar ([#594](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/594)) ([5994ded](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/5994ded8be876cb55174d27d3fdb0832b21a0ff9))
* **release:** v2.2.2 ([c21cbd7](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/c21cbd77f0764c03a711589ff4f957cb8c936eec))
* search result shading ([#617](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/617)) ([be861b8](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/be861b823cb2cb7f6f4a1f266351eec3fc1c2f99))
* show warning for courses of different semesters ([#570](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/570)) ([2e7dac1](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2e7dac1e3eba757231ac07ac966231c08c703a16))
* support summer grades, fix summer course parser ([#596](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/596)) ([2d92dd4](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2d92dd47f00a44b7d48e92a8ffba94480e4e73f9))
### Bug Fixes
* fix or ignore various eslint warning ([#609](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/609)) ([95de8df](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/95de8df37243b6d59625df515a60442f11b7a9d3))
* limit height of schedule list dropdown in the extension popup ([#543](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/543)) ([eb8141e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/eb8141ee8c3d32bce901457178d50781b78f86dd))
* whitespace wrapping in semester warning ([#629](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/629)) ([46fe591](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/46fe591fa72ef017eea7cfb8aa37d12d8f223926))
## [2.2.1](https://github.com/Longhorn-Developers/UT-Registration-Plus/compare/v2.2.0...v2.2.1) (2025-06-04)
### Features
* add dining app promo ([#598](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/598)) ([be1dccf](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/be1dccfcb9d052c6b291b50cc53418d6bb645beb))
* inside jokes005 ([#590](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/590)) ([37471ef](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/37471efb740c7a5828cf3b54bac70954694359d7))
* **release:** v2.2.1 ([234f3d6](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/234f3d627d603adf8555b4d0e93106d198918169))
### Bug Fixes
* course columns on calendar ([#587](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/587)) ([cfb5faa](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/cfb5faa09bb0788e270d100f1f36536a53bcff75))
* hide sentry instrumentation on debug builds ([#604](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/604)) ([454e5e8](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/454e5e807af29ae0384cc3a3b8b691df5edc69d1))
## [2.2.0](https://github.com/Longhorn-Developers/UT-Registration-Plus/compare/v2.1.1...v2.2.0) (2025-04-06)
### Features
* auto create empty schedule when deleted all schedules ([#552](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/552)) ([7c2beef](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7c2beef1930fbc887e8ec1aea789016b3150cd21))
* ensure unique splash text on schedule change ([#554](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/554)) ([9448072](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/94480721124e052426c1f3236e8605c7088df79c))
* implement a What's New prompt ([#539](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/539)) ([f036d40](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/f036d409e60a39fd1d3cb2f0db53a6056615f336))
* persist sidebar toggle state ([#569](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/569)) ([6957431](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/695743104c57951ba1957258c60c843f8fae793f))
* recruitment banner for designer ([#578](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/578)) ([70d4fec](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/70d4fecad61ec3cd3ba839de302fd851e075d073))
* **release:** v2.2.0 ([7a4f40a](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7a4f40a765d704bf32a3b515d695916ed84f9397))
* rework start time to checkboxes ([#553](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/553)) ([ca734dc](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ca734dcd39a433cfd2e930ea04adeba959b32c36))
* sticky calendar header and days ([#568](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/568)) ([fa9f78b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/fa9f78b46e3a2270a44d4cc0691195a7c695cb93))
### Bug Fixes
* ics calendar export dates ([#535](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/535)) ([4a5f67f](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/4a5f67f0fda9f0ef57f821e4b7a55d63f099f579))
* include logo in screenshot, fix screenshots on small/zoomed windows ([#579](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/579)) ([76b6aa7](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/76b6aa7c150299dfcfa4b3dc00ce2de32f90f75c))
* merge course labels across pages ([#541](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/541)) ([6c3139b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/6c3139bf0f324c9a7be826b6c24e8bf142fc53b1))
* **schedule:** truncate long schedule names in popup ([#564](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/564)) ([3bed9cc](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/3bed9cc27febfe795af0766a913c4845e74cc2da))
## [2.1.1](https://github.com/Longhorn-Developers/UT-Registration-Plus/compare/v2.1.0...v2.1.1) (2025-03-03)
### Features
* add isDeveloper ([c6452c4](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/c6452c4f2b174487e6f51ad546ca1c3f8b4dbc1f))
* map page ([#390](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/390)) ([2184774](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/218477404fdeacda7b39cd233e4e1e65995935d4))
### Bug Fixes
* import schedule file upload button ([#515](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/515)) ([766c0bc](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/766c0bc1b4a75f8146a922cb2eca8871032c1dc9))
## [2.1.0](https://github.com/Longhorn-Developers/UT-Registration-Plus/compare/v2.0.2...v2.1.0) (2025-02-20)
### Features
* add 'new search' link to the course catalog page ([#456](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/456)) ([ca5e4c1](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ca5e4c13d31aeb603660972536712ea161c6f870))
* add 404 page ([#426](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/426)) ([46c76b1](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/46c76b1703ea2344c3330c4cfa82560663be1c4c))
* add CacheStore for GitHub stats and use names instead of usernames ([#405](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/405)) ([b732a80](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b732a80eaa6f6cbf5b627ffc31ab321de3a8e8f4))
* add eslint-plugin-tsdoc ([#430](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/430)) ([e987fbb](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e987fbbe8e733de6767d62811c2d4d6eaccf2d24))
* add explanation to grade distribution ([#325](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/325)) ([9ad3239](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9ad32390d13e1d413ca01b1bc45d02c695bc23dd))
* add open calendar button ([#457](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/457)) ([93733e3](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/93733e37214f00543479e77209ca03864776a1a6))
* add spacing system ([#474](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/474)) ([e61ab56](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e61ab565c35a197609d205adcaac9c7ffe0fc6da))
* **build:** add Docker support ([#322](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/322)) ([a5e921f](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/a5e921fd75109a50f17d05c9682e73ba246f3dd1))
* **build:** add vite-build-logger ([#507](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/507)) ([1aa4e8c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/1aa4e8c5fb2d1aea308e4cccea3e2818a9c946ec))
* **build:** refactor gulpfile to use gulp-execa ([#323](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/323)) ([db04bbb](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/db04bbb52e4ab19730dd66f417e68ab013ce2f79))
* export/import functionality (backup/restore/share with friends) + a new input component ([#433](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/433)) ([7dbffc6](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7dbffc6eef346747042f1596da627ad0a2fcae1a))
* injected button - add all courses from MyUT AND passing URL to handler ([#291](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/291)) ([c41467c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/c41467c6176d31f70cd3ecdcf56eeb73696c6c23))
* modify Course Block text style and time and location text ([#409](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/409)) ([0d51cae](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0d51cae4c8b27201b09c0898f4d7a6e7abb3c100))
* **settings:** add option to always open calendar in new tab ([#488](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/488)) ([009de62](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/009de628285ce9c6571e492f8e3f52cdeeed4459))
* **settings:** allow disabling of auto-loading courses ([#489](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/489)) ([b74c698](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b74c698866c1074ce2236ede549c94555667e6a5))
* **ui:** add schedule list icons ([#500](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/500)) ([f0b257a](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/f0b257aa124a8fff0bb31e3396715aecb09948d5))
* **ui:** added shadows to popup buttons and course blocks ([#378](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/378)) ([a20332e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/a20332e53da9bda873fabb8395afe6ff6303799c))
* **ui:** calendar header redesign ([#479](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/479)) ([9c766c2](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9c766c26959673389e372c3a440c1a73d5887b1d))
* **ui:** calendar sidebar redesign ([#464](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/464)) ([843cb5b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/843cb5b4430885527592feee33656dfae50c95c2))
* **ui:** change icons to phosphor-icons [#467](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/467) ([#469](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/469)) ([37bd7e7](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/37bd7e79d9202d55c7d0f566518526b0aed53c68))
* **ui:** change red text when instructor not found ([#483](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/483)) ([52347fd](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/52347fd56dff95190915d9f375dbebe1383e76c8))
* **ui:** color picker final touches ([#491](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/491)) ([c2328e4](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/c2328e461ea0a846f399a22bc525540da2796dcd))
* **ui:** course color picker ([#382](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/382)) ([1f635d2](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/1f635d2515fc403ad7f08fc3a244a17d262e3f7b))
* **ui:** course unique number copy button ([#490](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/490)) ([501f506](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/501f50667725aa1515391869b133908b8383d868))
* **ui:** Modify Calendar Footer design and Unscheduled courses ([#503](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/503)) ([b171f01](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b171f01d01f47c75e7df5e5c8e4e7b15b7397c52))
* **ui:** redesign grade distribution tooltip ([#485](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/485)) ([a61bddf](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/a61bddf0e8a76c89d4963d9e580fb063309bee92))
* **ui:** update button variants following figma ([#482](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/482)) ([0aa469a](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0aa469af81e7912a6b26ee1b80c5920f677b5fbd))
* **ui:** update popup and course blocks ([#506](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/506)) ([ee4c6ce](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ee4c6ce6999ad35821b9be5d657790f2dee017b3))
* **ui:** update theme colors [#466](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/466) ([#473](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/473)) ([0d73b13](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0d73b13b288bf8b18444f26455da24c2f4acedf6))
* update SWE list ([aa29bcf](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/aa29bcf9fe4bad7812336d55d7575a6032aea91c))
* update text styles ([#468](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/468)) ([918f4e4](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/918f4e419cf5fa71bda1112597e9a373daca69ea)), closes [#465](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/465)
* validate login passed to background and implemented into add all injected button ([#443](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/443)) ([cd05e5e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/cd05e5e7fcaa02dab30f230c178f189d8052a7c9))
### Bug Fixes
* 4th attempt for: now able to delete schedule even if active ([#435](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/435)) ([2425679](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/24256798ba7b877dd170d77ce4970b13b8a69a68))
* instructor formatting errors ([#425](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/425)) ([8b92208](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8b922082a79ebdbf50a09f37ecb9dfea1be6e1f3))
* place hours and courses under schedule name ([#388](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/388)) ([7dd9369](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7dd93690d6dbd206cb50442f42ec85d6bbfc1da8))
* transition added ([#381](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/381)) ([598bafe](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/598bafe67f47ad57b3801a425e61f86093ba2be8))
* **ui:** fix longstanding drag-and-drop duplication issue ([#502](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/502)) ([4752f58](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/4752f5860a96e08a1177c0ddf57a0fa269d89072))
* **ui:** reduce left side grade distribution margin/padding ([#427](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/427)) ([91fa78e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/91fa78e2d0532a73e24ecc013d2ba6c0f62c1fcd))
* **ui:** stop import button dropdown from squishing ([#504](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/504)) ([846070e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/846070ebb5e13e0fc0df94666dbce75194100049))
* updated text when time/location not provided ([#289](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/289)) ([ebcc0aa](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ebcc0aa76a89f0d1a9e90cfc50d70f017c9bed42))
## [2.0.2](https://github.com/Longhorn-Developers/UT-Registration-Plus/compare/v2.0.1...v2.0.2) (2024-11-05)
### Features
* add core curriculum chips to injected popup ([#372](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/372)) ([6f1afc5](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/6f1afc5b25441c6a1fbfdf57b3c8b5b74e36f5a0))
* Add linkedin social to calendar ([#368](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/368)) ([b6eccac](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b6eccaca6a2cdba9b57d2f49f064ae8504bbd5cb))
* add more relevant links to the From the Team section ([#380](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/380)) ([643ea13](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/643ea1320798aabb7783d267f5e6fd7c00fc2e3f))
* bold course number in grade distribution chart, change text to ut-black ([#406](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/406)) ([638ee88](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/638ee88c96510a779c157b524903caaeffc9ef19))
* disable/some actions when no instructor ([#319](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/319)) ([839f9c6](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/839f9c6d6afd4a1eae1a0bdf8893ab2e19b9fdff))
* **ui:** changed popup close icon to ut-black ([#394](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/394)) ([0077ae7](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0077ae70d22f24549c4c3b243188d19adbfbac14)), closes [#333F48](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/333F48)
* update senior swe admins ([#326](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/326)) ([b967240](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b967240f8fbb7a790a78f4aa256f0a77a491abb8))
* update useful links ([#367](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/367)) ([cef99c2](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/cef99c2d72d3a2800f8a918d01cb116f8795d0c8))
* use "copy of" for duplicated schedules and place them under the original schedule [#358](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/358) ([#397](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/397)) ([94744e0](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/94744e01b94819fb4f5d64616ea56857b906c2dd))
### Bug Fixes
* added descending sort for commits on contributor section in settings page ([#365](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/365)) ([a715bbd](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/a715bbd933a87742e7bce3a44e8ba1bd419ad5eb)), closes [#363](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/363) [#363](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/363) [#363](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/363)
* change schedule total courses text color to UTRP black ([#369](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/369)) ([b00bf6c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b00bf6c180f1c6c3a61c5ef855e160ddf4af3ea4))
* changed the font-weight of h1-course ([#370](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/370)) ([4f609ae](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/4f609aeec797c1f99f0a57e5aeef7b82756ea4bc)), closes [#347](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/347)
* ensure input elements take full width of parent ([#364](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/364)) ([c2007ef](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/c2007ef090aab3bbfcb8bca1ebc476255d09cb90))
* remove screenshot padding class for png download for [#344](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/344) ([#376](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/376)) ([768ac77](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/768ac776ed4d5ca2113a032a93c2dc7432915aa1)), closes [#334](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/334)
* sentry issues ([#389](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/389)) ([2d0804f](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2d0804f90e5d7a9ff83f7fd5c5acfdc7c1b1cc84))
* typo in settings page ([#386](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/386)) ([d357735](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/d3577358d0d1fb60f2c776ae4b01e255fcf9109e))
* **ui:** add space before/after forward slash in "ASYNC/OTHER" text ([#366](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/366)) ([86792eb](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/86792eb56f04b615f7d52b2f417b88f4cb9a82ec))
* **ui:** duplicate schedule warning ([#295](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/295)) ([7346720](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/73467208947e0116ce8538052ee75dea1d8038f9))
* **ui:** main popup now shows 0 for empty schedule ([#395](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/395)) ([8de88d6](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8de88d6ad7d4c2b5c3aa08e1efc59f7226b40c6b))
* **ui:** multiple instructors are formatted properly, displays last name only, and are capitalized in all course blocks ([#342](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/342)) ([#403](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/403)) ([50e88fa](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/50e88fa015e0290fbe0dab8a19f8fcdbc4dd02b0))
* **ui:** placeholder text for no instructor course [#400](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/400) ([#402](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/402)) ([b3ae91d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b3ae91d8f3cebb89e5e5cea7f1200d28326afb4d))
## [2.0.1](https://github.com/Longhorn-Developers/UT-Registration-Plus/compare/v2.0.0...v2.0.1) (2024-10-17)
### Features
* spring 2024 instructors db ([#317](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/317)) ([79dd29c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/79dd29cfc9e849b09e7d91bd0eed51c1c93b3352))
### Bug Fixes
* add a little error checking to settings ([#315](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/315)) ([e261641](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e261641e5985d8bd5047d8a0be5d1caae844e40f))
* gulp zip ([#314](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/314)) ([05f00b2](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/05f00b23d26b90f564710db4364426e90c8d6831))
* migration loop ([aeff5e0](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/aeff5e09a238503293c3882d97d40270da1e4883))
* show calendar in active window ([#312](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/312)) ([ceba38b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ceba38b1ac74ec9e6630222183bd466a8d12c27d))
## [2.0.0](https://github.com/Longhorn-Developers/UT-Registration-Plus/compare/b4e8c7589e53f1064d70703459cc6d66fae1b04c...v2.0.0) (2024-10-15)
### Features
* abhinavchadaga/course-catalog-popup ([#128](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/128)) ([745f9dd](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/745f9dd6fb96ccc0eace7189b87abf9a38f03828))
* abhinavchadaga/reusable-popup-prompt ([#148](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/148)) ([44af9e1](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/44af9e16e4bf3b92c9a4fa0e779197f4f9ecb237))
* actually sum for duplicate semesters (different uniques) ([#202](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/202)) ([d3f64ec](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/d3f64ec79eb64ebe72ae28991127dbe521823842))
* add button to the rows, use new ConflictsWithWarning component ([bec2649](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/bec2649fc1244bffb5cb03809db62cc0ea477260))
* add buttons with icons in tailwind ([93b65ac](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/93b65ac2edef3fc728305cc51d1a32ecf5073274))
* add cal save buttons (no functionality) ([53e7c7f](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/53e7c7fedaf1f268d2d7d06ff1a5df9e2af2306d))
* add Calendar Component ([e0212d5](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e0212d510928e5e95d3ba75e391c34714f1bb035))
* add Calendar schedules component (clicking on storybook not working) ([d1a336e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/d1a336e903f09b04b89f11ba7ede2f7d26e0ac3c))
* add CalendarHeader and its Storybook, need to resize ([23276e5](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/23276e5c7c907261b1d02e9006d8021d99b43984))
* add check-path-alias custom ESLint rule ([#123](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/123)) ([208103d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/208103d7081abcf5b31bf36335320aaf7d213464))
* add chrome.storage api mocks for storybook use ([#141](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/141)) ([3839bff](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/3839bff29ef6f0ecfad1e975e685df9a64d96c92))
* add CSS for calendarCell div ([6cdcf49](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/6cdcf4930d9868c0ed45820f66102d89a644cfb6))
* add CSS for hourLine div ([0ba6153](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0ba61534cbfc83408cb64eb1145ecacef1ee8f04))
* add CSS for timeLabelContainer div ([56f6456](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/56f6456ce85f77edb9d6fa64ecb82a8388feec41))
* add custom ESLint rule restrict-import-depth ([#110](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/110)) ([8c069b7](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8c069b7ad339ed8db97bb5e3e6e88ab8d332489b))
* add downloadBlob util ([2af351e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2af351efa85264da5abeee27fbd091d4ce637041))
* add empty settings component - waiting on design ([9d0f210](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9d0f2105481cc3d5affdb4bd69d428379ea92de3))
* add ImportantLinks Component ([5dbee6f](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/5dbee6f0c39e620c3b65a5e0156fd59ec8217ca7))
* add List component ([e6b4049](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e6b40494031ca88894b2f918bb18448b70124481))
* add MIMEType ([0c76052](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0c760524781556cf089f1885dc4ff3fd567bfc2b))
* add new db powered by UT_Grade_Parser ([#163](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/163)) ([60d1f48](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/60d1f48bd95132f0517258f017a7644d8aff5101))
* add react-loading-skeleton package ([#244](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/244)) ([b4dd91a](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b4dd91ad2595d9583a60530c2c2ff6d829d2d5e5))
* add skeleton loader for course description + distribution ([#267](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/267)) ([c2cab40](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/c2cab407f3a07c1d3073e936c9d23cb1cecc9cb9))
* add story for CalendarGridCell ([fd91c3b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/fd91c3b12ef5670563e689d190be75ef1f695d1c))
* add Storybook story ([cb3cb5d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/cb3cb5d5fc18a68ca5a825f97b808b535aa1fe29))
* add tailwind version of Button component ([28d93b3](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/28d93b3c25e1cbca3baea992a299d626ca823570))
* add tickmarks to day div ([8b9cb06](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8b9cb065c28b5dd38b7e1681839a81f55691a3c6))
* add time column to Calendar Component ([9d68211](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9d6821127e7ff9bf63cef659932ee7408de4c969))
* add timeAndGrid div ([95e0544](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/95e0544b7301d382439b74038fb1b3e25dfe6d30))
* added flag ;-; ([#195](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/195)) ([9b4d61c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9b4d61c2b0d8806b5d4a10296c1cc1266ac4229f))
* added scrapedAt property ([#149](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/149)) ([8e181b3](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8e181b3010dfe25ea1e4b4ba181cbe9944d6e92e))
* additional changes to [#201](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/201) ([#224](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/224)) ([bc354f3](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/bc354f3798a02e6ebc3c66a8b5eee553c25a19d4))
* aesthetically pleasing squishier course blocks when compressed ([#232](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/232)) ([438c82b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/438c82bfb5db0f570b261d15368a05447939b0fb))
* align day labels and add to grid ([1bb6191](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/1bb6191244f40220a9af66cced4fe8f0c1e546a0))
* alignment on calendar and header ([#109](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/109)) ([07ec5ab](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/07ec5abc3e1b40b801b7c977d21399b31222a4d3))
* async course adding and async/other course block adjustments ([#273](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/273)) ([668c8d0](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/668c8d00756a5e3e3daaade46380967c74eec1ae))
* async text hiding on Calendar's Bottom Bar when there are no async courses ([#152](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/152)) ([0dff122](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0dff12232c29415fa7bc5ac3771393a406ab738d))
* basic CalendarCourseMeeting component laid out - missing Text and Right Icon ([da9e7aa](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/da9e7aac4135afa5184e4949c36a288ef6ab62a7))
* Best Practices ([#102](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/102)) ([5eb7be2](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/5eb7be246cd2a1db27c7ca777d81074ae7bb3b82))
* beta builds ([#187](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/187)) ([8a5e12e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8a5e12ec63539ae7199f0f1561f642cb9cf19302))
* better discord icon ([#205](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/205)) ([a3f5e0f](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/a3f5e0f27ffdfcb4e3ddd47140979aca379f9f42))
* bold red refresh error ([#220](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/220)) ([229a8a2](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/229a8a29e8d04dfbe15de200ceffc53b4f758413))
* bottom bar for the calendar page ([#91](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/91)) ([0f730d6](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0f730d6c50462c9f7d0428ebb379742305212ef6))
* build without errors ([babc925](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/babc925967b01f1064b8d8e067e7bc792dd57b0a))
* calendar components 3rd attempt at merging ([#60](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/60)) ([4faca8c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/4faca8c43befe19c9b05ff4f3afba420e016bb59))
* Calendar Components 3rd Attempt at Merging ([#60](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/60)) ([ab2cd68](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ab2cd688fae616742b39c0637291a65e508e23bd))
* calendar course block component ([#75](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/75)) ([00e0019](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/00e00197efb807d420196f2b030fc4dc71e9cd42))
* calendar course block component ([#75](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/75)) ([a41cb3e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/a41cb3ed8711eff9a2fbbe435e867c073904f452))
* calendar grid and grid cells ([#81](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/81)) ([bfeb239](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/bfeb2398aacf9a1fba892737b6ef0286acbc326f))
* Calendar Grid and Grid Cells ([#81](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/81)) ([dd2f696](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/dd2f696f8de2c0b291e917ef4d4cb2171b76712c))
* calendar header formatting and data displaying ([#160](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/160)) ([5cce1c7](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/5cce1c79fc2b50843426ed290a1b53849375e4eb))
* calendar matchings ([#173](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/173)) ([791a42b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/791a42bcd49478024b6f1a237a2d2a9f6211749e))
* Calendar Schedule component finished, fix: list didn't allow updates when adding a new schedule ([#115](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/115)) ([a99a557](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/a99a55788a0b9791ff048c8bbbaad5bada47c41f))
* calendar-course-cell-color-picker ([#157](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/157)) ([df18491](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/df1849180de2c793c10e3a49d2c862d236456ec2))
* can open tabs, updated injected popup heading. basically done ([35fab34](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/35fab3444582b436f63c7b16a26ebd5989c4bf3e))
* change Chip to tailwind css. Fixed eslint for ConflictsWithWarning ([3568b8e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/3568b8eb5ee9ce3fe17f77f5641c0583bacc17a4))
* check-path-alias autofix ([#124](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/124)) ([265652c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/265652c4200a56b1ae62e6e94e0609fb4604c188))
* chrome extension works ([35f3c72](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/35f3c7225049d760c6061ed827aa796514291e62))
* color palette for calendar ([#118](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/118)) ([471e55d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/471e55dcea1ae439658d00ed41570e2f218f0c3d))
* Conventional Commits ([#103](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/103)) ([fe599df](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/fe599dfe7514ead880596d3b75c8370bde796e09))
* convert all LabelsAndDetails Components to Tailwind ([9e0f9df](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9e0f9df9de1a5c99657ddcef3b2eb101dd825b84))
* course color generation ([#179](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/179)) ([5ed81e4](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/5ed81e4be99a8b7f3c68a3ba70358e4cbe5cc613))
* course colors ([#175](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/175)) ([dc77cc2](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/dc77cc27da7ab521e290a8c9ba810573e677b6b8))
* Course Flag Tooltips ([#178](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/178)) ([ba2bc60](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ba2bc60add2b87ccd4e9894c454d7a8d8382f0dd))
* course-catalog-injected-popup ([#98](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/98)) ([89d03f4](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/89d03f4244d324915cadadaf75a827221525d43f))
* CourseStatus Component implemented ([#83](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/83)) ([58d7df4](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/58d7df499ca9a8dfd4dc3aa47bc9d76837f21bf7))
* CourseStatus Component implemented ([#83](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/83)) ([fa1d737](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/fa1d7374bcafbe19673dc31f33b3f8075e45f37a))
* create empty Popup story ([ad83ba4](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ad83ba4cdc67f86096d0cbc2cb6659aa9be98a0b))
* Create icon helper ([#77](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/77)) ([ccea0f4](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ccea0f4bd1e8d66dc0717d92c9e970040d9fbe9e))
* Create icon helper ([#77](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/77)) ([1b51d65](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/1b51d65c89a4b544f4f2a9c60106e14300f9a3b0))
* Derek vinson/calendar header ([#94](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/94)) ([12d09b5](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/12d09b54cbf840993d17323b96cf274ec24c67ce))
* Derek/disable updating ([#239](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/239)) ([0ab83ef](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0ab83efd47d75fb6c278994c7dc8a6d22b4b6b83))
* Derek/export png ([#95](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/95)) ([58c2b46](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/58c2b4634a9d065ca156d27c4af69a504b7c2d2d))
* DialogProvider component ([#198](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/198)) ([d1b921a](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/d1b921a5b000693d7f3dabaf84d8b9580c361941))
* dividers in calendar bottom bar ([#120](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/120)) ([eba5d9f](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/eba5d9f508576d2648bd2501e5d5aaff32592566))
* **docs:** add extra acknowledgements ([e2cbfa3](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e2cbfa3f48cb0b10a43134cf9784a44b13aa542d))
* drag only on vertical axis ([34a6449](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/34a644952995d4aedd18d11d327bd8589f5b2610))
* early iteration of non-virtual list ([677aa62](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/677aa624d7fb2bbb922aaf8806abe979c3399e4e))
* enable TS strict mode ([#168](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/168)) ([efed1c0](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/efed1c0edbf93987c551952a03c9c4b3c461d819))
* experimental toggle for icons, left off for now ([#237](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/237)) ([f34dd95](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/f34dd95d7765322b6cecb2e817a46e0549d929a5))
* fall 2023 grades ([#226](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/226)) ([863d980](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/863d980b2d1c706b1fc648f1a0de2a31515e339e))
* finally fix grid JSX.Element generation ([e49fc29](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e49fc295ba40a37f9bf59686adbd8b4f523cd9c6))
* finish ScheduleTotalHoursAndCourses ([12f680d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/12f680d7e9aef826281c8f769825408dc6f9f9de))
* fix icons on PopupMain and convert to tailwind ([#108](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/108)) ([87799d8](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/87799d8f02aa5986025982f768639afdb1b0267a))
* fix save as button dividers ([#153](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/153)) ([7986549](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7986549fdd40834a85bedbfd0862cdb21c9ae657))
* grades by professor ([#225](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/225)) ([78d749a](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/78d749a8a96f63c32663b464e5b663f932c28ed0))
* html2canvas -> htmlToImage and fix derick's bugs ([bda0282](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/bda02826b14b96fd65a6f24218950e510c5aa3d8))
* icon added successfully ([3b588c2](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/3b588c20394523ddf90456e1ca58546e5b820c74))
* implement Chip component ([23e881f](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/23e881f14cc80100d8f8deef6a25daaa72d83f07))
* implement flatten course schedule helper function ([e54f488](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e54f488b170d5a9af646c1ac82e8b33579fef61d))
* implemented ConflictsWithWarning ([93f3a30](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/93f3a307b4acce6cc55fc411f1ea2d7576006b00))
* implemented InfoCard ([21b6430](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/21b643000d884442e025534802be6bb1f6ba68e2))
* Initial Splash Text Commit ([#208](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/208)) ([0534f60](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0534f607a51f1dd0905f6f45f08519cba65ea05a))
* limit schedules to 10 ([#272](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/272)) ([290b841](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/290b8415170bca631e5d71b08d88db80b02163f0))
* link to your registered courses ([#228](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/228)) ([f83e012](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/f83e012d62e268d95dce19a30e54e34f3779142b))
* list reordering ([#154](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/154)) ([038ebaa](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/038ebaa2689c14bc9906afb542ef62c21cb13177))
* listed versioning for beta builds ([#192](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/192)) ([0c42979](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0c429794230a91c4fd949715b7eea210ac18fee3))
* lowercase instructor! ([#268](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/268)) ([9ec05ef](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9ec05ef764b2451c05e2d084d92074fb1e984268))
* made List more extensible ([cd34601](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/cd34601379d5cd2b53d967afbc954178834823b9))
* match calendar designs & add functionality ([#176](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/176)) ([8027c3d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8027c3d1bf228053acbad3e232b030c9ddbaca6a))
* migrate styles to TailwindCSS ([7e2f5ea](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7e2f5eaed7d782bc886545f7241e0891d55cfae0))
* migration update showing ([#293](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/293)) ([aede681](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/aede681d4bb5b01723eb9d68527f4e64991adfab))
* missed one chip toggle there ([#245](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/245)) ([5ca24da](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/5ca24dab82509d34cf43af4359940476159d052f))
* newer grades and parameterized queries ([#238](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/238)) ([75ad416](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/75ad4167b6639bbcf58e2dc6dafc80ed4656a899))
* one single exclamation mark did all that ([#235](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/235)) ([be87e41](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/be87e4181430e0df41683be5c9d0a1ce992b2c61))
* open an injected course page on course block click in popup main ([#146](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/146)) ([2709484](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/27094846f70feb8d83c8d464ab0fa8dcd99b3e71))
* pad unique ids to 5 digits ([#170](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/170)) ([b4ad687](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b4ad6870bfc88f68bdd7f87fe1d94c23d0a02b95))
* parallelize initializeDB.ts promises ([9f1dcc6](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9f1dcc667df9857e3d0469fe7112a9f985aad490))
* popout icon for ccip in calendar ([#221](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/221)) ([6812d68](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/6812d685d08902f7b3d9d2e5293350c8170c6f06))
* popup schedule select ([#126](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/126)) ([7f2a589](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7f2a5893d4dd82a0f077dca6dfd28e79f929766f))
* PopupCourseBlock Component ([#79](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/79)) ([9accd17](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9accd17bd418f8c9334e80b0f7e38673092ba208))
* PopupCourseBlock Component ([#79](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/79)) ([f045b40](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/f045b400a56569f7353eb00ecd0d081b68660fc5))
* proper injected styles ([#164](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/164)) ([e919e96](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e919e96c53bc9bec7db3d09693d1ff0684b56e87))
* readme animation ([#281](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/281)) ([da6d86c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/da6d86c785f92f70f52ef0b4cab3dc14e0bd9790))
* refactor all components in common ([e544312](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e5443122b422266a126de497b475020e298b2f1c))
* refactor all components in injected ([0c44849](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0c44849e15333c3a5cbdf8972eb31ada0e830b0a))
* refactor calendar ([28f1924](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/28f192472b7f244253b6a0b5339491b9740880f7))
* Refactor database initialization code ([5e98f45](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/5e98f45210346f0e7bb69af5cf25e336c76416ca))
* release notes ([#283](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/283)) ([bd17e33](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/bd17e3353792df70ca2e33c8b7a32b5fb9acc7d2))
* report issue popup ([#261](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/261)) ([65ff6bf](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/65ff6bfbbfc6b696621628e448865155d0405f7f))
* rerouted directory to syllabus when click on professor name ([#211](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/211)) ([8959e0d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8959e0d9f7fdd82125f391f1ec51aa390ba9450d))
* sam's jokes ([#278](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/278)) ([895cd31](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/895cd31d8eb40e7e99fc0969b543e95bd070f6b7))
* save as PNG functionality ([ad18fbd](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ad18fbd16235be0c75121b527867fac708670300))
* schedule list item action menu ([#230](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/230)) ([15fc369](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/15fc3699cfda3ad56e5a262bd37dca166e2685dd))
* screenshot whole page, hide certain elements, screenshot fixed size ([#180](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/180)) ([7d4c5d7](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7d4c5d7be8b266b5f3caf2135c4f3fecb96d75be))
* settings page ([#260](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/260)) ([7a5c3a2](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7a5c3a2e62c3a726735f9fe921f9e08d4092d0f9))
* show async courses in the bottom bar ([#204](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/204)) ([227de53](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/227de53e8453804f0791f269dae64ec388136390))
* some small changes for colors and font ([#201](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/201)) ([bae1da4](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/bae1da43d3373e12d593682e9fb69e19557b5749))
* splash text additions before v2 release ([#296](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/296)) ([e774f31](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e774f316e3f92c03e79274a55f1f729178c9a14a))
* splash text has arrived! ([#246](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/246)) ([9971435](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9971435716dec11e954dc26c14bf7d1505563d0d))
* Storybook for Vite ([#52](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/52)) ([9cc299c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9cc299ced6132644a5c2375b95a8a16a3482601b))
* swe title updates ([#310](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/310)) ([4629626](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/4629626a31934c491758ddca874e5018d9c22e57))
* switch button ([#229](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/229)) ([abae7a5](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/abae7a5c22ab944262d66ae897298b008a03c5f1))
* temporary removal of waitlist etc ([#236](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/236)) ([d424ccc](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/d424ccce49ba05305b24cb61aeb4ffeada5bab33))
* UnoCSS (TailwindCSS) (Storybook only) ([#61](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/61)) ([85c7f78](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/85c7f7817c58f13f6a4e8bec13a45f6412ad87db))
* UnoCSS (TailwindCSS) (Storybook only) ([#61](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/61)) ([6521a4b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/6521a4b2a90af06e182c779f2fc7cb1a3b1e55c1))
* unplugin-icons ([#62](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/62)) ([2d67b12](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2d67b1218ff852c59901b77909615c5f54794a67))
* unplugin-icons ([#62](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/62)) ([945e09b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/945e09b49e4ffa9bd4b02442f6567bb99831923e))
* update admin titles ([4cf8c3f](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/4cf8c3f9645cd8fda07244413cdc406105b12fec))
* update badge count when schedule changes ([#150](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/150)) ([a5e9e3c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/a5e9e3c2145d61d8cc5788eb50fa19718e6d13bf))
* update Button to v2 design ([863521f](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/863521fb3bb268131bd3f369064ae10a442b4fbc))
* update dialog component to headlessui ([#159](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/159)) ([442be8c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/442be8cbee06ec403467b100d8d5300dd4a7ea72))
* update with TailwindCSS ([f3a8a7d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/f3a8a7db560a6b28f96a2e976c8ed33af97fe77a))
* updated calendar page and recruitment banner links ([#219](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/219)) ([a2303ee](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/a2303ee35f10aba5fa7ff5e307d0092a39f18830))
* updated divider component ([#99](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/99)) ([8ab60c9](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8ab60c9f018143df594e7bfd0d321666289cc28c))
* updated Text component to latest design specification ([#70](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/70)) ([8b8433d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8b8433deaf8fe66f917fd66fb56cb0a748bc6e6e))
* updated Text component to latest design specification ([#70](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/70)) ([bb727f7](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/bb727f70bea5a4c2ff5dba7e9b4428c0c84de7b2))
* updating joke styling and updating jokes array ([#277](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/277)) ([0da27e2](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0da27e2c46e9fc32efb80808715053c1f9f5165a))
* use display: grid for calendarGrid ([b535a6e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b535a6eb32ac1091c8b5309ca3cfb6bab0b62526))
* use downloadBlob util ([#186](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/186)) ([2dfb10e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2dfb10e57b51a08fcde2dc6638a81b5ec9bbc7ab))
* use filter() instead of pop() ([063349d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/063349d96d0ad008fa0dc1f0a8c7a27cf3f108ce))
* use React-icons ([8df9ea5](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8df9ea55a9f0bcb04c90314cb311bba9d1ebf2e3))
* UTRP v2 migration ([#292](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/292)) ([d22237d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/d22237d561ddf6a2f8ed699ca4c11088a8b408e8))
* working PNG and CAL downloads ([#119](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/119)) ([d9ee23c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/d9ee23c5bbe27240a0e2849aae2eae81d7960bb5))
### Bug Fixes
* add margin-top: -10px to p ([18406b0](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/18406b0c94604b1b524de03bf97e78cffe7a5bbf))
* added room number to course popup ([#231](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/231)) ([9eaff24](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9eaff24cbb6d78d7f28521a07c32630a90a96f82))
* align timeBlock div ([4dc8957](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/4dc8957c459d0ee57e40c67fa61194ace832327e))
* async course display size ([#181](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/181)) ([949bbb0](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/949bbb0835bfb55a81f0800850aa084b4ed1bfc4))
* broken close bracket ([b34aacb](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b34aacb06772af6f83d1f7bafe828ba43a10db85))
* broken file ([92462cf](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/92462cf0dffa222d75965885ee0e63181bce9890))
* bugs ([2a01506](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2a0150600f26af5b7394f878e13c4d19611f3f64))
* build ([60ab140](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/60ab140c556ec56eca78b1f4e280dfb6e9dbb538))
* build errors and merge in Casey's branch (driodiwb) ([39947b3](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/39947b3694f42f9d5ad2f21d044585aa3d12c407))
* build errors and restructure Calendar page ([c6a48dd](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/c6a48dd3f6025fe531c18e12b8730683d63f67ed))
* calendar course cell colors ([74be880](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/74be880f9d2dc340ba48416429711fb28915baa2))
* calendar storybook issue ([#125](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/125)) ([0c5bec8](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0c5bec8002022cb4702f3879f43fcd32b9fa6b5a))
* Calendar View/Scaling Issues ([#144](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/144)) ([4c61ebd](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/4c61ebd3fc93240903f1224f9dd3057a23d30046))
* CalendarCourseCell spacing ([13c69ef](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/13c69ef862f0214dfa6c9368fc3463519aa8f2f0))
* change Chromatic action to build current branch, not base branch ([#100](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/100)) ([e73c9fe](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e73c9fe417169e73c395cde1aeb841eee8add579))
* change material icons to material symbols ([#71](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/71)) ([52e34cb](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/52e34cb830ff1f12659703776bd3d9a24815ee00))
* chromatic build ([11303da](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/11303daebcc1e4de340463e6266082dc0920582d))
* chromatic builds on PRs ([#140](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/140)) ([78a6939](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/78a69399292767a1f8eac66e4c86cbcb8aad019d))
* chromatic storybook - CourseCatalogInjectedPopup ([#106](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/106)) ([ced2997](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ced29975b20a2a5beac51ea875627a2b1042e5c2))
* clean up [#173](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/173) ([#174](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/174)) ([afa634f](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/afa634f0853dc16cf313c129434d49bf132388d0))
* cleanup imports ([#112](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/112)) ([b17c3fa](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b17c3fae6d9a8fdb2f6de84dc28d00bc31e7bcc8))
* conflict row bug ([#130](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/130)) ([a8ea3bc](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/a8ea3bc683f88fc33191a8cacf649be83f6758f8))
* ConflictsWithWarning ([1599e48](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/1599e48d75d4877b3515c943120d83b59d084a55))
* correct parsing of noon ([#155](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/155)) ([91f62e1](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/91f62e1943633eaef7dc8d437e6a7397456a9123))
* db with proper insertion order ([8e79d6a](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8e79d6a6a87210e0a30584c0c9ceb60bd3a33665))
* delete storybook timestamp file ([f93a98e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/f93a98e46ae76e9b1474c8143bfc3f5076e8b91f))
* dialog movement ([#227](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/227)) ([bc5d68c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/bc5d68ce18f818c285ef7f5eda03f499365ee2e8))
* disabled [object Object] hover message on dialog popups ([#284](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/284)) ([dcc1d81](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/dcc1d81a74922ba27ad2a6859f978f3f20136178))
* divider usage in HeaderAndActions ([#113](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/113)) ([84e8320](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/84e8320e8fce5961877a5745e89419a722055ed5))
* doesn't autoload on pages that don't have pages to load ([#270](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/270)) ([88eeb62](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/88eeb620aec52d6e4172cc908843339412ade90b))
* don't crash on cultural diversity flag ([#196](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/196)) ([5b1e451](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/5b1e4513e29203a54ed9f4913c227d6c45d2e67a))
* eslint and remove React-beautiful-dnd ([6af805b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/6af805ba3a7b04b7e5705d3d597b5ace686d61e0))
* extra space ([0f43796](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0f43796cd864acd012fc1242cbdf34844df62406))
* Fix popup drag hitbox ([#216](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/216)) ([7a40008](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7a40008c1e3846f09ac4eeadc4a50f810ffc0d90))
* fixed bug where activeSchedule doesn't update correctly ([#158](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/158)) ([a409090](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/a409090b904686b76a5db52af980e81108b97082))
* fixed bug with course cells after 12 PM extending past midnight ([#122](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/122)) ([f22a3cd](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/f22a3cd7c0df138ca6ecd4b4a4efaa7ce845c3dd))
* fixed issues involving course meeting objects not being recognized as course meeting objects ([#132](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/132)) ([3406e9a](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/3406e9a0e2644218fc06cbd0b05046df5339264c))
* Fixed typescript error ([#161](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/161)) ([df7a7c6](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/df7a7c65d695cb5c5a825ac9f5ecc48438735b65))
* grade dist when no instructor ([#269](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/269)) ([6a363ae](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/6a363aeb5ccb1c11e15db317b34c4f04a3c9aafc))
* grid JSX.Element generation ([b691bf3](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b691bf3231d5002a631687f26c7409e311237662))
* icon library resolution ([#74](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/74)) ([bb3b313](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/bb3b313fd272bba12f99270c912e046df5358fed))
* idk why that comment was there ([#177](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/177)) ([c5fc621](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/c5fc6219e1540e1fb889d8bedc7296190103a56b))
* import error ([152bc45](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/152bc4577685605ae95f39d9e670b5449e32e0e9))
* improper list data propagation ([#240](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/240)) ([149fda3](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/149fda3b721dcc3d8ffa6c2398c28e39dcb62aaa))
* improve dialog handling and error management in list items ([#257](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/257)) ([1942508](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/1942508d8d11f51b62806894ae13162b6404753b))
* injection not working from som/elie commit ([#145](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/145)) ([591687e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/591687eee8731b3649a5f8c1357a416eb2992a93))
* list component fixed ([#162](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/162)) ([5714ed1](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/5714ed16d72c5442f58366ac51f40cc32ea406ab))
* made list draggable only by handle ([cbb190b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/cbb190bf4b3ad694c87b650489e1fca5aa6b7826))
* margins on list component ([cc71389](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/cc7138949cf77d1bcf1520633d669e939540575e))
* non-determinstic options page generation ([#137](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/137)) ([d700110](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/d70011016a45f5de62b06839a31c634637024f4a))
* non-virtual dnd ([837fddf](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/837fddf8048350b0b25a58bbd16c1957fbad6edb))
* old icon removed in .tsx ([4d387e8](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/4d387e8063314c7c6d7452b746728e2cf85a1787))
* only show button hover effects when not disabled ([8e3aa7e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/8e3aa7ef3380836fd36a12698b1f6982e110c0f7))
* openTabFromContentScript TS issue ([3a48859](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/3a48859dddc0e85649ff6a949e9afd22c962825d))
* options page ([#131](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/131)) ([dc100b5](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/dc100b5d3ac1db5f1dc011ea2536c286f56fa55b))
* reactivity ([#188](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/188)) ([4f4f34e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/4f4f34e281e8aabcdbf8b06652d05bca3554b11f))
* README.md ([a30fecf](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/a30fecf8ec76ecae03be9bb4d813803b9ffdb490))
* README.md ([b27b21b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b27b21bbfcc8fbdc130c3fa85776479451745b7b))
* refactor AST parsing for custom ESLint rule ([62f0851](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/62f0851406bf82d3d0481fed40462bdd30ffcf1b))
* remote react-window fully (from List component) ([#114](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/114)) ([5f1c023](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/5f1c0231e483bc571ef944bbc0b950ab20d31028))
* remove course name from the syllabi lookup ([#200](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/200)) ([bcb5a8c](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/bcb5a8c469c4b5c1909880ab6789d67d04487ed2))
* remove extra spacing ([#121](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/121)) ([6ba8b68](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/6ba8b68654dc182bd2a084f93b0f4f7d5c132862))
* remove white space after duplicate schedule regex matching ([#286](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/286)) ([d73615e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/d73615e28129ee7d78604c6b295ec572b11be46e))
* rename to course block and fix line height for styling ([b602b0b](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b602b0b895416a26214e934f9650a8ec0a10711e))
* revert "chore: add default story" ([aef8c3d](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/aef8c3d9873c6df79f6a54ab4c669ee1849b5ea5))
* revert "rename to course block and fix line height for styling" ([0273a23](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/0273a239139c0f3c0ad773ed8ab1cd4ad8d22fa3))
* revert CalendarGrid and CalendarGridCell back to SCSS from Tailwind ([56306ab](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/56306ab9440baf5ca1158f95d788de7ba42d73d8))
* revert last commit ([27d945f](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/27d945f57c76a1c2f31fee9f98c324fab6183bb6))
* Schedule Switching Bugs ([#138](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/138)) ([c51e688](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/c51e6881d186e8bef056e483e2bca95585d5eac6))
* support classes with no location ([#242](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/242)) ([3ff06e0](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/3ff06e043b112bc232c9c173e72b2ea99609cf7a))
* theme colors ([2f537b4](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/2f537b4f3e3946241f2e287d9ae075e5a2aa7087))
* type issues by using correct import ([#111](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/111)) ([19fe070](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/19fe070491be9e2d40f12918561f6f6ac5921237))
* **ui:** unhid settings button ([#288](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/288)) ([db1eac3](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/db1eac33a2786a3db87f0e6b3679233a85ab923f))
* undefined color case ([9aa78a0](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/9aa78a02a5d4f68daa062e4892875cf5f568306c))
* unocss theme color namings ([79d7832](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/79d7832d0987b8a7c9650b984f72ffd702682423))
* update alignment ([7eb3113](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/7eb3113adaa0917c0275576c3366c387bfe77440))
* update daysOfWeek with new DAY_MAP keys ([ecdaadb](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ecdaadb83eb21b144d07d573613fd8971f0a5ce2))
* visual overflow bug when editing schedule name ([#251](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/251)) ([e8d2c2e](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/e8d2c2e1429072fcc1173ee770f06b07e9ddda20))
* vitest path alias bug ([ee37897](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/ee37897df4f65cd2d285e2ad628be43aebb21ea1))
### Reverts
* Revert "individual bug fix" ([b4e8c75](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/b4e8c7589e53f1064d70703459cc6d66fae1b04c))
* color palette for calendar ([#118](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues/118)) ([51bbd65](https://github.com/Longhorn-Developers/UT-Registration-Plus/commit/51bbd6590bf284ce54644b014466c8b2c73b8925))

32
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,32 @@
# UT Registration Plus Code of Conduct
Like the technical community as a whole, the UT Registration Plus team and community is made up of a mixture of professionals and volunteers from all over the world, working on every aspect of the mission - including mentorship, teaching, and connecting people.
Diversity is one of our huge strengths, but it can also lead to communication issues and unhappiness. To that end, we have a few ground rules that we ask people to adhere to. This code applies equally to founders, mentors and those seeking help and guidance.
This isnt an exhaustive list of things that you cant do. Rather, take it in the spirit in which its intended - a guide to make it easier to enrich all of us and the technical communities in which we participate.
This code of conduct applies to all spaces managed by the UT Registration Plus project or Longhorn Developers. This includes IRC, the mailing lists, the issue tracker, DSF events, and any other forums created by the project team which the community uses for communication. In addition, violations of this code outside these spaces may affect a person's ability to participate within them.
If you believe someone is violating the code of conduct, we ask that you report it by emailing [contact@longhorns.dev](mailto:contact@longhorns.dev). For more details please see our
- **Be friendly and patient.**
- **Be welcoming.** We strive to be a community that welcomes and supports people of all backgrounds and identities. This includes, but is not limited to members of any race, ethnicity, culture, national origin, colour, immigration status, social and economic class, educational level, sex, sexual orientation, gender identity and expression, age, size, family status, political belief, religion, and mental and physical ability.
- **Be considerate.** Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language.
- **Be respectful.** Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. Its important to remember that a community where people feel uncomfortable or threatened is not a productive one. Members of the UT Registration Plus community should be respectful when dealing with other members as well as with people outside the UT Registration Plus community.
- **Be careful in the words that you choose.** We are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren't acceptable. This includes, but is not limited to:
- Violent threats or language directed against another person.
- Discriminatory jokes and language.
- Posting sexually explicit or violent material.
- Posting (or threatening to post) other people's personally identifying information ("doxing").
- Personal insults, especially those using racist or sexist terms.
- Unwelcome sexual attention.
- Advocating for, or encouraging, any of the above behavior.
- Repeated harassment of others. In general, if someone asks you to stop, then stop.
- **When we disagree, try to understand why.** Disagreements, both social and technical, happen all the time and UT Registration Plus is no exception. It is important that we resolve disagreements and differing views constructively. Remember that were different. The strength of UT Registration Plus comes from its varied community, people from a wide range of backgrounds. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesnt mean that theyre wrong. Dont forget that it is human to err and blaming each other doesnt get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes.
Original text courtesy of the [Speak Up! project](http://web.archive.org/web/20141109123859/http://speakup.io/coc.html).
## Questions?
If you have questions, please see . If that doesn't answer your questions, feel free to [contact us](mailto:contact@longhorns.dev).

89
DOCKER_DEV_SETUP.md Normal file
View File

@@ -0,0 +1,89 @@
# Docker Dev Setup
## Prerequisites
- Docker installed on your machine
- Git (to clone the repository)
## Getting Started
1. Clone the repository:
```
git clone https://github.com/Longhorn-Developers/UT-Registration-Plus.git
cd UT-Registration-Plus
```
2. Build the Docker image:
```
docker build -t ut-registration-plus .
```
## Using Docker for Different Modes
The Docker setup supports three modes of operation: build, zip, and dev. You can choose the mode either by passing it as a command or by setting the `BUILD_MODE` environment variable.
### Build Mode (Default)
This mode builds the extension and places the output in the `dist` folder.
```
docker run -it --rm -v $(pwd)/dist:/extension/dist ut-registration-plus build
```
or
```
docker run -it --rm -v $(pwd)/dist:/extension/dist -e BUILD_MODE=build ut-registration-plus
```
### Zip Mode
This mode builds the extension and creates a zipped package in the `package` folder.
```
docker run -it --rm -v $(pwd)/package:/extension/package ut-registration-plus zip
```
or
```
docker run -it --rm -v $(pwd)/package:/extension/package -e BUILD_MODE=zip ut-registration-plus
```
### Development Mode with Hot Module Replacement (HMR)
This mode runs the extension in development mode with HMR support.
_Note_: This currently doesn't work.
```
docker run -it --rm -v $(pwd)/dist:/extension/dist -v $(pwd)/dist:/extension/dist -p 5173:5173 ut-registration-plus dev
```
or
```
docker run -it --rm -v $(pwd)/dist:/extension/dist -p 5173:5173 -e BUILD_MODE=dev ut-registration-plus
```
## Accessing the Built Extension
- For build mode, the extension files will be in the `dist` directory on your host machine.
- For zip mode, the zipped extension will be in the `package` directory on your host machine.
- For dev mode, the extension will be continuously built in the `dist` directory, and you can load it as an unpacked extension in Chrome.
## Docker Development Workflow
When working on the extension:
1. Run the container in dev mode
2. Make changes to your source code
3. The extension will automatically rebuild thanks to HMR
4. Reload the extension in Chrome to see your changes
## Troubleshooting
- If you encounter permission issues with the output directories, ensure that the directories exist on your host machine and have the correct permissions.
- For any other issues, please check the Docker logs or open an issue in the GitHub repository.

47
Dockerfile Normal file
View File

@@ -0,0 +1,47 @@
# Stage 1: Base image with Node.js and pnpm
FROM node:20.9.0-alpine AS base
# Install pnpm
RUN npm install -g pnpm@latest-10
# Set working directory
WORKDIR /app
# Copy package.json, pnpm-lock.yaml, and .nvmrc
COPY package.json pnpm-lock.yaml .nvmrc ./
# Copy patches directory if it exists
COPY patches ./patches
# Install dependencies, including applying patches
RUN pnpm install --frozen-lockfile
# Copy the rest of the source code
COPY . .
# Stage 2: Final stage
FROM base AS final
# Install zip utility and bash
RUN apk add --no-cache zip bash
# Set working directory
WORKDIR /extension
# Copy all files from base
COPY --from=base /app ./
# Copy the entrypoint script
COPY docker-entrypoint.sh /usr/local/bin/
# Make the entrypoint script executable
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
# Expose port for HMR
EXPOSE 5173
# Set the entrypoint to our new script
ENTRYPOINT ["docker-entrypoint.sh"]
# Set the default command (which can be overridden)
CMD ["build"]

View File

@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
SOFTWARE.

218
README.md
View File

@@ -1,18 +1,218 @@
# UT Registration Plus
## Built Using
![UTRP Social Preview](images/UTRP_Social-Preview_Prod.svg)
- React 18
- TypeScript
- Vite 5
![Chrome Web Store](https://img.shields.io/chrome-web-store/v/hboadpjkoaieogjimneceaahlppnipaa)
![Downloads](https://img.shields.io/chrome-web-store/d/hboadpjkoaieogjimneceaahlppnipaa)
![License](https://img.shields.io/github/license/Longhorn-Developers/UT-Registration-Plus)
**UT Registration Plus (UTRP)** streamlines the process of registering for classes at UT Austin by reducing the chaos of juggling multiple tabs like Rate My Professor, Google Sheets, and the UT Course Schedule. With UTRP, you can simplify class selection and schedule management. We've all been there. 20 tabs of Rate My Professor, Google Spreadsheet, and the UT Course Schedule open and you still don't know what classes to take.
## Demo
![UTRP v2 Demo](images/UTRP-Demo.gif)
## Features
- **Quick Access to Class Info**: For each class in the UT Course Schedule, UTRP provides a "breakdown" popup with direct links to RateMyProfessor, Course Evaluation Surveys (CES), and past syllabi.
- **Prerequisite & Restriction Highlights**: Displays course descriptions with highlighted details on prerequisites, restrictions, and other important info.
- **Grade Distribution Graphs**: View an aggregate and semester-specific graph of grade distributions for each course.
- **Saved Courses List**: Easily add courses to a list and view them in the extension popup. Copy unique numbers with a single click.
- **Conflict Detection**: Automatically highlights and strikes out courses that conflict with your saved courses in the UT Course Catalog.
- **Weekly Schedule View**: Displays your saved courses in a weekly schedule format for easier planning.
- **Multiple Schedule Support**: Create multiple schedules to plan for different registration scenarios.
- **And much more!**
## Toolchain
- React v20.9.0 (LTS)
- TypeScript v5.x
- Vite v5.x
- pnpm v10.x
- UnoCSS
- ESLint
- Prettier
- Storybook
- Figma
- Semantic-Release
- Custom Messaging & Storage Wrappers
## Getting Started
## VSCode Extensions
1. Clone this repo
2. Run `pnpm install` to install and patch all the required dependencies
3. Run `pnpm run dev` to start the development server
4. Run `pnpm build` to build the extension for production
We recommend using the following VSCode extensions to improve your development experience:
- **[ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)**: For identifying and fixing linting issues.
- **[Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)**: For automatic code formatting.
- **[Tailwind CSS IntelliSense](https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss)**: For Tailwind CSS class autocomplete and IntelliSense.
- **[UnoCSS](https://marketplace.visualstudio.com/items?itemName=antfu.unocss)**: For better support with UnoCSS utilities.
## Contributing
Contributions are welcome and encouraged! To get started:
1. **Fork** the repository.
2. **Create a new branch**: `git checkout -b feature/your-feature`.
3. **Make changes** and ensure your code passes linting and formatting checks: `pnpm run lint` and `pnpm run prettier`.
4. **Commit your changes** following the [Conventional Commits](#conventional-commits--branch-naming-convention) specification.
5. **Push** your branch: `git push origin feature/your-feature`.
6. **Open a Pull Request**.
For significant changes, its recommended to open an issue first to discuss the proposed updates.
## Development
### Getting Started
1. Clone this repository: `git clone https://github.com/Longhorn-Developers/UT-Registration-Plus.git`
2. **Node Version**: This project requires the Node.js version specified in `.nvmrc`. Use [nvm](https://github.com/nvm-sh/nvm) to install and manage the correct version:
```bash
nvm install
nvm use
```
_Note: Installing the wrong Node version can lead to errors during setup._
3. Install dependencies using `pnpm` (which manages and patches dependencies):
```bash
pnpm install
```
Once set up, the extension can be built to the `dist/` directory using the following methods:
### Development Builds
- Run the development server:
```bash
pnpm dev
```
> **Note**: Injected content on UT pages may not display correctly in development mode. To develop with accurate styles, use the following command:
>
> ```bash
> NODE_ENV='development' pnpm run dev build --mode development -w
> ```
### Production Builds
- To generate production builds:
```bash
pnpm build
```
<details>
<summary>Beta Builds</summary>
Use `BETA=true pnpm build` to generate a beta build.
</details>
### Docker
This project includes a Dockerfile that allows you to build, zip, or run the extension in development mode using Docker. Refer to [Docker Dev Setup](./DOCKER_DEV_SETUP.md) to get started.
## Loading the Extension Manually
To load the extension manually in Chrome:
1. Open `chrome://extensions`.
2. Enable 'Developer Mode'.
3. Click 'Load unpacked'.
4. Navigate to the `dist/` directory and select it.
## Bug Reporting
If you encounter bugs or issues, please report them in the [Issues](https://github.com/Longhorn-Developers/UT-Registration-Plus/issues) section, including:
- A clear, descriptive title
- Steps to reproduce the issue
- Expected behavior
- Screenshots or logs (if applicable)
We aim to address issues promptly.
## Conventional Commits & Branch Naming Convention
We follow the **Conventional Commits** specification for commit messages. This ensures a consistent commit history and enables automated versioning and changelog generation.
### Commit Messages
Follow this structure for commit messages:
```
<type>(<scope>): <subject>
```
Where:
- **type**: One of the following:
- `feat`: A new feature
- `fix`: A bug fix
- `docs`: Documentation updates
- `style`: Code formatting changes (whitespace, semicolons, etc.)
- `refactor`: Code restructuring (without adding features or fixing bugs)
- `test`: Adding or modifying tests
- `chore`: Maintenance tasks or build process changes
Example:
```
feat(auth): add login functionality
fix(ui): align buttons in navbar
```
### Branch Naming
Branch names should follow the format:
```
<type>/<short-description>
```
Examples:
- `feat/user-login`
- `fix/navbar-layout`
- `docs/update-readme`
## License
This project is licensed under the MIT License. See the [LICENSE](./LICENSE.md) for more details.
## Code of Conduct
We maintain a strict code of conduct. By contributing, you agree to adhere to the rules outlined in [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md).
## Acknowledgements
Special thanks to the developers and contributors behind these amazing tools and libraries:
- React v20.9.0 (LTS)
- TypeScript v5.x
- Vite v5.x
- pnpm v10.x
- UnoCSS
- ESLint
- Prettier
- Storybook
- Figma
- Semantic-Release
- [chrome-extension-toolkit](https://github.com/sghsri/chrome-extension-toolkit)
- [UT_Grade_Parser](https://github.com/doprz/UT_Grade_Parser)
- [eslint-plugin-import-essentials](https://github.com/doprz/eslint-plugin-import-essentials)
- [UT Registration Plus v1.2.2.7](https://github.com/Longhorn-Developers/UT-Registration-Plus/tree/legacy) by @sghsri
- [UT Registration Planner](https://github.com/doprz/UT-Registration-Planner) by @doprz
- [Figma Designs](https://www.figma.com/design/8tsCay2FRqctrdcZ3r9Ahw/UTRP) by @IsaDavRod
- [Longhorn Developers](https://github.com/Longhorn-Developers) - established in 2024
- The UTRP devs, beta testers, and all supporters of the project!
## Activity
![UT-Registration-Plus Activity](https://repobeats.axiom.co/api/embed/47930fa3916ac1b475cd63a05948c449eb5ad502.svg 'UT-Registration-Plus Repobeats analytics image')
## Star History
<a href="https://star-history.com/#Longhorn-Developers/UT-Registration-Plus&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=Longhorn-Developers/UT-Registration-Plus&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=Longhorn-Developers/UT-Registration-Plus&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=Longhorn-Developers/UT-Registration-Plus&type=Date" />
</picture>
</a>

5
chromatic.config.json Normal file
View File

@@ -0,0 +1,5 @@
{
"onlyChanged": true,
"projectId": "Project:65c5172964f36dcf207985bf",
"zip": true
}

122
commitlint.config.ts Normal file
View File

@@ -0,0 +1,122 @@
import { RuleConfigCondition, RuleConfigSeverity, TargetCaseType } from '@commitlint/types';
export default {
parserPreset: 'conventional-changelog-conventionalcommits',
rules: {
'body-leading-blank': [RuleConfigSeverity.Warning, 'always'] as const,
'footer-leading-blank': [RuleConfigSeverity.Warning, 'always'] as const,
'footer-max-line-length': [RuleConfigSeverity.Error, 'always', 100] as const,
'header-max-length': [RuleConfigSeverity.Error, 'always', 100] as const,
'header-trim': [RuleConfigSeverity.Error, 'always'] as const,
'subject-case': [
RuleConfigSeverity.Error,
'never',
['sentence-case', 'start-case', 'pascal-case', 'upper-case'],
] as [RuleConfigSeverity, RuleConfigCondition, TargetCaseType[]],
'subject-empty': [RuleConfigSeverity.Error, 'never'] as const,
'subject-full-stop': [RuleConfigSeverity.Error, 'never', '.'] as const,
'type-case': [RuleConfigSeverity.Error, 'always', 'lower-case'] as const,
'type-empty': [RuleConfigSeverity.Error, 'never'] as const,
'type-enum': [
RuleConfigSeverity.Error,
'always',
['build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', 'test'],
] as [RuleConfigSeverity, RuleConfigCondition, string[]],
},
prompt: {
questions: {
type: {
description: "Select the type of change that you're committing",
enum: {
feat: {
description: 'A new feature',
title: 'Features',
emoji: '✨',
},
fix: {
description: 'A bug fix',
title: 'Bug Fixes',
emoji: '🐛',
},
docs: {
description: 'Documentation only changes',
title: 'Documentation',
emoji: '📚',
},
style: {
description:
'Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)',
title: 'Styles',
emoji: '💎',
},
refactor: {
description: 'A code change that neither fixes a bug nor adds a feature',
title: 'Code Refactoring',
emoji: '📦',
},
perf: {
description: 'A code change that improves performance',
title: 'Performance Improvements',
emoji: '🚀',
},
test: {
description: 'Adding missing tests or correcting existing tests',
title: 'Tests',
emoji: '🚨',
},
build: {
description:
'Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)',
title: 'Builds',
emoji: '🛠',
},
ci: {
description:
'Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)',
title: 'Continuous Integrations',
emoji: '⚙️',
},
chore: {
description: "Other changes that don't modify src or test files",
title: 'Chores',
emoji: '♻️',
},
revert: {
description: 'Reverts a previous commit',
title: 'Reverts',
emoji: '🗑',
},
},
},
scope: {
description: 'What is the scope of this change (e.g. component or file name)',
},
subject: {
description: 'Write a short, imperative tense description of the change',
},
body: {
description: 'Provide a longer description of the change',
},
isBreaking: {
description: 'Are there any breaking changes?',
},
breakingBody: {
description:
'A BREAKING CHANGE commit requires a body. Please enter a longer description of the commit itself',
},
breaking: {
description: 'Describe the breaking changes',
},
isIssueAffected: {
description: 'Does this change affect any open issues?',
},
issuesBody: {
description:
'If issues are closed, the commit requires a body. Please enter a longer description of the commit itself',
},
issues: {
description: 'Add issue references (e.g. "fix #123", "re #123".)',
},
},
},
};

10
default.nix Normal file
View File

@@ -0,0 +1,10 @@
(import (
let
rev = "v1.1.0";
sha256 = "sha256:19d2z6xsvpxm184m41qrpi1bplilwipgnzv9jy17fgw421785q1m";
in
fetchTarball {
inherit sha256;
url = "https://github.com/NixOS/flake-compat/archive/${rev}.tar.gz";
}
) { src = ./.; }).defaultNix

46
docker-entrypoint.sh Normal file
View File

@@ -0,0 +1,46 @@
#!/usr/bin/env bash
set -euo pipefail
# Define supported modes
SUPPORTED_MODES=("build" "zip" "dev")
# Function to display usage information
usage() {
echo "Usage: $0 [build|zip|dev]"
echo " build: Build the extension"
echo " zip: Build and zip the extension"
echo " dev: Run in development mode with HMR"
exit 1
}
# Check if BUILD_MODE is set, otherwise use the first argument
if [ -n "${BUILD_MODE:-}" ]; then
mode="$BUILD_MODE"
elif [ $# -eq 1 ]; then
mode="$1"
else
usage
fi
# Validate the mode
if [[ ! " ${SUPPORTED_MODES[*]} " =~ ${mode} ]]; then
echo "Error: Invalid mode '${mode}'" >&2
usage
fi
# Execute the appropriate command based on the mode
case "$mode" in
build)
echo "Building extension..."
exec pnpm run build
;;
zip)
echo "Building and zipping extension..."
exec pnpm run zip
;;
dev)
echo "Running in development mode with HMR..."
exec pnpm run dev
;;
esac

96
flake.lock generated Normal file
View File

@@ -0,0 +1,96 @@
{
"nodes": {
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1767609335,
"narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "250481aafeb741edfe23d29195671c19b36b6dca",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1767640445,
"narHash": "sha256-UWYqmD7JFBEDBHWYcqE6s6c77pWdcU/i+bwD6XxMb8A=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "9f0c42f8bc7151b8e7e5840fb3bd454ad850d8c5",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1765674936,
"narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "2075416fcb47225d9b68ac469a5c4801a9c4dd85",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1761236834,
"narHash": "sha256-+pthv6hrL5VLW2UqPdISGuLiUZ6SnAXdd2DdUE+fV2Q=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "d5faa84122bc0a1fd5d378492efce4e289f8eac1",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-parts": "flake-parts",
"nixpkgs": "nixpkgs",
"treefmt-nix": "treefmt-nix"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1767468822,
"narHash": "sha256-MpffQxHxmjVKMiQd0Tg2IM/bSjjdQAM+NDcX6yxj7rE=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "d56486eb9493ad9c4777c65932618e9c2d0468fc",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

33
flake.nix Normal file
View File

@@ -0,0 +1,33 @@
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-parts.url = "github:hercules-ci/flake-parts";
treefmt-nix.url = "github:numtide/treefmt-nix";
};
outputs =
inputs@{ flake-parts, ... }:
flake-parts.lib.mkFlake { inherit inputs; } {
systems = inputs.nixpkgs.lib.systems.flakeExposed;
imports = [
./nix/packages.nix
./nix/devShells.nix
./nix/treefmt.nix
];
perSystem =
{ system, ... }:
{
_module.args.pkgs = import inputs.nixpkgs {
inherit system;
overlays = [
(final: prev: {
nodejs = prev.nodejs_20; # v20.19.5
})
];
config = { };
};
};
};
}

97
gulpfile.js Normal file
View File

@@ -0,0 +1,97 @@
import chalk from 'chalk';
import fs from 'fs';
import { dest, series, src } from 'gulp';
import { exec } from 'gulp-execa';
import zip from 'gulp-zip';
import path from 'path';
const DIST_DIR = 'dist';
const PACKAGE_DIR = 'package';
const DATABASE_DIR = path.join(DIST_DIR, 'database');
// Custom log functions
const log = message => console.log(chalk.blue(`[${new Date().toTimeString().split(' ')[0]}]`), chalk.white(message));
const logWarn = message =>
console.warn(
chalk.blue(`[${new Date().toTimeString().split(' ')[0]}]`),
chalk.yellow(' [WARN]'),
chalk.white(message)
);
const logError = message =>
console.error(
chalk.blue(`[${new Date().toTimeString().split(' ')[0]}]`),
chalk.red(' [ERROR]'),
chalk.white(message)
);
// Remove extra database folder
function removeExtraDatabaseDir(cb) {
fs.rmSync(DATABASE_DIR, { recursive: true, force: true });
log('Extra database directory removed.');
cb();
}
// Instrument with Sentry
// Make sure sentry is configured https://docs.sentry.io/platforms/javascript/sourcemaps/uploading/typescript/#2-configure-sentry-cli
async function instrumentWithSentry(cb) {
if (process.env.SENTRY_ENV && process.env.SENTRY_ENV !== 'development') {
await exec(`sentry-cli sourcemaps inject ${DIST_DIR}`);
await exec(`sentry-cli sourcemaps upload ${DIST_DIR}`);
log('Sentry instrumentation completed.');
} else {
logWarn('Skipping uploading/creating Sentry source maps. (development build)');
}
cb();
}
// Zip the dist folder
function zipDist() {
const packageInfo = JSON.parse(fs.readFileSync('package.json', 'utf-8'));
const zipFileName = `${packageInfo.name.replace(/ /g, '-')}-${packageInfo.version}.zip`;
return src(`${DIST_DIR}/**`, {
base: DIST_DIR,
encoding: false, // Disable encoding to handle binary files correctly
})
.pipe(zip(zipFileName))
.pipe(dest(PACKAGE_DIR))
.on('end', () => log(`Zip file created: ${path.join(PACKAGE_DIR, zipFileName)}`));
}
// Temp fix for CSP on Chrome 130
// Manually remove them because there is no option to disable use_dynamic_url on @crxjs/vite-plugin
// Force disable use_dynamic_url in manifest.json
function forceDisableUseDynamicUrl(cb) {
const manifestPath = path.join(DIST_DIR, 'manifest.json');
if (!fs.existsSync(manifestPath)) {
logWarn('manifest.json not found. Skipping modification.');
return cb();
}
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
let modified = false;
manifest.web_accessible_resources.forEach(resource => {
if (resource.use_dynamic_url) {
delete resource.use_dynamic_url;
modified = true;
}
});
if (modified) {
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
log('use_dynamic_url removed from manifest.json');
} else {
log('No use_dynamic_url found in manifest.json. No changes made.');
}
cb();
}
// Main build task
const zipProdBuild = series(removeExtraDatabaseDir, instrumentWithSentry, zipDist);
export { forceDisableUseDynamicUrl, zipProdBuild };

BIN
images/UTRP-Demo.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

30
nix/devShells.nix Normal file
View File

@@ -0,0 +1,30 @@
{
perSystem =
{
pkgs,
...
}:
let
commonPackages = with pkgs; [
nodejs # Defined in overlay
pnpm_10 # v10.18.2
];
additionalPackages = with pkgs; [
bun
nodePackages.conventional-changelog-cli
sentry-cli
];
in
{
devShells.default = pkgs.mkShell {
name = "utrp-dev";
packages = commonPackages;
};
devShells.full = pkgs.mkShell {
name = "utrp-dev-full";
packages = commonPackages ++ additionalPackages;
};
};
}

51
nix/package.nix Normal file
View File

@@ -0,0 +1,51 @@
{
stdenv,
lib,
nodejs,
pnpm_10,
git,
version ? "dev",
gitRev ? "unknown",
gitBranch ? "unknown",
buildScript ? "build",
}:
stdenv.mkDerivation (finalAttrs: {
inherit version;
pname = "ut-registration-plus";
src = ../.;
nativeBuildInputs = [
nodejs
pnpm_10.configHook
git
];
pnpmDeps = pnpm_10.fetchDeps {
inherit (finalAttrs) pname version src;
fetcherVersion = 2;
hash = "sha256-UqHymJWvlTV4glra/6DkxuCxbG5dpPkFcnvq3vuxsJ8=";
};
# Pass git info to the build
VITE_GIT_COMMIT = gitRev;
VITE_GIT_BRANCH = gitBranch;
buildPhase = ''
pnpm run ${buildScript}
'';
installPhase = ''
mkdir -p $out
cp -r dist/* $out/
'';
meta = {
description = "UT Registration Plus";
homepage = "https://github.com/Longhorn-Developers/UT-Registration-Plus";
license = lib.licenses.mit;
maintainers = lib.maintainers.doprz;
platforms = lib.platforms.unix;
};
})

40
nix/packages.nix Normal file
View File

@@ -0,0 +1,40 @@
{ inputs, ... }:
{
perSystem =
{ pkgs, ... }:
let
packageJson = builtins.fromJSON (builtins.readFile ../package.json);
gitRev = inputs.self.shortRev or inputs.self.dirtyShortRev or "dev";
gitBranch = if inputs.self ? ref then inputs.self.ref else "unknown";
baseVersion = packageJson.version;
commonArgs = {
inherit gitRev gitBranch;
};
# Prod variant
ut-registration-plus = pkgs.callPackage ./package.nix (
commonArgs
// {
version = "${baseVersion}+git.${gitRev}";
buildScript = "build";
}
);
# Dev variant
ut-registration-plus-dev = pkgs.callPackage ./package.nix (
commonArgs
// {
version = "${baseVersion}-dev+git.${gitRev}";
buildScript = "build:dev";
}
);
in
{
packages = {
inherit ut-registration-plus ut-registration-plus-dev;
default = ut-registration-plus;
dev = ut-registration-plus-dev;
};
};
}

63
nix/treefmt.nix Normal file
View File

@@ -0,0 +1,63 @@
{ inputs, ... }:
{
imports = [
inputs.treefmt-nix.flakeModule
];
perSystem =
{ pkgs, ... }:
{
treefmt = {
projectRootFile = "flake.nix";
programs.nixfmt.enable = pkgs.lib.meta.availableOn pkgs.stdenv.buildPlatform pkgs.nixfmt-rfc-style.compiler;
programs.nixfmt.package = pkgs.nixfmt-rfc-style;
# NOTE: Make sure the prettier version in package.json and the one used by treefmt are the same for consistent results
programs.prettier.enable = true;
programs.shellcheck.enable = true;
programs.yamlfmt.enable = true;
programs.dockerfmt.enable = true;
settings.formatter.prettier.excludes = [ "pnpm-lock.yaml" ];
settings.formatter.shellcheck.excludes = [ ".envrc" ];
settings.formatter.yamlfmt.excludes = [ "pnpm-lock.yaml" ];
};
checks = {
prettier-version-match =
pkgs.runCommand "check-prettier-version"
{
buildInputs = [ pkgs.jq ];
}
''
# Extract prettier version from package.json
packageJsonVersion=$(jq -r '.devDependencies.prettier // empty' ${../package.json})
if [ -z "$packageJsonVersion" ]; then
echo "Error: prettier not found in package.json devDependencies"
exit 1
fi
# Remove any semver prefix characters (^, ~, etc...)
packageJsonVersion=$(echo "$packageJsonVersion" | sed 's/^[\^~>=<]*//')
# Get prettier version from nixpkgs
nixVersion="${pkgs.nodePackages.prettier.version}"
if [ "$packageJsonVersion" != "$nixVersion" ]; then
echo ""
echo "ERROR: Prettier version mismatch!"
echo " package.json: $packageJsonVersion"
echo " nixpkgs: $nixVersion"
echo ""
echo "Please update one of the following:"
echo " - Update prettier in package.json to match nixpkgs: $nixVersion"
echo " - Override prettier in your flake to match package.json"
exit 1
fi
touch $out
'';
};
};
}

21035
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,101 +1,174 @@
{
"name": "ut-registration-plus",
"displayName": "UT Registration Plus",
"version": "0.0.1",
"description": "The UT Registration Plus extension is a Chrome extension that allows students to easily register for classes at The University of Texas at Austin.",
"version": "2.3.0",
"description": "UT Registration Plus is a Chrome extension that allows students to easily register for classes.",
"private": true,
"homepage": "sriramhariharan.com",
"homepage": "https://github.com/Longhorn-Developers/UT-Registration-Plus",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"build:dev": "tsc && NODE_ENV='development' vite build --mode development",
"build:watch": "NODE_ENV='development' vite build --mode development -w",
"zip": "pnpm build && pnpm gulp zipProdBuild",
"zip:to-publish": "SENTRY_ENV='production' pnpm zip",
"prettier": "prettier src --check",
"prettier:fix": "prettier src --write",
"lint": "eslint src --ext ts,tsx --report-unused-disable-directives",
"lint:fix": "eslint src --ext ts,tsx --report-unused-disable-directives --fix",
"check-types": "tsc --noEmit",
"test": "vitest",
"test:ui": "vitest --ui",
"coverage": "vitest run --coverage",
"preview": "vite preview",
"devtools": "react-devtools",
"generate-changelog": "bun run scripts/generateChangelog.ts",
"preinstall": "npx only-allow pnpm",
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build"
"build-storybook": "storybook build",
"prepare": "husky"
},
"dependencies": {
"@types/sql.js": "^1.4.9",
"@vitejs/plugin-react": "^4.2.1",
"chrome-extension-toolkit": "^0.0.51",
"clsx": "^2.1.0",
"highcharts": "^11.3.0",
"@date-fns/tz": "^1.2.0",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/modifiers": "^9.0.0",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@headlessui/react": "^2.2.0",
"@octokit/rest": "^21.1.1",
"@phosphor-icons/react": "^2.1.7",
"@sentry/react": "^8.55.0",
"@tanstack/react-query": "^5.69.0",
"@tsparticles/engine": "^3.9.1",
"@tsparticles/react": "^3.0.0",
"@tsparticles/slim": "^3.9.1",
"@unocss/vite": "^0.63.6",
"@vitejs/plugin-react": "^4.3.4",
"chrome-extension-toolkit": "^0.0.54",
"clsx": "^2.1.1",
"conventional-changelog": "^6.0.0",
"date-fns": "^4.1.0",
"highcharts": "^11.4.8",
"highcharts-react-official": "^3.2.1",
"react": "^18.2.0",
"react-devtools-core": "^5.0.0",
"react-dom": "^18.2.0",
"sass": "^1.70.0",
"sql.js": "1.10.2",
"uuid": "^9.0.1"
"html-to-image": "^1.11.13",
"husky": "^9.1.7",
"kc-dabr-wasm": "^0.1.2",
"nanoid": "^5.1.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-loading-skeleton": "^3.5.0",
"react-markdown": "^9.1.0",
"react-syntax-highlighter": "^15.6.1",
"remark-gfm": "^4.0.1",
"sass": "^1.85.1",
"simple-git": "^3.27.0",
"sql.js": "1.11.0"
},
"devDependencies": {
"@chromatic-com/storybook": "^2.0.2",
"@commitlint/cli": "^19.7.1",
"@commitlint/config-conventional": "^19.7.1",
"@commitlint/types": "^19.5.0",
"@crxjs/vite-plugin": "2.0.0-beta.21",
"@iconify-json/material-symbols": "^1.1.72",
"@storybook/addon-designs": "^7.0.9",
"@storybook/addon-essentials": "^7.6.12",
"@storybook/addon-links": "^7.6.12",
"@storybook/blocks": "^7.6.12",
"@storybook/react": "^7.6.12",
"@storybook/react-vite": "^7.6.12",
"@storybook/test": "^7.6.12",
"@iconify-json/bi": "^1.2.2",
"@iconify-json/ic": "^1.2.2",
"@iconify-json/iconoir": "^1.2.7",
"@iconify-json/material-symbols": "^1.2.14",
"@iconify-json/ri": "^1.2.5",
"@iconify-json/streamline": "^1.2.2",
"@semantic-release/exec": "^6.0.3",
"@sentry/types": "^8.55.0",
"@storybook/addon-designs": "^8.2.0",
"@storybook/addon-essentials": "^8.6.0",
"@storybook/addon-links": "^8.6.0",
"@storybook/blocks": "^8.6.0",
"@storybook/react": "^8.6.0",
"@storybook/react-vite": "^8.6.0",
"@storybook/test": "^8.6.0",
"@svgr/core": "^8.1.0",
"@svgr/plugin-jsx": "^8.1.0",
"@types/chrome": "^0.0.260",
"@types/node": "^20.11.16",
"@types/chrome": "^0.0.273",
"@types/conventional-changelog": "^3.1.5",
"@types/gulp": "^4.0.17",
"@types/gulp-zip": "^4.0.4",
"@types/node": "^22.13.5",
"@types/prompts": "^2.4.9",
"@types/react": "^18.2.51",
"@types/react-dom": "^18.2.18",
"@types/semver": "^7.5.6",
"@types/uuid": "^9.0.8",
"@typescript-eslint/eslint-plugin": "^6.20.0",
"@typescript-eslint/parser": "^6.20.0",
"@unocss/eslint-config": "^0.58.4",
"@unocss/postcss": "^0.58.4",
"@unocss/preset-uno": "^0.58.4",
"@unocss/preset-web-fonts": "^0.58.4",
"@unocss/reset": "^0.58.5",
"@unocss/transformer-directives": "^0.58.4",
"@unocss/transformer-variant-group": "^0.58.4",
"@vitejs/plugin-react-swc": "^3.6.0",
"chromatic": "^10.9.1",
"cssnano": "^6.0.3",
"cssnano-preset-advanced": "^6.0.3",
"dotenv": "^16.4.1",
"es-module-lexer": "^1.4.1",
"eslint": "^8.56.0",
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"@types/react-syntax-highlighter": "^15.5.13",
"@types/semantic-release": "^20.0.6",
"@types/semver": "^7.5.8",
"@types/sql.js": "^1.4.9",
"@typescript-eslint/eslint-plugin": "^7.18.0",
"@typescript-eslint/parser": "^7.18.0",
"@unocss/eslint-config": "^0.63.6",
"@unocss/postcss": "^0.63.6",
"@unocss/preset-uno": "^0.63.6",
"@unocss/preset-web-fonts": "^0.63.6",
"@unocss/reset": "^0.63.6",
"@unocss/transformer-directives": "^0.63.6",
"@unocss/transformer-variant-group": "^0.63.6",
"@vitejs/plugin-react-swc": "^3.8.0",
"@vitest/coverage-v8": "^2.1.9",
"@vitest/ui": "^2.1.9",
"chalk": "^5.4.1",
"chromatic": "^11.26.0",
"cssnano": "^7.0.6",
"cssnano-preset-advanced": "^7.0.6",
"dotenv": "^16.4.7",
"es-module-lexer": "^1.6.0",
"eslint": "^8.57.1",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-airbnb-typescript": "^17.1.0",
"eslint-config-airbnb-typescript": "^18.0.0",
"eslint-config-prettier": "^9.1.0",
"eslint-import-resolver-typescript": "^3.6.1",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsdoc": "^48.0.4",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-prefer-function-component": "^3.3.0",
"eslint-plugin-react-refresh": "^0.4.5",
"eslint-plugin-storybook": "^0.6.15",
"eslint-import-resolver-typescript": "^3.8.3",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-import-essentials": "^0.2.1",
"eslint-plugin-jsdoc": "^50.6.3",
"eslint-plugin-prettier": "^5.2.3",
"eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react-prefer-function-component": "^3.4.0",
"eslint-plugin-react-refresh": "^0.4.19",
"eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-plugin-storybook": "^0.9.0",
"eslint-plugin-tsdoc": "^0.3.0",
"gulp": "^5.0.0",
"gulp-execa": "^7.0.1",
"gulp-zip": "^6.1.0",
"path": "^0.12.7",
"postcss": "^8.4.33",
"prettier": "^3.2.4",
"postcss": "^8.5.3",
"prettier": "3.6.2",
"react-dev-utils": "^12.0.1",
"react-devtools": "^5.0.0",
"storybook": "^7.6.12",
"typescript": "^5.3.3",
"unocss": "^0.58.4",
"unplugin-icons": "^0.18.3",
"vite": "^5.0.12",
"vite-plugin-inspect": "^0.8.3"
"semantic-release": "^24.2.3",
"storybook": "^8.6.0",
"typescript": "^5.7.3",
"unocss": "^0.63.6",
"unocss-preset-primitives": "0.0.2-beta.1",
"unplugin-icons": "^0.19.3",
"vite": "^5.4.20",
"vite-plugin-inspect": "^0.8.9",
"vitest": "^2.1.9"
},
"engineStrict": true,
"engines": {
"pnpm": "^10"
},
"pnpm": {
"patchedDependencies": {
"@crxjs/vite-plugin@2.0.0-beta.21": "patches/@crxjs__vite-plugin@2.0.0-beta.21.patch"
"@crxjs/vite-plugin@2.0.0-beta.21": "patches/@crxjs__vite-plugin@2.0.0-beta.21.patch",
"@unocss/vite": "patches/@unocss__vite.patch"
},
"overrides": {
"es-module-lexer": "^1.4.1"
}
"es-module-lexer": "^1.5.4"
},
"onlyBuiltDependencies": [
"@tsparticles/engine"
]
},
"volta": {
"node": "20.19.4",
"pnpm": "10.14.0"
}
}

View File

@@ -0,0 +1,50 @@
diff --git a/dist/index.mjs b/dist/index.mjs
index 7210f5fd650a0b7bb36b467fff85feb0d8e4ec63..c8f98bd314daec0b91c514ea9d9fc2b79cea8502 100644
--- a/dist/index.mjs
+++ b/dist/index.mjs
@@ -369,15 +369,15 @@ const VIRTUAL_ENTRY_ALIAS = [
/^(?:virtual:)?uno(?::(.+))?\.css(\?.*)?$/
];
const LAYER_MARK_ALL = "__ALL__";
-const RESOLVED_ID_WITH_QUERY_RE = /[/\\]__uno(_.*?)?\.css(\?.*)?$/;
-const RESOLVED_ID_RE = /[/\\]__uno(?:_(.*?))?\.css$/;
+const RESOLVED_ID_WITH_QUERY_RE = /[/\\]uno(_.*?)?\.css(\?.*)?$/;
+const RESOLVED_ID_RE = /[/\\]uno(?:_(.*?))?\.css$/;
function resolveId(id) {
if (id.match(RESOLVED_ID_WITH_QUERY_RE))
return id;
for (const alias of VIRTUAL_ENTRY_ALIAS) {
const match = id.match(alias);
if (match) {
- return match[1] ? `/__uno_${match[1]}.css` : "/__uno.css";
+ return match[1] ? `/uno_${match[1]}.css` : "/uno.css";
}
}
}
@@ -652,7 +652,7 @@ function GlobalModeBuildPlugin(ctx) {
css = await applyCssTransform(css, fakeCssId, options.dir, this);
const transformHandler = "handler" in cssPost.transform ? cssPost.transform.handler : cssPost.transform;
if (isLegacy) {
- await transformHandler.call({}, css, "/__uno.css");
+ await transformHandler.call({}, css, "/uno.css");
} else {
const hash = getHash(css);
await transformHandler.call({}, getHashPlaceholder(hash), fakeCssId);
@@ -914,7 +914,7 @@ function GlobalModeDevPlugin({ uno, tokens, tasks, flushTasks, affectedModules,
const { hash, css } = await generateCSS(layer);
return {
// add hash to the chunk of CSS that it will send back to client to check if there is new CSS generated
- code: `${css}__uno_hash_${hash}{--:'';}`,
+ code: `${css}uno_hash_${hash}{--:'';}`,
map: { mappings: "" }
};
},
@@ -933,7 +933,7 @@ function GlobalModeDevPlugin({ uno, tokens, tasks, flushTasks, affectedModules,
if (layer && code.includes("import.meta.hot")) {
let hmr = `
try {
- let hash = __vite__css.match(/__uno_hash_(\\w{${HASH_LENGTH}})/)
+ let hash = __vite__css.match(/uno_hash_(\\w{${HASH_LENGTH}})/)
hash = hash && hash[1]
if (!hash)
console.warn('[unocss-hmr]', 'failed to get unocss hash, hmr might not work')

23416
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Beta" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
<defs>
<style>
.cls-1 {
fill: none;
stroke: #fff;
stroke-width: 70.06px;
}
.cls-2 {
fill: #005f86;
}
.cls-2, .cls-3 {
stroke-width: 0px;
}
.cls-3 {
fill: #fff;
}
</style>
</defs>
<rect class="cls-2" width="1024" height="1024"/>
<g>
<circle class="cls-1" cx="512" cy="512" r="362"/>
<rect class="cls-3" x="466.29" y="283.46" width="91.41" height="457.07"/>
<rect class="cls-3" x="283.46" y="466.29" width="457.07" height="91.41"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Development" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
<defs>
<style>
.cls-1 {
fill: none;
stroke: #fff;
stroke-width: 70.06px;
}
.cls-2 {
fill: #bf2178;
}
.cls-2, .cls-3 {
stroke-width: 0px;
}
.cls-3 {
fill: #fff;
}
</style>
</defs>
<rect class="cls-2" x="0" width="1024" height="1024"/>
<g>
<circle class="cls-1" cx="512" cy="512" r="362"/>
<rect class="cls-3" x="466.29" y="283.46" width="91.41" height="457.07"/>
<rect class="cls-3" x="283.46" y="466.29" width="457.07" height="91.41"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 697 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 B

After

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 849 B

After

Width:  |  Height:  |  Size: 729 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Production" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
<defs>
<style>
.cls-1 {
fill: #bf5700;
}
.cls-1, .cls-2 {
stroke-width: 0px;
}
.cls-3 {
fill: none;
stroke: #fff;
stroke-width: 70.06px;
}
.cls-2 {
fill: #fff;
}
</style>
</defs>
<rect class="cls-1" width="1024" height="1024"/>
<g>
<circle class="cls-3" cx="512" cy="512" r="362"/>
<rect class="cls-2" x="466.29" y="283.46" width="91.41" height="457.07"/>
<rect class="cls-2" x="283.46" y="466.29" width="457.07" height="91.41"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 690 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 706 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -218,4 +218,4 @@
"WRT",
"YID",
"YOR"
]
]

View File

@@ -0,0 +1,54 @@
import { exec } from 'child_process';
import { resolve } from 'path';
import { promisify } from 'util';
const execPromise = promisify(exec);
interface Props {
preset:
| 'angular'
| 'atom'
| 'codemirror'
| 'conventionalcommits'
| 'ember'
| 'eslint'
| 'express'
| 'jquery'
| 'jshint';
// The file to write the changelog to
outFile?: string;
// How many releases to be generated from the latest
// If 0, the whole changelog will be regenerated and the outfile will be overwritten
releaseCount?: number;
}
/**
* Generates a changelog using the conventional-changelog command.
*
* @returns A promise that resolves when the changelog is generated.
* @throws If there is an error generating the changelog.
*/
async function generateChangelog({ preset, outFile = 'CHANGELOG.md', releaseCount = 1 }: Props): Promise<void> {
try {
// Run the conventional-changelog command to generate changelog
const { stdout, stderr } = await execPromise(
`conventional-changelog -p ${preset} -i ${outFile} -s -r ${releaseCount}`,
{
// Ensures it runs from the project root
cwd: resolve(process.cwd()),
}
);
// Log output and error if any
console.log(stdout);
if (stderr) {
console.error(stderr);
}
} catch (error) {
console.error('Error generating changelog:', error);
}
}
generateChangelog({ preset: 'conventionalcommits', releaseCount: 0 });

53
scripts/release.ts Normal file
View File

@@ -0,0 +1,53 @@
import prompts from 'prompts';
import { simpleGit } from 'simple-git';
import { getSourceRef } from '../utils/git/getSourceRef';
import { error, info } from '../utils/log';
const git = simpleGit();
const status = await git.status();
if (status.files.length) {
console.log(error('Working directory is not clean, please commit or stash changes before releasing.'));
process.exit(1);
}
const { destinationBranch } = await prompts({
type: 'select',
name: 'destinationBranch',
message: 'What kind of release do you want to create?',
choices: ['preview', 'production'].map(releaseType => ({
title: releaseType,
value: releaseType,
})),
});
const sourceRef = await getSourceRef(destinationBranch);
const { confirm } = await prompts({
type: 'confirm',
name: 'confirm',
message: `Are you sure you want to create a ${destinationBranch} release from ${sourceRef}?`,
});
if (!confirm) {
console.log(error('Aborting release.'));
process.exit(1);
}
// we fetch the latest changes from the remote
await git.fetch();
// we checkout the source ref, pull the latest changes and then checkout the destination branch
console.info(`Checking out and updating ${sourceRef}...`);
await git.checkout(sourceRef);
await git.pull('origin', sourceRef);
console.info(`Checking out and updating ${destinationBranch}...`);
await git.checkout(destinationBranch);
await git.pull('origin', destinationBranch);
// we trigger the release github action by merging the source ref into the destination branch
console.info(`Merging ${sourceRef} into ${destinationBranch}...`);
await git.merge([sourceRef, '--ff-only']);
await git.push('origin', destinationBranch);
console.info(info(`Release to ${destinationBranch} created! Check github for status`));

10
shell.nix Normal file
View File

@@ -0,0 +1,10 @@
(import (
let
rev = "v1.1.0";
sha256 = "sha256:19d2z6xsvpxm184m41qrpi1bplilwipgnzv9jy17fgw421785q1m";
in
fetchTarball {
inherit sha256;
url = "https://github.com/NixOS/flake-compat/archive/${rev}.tar.gz";
}
) { src = ./.; }).shellNix

BIN
src/assets/LD-icon-new.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

BIN
src/assets/LD-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

5075
src/assets/UT-Map.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 347 KiB

119
src/assets/insideJokes.tsx Normal file
View File

@@ -0,0 +1,119 @@
const splashText: string[] = [
"You can't fail classes you're not in, that's for sure.",
'Steer clear of O-Chem, unless you fancy a challenge.',
'Rec Sports fills up fast, even before the sun reaches its peak.',
"Ah, Jendy's! A taste ever so refined.",
'Fine dining at Jester City Limits, eh?',
'The road to Kinsolving is long, but their delicacies makes it worth every step.',
'The squirrels, they have mastered begging for food better than students. Impressive... but worrying.',
"Do you study often? Ha! What am I saying? Of course you don't.",
"Hey, you, you're finally awake. You were trying to skip class right?",
'Mmm... Brutalist architecture...',
'The course syllabus: more than meets the eye',
'Pain is temporary, GPA is forever.',
"You've Yee'd Your Last Haw.",
'lol everything is already waitlisted.',
'Could be worse. Could be A&M.',
"Should you major in Compsci? well, here's a better question. do you wanna have a bad time?",
'A pen and paper is old fashioned, but sometimes old ways are best',
'A heart is like bedrock, destroyable only by cheating',
'You may not rest now, there are Canvas assignments nearby',
'You are filled with DETERMINATION',
'60k+ users!',
'Almost Turing complete',
'#BF5700',
'The waitlist is a lie!',
'BEVO JOCKEY 🗣️🗣️🗣️',
'RIP Domino, you beloved campus feline.',
"The year is 2055 and Welch still isn't finished.",
'Motivation dropping faster than ur GPA',
'No Work Happens On PCL 5th Floor.',
'I may be a sophomore in name, but my credit count screams freshman!',
// 'TeXAs iS BaCK GuYZ',
'mAke iT yOuR tExAS',
'change yOur slogan',
"'Academically Challenged'",
'Does McCombs teach Parseltongue?',
'No Cruce Enfrente Del Bus.',
'Omae Wa Mou Shindeiru...',
"They say each day, another brick disappears from Speedway. No one's sure where to.",
'The GDC will annex the EER one day',
'To hike to Kins or not to hike to Kins...',
"C'mon you Longhorns! You want to study forever?",
'HOW BOUT A NICE CUP OF LIBER TEA',
"Block of Butter? Now, that's a name I haven't heard in a long time...",
'CaN YoU aSk OuT a tA aFtEr tHe SeMeStEr Is oVeR AnD gRaDeS ArE DoNe?',
"The Block of Butter incident of '22",
'Begun, the midterms have.',
'You must construct additional schedules',
'THE WALK SIGN IS ON TO CROSS GUADALUPE AND 21ST',
'Pay attention. Might learn something.',
'Roll for Initiative!',
'The line at the on-campus Starbucks is longer than your course waitlist.',
'The weather changes more often than your class schedule.',
"'studying' often means refreshing Canvas every five minutes to see if the professor posted lecture slides.",
"It's over Bevo! I have the high ground!",
"I'll just skip this lecture and watch the recording later. What's the worst that could happen?",
'I hear the tower bells are ringing, PCL full of students dreaming.',
"I don't like sand",
'The libraries are full of students pretending to study but actually napping with their eyes open.',
"The 'campus loop' refers to both the bus route and the endless cycle of trying to find your way around campus.",
'The squirrels have mastered the art of begging for food better than most students during finals week.',
"'going for a run' often means 'running to get food from food trucks'.",
'We got UTRPv2 before GTA 6',
'Midterm season: Finish the Fight!',
"There's a Bevo on your lawn!",
'Veer was here',
'follow @sghsri!',
'Officially part of the SEC',
'Planner is now acquired by Plus',
'Longhorn Developers is the best UT Student Org',
'The Eiffel Tower is the UT Tower of Paris',
"He's a CS Major, but he showers regularly. 🧢",
'A CS major walks into a bar. The bar is empty because it is a CS major.',
'UT Registration Plus - The only thing that can make registration worse is not having it',
'UT Registration Plus - We make registration slightly less painful. Slightly.',
'UT Registration Plus - Do you really want to figure out which professors will ruin your GPA by yourself?',
"Ayo what's is a memory leak",
"lowkey we never thought we'd get this far, how are 60k of you people using this",
"dang we're really out here making a splash",
"We'd make a joke about A&M, but we're not sure they can read",
"We've only caused one or two outages, we swear!",
'Reality has a slight CNS bias',
'That one time in 2019 we accidentally DDoSed the registration system. (really)',
'Best UT financial aid tip? Marry rich.',
'Bevo Bucks are legal tender',
"'iS iT fInAlS wEeK oR mY fInAl WeEk'",
'Do you have an iPhone charger? Wait... Which one?',
'Deep in the heart of Texas',
'TEXAS!!! FIGHT!!!',
'Launder your AP credits through a community college for free',
'Also try Minecraft!',
'Please register later so the dev team can get the upper divs',
'The outdoor warning siren will test around 11:50 a.m.',
'You may be seeing this page because you used the Back button while browsing a secure web site or application. Alternatively, you may have mistakenly bookmarked the web sign in form instead of the actual web site you wanted to bookmark or used a link created by somebody else who made the same mistake.',
'Flag on the play, procrastinating picking classes, 1 day penalty, still first down',
'Pro-fessionals at Pro-crastinating',
'Built Texas Tough',
'Beware of trucks on Speedway',
'Marked as duplicate',
'If we ever flood, we can use the canoes on Speedway',
'Days since last Jester West fire alarm: 0',
'Remember the Alamo!',
"Figure out next year's housing by October",
'Technoblade never dies!',
// eslint-disable-next-line no-template-curly-in-string
'Why is my ${major} class in the ${unrelatedMajor} build?', // This is on purpose as a joke
'"Will that be cash, card, or id?"',
'How much did PepsiCo pay UT to replace all the coke machines?',
"Do it... take those 8am's",
"I'm polylingual, if you count programming languages",
'Just put the classes in the schedule lil bro',
'The wait is finally over',
"Stop trying to make UTRP happen, it's not going to happen!",
'Befriend the raccoons on campus',
`It's ${new Date().toLocaleString('en-US', { month: 'long', day: 'numeric' })} and OU still sucks`,
'As seen on TV!',
];
export default splashText;

View File

@@ -1,12 +1,23 @@
import { DevStore } from '@shared/storage/DevStore';
import useKC_DABR_WASM from 'kc-dabr-wasm';
import React, { useEffect } from 'react';
import { createRoot } from 'react-dom/client';
const manifest = chrome.runtime.getManifest();
/**
* Handles editing the storage for a specific area.
*
* @param areaName - The name of the storage area.
* @returns A function that accepts changes and sets them in the storage.
*/
const handleEditStorage = (areaName: 'local' | 'sync' | 'session') => (changes: Record<string, unknown>) => {
chrome.storage[areaName].set(changes);
};
interface JSONEditorProps {
data: any;
onChange: (updates: any) => void;
data: unknown;
onChange: ReturnType<typeof handleEditStorage>;
}
function JSONEditor(props: JSONEditorProps) {
@@ -29,6 +40,8 @@ function JSONEditor(props: JSONEditorProps) {
setIsEditing(false);
} catch (e) {
console.error(e);
// eslint-disable-next-line no-alert
alert('Invalid JSON');
}
};
@@ -62,9 +75,10 @@ function JSONEditor(props: JSONEditorProps) {
// ));
function DevDashboard() {
const [localStorage, setLocalStorage] = React.useState<any>({});
const [syncStorage, setSyncStorage] = React.useState<any>({});
const [sessionStorage, setSessionStorage] = React.useState<any>({});
const [localStorage, setLocalStorage] = React.useState<Record<string, unknown>>({});
const [syncStorage, setSyncStorage] = React.useState<Record<string, unknown>>({});
const [sessionStorage, setSessionStorage] = React.useState<Record<string, unknown>>({});
useKC_DABR_WASM();
useEffect(() => {
const onVisibilityChange = () => {
@@ -93,7 +107,8 @@ function DevDashboard() {
// listen for changes to the chrome storage to update the local storage state displayed in the dashboard
useEffect(() => {
const onChanged = (changes: chrome.storage.StorageChange, areaName: chrome.storage.AreaName) => {
let copy = {};
let copy: Record<string, unknown> = {};
if (areaName === 'local') {
copy = { ...localStorage };
} else if (areaName === 'sync') {
@@ -102,8 +117,8 @@ function DevDashboard() {
copy = { ...sessionStorage };
}
Object.keys(changes).forEach(key => {
copy[key] = changes[key].newValue;
Object.keys(changes).forEach((key: string) => {
copy[key] = changes[key as keyof typeof changes].newValue;
});
if (areaName === 'local') {
@@ -124,10 +139,6 @@ function DevDashboard() {
};
}, [localStorage, syncStorage, sessionStorage]);
const handleEditStorage = (areaName: string) => (changes: Record<string, any>) => {
chrome.storage[areaName].set(changes);
};
return (
<div>
<h1>
@@ -145,4 +156,4 @@ function DevDashboard() {
);
}
createRoot(document.getElementById('root')).render(<DevDashboard />);
createRoot(document.getElementById('root')!).render(<DevDashboard />);

View File

@@ -1,24 +0,0 @@
// this is a custom wrapper around react-devtools
// that changes it so that we only send messages to the devtools when the current tab is active;
import { connectToDevTools } from 'react-devtools-core';
// connect to the devtools server
let ws = new WebSocket('ws://localhost:8097');
connectToDevTools({
websocket: ws,
});
// when the tab's visibile state changes, we connect or disconnect from the devtools
const onVisibilityChange = () => {
if (document.visibilityState === 'visible') {
ws = new WebSocket('ws://localhost:8097');
connectToDevTools({
websocket: ws,
});
} else {
ws.close();
}
};
document.addEventListener('visibilitychange', onVisibilityChange);

View File

@@ -1,4 +1,5 @@
import { defineManifest } from '@crxjs/vite-plugin';
import packageJson from '../package.json';
// Convert from Semver (example: 0.1.0-beta6)
@@ -8,24 +9,32 @@ const [major, minor, patch, label = '0'] = packageJson.version
// split into version parts
.split(/[.-]/);
const mode = process.env.NODE_ENV;
const isBeta = !!process.env.BETA;
const mode = isBeta ? 'beta' : process.env.NODE_ENV;
if (isBeta && process.env.NODE_ENV !== 'production') throw new Error('Cannot have beta non-production build');
// eslint-disable-next-line no-nested-ternary
const nameSuffix = isBeta ? ' (beta)' : mode === 'development' ? ' (dev)' : '';
const HOST_PERMISSIONS: string[] = [
'*://*.utdirect.utexas.edu/apps/registrar/course_schedule/*',
'*://*.utdirect.utexas.edu/registration/classlist/*',
'*://*.utexas.collegescheduler.com/*',
'*://*.catalog.utexas.edu/ribbit/',
'*://*.registrar.utexas.edu/schedules/*',
'*://*.login.utexas.edu/login/*',
'https://utexas.bluera.com/*',
'*://my.utexas.edu/student/student/*',
];
const manifest = defineManifest(async () => ({
manifest_version: 3,
name: `${packageJson.displayName ?? packageJson.name}${mode === 'development' ? ' (dev)' : ''}`,
name: `${packageJson.displayName ?? packageJson.name}${nameSuffix}`,
version: `${major}.${minor}.${patch}.${label}`,
description: packageJson.description,
options_page: 'src/pages/options/index.html',
background: { service_worker: 'src/pages/background/background.ts' },
permissions: ['storage', 'unlimitedStorage', 'background'],
permissions: ['storage', 'unlimitedStorage', 'background', 'scripting'],
host_permissions: process.env.MODE === 'development' ? [...HOST_PERMISSIONS, '<all_urls>'] : HOST_PERMISSIONS,
action: {
default_popup: 'src/pages/popup/index.html',
@@ -49,6 +58,9 @@ const manifest = defineManifest(async () => ({
matches: ['*://*/*'],
},
],
content_security_policy: {
extension_pages: "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'",
},
}));
export default manifest;

486
src/pages/404/Page404.tsx Normal file
View File

@@ -0,0 +1,486 @@
// @ts-nocheck
/* eslint-disable */
import React, { useEffect, useRef } from 'react';
/**
* Page404 component
*
* @returns The Page404 component
*/
export default function Page404(): JSX.Element {
const canvasRef = useRef(null);
const ASPECT_RATIO = 848 / 480;
useEffect(() => {
// Credit: Notch
function _0x58e5() {
let _0x33cb15 = [
'putImageData',
'sin',
'getContext',
'random',
'sqrt',
'3498792PzxeQW',
'2JZNlgj',
'1199520qBJBWq',
'8OebCGy',
'156395VBdeaj',
'79193hyrbkc',
'10iqsPJh',
'now',
'data',
'80uLyuyX',
'cos',
'1843331yKjgfa',
'createImageData',
'2266182vPDGCM',
'current',
'49758oxlYFR',
];
_0x58e5 = function () {
return _0x33cb15;
};
return _0x58e5();
}
let _0xdd3699 = _0x9cb4;
(function (_0x5cc1ea, _0x44f991) {
let _0x3b1280 = _0x9cb4;
let _0x500290 = _0x5cc1ea();
while ([]) {
try {
let _0xea56e3 =
(-parseInt(_0x3b1280(0x8b)) / (0x2344 + 0x63 * 0x59 + -0x45ae)) *
(parseInt(_0x3b1280(0x87)) / (0x2ec * -0x3 + -0x9 * 0x3ed + 0x2c1b)) +
(parseInt(_0x3b1280(0x95)) / (0x4 * -0x8b7 + -0x16 * -0x109 + 0x1 * 0xc19)) *
(-parseInt(_0x3b1280(0x8f)) / (0x17 * -0x8c + 0x1 * 0x1f0f + 0x1d * -0xa3)) +
-parseInt(_0x3b1280(0x8a)) / (-0x113 * 0x21 + -0x1 * 0xc20 + 0x2f98) +
-parseInt(_0x3b1280(0x88)) / (-0x125c + 0xd * 0x12d + 0x1 * 0x319) +
parseInt(_0x3b1280(0x91)) / (0x389 * -0x2 + 0x1 * 0xb9c + -0x483) +
(-parseInt(_0x3b1280(0x89)) / (0x4e7 + -0xcf * -0x1 + -0x2d7 * 0x2)) *
(-parseInt(_0x3b1280(0x93)) / (-0x1859 + 0x1366 + 0x4fc)) +
(parseInt(_0x3b1280(0x8c)) / (-0x1 * -0x22b2 + -0x438 * -0x5 + -0x1be * 0x20)) *
(parseInt(_0x3b1280(0x86)) / (0x29 * 0x29 + 0x1d09 * 0x1 + -0x238f));
if (_0xea56e3 === _0x44f991) break;
else _0x500290.push(_0x500290.shift());
} catch (_0x5847bb) {
_0x500290.push(_0x500290.shift());
}
}
})(_0x58e5, 0x3c063 + 0x13c * -0x305 + 0x2e43c);
const _0x5dce41 = canvasRef[_0xdd3699(0x94)];
const _0x16f39e = _0x5dce41[_0xdd3699(0x83)]('2d');
let _0x228047;
const _0x124180 = 0x2 * -0x7f7 + -0x70 * 0x1 + -0x602 * -0x3;
const _0x591e4f = 0xba7 * 0x1 + 0x1ebc + -0x2973;
let _0x39dbea = new Array(
(0x94f + -0x215 * -0x1 + -0xb24) *
(-0x1 * -0x1dda + -0x23e + -0x1b5c) *
(0xb9c + 0x1 * 0x1c57 + -0x27b3 * 0x1)
);
let _0x391e96 = new Array(
(-0x1e8f + -0x1 * -0x20f9 + -0x25a) *
(-0xce6 + 0x2a * 0x86 + -0x906) *
(0x1d57 * -0x1 + -0x1170 + 0x2eca) *
(0x1c2 + -0x11a9 + 0x1 * 0xff7)
);
function _0x3ebd0f() {
let _0x53ab34 = _0xdd3699;
for (
var _0x599786 = 0x1e5b + 0x7a * -0x3a + -0x2b6;
_0x599786 < -0x1 * 0x593 + 0x9 * -0x15 + 0x660;
_0x599786++
) {
let _0x5dd0b8 =
0x1043 +
0x401 +
-0x1345 -
((Math[_0x53ab34(0x84)]() * (-0xb10 + -0x173e + 0x22ae)) |
(0x1 * -0xf5b + -0x83 * -0xd + -0x8b4 * -0x1));
for (
var _0xebe028 = -0x1827 * -0x1 + 0x385 + 0x142 * -0x16;
_0xebe028 < (-0x77c + 0x11d * 0x1b + -0x1683) * (0x1a * 0x162 + 0x13 * -0xc3 + -0x1578);
_0xebe028++
) {
for (
var _0x4bc490 = 0x2c * 0x55 + -0xf1d + -0x3 * -0x2b;
_0x4bc490 < 0x3 * -0x9a5 + -0x1ee8 + 0x5 * 0xbfb;
_0x4bc490++
) {
let _0x36dcfc = -0xd60e5f * 0x1 + -0x3f232d + 0x1ab9dd6;
if (_0x599786 == -0x517 * -0x5 + -0x1b9b + -0x8b * -0x4)
_0x36dcfc = -0xcc5387 * 0x1 + -0xa89ad4 + -0xa6 * -0x303bf;
(_0x599786 != -0x9 * -0x4f + 0x53 * -0x22 + 0x843 ||
((Math[_0x53ab34(0x84)]() * (-0x11de + -0x1 * -0xbf1 + 0x5f0)) |
(0xf60 + -0x704 + -0x85c)) ==
0xb0b * -0x2 + -0x139b + 0x29b1) &&
(_0x5dd0b8 =
0x1 * 0x6d4 +
-0x9 * -0x1f2 +
-0x19 * 0xef -
((Math[_0x53ab34(0x84)]() * (-0x5 * 0x79d + -0x233 * -0xb + 0xe40)) |
(-0x4e4 + -0x165a + 0x1b3e)));
if (
_0x599786 == 0xe17 + 0x2a1 + -0x10b7 &&
_0xebe028 <
(((_0x4bc490 * _0x4bc490 * (-0x25c0 + -0x24 * 0x76 + -0x5 * -0xadf) +
_0x4bc490 * (0x2569 + -0x396 + 0x10c1 * -0x2)) >>
(-0x6d * 0x5 + 0x3b9 * 0x9 + 0x646 * -0x5)) &
(-0x249a + 0xec3 + 0x15da)) +
(-0x56 * 0x29 + -0x11 * -0x219 + -0x15d1)
)
_0x36dcfc = -0x1 * -0x3d6586 + 0x8bbbc5 + -0x5e770b;
else
_0x599786 == 0x9e + 0x29 * -0xa2 + 0x1955 &&
_0xebe028 <
(((_0x4bc490 * _0x4bc490 * (0x647 * -0x5 + -0x2359 + 0x42bf) +
_0x4bc490 * (-0xf * 0xb8 + -0x220c + 0x2d25)) >>
(0x13 * -0xc4 + -0x15fc + -0x3 * -0xc2e)) &
(-0x2483 + 0x13a9 + 0x59f * 0x3)) +
(0xca3 + -0x480 + -0x810) &&
(_0x5dd0b8 =
(_0x5dd0b8 * (-0xf2a * 0x1 + 0x4ab + 0xa81 * 0x1)) /
(-0x1 * 0x1e5d + -0x1f7a + -0x261 * -0x1a));
if (_0x599786 == 0xdad + 0xbe5 + 0xd * -0x1f7) {
_0x36dcfc = 0x30e9f6 * -0x2 + -0x3c841f + 0x105aa3c;
if (
_0x4bc490 > -0x1af + -0x2 * -0xf94 + -0x5 * 0x5e5 &&
_0x4bc490 < 0x1ed5 + 0x3c4 * 0x3 + -0x2a12 &&
((_0xebe028 > 0x164 + -0x1720 + 0x56f * 0x4 &&
_0xebe028 < 0x1514 + -0x127d * 0x1 + -0x288) ||
(_0xebe028 > 0x1b * 0x147 + -0x1415 * -0x1 + 0x1b39 * -0x2 &&
_0xebe028 < 0x2208 + -0x2408 + 0x22f * 0x1))
) {
_0x36dcfc = -0x1a7143 + 0x16bbd0e + -0x94b369;
let _0xf0bb95 = _0x4bc490 - (-0x20 * -0xce + -0x1222 * -0x1 + -0x2bdb);
var _0x436c14 =
(_0xebe028 & (0x1f03 + -0x1506 + -0x3e * 0x29)) -
(-0x1e7 + 0xef9 * 0x2 + -0x28c * 0xb);
if (_0xf0bb95 < -0x10 * 0xe0 + -0x207d + 0x3 * 0xf7f)
_0xf0bb95 = -0x8f * 0x2b + -0xd18 + 0x251e * 0x1 - _0xf0bb95;
if (_0x436c14 < 0x1f64 + -0x18d * -0x3 + -0x240b * 0x1)
_0x436c14 = -0x755 * 0x4 + -0xafb + 0x81 * 0x50 - _0x436c14;
if (_0x436c14 > _0xf0bb95) _0xf0bb95 = _0x436c14;
_0x5dd0b8 =
0x3b5 * 0x5 +
-0x1 * 0x1db7 +
0xbf2 -
((Math.random() * (-0xc45 + 0x257 * -0xb + 0x2622)) |
(-0xf29 * -0x1 + -0x948 + 0x1 * -0x5e1)) +
(_0xf0bb95 % (-0x1 * -0x13e1 + 0xa4e * -0x3 + 0x1c * 0x65)) *
(-0x939 + -0x1d87 + 0x26e0);
} else
((Math[_0x53ab34(0x84)]() * (-0x405 * 0x6 + -0x122a + 0x2a4a)) |
(0x7f7 + -0x1 * 0xc4f + -0x1 * -0x458)) ==
0x1 * -0x26b + -0x131 * 0xd + 0x2 * 0x8f4 &&
(_0x5dd0b8 =
(_0x5dd0b8 *
(0x102c +
-0x2f9 * 0x4 +
-0x3b2 -
(_0x4bc490 & (0x18a7 * -0x1 + 0x236e + 0x563 * -0x2)) *
(0x89 * 0x45 + 0xb38 + -0x2fc1))) /
(-0x1 * 0x156 + -0x4d * 0x65 + 0x201b * 0x1));
}
_0x599786 == -0x2 * -0x1087 + -0x3 * 0xcb3 + 0x9 * 0x90 &&
((_0x36dcfc = -0x100d2 * -0x9f + -0x659425 + 0x7b4bcc),
((_0x4bc490 +
(_0xebe028 >> (-0x12 * -0x205 + 0x1ca + -0x1 * 0x2622)) *
(-0xe67 + -0x1c85 * 0x1 + -0x30 * -0xe5)) %
(0x15c1 * -0x1 + 0x73f + 0xe8a * 0x1) ==
-0x1729 + -0x1 * 0x247 + 0x1970 ||
_0xebe028 % (0x14e9 * -0x1 + 0x21e1 + -0x1 * 0xcf4) ==
0x641 * 0x1 + -0x16fd + 0x4 * 0x42f) &&
(_0x36dcfc = 0x112d086 + -0x442565 + -0x47edf * 0x4));
_0x599786 == 0x6 * -0x2bb + -0x24 + 0x9d * 0x1b &&
(_0x36dcfc = -0x197 * 0x4ae9 + -0x22af5 * 0x1 + 0xb98463);
let _0xba7812 = _0x5dd0b8;
if (_0xebe028 >= -0x4 * -0x52 + 0x25d + -0x385)
_0xba7812 /= -0x1 * -0x497 + 0x1a3f + -0x7b5 * 0x4;
_0x599786 == -0x1d35 * -0x1 + -0x2445 + 0x718 &&
((_0x36dcfc = -0x981b * 0xc4 + -0x6c2f7 * -0x16 + -0x11 * -0x2db19),
((Math.random() * (-0x1 * 0x181a + -0x1700 + 0x2f1c)) | (-0x266 + 0x3 * 0x8b4 + -0x17b6)) ==
0xcc2 + -0xbc6 + -0xe * 0x12 &&
((_0x36dcfc = 0x2589 + -0xd * 0x27f + 0x3e * -0x15),
(_0xba7812 = 0x10ef + -0x68a + -0x966)));
let _0x1206cd =
(((((_0x36dcfc >> (0x2 * 0xfb3 + -0x118a + -0xdcc)) & (-0x8fc + -0x1a19 + 0x1 * 0x2414)) *
_0xba7812) /
(0xa6 * -0x25 + 0x112c + 0x7d1)) <<
(0x140c + -0xac0 + -0x1 * 0x93c)) |
(((((_0x36dcfc >> (-0x11 * -0x3e + 0x157d + -0x1993 * 0x1)) &
(-0x9 * 0x421 + -0x2102 + 0x472a * 0x1)) *
_0xba7812) /
(0x107b * -0x1 + -0x16fc + 0x2876)) <<
(-0x20e8 + -0x5e * -0x53 + 0x276)) |
(((_0x36dcfc & (0x581 * 0x3 + 0x1 * 0x977 + -0x18fb)) * _0xba7812) /
(-0xaa0 + 0x211 + 0x2 * 0x4c7));
_0x391e96[
_0x4bc490 +
_0xebe028 * (0x7 * -0x415 + 0x1b6e * -0x1 + 0x1f * 0x1cf) +
_0x599786 * (0x504 + -0x2075 + -0x97b * -0x3) * (0x25 * -0xa9 + 0x171d + -0x3 * -0x71)
] = _0x1206cd;
}
}
}
for (
var _0x4bc490 = -0x825 * -0x3 + 0x71a + -0x1b * 0x12b;
_0x4bc490 < 0x17f0 + -0x15a3 + -0x20d;
_0x4bc490++
) {
for (
var _0xebe028 = 0x53a + 0x7fe + -0x24 * 0x5e;
_0xebe028 < 0x1 * 0x1445 + 0x6d * 0x2 + -0xd * 0x19b;
_0xebe028++
) {
for (
let _0x2eee05 = 0x69 * 0x39 + -0x202 * 0xb + -0x14b;
_0x2eee05 < 0x97 * 0x27 + -0x261 + -0x1 * 0x1460;
_0x2eee05++
) {
var _0x599786 =
(_0x2eee05 << (-0x1 * -0x235e + 0x121 + -0x2473)) |
(_0xebe028 << (-0x7db + -0x80 * 0x23 + 0x1961)) |
_0x4bc490;
var _0x436c14 =
(_0xebe028 - (0xec6 + 0x6 * 0x199 + -0xbc * 0x21 + 0.5)) *
(0x1fca + 0x7 * 0xf9 + 0x2699 * -0x1 + 0.4);
let _0x198036 =
(_0x2eee05 - (0x1 * 0xecb + -0x24b8 + 0x160d + 0.5)) * (0xc * 0xda + -0x825 + -0x213 + 0.4);
_0x39dbea[_0x599786] =
(Math.random() * (0x1134 + -0x131 * -0x9 + -0x1bdd)) | (0x160c + -0x7 * 0x6b + -0x131f);
if (
Math[_0x53ab34(0x84)]() >
Math[_0x53ab34(0x85)](Math.sqrt(_0x436c14 * _0x436c14 + _0x198036 * _0x198036)) -
(0x15a9 + -0xe8f * -0x2 + 0x32c7 * -0x1 + 0.8)
)
_0x39dbea[_0x599786] = 0x1a62 + -0xaf * -0x1 + 0x1 * -0x1b11;
}
}
}
_0x228047 = _0x16f39e[_0x53ab34(0x92)](_0x124180, _0x591e4f);
for (
var _0x599786 = 0x26b7 + -0x1b66 * 0x1 + -0x1 * 0xb51;
_0x599786 < _0x124180 * _0x591e4f;
_0x599786++
) {
_0x228047[_0x53ab34(0x8e)][
_0x599786 * (-0x4 * -0x4c0 + 0x228a + -0x3586) + (-0x856 + -0x22 * 0x37 + 0x1 * 0xfa7)
] = -0x4e5 + 0x196a + -0x126 * 0x11;
}
setInterval(_0x5629d1, (0x26b5 + 0x1 * 0xf9b + 0x1934 * -0x2) / (0x1 * 0xca1 + -0xbb6 + -0x87));
}
function _0x5629d1() {
let _0x13c635 = _0xdd3699;
(_0x5b7f43(),
_0x16f39e[_0x13c635(0x81)](
_0x228047,
0x9c + -0x1 * 0x23ab + 0x230f * 0x1,
-0x1c26 + 0x7bf + -0x6cd * -0x3
));
}
let _0x93f360 = 0x64 * 0x49 + 0x1e1e + -0x3aa2;
function _0x5b7f43() {
let _0x4626de = _0xdd3699;
let _0x400eca =
Math[_0x4626de(0x82)](
((Date.now() % (-0x1f15 * -0x1 + 0x1 * -0x44b9 + -0x265a * -0x2)) /
(-0x396f + 0x1 * -0x995 + 0x6a14)) *
Math.PI *
(0x2429 + 0x2360 + -0x4787)
) *
(-0x106 * -0x1d + -0x3e * -0xa0 + -0x446e + 0.4) +
Math.PI / (0x1b21 + -0x1 * -0xa9 + 0x379 * -0x8);
let _0xaac757 =
Math[_0x4626de(0x90)](
((Date[_0x4626de(0x8d)]() % (0xd * -0x351 + -0x3994 + 0x13f7 * 0x7)) /
(0x1ceb + -0x9ef * 0x1 + 0x1414)) *
Math.PI *
(0x1420 + 0x12b1 + -0x26cf)
) *
(-0x1 * -0x211a + -0x18ff + -0x81b * 0x1 + 0.4);
let _0x159021 = Math[_0x4626de(0x90)](_0xaac757);
let _0x11f9a2 = Math[_0x4626de(0x82)](_0xaac757);
let _0x1ac9ca = Math[_0x4626de(0x90)](_0x400eca);
let _0x49fc16 = Math[_0x4626de(0x82)](_0x400eca);
let _0x116a45 =
0x1b4f +
-0x1167 +
-0x9c8 +
0.5 +
((Date[_0x4626de(0x8d)]() % (-0x1 * -0xfaa + 0x169 * 0x1f + -0x7 * 0x2e7)) /
(-0x2831 + 0x1 * 0x171 + 0x4dd0)) *
(-0x911 + -0x26e2 + -0x1b * -0x1c9);
let _0x46282c = 0x1 * 0x238 + 0x252d + -0x2745 + 0.5;
let _0x1680c5 = -0x14ad + -0x187 * 0x15 + -0x30 * -0x11a + 0.5;
_0x93f360++;
for (let _0x132623 = -0x174b + 0x19 * -0xb7 + 0x292a; _0x132623 < _0x124180; _0x132623++) {
let _0x1859c2 = (_0x132623 - _0x124180 / (-0x3e5 * 0x8 + -0x1e7b + -0x3da5 * -0x1)) / _0x591e4f;
for (let _0x1a573d = 0x2440 + -0x262f + -0x1ef * -0x1; _0x1a573d < _0x591e4f; _0x1a573d++) {
let _0x58642d = (_0x1a573d - _0x591e4f / (0x14f4 + 0x24b * 0x11 + -0x3bed)) / _0x591e4f;
let _0x3109fa = -0x7ca + 0x5 * -0x503 + 0x349 * 0xa;
let _0x1df399 = _0x3109fa * _0x159021 + _0x58642d * _0x11f9a2;
let _0x8e77ec = _0x58642d * _0x159021 - _0x3109fa * _0x11f9a2;
let _0x5d0446 = _0x1859c2 * _0x1ac9ca + _0x1df399 * _0x49fc16;
let _0x14ed58 = _0x1df399 * _0x1ac9ca - _0x1859c2 * _0x49fc16;
let _0x13f1b0 = 0x1af9 + -0x3 * 0xc1b + 0x34 * 0x2e;
let _0x2062a9 = -0x6c * -0x21 + -0x13bb * 0x1 + 0x43 * 0x1a;
let _0x5c387a = 0x1124 + 0x862 * 0x2 + 0x9b * -0x38;
let _0x267dd3 = -0x986 + 0x5 * 0x1f5 + 0x5 * -0x7;
for (
let _0x3e178a = -0xf01 + 0xd * -0x59 + 0x93 * 0x22;
_0x3e178a < -0x16f6 + -0x204b * 0x1 + -0x36 * -0x106;
_0x3e178a++
) {
let _0x828a0c = _0x5d0446;
if (_0x3e178a == 0x411 * -0x7 + 0x2 * 0x80f + 0x11 * 0xba) _0x828a0c = _0x8e77ec;
if (_0x3e178a == -0x1e6d + -0xdb1 * -0x1 + 0x85f * 0x2) _0x828a0c = _0x14ed58;
let _0x57383c =
(0x18ab + 0x183f + -0x1 * 0x30e9) /
(_0x828a0c < 0x25 * -0xe3 + -0x2424 + 0x44f3 ? -_0x828a0c : _0x828a0c);
let _0x4b089b = _0x5d0446 * _0x57383c;
let _0x5b3085 = _0x8e77ec * _0x57383c;
let _0x1eaaad = _0x14ed58 * _0x57383c;
let _0x2a568a = _0x116a45 - (_0x116a45 | (-0xcdb + 0x1447 + -0x13 * 0x64));
if (_0x3e178a == 0x1 * -0x1048 + -0x7ea + -0x4d7 * -0x5)
_0x2a568a = _0x46282c - (_0x46282c | (-0x1db5 + 0x1 * -0x35 + -0x223 * -0xe));
if (_0x3e178a == 0x107e + 0x2c7 + -0x1343 * 0x1)
_0x2a568a = _0x1680c5 - (_0x1680c5 | (0x234d + -0x2368 + -0x3 * -0x9));
if (_0x828a0c > 0xe00 + 0xc9b * -0x1 + -0x165)
_0x2a568a = 0xb * -0x117 + 0x1 * -0x1e0b + 0x2a09 - _0x2a568a;
let _0x38c463 = _0x57383c * _0x2a568a;
let _0x227002 = _0x116a45 + _0x4b089b * _0x2a568a;
let _0x2aec99 = _0x46282c + _0x5b3085 * _0x2a568a;
let _0x32116b = _0x1680c5 + _0x1eaaad * _0x2a568a;
if (_0x828a0c < 0x180b + 0x19e3 * 0x1 + 0x391 * -0xe) {
if (_0x3e178a == 0x1313 * -0x2 + 0x1 * 0x2605 + -0x1 * -0x21) _0x227002--;
if (_0x3e178a == 0x3d * 0x15 + 0x114d + 0x164d * -0x1) _0x2aec99--;
if (_0x3e178a == -0x1c1 * -0x8 + -0x60c + -0x3fd * 0x2) _0x32116b--;
}
while (_0x38c463 < _0x267dd3) {
let _0x3db6a4 =
_0x39dbea[
((_0x32116b & (-0x3 * 0x1f3 + 0x1ef2 + -0x18da * 0x1)) <<
(-0x8d3 * 0x2 + -0x1f7 * 0x9 + 0x2361)) |
((_0x2aec99 & (-0x1a92 + 0x6b8 + 0x1419)) << (-0xe71 * 0x1 + -0x788 + 0x15ff)) |
(_0x227002 & (0x1897 + 0x2134 + -0x398c))
];
if (_0x3db6a4 > -0x18f6 + 0x513 * 0x2 + 0xed0) {
let _0x546fb5 =
((_0x227002 + _0x32116b) * (-0x861 + -0x16bd + 0x1f2e)) &
(0xd1c + -0x94 * -0x8 + -0x11ad);
let _0x1667c5 =
((_0x2aec99 * (-0x16f5 * -0x1 + -0x47 * -0x2f + 0x2a * -0xdb)) &
(-0x2469 + 0x156a * -0x1 + 0x39e2)) +
(-0x1 * 0x13f8 + 0x6df + -0x1 * -0xd29);
if (_0x3e178a == 0x1 * -0x1a87 + 0x1fdd + -0x555 * 0x1) {
((_0x546fb5 =
(_0x227002 * (-0x10d7 + 0x1 * 0x15ad + -0x2 * 0x263)) &
(-0x25ca * 0x1 + 0x8 * 0x278 + -0x1 * -0x1219)),
(_0x1667c5 =
(_0x32116b * (0x4d3 + 0x1c09 * -0x1 + 0x3 * 0x7c2)) &
(-0xf06 * 0x2 + -0x144f * -0x1 + -0x344 * -0x3)));
if (_0x5b3085 < -0xa * 0xed + -0xd19 + 0x1 * 0x165b)
_0x1667c5 += -0xd48 + 0xf6c + 0xc * -0x2b;
}
let _0x5206c3 =
_0x391e96[
_0x546fb5 +
_0x1667c5 * (0x1c90 + 0x2 * -0x1297 + 0x8ae) +
_0x3db6a4 *
(0x208 * -0x13 + -0x2550 + 0x1 * 0x4ce8) *
(0xbc5 + -0x7b3 * -0x2 + -0x58 * 0x4f)
];
_0x5206c3 > 0x65a * -0x4 + 0xf9a + -0x5 * -0x1f6 &&
((_0x13f1b0 = _0x5206c3),
(_0x5c387a =
0x181c +
0x1449 +
-0x2b66 -
(((_0x38c463 / (-0x15 * -0x59 + -0x3 * -0x3c9 + 0x944 * -0x2)) *
(0x9cd * 0x1 + -0x15ce + 0x100 * 0xd)) |
(-0xc * -0x2a0 + 0x1 * -0x23bf + 0x43f))),
(_0x2062a9 =
((0x7a0 + 0x3f * 0x51 + 0x8 * -0x352) *
(-0xf60 +
0x21e9 +
-0xa * 0x1c1 -
((_0x3e178a + (0x1439 + -0x1049 + -0x1 * 0x3ee)) %
(-0xbd7 + -0x1 * -0x7d5 + 0x405)) *
(0x214 * -0x7 + 0x17 * 0x7 + 0xe1d * 0x1))) /
(-0x2709 + -0x6 * -0x312 + -0x39a * -0x6)),
(_0x267dd3 = _0x38c463));
}
((_0x227002 += _0x4b089b),
(_0x2aec99 += _0x5b3085),
(_0x32116b += _0x1eaaad),
(_0x38c463 += _0x57383c));
}
}
let _0x5cba48 =
(((_0x13f1b0 >> (0x8bb + 0x407 * -0x2 + -0x9d * 0x1)) & (-0xc6 + 0xb43 + -0x97e)) *
_0x2062a9 *
_0x5c387a) /
((-0x1df7 * -0x1 + -0x48b * 0x1 + -0x186d) * (-0x5 * -0x585 + -0x1497 + -0x603));
let _0x48b547 =
(((_0x13f1b0 >> (-0xa42 + -0x760 * 0x2 + 0x5 * 0x502)) &
(0xb31 + 0x1 * -0x538 + 0x31 * -0x1a)) *
_0x2062a9 *
_0x5c387a) /
((-0x1cff * -0x1 + -0xecd + -0xd33) * (-0x1 * 0x4d5 + 0x2440 + -0x2c * 0xb1));
let _0xdf8389 =
((_0x13f1b0 & (-0x247a + -0x4 * -0x9c2 + -0x39 * 0x7)) * _0x2062a9 * _0x5c387a) /
((0x1d5 * 0xa + -0x250a + -0x31 * -0x67) * (-0x7 * 0x25f + -0xae7 + 0x1c7f * 0x1));
((_0x228047[_0x4626de(0x8e)][
(_0x132623 + _0x1a573d * _0x124180) * (0x29 * -0xa9 + -0x94 * -0x2b + -0x239 * -0x1) +
(0x55d * 0x2 + 0xeed * 0x1 + -0xc7 * 0x21)
] = _0x5cba48),
(_0x228047[_0x4626de(0x8e)][
(_0x132623 + _0x1a573d * _0x124180) * (0x9 * -0x205 + -0xfb7 * 0x1 + -0x1c * -0x136) +
(-0x1 * -0x1e79 + 0x10cd + -0x2f45)
] = _0x48b547),
(_0x228047[_0x4626de(0x8e)][
(_0x132623 + _0x1a573d * _0x124180) * (0x1e2a + -0x21df + -0x1 * -0x3b9) +
(0x1e79 + 0x860 * -0x2 + 0x1 * -0xdb7)
] = _0xdf8389));
}
}
}
function _0x9cb4(_0x473675, _0x42315f) {
let _0x1c3f44 = _0x58e5();
return (
(_0x9cb4 = function (_0x2f27e0, _0x487e61) {
_0x2f27e0 -= -0x6c7 * -0x2 + 0x1 * -0x1b75 + -0x4 * -0x39a;
let _0x44ff4c = _0x1c3f44[_0x2f27e0];
return _0x44ff4c;
}),
_0x9cb4(_0x473675, _0x42315f)
);
}
_0x3ebd0f();
console.log('404 page loaded');
}, []);
return (
<div className='relative h-screen w-screen flex items-center justify-center overflow-hidden bg-white'>
{/* Canvas Container */}
<div className='relative h-full w-full'>
<canvas
ref={canvasRef}
className='absolute left-1/2 top-1/2 h-full w-full object-contain -translate-x-1/2 -translate-y-1/2'
style={{
maxWidth: '100vw',
maxHeight: '100vh',
aspectRatio: ASPECT_RATIO,
imageRendering: 'crisp-edges',
}}
/>
</div>
{/* 404 Text Overlay */}
<div className='absolute left-1/2 top-1/2 z-10 -translate-x-1/2 -translate-y-1/2'>
<h1 className='text-8xl text-white font-bold'>404 Page not found</h1>
</div>
</div>
);
}

27
src/pages/404/index.html Normal file
View File

@@ -0,0 +1,27 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<title>404</title>
</head>
<style type="text/css">
body {
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
}
</style>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<script src="./index.tsx" type="module"></script>
</body>
</html>

8
src/pages/404/index.tsx Normal file
View File

@@ -0,0 +1,8 @@
import 'uno.css';
import React from 'react';
import { createRoot } from 'react-dom/client';
import Page404 from './Page404';
createRoot(document.getElementById('root')!).render(<Page404 />);

View File

@@ -1,9 +1,15 @@
import { BACKGROUND_MESSAGES } from '@shared/messages';
import type { BACKGROUND_MESSAGES } from '@shared/messages';
import { UserScheduleStore } from '@shared/storage/UserScheduleStore';
import updateBadgeText from '@shared/util/updateBadgeText';
import { MessageListener } from 'chrome-extension-toolkit';
import onInstall from './events/onInstall';
import onServiceWorkerAlive from './events/onServiceWorkerAlive';
import onUpdate from './events/onUpdate';
import browserActionHandler from './handler/browserActionHandler';
import calendarBackgroundHandler from './handler/calendarBackgroundHandler';
import CESHandler from './handler/CESHandler';
import gitHubStatsHandler from './handler/gitHubStatsHandler';
import tabManagementHandler from './handler/tabManagementHandler';
import userScheduleHandler from './handler/userScheduleHandler';
@@ -26,11 +32,40 @@ chrome.runtime.onInstalled.addListener(details => {
}
});
// migration/login logic
chrome.tabs.onUpdated.addListener(async (tabId, changeInfo) => {
// console.log(changeInfo);
if (changeInfo.url === 'https://utdirect.utexas.edu/apps/registrar/course_schedule/utrp_login/') {
function openPopupAction() {
chrome.tabs.onActivated.removeListener(openPopupAction);
chrome.action.openPopup();
}
chrome.tabs.onActivated.addListener(openPopupAction);
await chrome.tabs.remove(tabId);
}
});
// initialize the message listener that will listen for messages from the content script
const messageListener = new MessageListener<BACKGROUND_MESSAGES>({
...browserActionHandler,
...tabManagementHandler,
...userScheduleHandler,
...CESHandler,
...calendarBackgroundHandler,
...gitHubStatsHandler,
});
messageListener.listen();
UserScheduleStore.listen('schedules', async schedules => {
const index = await UserScheduleStore.get('activeIndex');
const numCourses = schedules.newValue[index]?.courses?.length;
updateBadgeText(numCourses || 0);
});
UserScheduleStore.listen('activeIndex', async ({ newValue }) => {
const schedules = await UserScheduleStore.get('schedules');
const numCourses = schedules[newValue]?.courses?.length;
updateBadgeText(numCourses || 0);
});

View File

@@ -1,4 +1,4 @@
import { openDebugTab } from '../util/openDebugTab';
import { openDebugTab } from '@pages/background/util/openDebugTab';
/**
* Called whenever the background service worker comes alive

View File

@@ -1,4 +1,7 @@
import { ExtensionStore } from '@shared/storage/ExtensionStore';
import { UserScheduleStore } from '@shared/storage/UserScheduleStore';
import createSchedule from '../lib/createSchedule';
/**
* Called when the extension is updated (or when the extension is reloaded in development mode)
@@ -8,4 +11,11 @@ export default async function onUpdate() {
version: chrome.runtime.getManifest().version,
lastUpdate: Date.now(),
});
const schedules = await UserScheduleStore.get('schedules');
// By invariant, there must always be at least one schedule
if (schedules.length === 0) {
createSchedule('Schedule 1');
}
}

View File

@@ -0,0 +1,39 @@
import openNewTab from '@background/util/openNewTab';
import type CESMessage from '@shared/messages/CESMessage';
import type { MessageHandler } from 'chrome-extension-toolkit';
const CESFall2023Url = 'https://utexas.bluera.com/utexas/rpvl.aspx?rid=d3db767b-049f-46c5-9a67-29c21c29c580&regl=en-US';
const CESHandler: MessageHandler<CESMessage> = {
openCESPage({ data, sendResponse }) {
const { instructorFirstName, instructorLastName } = data;
openNewTab(CESFall2023Url).then(tab => {
const instructorFirstAndLastName = [instructorFirstName, instructorLastName];
chrome.scripting.executeScript({
target: { tabId: tab.id },
func: (...instructorFirstAndLastName: string[]) => {
const inputElement = document.getElementById(
'ctl00_ContentPlaceHolder1_ViewList_tbxValue'
) as HTMLInputElement | null;
const [instructorFirstName, instructorLastName] = instructorFirstAndLastName;
if (inputElement) {
inputElement.value = `${instructorFirstName} ${instructorLastName}`;
inputElement.focus();
const enterKeyEvent = new KeyboardEvent('keydown', {
key: 'Enter',
code: 'Enter',
keyCode: 13,
which: 13,
bubbles: true,
});
inputElement.dispatchEvent(enterKeyEvent);
}
},
args: instructorFirstAndLastName,
});
sendResponse(tab);
});
},
};
export default CESHandler;

View File

@@ -1,5 +1,5 @@
import BrowserActionMessages from '@shared/messages/BrowserActionMessages';
import { MessageHandler } from 'chrome-extension-toolkit';
import type BrowserActionMessages from '@shared/messages/BrowserActionMessages';
import type { MessageHandler } from 'chrome-extension-toolkit';
const browserActionHandler: MessageHandler<BrowserActionMessages> = {
disableBrowserAction({ sender, sendResponse }) {

View File

@@ -0,0 +1,51 @@
import type { TabWithId } from '@background/util/openNewTab';
import openNewTab from '@background/util/openNewTab';
import { tabs } from '@shared/messages';
import type { CalendarBackgroundMessages } from '@shared/messages/CalendarMessages';
import { OptionsStore } from '@shared/storage/OptionsStore';
import { CRX_PAGES } from '@shared/types/CRXPages';
import type { MessageHandler } from 'chrome-extension-toolkit';
const getAllTabInfos = async () => {
const openTabs = (await chrome.tabs.query({})).filter((tab): tab is TabWithId => tab.id !== undefined);
const results = await Promise.allSettled(openTabs.map(tab => tabs.getTabInfo(undefined, tab.id)));
type TabInfo = PromiseFulfilledResult<Awaited<ReturnType<typeof tabs.getTabInfo>>>;
return results
.map((result, index) => ({ result, index }))
.filter((el): el is { result: TabInfo; index: number } => el.result.status === 'fulfilled')
.map(({ result, index }) => ({
...result.value,
tab: openTabs[index]!,
}));
};
const calendarBackgroundHandler: MessageHandler<CalendarBackgroundMessages> = {
async switchToCalendarTab({ data, sendResponse }) {
const { uniqueId } = data;
const calendarUrl = chrome.runtime.getURL(CRX_PAGES.CALENDAR);
const allTabs = await getAllTabInfos();
const openCalendarTabInfo = allTabs.find(tab => tab.url?.startsWith(calendarUrl));
if (openCalendarTabInfo !== undefined && !(await OptionsStore.get('alwaysOpenCalendarInNewTab'))) {
const tabid = openCalendarTabInfo.tab.id;
await chrome.tabs.update(tabid, { active: true });
await chrome.windows.update(openCalendarTabInfo.tab.windowId, { focused: true, drawAttention: true });
if (uniqueId !== undefined) await tabs.openCoursePopup({ uniqueId }, tabid);
sendResponse(openCalendarTabInfo.tab);
} else {
const urlParams = new URLSearchParams();
if (uniqueId !== undefined) urlParams.set('uniqueId', uniqueId.toString());
const url = `${calendarUrl}?${urlParams.toString()}`.replace(/\?$/, '');
const tab = await openNewTab(url);
sendResponse(tab);
}
},
};
export default calendarBackgroundHandler;

View File

@@ -0,0 +1,31 @@
import type GitHubStatsMessages from '@shared/messages/GitHubStatsMessages';
import { GitHubStatsService } from '@views/lib/getGitHubStats';
import type { MessageHandler } from 'chrome-extension-toolkit';
const gitHubStatsService = new GitHubStatsService();
/**
* Handler for GitHub stats related messages
*/
const gitHubStatsHandler: MessageHandler<GitHubStatsMessages> = {
async fetchGitHubStats({ data, sendResponse }) {
try {
const includeMergedPRs = data ?? false;
const stats = await gitHubStatsService.fetchGitHubStats({ includeMergedPRs });
sendResponse(stats);
} catch (error) {
console.error('Error fetching GitHub stats in background:', error);
sendResponse({
adminGitHubStats: {},
userGitHubStats: {},
contributors: [],
names: {},
dataFetched: new Date(),
lastUpdated: new Date(),
isCached: false,
});
}
},
};
export default gitHubStatsHandler;

View File

@@ -1,24 +0,0 @@
import HotReloadingMessages from '@shared/messages/HotReloadingMessages';
import { DevStore } from '@shared/storage/DevStore';
import { MessageHandler } from 'chrome-extension-toolkit';
const hotReloadingHandler: MessageHandler<HotReloadingMessages> = {
async reloadExtension({ sendResponse }) {
const [isExtensionReloading, isTabReloading] = await Promise.all([
DevStore.get('isExtensionReloading'),
DevStore.get('isTabReloading'),
]);
if (!isExtensionReloading) return sendResponse();
if (isTabReloading) {
const tabs = await chrome.tabs.query({ active: true, currentWindow: true });
const tabToReload = tabs[0];
await DevStore.set('reloadTabId', tabToReload?.id);
}
chrome.runtime.reload();
},
};
export default hotReloadingHandler;

View File

@@ -1,6 +1,6 @@
import TabManagementMessages from '@shared/messages/TabManagementMessages';
import { MessageHandler } from 'chrome-extension-toolkit';
import openNewTab from '../util/openNewTab';
import openNewTab from '@pages/background/util/openNewTab';
import type TabManagementMessages from '@shared/messages/TabManagementMessages';
import type { MessageHandler } from 'chrome-extension-toolkit';
const tabManagementHandler: MessageHandler<TabManagementMessages> = {
getTabId({ sendResponse, sender }) {

View File

@@ -1,35 +1,52 @@
import { UserScheduleMessages } from '@shared/messages/UserScheduleMessages';
import addCourse from '@pages/background/lib/addCourse';
import clearCourses from '@pages/background/lib/clearCourses';
import createSchedule from '@pages/background/lib/createSchedule';
import deleteSchedule from '@pages/background/lib/deleteSchedule';
import exportSchedule from '@pages/background/lib/exportSchedule';
import removeCourse from '@pages/background/lib/removeCourse';
import renameSchedule from '@pages/background/lib/renameSchedule';
import switchSchedule from '@pages/background/lib/switchSchedule';
import type { UserScheduleMessages } from '@shared/messages/UserScheduleMessages';
import { Course } from '@shared/types/Course';
import { MessageHandler } from 'chrome-extension-toolkit';
import addCourse from '../lib/addCourse';
import clearCourses from '../lib/clearCourses';
import createSchedule from '../lib/createSchedule';
import deleteSchedule from '../lib/deleteSchedule';
import removeCourse from '../lib/removeCourse';
import renameSchedule from '../lib/renameSchedule';
import switchSchedule from '../lib/switchSchedule';
import { validateLoginStatus } from '@shared/util/checkLoginStatus';
import type { MessageHandler } from 'chrome-extension-toolkit';
const userScheduleHandler: MessageHandler<UserScheduleMessages> = {
addCourse({ data, sendResponse }) {
addCourse(data.scheduleName, new Course(data.course)).then(sendResponse);
addCourse(data.scheduleId, new Course(data.course), data.hasColor ?? false).then(sendResponse);
},
removeCourse({ data, sendResponse }) {
removeCourse(data.scheduleName, new Course(data.course)).then(sendResponse);
removeCourse(data.scheduleId, new Course(data.course)).then(sendResponse);
},
clearCourses({ data, sendResponse }) {
clearCourses(data.scheduleName).then(sendResponse);
clearCourses(data.scheduleId).then(sendResponse);
},
switchSchedule({ data, sendResponse }) {
switchSchedule(data.scheduleName).then(sendResponse);
switchSchedule(data.scheduleId).then(sendResponse);
},
createSchedule({ data, sendResponse }) {
createSchedule(data.scheduleName).then(sendResponse);
},
deleteSchedule({ data, sendResponse }) {
deleteSchedule(data.scheduleName).then(sendResponse);
deleteSchedule(data.scheduleId).then(sendResponse);
},
renameSchedule({ data, sendResponse }) {
renameSchedule(data.scheduleName, data.newName).then(sendResponse);
renameSchedule(data.scheduleId, data.newName).then(sendResponse);
},
// proxy so we can add courses
addCourseByURL({ data: { url, method, body, response }, sendResponse }) {
fetch(url, {
method,
body,
})
.then(res => (response === 'json' ? res.json() : res.text()))
.then(sendResponse);
},
validateLoginStatus({ data, sendResponse }) {
validateLoginStatus(data.url).then(sendResponse);
},
exportSchedule({ data, sendResponse }) {
exportSchedule(data.scheduleId).then(sendResponse);
},
};

View File

@@ -1,17 +1,29 @@
import { UserScheduleStore } from '@shared/storage/UserScheduleStore';
import { Course } from '@shared/types/Course';
import type { Course } from '@shared/types/Course';
import { getUnusedColor } from '@shared/util/colors';
/**
* Adds a course to a user's schedule.
*
* @param scheduleId - The id of the schedule to add the course to.
* @param course - The course to add.
* @param hasColor - If the course block already has colors manually set
* @returns A promise that resolves to void.
* @throws An error if the schedule is not found.
*/
export default async function addCourse(scheduleName: string, course: Course): Promise<void> {
export default async function addCourse(scheduleId: string, course: Course, hasColor = false): Promise<void> {
const schedules = await UserScheduleStore.get('schedules');
const activeSchedule = schedules.find(s => s.name === scheduleName);
const activeSchedule = schedules.find(s => s.id === scheduleId);
if (!activeSchedule) {
throw new Error('Schedule not found');
}
activeSchedule.courses.push(course);
if (!hasColor) {
course.colors = getUnusedColor(activeSchedule, course);
}
activeSchedule.courses.push(course);
activeSchedule.updatedAt = Date.now();
await UserScheduleStore.set('schedules', schedules);
console.log(`Course added: ${course.courseName} (ID: ${course.uniqueId})`);
}

View File

@@ -0,0 +1,65 @@
import addCourse from '@pages/background/lib/addCourse';
import { background } from '@shared/messages';
import type { UserSchedule } from '@shared/types/UserSchedule';
import { CourseCatalogScraper } from '@views/lib/CourseCatalogScraper';
import getCourseTableRows from '@views/lib/getCourseTableRows';
import { SiteSupport } from '@views/lib/getSiteSupport';
/**
* Adds a course to the active schedule by fetching course details from a provided URL.
* If no URL is provided, prompts the user to enter one.
* Sriram and Elie made this
*
* @param activeSchedule - The user's active schedule to which the course will be added.
* @param link - The URL from which to fetch the course details. If not provided, a prompt will ask for it.
*
* @returns A promise that resolves when the course has been added or the operation is cancelled.
*
* @throws an error if there is an issue with scraping the course details.
*/
export async function addCourseByURL(activeSchedule: UserSchedule, link?: string): Promise<void> {
// todo: Use a proper modal instead of a prompt
// eslint-disable-next-line no-param-reassign, no-alert
if (!link) link = prompt('Enter course link') || undefined;
// Exit if the user cancels the prompt
if (!link) {
return;
}
try {
let htmlText: string;
try {
htmlText = await background.addCourseByURL({
url: link,
method: 'GET',
response: 'text',
});
} catch (e) {
// eslint-disable-next-line no-alert
alert(`Failed to fetch url '${link}'`);
return;
}
const doc = new DOMParser().parseFromString(htmlText, 'text/html');
const scraper = new CourseCatalogScraper(SiteSupport.COURSE_CATALOG_DETAILS, doc, link);
const tableRows = getCourseTableRows(doc);
const scrapedCourses = scraper.scrape(tableRows, false);
if (scrapedCourses.length !== 1) return;
const description = scraper.getDescription(doc);
const row = scrapedCourses[0]!;
const course = row.course!;
course.description = description;
if (activeSchedule.courses.every(c => c.uniqueId !== course.uniqueId)) {
console.log('Adding course');
await addCourse(activeSchedule.id, course);
} else {
console.log('Course already exists');
}
} catch (error) {
console.error('Error scraping course:', error);
}
}

Some files were not shown because too many files have changed in this diff Show More