Skip to content
This repository was archived by the owner on Dec 4, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 37 additions & 6 deletions src/components/Judging/Admin/SuperlativeSubmissions.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { CardLike } from '../../Common'
import { Button } from '../../Input'
import { H1 } from '../../Typography'
import { useHackathon } from '../../../utility/HackathonProvider'
import { JUDGING_RUBRIC, calculateGrade } from '../../../utility/Constants'

const SuperlativePrize = styled.div`
${CardLike};
Expand Down Expand Up @@ -34,6 +35,37 @@ const SuperlativeSubmissions = ({ superlativePrizes }) => {
'Devpost': project.links.devpost,
'Charity choice': project.charityChoice,
}
// compute average scores per rubric and overall grade if grades exist
if (project.grades && Object.keys(project.grades).length > 0) {
const totals = {}
const gradeEntries = Object.values(project.grades)
const count = gradeEntries.length

gradeEntries.forEach(grade => {
Object.entries(grade).forEach(([key, value]) => {
if (typeof value !== 'number') return
totals[key] = (totals[key] || 0) + value
})
})

// Attach averages for each rubric item
const avgForCalc = {}
JUDGING_RUBRIC.forEach(item => {
const avg = totals[item.id] ? totals[item.id] / count : 0
projectInfo[item.id] = Number.isFinite(avg) ? avg.toFixed(2) : ''
avgForCalc[item.id] = avg
})

// Overall grade based on averaged rubric values
projectInfo['Overall grade'] = calculateGrade(avgForCalc)
} else {
// ensure rubric headers exist even if no grades present
JUDGING_RUBRIC.forEach(item => {
projectInfo[item.id] = ''
})
projectInfo['Overall grade'] = ''
}

project.teamMembers.forEach((member, index) => {
projectInfo[`Member ${index + 1} Name`] = member.name
projectInfo[`Member ${index + 1} Email`] = member.email
Expand All @@ -53,12 +85,11 @@ const SuperlativeSubmissions = ({ superlativePrizes }) => {
<SuperlativePrize key={i}>
<Accordion cursor="default" heading={prize} key={prize}>
<EntriesList>
{superlativePrizes[prize].map((submission, i) => (
<li key={i}>
{submission.title}{' '}
{submission.draftStatus === 'public' ? 'Published (Submitted)' : 'Draft Only'}
</li>
))}
{superlativePrizes[prize].map((submission, i) =>
submission && submission.draftStatus === 'public' ? (
<li key={submission.id || idx}>{submission.title}</li>
) : null
)}
</EntriesList>
<Button color="secondary" width="medium">
<LinkContainer>
Expand Down
36 changes: 36 additions & 0 deletions src/containers/JudgingPanel.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,8 @@ const JudgingPanel = () => {
const sponsorPrizes = (await getSponsorPrizes(dbHackathonName)) || []
const projects = (await getProjectData(dbHackathonName)) || []

if (!sponsorPrizes.length) return {}

const prizesToProjectsMap = {}

for (let i = 0; i < sponsorPrizes.length; i++) {
Expand Down Expand Up @@ -251,6 +253,8 @@ const JudgingPanel = () => {
const superlativePrizes = (await getSuperlativePrizes(dbHackathonName)) || []
const projects = (await getProjectData(dbHackathonName)) || []

if (!superlativePrizes.length) return {}

const prizesToProjectsMap = {}

for (let i = 0; i < superlativePrizes.length; i++) {
Expand Down Expand Up @@ -339,6 +343,38 @@ const JudgingPanel = () => {
'Devpost': project.links.devpost,
'Charity choice': project.charityChoice,
}

// compute average scores per rubric and overall grade if grades exist
if (project.grades && Object.keys(project.grades).length > 0) {
const totals = {}
const gradeEntries = Object.values(project.grades)
const count = gradeEntries.length

gradeEntries.forEach(grade => {
Object.entries(grade).forEach(([key, value]) => {
if (typeof value !== 'number') return
totals[key] = (totals[key] || 0) + value
})
})

// Attach averages for each rubric item
const avgForCalc = {}
JUDGING_RUBRIC.forEach(item => {
const avg = totals[item.id] ? totals[item.id] / count : 0
projectInfo[item.id] = Number.isFinite(avg) ? avg.toFixed(2) : ''
avgForCalc[item.id] = avg
})

// Overall grade based on averaged rubric values
projectInfo['Overall grade'] = calculateGrade(avgForCalc)
} else {
// ensure rubric headers exist even if no grades present
JUDGING_RUBRIC.forEach(item => {
projectInfo[item.id] = ''
})
projectInfo['Overall grade'] = ''
}

project.teamMembers.forEach((member, index) => {
projectInfo[`Member ${index + 1} Name`] = member.name
projectInfo[`Member ${index + 1} Email`] = member.email
Expand Down