Skip to content

Release: develop to main (Oct 22, 2026) — judging experience + refined pages - #409

Merged
gregv merged 5 commits into
mainfrom
develop
Oct 23, 2026
Merged

gregv merged 5 commits into
mainfrom
develop

Conversation

@gregv

@gregv gregv commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

Everything on develop since the Oct 21 release (#406): PRs #407 and #408, 5 commits. Pairs with the backend release opportunity-hack/backend-ohack.dev#308 — deploy the backend first. Older backends make the new judging controls hide themselves (404 ⇒ feature off), but locks and the progress panel only work once it is live. No new env vars, no package.json changes.

Release notes

Judging — built for ~15 judges on /judge at once (#407)

  • /judge, /judge/<event> and /judge/<event>/team/<id> rebuilt on the refined design.
  • Scored teams get an explicit Adjust scores inline editor: 1–5 buttons instead of sliders, nothing is saved until Save changes, Cancel/Esc discards, the diff is spelled out. Unscored teams still go to the full page.
  • Scoring page: the total is a small uncolored line (people look over shoulders); drafts autosave only before the first submit, with an explicit Update score afterwards and an unsaved-changes guard; a failed submit stays on the page with the error — the old client reported success on any API failure and lost the score.
  • Locked rounds show "Scoring closed" and hide the controls; a 409 from the backend is explained instead of swallowed.
  • Admin ?section=judging: a scoring progress & lock panel on Round 1 and Round 2 (who has submitted, drafts in progress, what's missing, by judge or by team, CSV, lock toggle with confirm, refreshes every 30 s); Round 1/2 saves go through one bulk request per panel; Results rewritten on one call with ties broken by the earliest project submission (new "Project submitted" column and Tie chip; only currently assigned judges count).
  • Toasts now render on the judge pages and the admin judging tabs — the app has no notistack provider, so they had been silent.

Refined design on 15 more pages (#408)

  • /404, /contact, /feedback, /about/why and its articles, privacy policy, liability waiver, photo release, /praise/<id>, /hack/<event>/results, /hack/results, and the four success-story case studies (now data on one shared layout). New RefinedPage shell and .ohx-prose for future content pages.
  • Fixed on the way: the success stories' og:url pointed at a non-existent path and two social images 404'd; the privacy policy's "Last updated" printed today's date; the contact page's quick-pick pills skipped the mentor/judge read-first dialog; the success-stories index clipped cards at phone width.

Prod checklist (after Vercel deploys main)

  1. As a judge: /judge/fall-2026 lists your teams; on a scored team Adjust scores → change one value → Save changes → "Saved your changes for …" and the card's score line updates.
  2. Admin: /admin/hackathons/fall-2026?section=judging&subtab=round2 shows the progress panel (requires the backend release); Lock Round 2 scoring → a judge reloading sees "Scoring closed"; unlock restores it.
  3. /contact submits; /about/success-stories/matthews-crossing-data-automation view-source has the /about/success-stories/… canonical; /nope shows the refined 404.

🤖 Generated with Claude Code

gregv and others added 5 commits October 21, 2026 23:23
…cks, admin progress + submission tie-break

Judge side
- judgeApi now throws JudgeApiError (it faked {success:true} on failed score
  submits/drafts/team loads — scores were silently lost).
- /judge, /judge/[event], /judge/[event]/team/[id] rebuilt on the refined design.
- Dashboard: explicit 'Adjust scores' inline editor per scored team — segmented
  1–5 controls, nothing persists until 'Save changes', diff summary, Cancel/Esc
  discards; locked rounds hide scoring and explain.
- Scoring page: small uncolored total (shoulder-surfing), dirty-gated draft
  autosave only before first submit, explicit 'Update score' after, read-only
  when locked, failed submits stay on the page with the error.
- Local MUI snackbars: the app has no notistack provider, so the old toasts
  never rendered.

Admin side
- judging/JudgeProgressPanel on Round 1 + Round 2: who submitted / drafts /
  missing per judge and per team, CSV, lock toggle with confirm; polls 30s.
- Round 1/2 saves use POST /api/judge/admin/assignments/bulk (one request per
  panel instead of one per judge×team), falling back on 404.
- JudgingResults rewritten on one bulk-scores call; ties broken by earliest
  project_submitted_at with a visible column + Tie chip (resultsRanking.js).
- Admin tabs mirror toasts through the host page's onSnack.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…y-precision ties, Round 2 wipe guard, lock state, unsaved-changes guard

Judge side
- Inline adjuster: Close and every other card's Adjust are disabled while a
  save is in flight; a result always lands on its own card (no silent 500).
- "Adjust scores" is offered only when a complete stored score exists; Save
  requires every criterion set (backend would 400 otherwise).
- Rows wrap on phones; Esc inside the feedback box no longer discards; focus
  returns to the Adjust button on close; ARIA radio arrow directions.
- Toast no longer prints the score; "Not scored yet" uses the quiet tag.
- Scoring page: total pinned at the top of a scrollable sticky aside; dirty-
  gated beforeunload + routeChangeStart guard; judge_score_submitted GA event;
  W3C reference link restored on the accessibility prize.

Admin side
- Results: ties compared at the displayed two decimals (never an epsilon —
  not transitive, reordered 14- vs 15-judge averages); only currently
  assigned judges' scores count (parity with the old page), unassigned shown
  as "not counted"; WinnerPodium at module scope; assignments no longer
  cached so Refresh refetches.
- Round 2 save refuses an empty judge list and records a new panel before
  assigning (no duplicate panels on a failed call); Round 1 save skips panels
  with no judges or no teams instead of sending an empty replace.
- JudgeProgressPanel: lock state independent of the progress load (public
  locks fallback, toggle disabled while unknown), array guards, refreshSignal
  prop instead of a key remount, orphan copy corrected.

Tests: scoring-page autosave contract (never on load / submitted / locked,
once after a change, draft restore), progress panel (render, lock flow,
404, unknown-lock fallback), dashboard save race + incomplete-score gate,
display-precision ranking.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…es + RefinedPage shell

Adds src/components/design/RefinedPage.js (RefinedPage, PageMasthead,
BackLink, Prose, LinkRow, CtaBand) and an .ohx-prose class in refined.js so
simple content pages share one calm shell instead of per-page MUI sx.

Migrated: /404, /contact (form logic, reCAPTCHA, ?type= prefill and the
mentor/judge read-first dialog unchanged), /feedback, /about/why and
/about/why/[title], /about/privacy-policy (fixed LAST_UPDATED instead of
today's date), /hack/liability-waiver, /hack/photo-release, /praise/[id],
/hack/[event_id]/results, /hack/results, and the four
/about/success-stories/<slug> case studies — now data objects rendered by
SuccessStoryLayout, which also fixes their og:url (pointed at a non-existent
/success-stories/… path), adds canonical + Article/Breadcrumb JSON-LD, and
drops the duplicate manual pageview() call.

Head/SEO meta, getStaticProps/Paths and GA events are preserved on every page.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…-oct-2026

feat(judging): refined judge pages, inline score adjustment, round locks, admin progress + project-submission tie-break
…aining-pages

feat(design): refined civic-editorial pass on 15 remaining public pages + RefinedPage shell
@vercel

vercel Bot commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
frontend-ohack-dev Ready Ready Preview Oct 23, 2026 5:38am UTC

Request Review

@gregv
gregv merged commit 5e68bc9 into main Oct 23, 2026
8 checks passed

This branch was successfully deployed

1 active deployment
Preview — 18236e38 Deployed Oct 22, 2026 by vercel[bot]
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.

1 participant