From c396ce8104e6ff3c1bacd9f91b4dad119cc5a1be Mon Sep 17 00:00:00 2001 From: "Roberto.silva" Date: Wed, 21 Jan 2026 12:07:07 -0600 Subject: [PATCH] Se corrigen incidencias --- .../asignaturas/detalle/MateriaDetailPage.tsx | 66 ++++---- .../planes/$planId/_detalle/materias.tsx | 59 ++++--- src/routes/planes/$planId/_detalle/route.tsx | 150 +++++++++++------ .../planes/$planId/asignaturas/index.tsx | 152 +----------------- src/routes/planes/$planId/index.tsx | 10 ++ 5 files changed, 186 insertions(+), 251 deletions(-) create mode 100644 src/routes/planes/$planId/index.tsx diff --git a/src/components/asignaturas/detalle/MateriaDetailPage.tsx b/src/components/asignaturas/detalle/MateriaDetailPage.tsx index e303efd..0ef02ee 100644 --- a/src/components/asignaturas/detalle/MateriaDetailPage.tsx +++ b/src/components/asignaturas/detalle/MateriaDetailPage.tsx @@ -1,37 +1,27 @@ +import { Link, useRouterState } from '@tanstack/react-router' +import { ArrowLeft, GraduationCap, Pencil, Sparkles } from 'lucide-react' import { useCallback, useState, useEffect } from 'react' -import { Link } from '@tanstack/react-router' -import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs' -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' + +import { BibliographyItem } from './BibliographyItem' +import { ContenidoTematico } from './ContenidoTematico' +import { DocumentoSEPTab } from './DocumentoSEPTab' +import { HistorialTab } from './HistorialTab' +import { IAMateriaTab } from './IAMateriaTab' + +import type { CampoEstructura, IAMessage, IASugerencia } from '@/types/materia' + import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Separator } from '@/components/ui/separator' +import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs' import { Textarea } from '@/components/ui/textarea' -import { - ArrowLeft, - GraduationCap, - Edit2, - Save, - Pencil, - Sparkles, -} from 'lucide-react' -import { ContenidoTematico } from './ContenidoTematico' -import { BibliographyItem } from './BibliographyItem' -import { IAMateriaTab } from './IAMateriaTab' -import type { - CampoEstructura, - IAMessage, - IASugerencia, - UnidadTematica, -} from '@/types/materia' +import { useSubject } from '@/data/hooks/useSubjects' import { mockMateria, mockEstructura, mockDocumentoSep, - mockHistorial, } from '@/data/mockMateriaData' -import { DocumentoSEPTab } from './DocumentoSEPTab' -import { HistorialTab } from './HistorialTab' -import { useSubject } from '@/data/hooks/useSubjects' export interface BibliografiaEntry { id: string @@ -41,8 +31,8 @@ export interface BibliografiaEntry { fuenteBiblioteca?: any } export interface BibliografiaTabProps { - bibliografia: BibliografiaEntry[] - onSave: (bibliografia: BibliografiaEntry[]) => void + bibliografia: Array + onSave: (bibliografia: Array) => void isSaving: boolean } @@ -90,13 +80,15 @@ function EditableHeaderField({ ) } export default function MateriaDetailPage() { + const routerState = useRouterState() + const state = routerState.location.state as any const { data: asignaturasApi, isLoading: loadingAsig } = useSubject( - '9d4dda6a-488f-428a-8a07-38081592a641', + state?.realId, ) // 1. Asegúrate de tener estos estados en tu componente principal - const [messages, setMessages] = useState([]) + const [messages, setMessages] = useState>([]) const [datosGenerales, setDatosGenerales] = useState({}) - const [campos, setCampos] = useState([]) + const [campos, setCampos] = useState>([]) // Dentro de MateriaDetailPage const [headerData, setHeaderData] = useState({ @@ -142,16 +134,16 @@ export default function MateriaDetailPage() { setMessages([...messages, newMessage]) // Aquí llamarías a tu API de OpenAI/Claude - //toast.info("Enviando consulta a la IA..."); + // toast.info("Enviando consulta a la IA..."); } const handleAcceptSuggestion = (sugerencia: IASugerencia) => { // Lógica para actualizar el valor del campo en tu estado de datosGenerales - //toast.success(`Sugerencia aplicada a ${sugerencia.campoNombre}`); + // toast.success(`Sugerencia aplicada a ${sugerencia.campoNombre}`); } // Dentro de tu componente principal (donde están los Tabs) - const [bibliografia, setBibliografia] = useState([ + const [bibliografia, setBibliografia] = useState>([ { id: '1', tipo: 'BASICA', @@ -160,7 +152,7 @@ export default function MateriaDetailPage() { ]) const [isSaving, setIsSaving] = useState(false) - const handleSaveBibliografia = (data: BibliografiaEntry[]) => { + const handleSaveBibliografia = (data: Array) => { setIsSaving(true) // Aquí iría tu llamada a la API setBibliografia(data) @@ -168,7 +160,7 @@ export default function MateriaDetailPage() { // Simulamos un guardado setTimeout(() => { setIsSaving(false) - //toast.success("Cambios guardados"); + // toast.success("Cambios guardados"); }, 1000) } @@ -304,7 +296,7 @@ export default function MateriaDetailPage() { (id) => console.log( 'Rechazada', - ) /*toast.error("Sugerencia rechazada")*/ + ) /* toast.error("Sugerencia rechazada")*/ } /> @@ -507,7 +499,7 @@ function InfoCard({ } // Vista de Requisitos -function RequirementsView({ items }: { items: any[] }) { +function RequirementsView({ items }: { items: Array }) { return (
{items.map((req, i) => ( @@ -528,7 +520,7 @@ function RequirementsView({ items }: { items: any[] }) { } // Vista de Evaluación -function EvaluationView({ items }: { items: any[] }) { +function EvaluationView({ items }: { items: Array }) { return (
{items.map((item, i) => ( diff --git a/src/routes/planes/$planId/_detalle/materias.tsx b/src/routes/planes/$planId/_detalle/materias.tsx index 6657147..bb34d47 100644 --- a/src/routes/planes/$planId/_detalle/materias.tsx +++ b/src/routes/planes/$planId/_detalle/materias.tsx @@ -1,24 +1,4 @@ -import { createFileRoute } from '@tanstack/react-router' -import { useState, useMemo } from 'react' -import type { Materia, LineaCurricular } from '@/types/plan' -import { Button } from '@/components/ui/button' -import { Input } from '@/components/ui/input' -import { Badge } from '@/components/ui/badge' -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from '@/components/ui/table' -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from '@/components/ui/select' +import { createFileRoute, useNavigate } from '@tanstack/react-router' import { Plus, Copy, @@ -28,6 +8,28 @@ import { BookOpen, Loader2, } from 'lucide-react' +import { useState, useMemo } from 'react' + +import type { Materia } from '@/types/plan' + +import { Badge } from '@/components/ui/badge' +import { Button } from '@/components/ui/button' +import { Input } from '@/components/ui/input' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '@/components/ui/table' import { usePlanAsignaturas, usePlanLineas } from '@/data' // --- Configuración de Estilos --- @@ -44,7 +46,7 @@ const tipoConfig: Record = { } // --- Mapeadores de API --- -const mapAsignaturas = (asigApi: any[] = []): Materia[] => { +const mapAsignaturas = (asigApi: Array = []): Array => { return asigApi.map((asig) => ({ id: asig.id, clave: asig.codigo, @@ -66,6 +68,7 @@ export const Route = createFileRoute('/planes/$planId/_detalle/materias')({ function MateriasPage() { const { planId } = Route.useParams() + const navigate = useNavigate() // 1. Fetch de datos reales const { data: asignaturasApi, isLoading: loadingAsig } = usePlanAsignaturas( @@ -224,6 +227,18 @@ function MateriasPage() { + navigate({ + to: '/planes/$planId/asignaturas/$asignaturaId', + params: { + planId, + asignaturaId: 'asignatura', // 👈 puede ser índice, consecutivo o slug + }, + state: { + realId: materia.id, // 👈 ID largo oculto + } as any, + }) + } > {materia.clave} diff --git a/src/routes/planes/$planId/_detalle/route.tsx b/src/routes/planes/$planId/_detalle/route.tsx index ab6fff9..2d1540e 100644 --- a/src/routes/planes/$planId/_detalle/route.tsx +++ b/src/routes/planes/$planId/_detalle/route.tsx @@ -1,6 +1,16 @@ import { createFileRoute, Outlet, Link } from '@tanstack/react-router' -import { ChevronLeft, GraduationCap, Clock, Hash, CalendarDays, Rocket, BookOpen, CheckCircle2 } from "lucide-react" -import { Badge } from "@/components/ui/badge" +import { + ChevronLeft, + GraduationCap, + Clock, + Hash, + CalendarDays, + Rocket, + BookOpen, + CheckCircle2, +} from 'lucide-react' + +import { Badge } from '@/components/ui/badge' export const Route = createFileRoute('/planes/$planId/_detalle')({ component: RouteComponent, @@ -12,11 +22,11 @@ function RouteComponent() { return (
{/* 1. Header Superior con Sombra (Volver a planes) */} -
+
- Volver a planes @@ -24,54 +34,91 @@ function RouteComponent() {
{/* 2. Contenido Principal con Padding */} -
- +
{/* Header del Plan y Badges */} -
+
-

Plan de Estudios 2024

-

+

+ Plan de Estudios 2024 +

+

Ingeniería en Sistemas Computacionales

- + {/* Badges de la derecha */}
- + Ingeniería - + Licenciatura - + En Revisión
{/* 3. Cards de Información (Nivel, Duración, etc.) */} -
- } label="Nivel" value="Superior" /> - } label="Duración" value="9 Semestres" /> - } label="Créditos" value="320" /> - } label="Creación" value="14 ene 2024" /> +
+ } + label="Nivel" + value="Superior" + /> + } + label="Duración" + value="9 Semestres" + /> + } + label="Créditos" + value="320" + /> + } + label="Creación" + value="14 ene 2024" + />
{/* 4. Navegación de Tabs */} -
-
@@ -79,36 +126,43 @@ function RouteComponent() { ) } - // Sub-componente para las tarjetas de información -function InfoCard({ icon, label, value }: { icon: React.ReactNode, label: string, value: string }) { +function InfoCard({ + icon, + label, + value, +}: { + icon: React.ReactNode + label: string + value: string +}) { return ( -
-
- {icon} -
+
+
{icon}
-

