fix: pipeline progress, message variables, jury invite flow, accept-invite UX
- Pipeline: SUBMISSION rounds count IN_PROGRESS + COMPLETED for progress %
- Round engine: remove phantom SubmissionFileRequirement check blocking auto-transition
- Messages: implement {{userName}}, {{projectName}}, {{roundName}}, {{programName}}, {{deadline}} substitution
- Email preview: show greeting, CTA button, and footer matching actual sent email
- Message composer: add green dot indicator for active rounds in round selector
- User create: generate invite token atomically (prevents stuck INVITED state on email failure)
- Jury invites: use jury-specific email template mentioning round context
- Bulk invite: animated progress bar, batch size hint, success/failure counts
- Accept invite: distinguish server errors (retry button) from expired tokens (redirect)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -70,8 +70,12 @@ function getMetric(round: PipelineRound): string {
|
||||
return evalTotal > 0
|
||||
? `${evalSubmitted}/${evalTotal} evaluated`
|
||||
: `${assignmentCount} assignments`
|
||||
case 'SUBMISSION':
|
||||
return `${projectStates.COMPLETED} submitted`
|
||||
case 'SUBMISSION': {
|
||||
const active = projectStates.IN_PROGRESS + projectStates.COMPLETED
|
||||
return active > 0
|
||||
? `${projectStates.COMPLETED}/${projectStates.total} submitted${projectStates.IN_PROGRESS > 0 ? ` (${projectStates.IN_PROGRESS} in progress)` : ''}`
|
||||
: `${projectStates.total} awaiting`
|
||||
}
|
||||
case 'MENTORING':
|
||||
return `${projectStates.COMPLETED ?? 0} mentored`
|
||||
case 'LIVE_FINAL': {
|
||||
@@ -100,7 +104,8 @@ function getProgressPct(round: PipelineRound): number | null {
|
||||
return round.evalTotal > 0 ? Math.round((round.evalSubmitted / round.evalTotal) * 100) : 0
|
||||
case 'SUBMISSION': {
|
||||
const total = round.projectStates.total
|
||||
return total > 0 ? Math.round((round.projectStates.COMPLETED / total) * 100) : 0
|
||||
const active = round.projectStates.IN_PROGRESS + round.projectStates.COMPLETED
|
||||
return total > 0 ? Math.round((active / total) * 100) : 0
|
||||
}
|
||||
case 'MENTORING': {
|
||||
const total = round.projectStates.total
|
||||
|
||||
Reference in New Issue
Block a user