Skip to content

Sync: dev to main - #449

Merged
aamoghS merged 11 commits into
mainfrom
dev
Oct 1, 2026
Merged

aamoghS merged 11 commits into
mainfrom
dev

Conversation

@github-actions

@github-actions github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Automated PR tracking changes from dev into main.


Note

Medium Risk
Changes affect super-admin invariants, semester billing boundaries, judging queue deletes, and transactional team locks—high-impact areas, but mostly guarded by expanded tests.

Overview
This sync bundles hackathon operations fixes with membership term logic, marketing-site UX, and small portal hardening.

Judging & organiser withdrawal: Organiser pulls now set withdrawnByAdminAt, mark judging rows withdrawn, and delete unscored judgeQueue slots so judges are not routed to dead tables. Teams cannot resubmit after an organiser pull. The judge portal auto-advances when a slot disappears (NOT_FOUND / queue errors). Judge assignment skips already-queued projects and appends with correct order; bulk assign validates maxProjects >= minProjects. isJudge rejects malformed UUIDs with BAD_REQUEST before Postgres.

Admin & concurrency: “Last super admin” protection now covers deactivation and term expiry, counting only non-expired peers. Acceptance wave numbering locks the hackathon row (FOR UPDATE). Team leave/disband lock team rows to avoid races with joins.

Submissions: submitProject adds length/trim limits, silently filters tracks/challenges to what the hackathon offers, and blocks admin-withdrawn projects.

Membership & metrics: currentTerm, semesterEndDate, and metrics term labels use America/New_York boundaries; semester end uses Atlanta midnight plus a 6-hour renewal margin for legacy UTC end dates. Tests updated accordingly.

Hacklytics 2027 site: Interest CTAs point at a Typeform; copy/layout/nav fixes (hash scroll, navbar breakpoint, hero padding, anchor scroll without content-visibility, footer gradient).

Portal misc: Modal focus no longer re-runs on unstable onClose; chunk reload uses a 30s window instead of a one-shot flag.

Reviewed by Cursor Bugbot for commit 5bfe9b3. Bugbot is set up for automated code reviews on this repo. Configure here.

aamoghS and others added 9 commits September 30, 2026 13:50
- Withdrawing a project drops its unscored queue slots, and the judge
  page moves on to the next table when the slot on screen is gone.
- assignToHackathon no longer queues a project twice; isJudge rejects a
  malformed id as 400 instead of a Postgres 500; judge min/max per judge
  must be whole numbers with max >= min.
- The last-super-admin guard also covers deactivation and ending the
  term, and no longer counts expired super admins.
- Terms and semester ends are computed in Eastern time. The last six
  hours of a semester count as the next one, so renewing a membership
  stored on the old UTC boundary still buys a full semester.
- leaveTeam and disbandTeam lock the team row, serialising with joins.
- Chunk-error recovery reloads again after a later deploy; ModalWrapper
  no longer steals focus when its onClose changes; Hacklytics anchors
  drop content-visibility so nav taps land on the section.
Navigation
- The MLH badge sat on the phone menu toggle and on the tablet
  "Notify me". The header's badge clearance was on section-wrap, whose
  unlayered padding beat the Tailwind utilities; it is now reserved at
  every width.
- The full nav only appears from 1024px. At tablet width six links, the
  logo and the button overlapped.
- A page opened at /#section jumps there instead of smooth-scrolling
  from the top, and the header is solid from the first frame.

Sections
- Even vertical rhythm: neighbouring sections stacked 256px of padding.
- Track sprites sit in a fixed cell, so numbers and titles line up.
- Schedule times read "Fri 5:00 PM" rather than "FRI 5:00P".
- Sponsors show who hosts and how to sponsor, not a "your logo" slot.
- Anchors drop content-visibility, so jumps land on the section.

Copy and footer
- "Notify me opens the DS@GT portal. This site has no form." appeared
  four times; the hero caption keeps it, the rest read as prose.
- The footer fades in from the sections' translucent background instead
  of starting on a hard edge, stacks below 1024px, and uses one link
  style.
Every Notify me button, the FAQ link and the JSON-LD offer read
INTEREST_URL, which now points at the Typeform. The portal flow is kept
as PORTAL_INTEREST_URL to switch back to once registration opens there.
The hint and FAQ no longer mention the portal.
The garden and its soil are 136px tall (168px from md) and the hero's
bottom padding was 80px (128px), so on short screens the countdown
labels ran under the flowers.
- hackathon_projects gets withdrawn_by_admin_at (additive). An organiser
  pulling a project before judging left no judging row, so the team
  could resubmit it straight back into the gallery; submitProject now
  refuses on the column too.
- submitProject bounds name, description and list sizes, and keeps only
  tracks and challenges the hackathon offers. Unknown values are dropped
  rather than refused: the form cannot untick a track removed since.
- acceptWave locks the hackathon row, so two concurrent waves get
  different numbers instead of both claiming max + 1.
- The metrics term label reads Eastern time, matching currentTerm.
The caption was stacked under Notify me alone, so that column was taller
than Explore and centring the row pushed Explore halfway down. Both
buttons now share a row at the same height, with the caption below
the pair.
The initial sync called onScroll, which read landing on the section as a
scroll down from 0 and hid the header; touch users had no way to bring
it back short of scrolling up. It now records the starting position and
sets only the background.
Feature: fix/hacklytics-formatting to dev
A failed getNextTable refetch still resolves with the cached answer,
which is the withdrawn table itself, so a network blip put the judge
back on the dead card under a message saying they had a new one. An
error result, or one naming the same slot, now reports the failure;
pressing any card action again retries.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 101920c. Configure here.

// background depends on it.
lastY.current = window.scrollY;
setScrolled(window.scrollY > 20);
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Deep-link scroll hides navbar

Medium Severity

Opening a section hash still hides the header. The new rAF jump updates lastY and scrolled but never sets visible, and the scroll listener is already attached. Native smooth hash scrolling (and scrollIntoView itself) fire scroll events that onScroll treats as a downward move from lastY 0, so setVisible(false) wins. Touch visitors who land on /#faqs or similar get a missing header with no hover affordance to bring it back.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 101920c. Configure here.

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor Author

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor Author

Visit the preview URL for this PR (updated for commit 5bfe9b3):

https://hacklytics2027--pr-449-o8h88hjb.web.app

(expires Thu, 08 Oct 2026 15:47:21 GMT)

🔥 via Firebase Hosting GitHub Action 🌎

Sign: c48ba34db61581e25fe2978355160b5eefe0e83f

@aamoghS
aamoghS merged commit a86efc0 into main Oct 1, 2026
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant