Reintegración con main. Corrección de errores de fetch. Sincronización con la base de datos remota
This commit is contained in:
@@ -165,7 +165,7 @@ export async function plan_asignaturas_list(
|
|||||||
const { data, error } = await supabase
|
const { data, error } = await supabase
|
||||||
.from('asignaturas')
|
.from('asignaturas')
|
||||||
.select(
|
.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)
|
.eq('plan_estudio_id', planId)
|
||||||
.order('numero_ciclo', { ascending: true, nullsFirst: false })
|
.order('numero_ciclo', { ascending: true, nullsFirst: false })
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
import { supabaseBrowser } from '../supabase/client'
|
import { supabaseBrowser } from '../supabase/client'
|
||||||
import { invokeEdge } from '../supabase/invokeEdge'
|
import { invokeEdge } from '../supabase/invokeEdge'
|
||||||
|
|
||||||
import { throwIfError, requireData } from './_helpers'
|
import { throwIfError, requireData } from './_helpers'
|
||||||
|
|
||||||
|
import type { DocumentoResult } from './plans.api'
|
||||||
import type {
|
import type {
|
||||||
Asignatura,
|
Asignatura,
|
||||||
BibliografiaAsignatura,
|
BibliografiaAsignatura,
|
||||||
@@ -8,7 +11,6 @@ import type {
|
|||||||
TipoAsignatura,
|
TipoAsignatura,
|
||||||
UUID,
|
UUID,
|
||||||
} from '../types/domain'
|
} from '../types/domain'
|
||||||
import type { DocumentoResult } from './plans.api'
|
|
||||||
|
|
||||||
const EDGE = {
|
const EDGE = {
|
||||||
subjects_create_manual: 'subjects_create_manual',
|
subjects_create_manual: 'subjects_create_manual',
|
||||||
@@ -32,7 +34,7 @@ export async function subjects_get(subjectId: UUID): Promise<Asignatura> {
|
|||||||
.from('asignaturas')
|
.from('asignaturas')
|
||||||
.select(
|
.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(
|
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,
|
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))
|
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<Asignatura> {
|
|||||||
|
|
||||||
export async function subjects_history(
|
export async function subjects_history(
|
||||||
subjectId: UUID,
|
subjectId: UUID,
|
||||||
): Promise<CambioAsignatura[]> {
|
): Promise<Array<CambioAsignatura>> {
|
||||||
const supabase = supabaseBrowser()
|
const supabase = supabaseBrowser()
|
||||||
const { data, error } = await supabase
|
const { data, error } = await supabase
|
||||||
.from('cambios_asignatura')
|
.from('cambios_asignatura')
|
||||||
@@ -65,7 +67,7 @@ export async function subjects_history(
|
|||||||
|
|
||||||
export async function subjects_bibliografia_list(
|
export async function subjects_bibliografia_list(
|
||||||
subjectId: UUID,
|
subjectId: UUID,
|
||||||
): Promise<BibliografiaAsignatura[]> {
|
): Promise<Array<BibliografiaAsignatura>> {
|
||||||
const supabase = supabaseBrowser()
|
const supabase = supabaseBrowser()
|
||||||
const { data, error } = await supabase
|
const { data, error } = await supabase
|
||||||
.from('bibliografia_asignatura')
|
.from('bibliografia_asignatura')
|
||||||
@@ -112,9 +114,9 @@ export async function ai_generate_subject(payload: {
|
|||||||
iaConfig: {
|
iaConfig: {
|
||||||
descripcionEnfoque: string
|
descripcionEnfoque: string
|
||||||
notasAdicionales?: string
|
notasAdicionales?: string
|
||||||
archivosExistentesIds?: UUID[]
|
archivosExistentesIds?: Array<UUID>
|
||||||
repositoriosIds?: UUID[]
|
repositoriosIds?: Array<UUID>
|
||||||
archivosAdhocIds?: UUID[]
|
archivosAdhocIds?: Array<UUID>
|
||||||
usarMCP?: boolean
|
usarMCP?: boolean
|
||||||
}
|
}
|
||||||
}): Promise<any> {
|
}): Promise<any> {
|
||||||
@@ -145,7 +147,7 @@ export async function subjects_clone_from_existing(payload: {
|
|||||||
export async function subjects_import_from_file(payload: {
|
export async function subjects_import_from_file(payload: {
|
||||||
planId: UUID
|
planId: UUID
|
||||||
archivoWordAsignaturaId: UUID
|
archivoWordAsignaturaId: UUID
|
||||||
archivosAdicionalesIds?: UUID[]
|
archivosAdicionalesIds?: Array<UUID>
|
||||||
}): Promise<Asignatura> {
|
}): Promise<Asignatura> {
|
||||||
return invokeEdge<Asignatura>(EDGE.subjects_import_from_file, payload)
|
return invokeEdge<Asignatura>(EDGE.subjects_import_from_file, payload)
|
||||||
}
|
}
|
||||||
@@ -175,7 +177,7 @@ export async function subjects_update_fields(
|
|||||||
|
|
||||||
export async function subjects_update_contenido(
|
export async function subjects_update_contenido(
|
||||||
subjectId: UUID,
|
subjectId: UUID,
|
||||||
unidades: any[],
|
unidades: Array<any>,
|
||||||
): Promise<Asignatura> {
|
): Promise<Asignatura> {
|
||||||
return invokeEdge<Asignatura>(EDGE.subjects_update_contenido, {
|
return invokeEdge<Asignatura>(EDGE.subjects_update_contenido, {
|
||||||
subjectId,
|
subjectId,
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import {
|
|||||||
} from 'lucide-react'
|
} from 'lucide-react'
|
||||||
import { useState, useMemo } from '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 { Badge } from '@/components/ui/badge'
|
||||||
import { Button } from '@/components/ui/button'
|
import { Button } from '@/components/ui/button'
|
||||||
@@ -33,17 +33,24 @@ import {
|
|||||||
import { usePlanAsignaturas, usePlanLineas } from '@/data'
|
import { usePlanAsignaturas, usePlanLineas } from '@/data'
|
||||||
|
|
||||||
// --- Configuración de Estilos ---
|
// --- Configuración de Estilos ---
|
||||||
const statusConfig: Record<string, { label: string; className: string }> = {
|
const statusConfig: Record<
|
||||||
|
AsignaturaStatus,
|
||||||
|
{ label: string; className: string }
|
||||||
|
> = {
|
||||||
borrador: { label: 'Borrador', className: 'bg-slate-100 text-slate-600' },
|
borrador: { label: 'Borrador', className: 'bg-slate-100 text-slate-600' },
|
||||||
revisada: { label: 'Revisada', className: 'bg-amber-100 text-amber-700' },
|
revisada: { label: 'Revisada', className: 'bg-amber-100 text-amber-700' },
|
||||||
aprobada: { label: 'Aprobada', className: 'bg-emerald-100 text-emerald-700' },
|
aprobada: { label: 'Aprobada', className: 'bg-emerald-100 text-emerald-700' },
|
||||||
}
|
}
|
||||||
|
|
||||||
const tipoConfig: Record<string, { label: string; className: string }> = {
|
const tipoConfig: Record<TipoAsignatura, { label: string; className: string }> =
|
||||||
obligatoria: { label: 'Obligatoria', className: 'bg-blue-100 text-blue-700' },
|
{
|
||||||
optativa: { label: 'Optativa', className: 'bg-purple-100 text-purple-700' },
|
obligatoria: {
|
||||||
troncal: { label: 'Troncal', className: 'bg-slate-100 text-slate-700' },
|
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 ---
|
// --- Mapeadores de API ---
|
||||||
const mapAsignaturas = (asigApi: Array<any> = []): Array<Asignatura> => {
|
const mapAsignaturas = (asigApi: Array<any> = []): Array<Asignatura> => {
|
||||||
@@ -59,10 +66,13 @@ const mapAsignaturas = (asigApi: Array<any> = []): Array<Asignatura> => {
|
|||||||
estado: 'borrador', // O el campo que venga de tu API
|
estado: 'borrador', // O el campo que venga de tu API
|
||||||
hd: Math.floor((asig.horas_semana ?? 0) / 2),
|
hd: Math.floor((asig.horas_semana ?? 0) / 2),
|
||||||
hi: Math.ceil((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,
|
component: AsignaturasPage,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -272,17 +282,17 @@ function AsignaturasPage() {
|
|||||||
<TableCell>
|
<TableCell>
|
||||||
<Badge
|
<Badge
|
||||||
variant="outline"
|
variant="outline"
|
||||||
className={`capitalize shadow-sm ${tipoConfig[asignatura.tipo]?.className}`}
|
className={`capitalize shadow-sm ${tipoConfig[asignatura.tipo].className}`}
|
||||||
>
|
>
|
||||||
{tipoConfig[asignatura.tipo]?.label}
|
{tipoConfig[asignatura.tipo].label}
|
||||||
</Badge>
|
</Badge>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell>
|
<TableCell>
|
||||||
<Badge
|
<Badge
|
||||||
variant="outline"
|
variant="outline"
|
||||||
className={`capitalize shadow-sm ${statusConfig[asignatura.estado]?.className}`}
|
className={`capitalize shadow-sm ${statusConfig[asignatura.estado].className}`}
|
||||||
>
|
>
|
||||||
{statusConfig[asignatura.estado]?.label}
|
{statusConfig[asignatura.estado].label}
|
||||||
</Badge>
|
</Badge>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell>
|
<TableCell>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { createFileRoute, notFound } from '@tanstack/react-router'
|
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 { NotFoundPage } from '@/components/ui/NotFoundPage'
|
||||||
import { subjects_get } from '@/data/api/subjects.api'
|
import { subjects_get } from '@/data/api/subjects.api'
|
||||||
import { qk } from '@/data/query/keys'
|
import { qk } from '@/data/query/keys'
|
||||||
@@ -38,7 +38,7 @@ function RouteComponent() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<MateriaDetailPage></MateriaDetailPage>
|
<AsignaturaDetailPage></AsignaturaDetailPage>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user