Add observer project detail page with files, evaluations & reviews
All checks were successful
Build and Push Docker Image / build (push) Successful in 8m59s

New page at /observer/projects/[projectId] showing project info,
documents grouped by round requirements, and jury evaluations with
click-through to full review details. Dashboard table rows now link
to project detail. Also cleans up redundant programName prefixes
and fixes chart edge cases.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Matt
2026-02-20 18:39:53 +01:00
parent f1062f4805
commit 03c59c188e
9 changed files with 1236 additions and 57 deletions

View File

@@ -36,7 +36,7 @@ export const STATUS_COLORS: Record<string, string> = {
export const STATUS_LABELS: Record<string, string> = {
SUBMITTED: 'Submitted',
ELIGIBLE: 'Eligible',
ASSIGNED: 'Assigned',
ASSIGNED: 'Special Award',
SEMIFINALIST: 'Semi-finalist',
FINALIST: 'Finalist',
REJECTED: 'Rejected',

View File

@@ -61,7 +61,7 @@ export function DiversityMetricsChart({ data }: DiversityMetricsProps) {
: topCountries
const nivoPieData = countryPieData.map((c) => ({
id: c.country,
id: c.country === 'Others' ? 'Others' : c.country.toUpperCase(),
label: getCountryName(c.country),
value: c.count,
}))

View File

@@ -30,13 +30,13 @@ export function ProjectRankingsChart({
data,
limit = 20,
}: ProjectRankingsProps) {
if (!data?.length) return null
const scoredData = data.filter(
const scoredData = (data ?? []).filter(
(d): d is ProjectRankingData & { averageScore: number } =>
d.averageScore !== null,
)
if (!scoredData.length) return null
const averageScore =
scoredData.length > 0
? scoredData.reduce((sum, d) => sum + d.averageScore, 0) /