import { Zap, ClipboardList, FileText, ScrollText } from 'lucide-react'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Checkbox } from '@/components/ui/checkbox'; import { Label } from '@/components/ui/label'; import { cn } from '@/lib/utils'; import type { PlanningMode } from '@automaker/types'; interface PlanningModeSelectProps { mode: PlanningMode; onModeChange: (mode: PlanningMode) => void; requireApproval?: boolean; onRequireApprovalChange?: (require: boolean) => void; testIdPrefix?: string; className?: string; disabled?: boolean; } const modes = [ { value: 'skip' as const, label: 'Skip', description: 'Direct implementation, no upfront planning', icon: Zap, color: 'text-emerald-500', }, { value: 'lite' as const, label: 'Lite', description: 'Think through approach, create task list', icon: ClipboardList, color: 'text-blue-500', }, { value: 'spec' as const, label: 'Spec', description: 'Generate spec with acceptance criteria', icon: FileText, color: 'text-purple-500', }, { value: 'full' as const, label: 'Full', description: 'Comprehensive spec with phased plan', icon: ScrollText, color: 'text-amber-500', }, ]; /** * PlanningModeSelect - Compact dropdown selector for planning modes * * A lightweight alternative to PlanningModeSelector for contexts where * spec management UI is not needed (e.g., mass edit, bulk operations). * * Shows icon + label in dropdown, with description text below. * Does not include spec generation, approval, or require-approval checkbox. * * @example * ```tsx * { * setPlanningMode(mode); * setRequireApproval(mode === 'spec' || mode === 'full'); * }} * testIdPrefix="mass-edit-planning" * /> * ``` */ export function PlanningModeSelect({ mode, onModeChange, requireApproval, onRequireApprovalChange, testIdPrefix = 'planning-mode', className, disabled = false, }: PlanningModeSelectProps) { const selectedMode = modes.find((m) => m.value === mode); // Disable approval checkbox for skip/lite modes since they don't use planning const isApprovalDisabled = disabled || mode === 'skip' || mode === 'lite'; return (
{selectedMode &&

{selectedMode.description}

} {onRequireApprovalChange && (
onRequireApprovalChange(!!checked)} disabled={isApprovalDisabled} data-testid={`${testIdPrefix}-require-approval-checkbox`} />
)}
); }