From 60bfa311861f20c22c67352d3276e06b27228e3e Mon Sep 17 00:00:00 2001 From: Alejandro Rosales Date: Tue, 24 Mar 2026 09:11:40 -0600 Subject: [PATCH] Refactor MapaCurricularPage: improve line editing functionality and enhance tooltip interactions --- src/routes/planes/$planId/_detalle/mapa.tsx | 122 +++++++++----------- 1 file changed, 57 insertions(+), 65 deletions(-) diff --git a/src/routes/planes/$planId/_detalle/mapa.tsx b/src/routes/planes/$planId/_detalle/mapa.tsx index de321f1..0738284 100644 --- a/src/routes/planes/$planId/_detalle/mapa.tsx +++ b/src/routes/planes/$planId/_detalle/mapa.tsx @@ -1,7 +1,6 @@ -/* eslint-disable jsx-a11y/no-static-element-interactions */ /* eslint-disable jsx-a11y/label-has-associated-control */ import { createFileRoute } from '@tanstack/react-router' -import { Plus, AlertTriangle, Trash2, Pencil, Download } from 'lucide-react' +import { Plus, AlertTriangle, Trash2, Download } from 'lucide-react' import * as Icons from 'lucide-react' import { useMemo, useState, useEffect, Fragment } from 'react' @@ -238,7 +237,7 @@ function AsignaturaCardItem({ - + {estado.label} @@ -249,7 +248,7 @@ function AsignaturaCardItem({ {/* titulo */}

(null) - const [tempNombreLinea, setTempNombreLinea] = useState('') const { mutate: createLinea } = useCreateLinea() const { mutate: updateLineaApi } = useUpdateLinea() const { mutate: deleteLineaApi } = useDeleteLinea() @@ -397,11 +395,8 @@ function MapaCurricularPage() { }, ) } - const guardarEdicionLinea = (id: string, nuevoNombre?: string) => { - // Usamos el nombre que viene por parámetro o el del estado como fallback - const nombreAFijar = ( - nuevoNombre !== undefined ? nuevoNombre : tempNombreLinea - ).trim() + const guardarEdicionLinea = (id: string, nuevoNombre: string) => { + const nombreAFijar = nuevoNombre.trim() if (!nombreAFijar) { setEditingLineaId(null) @@ -421,7 +416,6 @@ function MapaCurricularPage() { ), ) setEditingLineaId(null) - setTempNombreLinea('') }, onError: (err) => { console.error('Error al actualizar linea:', err) @@ -632,38 +626,28 @@ function MapaCurricularPage() { [asignaturas], ) - const handleKeyDownLinea = ( - e: React.KeyboardEvent, - _id: string, - ) => { - if (e.key === 'Enter') { - e.preventDefault() - e.currentTarget.blur() - } - } - - const handleBlurLinea = ( - e: React.FocusEvent, - id: string, - ) => { - const nuevoNombre = e.currentTarget.textContent.trim() || '' - - // Buscamos la línea original para comparar + const confirmarEdicionLinea = (id: string, nuevoNombreRaw: string) => { + const nuevoNombre = nuevoNombreRaw.trim() const lineaOriginal = lineas.find((l) => l.id === id) - if (nuevoNombre !== lineaOriginal?.nombre) { - // IMPORTANTE: Pasamos nuevoNombre directamente - guardarEdicionLinea(id, nuevoNombre) - } else { + if (!nuevoNombre) { setEditingLineaId(null) + return } + + if (nuevoNombre !== lineaOriginal?.nombre) { + guardarEdicionLinea(id, nuevoNombre) + return + } + + setEditingLineaId(null) } if (loadingAsig || loadingLineas) return
Cargando mapa curricular...
return ( -
+
{/* Header */}
@@ -770,7 +754,7 @@ function MapaCurricularPage() { return (
-
- handleKeyDownLinea(e, linea.id)} - onBlur={(e) => handleBlurLinea(e, linea.id)} - onClick={() => { - if (editingLineaId !== linea.id) { - setEditingLineaId(linea.id) - setTempNombreLinea(linea.nombre) - } - }} - className={`text-foreground block w-full truncate text-sm font-bold wrap-break-word outline-none ${ - editingLineaId === linea.id - ? 'border-primary/40 cursor-text border-b pb-1' - : 'cursor-pointer' - }`} - > - {linea.nombre} - +
+ + + setEditingLineaId(linea.id)} + onKeyDown={(e) => { + if (e.key === 'Enter') { + e.preventDefault() + e.currentTarget.blur() + } + if (e.key === 'Escape') { + e.preventDefault() + e.currentTarget.textContent = linea.nombre + e.currentTarget.blur() + } + }} + onBlur={(e) => + confirmarEdicionLinea( + linea.id, + e.currentTarget.textContent, + ) + } + className="text-foreground hover:text-foreground/85 block w-full cursor-text text-sm leading-snug wrap-break-word transition-colors outline-none" + > + {linea.nombre} + + + + {linea.nombre} + +
-
- +