import React, { useState, useEffect } from 'react'; import { Database, AlertCircle, ChevronDown, ChevronUp, Loader2 } from 'lucide-react'; import { SearchableSelect } from '../components/SearchableSelect'; import { useInertiaForm } from 'use-inertia-form'; import { usePage, router } from '@inertiajs/react'; import type { Datasource } from '../types/datasource'; import type { NewDatasetForm, NewDatasetFormProps, SplitterType, SplitConfig, DateSplitConfig, RandomSplitConfig, PredefinedSplitConfig, StratifiedSplitConfig, KFoldConfig, LeavePOutConfig, ColumnConfig } from '../components/dataset/splitters/types'; import { SplitConfigurator } from '../components/dataset/SplitConfigurator'; import { validateSplitterConfig } from '../components/dataset/splitters/types'; export default function NewDatasetPage({ constants, datasources }: NewDatasetFormProps) { const [step, setStep] = useState(1); const [showError, setShowError] = useState(null); const [selectedSplitterType, setSelectedSplitterType] = useState('random'); const { rootPath } = usePage().props; const getDefaultConfig = (type: SplitterType): SplitConfig => { switch (type) { case 'date': const dateConfig: DateSplitConfig = { date_col: '', months_test: 2, months_valid: 2 }; return dateConfig; case 'random': const randomConfig: RandomSplitConfig = {}; return randomConfig; case 'predefined': const predefinedConfig: PredefinedSplitConfig = { train_files: [], test_files: [], valid_files: [] }; return predefinedConfig; case 'stratified': const stratifiedConfig: StratifiedSplitConfig = { stratify_column: '', train_ratio: 0.6, test_ratio: 0.2, valid_ratio: 0.2 }; return stratifiedConfig; case 'stratified_kfold': case 'group_kfold': const kfoldConfig: KFoldConfig = { target_column: '', group_column: '', n_splits: 5 }; return kfoldConfig; case 'leave_p_out': const lpoConfig: LeavePOutConfig = { p: 1, shuffle: true, random_state: 42 }; return lpoConfig; default: const defaultConfig: RandomSplitConfig = {}; return defaultConfig; } }; const form = useInertiaForm({ dataset: { name: '', datasource_id: '', splitter_attributes: { splitter_type: selectedSplitterType, ...getDefaultConfig(selectedSplitterType) } } }); // Update form when splitter type changes useEffect(() => { form.setData('dataset.splitter_attributes', { splitter_type: selectedSplitterType, ...getDefaultConfig(selectedSplitterType) }); }, [selectedSplitterType]); const handleSplitterChange = (type: SplitterType, attributes: SplitConfig) => { setSelectedSplitterType(type); form.setData('dataset.splitter_attributes', { splitter_type: type, ...attributes }); }; console.log(form.dataset?.splitter_attributes) const { data: formData, setData, post } = form; const selectedDatasource = formData.dataset.datasource_id ? datasources.find(d => d.id === Number(formData.dataset.datasource_id)) : null; const availableCols: ColumnConfig[] = (selectedDatasource?.columns || []).map(col => ({ name: col, type: (selectedDatasource?.schema || {})[col] || '' })); const isDatasourceReady = selectedDatasource && !selectedDatasource.is_syncing && !selectedDatasource.sync_error; const canProceedToStep2 = formData.dataset.name && isDatasourceReady; const handleDatasourceSelect = () => { if (!canProceedToStep2) return; setStep(2); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); post(`${rootPath}/datasets`, { onSuccess: () => { router.visit(`${rootPath}/datasets`); }, onError: (errors) => { console.error('Failed to create dataset:', errors); } }); }; const getValidationError = (): string | undefined => { if (!formData.dataset.name) { return "Please enter a dataset name"; } if (!formData.dataset.datasource_id) { return "Please select a datasource"; } const splitterValidation = validateSplitterConfig( formData.dataset.splitter_attributes.splitter_type, formData.dataset.splitter_attributes ); return splitterValidation.error; }; const isFormValid = () => { return !getValidationError(); }; return (

Create New Dataset

= 1 ? 'bg-blue-600' : 'bg-gray-200' } text-white font-medium text-sm`} > 1
= 2 ? 'bg-blue-600' : 'bg-gray-200' }`} />
= 2 ? 'bg-blue-600' : 'bg-gray-200' } text-white font-medium text-sm`} > 2
Basic Info Configure Split
{step === 1 ? (
setData('dataset.name', e.target.value)} className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 py-2 px-4 shadow-sm border-gray-300 border" required />