From d25b8b04414c218b40f67f4e27123434182a0971 Mon Sep 17 00:00:00 2001 From: "Roberto.silva" Date: Fri, 24 Oct 2025 12:36:39 -0600 Subject: [PATCH] Se corrigen bugs sobre crear carreras, filtrado y que aparezcan las materias cuando se crean --- src/components/carreras/DeleteCarreras.tsx | 2 +- src/components/planes/AddAsignaturaButton.tsx | 19 ++++++++++++++++- src/routes/_authenticated/carreras.tsx | 21 ++++++++++++++----- src/routes/_authenticated/plan/$planId.tsx | 5 ++++- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/components/carreras/DeleteCarreras.tsx b/src/components/carreras/DeleteCarreras.tsx index 85ebd65..2b181aa 100644 --- a/src/components/carreras/DeleteCarreras.tsx +++ b/src/components/carreras/DeleteCarreras.tsx @@ -30,7 +30,7 @@ export function useDeleteCarreraDialog(carreraId: string, onDeleted?: () => void const dialog = ( - + ¿Eliminar carrera? diff --git a/src/components/planes/AddAsignaturaButton.tsx b/src/components/planes/AddAsignaturaButton.tsx index fade9b3..c2b4e62 100644 --- a/src/components/planes/AddAsignaturaButton.tsx +++ b/src/components/planes/AddAsignaturaButton.tsx @@ -11,9 +11,11 @@ import { supabase, useSupabaseAuth } from "@/auth/supabase" import { Field } from "./Field" import { Tabs, TabsContent, TabsList, TabsTrigger } from "../ui/tabs" import { asignaturaKeys } from "./planQueries" +import { useRouter } from "@tanstack/react-router" export function AddAsignaturaButton({ planId, onAdded }: { planId: string; onAdded?: () => void }) { const qc = useQueryClient() + const router = useRouter() const supabaseAuth = useSupabaseAuth() const [open, setOpen] = useState(false) const [saving, setSaving] = useState(false) @@ -45,7 +47,13 @@ export function AddAsignaturaButton({ planId, onAdded }: { planId: string; onAdd objetivos: toNull(f.objetivos), contenidos: [], bibliografia: [], criterios_evaluacion: null, } - const { error } = await supabase.from("asignaturas").insert([payload]) + const { error,data } = await supabase.from("asignaturas").insert([payload]).select().single() + console.log(data); + router.invalidate() + router.navigate({ + to: "/asignatura/$asignaturaId", + params: { asignaturaId: data.id }, + }) setSaving(false) if (error) { alert(error.message); return } setOpen(false) @@ -64,8 +72,17 @@ export function AddAsignaturaButton({ planId, onAdded }: { planId: string; onAdd body: JSON.stringify({ planEstudiosId: planId, prompt: iaPrompt, semestre: iaSemestre.trim() ? Number(iaSemestre) : undefined, insert: true, uuid: supabaseAuth.user?.id }), }) if (!res.ok) throw new Error(await res.text()) + const data = await res.json() + console.log("Asignatura generada:", data) + const asignaturaId = data.asignaturaId || data.insertResult?.id + if (!asignaturaId) throw new Error("No se recibió el ID de la asignatura generada") confetti({ particleCount: 120, spread: 80, origin: { y: 0.6 } }) setOpen(false) + router.invalidate() + router.navigate({ + to: "/asignatura/$asignaturaId", + params: { asignaturaId }, + }) onAdded?.() // qc.invalidateQueries({ queryKey: asignaturaKeys.preview(planId) }) // qc.invalidateQueries({ queryKey: asignaturaKeys.count(planId) }) diff --git a/src/routes/_authenticated/carreras.tsx b/src/routes/_authenticated/carreras.tsx index 71a602c..57a98f1 100644 --- a/src/routes/_authenticated/carreras.tsx +++ b/src/routes/_authenticated/carreras.tsx @@ -126,6 +126,17 @@ function RouteComponent() { const [detail, setDetail] = useState(null) const [editCarrera, setEditCarrera] = useState(null) const [createOpen, setCreateOpen] = useState(false) + const [deleteTarget, setDeleteTarget] = useState(null) + + // ✅ Se declara UNA SOLA VEZ + const { setOpen: setDeleteOpen, dialog: deleteDialog } = useDeleteCarreraDialog( + deleteTarget?.id ?? "", + async () => { + await qc.invalidateQueries({ queryKey: carrerasKeys.root }) + router.invalidate() + setDeleteTarget(null) + } + ) const filtered = useMemo(() => { const term = q.trim().toLowerCase() @@ -198,10 +209,7 @@ function RouteComponent() { const border = tint(fac?.color, 0.28) const chip = tint(fac?.color, 0.1) const IconComp = (fac?.icon && (Icons as any)[fac.icon]) || Icons.Building2 - const { setOpen: setDeleteOpen, dialog: deleteDialog } = useDeleteCarreraDialog(c.id, async () => { - await qc.invalidateQueries({ queryKey: carrerasKeys.root }) - router.invalidate() - }) + return ( openContextMenu(e)}> @@ -233,7 +241,10 @@ function RouteComponent() { setEditCarrera(c)}> Editar - setDeleteOpen(true)}> + { + setDeleteTarget(c) + setDeleteOpen(true) + }}> Eliminar diff --git a/src/routes/_authenticated/plan/$planId.tsx b/src/routes/_authenticated/plan/$planId.tsx index 40bbc4e..fe51327 100644 --- a/src/routes/_authenticated/plan/$planId.tsx +++ b/src/routes/_authenticated/plan/$planId.tsx @@ -49,7 +49,10 @@ export const Route = createFileRoute("/_authenticated/plan/$planId")({ // ...existing code... function RouteComponent() { const qc = useQueryClient() - const { plan, asignaturas: asignaturasPreview } = Route.useLoaderData() as LoaderData + //const { plan, asignaturas: asignaturasPreview } = Route.useLoaderData() as LoaderData + const { plan } = Route.useLoaderData() as LoaderData + + const { data: asignaturasPreview } = useSuspenseQuery(asignaturasPreviewOptions(plan.id)) const auth = useSupabaseAuth() const asignaturasCount = asignaturasPreview.length