Skip to content

feat: APAS Explorer with GPA Integration - #153

Open
xander-hill wants to merge 16 commits into
samyok:mainfrom
xander-hill:feature/apas-explorer
Open

feat: APAS Explorer with GPA Integration#153
xander-hill wants to merge 16 commits into
samyok:mainfrom
xander-hill:feature/apas-explorer

Conversation

@xander-hill

Copy link
Copy Markdown

Overview

This PR introduces the APAS Explorer feature, allowing students to sync their unmet degree requirements directly from their APAS report into Gopher Grades. It provides a bridge between raw audit data and Schedule Builder, complete with integrated GPA data for required courses.

Key Features

  • APAS Sync Engine: A custom parser that extracts actionable, unmet requirements from the APAS iframe.
  • State-Aware UI: A dedicated "Sync" button with a specialized CSS state-machine (Normal, Syncing, Success) to prevent logo visibility issues and provide tactile feedback.
  • GPA Caching: Implemented a batch-fetching and caching layer in background.js to retrieve course GPAs from the umn.lol API without rate-limiting or performance lag.
  • CSS: Unified card system with springy micro-interactions and high-contrast branding for UMN colors.

Testing Performed

  • Verified sync on multiple different APAS reports (CSE, CLA, Carlson, etc).
  • Confirmed course GPA injection works for both "MANDATORY" and "OR" requirement types.
  • Checked for UI regressions on the standard Schedule Builder search pages.

Demo

Apas-Explorer_Demo

@vercel

vercel Bot commented Apr 26, 2026

Copy link
Copy Markdown

@xander-hill is attempting to deploy a commit to the umn social coding Team on Vercel.

A member of the Team first needs to authorize it.

@samyok samyok left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please use yarn instead of npm! don't make your PR diff larger than it should be.

@samyok samyok left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a few concrete review notes beyond the existing yarn/npm lockfile concern. Main blockers I see are the undefined sidebar call and the APAS iframe access path.

Comment thread chrome-extension/sidebar/sidebar.js Outdated
// determine which page we're on and load the appropriate data.
if (courseList) loadCourses(courseList);
if (courseList) {
injectSortTool();

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a runtime blocker: injectSortTool is not defined anywhere in the extension, so Schedule Builder search pages with inline graphs enabled will throw a ReferenceError here before loadCourses(courseList) runs. Either include the implementation/import in this PR or remove this call.

Comment thread chrome-extension/scripts/apas-parser.js Outdated
//actual APAS html parsing logic
run: async () => {
const iframe = document.getElementById('auditReports');
const doc = iframe ? (iframe.contentDocument || iframe.contentWindow.document) : document;

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This access path is brittle for APAS reports loaded in an iframe. The manifest sets all_frames: true, but init() returns immediately inside frames, so the only parser that runs is the top-frame parser. If #auditReports is cross-origin, reading contentDocument/contentWindow.document throws and the sync button stays disabled because the click handler has no try/finally. Parse inside the frame that owns the report DOM, or catch this and surface a failure state.

@@ -0,0 +1,42 @@
{

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This generated node_modules lockfile should not be committed. It also indicates npm was run locally; please remove the npm lockfiles/artifacts and keep dependency changes represented through the existing Yarn workflow only.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants