diff --git a/src/app/(admin)/admin/rounds/[roundId]/page.tsx b/src/app/(admin)/admin/rounds/[roundId]/page.tsx
index ef50cbb..9c58348 100644
--- a/src/app/(admin)/admin/rounds/[roundId]/page.tsx
+++ b/src/app/(admin)/admin/rounds/[roundId]/page.tsx
@@ -468,16 +468,18 @@ export default function RoundDetailPage() {
action: undefined as Route | undefined,
actionLabel: undefined as string | undefined,
},
- {
- label: 'File requirements set',
- ready: (fileRequirements?.length ?? 0) > 0,
- detail:
- (fileRequirements?.length ?? 0) > 0
- ? `${fileRequirements?.length} requirement(s)`
- : 'No file requirements \u2014 configure in Config tab',
- action: undefined as Route | undefined,
- actionLabel: undefined as string | undefined,
- },
+ ...((isEvaluation && !(config.requireDocumentUpload as boolean))
+ ? []
+ : [{
+ label: 'File requirements set',
+ ready: (fileRequirements?.length ?? 0) > 0,
+ detail:
+ (fileRequirements?.length ?? 0) > 0
+ ? `${fileRequirements?.length} requirement(s)`
+ : 'No file requirements \u2014 configure in Config tab',
+ action: undefined as Route | undefined,
+ actionLabel: undefined as string | undefined,
+ }]),
]
const readyCount = readinessItems.filter((i) => i.ready).length
@@ -1738,25 +1740,27 @@ export default function RoundDetailPage() {
{/* Evaluation Criteria Editor (EVALUATION rounds only) */}
{isEvaluation && }
- {/* Document Requirements */}
-
-
- Document Requirements
-
- Files applicants must submit for this round
- {round.windowCloseAt && (
- <> — due by {new Date(round.windowCloseAt).toLocaleDateString()}>
- )}
-
-
-
-
-
-
+ {/* Document Requirements — hidden for EVALUATION rounds unless requireDocumentUpload is on */}
+ {(!isEvaluation || !!(config.requireDocumentUpload as boolean)) && (
+
+
+ Document Requirements
+
+ Files applicants must submit for this round
+ {round.windowCloseAt && (
+ <> — due by {new Date(round.windowCloseAt).toLocaleDateString()}>
+ )}
+
+
+
+
+
+
+ )}
{/* ═══════════ AWARDS TAB ═══════════ */}
diff --git a/src/app/(jury)/jury/competitions/[roundId]/projects/[projectId]/evaluate/page.tsx b/src/app/(jury)/jury/competitions/[roundId]/projects/[projectId]/evaluate/page.tsx
index 0e969fa..18b761d 100644
--- a/src/app/(jury)/jury/competitions/[roundId]/projects/[projectId]/evaluate/page.tsx
+++ b/src/app/(jury)/jury/competitions/[roundId]/projects/[projectId]/evaluate/page.tsx
@@ -299,14 +299,10 @@ export default function JuryEvaluatePage({ params: paramsPromise }: PageProps) {
)
}
- // Check if round is active and voting window is open
- const now = new Date()
+ // Check if round is active — round status is the primary gate for evaluations
const isRoundActive = round.status === 'ROUND_ACTIVE'
- const isWindowOpen = isRoundActive &&
- round.windowOpenAt && round.windowCloseAt &&
- new Date(round.windowOpenAt) <= now && new Date(round.windowCloseAt) >= now
- if (!isWindowOpen) {
+ if (!isRoundActive) {
return (
@@ -325,9 +321,7 @@ export default function JuryEvaluatePage({ params: paramsPromise }: PageProps) {
Evaluation Not Available
- {!isRoundActive
- ? 'This round is not currently active. Evaluations can only be submitted during an active round.'
- : 'The voting window for this round is not currently open. Please check back when the window opens.'}
+ This round is not currently active. Evaluations can only be submitted during an active round.
diff --git a/src/app/(jury)/jury/competitions/[roundId]/projects/[projectId]/page.tsx b/src/app/(jury)/jury/competitions/[roundId]/projects/[projectId]/page.tsx
index 9c3a616..52b4dd6 100644
--- a/src/app/(jury)/jury/competitions/[roundId]/projects/[projectId]/page.tsx
+++ b/src/app/(jury)/jury/competitions/[roundId]/projects/[projectId]/page.tsx
@@ -27,11 +27,8 @@ export default function JuryProjectDetailPage() {
{ enabled: !!roundId }
)
- // Determine if voting is currently open
- const now = new Date()
- const isVotingOpen = round?.status === 'ROUND_ACTIVE' &&
- round?.windowOpenAt && round?.windowCloseAt &&
- new Date(round.windowOpenAt) <= now && new Date(round.windowCloseAt) >= now
+ // Round status is the primary gate for evaluations
+ const isVotingOpen = round?.status === 'ROUND_ACTIVE'
if (isLoading) {
return (
diff --git a/src/app/(jury)/jury/page.tsx b/src/app/(jury)/jury/page.tsx
index c113d99..318fa93 100644
--- a/src/app/(jury)/jury/page.tsx
+++ b/src/app/(jury)/jury/page.tsx
@@ -357,12 +357,7 @@ async function JuryDashboardContent() {
const evaluation = assignment.evaluation
const isCompleted = evaluation?.status === 'SUBMITTED'
const isDraft = evaluation?.status === 'DRAFT'
- const isVotingOpen =
- assignment.round.status === 'ROUND_ACTIVE' &&
- assignment.round.windowOpenAt &&
- assignment.round.windowCloseAt &&
- new Date(assignment.round.windowOpenAt) <= now &&
- new Date(assignment.round.windowCloseAt) >= now
+ const isVotingOpen = assignment.round.status === 'ROUND_ACTIVE'
return (
+
+
+
Require Document Upload
+
Applicants must upload documents for this evaluation round (disable if documents were uploaded in a previous round)
+
+
update('requireDocumentUpload', v)}
+ />
+
+
Peer Review
diff --git a/src/types/competition-configs.ts b/src/types/competition-configs.ts
index e407576..51d0ffd 100644
--- a/src/types/competition-configs.ts
+++ b/src/types/competition-configs.ts
@@ -83,6 +83,8 @@ export const EvaluationConfigSchema = z.object({
feedbackMinLength: z.number().int().nonnegative().default(0),
requireAllCriteriaScored: z.boolean().default(true),
+ requireDocumentUpload: z.boolean().default(false),
+
coiRequired: z.boolean().default(true),
peerReviewEnabled: z.boolean().default(false),