{label}

+

+ {label} +

{value}

) } -function Tab({ - to, - params, - children - }: { - to: string; - params?: any; - children: React.ReactNode - }) { +function Tab({ + to, + params, + children, +}: { + to: string + params?: any + children: React.ReactNode +}) { return ( ) -} \ No newline at end of file +} diff --git a/src/routes/planes/$planId/asignaturas/index.tsx b/src/routes/planes/$planId/asignaturas/index.tsx index f6792f4..76f863e 100644 --- a/src/routes/planes/$planId/asignaturas/index.tsx +++ b/src/routes/planes/$planId/asignaturas/index.tsx @@ -1,146 +1,10 @@ -import { createFileRoute } from '@tanstack/react-router' -import { Button } from '@/components/ui/button' -import { Card, CardContent } from '@/components/ui/card' -import { - BookOpen, - Sparkles, - FileText, - Library, - LayoutTemplate, - History, - ArrowRight, - GraduationCap, -} from 'lucide-react' +import { createFileRoute, redirect } from '@tanstack/react-router' -export const Route = createFileRoute( - '/planes/$planId/asignaturas/' -)({ - component: MateriasLandingPage, +export const Route = createFileRoute('/planes/$planId/asignaturas/')({ + beforeLoad: ({ params }) => { + throw redirect({ + to: '/planes/$planId/materias', + params, + }) + }, }) - -export default function MateriasLandingPage() { - return ( -
- {/* ================= HERO ================= */} -
-
-
- - SISTEMA DE GESTIÓN CURRICULAR -
- -

- Universidad La Salle -

- -

- Diseña, documenta y mejora programas de estudio con herramientas - de inteligencia artificial integradas y cumplimiento normativo SEP. -

- - -
-
- - {/* ================= FEATURES ================= */} -
-
-

- Características principales -

- -
- } - title="Gestión de Materias" - description="Edita datos generales, contenido temático y bibliografía con una interfaz intuitiva." - /> - - } - title="IA Integrada" - description="Usa inteligencia artificial para mejorar objetivos, competencias y alinear con perfiles de egreso." - /> - - } - title="Documentos SEP" - description="Genera automáticamente documentos oficiales para la Secretaría de Educación Pública." - /> - - } - title="Biblioteca Digital" - description="Busca y vincula recursos del repositorio de Biblioteca La Salle directamente." - /> - - } - title="Plantillas Flexibles" - description="Adapta la estructura de materias según plantillas SEP o institucionales." - /> - - } - title="Historial Completo" - description="Rastrea todos los cambios con historial detallado por usuario y fecha." - /> -
-
-
- - {/* ================= CTA ================= */} -
-
-

- Explora la vista de detalle de materia -

- -

- Navega por las diferentes pestañas para ver cómo funciona el sistema - de gestión curricular. -

- - -
-
-
- ) -} - -/* ================= FEATURE CARD ================= */ - -function FeatureCard({ - icon, - title, - description, -}: { - icon: React.ReactNode - title: string - description: string -}) { - return ( - - -
- {icon} -
- -

{title}

- -

- {description} -

-
-
- ) -} diff --git a/src/routes/planes/$planId/index.tsx b/src/routes/planes/$planId/index.tsx new file mode 100644 index 0000000..63755ad --- /dev/null +++ b/src/routes/planes/$planId/index.tsx @@ -0,0 +1,10 @@ +import { createFileRoute, redirect } from '@tanstack/react-router' + +export const Route = createFileRoute('/planes/$planId/')({ + beforeLoad: ({ params }) => { + throw redirect({ + to: '/planes/$planId/datos', + params, + }) + }, +})