'use client' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Switch } from '@/components/ui/switch' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Button } from '@/components/ui/button' import { Card, CardContent } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Plus, Trash2, FileText } from 'lucide-react' import { InfoTooltip } from '@/components/ui/info-tooltip' import type { IntakeConfig, FileRequirementConfig } from '@/types/pipeline-wizard' import { FILE_TYPE_CATEGORIES, getActiveCategoriesFromMimeTypes, categoriesToMimeTypes, } from '@/lib/file-type-categories' type FileTypePickerProps = { value: string[] onChange: (mimeTypes: string[]) => void } function FileTypePicker({ value, onChange }: FileTypePickerProps) { const activeCategories = getActiveCategoriesFromMimeTypes(value) const toggleCategory = (categoryId: string) => { const isActive = activeCategories.includes(categoryId) const newCategories = isActive ? activeCategories.filter((id) => id !== categoryId) : [...activeCategories, categoryId] onChange(categoriesToMimeTypes(newCategories)) } return (
{FILE_TYPE_CATEGORIES.map((cat) => { const isActive = activeCategories.includes(cat.id) return ( ) })}
{activeCategories.length === 0 ? ( All types ) : ( activeCategories.map((catId) => { const cat = FILE_TYPE_CATEGORIES.find((c) => c.id === catId) return cat ? ( {cat.label} ) : null }) )}
) } type IntakeSectionProps = { config: IntakeConfig onChange: (config: IntakeConfig) => void isActive?: boolean } export function IntakeSection({ config, onChange, isActive }: IntakeSectionProps) { const updateConfig = (updates: Partial) => { onChange({ ...config, ...updates }) } const fileRequirements = config.fileRequirements ?? [] const updateFileReq = (index: number, updates: Partial) => { const updated = [...fileRequirements] updated[index] = { ...updated[index], ...updates } onChange({ ...config, fileRequirements: updated }) } const addFileReq = () => { onChange({ ...config, fileRequirements: [ ...fileRequirements, { name: '', description: '', acceptedMimeTypes: ['application/pdf'], maxSizeMB: 50, isRequired: false, }, ], }) } const removeFileReq = (index: number) => { const updated = fileRequirements.filter((_, i) => i !== index) onChange({ ...config, fileRequirements: updated }) } return (
{isActive && (

Some settings are locked because this pipeline is active.

)} {/* Submission Window */}

Enable timed submission windows for project intake

updateConfig({ submissionWindowEnabled: checked }) } disabled={isActive} />
{/* Late Policy */}
{(config.lateSubmissionPolicy ?? 'flag') === 'flag' && (
updateConfig({ lateGraceHours: parseInt(e.target.value) || 0 }) } />
)}
{/* File Requirements */}
{fileRequirements.length === 0 && (

No file requirements configured. Projects can be submitted without files.

)} {fileRequirements.map((req, index) => (
updateFileReq(index, { name: e.target.value })} />
updateFileReq(index, { maxSizeMB: parseInt(e.target.value) || undefined, }) } />
updateFileReq(index, { description: e.target.value }) } />
updateFileReq(index, { isRequired: checked }) } />
updateFileReq(index, { acceptedMimeTypes: mimeTypes }) } />
))}
) }