import { useEffect, useState } from 'react' import type { NewSubjectWizardState } from '@/features/asignaturas/nueva/types' import type { Database } from '@/types/supabase' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { useSubjectEstructuras } from '@/data' import { TIPOS_MATERIA } from '@/features/asignaturas/nueva/catalogs' import { cn } from '@/lib/utils' export function PasoBasicosForm({ wizard, onChange, }: { wizard: NewSubjectWizardState onChange: React.Dispatch> }) { const { data: estructuras } = useSubjectEstructuras() const [creditosInput, setCreditosInput] = useState(() => { const c = Number(wizard.datosBasicos.creditos ?? 0) return c > 0 ? c.toFixed(2) : '' }) const [creditosFocused, setCreditosFocused] = useState(false) useEffect(() => { if (creditosFocused) return const c = Number(wizard.datosBasicos.creditos ?? 0) setCreditosInput(c > 0 ? c.toFixed(2) : '') }, [wizard.datosBasicos.creditos, creditosFocused]) return (
onChange( (w): NewSubjectWizardState => ({ ...w, datosBasicos: { ...w.datosBasicos, nombre: e.target.value }, }), ) } className="placeholder:text-muted-foreground/70 font-medium not-italic placeholder:font-normal placeholder:italic" />
onChange( (w): NewSubjectWizardState => ({ ...w, datosBasicos: { ...w.datosBasicos, codigo: e.target.value }, }), ) } className="placeholder:text-muted-foreground/70 placeholder:italicplaceholder:text-muted-foreground/70 font-medium not-italic placeholder:font-normal placeholder:italic" />
{ if (['-', 'e', 'E', '+'].includes(e.key)) { e.preventDefault() } }} onFocus={() => setCreditosFocused(true)} onBlur={() => { setCreditosFocused(false) const raw = creditosInput.trim() if (!raw) { onChange((w) => ({ ...w, datosBasicos: { ...w.datosBasicos, creditos: 0 }, })) return } const normalized = raw.replace(',', '.') const asNumber = Number.parseFloat(normalized) if (!Number.isFinite(asNumber) || asNumber <= 0) { setCreditosInput('') onChange((w) => ({ ...w, datosBasicos: { ...w.datosBasicos, creditos: 0 }, })) return } const fixed = asNumber.toFixed(2) setCreditosInput(fixed) onChange((w) => ({ ...w, datosBasicos: { ...w.datosBasicos, creditos: Number(fixed) }, })) }} onChange={(e: React.ChangeEvent) => { const nextRaw = e.target.value if (nextRaw === '') { setCreditosInput('') onChange((w) => ({ ...w, datosBasicos: { ...w.datosBasicos, creditos: 0 }, })) return } if (!/^\d*(?:[.,]\d{0,2})?$/.test(nextRaw)) return setCreditosInput(nextRaw) const asNumber = Number.parseFloat(nextRaw.replace(',', '.')) onChange((w) => ({ ...w, datosBasicos: { ...w.datosBasicos, creditos: Number.isFinite(asNumber) && asNumber > 0 ? asNumber : 0, }, })) }} className="placeholder:text-muted-foreground/70 font-medium not-italic placeholder:font-normal placeholder:italic" placeholder="Ej. 4.50" />
{ if (['.', ',', '-', 'e', 'E', '+'].includes(e.key)) { e.preventDefault() } }} onChange={(e: React.ChangeEvent) => onChange( (w): NewSubjectWizardState => ({ ...w, datosBasicos: { ...w.datosBasicos, horasAcademicas: (() => { const raw = e.target.value if (raw === '') return null const asNumber = Number(raw) if (Number.isNaN(asNumber)) return null // Coerce to positive integer (natural numbers without zero) const n = Math.floor(Math.abs(asNumber)) return n >= 1 ? n : 1 })(), }, }), ) } className="placeholder:text-muted-foreground/70 font-medium not-italic placeholder:font-normal placeholder:italic" placeholder="Ej. 48" />
{ if (['.', ',', '-', 'e', 'E', '+'].includes(e.key)) { e.preventDefault() } }} onChange={(e: React.ChangeEvent) => onChange( (w): NewSubjectWizardState => ({ ...w, datosBasicos: { ...w.datosBasicos, horasIndependientes: (() => { const raw = e.target.value if (raw === '') return null const asNumber = Number(raw) if (Number.isNaN(asNumber)) return null // Coerce to positive integer (natural numbers without zero) const n = Math.floor(Math.abs(asNumber)) return n >= 1 ? n : 1 })(), }, }), ) } className="placeholder:text-muted-foreground/70 font-medium not-italic placeholder:font-normal placeholder:italic" placeholder="Ej. 24" />

Define los campos requeridos (ej. Objetivos, Temario, Evaluación).

) }