diff --git a/src/components/forms/evaluation-form-builder.tsx b/src/components/forms/evaluation-form-builder.tsx
index 53314c4..77966bf 100644
--- a/src/components/forms/evaluation-form-builder.tsx
+++ b/src/components/forms/evaluation-form-builder.tsx
@@ -51,10 +51,11 @@ import {
Heading,
ThumbsUp,
ThumbsDown,
+ ArrowUpCircle,
} from 'lucide-react'
import { cn } from '@/lib/utils'
-export type CriterionType = 'numeric' | 'text' | 'boolean' | 'section_header'
+export type CriterionType = 'numeric' | 'text' | 'boolean' | 'advance' | 'section_header'
export interface CriterionCondition {
criterionId: string
@@ -107,6 +108,8 @@ function createDefaultCriterion(type: CriterionType = 'numeric'): Criterion {
return { ...base, maxLength: 1000, placeholder: '', required: true }
case 'boolean':
return { ...base, trueLabel: 'Yes', falseLabel: 'No', required: true }
+ case 'advance':
+ return { ...base, label: 'Advance to next round?', trueLabel: 'Yes', falseLabel: 'No', required: true }
case 'section_header':
return { ...base, required: false }
default:
@@ -236,7 +239,7 @@ export function EvaluationFormBuilder({
{/* Type indicator */}
- {CRITERION_TYPE_OPTIONS.find((t) => t.value === (editDraft.type || 'numeric'))?.label ?? 'Numeric Score'}
+ {editDraft.type === 'advance' ? 'Advance to Next Round?' : (CRITERION_TYPE_OPTIONS.find((t) => t.value === (editDraft.type || 'numeric'))?.label ?? 'Numeric Score')}
@@ -413,8 +416,33 @@ export function EvaluationFormBuilder({
)}
- {/* Condition builder - available for all types except section_header */}
- {(editDraft.type || 'numeric') !== 'section_header' && criteria.filter((c) => c.id !== editDraft.id).length > 0 && (
+ {editDraft.type === 'advance' && (
+
+ )}
+
+ {/* Condition builder - available for all types except section_header and advance */}
+ {(editDraft.type || 'numeric') !== 'section_header' && editDraft.type !== 'advance' && criteria.filter((c) => c.id !== editDraft.id).length > 0 && (
@@ -554,11 +582,11 @@ export function EvaluationFormBuilder({
{(() => {
const type = criterion.type || 'numeric'
- const TypeIcon = CRITERION_TYPE_OPTIONS.find((t) => t.value === type)?.icon ?? Hash
+ const TypeIcon = type === 'advance' ? ArrowUpCircle : (CRITERION_TYPE_OPTIONS.find((t) => t.value === type)?.icon ?? Hash)
return (
- {type === 'numeric' ? `1-${criterion.scale ?? 5}` : CRITERION_TYPE_OPTIONS.find((t) => t.value === type)?.label}
+ {type === 'numeric' ? `1-${criterion.scale ?? 5}` : type === 'advance' ? 'Advance to Next Round?' : CRITERION_TYPE_OPTIONS.find((t) => t.value === type)?.label}
)
})()}
@@ -684,6 +712,22 @@ export function EvaluationFormBuilder({
))}
+
+
{criteria.length > 0 && (
)}
@@ -796,6 +840,18 @@ function PreviewDialog({ criteria }: { criteria: Criterion[] }) {
)}
+ {type === 'advance' && (
+
+
+
+ {criterion.trueLabel || 'Yes'}
+
+
+
+ {criterion.falseLabel || 'No'}
+
+
+ )}
)
diff --git a/src/server/routers/evaluation.ts b/src/server/routers/evaluation.ts
index fea76b1..79113da 100644
--- a/src/server/routers/evaluation.ts
+++ b/src/server/routers/evaluation.ts
@@ -1227,7 +1227,7 @@ export const evaluationRouter = router({
id: z.string(),
label: z.string().min(1).max(255),
description: z.string().max(2000).optional(),
- type: z.enum(['numeric', 'text', 'boolean', 'section_header']).optional(),
+ type: z.enum(['numeric', 'text', 'boolean', 'advance', 'section_header']).optional(),
// Numeric fields
weight: z.number().min(0).max(100).optional(),
minScore: z.number().int().min(0).optional(),