- {messages.map((msg) => (
+ {messages?.map((msg) => (
= []
diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts
index f157f69..6026c7d 100644
--- a/src/routeTree.gen.ts
+++ b/src/routeTree.gen.ts
@@ -17,13 +17,19 @@ import { Route as DemoTanstackQueryRouteImport } from './routes/demo/tanstack-qu
import { Route as PlanesListaNuevoRouteImport } from './routes/planes/_lista/nuevo'
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 PlanesPlanIdAsignaturasAsignaturaIdRouteRouteImport } from './routes/planes/$planId/asignaturas/$asignaturaId/route'
+import { Route as PlanesPlanIdAsignaturasAsignaturaIdIndexRouteImport } from './routes/planes/$planId/asignaturas/$asignaturaId/index'
+import { Route as PlanesPlanIdAsignaturasAsignaturaIdIaasignaturaRouteImport } from './routes/planes/$planId/asignaturas/$asignaturaId/iaasignatura'
+import { Route as PlanesPlanIdAsignaturasAsignaturaIdHistorialRouteImport } from './routes/planes/$planId/asignaturas/$asignaturaId/historial'
+import { Route as PlanesPlanIdAsignaturasAsignaturaIdDocumentoRouteImport } from './routes/planes/$planId/asignaturas/$asignaturaId/documento'
+import { Route as PlanesPlanIdAsignaturasAsignaturaIdContenidoRouteImport } from './routes/planes/$planId/asignaturas/$asignaturaId/contenido'
+import { Route as PlanesPlanIdAsignaturasAsignaturaIdBibliografiaRouteImport } from './routes/planes/$planId/asignaturas/$asignaturaId/bibliografia'
import { Route as PlanesPlanIdDetalleAsignaturasNuevaRouteImport } from './routes/planes/$planId/_detalle/asignaturas/nueva'
const LoginRoute = LoginRouteImport.update({
@@ -67,12 +73,6 @@ const PlanesPlanIdDetalleIndexRoute =
path: '/',
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',
@@ -108,6 +108,48 @@ const PlanesPlanIdDetalleAsignaturasRoute =
path: '/asignaturas',
getParentRoute: () => PlanesPlanIdDetalleRoute,
} as any)
+const PlanesPlanIdAsignaturasAsignaturaIdRouteRoute =
+ PlanesPlanIdAsignaturasAsignaturaIdRouteRouteImport.update({
+ id: '/planes/$planId/asignaturas/$asignaturaId',
+ path: '/planes/$planId/asignaturas/$asignaturaId',
+ getParentRoute: () => rootRouteImport,
+ } as any)
+const PlanesPlanIdAsignaturasAsignaturaIdIndexRoute =
+ PlanesPlanIdAsignaturasAsignaturaIdIndexRouteImport.update({
+ id: '/',
+ path: '/',
+ getParentRoute: () => PlanesPlanIdAsignaturasAsignaturaIdRouteRoute,
+ } as any)
+const PlanesPlanIdAsignaturasAsignaturaIdIaasignaturaRoute =
+ PlanesPlanIdAsignaturasAsignaturaIdIaasignaturaRouteImport.update({
+ id: '/iaasignatura',
+ path: '/iaasignatura',
+ getParentRoute: () => PlanesPlanIdAsignaturasAsignaturaIdRouteRoute,
+ } as any)
+const PlanesPlanIdAsignaturasAsignaturaIdHistorialRoute =
+ PlanesPlanIdAsignaturasAsignaturaIdHistorialRouteImport.update({
+ id: '/historial',
+ path: '/historial',
+ getParentRoute: () => PlanesPlanIdAsignaturasAsignaturaIdRouteRoute,
+ } as any)
+const PlanesPlanIdAsignaturasAsignaturaIdDocumentoRoute =
+ PlanesPlanIdAsignaturasAsignaturaIdDocumentoRouteImport.update({
+ id: '/documento',
+ path: '/documento',
+ getParentRoute: () => PlanesPlanIdAsignaturasAsignaturaIdRouteRoute,
+ } as any)
+const PlanesPlanIdAsignaturasAsignaturaIdContenidoRoute =
+ PlanesPlanIdAsignaturasAsignaturaIdContenidoRouteImport.update({
+ id: '/contenido',
+ path: '/contenido',
+ getParentRoute: () => PlanesPlanIdAsignaturasAsignaturaIdRouteRoute,
+ } as any)
+const PlanesPlanIdAsignaturasAsignaturaIdBibliografiaRoute =
+ PlanesPlanIdAsignaturasAsignaturaIdBibliografiaRouteImport.update({
+ id: '/bibliografia',
+ path: '/bibliografia',
+ getParentRoute: () => PlanesPlanIdAsignaturasAsignaturaIdRouteRoute,
+ } as any)
const PlanesPlanIdDetalleAsignaturasNuevaRoute =
PlanesPlanIdDetalleAsignaturasNuevaRouteImport.update({
id: '/nueva',
@@ -123,15 +165,21 @@ export interface FileRoutesByFullPath {
'/planes': typeof PlanesListaRouteWithChildren
'/planes/$planId': typeof PlanesPlanIdDetalleRouteWithChildren
'/planes/nuevo': typeof PlanesListaNuevoRoute
+ '/planes/$planId/asignaturas/$asignaturaId': typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRouteWithChildren
'/planes/$planId/asignaturas': typeof PlanesPlanIdDetalleAsignaturasRouteWithChildren
'/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 PlanesPlanIdDetalleAsignaturasNuevaRoute
+ '/planes/$planId/asignaturas/$asignaturaId/bibliografia': typeof PlanesPlanIdAsignaturasAsignaturaIdBibliografiaRoute
+ '/planes/$planId/asignaturas/$asignaturaId/contenido': typeof PlanesPlanIdAsignaturasAsignaturaIdContenidoRoute
+ '/planes/$planId/asignaturas/$asignaturaId/documento': typeof PlanesPlanIdAsignaturasAsignaturaIdDocumentoRoute
+ '/planes/$planId/asignaturas/$asignaturaId/historial': typeof PlanesPlanIdAsignaturasAsignaturaIdHistorialRoute
+ '/planes/$planId/asignaturas/$asignaturaId/iaasignatura': typeof PlanesPlanIdAsignaturasAsignaturaIdIaasignaturaRoute
+ '/planes/$planId/asignaturas/$asignaturaId/': typeof PlanesPlanIdAsignaturasAsignaturaIdIndexRoute
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
@@ -146,9 +194,14 @@ export interface FileRoutesByTo {
'/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 PlanesPlanIdDetalleAsignaturasNuevaRoute
+ '/planes/$planId/asignaturas/$asignaturaId/bibliografia': typeof PlanesPlanIdAsignaturasAsignaturaIdBibliografiaRoute
+ '/planes/$planId/asignaturas/$asignaturaId/contenido': typeof PlanesPlanIdAsignaturasAsignaturaIdContenidoRoute
+ '/planes/$planId/asignaturas/$asignaturaId/documento': typeof PlanesPlanIdAsignaturasAsignaturaIdDocumentoRoute
+ '/planes/$planId/asignaturas/$asignaturaId/historial': typeof PlanesPlanIdAsignaturasAsignaturaIdHistorialRoute
+ '/planes/$planId/asignaturas/$asignaturaId/iaasignatura': typeof PlanesPlanIdAsignaturasAsignaturaIdIaasignaturaRoute
+ '/planes/$planId/asignaturas/$asignaturaId': typeof PlanesPlanIdAsignaturasAsignaturaIdIndexRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
@@ -159,15 +212,21 @@ export interface FileRoutesById {
'/planes/_lista': typeof PlanesListaRouteWithChildren
'/planes/$planId/_detalle': typeof PlanesPlanIdDetalleRouteWithChildren
'/planes/_lista/nuevo': typeof PlanesListaNuevoRoute
+ '/planes/$planId/asignaturas/$asignaturaId': typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRouteWithChildren
'/planes/$planId/_detalle/asignaturas': typeof PlanesPlanIdDetalleAsignaturasRouteWithChildren
'/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/_detalle/asignaturas/nueva': typeof PlanesPlanIdDetalleAsignaturasNuevaRoute
+ '/planes/$planId/asignaturas/$asignaturaId/bibliografia': typeof PlanesPlanIdAsignaturasAsignaturaIdBibliografiaRoute
+ '/planes/$planId/asignaturas/$asignaturaId/contenido': typeof PlanesPlanIdAsignaturasAsignaturaIdContenidoRoute
+ '/planes/$planId/asignaturas/$asignaturaId/documento': typeof PlanesPlanIdAsignaturasAsignaturaIdDocumentoRoute
+ '/planes/$planId/asignaturas/$asignaturaId/historial': typeof PlanesPlanIdAsignaturasAsignaturaIdHistorialRoute
+ '/planes/$planId/asignaturas/$asignaturaId/iaasignatura': typeof PlanesPlanIdAsignaturasAsignaturaIdIaasignaturaRoute
+ '/planes/$planId/asignaturas/$asignaturaId/': typeof PlanesPlanIdAsignaturasAsignaturaIdIndexRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
@@ -179,15 +238,21 @@ export interface FileRouteTypes {
| '/planes'
| '/planes/$planId'
| '/planes/nuevo'
+ | '/planes/$planId/asignaturas/$asignaturaId'
| '/planes/$planId/asignaturas'
| '/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/$asignaturaId/bibliografia'
+ | '/planes/$planId/asignaturas/$asignaturaId/contenido'
+ | '/planes/$planId/asignaturas/$asignaturaId/documento'
+ | '/planes/$planId/asignaturas/$asignaturaId/historial'
+ | '/planes/$planId/asignaturas/$asignaturaId/iaasignatura'
+ | '/planes/$planId/asignaturas/$asignaturaId/'
fileRoutesByTo: FileRoutesByTo
to:
| '/'
@@ -202,9 +267,14 @@ export interface FileRouteTypes {
| '/planes/$planId/historial'
| '/planes/$planId/iaplan'
| '/planes/$planId/mapa'
- | '/planes/$planId/asignaturas/$asignaturaId'
| '/planes/$planId'
| '/planes/$planId/asignaturas/nueva'
+ | '/planes/$planId/asignaturas/$asignaturaId/bibliografia'
+ | '/planes/$planId/asignaturas/$asignaturaId/contenido'
+ | '/planes/$planId/asignaturas/$asignaturaId/documento'
+ | '/planes/$planId/asignaturas/$asignaturaId/historial'
+ | '/planes/$planId/asignaturas/$asignaturaId/iaasignatura'
+ | '/planes/$planId/asignaturas/$asignaturaId'
id:
| '__root__'
| '/'
@@ -214,15 +284,21 @@ export interface FileRouteTypes {
| '/planes/_lista'
| '/planes/$planId/_detalle'
| '/planes/_lista/nuevo'
+ | '/planes/$planId/asignaturas/$asignaturaId'
| '/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/_detalle/asignaturas/nueva'
+ | '/planes/$planId/asignaturas/$asignaturaId/bibliografia'
+ | '/planes/$planId/asignaturas/$asignaturaId/contenido'
+ | '/planes/$planId/asignaturas/$asignaturaId/documento'
+ | '/planes/$planId/asignaturas/$asignaturaId/historial'
+ | '/planes/$planId/asignaturas/$asignaturaId/iaasignatura'
+ | '/planes/$planId/asignaturas/$asignaturaId/'
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
@@ -232,7 +308,7 @@ export interface RootRouteChildren {
DemoTanstackQueryRoute: typeof DemoTanstackQueryRoute
PlanesListaRoute: typeof PlanesListaRouteWithChildren
PlanesPlanIdDetalleRoute: typeof PlanesPlanIdDetalleRouteWithChildren
- PlanesPlanIdAsignaturasAsignaturaIdRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRoute
+ PlanesPlanIdAsignaturasAsignaturaIdRouteRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRouteWithChildren
}
declare module '@tanstack/react-router' {
@@ -293,13 +369,6 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof PlanesPlanIdDetalleIndexRouteImport
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'
@@ -342,6 +411,55 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof PlanesPlanIdDetalleAsignaturasRouteImport
parentRoute: typeof PlanesPlanIdDetalleRoute
}
+ '/planes/$planId/asignaturas/$asignaturaId': {
+ id: '/planes/$planId/asignaturas/$asignaturaId'
+ path: '/planes/$planId/asignaturas/$asignaturaId'
+ fullPath: '/planes/$planId/asignaturas/$asignaturaId'
+ preLoaderRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/planes/$planId/asignaturas/$asignaturaId/': {
+ id: '/planes/$planId/asignaturas/$asignaturaId/'
+ path: '/'
+ fullPath: '/planes/$planId/asignaturas/$asignaturaId/'
+ preLoaderRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdIndexRouteImport
+ parentRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRoute
+ }
+ '/planes/$planId/asignaturas/$asignaturaId/iaasignatura': {
+ id: '/planes/$planId/asignaturas/$asignaturaId/iaasignatura'
+ path: '/iaasignatura'
+ fullPath: '/planes/$planId/asignaturas/$asignaturaId/iaasignatura'
+ preLoaderRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdIaasignaturaRouteImport
+ parentRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRoute
+ }
+ '/planes/$planId/asignaturas/$asignaturaId/historial': {
+ id: '/planes/$planId/asignaturas/$asignaturaId/historial'
+ path: '/historial'
+ fullPath: '/planes/$planId/asignaturas/$asignaturaId/historial'
+ preLoaderRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdHistorialRouteImport
+ parentRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRoute
+ }
+ '/planes/$planId/asignaturas/$asignaturaId/documento': {
+ id: '/planes/$planId/asignaturas/$asignaturaId/documento'
+ path: '/documento'
+ fullPath: '/planes/$planId/asignaturas/$asignaturaId/documento'
+ preLoaderRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdDocumentoRouteImport
+ parentRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRoute
+ }
+ '/planes/$planId/asignaturas/$asignaturaId/contenido': {
+ id: '/planes/$planId/asignaturas/$asignaturaId/contenido'
+ path: '/contenido'
+ fullPath: '/planes/$planId/asignaturas/$asignaturaId/contenido'
+ preLoaderRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdContenidoRouteImport
+ parentRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRoute
+ }
+ '/planes/$planId/asignaturas/$asignaturaId/bibliografia': {
+ id: '/planes/$planId/asignaturas/$asignaturaId/bibliografia'
+ path: '/bibliografia'
+ fullPath: '/planes/$planId/asignaturas/$asignaturaId/bibliografia'
+ preLoaderRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdBibliografiaRouteImport
+ parentRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdRouteRoute
+ }
'/planes/$planId/_detalle/asignaturas/nueva': {
id: '/planes/$planId/_detalle/asignaturas/nueva'
path: '/nueva'
@@ -403,6 +521,36 @@ const PlanesPlanIdDetalleRouteChildren: PlanesPlanIdDetalleRouteChildren = {
const PlanesPlanIdDetalleRouteWithChildren =
PlanesPlanIdDetalleRoute._addFileChildren(PlanesPlanIdDetalleRouteChildren)
+interface PlanesPlanIdAsignaturasAsignaturaIdRouteRouteChildren {
+ PlanesPlanIdAsignaturasAsignaturaIdBibliografiaRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdBibliografiaRoute
+ PlanesPlanIdAsignaturasAsignaturaIdContenidoRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdContenidoRoute
+ PlanesPlanIdAsignaturasAsignaturaIdDocumentoRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdDocumentoRoute
+ PlanesPlanIdAsignaturasAsignaturaIdHistorialRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdHistorialRoute
+ PlanesPlanIdAsignaturasAsignaturaIdIaasignaturaRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdIaasignaturaRoute
+ PlanesPlanIdAsignaturasAsignaturaIdIndexRoute: typeof PlanesPlanIdAsignaturasAsignaturaIdIndexRoute
+}
+
+const PlanesPlanIdAsignaturasAsignaturaIdRouteRouteChildren: PlanesPlanIdAsignaturasAsignaturaIdRouteRouteChildren =
+ {
+ PlanesPlanIdAsignaturasAsignaturaIdBibliografiaRoute:
+ PlanesPlanIdAsignaturasAsignaturaIdBibliografiaRoute,
+ PlanesPlanIdAsignaturasAsignaturaIdContenidoRoute:
+ PlanesPlanIdAsignaturasAsignaturaIdContenidoRoute,
+ PlanesPlanIdAsignaturasAsignaturaIdDocumentoRoute:
+ PlanesPlanIdAsignaturasAsignaturaIdDocumentoRoute,
+ PlanesPlanIdAsignaturasAsignaturaIdHistorialRoute:
+ PlanesPlanIdAsignaturasAsignaturaIdHistorialRoute,
+ PlanesPlanIdAsignaturasAsignaturaIdIaasignaturaRoute:
+ PlanesPlanIdAsignaturasAsignaturaIdIaasignaturaRoute,
+ PlanesPlanIdAsignaturasAsignaturaIdIndexRoute:
+ PlanesPlanIdAsignaturasAsignaturaIdIndexRoute,
+ }
+
+const PlanesPlanIdAsignaturasAsignaturaIdRouteRouteWithChildren =
+ PlanesPlanIdAsignaturasAsignaturaIdRouteRoute._addFileChildren(
+ PlanesPlanIdAsignaturasAsignaturaIdRouteRouteChildren,
+ )
+
const rootRouteChildren: RootRouteChildren = {
IndexRoute: IndexRoute,
DashboardRoute: DashboardRoute,
@@ -410,8 +558,8 @@ const rootRouteChildren: RootRouteChildren = {
DemoTanstackQueryRoute: DemoTanstackQueryRoute,
PlanesListaRoute: PlanesListaRouteWithChildren,
PlanesPlanIdDetalleRoute: PlanesPlanIdDetalleRouteWithChildren,
- PlanesPlanIdAsignaturasAsignaturaIdRoute:
- PlanesPlanIdAsignaturasAsignaturaIdRoute,
+ PlanesPlanIdAsignaturasAsignaturaIdRouteRoute:
+ PlanesPlanIdAsignaturasAsignaturaIdRouteRouteWithChildren,
}
export const routeTree = rootRouteImport
._addFileChildren(rootRouteChildren)
diff --git a/src/routes/planes/$planId/asignaturas/$asignaturaId.tsx b/src/routes/planes/$planId/asignaturas/$asignaturaId.tsx
deleted file mode 100644
index e227155..0000000
--- a/src/routes/planes/$planId/asignaturas/$asignaturaId.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import { createFileRoute, notFound, useLocation } from '@tanstack/react-router'
-import { useEffect } from 'react'
-
-import AsignaturaDetailPage from '@/components/asignaturas/detalle/AsignaturaDetailPage'
-import { lateralConfetti } from '@/components/ui/lateral-confetti'
-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()
- const location = useLocation()
-
- // Confetti al llegar desde creación
- useEffect(() => {
- if ((location.state as any)?.showConfetti) {
- lateralConfetti()
- window.history.replaceState({}, document.title) // Limpiar el estado para que no se repita
- }
- }, [location.state])
-
- return (
-
- )
-}
diff --git a/src/routes/planes/$planId/asignaturas/$asignaturaId/bibliografia.tsx b/src/routes/planes/$planId/asignaturas/$asignaturaId/bibliografia.tsx
new file mode 100644
index 0000000..8b74a6e
--- /dev/null
+++ b/src/routes/planes/$planId/asignaturas/$asignaturaId/bibliografia.tsx
@@ -0,0 +1,13 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import { BibliographyItem } from '@/components/asignaturas/detalle/BibliographyItem'
+
+export const Route = createFileRoute(
+ '/planes/$planId/asignaturas/$asignaturaId/bibliografia',
+)({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ return
+}
diff --git a/src/routes/planes/$planId/asignaturas/$asignaturaId/contenido.tsx b/src/routes/planes/$planId/asignaturas/$asignaturaId/contenido.tsx
new file mode 100644
index 0000000..704a535
--- /dev/null
+++ b/src/routes/planes/$planId/asignaturas/$asignaturaId/contenido.tsx
@@ -0,0 +1,13 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import { ContenidoTematico } from '@/components/asignaturas/detalle/ContenidoTematico'
+
+export const Route = createFileRoute(
+ '/planes/$planId/asignaturas/$asignaturaId/contenido',
+)({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ return
+}
diff --git a/src/routes/planes/$planId/asignaturas/$asignaturaId/documento.tsx b/src/routes/planes/$planId/asignaturas/$asignaturaId/documento.tsx
new file mode 100644
index 0000000..2777863
--- /dev/null
+++ b/src/routes/planes/$planId/asignaturas/$asignaturaId/documento.tsx
@@ -0,0 +1,85 @@
+import { createFileRoute, useParams } from '@tanstack/react-router'
+import { useCallback, useEffect, useState } from 'react'
+
+import { DocumentoSEPTab } from '@/components/asignaturas/detalle/DocumentoSEPTab'
+import { fetchPlanPdf } from '@/data/api/document.api'
+
+export const Route = createFileRoute(
+ '/planes/$planId/asignaturas/$asignaturaId/documento',
+)({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ const { planId } = useParams({
+ from: '/planes/$planId/asignaturas/$asignaturaId/documento',
+ })
+
+ const [pdfUrl, setPdfUrl] = useState
(null)
+ const [isLoading, setIsLoading] = useState(true)
+ const [isRegenerating, setIsRegenerating] = useState(false)
+
+ const loadPdfPreview = useCallback(async () => {
+ try {
+ setIsLoading(true)
+
+ const pdfBlob = await fetchPlanPdf({
+ plan_estudio_id: planId,
+ })
+
+ const url = window.URL.createObjectURL(pdfBlob)
+
+ setPdfUrl((prev) => {
+ if (prev) window.URL.revokeObjectURL(prev)
+ return url
+ })
+ } catch (error) {
+ console.error('Error cargando PDF:', error)
+ } finally {
+ setIsLoading(false)
+ }
+ }, [planId])
+
+ useEffect(() => {
+ loadPdfPreview()
+
+ return () => {
+ if (pdfUrl) window.URL.revokeObjectURL(pdfUrl)
+ }
+ }, [loadPdfPreview])
+
+ const handleDownload = async () => {
+ const pdfBlob = await fetchPlanPdf({
+ plan_estudio_id: planId,
+ })
+
+ const url = window.URL.createObjectURL(pdfBlob)
+ const link = document.createElement('a')
+ link.href = url
+ link.download = 'documento_sep.pdf'
+ document.body.appendChild(link)
+ link.click()
+ link.remove()
+ window.URL.revokeObjectURL(url)
+ }
+
+ const handleRegenerate = async () => {
+ try {
+ setIsRegenerating(true)
+
+ await loadPdfPreview()
+ } finally {
+ setIsRegenerating(false)
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/src/routes/planes/$planId/asignaturas/$asignaturaId/historial.tsx b/src/routes/planes/$planId/asignaturas/$asignaturaId/historial.tsx
new file mode 100644
index 0000000..2f1fb73
--- /dev/null
+++ b/src/routes/planes/$planId/asignaturas/$asignaturaId/historial.tsx
@@ -0,0 +1,13 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import { HistorialTab } from '@/components/asignaturas/detalle/HistorialTab'
+
+export const Route = createFileRoute(
+ '/planes/$planId/asignaturas/$asignaturaId/historial',
+)({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ return
+}
diff --git a/src/routes/planes/$planId/asignaturas/$asignaturaId/iaasignatura.tsx b/src/routes/planes/$planId/asignaturas/$asignaturaId/iaasignatura.tsx
new file mode 100644
index 0000000..ec63b76
--- /dev/null
+++ b/src/routes/planes/$planId/asignaturas/$asignaturaId/iaasignatura.tsx
@@ -0,0 +1,13 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import { IAAsignaturaTab } from '@/components/asignaturas/detalle/IAAsignaturaTab'
+
+export const Route = createFileRoute(
+ '/planes/$planId/asignaturas/$asignaturaId/iaasignatura',
+)({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ return
+}
diff --git a/src/routes/planes/$planId/asignaturas/$asignaturaId/index.tsx b/src/routes/planes/$planId/asignaturas/$asignaturaId/index.tsx
new file mode 100644
index 0000000..948a100
--- /dev/null
+++ b/src/routes/planes/$planId/asignaturas/$asignaturaId/index.tsx
@@ -0,0 +1,13 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import AsignaturaDetailPage from '@/components/asignaturas/detalle/AsignaturaDetailPage'
+
+export const Route = createFileRoute(
+ '/planes/$planId/asignaturas/$asignaturaId/',
+)({
+ component: DatosGeneralesPage,
+})
+
+function DatosGeneralesPage() {
+ return
+}
diff --git a/src/routes/planes/$planId/asignaturas/$asignaturaId/route.tsx b/src/routes/planes/$planId/asignaturas/$asignaturaId/route.tsx
new file mode 100644
index 0000000..1088a3b
--- /dev/null
+++ b/src/routes/planes/$planId/asignaturas/$asignaturaId/route.tsx
@@ -0,0 +1,264 @@
+import {
+ createFileRoute,
+ Outlet,
+ Link,
+ useParams,
+ useRouterState,
+} from '@tanstack/react-router'
+import { ArrowLeft, GraduationCap } from 'lucide-react'
+import { useEffect, useState } from 'react'
+
+import { Badge } from '@/components/ui/badge'
+import { useSubject, useUpdateAsignatura } from '@/data'
+
+export const Route = createFileRoute(
+ '/planes/$planId/asignaturas/$asignaturaId',
+)({
+ component: AsignaturaLayout,
+})
+
+function EditableHeaderField({
+ value,
+ onSave,
+ className,
+}: {
+ value: string | number
+ onSave: (val: string) => void
+ className?: string
+}) {
+ const textValue = String(value)
+
+ // Manejador para cuando el usuario termina de editar (pierde el foco)
+ const handleBlur = (e: React.FocusEvent) => {
+ const newValue = e.currentTarget.innerText
+ if (newValue !== textValue) {
+ onSave(newValue)
+ }
+ }
+
+ const handleKeyDown = (e: React.KeyboardEvent) => {
+ if (e.key === 'Enter') {
+ e.preventDefault()
+ e.currentTarget.blur() // Forzamos el guardado al presionar Enter
+ }
+ }
+
+ return (
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
+
+ {textValue}
+
+ )
+}
+interface DatosPlan {
+ nombre?: string
+}
+
+function AsignaturaLayout() {
+ const routerState = useRouterState()
+ const state = routerState.location.state as any
+ const { asignaturaId } = useParams({
+ from: '/planes/$planId/asignaturas/$asignaturaId',
+ })
+ const { planId } = useParams({
+ from: '/planes/$planId/asignaturas/$asignaturaId',
+ })
+ const { data: asignaturaApi, isLoading: loadingAsig } =
+ useSubject(asignaturaId)
+ // 1. Asegúrate de tener estos estados en tu componente principal
+
+ const updateAsignatura = useUpdateAsignatura()
+
+ // Dentro de AsignaturaDetailPage
+ const [headerData, setHeaderData] = useState({
+ codigo: '',
+ nombre: '',
+ creditos: 0,
+ ciclo: 0,
+ })
+
+ // Sincronizar cuando llegue la API
+ useEffect(() => {
+ if (asignaturaApi) {
+ setHeaderData({
+ codigo: asignaturaApi.codigo ?? '',
+ nombre: asignaturaApi.nombre,
+ creditos: asignaturaApi.creditos,
+ ciclo: asignaturaApi.numero_ciclo ?? 0,
+ })
+ }
+ }, [asignaturaApi])
+
+ const handleUpdateHeader = (key: string, value: string | number) => {
+ const newData = { ...headerData, [key]: value }
+ setHeaderData(newData)
+
+ const patch: Record =
+ key === 'ciclo'
+ ? { numero_ciclo: value }
+ : {
+ [key]: value,
+ }
+
+ updateAsignatura.mutate({
+ asignaturaId,
+ patch,
+ })
+ }
+
+ const pathname = useRouterState({
+ select: (state) => state.location.pathname,
+ })
+
+ if (loadingAsig) {
+ return (
+
+ Cargando asignatura...
+
+ )
+ }
+
+ // Si no hay datos y no está cargando, algo falló
+ if (!asignaturaApi) return null
+
+ return (
+
+
+
+
+
Volver al plan
+
+
+
+
+ {/* CÓDIGO EDITABLE */}
+
+ handleUpdateHeader('codigo', val)}
+ />
+
+
+ {/* NOMBRE EDITABLE */}
+
+ handleUpdateHeader('nombre', val)}
+ />
+
+
+
+
+
+
+ {(asignaturaApi.planes_estudio?.datos as DatosPlan)
+ .nombre || ''}
+
+
+
+
+
+ {(asignaturaApi.planes_estudio?.datos as DatosPlan)
+ .nombre ?? ''}
+
+
+
+
+
+ Pertenece al plan:{' '}
+
+ {asignaturaApi.planes_estudio?.nombre}
+
+
+
+
+
+ {/* CRÉDITOS EDITABLES */}
+
+
+
+ handleUpdateHeader('creditos', parseInt(val) || 0)
+ }
+ />
+
+ créditos
+
+
+ {/* SEMESTRE EDITABLE */}
+
+
+ handleUpdateHeader('ciclo', parseInt(val) || 0)
+ }
+ />
+ ° ciclo
+
+
+ {asignaturaApi.tipo}
+
+
+
+
+
+ {/* TABS */}
+
+
+
+
+
+
+
+ )
+}