From 36a369a207b5e80a93a07761ad8ae25605f3efb9 Mon Sep 17 00:00:00 2001 From: Guillermo Arrieta Medina Date: Fri, 30 Jan 2026 12:40:53 -0600 Subject: [PATCH 1/7] Error de CORS ai-generate-plan MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix #60: El problema se solucionó del lado del backend perimitiendo el header 'x-supabase-client-platform'. Adicionalmente, al crear un plan ya no se redirige a planes/$planId/datos, sino a planes/$planId. --- src/components/planes/wizard/WizardControls.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/planes/wizard/WizardControls.tsx b/src/components/planes/wizard/WizardControls.tsx index f70cf35..d83ac36 100644 --- a/src/components/planes/wizard/WizardControls.tsx +++ b/src/components/planes/wizard/WizardControls.tsx @@ -81,7 +81,7 @@ export function WizardControls({ console.log(`${new Date().toISOString()} - Plan IA generado`, data) navigate({ - to: `/planes/${data.plan.id}/datos`, + to: `/planes/${data.plan.id}`, state: { showConfetti: true }, }) return @@ -101,7 +101,7 @@ export function WizardControls({ // Navegar al nuevo plan navigate({ - to: `/planes/${plan.id}/datos`, + to: `/planes/${plan.id}`, state: { showConfetti: true }, }) return From 867ecc53e0ed7c24e21110780b078d711e4ffa1b Mon Sep 17 00:00:00 2001 From: Guillermo Arrieta Medina Date: Fri, 30 Jan 2026 12:50:31 -0600 Subject: [PATCH 2/7] Que se pueda escribir en el campo de Instrucciones adicionales para la IA MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix #59: El bug se debía a que en la funcion onChange se hacia referencia al valor a cambiar con 'I' mayúscula en vez de minúscula. --- .../planes/wizard/PasoDetallesPanel/PasoDetallesPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/planes/wizard/PasoDetallesPanel/PasoDetallesPanel.tsx b/src/components/planes/wizard/PasoDetallesPanel/PasoDetallesPanel.tsx index 2003a3b..249ee8d 100644 --- a/src/components/planes/wizard/PasoDetallesPanel/PasoDetallesPanel.tsx +++ b/src/components/planes/wizard/PasoDetallesPanel/PasoDetallesPanel.tsx @@ -79,7 +79,7 @@ export function PasoDetallesPanel({ ...w, iaConfig: { ...(w.iaConfig || ({} as any)), - InstruccionesAdicionalesIA: e.target.value, + instruccionesAdicionalesIA: e.target.value, }, })) } From efab8eb2e4a9bf991c596e6d45cf2f0e37b898ed Mon Sep 17 00:00:00 2001 From: Guillermo Arrieta Medina Date: Fri, 30 Jan 2026 13:21:11 -0600 Subject: [PATCH 3/7] =?UTF-8?q?Colocar=20el=20nombre=20de=20la=20Facultad/?= =?UTF-8?q?Carrera=20en=20el=20Resumen=20de=20la=20creaci=C3=B3n=20de=20lo?= =?UTF-8?q?s=20planes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix #56: Ya se muestra el nombre de la facultad y de la carrera. --- .../PasoBasicosForm/PasoBasicosForm.tsx | 31 +++++++++++++------ .../planes/wizard/PasoResumenCard.tsx | 4 +-- .../planes/wizard/WizardControls.tsx | 6 ++-- .../planes/nuevo/hooks/useNuevoPlanWizard.ts | 8 ++--- src/features/planes/nuevo/types.ts | 10 ++++-- 5 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/components/planes/wizard/PasoBasicosForm/PasoBasicosForm.tsx b/src/components/planes/wizard/PasoBasicosForm/PasoBasicosForm.tsx index 620bb5d..c731f48 100644 --- a/src/components/planes/wizard/PasoBasicosForm/PasoBasicosForm.tsx +++ b/src/components/planes/wizard/PasoBasicosForm/PasoBasicosForm.tsx @@ -34,7 +34,7 @@ export function PasoBasicosForm({ const estructurasPlanList = catalogos?.estructurasPlan ?? [] const filteredCarreras = rawCarreras.filter((c: any) => { - const facId = wizard.datosBasicos.facultadId + const facId = wizard.datosBasicos.facultad.id if (!facId) return true // soportar ambos shapes: `facultad_id` (BD) o `facultadId` (local) return c.facultad_id ? c.facultad_id === facId : c.facultadId === facId @@ -68,15 +68,20 @@ export function PasoBasicosForm({
onChange( (w): NewPlanWizardState => ({ ...w, - datosBasicos: { ...w.datosBasicos, carreraId: value }, + datosBasicos: { + ...w.datosBasicos, + carrera: { + id: value, + nombre: + filteredCarreras.find((c) => c.id === value)?.nombre || + '', + }, + }, }), ) } - disabled={!wizard.datosBasicos.facultadId} + disabled={!wizard.datosBasicos.facultad.id} > span]:block! [&>span]:truncate!', - !wizard.datosBasicos.carreraId + !wizard.datosBasicos.carrera.id ? 'text-muted-foreground font-normal italic opacity-70' // Es Placeholder : 'font-medium not-italic', // Tiene Valor (Medium) )} diff --git a/src/components/planes/wizard/PasoResumenCard.tsx b/src/components/planes/wizard/PasoResumenCard.tsx index 1fc3038..0a3396d 100644 --- a/src/components/planes/wizard/PasoResumenCard.tsx +++ b/src/components/planes/wizard/PasoResumenCard.tsx @@ -45,8 +45,8 @@ export function PasoResumenCard({ wizard }: { wizard: NewPlanWizardState }) { Facultad/Carrera:{' '} - {wizard.datosBasicos.facultadId || '—'} /{' '} - {wizard.datosBasicos.carreraId || '—'} + {wizard.datosBasicos.facultad.nombre || '—'} /{' '} + {wizard.datosBasicos.carrera.nombre || '—'}
diff --git a/src/components/planes/wizard/WizardControls.tsx b/src/components/planes/wizard/WizardControls.tsx index d83ac36..35f5419 100644 --- a/src/components/planes/wizard/WizardControls.tsx +++ b/src/components/planes/wizard/WizardControls.tsx @@ -57,8 +57,8 @@ export function WizardControls({ const aiInput = { datosBasicos: { nombrePlan: wizard.datosBasicos.nombrePlan, - carreraId: wizard.datosBasicos.carreraId, - facultadId: wizard.datosBasicos.facultadId || undefined, + carreraId: wizard.datosBasicos.carrera.id || undefined, + facultadId: wizard.datosBasicos.facultad.id || undefined, nivel: wizard.datosBasicos.nivel as string, tipoCiclo: tipoCicloSafe, numCiclos: numCiclosSafe, @@ -90,7 +90,7 @@ export function WizardControls({ if (wizard.tipoOrigen === 'MANUAL') { // Crear plan vacío manualmente usando el hook const plan = await createPlanManual.mutateAsync({ - carreraId: wizard.datosBasicos.carreraId, + carreraId: wizard.datosBasicos.carrera.id, estructuraId: wizard.datosBasicos.estructuraPlanId as string, nombre: wizard.datosBasicos.nombrePlan, nivel: wizard.datosBasicos.nivel as NivelPlanEstudio, diff --git a/src/features/planes/nuevo/hooks/useNuevoPlanWizard.ts b/src/features/planes/nuevo/hooks/useNuevoPlanWizard.ts index e409464..fd8e656 100644 --- a/src/features/planes/nuevo/hooks/useNuevoPlanWizard.ts +++ b/src/features/planes/nuevo/hooks/useNuevoPlanWizard.ts @@ -8,8 +8,8 @@ export function useNuevoPlanWizard() { tipoOrigen: null, datosBasicos: { nombrePlan: '', - carreraId: '', - facultadId: '', + facultad: { id: '', nombre: '' }, + carrera: { id: '', nombre: '' }, nivel: '', tipoCiclo: '', numCiclos: undefined, @@ -53,8 +53,8 @@ export function useNuevoPlanWizard() { const canContinueDesdeBasicos = !!wizard.datosBasicos.nombrePlan && - !!wizard.datosBasicos.carreraId && - !!wizard.datosBasicos.facultadId && + !!wizard.datosBasicos.carrera.id && + !!wizard.datosBasicos.facultad.id && !!wizard.datosBasicos.nivel && wizard.datosBasicos.numCiclos !== undefined && wizard.datosBasicos.numCiclos > 0 && diff --git a/src/features/planes/nuevo/types.ts b/src/features/planes/nuevo/types.ts index 5af5db6..ed68f8a 100644 --- a/src/features/planes/nuevo/types.ts +++ b/src/features/planes/nuevo/types.ts @@ -19,8 +19,14 @@ export type NewPlanWizardState = { tipoOrigen: TipoOrigen | null datosBasicos: { nombrePlan: string - carreraId: string - facultadId: string + facultad: { + id: string + nombre: string + } + carrera: { + id: string + nombre: string + } nivel: NivelPlanEstudio | '' tipoCiclo: TipoCiclo | '' numCiclos: number | undefined From c27f05c5f69100700df250e2571c4e026febd775 Mon Sep 17 00:00:00 2001 From: Guillermo Arrieta Medina Date: Fri, 30 Jan 2026 13:34:16 -0600 Subject: [PATCH 4/7] =?UTF-8?q?Ahora=20solo=20se=20muestran=20los=20c?= =?UTF-8?q?=C3=ADrculos=20con=20palomita=20si=20el=20archivo/repositorio?= =?UTF-8?q?=20est=C3=A1=20seleccionado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix #61 --- .../wizard/PasoDetallesPanel/ReferenciasParaIA.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/planes/wizard/PasoDetallesPanel/ReferenciasParaIA.tsx b/src/components/planes/wizard/PasoDetallesPanel/ReferenciasParaIA.tsx index cbc23cd..85a45d5 100644 --- a/src/components/planes/wizard/PasoDetallesPanel/ReferenciasParaIA.tsx +++ b/src/components/planes/wizard/PasoDetallesPanel/ReferenciasParaIA.tsx @@ -17,6 +17,7 @@ import { TabsContents, } from '@/components/ui/motion-tabs' import { ARCHIVOS, REPOSITORIOS } from '@/features/planes/nuevo/catalogs' +import { cn } from '@/lib/utils' const ReferenciasParaIA = ({ selectedArchivoIds = [], @@ -87,7 +88,10 @@ const ReferenciasParaIA = ({ onCheckedChange={(checked) => onToggleArchivo?.(archivo.id, !!checked) } - className="peer border-primary ring-offset-background data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground focus-visible:ring-ring h-5 w-5 shrink-0 rounded-sm border focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50" + className={cn( + 'peer border-primary ring-offset-background data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground focus-visible:ring-ring h-5 w-5 shrink-0 rounded-sm border focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50', + selectedArchivoIds.includes(archivo.id) ? '' : 'invisible', + )} /> @@ -134,7 +138,12 @@ const ReferenciasParaIA = ({ onCheckedChange={(checked) => onToggleRepositorio?.(repositorio.id, !!checked) } - className="peer border-primary ring-offset-background data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground focus-visible:ring-ring h-5 w-5 shrink-0 rounded-sm border focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50" + className={cn( + 'peer border-primary ring-offset-background data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground focus-visible:ring-ring h-5 w-5 shrink-0 rounded-sm border focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50', + selectedRepositorioIds.includes(repositorio.id) + ? '' + : 'invisible', + )} /> From 12c572a442185b47a3de8a83b1d2f89eabcb47b6 Mon Sep 17 00:00:00 2001 From: Guillermo Arrieta Medina Date: Thu, 29 Jan 2026 16:36:38 -0600 Subject: [PATCH 5/7] =?UTF-8?q?Reorganizaci=C3=B3n=20de=20archivos=20y=20e?= =?UTF-8?q?nlace=20a=20wizard=20de=20creaci=C3=B3n=20de=20asignatura?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/query/keys.ts | 44 +-- .../nueva/NuevaAsignaturaModalContainer.tsx | 116 ++++--- src/routeTree.gen.ts | 307 +++++++----------- .../{_detalle/route.tsx => _detalle.tsx} | 2 + .../index.tsx} | 12 +- .../_lista => _detalle/asignaturas}/nueva.tsx | 3 +- .../$planId/asignaturas/$asignaturaId.tsx | 44 +++ .../asignaturas/$asignaturaId/route.tsx | 18 - .../$planId/asignaturas/_lista/route.tsx | 16 - .../planes/$planId/asignaturas/route.tsx | 34 -- .../planes/{_lista/route.tsx => _lista.tsx} | 6 +- 11 files changed, 273 insertions(+), 329 deletions(-) rename src/routes/planes/$planId/{_detalle/route.tsx => _detalle.tsx} (99%) rename src/routes/planes/$planId/_detalle/{asignaturas.tsx => asignaturas/index.tsx} (95%) rename src/routes/planes/$planId/{asignaturas/_lista => _detalle/asignaturas}/nueva.tsx (80%) create mode 100644 src/routes/planes/$planId/asignaturas/$asignaturaId.tsx delete mode 100644 src/routes/planes/$planId/asignaturas/$asignaturaId/route.tsx delete mode 100644 src/routes/planes/$planId/asignaturas/_lista/route.tsx delete mode 100644 src/routes/planes/$planId/asignaturas/route.tsx rename src/routes/planes/{_lista/route.tsx => _lista.tsx} (98%) diff --git a/src/data/query/keys.ts b/src/data/query/keys.ts index 788da9f..ec61bbd 100644 --- a/src/data/query/keys.ts +++ b/src/data/query/keys.ts @@ -1,31 +1,33 @@ export const qk = { - auth: ["auth"] as const, - session: () => ["auth", "session"] as const, - meProfile: () => ["auth", "meProfile"] as const, + auth: ['auth'] as const, + session: () => ['auth', 'session'] as const, + meProfile: () => ['auth', 'meProfile'] as const, - facultades: () => ["meta", "facultades"] as const, + facultades: () => ['meta', 'facultades'] as const, carreras: (facultadId?: string | null) => - ["meta", "carreras", { facultadId: facultadId ?? null }] as const, + ['meta', 'carreras', { facultadId: facultadId ?? null }] as const, estructurasPlan: (nivel?: string | null) => - ["meta", "estructurasPlan", { nivel: nivel ?? null }] as const, - estructurasAsignatura: () => ["meta", "estructurasAsignatura"] as const, - estadosPlan: () => ["meta", "estadosPlan"] as const, + ['meta', 'estructurasPlan', { nivel: nivel ?? null }] as const, + estructurasAsignatura: () => ['meta', 'estructurasAsignatura'] as const, + estadosPlan: () => ['meta', 'estadosPlan'] as const, - planesList: (filters: unknown) => ["planes", "list", filters] as const, - plan: (planId: string) => ["planes", "detail", planId] as const, - planLineas: (planId: string) => ["planes", planId, "lineas"] as const, - planAsignaturas: (planId: string) => ["planes", planId, "asignaturas"] as const, - planHistorial: (planId: string) => ["planes", planId, "historial"] as const, - planDocumento: (planId: string) => ["planes", planId, "documento"] as const, + planesList: (filters: unknown) => ['planes', 'list', filters] as const, + plan: (planId: string) => ['planes', 'detail', planId] as const, + planLineas: (planId: string) => ['planes', planId, 'lineas'] as const, + planAsignaturas: (planId: string) => + ['planes', planId, 'asignaturas'] as const, + planHistorial: (planId: string) => ['planes', planId, 'historial'] as const, + planDocumento: (planId: string) => ['planes', planId, 'documento'] as const, - asignatura: (asignaturaId: string) => ["asignaturas", "detail", asignaturaId] as const, + asignatura: (asignaturaId: string) => + ['asignaturas', 'detail', asignaturaId] as const, asignaturaBibliografia: (asignaturaId: string) => - ["asignaturas", asignaturaId, "bibliografia"] as const, + ['asignaturas', asignaturaId, 'bibliografia'] as const, asignaturaHistorial: (asignaturaId: string) => - ["asignaturas", asignaturaId, "historial"] as const, + ['asignaturas', asignaturaId, 'historial'] as const, asignaturaDocumento: (asignaturaId: string) => - ["asignaturas", asignaturaId, "documento"] as const, + ['asignaturas', asignaturaId, 'documento'] as const, - tareas: () => ["tareas", "mias"] as const, - notificaciones: () => ["notificaciones", "mias"] as const, -}; + tareas: () => ['tareas', 'mias'] as const, + notificaciones: () => ['notificaciones', 'mias'] as const, +} diff --git a/src/features/asignaturas/nueva/NuevaAsignaturaModalContainer.tsx b/src/features/asignaturas/nueva/NuevaAsignaturaModalContainer.tsx index ba66cb1..e7b9fe0 100644 --- a/src/features/asignaturas/nueva/NuevaAsignaturaModalContainer.tsx +++ b/src/features/asignaturas/nueva/NuevaAsignaturaModalContainer.tsx @@ -12,6 +12,8 @@ import { WizardHeader } from '@/components/asignaturas/wizard/WizardHeader' import { defineStepper } from '@/components/stepper' import { Dialog, DialogContent } from '@/components/ui/dialog' +const auth_get_current_user_role = () => 'JEFE_CARRERA' as const + const Wizard = defineStepper( { id: 'metodo', @@ -24,8 +26,8 @@ const Wizard = defineStepper( description: 'Nombre y estructura', }, { - id: 'configuracion', - title: 'Configuración', + id: 'detalles', + title: 'Detalles', description: 'Detalles según modo', }, { @@ -35,8 +37,6 @@ const Wizard = defineStepper( }, ) -const auth_get_current_user_role = () => 'JEFE_CARRERA' as const - export function NuevaAsignaturaModalContainer({ planId }: { planId: string }) { const navigate = useNavigate() const role = auth_get_current_user_role() @@ -68,57 +68,69 @@ export function NuevaAsignaturaModalContainer({ planId }: { planId: string }) { initialStep={Wizard.utils.getFirst().id} className="flex h-full flex-col" > - {({ methods }) => ( - <> - + {({ methods }) => { + const currentIndex = Wizard.utils.getIndex(methods.current.id) + 1 + const totalSteps = Wizard.steps.length + const nextStep = Wizard.steps[currentIndex] ?? { + title: '', + description: '', + } -
-
- {Wizard.utils.getIndex(methods.current.id) === 0 && ( - - - - )} - {Wizard.utils.getIndex(methods.current.id) === 1 && ( - - - - )} - {Wizard.utils.getIndex(methods.current.id) === 2 && ( - - - - )} - {Wizard.utils.getIndex(methods.current.id) === 3 && ( - - - - )} + return ( + <> + + +
+
+ {Wizard.utils.getIndex(methods.current.id) === 0 && ( + + + + )} + {Wizard.utils.getIndex(methods.current.id) === 1 && ( + + + + )} + {Wizard.utils.getIndex(methods.current.id) === 2 && ( + + + + )} + {Wizard.utils.getIndex(methods.current.id) === 3 && ( + + + + )} +
-
- crearAsignatura(handleClose)} - /> - - )} + crearAsignatura(handleClose)} + /> + + ) + }} )} diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index b69c51b..664da6b 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -12,21 +12,19 @@ import { Route as rootRouteImport } from './routes/__root' import { Route as LoginRouteImport } from './routes/login' import { Route as DashboardRouteImport } from './routes/dashboard' import { Route as IndexRouteImport } from './routes/index' +import { Route as PlanesListaRouteImport } from './routes/planes/_lista' import { Route as DemoTanstackQueryRouteImport } from './routes/demo/tanstack-query' -import { Route as PlanesListaRouteRouteImport } from './routes/planes/_lista/route' import { Route as PlanesListaNuevoRouteImport } from './routes/planes/_lista/nuevo' -import { Route as PlanesPlanIdAsignaturasRouteRouteImport } from './routes/planes/$planId/asignaturas/route' -import { Route as PlanesPlanIdDetalleRouteRouteImport } from './routes/planes/$planId/_detalle/route' +import { Route as PlanesPlanIdDetalleRouteImport } from './routes/planes/$planId/_detalle' import { Route as PlanesPlanIdDetalleIndexRouteImport } from './routes/planes/$planId/_detalle/index' +import { Route as PlanesPlanIdAsignaturasAsignaturaIdRouteImport } from './routes/planes/$planId/asignaturas/$asignaturaId' import { Route as PlanesPlanIdDetalleMapaRouteImport } from './routes/planes/$planId/_detalle/mapa' import { Route as PlanesPlanIdDetalleIaplanRouteImport } from './routes/planes/$planId/_detalle/iaplan' import { Route as PlanesPlanIdDetalleHistorialRouteImport } from './routes/planes/$planId/_detalle/historial' import { Route as PlanesPlanIdDetalleFlujoRouteImport } from './routes/planes/$planId/_detalle/flujo' import { Route as PlanesPlanIdDetalleDocumentoRouteImport } from './routes/planes/$planId/_detalle/documento' -import { Route as PlanesPlanIdDetalleAsignaturasRouteImport } from './routes/planes/$planId/_detalle/asignaturas' -import { Route as PlanesPlanIdAsignaturasListaRouteRouteImport } from './routes/planes/$planId/asignaturas/_lista/route' -import { Route as PlanesPlanIdAsignaturasAsignaturaIdRouteRouteImport } from './routes/planes/$planId/asignaturas/$asignaturaId/route' -import { Route as PlanesPlanIdAsignaturasListaNuevaRouteImport } from './routes/planes/$planId/asignaturas/_lista/nueva' +import { Route as PlanesPlanIdDetalleAsignaturasIndexRouteImport } from './routes/planes/$planId/_detalle/asignaturas/index' +import { Route as PlanesPlanIdDetalleAsignaturasNuevaRouteImport } from './routes/planes/$planId/_detalle/asignaturas/nueva' const LoginRoute = LoginRouteImport.update({ id: '/login', @@ -43,147 +41,133 @@ const IndexRoute = IndexRouteImport.update({ path: '/', getParentRoute: () => rootRouteImport, } as any) +const PlanesListaRoute = PlanesListaRouteImport.update({ + id: '/planes/_lista', + path: '/planes', + getParentRoute: () => rootRouteImport, +} as any) const DemoTanstackQueryRoute = DemoTanstackQueryRouteImport.update({ id: '/demo/tanstack-query', path: '/demo/tanstack-query', getParentRoute: () => rootRouteImport, } as any) -const PlanesListaRouteRoute = PlanesListaRouteRouteImport.update({ - id: '/planes/_lista', - path: '/planes', - getParentRoute: () => rootRouteImport, -} as any) const PlanesListaNuevoRoute = PlanesListaNuevoRouteImport.update({ id: '/nuevo', path: '/nuevo', - getParentRoute: () => PlanesListaRouteRoute, + getParentRoute: () => PlanesListaRoute, +} as any) +const PlanesPlanIdDetalleRoute = PlanesPlanIdDetalleRouteImport.update({ + id: '/planes/$planId/_detalle', + path: '/planes/$planId', + getParentRoute: () => rootRouteImport, } as any) -const PlanesPlanIdAsignaturasRouteRoute = - PlanesPlanIdAsignaturasRouteRouteImport.update({ - id: '/planes/$planId/asignaturas', - path: '/planes/$planId/asignaturas', - getParentRoute: () => rootRouteImport, - } as any) -const PlanesPlanIdDetalleRouteRoute = - PlanesPlanIdDetalleRouteRouteImport.update({ - id: '/planes/$planId/_detalle', - path: '/planes/$planId', - getParentRoute: () => rootRouteImport, - } as any) const PlanesPlanIdDetalleIndexRoute = PlanesPlanIdDetalleIndexRouteImport.update({ id: '/', path: '/', - getParentRoute: () => PlanesPlanIdDetalleRouteRoute, + getParentRoute: () => PlanesPlanIdDetalleRoute, + } as any) +const PlanesPlanIdAsignaturasAsignaturaIdRoute = + PlanesPlanIdAsignaturasAsignaturaIdRouteImport.update({ + id: '/planes/$planId/asignaturas/$asignaturaId', + path: '/planes/$planId/asignaturas/$asignaturaId', + getParentRoute: () => rootRouteImport, } as any) const PlanesPlanIdDetalleMapaRoute = PlanesPlanIdDetalleMapaRouteImport.update({ id: '/mapa', path: '/mapa', - getParentRoute: () => PlanesPlanIdDetalleRouteRoute, + getParentRoute: () => PlanesPlanIdDetalleRoute, } as any) const PlanesPlanIdDetalleIaplanRoute = PlanesPlanIdDetalleIaplanRouteImport.update({ id: '/iaplan', path: '/iaplan', - getParentRoute: () => PlanesPlanIdDetalleRouteRoute, + getParentRoute: () => PlanesPlanIdDetalleRoute, } as any) const PlanesPlanIdDetalleHistorialRoute = PlanesPlanIdDetalleHistorialRouteImport.update({ id: '/historial', path: '/historial', - getParentRoute: () => PlanesPlanIdDetalleRouteRoute, + getParentRoute: () => PlanesPlanIdDetalleRoute, } as any) const PlanesPlanIdDetalleFlujoRoute = PlanesPlanIdDetalleFlujoRouteImport.update({ id: '/flujo', path: '/flujo', - getParentRoute: () => PlanesPlanIdDetalleRouteRoute, + getParentRoute: () => PlanesPlanIdDetalleRoute, } as any) const PlanesPlanIdDetalleDocumentoRoute = PlanesPlanIdDetalleDocumentoRouteImport.update({ id: '/documento', path: '/documento', - getParentRoute: () => PlanesPlanIdDetalleRouteRoute, + getParentRoute: () => PlanesPlanIdDetalleRoute, } as any) -const PlanesPlanIdDetalleAsignaturasRoute = - PlanesPlanIdDetalleAsignaturasRouteImport.update({ - id: '/asignaturas', - path: '/asignaturas', - getParentRoute: () => PlanesPlanIdDetalleRouteRoute, +const PlanesPlanIdDetalleAsignaturasIndexRoute = + PlanesPlanIdDetalleAsignaturasIndexRouteImport.update({ + id: '/asignaturas/', + path: '/asignaturas/', + getParentRoute: () => PlanesPlanIdDetalleRoute, } as any) -const PlanesPlanIdAsignaturasListaRouteRoute = - PlanesPlanIdAsignaturasListaRouteRouteImport.update({ - id: '/_lista', - getParentRoute: () => PlanesPlanIdAsignaturasRouteRoute, - } as any) -const PlanesPlanIdAsignaturasAsignaturaIdRouteRoute = - PlanesPlanIdAsignaturasAsignaturaIdRouteRouteImport.update({ - id: '/$asignaturaId', - path: '/$asignaturaId', - getParentRoute: () => PlanesPlanIdAsignaturasRouteRoute, - } as any) -const PlanesPlanIdAsignaturasListaNuevaRoute = - PlanesPlanIdAsignaturasListaNuevaRouteImport.update({ - id: '/nueva', - path: '/nueva', - getParentRoute: () => PlanesPlanIdAsignaturasListaRouteRoute, +const PlanesPlanIdDetalleAsignaturasNuevaRoute = + PlanesPlanIdDetalleAsignaturasNuevaRouteImport.update({ + id: '/asignaturas/nueva', + path: '/asignaturas/nueva', + getParentRoute: () => PlanesPlanIdDetalleRoute, } as any) export interface FileRoutesByFullPath { '/': typeof IndexRoute '/dashboard': typeof DashboardRoute '/login': typeof LoginRoute - '/planes': typeof PlanesListaRouteRouteWithChildren '/demo/tanstack-query': typeof DemoTanstackQueryRoute - '/planes/$planId': typeof PlanesPlanIdDetalleRouteRouteWithChildren - '/planes/$planId/asignaturas': typeof PlanesPlanIdDetalleAsignaturasRoute + '/planes': typeof PlanesListaRouteWithChildren + '/planes/$planId': typeof PlanesPlanIdDetalleRouteWithChildren '/planes/nuevo': typeof PlanesListaNuevoRoute - '/planes/$planId/asignaturas/$asignaturaId': typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRoute '/planes/$planId/documento': typeof PlanesPlanIdDetalleDocumentoRoute '/planes/$planId/flujo': typeof PlanesPlanIdDetalleFlujoRoute '/planes/$planId/historial': typeof PlanesPlanIdDetalleHistorialRoute '/planes/$planId/iaplan': typeof PlanesPlanIdDetalleIaplanRoute '/planes/$planId/mapa': typeof PlanesPlanIdDetalleMapaRoute + '/planes/$planId/asignaturas/$asignaturaId': typeof PlanesPlanIdAsignaturasAsignaturaIdRoute '/planes/$planId/': typeof PlanesPlanIdDetalleIndexRoute - '/planes/$planId/asignaturas/nueva': typeof PlanesPlanIdAsignaturasListaNuevaRoute + '/planes/$planId/asignaturas/nueva': typeof PlanesPlanIdDetalleAsignaturasNuevaRoute + '/planes/$planId/asignaturas/': typeof PlanesPlanIdDetalleAsignaturasIndexRoute } export interface FileRoutesByTo { '/': typeof IndexRoute '/dashboard': typeof DashboardRoute '/login': typeof LoginRoute - '/planes': typeof PlanesListaRouteRouteWithChildren '/demo/tanstack-query': typeof DemoTanstackQueryRoute - '/planes/$planId/asignaturas': typeof PlanesPlanIdDetalleAsignaturasRoute + '/planes': typeof PlanesListaRouteWithChildren '/planes/nuevo': typeof PlanesListaNuevoRoute - '/planes/$planId/asignaturas/$asignaturaId': typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRoute '/planes/$planId/documento': typeof PlanesPlanIdDetalleDocumentoRoute '/planes/$planId/flujo': typeof PlanesPlanIdDetalleFlujoRoute '/planes/$planId/historial': typeof PlanesPlanIdDetalleHistorialRoute '/planes/$planId/iaplan': typeof PlanesPlanIdDetalleIaplanRoute '/planes/$planId/mapa': typeof PlanesPlanIdDetalleMapaRoute + '/planes/$planId/asignaturas/$asignaturaId': typeof PlanesPlanIdAsignaturasAsignaturaIdRoute '/planes/$planId': typeof PlanesPlanIdDetalleIndexRoute - '/planes/$planId/asignaturas/nueva': typeof PlanesPlanIdAsignaturasListaNuevaRoute + '/planes/$planId/asignaturas/nueva': typeof PlanesPlanIdDetalleAsignaturasNuevaRoute + '/planes/$planId/asignaturas': typeof PlanesPlanIdDetalleAsignaturasIndexRoute } export interface FileRoutesById { __root__: typeof rootRouteImport '/': typeof IndexRoute '/dashboard': typeof DashboardRoute '/login': typeof LoginRoute - '/planes/_lista': typeof PlanesListaRouteRouteWithChildren '/demo/tanstack-query': typeof DemoTanstackQueryRoute - '/planes/$planId/_detalle': typeof PlanesPlanIdDetalleRouteRouteWithChildren - '/planes/$planId/asignaturas': typeof PlanesPlanIdAsignaturasRouteRouteWithChildren + '/planes/_lista': typeof PlanesListaRouteWithChildren + '/planes/$planId/_detalle': typeof PlanesPlanIdDetalleRouteWithChildren '/planes/_lista/nuevo': typeof PlanesListaNuevoRoute - '/planes/$planId/asignaturas/$asignaturaId': typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRoute - '/planes/$planId/asignaturas/_lista': typeof PlanesPlanIdAsignaturasListaRouteRouteWithChildren - '/planes/$planId/_detalle/asignaturas': typeof PlanesPlanIdDetalleAsignaturasRoute '/planes/$planId/_detalle/documento': typeof PlanesPlanIdDetalleDocumentoRoute '/planes/$planId/_detalle/flujo': typeof PlanesPlanIdDetalleFlujoRoute '/planes/$planId/_detalle/historial': typeof PlanesPlanIdDetalleHistorialRoute '/planes/$planId/_detalle/iaplan': typeof PlanesPlanIdDetalleIaplanRoute '/planes/$planId/_detalle/mapa': typeof PlanesPlanIdDetalleMapaRoute + '/planes/$planId/asignaturas/$asignaturaId': typeof PlanesPlanIdAsignaturasAsignaturaIdRoute '/planes/$planId/_detalle/': typeof PlanesPlanIdDetalleIndexRoute - '/planes/$planId/asignaturas/_lista/nueva': typeof PlanesPlanIdAsignaturasListaNuevaRoute + '/planes/$planId/_detalle/asignaturas/nueva': typeof PlanesPlanIdDetalleAsignaturasNuevaRoute + '/planes/$planId/_detalle/asignaturas/': typeof PlanesPlanIdDetalleAsignaturasIndexRoute } export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath @@ -191,66 +175,64 @@ export interface FileRouteTypes { | '/' | '/dashboard' | '/login' - | '/planes' | '/demo/tanstack-query' + | '/planes' | '/planes/$planId' - | '/planes/$planId/asignaturas' | '/planes/nuevo' - | '/planes/$planId/asignaturas/$asignaturaId' | '/planes/$planId/documento' | '/planes/$planId/flujo' | '/planes/$planId/historial' | '/planes/$planId/iaplan' | '/planes/$planId/mapa' + | '/planes/$planId/asignaturas/$asignaturaId' | '/planes/$planId/' | '/planes/$planId/asignaturas/nueva' + | '/planes/$planId/asignaturas/' fileRoutesByTo: FileRoutesByTo to: | '/' | '/dashboard' | '/login' - | '/planes' | '/demo/tanstack-query' - | '/planes/$planId/asignaturas' + | '/planes' | '/planes/nuevo' - | '/planes/$planId/asignaturas/$asignaturaId' | '/planes/$planId/documento' | '/planes/$planId/flujo' | '/planes/$planId/historial' | '/planes/$planId/iaplan' | '/planes/$planId/mapa' + | '/planes/$planId/asignaturas/$asignaturaId' | '/planes/$planId' | '/planes/$planId/asignaturas/nueva' + | '/planes/$planId/asignaturas' id: | '__root__' | '/' | '/dashboard' | '/login' - | '/planes/_lista' | '/demo/tanstack-query' + | '/planes/_lista' | '/planes/$planId/_detalle' - | '/planes/$planId/asignaturas' | '/planes/_lista/nuevo' - | '/planes/$planId/asignaturas/$asignaturaId' - | '/planes/$planId/asignaturas/_lista' - | '/planes/$planId/_detalle/asignaturas' | '/planes/$planId/_detalle/documento' | '/planes/$planId/_detalle/flujo' | '/planes/$planId/_detalle/historial' | '/planes/$planId/_detalle/iaplan' | '/planes/$planId/_detalle/mapa' + | '/planes/$planId/asignaturas/$asignaturaId' | '/planes/$planId/_detalle/' - | '/planes/$planId/asignaturas/_lista/nueva' + | '/planes/$planId/_detalle/asignaturas/nueva' + | '/planes/$planId/_detalle/asignaturas/' fileRoutesById: FileRoutesById } export interface RootRouteChildren { IndexRoute: typeof IndexRoute DashboardRoute: typeof DashboardRoute LoginRoute: typeof LoginRoute - PlanesListaRouteRoute: typeof PlanesListaRouteRouteWithChildren DemoTanstackQueryRoute: typeof DemoTanstackQueryRoute - PlanesPlanIdDetalleRouteRoute: typeof PlanesPlanIdDetalleRouteRouteWithChildren - PlanesPlanIdAsignaturasRouteRoute: typeof PlanesPlanIdAsignaturasRouteRouteWithChildren + PlanesListaRoute: typeof PlanesListaRouteWithChildren + PlanesPlanIdDetalleRoute: typeof PlanesPlanIdDetalleRouteWithChildren + PlanesPlanIdAsignaturasAsignaturaIdRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRoute } declare module '@tanstack/react-router' { @@ -276,6 +258,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof IndexRouteImport parentRoute: typeof rootRouteImport } + '/planes/_lista': { + id: '/planes/_lista' + path: '/planes' + fullPath: '/planes' + preLoaderRoute: typeof PlanesListaRouteImport + parentRoute: typeof rootRouteImport + } '/demo/tanstack-query': { id: '/demo/tanstack-query' path: '/demo/tanstack-query' @@ -283,32 +272,18 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof DemoTanstackQueryRouteImport parentRoute: typeof rootRouteImport } - '/planes/_lista': { - id: '/planes/_lista' - path: '/planes' - fullPath: '/planes' - preLoaderRoute: typeof PlanesListaRouteRouteImport - parentRoute: typeof rootRouteImport - } '/planes/_lista/nuevo': { id: '/planes/_lista/nuevo' path: '/nuevo' fullPath: '/planes/nuevo' preLoaderRoute: typeof PlanesListaNuevoRouteImport - parentRoute: typeof PlanesListaRouteRoute - } - '/planes/$planId/asignaturas': { - id: '/planes/$planId/asignaturas' - path: '/planes/$planId/asignaturas' - fullPath: '/planes/$planId/asignaturas' - preLoaderRoute: typeof PlanesPlanIdAsignaturasRouteRouteImport - parentRoute: typeof rootRouteImport + parentRoute: typeof PlanesListaRoute } '/planes/$planId/_detalle': { id: '/planes/$planId/_detalle' path: '/planes/$planId' fullPath: '/planes/$planId' - preLoaderRoute: typeof PlanesPlanIdDetalleRouteRouteImport + preLoaderRoute: typeof PlanesPlanIdDetalleRouteImport parentRoute: typeof rootRouteImport } '/planes/$planId/_detalle/': { @@ -316,153 +291,115 @@ declare module '@tanstack/react-router' { path: '/' fullPath: '/planes/$planId/' preLoaderRoute: typeof PlanesPlanIdDetalleIndexRouteImport - parentRoute: typeof PlanesPlanIdDetalleRouteRoute + parentRoute: typeof PlanesPlanIdDetalleRoute + } + '/planes/$planId/asignaturas/$asignaturaId': { + id: '/planes/$planId/asignaturas/$asignaturaId' + path: '/planes/$planId/asignaturas/$asignaturaId' + fullPath: '/planes/$planId/asignaturas/$asignaturaId' + preLoaderRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRouteImport + parentRoute: typeof rootRouteImport } '/planes/$planId/_detalle/mapa': { id: '/planes/$planId/_detalle/mapa' path: '/mapa' fullPath: '/planes/$planId/mapa' preLoaderRoute: typeof PlanesPlanIdDetalleMapaRouteImport - parentRoute: typeof PlanesPlanIdDetalleRouteRoute + parentRoute: typeof PlanesPlanIdDetalleRoute } '/planes/$planId/_detalle/iaplan': { id: '/planes/$planId/_detalle/iaplan' path: '/iaplan' fullPath: '/planes/$planId/iaplan' preLoaderRoute: typeof PlanesPlanIdDetalleIaplanRouteImport - parentRoute: typeof PlanesPlanIdDetalleRouteRoute + parentRoute: typeof PlanesPlanIdDetalleRoute } '/planes/$planId/_detalle/historial': { id: '/planes/$planId/_detalle/historial' path: '/historial' fullPath: '/planes/$planId/historial' preLoaderRoute: typeof PlanesPlanIdDetalleHistorialRouteImport - parentRoute: typeof PlanesPlanIdDetalleRouteRoute + parentRoute: typeof PlanesPlanIdDetalleRoute } '/planes/$planId/_detalle/flujo': { id: '/planes/$planId/_detalle/flujo' path: '/flujo' fullPath: '/planes/$planId/flujo' preLoaderRoute: typeof PlanesPlanIdDetalleFlujoRouteImport - parentRoute: typeof PlanesPlanIdDetalleRouteRoute + parentRoute: typeof PlanesPlanIdDetalleRoute } '/planes/$planId/_detalle/documento': { id: '/planes/$planId/_detalle/documento' path: '/documento' fullPath: '/planes/$planId/documento' preLoaderRoute: typeof PlanesPlanIdDetalleDocumentoRouteImport - parentRoute: typeof PlanesPlanIdDetalleRouteRoute + parentRoute: typeof PlanesPlanIdDetalleRoute } - '/planes/$planId/_detalle/asignaturas': { - id: '/planes/$planId/_detalle/asignaturas' + '/planes/$planId/_detalle/asignaturas/': { + id: '/planes/$planId/_detalle/asignaturas/' path: '/asignaturas' - fullPath: '/planes/$planId/asignaturas' - preLoaderRoute: typeof PlanesPlanIdDetalleAsignaturasRouteImport - parentRoute: typeof PlanesPlanIdDetalleRouteRoute + fullPath: '/planes/$planId/asignaturas/' + preLoaderRoute: typeof PlanesPlanIdDetalleAsignaturasIndexRouteImport + parentRoute: typeof PlanesPlanIdDetalleRoute } - '/planes/$planId/asignaturas/_lista': { - id: '/planes/$planId/asignaturas/_lista' - path: '' - fullPath: '/planes/$planId/asignaturas' - preLoaderRoute: typeof PlanesPlanIdAsignaturasListaRouteRouteImport - parentRoute: typeof PlanesPlanIdAsignaturasRouteRoute - } - '/planes/$planId/asignaturas/$asignaturaId': { - id: '/planes/$planId/asignaturas/$asignaturaId' - path: '/$asignaturaId' - fullPath: '/planes/$planId/asignaturas/$asignaturaId' - preLoaderRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRouteImport - parentRoute: typeof PlanesPlanIdAsignaturasRouteRoute - } - '/planes/$planId/asignaturas/_lista/nueva': { - id: '/planes/$planId/asignaturas/_lista/nueva' - path: '/nueva' + '/planes/$planId/_detalle/asignaturas/nueva': { + id: '/planes/$planId/_detalle/asignaturas/nueva' + path: '/asignaturas/nueva' fullPath: '/planes/$planId/asignaturas/nueva' - preLoaderRoute: typeof PlanesPlanIdAsignaturasListaNuevaRouteImport - parentRoute: typeof PlanesPlanIdAsignaturasListaRouteRoute + preLoaderRoute: typeof PlanesPlanIdDetalleAsignaturasNuevaRouteImport + parentRoute: typeof PlanesPlanIdDetalleRoute } } } -interface PlanesListaRouteRouteChildren { +interface PlanesListaRouteChildren { PlanesListaNuevoRoute: typeof PlanesListaNuevoRoute } -const PlanesListaRouteRouteChildren: PlanesListaRouteRouteChildren = { +const PlanesListaRouteChildren: PlanesListaRouteChildren = { PlanesListaNuevoRoute: PlanesListaNuevoRoute, } -const PlanesListaRouteRouteWithChildren = - PlanesListaRouteRoute._addFileChildren(PlanesListaRouteRouteChildren) +const PlanesListaRouteWithChildren = PlanesListaRoute._addFileChildren( + PlanesListaRouteChildren, +) -interface PlanesPlanIdDetalleRouteRouteChildren { - PlanesPlanIdDetalleAsignaturasRoute: typeof PlanesPlanIdDetalleAsignaturasRoute +interface PlanesPlanIdDetalleRouteChildren { PlanesPlanIdDetalleDocumentoRoute: typeof PlanesPlanIdDetalleDocumentoRoute PlanesPlanIdDetalleFlujoRoute: typeof PlanesPlanIdDetalleFlujoRoute PlanesPlanIdDetalleHistorialRoute: typeof PlanesPlanIdDetalleHistorialRoute PlanesPlanIdDetalleIaplanRoute: typeof PlanesPlanIdDetalleIaplanRoute PlanesPlanIdDetalleMapaRoute: typeof PlanesPlanIdDetalleMapaRoute PlanesPlanIdDetalleIndexRoute: typeof PlanesPlanIdDetalleIndexRoute + PlanesPlanIdDetalleAsignaturasNuevaRoute: typeof PlanesPlanIdDetalleAsignaturasNuevaRoute + PlanesPlanIdDetalleAsignaturasIndexRoute: typeof PlanesPlanIdDetalleAsignaturasIndexRoute } -const PlanesPlanIdDetalleRouteRouteChildren: PlanesPlanIdDetalleRouteRouteChildren = - { - PlanesPlanIdDetalleAsignaturasRoute: PlanesPlanIdDetalleAsignaturasRoute, - PlanesPlanIdDetalleDocumentoRoute: PlanesPlanIdDetalleDocumentoRoute, - PlanesPlanIdDetalleFlujoRoute: PlanesPlanIdDetalleFlujoRoute, - PlanesPlanIdDetalleHistorialRoute: PlanesPlanIdDetalleHistorialRoute, - PlanesPlanIdDetalleIaplanRoute: PlanesPlanIdDetalleIaplanRoute, - PlanesPlanIdDetalleMapaRoute: PlanesPlanIdDetalleMapaRoute, - PlanesPlanIdDetalleIndexRoute: PlanesPlanIdDetalleIndexRoute, - } - -const PlanesPlanIdDetalleRouteRouteWithChildren = - PlanesPlanIdDetalleRouteRoute._addFileChildren( - PlanesPlanIdDetalleRouteRouteChildren, - ) - -interface PlanesPlanIdAsignaturasListaRouteRouteChildren { - PlanesPlanIdAsignaturasListaNuevaRoute: typeof PlanesPlanIdAsignaturasListaNuevaRoute +const PlanesPlanIdDetalleRouteChildren: PlanesPlanIdDetalleRouteChildren = { + PlanesPlanIdDetalleDocumentoRoute: PlanesPlanIdDetalleDocumentoRoute, + PlanesPlanIdDetalleFlujoRoute: PlanesPlanIdDetalleFlujoRoute, + PlanesPlanIdDetalleHistorialRoute: PlanesPlanIdDetalleHistorialRoute, + PlanesPlanIdDetalleIaplanRoute: PlanesPlanIdDetalleIaplanRoute, + PlanesPlanIdDetalleMapaRoute: PlanesPlanIdDetalleMapaRoute, + PlanesPlanIdDetalleIndexRoute: PlanesPlanIdDetalleIndexRoute, + PlanesPlanIdDetalleAsignaturasNuevaRoute: + PlanesPlanIdDetalleAsignaturasNuevaRoute, + PlanesPlanIdDetalleAsignaturasIndexRoute: + PlanesPlanIdDetalleAsignaturasIndexRoute, } -const PlanesPlanIdAsignaturasListaRouteRouteChildren: PlanesPlanIdAsignaturasListaRouteRouteChildren = - { - PlanesPlanIdAsignaturasListaNuevaRoute: - PlanesPlanIdAsignaturasListaNuevaRoute, - } - -const PlanesPlanIdAsignaturasListaRouteRouteWithChildren = - PlanesPlanIdAsignaturasListaRouteRoute._addFileChildren( - PlanesPlanIdAsignaturasListaRouteRouteChildren, - ) - -interface PlanesPlanIdAsignaturasRouteRouteChildren { - PlanesPlanIdAsignaturasAsignaturaIdRouteRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRoute - PlanesPlanIdAsignaturasListaRouteRoute: typeof PlanesPlanIdAsignaturasListaRouteRouteWithChildren -} - -const PlanesPlanIdAsignaturasRouteRouteChildren: PlanesPlanIdAsignaturasRouteRouteChildren = - { - PlanesPlanIdAsignaturasAsignaturaIdRouteRoute: - PlanesPlanIdAsignaturasAsignaturaIdRouteRoute, - PlanesPlanIdAsignaturasListaRouteRoute: - PlanesPlanIdAsignaturasListaRouteRouteWithChildren, - } - -const PlanesPlanIdAsignaturasRouteRouteWithChildren = - PlanesPlanIdAsignaturasRouteRoute._addFileChildren( - PlanesPlanIdAsignaturasRouteRouteChildren, - ) +const PlanesPlanIdDetalleRouteWithChildren = + PlanesPlanIdDetalleRoute._addFileChildren(PlanesPlanIdDetalleRouteChildren) const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, DashboardRoute: DashboardRoute, LoginRoute: LoginRoute, - PlanesListaRouteRoute: PlanesListaRouteRouteWithChildren, DemoTanstackQueryRoute: DemoTanstackQueryRoute, - PlanesPlanIdDetalleRouteRoute: PlanesPlanIdDetalleRouteRouteWithChildren, - PlanesPlanIdAsignaturasRouteRoute: - PlanesPlanIdAsignaturasRouteRouteWithChildren, + PlanesListaRoute: PlanesListaRouteWithChildren, + PlanesPlanIdDetalleRoute: PlanesPlanIdDetalleRouteWithChildren, + PlanesPlanIdAsignaturasAsignaturaIdRoute: + PlanesPlanIdAsignaturasAsignaturaIdRoute, } export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) diff --git a/src/routes/planes/$planId/_detalle/route.tsx b/src/routes/planes/$planId/_detalle.tsx similarity index 99% rename from src/routes/planes/$planId/_detalle/route.tsx rename to src/routes/planes/$planId/_detalle.tsx index bd774ee..372909e 100644 --- a/src/routes/planes/$planId/_detalle/route.tsx +++ b/src/routes/planes/$planId/_detalle.tsx @@ -35,6 +35,8 @@ export const Route = createFileRoute('/planes/$planId/_detalle')({ } catch (e: any) { // PGRST116: The result contains 0 rows if (e?.code === 'PGRST116') { + console.log('not found on', Route.path) + throw notFound() } throw e diff --git a/src/routes/planes/$planId/_detalle/asignaturas.tsx b/src/routes/planes/$planId/_detalle/asignaturas/index.tsx similarity index 95% rename from src/routes/planes/$planId/_detalle/asignaturas.tsx rename to src/routes/planes/$planId/_detalle/asignaturas/index.tsx index 0128351..d2fbc59 100644 --- a/src/routes/planes/$planId/_detalle/asignaturas.tsx +++ b/src/routes/planes/$planId/_detalle/asignaturas/index.tsx @@ -131,7 +131,17 @@ function AsignaturasPage() { -
diff --git a/src/routes/planes/$planId/asignaturas/_lista/nueva.tsx b/src/routes/planes/$planId/_detalle/asignaturas/nueva.tsx similarity index 80% rename from src/routes/planes/$planId/asignaturas/_lista/nueva.tsx rename to src/routes/planes/$planId/_detalle/asignaturas/nueva.tsx index e5c797b..51dedb2 100644 --- a/src/routes/planes/$planId/asignaturas/_lista/nueva.tsx +++ b/src/routes/planes/$planId/_detalle/asignaturas/nueva.tsx @@ -3,12 +3,13 @@ import { createFileRoute } from '@tanstack/react-router' import { NuevaAsignaturaModalContainer } from '@/features/asignaturas/nueva/NuevaAsignaturaModalContainer' export const Route = createFileRoute( - '/planes/$planId/asignaturas/_lista/nueva', + '/planes/$planId/_detalle/asignaturas/nueva', )({ component: NuevaAsignaturaModal, }) function NuevaAsignaturaModal() { const { planId } = Route.useParams() + console.log('planId desde nueva', planId) return } diff --git a/src/routes/planes/$planId/asignaturas/$asignaturaId.tsx b/src/routes/planes/$planId/asignaturas/$asignaturaId.tsx new file mode 100644 index 0000000..6a9a5d6 --- /dev/null +++ b/src/routes/planes/$planId/asignaturas/$asignaturaId.tsx @@ -0,0 +1,44 @@ +import { createFileRoute, notFound } from '@tanstack/react-router' + +import MateriaDetailPage from '@/components/asignaturas/detalle/MateriaDetailPage' +import { NotFoundPage } from '@/components/ui/NotFoundPage' +import { subjects_get } from '@/data/api/subjects.api' +import { qk } from '@/data/query/keys' + +export const Route = createFileRoute( + '/planes/$planId/asignaturas/$asignaturaId', +)({ + loader: async ({ context: { queryClient }, params: { asignaturaId } }) => { + try { + await queryClient.ensureQueryData({ + queryKey: qk.asignatura(asignaturaId), + queryFn: () => subjects_get(asignaturaId), + }) + } catch (e: any) { + // PGRST116: The result contains 0 rows (Supabase Single response error) + if (e?.code === 'PGRST116') { + throw notFound() + } + throw e + } + }, + notFoundComponent: () => { + return ( + + ) + }, + component: RouteComponent, +}) + +function RouteComponent() { + // const { planId, asignaturaId } = Route.useParams() + + return ( +
+ +
+ ) +} diff --git a/src/routes/planes/$planId/asignaturas/$asignaturaId/route.tsx b/src/routes/planes/$planId/asignaturas/$asignaturaId/route.tsx deleted file mode 100644 index cc36bf7..0000000 --- a/src/routes/planes/$planId/asignaturas/$asignaturaId/route.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import AsignaturaDetailPage from '@/components/asignaturas/detalle/AsignaturaDetailPage' -import { createFileRoute } from '@tanstack/react-router' - -export const Route = createFileRoute( - '/planes/$planId/asignaturas/$asignaturaId', -)({ - component: RouteComponent, -}) - -function RouteComponent() { - //const { planId, asignaturaId } = Route.useParams() - - return ( -
- -
- ) -} diff --git a/src/routes/planes/$planId/asignaturas/_lista/route.tsx b/src/routes/planes/$planId/asignaturas/_lista/route.tsx deleted file mode 100644 index 980020f..0000000 --- a/src/routes/planes/$planId/asignaturas/_lista/route.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { createFileRoute, Outlet } from '@tanstack/react-router' - -export const Route = createFileRoute('/planes/$planId/asignaturas/_lista')({ - component: RouteComponent, -}) - -function RouteComponent() { - return ( -
-
-

Asignaturas

- -
-
- ) -} diff --git a/src/routes/planes/$planId/asignaturas/route.tsx b/src/routes/planes/$planId/asignaturas/route.tsx deleted file mode 100644 index 88a1ef2..0000000 --- a/src/routes/planes/$planId/asignaturas/route.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { createFileRoute, Outlet, notFound } from '@tanstack/react-router' - -import { NotFoundPage } from '@/components/ui/NotFoundPage' -import { plans_get } from '@/data/api/plans.api' -import { qk } from '@/data/query/keys' - -export const Route = createFileRoute('/planes/$planId/asignaturas')({ - loader: async ({ context: { queryClient }, params: { planId } }) => { - try { - await queryClient.ensureQueryData({ - queryKey: qk.plan(planId), - queryFn: () => plans_get(planId), - }) - } catch (e: any) { - if (e?.code === 'PGRST116') { - throw notFound() - } - throw e - } - }, - notFoundComponent: () => { - return ( - - ) - }, - component: AsignaturasLayout, -}) - -function AsignaturasLayout() { - return -} diff --git a/src/routes/planes/_lista/route.tsx b/src/routes/planes/_lista.tsx similarity index 98% rename from src/routes/planes/_lista/route.tsx rename to src/routes/planes/_lista.tsx index 944f6ac..f58283c 100644 --- a/src/routes/planes/_lista/route.tsx +++ b/src/routes/planes/_lista.tsx @@ -125,7 +125,11 @@ function RouteComponent() {
+ + {!isLast ? ( - - {!isLast ? ( - - ) : ( - - )} - + ) : ( + + )} ) diff --git a/src/components/wizard/StepWithTooltip.tsx b/src/components/wizard/StepWithTooltip.tsx new file mode 100644 index 0000000..44f8e6e --- /dev/null +++ b/src/components/wizard/StepWithTooltip.tsx @@ -0,0 +1,41 @@ +import { useState } from 'react' + +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@/components/ui/tooltip' + +export function StepWithTooltip({ + title, + desc, +}: { + title: string + desc: string +}) { + const [isOpen, setIsOpen] = useState(false) + + return ( + + + + { + e.stopPropagation() + setIsOpen((prev) => !prev) + }} + onMouseEnter={() => setIsOpen(true)} + onMouseLeave={() => setIsOpen(false)} + > + {title} + + + +

{desc}

+
+
+
+ ) +} diff --git a/src/components/wizard/WizardLayout.tsx b/src/components/wizard/WizardLayout.tsx new file mode 100644 index 0000000..96fb1a5 --- /dev/null +++ b/src/components/wizard/WizardLayout.tsx @@ -0,0 +1,52 @@ +import * as Icons from 'lucide-react' + +import { CardHeader, CardTitle } from '@/components/ui/card' +import { Dialog, DialogContent } from '@/components/ui/dialog' + +export function WizardLayout({ + title, + onClose, + headerSlot, + footerSlot, + children, +}: { + title: string + onClose: () => void + headerSlot?: React.ReactNode + footerSlot?: React.ReactNode + children: React.ReactNode +}) { + return ( + !open && onClose()}> + { + e.preventDefault() + }} + > +
+ + {title} + + + + {headerSlot ?
{headerSlot}
: null} +
+ +
+ {children} +
+ + {footerSlot ? ( +
{footerSlot}
+ ) : null} +
+
+ ) +} diff --git a/src/components/wizard/WizardResponsiveHeader.tsx b/src/components/wizard/WizardResponsiveHeader.tsx new file mode 100644 index 0000000..7766e13 --- /dev/null +++ b/src/components/wizard/WizardResponsiveHeader.tsx @@ -0,0 +1,59 @@ +import { CircularProgress } from '@/components/CircularProgress' +import { StepWithTooltip } from '@/components/wizard/StepWithTooltip' + +export function WizardResponsiveHeader({ + wizard, + methods, +}: { + wizard: any + methods: any +}) { + const idx = wizard.utils.getIndex(methods.current.id) + const totalSteps = wizard.steps.length + const currentIndex = idx + 1 + const hasNextStep = idx < totalSteps - 1 + const nextStep = wizard.steps[currentIndex] + + return ( + <> +
+
+ +
+

+ +

+ {hasNextStep && nextStep ? ( +

+ Siguiente: {nextStep.title} +

+ ) : ( +

+ ¡Último paso! +

+ )} +
+
+
+ +
+ + {wizard.steps.map((step: any) => ( + + + + + + ))} + +
+ + ) +} diff --git a/src/features/asignaturas/nueva/NuevaAsignaturaModalContainer.tsx b/src/features/asignaturas/nueva/NuevaAsignaturaModalContainer.tsx index e7b9fe0..23758c8 100644 --- a/src/features/asignaturas/nueva/NuevaAsignaturaModalContainer.tsx +++ b/src/features/asignaturas/nueva/NuevaAsignaturaModalContainer.tsx @@ -1,4 +1,5 @@ import { useNavigate } from '@tanstack/react-router' +import * as Icons from 'lucide-react' import { useNuevaAsignaturaWizard } from './hooks/useNuevaAsignaturaWizard' @@ -6,13 +7,20 @@ import { PasoBasicosForm } from '@/components/asignaturas/wizard/PasoBasicosForm import { PasoConfiguracionPanel } from '@/components/asignaturas/wizard/PasoConfiguracionPanel' import { PasoMetodoCardGroup } from '@/components/asignaturas/wizard/PasoMetodoCardGroup' import { PasoResumenCard } from '@/components/asignaturas/wizard/PasoResumenCard' -import { VistaSinPermisos } from '@/components/asignaturas/wizard/VistaSinPermisos' import { WizardControls } from '@/components/asignaturas/wizard/WizardControls' -import { WizardHeader } from '@/components/asignaturas/wizard/WizardHeader' import { defineStepper } from '@/components/stepper' -import { Dialog, DialogContent } from '@/components/ui/dialog' +import { Button } from '@/components/ui/button' +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@/components/ui/card' +import { WizardLayout } from '@/components/wizard/WizardLayout' +import { WizardResponsiveHeader } from '@/components/wizard/WizardResponsiveHeader' -const auth_get_current_user_role = () => 'JEFE_CARRERA' as const +const auth_get_current_user_role = (): string => 'JEFE_CARRERA' const Wizard = defineStepper( { @@ -55,85 +63,90 @@ export function NuevaAsignaturaModalContainer({ planId }: { planId: string }) { navigate({ to: `/planes/${planId}/asignaturas`, resetScroll: false }) } + if (role !== 'JEFE_CARRERA') { + return ( + + + + + + Sin permisos + + + Solo el Jefe de Carrera puede crear asignaturas. + + + + + + + + ) + } + return ( - !open && handleClose()}> - e.preventDefault()} - > - {role !== 'JEFE_CARRERA' ? ( - - ) : ( - + {({ methods }) => { + const idx = Wizard.utils.getIndex(methods.current.id) + + return ( + + } + footerSlot={ + + crearAsignatura(handleClose)} + /> + + } > - {({ methods }) => { - const currentIndex = Wizard.utils.getIndex(methods.current.id) + 1 - const totalSteps = Wizard.steps.length - const nextStep = Wizard.steps[currentIndex] ?? { - title: '', - description: '', - } +
+ {idx === 0 && ( + + + + )} - return ( - <> - + {idx === 1 && ( + + + + )} -
-
- {Wizard.utils.getIndex(methods.current.id) === 0 && ( - - - - )} - {Wizard.utils.getIndex(methods.current.id) === 1 && ( - - - - )} - {Wizard.utils.getIndex(methods.current.id) === 2 && ( - - - - )} - {Wizard.utils.getIndex(methods.current.id) === 3 && ( - - - - )} -
-
- - + crearAsignatura(handleClose)} + onChange={setWizard} + onGenerarIA={simularGeneracionIA} /> - - ) - }} - - )} - -
+ + )} + + {idx === 3 && ( + + + + )} + + + ) + }} + ) } diff --git a/src/features/planes/nuevo/NuevoPlanModalContainer.tsx b/src/features/planes/nuevo/NuevoPlanModalContainer.tsx index 41062e2..609df22 100644 --- a/src/features/planes/nuevo/NuevoPlanModalContainer.tsx +++ b/src/features/planes/nuevo/NuevoPlanModalContainer.tsx @@ -10,7 +10,6 @@ import { PasoDetallesPanel } from '@/components/planes/wizard/PasoDetallesPanel/ import { PasoModoCardGroup } from '@/components/planes/wizard/PasoModoCardGroup' import { PasoResumenCard } from '@/components/planes/wizard/PasoResumenCard' import { WizardControls } from '@/components/planes/wizard/WizardControls' -import { WizardHeader } from '@/components/planes/wizard/WizardHeader' import { defineStepper } from '@/components/stepper' import { Card, @@ -19,16 +18,12 @@ import { CardHeader, CardTitle, } from '@/components/ui/card' -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, -} from '@/components/ui/dialog' +import { WizardLayout } from '@/components/wizard/WizardLayout' +import { WizardResponsiveHeader } from '@/components/wizard/WizardResponsiveHeader' // import { useGeneratePlanAI } from '@/data/hooks/usePlans' // Mock de permisos/rol -const auth_get_current_user_role = () => 'JEFE_CARRERA' as const +const auth_get_current_user_role = (): string => 'JEFE_CARRERA' const Wizard = defineStepper( { @@ -64,136 +59,97 @@ export default function NuevoPlanModalContainer() { // Crear plan: ahora la lógica vive en WizardControls + if (role !== 'JEFE_CARRERA') { + return ( + + + + + + Sin permisos + + + No tienes permisos para crear planes de estudio. + + + + + + + + ) + } + return ( - !open && handleClose()}> - { - e.preventDefault() - }} - > - {role !== 'JEFE_CARRERA' ? ( - <> - - Nuevo plan de estudios - -
- - - - - Sin permisos - - - No tienes permisos para crear planes de estudio. - - - - - - -
- - ) : ( - + {({ methods }) => { + const idx = Wizard.utils.getIndex(methods.current.id) + + return ( + + } + footerSlot={ + + methods.prev()} + onNext={() => methods.next()} + disablePrev={idx === 0 || wizard.isLoading} + disableNext={ + wizard.isLoading || + (idx === 0 && !canContinueDesdeModo) || + (idx === 1 && !canContinueDesdeBasicos) || + (idx === 2 && !canContinueDesdeDetalles) + } + disableCreate={wizard.isLoading} + isLastStep={idx >= Wizard.steps.length - 1} + wizard={wizard} + setWizard={setWizard} + /> + + } > - {({ methods }) => { - const currentIndex = Wizard.utils.getIndex(methods.current.id) + 1 - const totalSteps = Wizard.steps.length - const nextStep = Wizard.steps[currentIndex] ?? { - title: '', - description: '', - } - - return ( - <> - + {idx === 0 && ( + + + + )} + {idx === 1 && ( + + + + )} + {idx === 2 && ( + + - -
-
- {Wizard.utils.getIndex(methods.current.id) === 0 && ( - - - - )} - {Wizard.utils.getIndex(methods.current.id) === 1 && ( - - - - )} - {Wizard.utils.getIndex(methods.current.id) === 2 && ( - - - - )} - {Wizard.utils.getIndex(methods.current.id) === 3 && ( - - - - )} -
-
- -
- - methods.prev()} - onNext={() => methods.next()} - disablePrev={ - Wizard.utils.getIndex(methods.current.id) === 0 || - wizard.isLoading - } - disableNext={ - wizard.isLoading || - (Wizard.utils.getIndex(methods.current.id) === 0 && - !canContinueDesdeModo) || - (Wizard.utils.getIndex(methods.current.id) === 1 && - !canContinueDesdeBasicos) || - (Wizard.utils.getIndex(methods.current.id) === 2 && - !canContinueDesdeDetalles) - } - disableCreate={wizard.isLoading} - isLastStep={ - Wizard.utils.getIndex(methods.current.id) >= - Wizard.steps.length - 1 - } - wizard={wizard} - setWizard={setWizard} - /> - -
- - ) - }} -
- )} -
-
+ + )} + {idx === 3 && ( + + + + )} + + + ) + }} + ) } From 1acb18711ff5fbd7cf86b2e92e44b2b64b26eae0 Mon Sep 17 00:00:00 2001 From: Guillermo Arrieta Medina Date: Tue, 3 Feb 2026 15:10:09 -0600 Subject: [PATCH 7/7] =?UTF-8?q?Reintegraci=C3=B3n=20con=20main.=20Correcci?= =?UTF-8?q?=C3=B3n=20de=20errores=20de=20fetch.=20Sincronizaci=C3=B3n=20co?= =?UTF-8?q?n=20la=20base=20de=20datos=20remota?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/api/plans.api.ts | 2 +- src/data/api/subjects.api.ts | 20 +- .../$planId/_detalle/asignaturas/index.tsx | 34 +- .../$planId/asignaturas/$asignaturaId.tsx | 4 +- src/types/supabase.ts | 2079 +++++++++-------- 5 files changed, 1086 insertions(+), 1053 deletions(-) diff --git a/src/data/api/plans.api.ts b/src/data/api/plans.api.ts index ff40312..206f25c 100644 --- a/src/data/api/plans.api.ts +++ b/src/data/api/plans.api.ts @@ -165,7 +165,7 @@ export async function plan_asignaturas_list( const { data, error } = await supabase .from('asignaturas') .select( - 'id,plan_estudio_id,estructura_id,facultad_propietaria_id,codigo,nombre,tipo,creditos,horas_semana,numero_ciclo,linea_plan_id,orden_celda,datos,contenido_tematico,tipo_origen,meta_origen,creado_por,actualizado_por,creado_en,actualizado_en', + 'id,plan_estudio_id,estructura_id,codigo,nombre,tipo,creditos,horas_independientes,horas_academicas,numero_ciclo,linea_plan_id,orden_celda,datos,contenido_tematico,tipo_origen,meta_origen,creado_por,actualizado_por,creado_en,actualizado_en', ) .eq('plan_estudio_id', planId) .order('numero_ciclo', { ascending: true, nullsFirst: false }) diff --git a/src/data/api/subjects.api.ts b/src/data/api/subjects.api.ts index cfd6a67..3754ef6 100644 --- a/src/data/api/subjects.api.ts +++ b/src/data/api/subjects.api.ts @@ -1,6 +1,9 @@ import { supabaseBrowser } from '../supabase/client' import { invokeEdge } from '../supabase/invokeEdge' + import { throwIfError, requireData } from './_helpers' + +import type { DocumentoResult } from './plans.api' import type { Asignatura, BibliografiaAsignatura, @@ -8,7 +11,6 @@ import type { TipoAsignatura, UUID, } from '../types/domain' -import type { DocumentoResult } from './plans.api' const EDGE = { subjects_create_manual: 'subjects_create_manual', @@ -32,7 +34,7 @@ export async function subjects_get(subjectId: UUID): Promise { .from('asignaturas') .select( ` - id,plan_estudio_id,estructura_id,facultad_propietaria_id,codigo,nombre,tipo,creditos,horas_semana,numero_ciclo,linea_plan_id,orden_celda,datos,contenido_tematico,tipo_origen,meta_origen,creado_por,actualizado_por,creado_en,actualizado_en, + id,plan_estudio_id,estructura_id,codigo,nombre,tipo,creditos,horas_independientes,horas_academicas,numero_ciclo,linea_plan_id,orden_celda,datos,contenido_tematico,tipo_origen,meta_origen,creado_por,actualizado_por,creado_en,actualizado_en, planes_estudio( id,carrera_id,estructura_id,nombre,nivel,tipo_ciclo,numero_ciclos,datos,estado_actual_id,activo,tipo_origen,meta_origen,creado_por,actualizado_por,creado_en,actualizado_en, carreras(id,facultad_id,nombre,nombre_corto,clave_sep,activa, facultades(id,nombre,nombre_corto,color,icono)) @@ -49,7 +51,7 @@ export async function subjects_get(subjectId: UUID): Promise { export async function subjects_history( subjectId: UUID, -): Promise { +): Promise> { const supabase = supabaseBrowser() const { data, error } = await supabase .from('cambios_asignatura') @@ -65,7 +67,7 @@ export async function subjects_history( export async function subjects_bibliografia_list( subjectId: UUID, -): Promise { +): Promise> { const supabase = supabaseBrowser() const { data, error } = await supabase .from('bibliografia_asignatura') @@ -112,9 +114,9 @@ export async function ai_generate_subject(payload: { iaConfig: { descripcionEnfoque: string notasAdicionales?: string - archivosExistentesIds?: UUID[] - repositoriosIds?: UUID[] - archivosAdhocIds?: UUID[] + archivosExistentesIds?: Array + repositoriosIds?: Array + archivosAdhocIds?: Array usarMCP?: boolean } }): Promise { @@ -145,7 +147,7 @@ export async function subjects_clone_from_existing(payload: { export async function subjects_import_from_file(payload: { planId: UUID archivoWordAsignaturaId: UUID - archivosAdicionalesIds?: UUID[] + archivosAdicionalesIds?: Array }): Promise { return invokeEdge(EDGE.subjects_import_from_file, payload) } @@ -175,7 +177,7 @@ export async function subjects_update_fields( export async function subjects_update_contenido( subjectId: UUID, - unidades: any[], + unidades: Array, ): Promise { return invokeEdge(EDGE.subjects_update_contenido, { subjectId, diff --git a/src/routes/planes/$planId/_detalle/asignaturas/index.tsx b/src/routes/planes/$planId/_detalle/asignaturas/index.tsx index d2fbc59..4e9aade 100644 --- a/src/routes/planes/$planId/_detalle/asignaturas/index.tsx +++ b/src/routes/planes/$planId/_detalle/asignaturas/index.tsx @@ -10,7 +10,7 @@ import { } from 'lucide-react' import { useState, useMemo } from 'react' -import type { Asignatura } from '@/types/plan' +import type { Asignatura, AsignaturaStatus, TipoAsignatura } from '@/types/plan' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' @@ -33,17 +33,24 @@ import { import { usePlanAsignaturas, usePlanLineas } from '@/data' // --- Configuración de Estilos --- -const statusConfig: Record = { +const statusConfig: Record< + AsignaturaStatus, + { label: string; className: string } +> = { borrador: { label: 'Borrador', className: 'bg-slate-100 text-slate-600' }, revisada: { label: 'Revisada', className: 'bg-amber-100 text-amber-700' }, aprobada: { label: 'Aprobada', className: 'bg-emerald-100 text-emerald-700' }, } -const tipoConfig: Record = { - obligatoria: { label: 'Obligatoria', className: 'bg-blue-100 text-blue-700' }, - optativa: { label: 'Optativa', className: 'bg-purple-100 text-purple-700' }, - troncal: { label: 'Troncal', className: 'bg-slate-100 text-slate-700' }, -} +const tipoConfig: Record = + { + obligatoria: { + label: 'Obligatoria', + className: 'bg-blue-100 text-blue-700', + }, + optativa: { label: 'Optativa', className: 'bg-purple-100 text-purple-700' }, + troncal: { label: 'Troncal', className: 'bg-slate-100 text-slate-700' }, + } // --- Mapeadores de API --- const mapAsignaturas = (asigApi: Array = []): Array => { @@ -59,10 +66,13 @@ const mapAsignaturas = (asigApi: Array = []): Array => { estado: 'borrador', // O el campo que venga de tu API hd: Math.floor((asig.horas_semana ?? 0) / 2), hi: Math.ceil((asig.horas_semana ?? 0) / 2), + prerrequisitos: Array.isArray(asig.prerrequisitos) + ? asig.prerrequisitos + : [], })) } -export const Route = createFileRoute('/planes/$planId/_detalle/asignaturas')({ +export const Route = createFileRoute('/planes/$planId/_detalle/asignaturas/')({ component: AsignaturasPage, }) @@ -272,17 +282,17 @@ function AsignaturasPage() { - {tipoConfig[asignatura.tipo]?.label} + {tipoConfig[asignatura.tipo].label} - {statusConfig[asignatura.estado]?.label} + {statusConfig[asignatura.estado].label} diff --git a/src/routes/planes/$planId/asignaturas/$asignaturaId.tsx b/src/routes/planes/$planId/asignaturas/$asignaturaId.tsx index 6a9a5d6..bfa039d 100644 --- a/src/routes/planes/$planId/asignaturas/$asignaturaId.tsx +++ b/src/routes/planes/$planId/asignaturas/$asignaturaId.tsx @@ -1,6 +1,6 @@ import { createFileRoute, notFound } from '@tanstack/react-router' -import MateriaDetailPage from '@/components/asignaturas/detalle/MateriaDetailPage' +import AsignaturaDetailPage from '@/components/asignaturas/detalle/AsignaturaDetailPage' import { NotFoundPage } from '@/components/ui/NotFoundPage' import { subjects_get } from '@/data/api/subjects.api' import { qk } from '@/data/query/keys' @@ -38,7 +38,7 @@ function RouteComponent() { return (
- +
) } diff --git a/src/types/supabase.ts b/src/types/supabase.ts index 5a68cce..48e2cc9 100644 --- a/src/types/supabase.ts +++ b/src/types/supabase.ts @@ -4,1234 +4,1253 @@ export type Json = | boolean | null | { [key: string]: Json | undefined } - | Array; + | Array export type Database = { // Allows to automatically instantiate createClient with right options // instead of createClient(URL, KEY) __InternalSupabase: { - PostgrestVersion: "12.2.3 (519615d)"; - }; + PostgrestVersion: '12.2.3 (519615d)' + } graphql_public: { Tables: { - [_ in never]: never; - }; + [_ in never]: never + } Views: { - [_ in never]: never; - }; + [_ in never]: never + } Functions: { graphql: { Args: { - extensions?: Json; - operationName?: string; - query?: string; - variables?: Json; - }; - Returns: Json; - }; - }; + extensions?: Json + operationName?: string + query?: string + variables?: Json + } + Returns: Json + } + } Enums: { - [_ in never]: never; - }; + [_ in never]: never + } CompositeTypes: { - [_ in never]: never; - }; - }; + [_ in never]: never + } + } public: { Tables: { archivos: { Row: { - bytes: number | null; - id: string; - mime_type: string | null; - nombre: string; - notas: string | null; - openai_file_id: string | null; - ruta_storage: string; - subido_en: string; - subido_por: string | null; - temporal: boolean; - }; + bytes: number | null + id: string + mime_type: string | null + nombre: string + notas: string | null + openai_file_id: string | null + ruta_storage: string + subido_en: string + subido_por: string | null + temporal: boolean + } Insert: { - bytes?: number | null; - id?: string; - mime_type?: string | null; - nombre: string; - notas?: string | null; - openai_file_id?: string | null; - ruta_storage: string; - subido_en?: string; - subido_por?: string | null; - temporal?: boolean; - }; + bytes?: number | null + id?: string + mime_type?: string | null + nombre: string + notas?: string | null + openai_file_id?: string | null + ruta_storage: string + subido_en?: string + subido_por?: string | null + temporal?: boolean + } Update: { - bytes?: number | null; - id?: string; - mime_type?: string | null; - nombre?: string; - notas?: string | null; - openai_file_id?: string | null; - ruta_storage?: string; - subido_en?: string; - subido_por?: string | null; - temporal?: boolean; - }; + bytes?: number | null + id?: string + mime_type?: string | null + nombre?: string + notas?: string | null + openai_file_id?: string | null + ruta_storage?: string + subido_en?: string + subido_por?: string | null + temporal?: boolean + } Relationships: [ { - foreignKeyName: "archivos_subido_por_fkey"; - columns: ["subido_por"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'archivos_subido_por_fkey' + columns: ['subido_por'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, - ]; - }; + ] + } asignaturas: { Row: { - actualizado_en: string; - actualizado_por: string | null; - codigo: string | null; - contenido_tematico: Json; - creado_en: string; - creado_por: string | null; - creditos: number; - datos: Json; - estructura_id: string | null; - facultad_propietaria_id: string | null; - horas_semana: number | null; - id: string; - linea_plan_id: string | null; - meta_origen: Json; - nombre: string; - numero_ciclo: number | null; - orden_celda: number | null; - plan_estudio_id: string; - tipo: Database["public"]["Enums"]["tipo_asignatura"]; - tipo_origen: Database["public"]["Enums"]["tipo_origen"] | null; - }; + actualizado_en: string + actualizado_por: string | null + asignatura_hash: string | null + codigo: string | null + contenido_tematico: Json + creado_en: string + creado_por: string | null + creditos: number + datos: Json + estructura_id: string | null + horas_academicas: number | null + horas_independientes: number | null + id: string + linea_plan_id: string | null + meta_origen: Json + nombre: string + numero_ciclo: number | null + orden_celda: number | null + plan_estudio_id: string + tipo: Database['public']['Enums']['tipo_asignatura'] + tipo_origen: Database['public']['Enums']['tipo_origen'] | null + } Insert: { - actualizado_en?: string; - actualizado_por?: string | null; - codigo?: string | null; - contenido_tematico?: Json; - creado_en?: string; - creado_por?: string | null; - creditos: number; - datos?: Json; - estructura_id?: string | null; - facultad_propietaria_id?: string | null; - horas_semana?: number | null; - id?: string; - linea_plan_id?: string | null; - meta_origen?: Json; - nombre: string; - numero_ciclo?: number | null; - orden_celda?: number | null; - plan_estudio_id: string; - tipo?: Database["public"]["Enums"]["tipo_asignatura"]; - tipo_origen?: Database["public"]["Enums"]["tipo_origen"] | null; - }; + actualizado_en?: string + actualizado_por?: string | null + asignatura_hash?: string | null + codigo?: string | null + contenido_tematico?: Json + creado_en?: string + creado_por?: string | null + creditos: number + datos?: Json + estructura_id?: string | null + horas_academicas?: number | null + horas_independientes?: number | null + id?: string + linea_plan_id?: string | null + meta_origen?: Json + nombre: string + numero_ciclo?: number | null + orden_celda?: number | null + plan_estudio_id: string + tipo?: Database['public']['Enums']['tipo_asignatura'] + tipo_origen?: Database['public']['Enums']['tipo_origen'] | null + } Update: { - actualizado_en?: string; - actualizado_por?: string | null; - codigo?: string | null; - contenido_tematico?: Json; - creado_en?: string; - creado_por?: string | null; - creditos?: number; - datos?: Json; - estructura_id?: string | null; - facultad_propietaria_id?: string | null; - horas_semana?: number | null; - id?: string; - linea_plan_id?: string | null; - meta_origen?: Json; - nombre?: string; - numero_ciclo?: number | null; - orden_celda?: number | null; - plan_estudio_id?: string; - tipo?: Database["public"]["Enums"]["tipo_asignatura"]; - tipo_origen?: Database["public"]["Enums"]["tipo_origen"] | null; - }; + actualizado_en?: string + actualizado_por?: string | null + asignatura_hash?: string | null + codigo?: string | null + contenido_tematico?: Json + creado_en?: string + creado_por?: string | null + creditos?: number + datos?: Json + estructura_id?: string | null + horas_academicas?: number | null + horas_independientes?: number | null + id?: string + linea_plan_id?: string | null + meta_origen?: Json + nombre?: string + numero_ciclo?: number | null + orden_celda?: number | null + plan_estudio_id?: string + tipo?: Database['public']['Enums']['tipo_asignatura'] + tipo_origen?: Database['public']['Enums']['tipo_origen'] | null + } Relationships: [ { - foreignKeyName: "asignaturas_actualizado_por_fkey"; - columns: ["actualizado_por"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'asignaturas_actualizado_por_fkey' + columns: ['actualizado_por'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, { - foreignKeyName: "asignaturas_creado_por_fkey"; - columns: ["creado_por"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'asignaturas_creado_por_fkey' + columns: ['creado_por'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, { - foreignKeyName: "asignaturas_estructura_id_fkey"; - columns: ["estructura_id"]; - isOneToOne: false; - referencedRelation: "estructuras_asignatura"; - referencedColumns: ["id"]; + foreignKeyName: 'asignaturas_estructura_id_fkey' + columns: ['estructura_id'] + isOneToOne: false + referencedRelation: 'estructuras_asignatura' + referencedColumns: ['id'] }, { - foreignKeyName: "asignaturas_facultad_propietaria_id_fkey"; - columns: ["facultad_propietaria_id"]; - isOneToOne: false; - referencedRelation: "facultades"; - referencedColumns: ["id"]; + foreignKeyName: 'asignaturas_linea_plan_fk_compuesta' + columns: ['linea_plan_id', 'plan_estudio_id'] + isOneToOne: false + referencedRelation: 'lineas_plan' + referencedColumns: ['id', 'plan_estudio_id'] }, { - foreignKeyName: "asignaturas_linea_plan_fk_compuesta"; - columns: ["linea_plan_id", "plan_estudio_id"]; - isOneToOne: false; - referencedRelation: "lineas_plan"; - referencedColumns: ["id", "plan_estudio_id"]; + foreignKeyName: 'asignaturas_plan_estudio_id_fkey' + columns: ['plan_estudio_id'] + isOneToOne: false + referencedRelation: 'planes_estudio' + referencedColumns: ['id'] }, { - foreignKeyName: "asignaturas_plan_estudio_id_fkey"; - columns: ["plan_estudio_id"]; - isOneToOne: false; - referencedRelation: "planes_estudio"; - referencedColumns: ["id"]; + foreignKeyName: 'asignaturas_plan_estudio_id_fkey' + columns: ['plan_estudio_id'] + isOneToOne: false + referencedRelation: 'plantilla_plan' + referencedColumns: ['plan_estudio_id'] }, - ]; - }; + ] + } bibliografia_asignatura: { Row: { - actualizado_en: string; - asignatura_id: string; - biblioteca_item_id: string | null; - cita: string; - creado_en: string; - creado_por: string | null; - id: string; - tipo: Database["public"]["Enums"]["tipo_bibliografia"]; - tipo_fuente: Database["public"]["Enums"]["tipo_fuente_bibliografia"]; - }; + actualizado_en: string + asignatura_id: string + biblioteca_item_id: string | null + cita: string + creado_en: string + creado_por: string | null + id: string + tipo: Database['public']['Enums']['tipo_bibliografia'] + tipo_fuente: Database['public']['Enums']['tipo_fuente_bibliografia'] + } Insert: { - actualizado_en?: string; - asignatura_id: string; - biblioteca_item_id?: string | null; - cita: string; - creado_en?: string; - creado_por?: string | null; - id?: string; - tipo: Database["public"]["Enums"]["tipo_bibliografia"]; - tipo_fuente?: Database["public"]["Enums"]["tipo_fuente_bibliografia"]; - }; + actualizado_en?: string + asignatura_id: string + biblioteca_item_id?: string | null + cita: string + creado_en?: string + creado_por?: string | null + id?: string + tipo: Database['public']['Enums']['tipo_bibliografia'] + tipo_fuente?: Database['public']['Enums']['tipo_fuente_bibliografia'] + } Update: { - actualizado_en?: string; - asignatura_id?: string; - biblioteca_item_id?: string | null; - cita?: string; - creado_en?: string; - creado_por?: string | null; - id?: string; - tipo?: Database["public"]["Enums"]["tipo_bibliografia"]; - tipo_fuente?: Database["public"]["Enums"]["tipo_fuente_bibliografia"]; - }; + actualizado_en?: string + asignatura_id?: string + biblioteca_item_id?: string | null + cita?: string + creado_en?: string + creado_por?: string | null + id?: string + tipo?: Database['public']['Enums']['tipo_bibliografia'] + tipo_fuente?: Database['public']['Enums']['tipo_fuente_bibliografia'] + } Relationships: [ { - foreignKeyName: "bibliografia_asignatura_asignatura_id_fkey"; - columns: ["asignatura_id"]; - isOneToOne: false; - referencedRelation: "asignaturas"; - referencedColumns: ["id"]; + foreignKeyName: 'bibliografia_asignatura_asignatura_id_fkey' + columns: ['asignatura_id'] + isOneToOne: false + referencedRelation: 'asignaturas' + referencedColumns: ['id'] }, { - foreignKeyName: "bibliografia_asignatura_creado_por_fkey"; - columns: ["creado_por"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'bibliografia_asignatura_creado_por_fkey' + columns: ['creado_por'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, - ]; - }; + ] + } cambios_asignatura: { Row: { - asignatura_id: string; - cambiado_en: string; - cambiado_por: string | null; - campo: string | null; - fuente: Database["public"]["Enums"]["fuente_cambio"] | null; - id: string; - interaccion_ia_id: string | null; - tipo: Database["public"]["Enums"]["tipo_cambio"]; - valor_anterior: Json | null; - valor_nuevo: Json | null; - }; + asignatura_id: string + cambiado_en: string + cambiado_por: string | null + campo: string | null + fuente: Database['public']['Enums']['fuente_cambio'] | null + id: string + interaccion_ia_id: string | null + tipo: Database['public']['Enums']['tipo_cambio'] + valor_anterior: Json | null + valor_nuevo: Json | null + } Insert: { - asignatura_id: string; - cambiado_en?: string; - cambiado_por?: string | null; - campo?: string | null; - fuente?: Database["public"]["Enums"]["fuente_cambio"] | null; - id?: string; - interaccion_ia_id?: string | null; - tipo: Database["public"]["Enums"]["tipo_cambio"]; - valor_anterior?: Json | null; - valor_nuevo?: Json | null; - }; + asignatura_id: string + cambiado_en?: string + cambiado_por?: string | null + campo?: string | null + fuente?: Database['public']['Enums']['fuente_cambio'] | null + id?: string + interaccion_ia_id?: string | null + tipo: Database['public']['Enums']['tipo_cambio'] + valor_anterior?: Json | null + valor_nuevo?: Json | null + } Update: { - asignatura_id?: string; - cambiado_en?: string; - cambiado_por?: string | null; - campo?: string | null; - fuente?: Database["public"]["Enums"]["fuente_cambio"] | null; - id?: string; - interaccion_ia_id?: string | null; - tipo?: Database["public"]["Enums"]["tipo_cambio"]; - valor_anterior?: Json | null; - valor_nuevo?: Json | null; - }; + asignatura_id?: string + cambiado_en?: string + cambiado_por?: string | null + campo?: string | null + fuente?: Database['public']['Enums']['fuente_cambio'] | null + id?: string + interaccion_ia_id?: string | null + tipo?: Database['public']['Enums']['tipo_cambio'] + valor_anterior?: Json | null + valor_nuevo?: Json | null + } Relationships: [ { - foreignKeyName: "cambios_asignatura_asignatura_id_fkey"; - columns: ["asignatura_id"]; - isOneToOne: false; - referencedRelation: "asignaturas"; - referencedColumns: ["id"]; + foreignKeyName: 'cambios_asignatura_asignatura_id_fkey' + columns: ['asignatura_id'] + isOneToOne: false + referencedRelation: 'asignaturas' + referencedColumns: ['id'] }, { - foreignKeyName: "cambios_asignatura_cambiado_por_fkey"; - columns: ["cambiado_por"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'cambios_asignatura_cambiado_por_fkey' + columns: ['cambiado_por'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, - ]; - }; + ] + } cambios_plan: { Row: { - cambiado_en: string; - cambiado_por: string | null; - campo: string | null; - id: string; - interaccion_ia_id: string | null; - plan_estudio_id: string; - tipo: Database["public"]["Enums"]["tipo_cambio"]; - valor_anterior: Json | null; - valor_nuevo: Json | null; - }; + cambiado_en: string + cambiado_por: string | null + campo: string | null + id: string + plan_estudio_id: string + response_id: string | null + tipo: Database['public']['Enums']['tipo_cambio'] + valor_anterior: Json | null + valor_nuevo: Json | null + } Insert: { - cambiado_en?: string; - cambiado_por?: string | null; - campo?: string | null; - id?: string; - interaccion_ia_id?: string | null; - plan_estudio_id: string; - tipo: Database["public"]["Enums"]["tipo_cambio"]; - valor_anterior?: Json | null; - valor_nuevo?: Json | null; - }; + cambiado_en?: string + cambiado_por?: string | null + campo?: string | null + id?: string + plan_estudio_id: string + response_id?: string | null + tipo: Database['public']['Enums']['tipo_cambio'] + valor_anterior?: Json | null + valor_nuevo?: Json | null + } Update: { - cambiado_en?: string; - cambiado_por?: string | null; - campo?: string | null; - id?: string; - interaccion_ia_id?: string | null; - plan_estudio_id?: string; - tipo?: Database["public"]["Enums"]["tipo_cambio"]; - valor_anterior?: Json | null; - valor_nuevo?: Json | null; - }; + cambiado_en?: string + cambiado_por?: string | null + campo?: string | null + id?: string + plan_estudio_id?: string + response_id?: string | null + tipo?: Database['public']['Enums']['tipo_cambio'] + valor_anterior?: Json | null + valor_nuevo?: Json | null + } Relationships: [ { - foreignKeyName: "cambios_plan_cambiado_por_fkey"; - columns: ["cambiado_por"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'cambios_plan_cambiado_por_fkey' + columns: ['cambiado_por'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, - { - foreignKeyName: "cambios_plan_plan_estudio_id_fkey"; - columns: ["plan_estudio_id"]; - isOneToOne: false; - referencedRelation: "planes_estudio"; - referencedColumns: ["id"]; - }, - ]; - }; + ] + } carreras: { Row: { - activa: boolean; - actualizado_en: string; - clave_sep: string | null; - creado_en: string; - facultad_id: string; - id: string; - nombre: string; - nombre_corto: string | null; - }; + activa: boolean + actualizado_en: string + clave_sep: string | null + creado_en: string + facultad_id: string + id: string + nombre: string + nombre_corto: string | null + } Insert: { - activa?: boolean; - actualizado_en?: string; - clave_sep?: string | null; - creado_en?: string; - facultad_id: string; - id?: string; - nombre: string; - nombre_corto?: string | null; - }; + activa?: boolean + actualizado_en?: string + clave_sep?: string | null + creado_en?: string + facultad_id: string + id?: string + nombre: string + nombre_corto?: string | null + } Update: { - activa?: boolean; - actualizado_en?: string; - clave_sep?: string | null; - creado_en?: string; - facultad_id?: string; - id?: string; - nombre?: string; - nombre_corto?: string | null; - }; + activa?: boolean + actualizado_en?: string + clave_sep?: string | null + creado_en?: string + facultad_id?: string + id?: string + nombre?: string + nombre_corto?: string | null + } Relationships: [ { - foreignKeyName: "carreras_facultad_id_fkey"; - columns: ["facultad_id"]; - isOneToOne: false; - referencedRelation: "facultades"; - referencedColumns: ["id"]; + foreignKeyName: 'carreras_facultad_id_fkey' + columns: ['facultad_id'] + isOneToOne: false + referencedRelation: 'facultades' + referencedColumns: ['id'] }, - ]; - }; + ] + } estados_plan: { Row: { - clave: string; - es_final: boolean; - etiqueta: string; - id: string; - orden: number; - }; + clave: string + es_final: boolean + etiqueta: string + id: string + orden: number + } Insert: { - clave: string; - es_final?: boolean; - etiqueta: string; - id?: string; - orden?: number; - }; + clave: string + es_final?: boolean + etiqueta: string + id?: string + orden?: number + } Update: { - clave?: string; - es_final?: boolean; - etiqueta?: string; - id?: string; - orden?: number; - }; - Relationships: []; - }; + clave?: string + es_final?: boolean + etiqueta?: string + id?: string + orden?: number + } + Relationships: [] + } estructuras_asignatura: { Row: { - actualizado_en: string; - creado_en: string; - definicion: Json; - id: string; - nombre: string; - version: string | null; - }; + actualizado_en: string + creado_en: string + definicion: Json + id: string + nombre: string + version: string | null + } Insert: { - actualizado_en?: string; - creado_en?: string; - definicion?: Json; - id?: string; - nombre: string; - version?: string | null; - }; + actualizado_en?: string + creado_en?: string + definicion?: Json + id?: string + nombre: string + version?: string | null + } Update: { - actualizado_en?: string; - creado_en?: string; - definicion?: Json; - id?: string; - nombre?: string; - version?: string | null; - }; - Relationships: []; - }; + actualizado_en?: string + creado_en?: string + definicion?: Json + id?: string + nombre?: string + version?: string | null + } + Relationships: [] + } estructuras_plan: { Row: { - actualizado_en: string; - creado_en: string; - definicion: Json; - id: string; - nombre: string; - template_id: string | null; - tipo: Database["public"]["Enums"]["tipo_estructura_plan"]; - }; + actualizado_en: string + creado_en: string + definicion: Json + id: string + nombre: string + template_id: string | null + tipo: Database['public']['Enums']['tipo_estructura_plan'] + } Insert: { - actualizado_en?: string; - creado_en?: string; - definicion?: Json; - id?: string; - nombre: string; - template_id?: string | null; - tipo: Database["public"]["Enums"]["tipo_estructura_plan"]; - }; + actualizado_en?: string + creado_en?: string + definicion?: Json + id?: string + nombre: string + template_id?: string | null + tipo: Database['public']['Enums']['tipo_estructura_plan'] + } Update: { - actualizado_en?: string; - creado_en?: string; - definicion?: Json; - id?: string; - nombre?: string; - template_id?: string | null; - tipo?: Database["public"]["Enums"]["tipo_estructura_plan"]; - }; - Relationships: []; - }; + actualizado_en?: string + creado_en?: string + definicion?: Json + id?: string + nombre?: string + template_id?: string | null + tipo?: Database['public']['Enums']['tipo_estructura_plan'] + } + Relationships: [] + } facultades: { Row: { - actualizado_en: string; - color: string | null; - creado_en: string; - icono: string | null; - id: string; - nombre: string; - nombre_corto: string | null; - }; + actualizado_en: string + color: string | null + creado_en: string + icono: string | null + id: string + nombre: string + nombre_corto: string | null + } Insert: { - actualizado_en?: string; - color?: string | null; - creado_en?: string; - icono?: string | null; - id?: string; - nombre: string; - nombre_corto?: string | null; - }; + actualizado_en?: string + color?: string | null + creado_en?: string + icono?: string | null + id?: string + nombre: string + nombre_corto?: string | null + } Update: { - actualizado_en?: string; - color?: string | null; - creado_en?: string; - icono?: string | null; - id?: string; - nombre?: string; - nombre_corto?: string | null; - }; - Relationships: []; - }; + actualizado_en?: string + color?: string | null + creado_en?: string + icono?: string | null + id?: string + nombre?: string + nombre_corto?: string | null + } + Relationships: [] + } interacciones_ia: { Row: { - aceptada: boolean; - asignatura_id: string | null; - conversacion_id: string | null; - creado_en: string; - id: string; - ids_archivos: Json; - ids_vector_store: Json; - modelo: string | null; - plan_estudio_id: string | null; - prompt: Json; - respuesta: Json; - rutas_storage: Json; - temperatura: number | null; - tipo: Database["public"]["Enums"]["tipo_interaccion_ia"]; - usuario_id: string | null; - }; + aceptada: boolean + asignatura_id: string | null + conversacion_id: string | null + creado_en: string + id: string + ids_archivos: Json + ids_vector_store: Json + modelo: string | null + plan_estudio_id: string | null + prompt: Json + respuesta: Json + rutas_storage: Json + temperatura: number | null + tipo: Database['public']['Enums']['tipo_interaccion_ia'] + usuario_id: string | null + } Insert: { - aceptada?: boolean; - asignatura_id?: string | null; - conversacion_id?: string | null; - creado_en?: string; - id?: string; - ids_archivos?: Json; - ids_vector_store?: Json; - modelo?: string | null; - plan_estudio_id?: string | null; - prompt?: Json; - respuesta?: Json; - rutas_storage?: Json; - temperatura?: number | null; - tipo: Database["public"]["Enums"]["tipo_interaccion_ia"]; - usuario_id?: string | null; - }; + aceptada?: boolean + asignatura_id?: string | null + conversacion_id?: string | null + creado_en?: string + id?: string + ids_archivos?: Json + ids_vector_store?: Json + modelo?: string | null + plan_estudio_id?: string | null + prompt?: Json + respuesta?: Json + rutas_storage?: Json + temperatura?: number | null + tipo: Database['public']['Enums']['tipo_interaccion_ia'] + usuario_id?: string | null + } Update: { - aceptada?: boolean; - asignatura_id?: string | null; - conversacion_id?: string | null; - creado_en?: string; - id?: string; - ids_archivos?: Json; - ids_vector_store?: Json; - modelo?: string | null; - plan_estudio_id?: string | null; - prompt?: Json; - respuesta?: Json; - rutas_storage?: Json; - temperatura?: number | null; - tipo?: Database["public"]["Enums"]["tipo_interaccion_ia"]; - usuario_id?: string | null; - }; + aceptada?: boolean + asignatura_id?: string | null + conversacion_id?: string | null + creado_en?: string + id?: string + ids_archivos?: Json + ids_vector_store?: Json + modelo?: string | null + plan_estudio_id?: string | null + prompt?: Json + respuesta?: Json + rutas_storage?: Json + temperatura?: number | null + tipo?: Database['public']['Enums']['tipo_interaccion_ia'] + usuario_id?: string | null + } Relationships: [ { - foreignKeyName: "interacciones_ia_asignatura_id_fkey"; - columns: ["asignatura_id"]; - isOneToOne: false; - referencedRelation: "asignaturas"; - referencedColumns: ["id"]; + foreignKeyName: 'interacciones_ia_asignatura_id_fkey' + columns: ['asignatura_id'] + isOneToOne: false + referencedRelation: 'asignaturas' + referencedColumns: ['id'] }, { - foreignKeyName: "interacciones_ia_plan_estudio_id_fkey"; - columns: ["plan_estudio_id"]; - isOneToOne: false; - referencedRelation: "planes_estudio"; - referencedColumns: ["id"]; + foreignKeyName: 'interacciones_ia_plan_estudio_id_fkey' + columns: ['plan_estudio_id'] + isOneToOne: false + referencedRelation: 'planes_estudio' + referencedColumns: ['id'] }, { - foreignKeyName: "interacciones_ia_usuario_id_fkey"; - columns: ["usuario_id"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'interacciones_ia_plan_estudio_id_fkey' + columns: ['plan_estudio_id'] + isOneToOne: false + referencedRelation: 'plantilla_plan' + referencedColumns: ['plan_estudio_id'] }, - ]; - }; + { + foreignKeyName: 'interacciones_ia_usuario_id_fkey' + columns: ['usuario_id'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] + }, + ] + } lineas_plan: { Row: { - actualizado_en: string; - area: string | null; - creado_en: string; - id: string; - nombre: string; - orden: number; - plan_estudio_id: string; - }; + actualizado_en: string + area: string | null + creado_en: string + id: string + nombre: string + orden: number + plan_estudio_id: string + } Insert: { - actualizado_en?: string; - area?: string | null; - creado_en?: string; - id?: string; - nombre: string; - orden?: number; - plan_estudio_id: string; - }; + actualizado_en?: string + area?: string | null + creado_en?: string + id?: string + nombre: string + orden?: number + plan_estudio_id: string + } Update: { - actualizado_en?: string; - area?: string | null; - creado_en?: string; - id?: string; - nombre?: string; - orden?: number; - plan_estudio_id?: string; - }; + actualizado_en?: string + area?: string | null + creado_en?: string + id?: string + nombre?: string + orden?: number + plan_estudio_id?: string + } Relationships: [ { - foreignKeyName: "lineas_plan_plan_estudio_id_fkey"; - columns: ["plan_estudio_id"]; - isOneToOne: false; - referencedRelation: "planes_estudio"; - referencedColumns: ["id"]; + foreignKeyName: 'lineas_plan_plan_estudio_id_fkey' + columns: ['plan_estudio_id'] + isOneToOne: false + referencedRelation: 'planes_estudio' + referencedColumns: ['id'] }, - ]; - }; + { + foreignKeyName: 'lineas_plan_plan_estudio_id_fkey' + columns: ['plan_estudio_id'] + isOneToOne: false + referencedRelation: 'plantilla_plan' + referencedColumns: ['plan_estudio_id'] + }, + ] + } notificaciones: { Row: { - creado_en: string; - id: string; - leida: boolean; - leida_en: string | null; - payload: Json; - tipo: Database["public"]["Enums"]["tipo_notificacion"]; - usuario_id: string; - }; + creado_en: string + id: string + leida: boolean + leida_en: string | null + payload: Json + tipo: Database['public']['Enums']['tipo_notificacion'] + usuario_id: string + } Insert: { - creado_en?: string; - id?: string; - leida?: boolean; - leida_en?: string | null; - payload?: Json; - tipo: Database["public"]["Enums"]["tipo_notificacion"]; - usuario_id: string; - }; + creado_en?: string + id?: string + leida?: boolean + leida_en?: string | null + payload?: Json + tipo: Database['public']['Enums']['tipo_notificacion'] + usuario_id: string + } Update: { - creado_en?: string; - id?: string; - leida?: boolean; - leida_en?: string | null; - payload?: Json; - tipo?: Database["public"]["Enums"]["tipo_notificacion"]; - usuario_id?: string; - }; + creado_en?: string + id?: string + leida?: boolean + leida_en?: string | null + payload?: Json + tipo?: Database['public']['Enums']['tipo_notificacion'] + usuario_id?: string + } Relationships: [ { - foreignKeyName: "notificaciones_usuario_id_fkey"; - columns: ["usuario_id"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'notificaciones_usuario_id_fkey' + columns: ['usuario_id'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, - ]; - }; + ] + } planes_estudio: { Row: { - activo: boolean; - actualizado_en: string; - actualizado_por: string | null; - carrera_id: string; - creado_en: string; - creado_por: string | null; - datos: Json; - estado_actual_id: string | null; - estructura_id: string; - id: string; - meta_origen: Json; - nivel: Database["public"]["Enums"]["nivel_plan_estudio"]; - nombre: string; - nombre_search: string | null; - numero_ciclos: number; - tipo_ciclo: Database["public"]["Enums"]["tipo_ciclo"]; - tipo_origen: Database["public"]["Enums"]["tipo_origen"] | null; - }; + activo: boolean + actualizado_en: string + actualizado_por: string | null + carrera_id: string + conversation_id: string | null + creado_en: string + creado_por: string | null + datos: Json + estado_actual_id: string | null + estructura_id: string + id: string + meta_origen: Json + nivel: Database['public']['Enums']['nivel_plan_estudio'] + nombre: string + nombre_search: string | null + numero_ciclos: number + plan_hash: string | null + tipo_ciclo: Database['public']['Enums']['tipo_ciclo'] + tipo_origen: Database['public']['Enums']['tipo_origen'] | null + } Insert: { - activo?: boolean; - actualizado_en?: string; - actualizado_por?: string | null; - carrera_id: string; - creado_en?: string; - creado_por?: string | null; - datos?: Json; - estado_actual_id?: string | null; - estructura_id: string; - id?: string; - meta_origen?: Json; - nivel: Database["public"]["Enums"]["nivel_plan_estudio"]; - nombre: string; - nombre_search?: string | null; - numero_ciclos: number; - tipo_ciclo: Database["public"]["Enums"]["tipo_ciclo"]; - tipo_origen?: Database["public"]["Enums"]["tipo_origen"] | null; - }; + activo?: boolean + actualizado_en?: string + actualizado_por?: string | null + carrera_id: string + conversation_id?: string | null + creado_en?: string + creado_por?: string | null + datos?: Json + estado_actual_id?: string | null + estructura_id: string + id?: string + meta_origen?: Json + nivel: Database['public']['Enums']['nivel_plan_estudio'] + nombre: string + nombre_search?: string | null + numero_ciclos: number + plan_hash?: string | null + tipo_ciclo: Database['public']['Enums']['tipo_ciclo'] + tipo_origen?: Database['public']['Enums']['tipo_origen'] | null + } Update: { - activo?: boolean; - actualizado_en?: string; - actualizado_por?: string | null; - carrera_id?: string; - creado_en?: string; - creado_por?: string | null; - datos?: Json; - estado_actual_id?: string | null; - estructura_id?: string; - id?: string; - meta_origen?: Json; - nivel?: Database["public"]["Enums"]["nivel_plan_estudio"]; - nombre?: string; - nombre_search?: string | null; - numero_ciclos?: number; - tipo_ciclo?: Database["public"]["Enums"]["tipo_ciclo"]; - tipo_origen?: Database["public"]["Enums"]["tipo_origen"] | null; - }; + activo?: boolean + actualizado_en?: string + actualizado_por?: string | null + carrera_id?: string + conversation_id?: string | null + creado_en?: string + creado_por?: string | null + datos?: Json + estado_actual_id?: string | null + estructura_id?: string + id?: string + meta_origen?: Json + nivel?: Database['public']['Enums']['nivel_plan_estudio'] + nombre?: string + nombre_search?: string | null + numero_ciclos?: number + plan_hash?: string | null + tipo_ciclo?: Database['public']['Enums']['tipo_ciclo'] + tipo_origen?: Database['public']['Enums']['tipo_origen'] | null + } Relationships: [ { - foreignKeyName: "planes_estudio_actualizado_por_fkey"; - columns: ["actualizado_por"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'planes_estudio_actualizado_por_fkey' + columns: ['actualizado_por'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, { - foreignKeyName: "planes_estudio_carrera_id_fkey"; - columns: ["carrera_id"]; - isOneToOne: false; - referencedRelation: "carreras"; - referencedColumns: ["id"]; + foreignKeyName: 'planes_estudio_carrera_id_fkey' + columns: ['carrera_id'] + isOneToOne: false + referencedRelation: 'carreras' + referencedColumns: ['id'] }, { - foreignKeyName: "planes_estudio_creado_por_fkey"; - columns: ["creado_por"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'planes_estudio_creado_por_fkey' + columns: ['creado_por'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, { - foreignKeyName: "planes_estudio_estado_actual_id_fkey"; - columns: ["estado_actual_id"]; - isOneToOne: false; - referencedRelation: "estados_plan"; - referencedColumns: ["id"]; + foreignKeyName: 'planes_estudio_estado_actual_id_fkey' + columns: ['estado_actual_id'] + isOneToOne: false + referencedRelation: 'estados_plan' + referencedColumns: ['id'] }, { - foreignKeyName: "planes_estudio_estructura_id_fkey"; - columns: ["estructura_id"]; - isOneToOne: false; - referencedRelation: "estructuras_plan"; - referencedColumns: ["id"]; + foreignKeyName: 'planes_estudio_estructura_id_fkey' + columns: ['estructura_id'] + isOneToOne: false + referencedRelation: 'estructuras_plan' + referencedColumns: ['id'] }, - ]; - }; + { + foreignKeyName: 'planes_estudio_estructura_id_fkey' + columns: ['estructura_id'] + isOneToOne: false + referencedRelation: 'plantilla_plan' + referencedColumns: ['estructura_id'] + }, + ] + } responsables_asignatura: { Row: { - asignatura_id: string; - creado_en: string; - id: string; - rol: Database["public"]["Enums"]["rol_responsable_asignatura"]; - usuario_id: string; - }; + asignatura_id: string + creado_en: string + id: string + rol: Database['public']['Enums']['rol_responsable_asignatura'] + usuario_id: string + } Insert: { - asignatura_id: string; - creado_en?: string; - id?: string; - rol?: Database["public"]["Enums"]["rol_responsable_asignatura"]; - usuario_id: string; - }; + asignatura_id: string + creado_en?: string + id?: string + rol?: Database['public']['Enums']['rol_responsable_asignatura'] + usuario_id: string + } Update: { - asignatura_id?: string; - creado_en?: string; - id?: string; - rol?: Database["public"]["Enums"]["rol_responsable_asignatura"]; - usuario_id?: string; - }; + asignatura_id?: string + creado_en?: string + id?: string + rol?: Database['public']['Enums']['rol_responsable_asignatura'] + usuario_id?: string + } Relationships: [ { - foreignKeyName: "responsables_asignatura_asignatura_id_fkey"; - columns: ["asignatura_id"]; - isOneToOne: false; - referencedRelation: "asignaturas"; - referencedColumns: ["id"]; + foreignKeyName: 'responsables_asignatura_asignatura_id_fkey' + columns: ['asignatura_id'] + isOneToOne: false + referencedRelation: 'asignaturas' + referencedColumns: ['id'] }, { - foreignKeyName: "responsables_asignatura_usuario_id_fkey"; - columns: ["usuario_id"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'responsables_asignatura_usuario_id_fkey' + columns: ['usuario_id'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, - ]; - }; + ] + } roles: { Row: { - clave: string; - descripcion: string | null; - id: string; - nombre: string; - }; + clave: string + descripcion: string | null + id: string + nombre: string + } Insert: { - clave: string; - descripcion?: string | null; - id?: string; - nombre: string; - }; + clave: string + descripcion?: string | null + id?: string + nombre: string + } Update: { - clave?: string; - descripcion?: string | null; - id?: string; - nombre?: string; - }; - Relationships: []; - }; + clave?: string + descripcion?: string | null + id?: string + nombre?: string + } + Relationships: [] + } tareas_revision: { Row: { - asignado_a: string; - completado_en: string | null; - creado_en: string; - estado_id: string | null; - estatus: Database["public"]["Enums"]["estado_tarea_revision"]; - fecha_limite: string | null; - id: string; - plan_estudio_id: string; - rol_id: string | null; - }; + asignado_a: string + completado_en: string | null + creado_en: string + estado_id: string | null + estatus: Database['public']['Enums']['estado_tarea_revision'] + fecha_limite: string | null + id: string + plan_estudio_id: string + rol_id: string | null + } Insert: { - asignado_a: string; - completado_en?: string | null; - creado_en?: string; - estado_id?: string | null; - estatus?: Database["public"]["Enums"]["estado_tarea_revision"]; - fecha_limite?: string | null; - id?: string; - plan_estudio_id: string; - rol_id?: string | null; - }; + asignado_a: string + completado_en?: string | null + creado_en?: string + estado_id?: string | null + estatus?: Database['public']['Enums']['estado_tarea_revision'] + fecha_limite?: string | null + id?: string + plan_estudio_id: string + rol_id?: string | null + } Update: { - asignado_a?: string; - completado_en?: string | null; - creado_en?: string; - estado_id?: string | null; - estatus?: Database["public"]["Enums"]["estado_tarea_revision"]; - fecha_limite?: string | null; - id?: string; - plan_estudio_id?: string; - rol_id?: string | null; - }; + asignado_a?: string + completado_en?: string | null + creado_en?: string + estado_id?: string | null + estatus?: Database['public']['Enums']['estado_tarea_revision'] + fecha_limite?: string | null + id?: string + plan_estudio_id?: string + rol_id?: string | null + } Relationships: [ { - foreignKeyName: "tareas_revision_asignado_a_fkey"; - columns: ["asignado_a"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'tareas_revision_asignado_a_fkey' + columns: ['asignado_a'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, { - foreignKeyName: "tareas_revision_estado_id_fkey"; - columns: ["estado_id"]; - isOneToOne: false; - referencedRelation: "estados_plan"; - referencedColumns: ["id"]; + foreignKeyName: 'tareas_revision_estado_id_fkey' + columns: ['estado_id'] + isOneToOne: false + referencedRelation: 'estados_plan' + referencedColumns: ['id'] }, { - foreignKeyName: "tareas_revision_plan_estudio_id_fkey"; - columns: ["plan_estudio_id"]; - isOneToOne: false; - referencedRelation: "planes_estudio"; - referencedColumns: ["id"]; + foreignKeyName: 'tareas_revision_plan_estudio_id_fkey' + columns: ['plan_estudio_id'] + isOneToOne: false + referencedRelation: 'planes_estudio' + referencedColumns: ['id'] }, { - foreignKeyName: "tareas_revision_rol_id_fkey"; - columns: ["rol_id"]; - isOneToOne: false; - referencedRelation: "roles"; - referencedColumns: ["id"]; + foreignKeyName: 'tareas_revision_plan_estudio_id_fkey' + columns: ['plan_estudio_id'] + isOneToOne: false + referencedRelation: 'plantilla_plan' + referencedColumns: ['plan_estudio_id'] }, - ]; - }; + { + foreignKeyName: 'tareas_revision_rol_id_fkey' + columns: ['rol_id'] + isOneToOne: false + referencedRelation: 'roles' + referencedColumns: ['id'] + }, + ] + } transiciones_estado_plan: { Row: { - creado_en: string; - desde_estado_id: string; - hacia_estado_id: string; - id: string; - rol_permitido_id: string; - }; + creado_en: string + desde_estado_id: string + hacia_estado_id: string + id: string + rol_permitido_id: string + } Insert: { - creado_en?: string; - desde_estado_id: string; - hacia_estado_id: string; - id?: string; - rol_permitido_id: string; - }; + creado_en?: string + desde_estado_id: string + hacia_estado_id: string + id?: string + rol_permitido_id: string + } Update: { - creado_en?: string; - desde_estado_id?: string; - hacia_estado_id?: string; - id?: string; - rol_permitido_id?: string; - }; + creado_en?: string + desde_estado_id?: string + hacia_estado_id?: string + id?: string + rol_permitido_id?: string + } Relationships: [ { - foreignKeyName: "transiciones_estado_plan_desde_estado_id_fkey"; - columns: ["desde_estado_id"]; - isOneToOne: false; - referencedRelation: "estados_plan"; - referencedColumns: ["id"]; + foreignKeyName: 'transiciones_estado_plan_desde_estado_id_fkey' + columns: ['desde_estado_id'] + isOneToOne: false + referencedRelation: 'estados_plan' + referencedColumns: ['id'] }, { - foreignKeyName: "transiciones_estado_plan_hacia_estado_id_fkey"; - columns: ["hacia_estado_id"]; - isOneToOne: false; - referencedRelation: "estados_plan"; - referencedColumns: ["id"]; + foreignKeyName: 'transiciones_estado_plan_hacia_estado_id_fkey' + columns: ['hacia_estado_id'] + isOneToOne: false + referencedRelation: 'estados_plan' + referencedColumns: ['id'] }, { - foreignKeyName: "transiciones_estado_plan_rol_permitido_id_fkey"; - columns: ["rol_permitido_id"]; - isOneToOne: false; - referencedRelation: "roles"; - referencedColumns: ["id"]; + foreignKeyName: 'transiciones_estado_plan_rol_permitido_id_fkey' + columns: ['rol_permitido_id'] + isOneToOne: false + referencedRelation: 'roles' + referencedColumns: ['id'] }, - ]; - }; + ] + } usuarios_app: { Row: { - actualizado_en: string; - creado_en: string; - email: string | null; - externo: boolean; - id: string; - nombre_completo: string | null; - }; + actualizado_en: string + creado_en: string + email: string | null + externo: boolean + id: string + nombre_completo: string | null + } Insert: { - actualizado_en?: string; - creado_en?: string; - email?: string | null; - externo?: boolean; - id: string; - nombre_completo?: string | null; - }; + actualizado_en?: string + creado_en?: string + email?: string | null + externo?: boolean + id: string + nombre_completo?: string | null + } Update: { - actualizado_en?: string; - creado_en?: string; - email?: string | null; - externo?: boolean; - id?: string; - nombre_completo?: string | null; - }; - Relationships: []; - }; + actualizado_en?: string + creado_en?: string + email?: string | null + externo?: boolean + id?: string + nombre_completo?: string | null + } + Relationships: [] + } usuarios_roles: { Row: { - carrera_id: string | null; - creado_en: string; - facultad_id: string | null; - id: string; - rol_id: string; - usuario_id: string; - }; + carrera_id: string | null + creado_en: string + facultad_id: string | null + id: string + rol_id: string + usuario_id: string + } Insert: { - carrera_id?: string | null; - creado_en?: string; - facultad_id?: string | null; - id?: string; - rol_id: string; - usuario_id: string; - }; + carrera_id?: string | null + creado_en?: string + facultad_id?: string | null + id?: string + rol_id: string + usuario_id: string + } Update: { - carrera_id?: string | null; - creado_en?: string; - facultad_id?: string | null; - id?: string; - rol_id?: string; - usuario_id?: string; - }; + carrera_id?: string | null + creado_en?: string + facultad_id?: string | null + id?: string + rol_id?: string + usuario_id?: string + } Relationships: [ { - foreignKeyName: "usuarios_roles_carrera_id_fkey"; - columns: ["carrera_id"]; - isOneToOne: false; - referencedRelation: "carreras"; - referencedColumns: ["id"]; + foreignKeyName: 'usuarios_roles_carrera_id_fkey' + columns: ['carrera_id'] + isOneToOne: false + referencedRelation: 'carreras' + referencedColumns: ['id'] }, { - foreignKeyName: "usuarios_roles_facultad_id_fkey"; - columns: ["facultad_id"]; - isOneToOne: false; - referencedRelation: "facultades"; - referencedColumns: ["id"]; + foreignKeyName: 'usuarios_roles_facultad_id_fkey' + columns: ['facultad_id'] + isOneToOne: false + referencedRelation: 'facultades' + referencedColumns: ['id'] }, { - foreignKeyName: "usuarios_roles_rol_id_fkey"; - columns: ["rol_id"]; - isOneToOne: false; - referencedRelation: "roles"; - referencedColumns: ["id"]; + foreignKeyName: 'usuarios_roles_rol_id_fkey' + columns: ['rol_id'] + isOneToOne: false + referencedRelation: 'roles' + referencedColumns: ['id'] }, { - foreignKeyName: "usuarios_roles_usuario_id_fkey"; - columns: ["usuario_id"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'usuarios_roles_usuario_id_fkey' + columns: ['usuario_id'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, - ]; - }; + ] + } vector_stores: { Row: { - creado_en: string; - creado_por: string | null; - id: string; - nombre: string; - openai_vector_id: string | null; - }; + creado_en: string + creado_por: string | null + id: string + nombre: string + openai_vector_id: string | null + } Insert: { - creado_en?: string; - creado_por?: string | null; - id?: string; - nombre: string; - openai_vector_id?: string | null; - }; + creado_en?: string + creado_por?: string | null + id?: string + nombre: string + openai_vector_id?: string | null + } Update: { - creado_en?: string; - creado_por?: string | null; - id?: string; - nombre?: string; - openai_vector_id?: string | null; - }; + creado_en?: string + creado_por?: string | null + id?: string + nombre?: string + openai_vector_id?: string | null + } Relationships: [ { - foreignKeyName: "vector_stores_creado_por_fkey"; - columns: ["creado_por"]; - isOneToOne: false; - referencedRelation: "usuarios_app"; - referencedColumns: ["id"]; + foreignKeyName: 'vector_stores_creado_por_fkey' + columns: ['creado_por'] + isOneToOne: false + referencedRelation: 'usuarios_app' + referencedColumns: ['id'] }, - ]; - }; - }; + ] + } + } Views: { - [_ in never]: never; - }; + plantilla_plan: { + Row: { + estructura_id: string | null + plan_estudio_id: string | null + template_id: string | null + } + Relationships: [] + } + } Functions: { - unaccent: { Args: { "": string }; Returns: string }; - unaccent_immutable: { Args: { "": string }; Returns: string }; - }; + unaccent: { Args: { '': string }; Returns: string } + unaccent_immutable: { Args: { '': string }; Returns: string } + } Enums: { - estado_tarea_revision: "PENDIENTE" | "COMPLETADA" | "OMITIDA"; - fuente_cambio: "HUMANO" | "IA"; + estado_tarea_revision: 'PENDIENTE' | 'COMPLETADA' | 'OMITIDA' + fuente_cambio: 'HUMANO' | 'IA' nivel_plan_estudio: - | "Licenciatura" - | "Maestría" - | "Doctorado" - | "Especialidad" - | "Diplomado" - | "Otro"; + | 'Licenciatura' + | 'Maestría' + | 'Doctorado' + | 'Especialidad' + | 'Diplomado' + | 'Otro' puesto_tipo: - | "vicerrector" - | "director_facultad" - | "secretario_academico" - | "jefe_carrera" - | "profesor" - | "lci"; - rol_responsable_asignatura: - | "PROFESOR_RESPONSABLE" - | "COAUTOR" - | "REVISOR"; - tipo_asignatura: "OBLIGATORIA" | "OPTATIVA" | "TRONCAL" | "OTRA"; - tipo_bibliografia: "BASICA" | "COMPLEMENTARIA"; + | 'vicerrector' + | 'director_facultad' + | 'secretario_academico' + | 'jefe_carrera' + | 'profesor' + | 'lci' + rol_responsable_asignatura: 'PROFESOR_RESPONSABLE' | 'COAUTOR' | 'REVISOR' + tipo_asignatura: 'OBLIGATORIA' | 'OPTATIVA' | 'TRONCAL' | 'OTRA' + tipo_bibliografia: 'BASICA' | 'COMPLEMENTARIA' tipo_cambio: - | "ACTUALIZACION_CAMPO" - | "ACTUALIZACION_MAPA" - | "TRANSICION_ESTADO" - | "OTRO"; - tipo_ciclo: "Semestre" | "Cuatrimestre" | "Trimestre" | "Otro"; - tipo_estructura_plan: "CURRICULAR" | "NO_CURRICULAR"; - tipo_fuente_bibliografia: "MANUAL" | "BIBLIOTECA"; - tipo_interaccion_ia: "GENERAR" | "MEJORAR_SECCION" | "CHAT" | "OTRA"; + | 'ACTUALIZACION_CAMPO' + | 'ACTUALIZACION_MAPA' + | 'TRANSICION_ESTADO' + | 'OTRO' + | 'CREACION' + | 'ACTUALIZACION' + tipo_ciclo: 'Semestre' | 'Cuatrimestre' | 'Trimestre' | 'Otro' + tipo_estructura_plan: 'CURRICULAR' | 'NO_CURRICULAR' + tipo_fuente_bibliografia: 'MANUAL' | 'BIBLIOTECA' + tipo_interaccion_ia: 'GENERAR' | 'MEJORAR_SECCION' | 'CHAT' | 'OTRA' tipo_notificacion: - | "PLAN_ASIGNADO" - | "ESTADO_CAMBIADO" - | "TAREA_ASIGNADA" - | "COMENTARIO" - | "OTRA"; + | 'PLAN_ASIGNADO' + | 'ESTADO_CAMBIADO' + | 'TAREA_ASIGNADA' + | 'COMENTARIO' + | 'OTRA' tipo_origen: - | "MANUAL" - | "IA" - | "CLONADO_INTERNO" - | "CLONADO_TRADICIONAL" - | "OTRO"; - }; + | 'MANUAL' + | 'IA' + | 'CLONADO_INTERNO' + | 'CLONADO_TRADICIONAL' + | 'OTRO' + } CompositeTypes: { - [_ in never]: never; - }; - }; -}; + [_ in never]: never + } + } +} -type DatabaseWithoutInternals = Omit; +type DatabaseWithoutInternals = Omit -type DefaultSchema = - DatabaseWithoutInternals[Extract]; +type DefaultSchema = DatabaseWithoutInternals[Extract] export type Tables< DefaultSchemaTableNameOrOptions extends - | keyof (DefaultSchema["Tables"] & DefaultSchema["Views"]) + | keyof (DefaultSchema['Tables'] & DefaultSchema['Views']) | { schema: keyof DatabaseWithoutInternals }, TableName extends DefaultSchemaTableNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; - } ? keyof ( - & DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]][ - "Tables" - ] - & DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]][ - "Views" - ] - ) + schema: keyof DatabaseWithoutInternals + } + ? keyof (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'] & + DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Views']) : never = never, > = DefaultSchemaTableNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; -} ? ( - & DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]][ - "Tables" - ] - & DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]][ - "Views" - ] - )[TableName] extends { - Row: infer R; - } ? R - : never - : DefaultSchemaTableNameOrOptions extends keyof ( - & DefaultSchema["Tables"] - & DefaultSchema["Views"] - ) ? ( - & DefaultSchema["Tables"] - & DefaultSchema["Views"] - )[DefaultSchemaTableNameOrOptions] extends { - Row: infer R; - } ? R + schema: keyof DatabaseWithoutInternals +} + ? (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'] & + DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Views'])[TableName] extends { + Row: infer R + } + ? R + : never + : DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema['Tables'] & + DefaultSchema['Views']) + ? (DefaultSchema['Tables'] & + DefaultSchema['Views'])[DefaultSchemaTableNameOrOptions] extends { + Row: infer R + } + ? R + : never : never - : never; export type TablesInsert< DefaultSchemaTableNameOrOptions extends - | keyof DefaultSchema["Tables"] + | keyof DefaultSchema['Tables'] | { schema: keyof DatabaseWithoutInternals }, TableName extends DefaultSchemaTableNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; - } ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]][ - "Tables" - ] + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'] : never = never, > = DefaultSchemaTableNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; -} ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]][ - "Tables" - ][TableName] extends { - Insert: infer I; - } ? I - : never - : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"] - ? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends { - Insert: infer I; - } ? I + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'][TableName] extends { + Insert: infer I + } + ? I + : never + : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema['Tables'] + ? DefaultSchema['Tables'][DefaultSchemaTableNameOrOptions] extends { + Insert: infer I + } + ? I + : never : never - : never; export type TablesUpdate< DefaultSchemaTableNameOrOptions extends - | keyof DefaultSchema["Tables"] + | keyof DefaultSchema['Tables'] | { schema: keyof DatabaseWithoutInternals }, TableName extends DefaultSchemaTableNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; - } ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]][ - "Tables" - ] + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'] : never = never, > = DefaultSchemaTableNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; -} ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]][ - "Tables" - ][TableName] extends { - Update: infer U; - } ? U - : never - : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"] - ? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends { - Update: infer U; - } ? U + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions['schema']]['Tables'][TableName] extends { + Update: infer U + } + ? U + : never + : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema['Tables'] + ? DefaultSchema['Tables'][DefaultSchemaTableNameOrOptions] extends { + Update: infer U + } + ? U + : never : never - : never; export type Enums< DefaultSchemaEnumNameOrOptions extends - | keyof DefaultSchema["Enums"] + | keyof DefaultSchema['Enums'] | { schema: keyof DatabaseWithoutInternals }, EnumName extends DefaultSchemaEnumNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; - } ? keyof DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]][ - "Enums" - ] + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions['schema']]['Enums'] : never = never, > = DefaultSchemaEnumNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; -} ? DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"][ - EnumName - ] - : DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema["Enums"] - ? DefaultSchema["Enums"][DefaultSchemaEnumNameOrOptions] - : never; + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions['schema']]['Enums'][EnumName] + : DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema['Enums'] + ? DefaultSchema['Enums'][DefaultSchemaEnumNameOrOptions] + : never export type CompositeTypes< PublicCompositeTypeNameOrOptions extends - | keyof DefaultSchema["CompositeTypes"] + | keyof DefaultSchema['CompositeTypes'] | { schema: keyof DatabaseWithoutInternals }, CompositeTypeName extends PublicCompositeTypeNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; - } ? keyof DatabaseWithoutInternals[ - PublicCompositeTypeNameOrOptions["schema"] - ]["CompositeTypes"] + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions['schema']]['CompositeTypes'] : never = never, > = PublicCompositeTypeNameOrOptions extends { - schema: keyof DatabaseWithoutInternals; -} ? DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]][ - "CompositeTypes" - ][CompositeTypeName] - : PublicCompositeTypeNameOrOptions extends - keyof DefaultSchema["CompositeTypes"] - ? DefaultSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions] - : never; + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions['schema']]['CompositeTypes'][CompositeTypeName] + : PublicCompositeTypeNameOrOptions extends keyof DefaultSchema['CompositeTypes'] + ? DefaultSchema['CompositeTypes'][PublicCompositeTypeNameOrOptions] + : never export const Constants = { graphql_public: { @@ -1239,55 +1258,57 @@ export const Constants = { }, public: { Enums: { - estado_tarea_revision: ["PENDIENTE", "COMPLETADA", "OMITIDA"], - fuente_cambio: ["HUMANO", "IA"], + estado_tarea_revision: ['PENDIENTE', 'COMPLETADA', 'OMITIDA'], + fuente_cambio: ['HUMANO', 'IA'], nivel_plan_estudio: [ - "Licenciatura", - "Maestría", - "Doctorado", - "Especialidad", - "Diplomado", - "Otro", + 'Licenciatura', + 'Maestría', + 'Doctorado', + 'Especialidad', + 'Diplomado', + 'Otro', ], puesto_tipo: [ - "vicerrector", - "director_facultad", - "secretario_academico", - "jefe_carrera", - "profesor", - "lci", + 'vicerrector', + 'director_facultad', + 'secretario_academico', + 'jefe_carrera', + 'profesor', + 'lci', ], rol_responsable_asignatura: [ - "PROFESOR_RESPONSABLE", - "COAUTOR", - "REVISOR", + 'PROFESOR_RESPONSABLE', + 'COAUTOR', + 'REVISOR', ], - tipo_asignatura: ["OBLIGATORIA", "OPTATIVA", "TRONCAL", "OTRA"], - tipo_bibliografia: ["BASICA", "COMPLEMENTARIA"], + tipo_asignatura: ['OBLIGATORIA', 'OPTATIVA', 'TRONCAL', 'OTRA'], + tipo_bibliografia: ['BASICA', 'COMPLEMENTARIA'], tipo_cambio: [ - "ACTUALIZACION_CAMPO", - "ACTUALIZACION_MAPA", - "TRANSICION_ESTADO", - "OTRO", + 'ACTUALIZACION_CAMPO', + 'ACTUALIZACION_MAPA', + 'TRANSICION_ESTADO', + 'OTRO', + 'CREACION', + 'ACTUALIZACION', ], - tipo_ciclo: ["Semestre", "Cuatrimestre", "Trimestre", "Otro"], - tipo_estructura_plan: ["CURRICULAR", "NO_CURRICULAR"], - tipo_fuente_bibliografia: ["MANUAL", "BIBLIOTECA"], - tipo_interaccion_ia: ["GENERAR", "MEJORAR_SECCION", "CHAT", "OTRA"], + tipo_ciclo: ['Semestre', 'Cuatrimestre', 'Trimestre', 'Otro'], + tipo_estructura_plan: ['CURRICULAR', 'NO_CURRICULAR'], + tipo_fuente_bibliografia: ['MANUAL', 'BIBLIOTECA'], + tipo_interaccion_ia: ['GENERAR', 'MEJORAR_SECCION', 'CHAT', 'OTRA'], tipo_notificacion: [ - "PLAN_ASIGNADO", - "ESTADO_CAMBIADO", - "TAREA_ASIGNADA", - "COMENTARIO", - "OTRA", + 'PLAN_ASIGNADO', + 'ESTADO_CAMBIADO', + 'TAREA_ASIGNADA', + 'COMENTARIO', + 'OTRA', ], tipo_origen: [ - "MANUAL", - "IA", - "CLONADO_INTERNO", - "CLONADO_TRADICIONAL", - "OTRO", + 'MANUAL', + 'IA', + 'CLONADO_INTERNO', + 'CLONADO_TRADICIONAL', + 'OTRO', ], }, }, -} as const; +} as const