feat(finals): prominent finalist-docs banner on jury dashboard + gate nav to finals jury
All checks were successful
Build and Push Docker Image / build (push) Successful in 7m37s
All checks were successful
Build and Push Docker Image / build (push) Successful in 7m37s
Grand-Final jurors couldn't find the finalist documents review: the only entry point was a top-nav text link (hidden in the hamburger on mobile), with nothing on the dashboard. Add a prominent dashboard banner (shown only to finals-jury members) linking to /jury/finals-documents, and gate the nav "Finalist Documents" link to members so other jurors don't hit a dead "No access" page. - finalist.canReviewDocuments: lightweight boolean procedure (self-resolves active program) so the nav can gate the link without fetching the full payload - jury-nav: show "Finalist Documents" only when canReviewDocuments - jury dashboard: FinalsJuryBanner server component, gated via userCanReviewFinals, rendered above content regardless of assignment state Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1683,6 +1683,17 @@ export const finalistRouter = router({
|
||||
}),
|
||||
|
||||
/** Read-only review of all finalists' grand-final documents (admins + finale jury). */
|
||||
/** Lightweight boolean — may the current user open the finalist documents review? Self-resolves the active program so the nav can gate the link without fetching the full payload. */
|
||||
canReviewDocuments: protectedProcedure.query(async ({ ctx }) => {
|
||||
const program = await ctx.prisma.program.findFirst({
|
||||
where: { status: 'ACTIVE' },
|
||||
orderBy: { year: 'desc' },
|
||||
select: { id: true },
|
||||
})
|
||||
if (!program) return false
|
||||
return userCanReviewFinals(ctx.prisma, ctx.user.id, ctx.user.role, program.id)
|
||||
}),
|
||||
|
||||
listReviewDocuments: protectedProcedure
|
||||
.input(z.object({ programId: z.string() }))
|
||||
.query(async ({ ctx, input }) => {
|
||||
|
||||
Reference in New Issue
Block a user