feat(voting): integrate ballots into project discovery - #146
Merged
Conversation
Remove nomination configuration from the admin API, response contract, query mutations, and year-management UI so projects are no longer presented as category-restricted. Keep the legacy ballot nomination read and historical schema intact for the transitional voting flow, while updating worker and app coverage to prove the administration path is inert.
Return only effective voting state, award categories, and the signed-in user's selections with current project names from the yearly vote read. Expose project-level voting eligibility while preserving existing vote write invariants. Retire the standalone ballot route, header action, repeated-project UI, and obsolete styles. Add focused Worker and app coverage for the compact response, nomination-independent voting, viewer permissions, and removed route.
Show open-voting progress, remaining category votes, and linked project selections above the existing project discovery controls. Provide distinct empty, partial, complete, zero-category, loading, and localized error states with responsive Hackweek styling. Cover progress semantics, selection links, closed-year query suppression, completion messaging, and resilient project browsing in app route tests.
Place the shared yearly ballot directly on eligible project details with clear uncast, selected, moved, and own-project states. Require an inline confirmation before replacing a vote, keep mutation feedback local and accessible, and await ballot refreshes after successful writes. Add responsive Hackweek-styled category rows plus focused app coverage for first-vote POSTs, confirmed PUTs, cancellation, pending and error feedback, project/idea visibility, and media ordering.
Keep votes on withdrawn projects visible and movable while clearly marking their inactive selections. Query ballots using the loaded project year, refresh ballot state after failed writes, and expose localized loading and retry states on project details.\n\nCorrect the mobile overview grid and add regression coverage for withdrawal, stale conflicts, mismatched routes, and ballot request failures.
Mark projects in both grid and list views with the signed-in user's pick count and award categories, making an in-progress ballot visible while browsing.\n\nShow voting-open state on the year overview and simplify vote and move controls with distinct neutral and confirm styling. Add focused route and interaction coverage for the updated labels and indicators.
HazAT
marked this pull request as ready for review
August 18, 2026 11:03
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 9e9a028. Configure here.
Count only active-project selections toward ballot completion and call out withdrawn picks that still need replacement. Prevent stale voting controls from rendering alongside a failed ballot refresh.\n\nAdd route coverage for inactive progress and post-vote refresh failures.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Voting now happens where people discover projects instead of on a separate page that repeats the catalogue. The year overview shows when voting is open, ballot completion, selected projects, and personal pick counts in both grid and list views; each project detail exposes every award category with clear selected, unavailable, and confirmed-move states. Project nomination administration and the standalone ballot route are removed because every active project is eligible for every category.
The voting read contract is intentionally narrowed to the signed-in user's categories and selections rather than returning every project. Withdrawn selections remain visible and movable, while existing database rules still enforce one vote per category, active same-year targets, and no self-voting. The historical nomination table and import data remain inert; reviewers may want to start with the ballot status query and then follow its shared state into the overview and project-detail surfaces.