diff --git a/src/components/planes/wizard/WizardControls.tsx b/src/components/planes/wizard/WizardControls.tsx
index f70cf35..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,
@@ -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
@@ -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,
@@ -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
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 (
+
+ )
+}
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/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..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,11 +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 = (): string => 'JEFE_CARRERA'
const Wizard = defineStepper(
{
@@ -24,8 +34,8 @@ const Wizard = defineStepper(
description: 'Nombre y estructura',
},
{
- id: 'configuracion',
- title: 'Configuración',
+ id: 'detalles',
+ title: 'Detalles',
description: 'Detalles según modo',
},
{
@@ -35,8 +45,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()
@@ -55,59 +63,46 @@ 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 (
-
+
+ }
+ >
+
+ {idx === 0 && (
+
+
+
+ )}
+
+ {idx === 1 && (
+
+
+
+ )}
+
+ {idx === 2 && (
+
+
+
+ )}
+
+ {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 (
-
+
+ )}
+ {idx === 3 && (
+
+
+
+ )}
+
+
+ )
+ }}
+
)
}
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
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 8fbc854..94f1c29 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 88%
rename from src/routes/planes/$planId/_detalle/asignaturas.tsx
rename to src/routes/planes/$planId/_detalle/asignaturas/index.tsx
index 0128351..4e9aade 100644
--- a/src/routes/planes/$planId/_detalle/asignaturas.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