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:
@@ -1993,10 +1993,14 @@ Together for a healthier ocean.
|
||||
export function getEmailPreviewHtml(subject: string, body: string): string {
|
||||
const formattedBody = escapeHtml(body).replace(/\n/g, '<br>')
|
||||
const content = `
|
||||
${sectionTitle(subject)}
|
||||
<div style="color: #1f2937; font-size: 15px; line-height: 1.7; margin: 20px 0;">
|
||||
${sectionTitle('Hello [Name],')}
|
||||
<div style="color: ${BRAND.textDark}; font-size: 15px; line-height: 1.7; margin: 20px 0;">
|
||||
${formattedBody}
|
||||
</div>
|
||||
${ctaButton('#', 'View Details')}
|
||||
<p style="color: ${BRAND.textMuted}; margin: 24px 0 0 0; font-size: 13px; text-align: center;">
|
||||
You received this email because of your notification preferences on the MOPC Portal.
|
||||
</p>
|
||||
`
|
||||
return getEmailWrapper(content)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user