import React from 'react'; import { FileCheck } from 'lucide-react'; import { SearchableSelect } from '../../SearchableSelect'; interface FileConfig { path: string; type: 'train' | 'test' | 'valid'; } interface PredefinedSplitConfig { splitter_type: 'predefined'; train_files: string[]; test_files: string[]; valid_files: string[]; } interface PredefinedSplitterProps { attributes: PredefinedSplitConfig; available_files: string[]; onChange: (attributes: PredefinedSplitConfig) => void; } export function PredefinedSplitter({ attributes, available_files, onChange }: PredefinedSplitterProps) { const [selectedFiles, setSelectedFiles] = React.useState([]); // Convert attributes to FileConfig array for UI React.useEffect(() => { const files: FileConfig[] = [ ...attributes.train_files.map(path => ({ path, type: 'train' as const })), ...attributes.test_files.map(path => ({ path, type: 'test' as const })), ...attributes.valid_files.map(path => ({ path, type: 'valid' as const })) ]; setSelectedFiles(files); }, [attributes.train_files, attributes.test_files, attributes.valid_files]); const addFile = (path: string) => { const newFiles = [...selectedFiles, { path, type: 'train' }]; setSelectedFiles(newFiles); updateAttributes(newFiles); }; const updateFileType = (index: number, type: 'train' | 'test' | 'valid') => { const newFiles = selectedFiles.map((file, i) => i === index ? { ...file, type } : file ); setSelectedFiles(newFiles); updateAttributes(newFiles); }; const removeFile = (index: number) => { const newFiles = selectedFiles.filter((_, i) => i !== index); setSelectedFiles(newFiles); updateAttributes(newFiles); }; const updateAttributes = (files: FileConfig[]) => { onChange({ splitter_type: 'predefined', train_files: files.filter(f => f.type === 'train').map(f => f.path), test_files: files.filter(f => f.type === 'test').map(f => f.path), valid_files: files.filter(f => f.type === 'valid').map(f => f.path) }); }; const unusedFiles = available_files.filter( path => !selectedFiles.find(f => f.path === path) ); return (
{/* File Selection */}
({ value: path, label: path.split('/').pop() || path, description: path }))} value={null} onChange={(value) => addFile(value as string)} placeholder="Select a file..." />
{/* Selected files */} {selectedFiles.length > 0 ? (
{selectedFiles.map((file, index) => (
{file.path.split('/').pop()}
))}
) : (

Select files to create your train/test/validation splits

)} {/* Validation messages */} {selectedFiles.length > 0 && (
{!selectedFiles.some(f => f.type === 'train') && (

• You need at least one training set file

)} {!selectedFiles.some(f => f.type === 'test') && (

• You need at least one test set file

)}
)}
); }