import { useMemo, useState } from "react" import { useQuery, useQueryClient } from "@tanstack/react-query" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from "@/components/ui/accordion" import * as Icons from "lucide-react" import { type CarreraRow } from "@/routes/_authenticated/carreras" import { criteriosOptions } from "@/routes/_authenticated/carreras" import { CriterioFormDialog } from "./CriterioFormDialog" import { supabase } from "@/auth/supabase" export function CarreraDetailDialog({ carrera, onOpenChange, onChanged, }: { carrera: CarreraRow | null onOpenChange: (c: CarreraRow | null) => void onChanged?: () => void }) { const carreraId = carrera?.id ?? "" const { data: criterios = [], isFetching } = useQuery({ ...criteriosOptions(carreraId || "noop"), enabled: !!carreraId, }) const qc = useQueryClient() const [q, setQ] = useState("") const [newCritOpen, setNewCritOpen] = useState(false) const [deletingId, setDeletingId] = useState(null) const filtered = useMemo(() => { const t = q.trim().toLowerCase() if (!t) return criterios return criterios.filter((c) => [c.nombre, c.descripcion, c.tipo, c.referencia_documento] .filter(Boolean) .some((v) => String(v).toLowerCase().includes(t)) ) }, [q, criterios]) async function removeCriterio(id: number) { if (!carreraId) return if (!confirm("¿Seguro que quieres eliminar este criterio?")) return setDeletingId(id) const { error } = await supabase.from("criterios_carrera").delete().eq("id", id) setDeletingId(null) if (error) { alert(error.message) return } await qc.invalidateQueries({ queryKey: criteriosOptions(carreraId).queryKey }) onChanged?.() } return ( !o && onOpenChange(null)}> {carrera?.nombre} {carrera?.facultades?.nombre ?? "—"} · {carrera?.semestres} semestres{" "} {typeof carrera?.activo === "boolean" && ( {carrera?.activo ? "Activa" : "Inactiva"} )}
setQ(e.target.value)} placeholder="Buscar criterio por nombre, tipo o referencia…" className="pl-8" />
{isFetching ? (
Cargando criterios…
) : ( <>
{filtered.length} criterio(s) {q ? " (filtrado)" : ""}
{filtered.length === 0 ? (
No hay criterios
) : ( {filtered.map((c) => (
{c.nombre}
{c.tipo && {c.tipo}} {c.obligatorio ? "Obligatorio" : "Opcional"}
{c.descripcion &&

{c.descripcion}

}
{c.referencia_documento && ( Referencia )} {c.fecha_creacion && ( {new Date(c.fecha_creacion).toLocaleString()} )}
))}
)} )}
{/* Crear criterio */}
) }