From 581dc566bcc13455a956dddcf2b8380181897e5d Mon Sep 17 00:00:00 2001 From: "Roberto.silva" Date: Fri, 6 Feb 2026 15:54:40 -0600 Subject: [PATCH] Que no sean INPUTS fix #72 --- src/routes/planes/$planId/_detalle/mapa.tsx | 106 +++++++++++++++----- 1 file changed, 79 insertions(+), 27 deletions(-) diff --git a/src/routes/planes/$planId/_detalle/mapa.tsx b/src/routes/planes/$planId/_detalle/mapa.tsx index 8ee42f5..287ac91 100644 --- a/src/routes/planes/$planId/_detalle/mapa.tsx +++ b/src/routes/planes/$planId/_detalle/mapa.tsx @@ -1,4 +1,4 @@ -/* eslint-disable jsx-a11y/click-events-have-key-events */ +/* eslint-disable jsx-a11y/no-static-element-interactions */ /* eslint-disable jsx-a11y/label-has-associated-control */ import { createFileRoute } from '@tanstack/react-router' import { @@ -7,6 +7,7 @@ import { AlertTriangle, GripVertical, Trash2, + Pencil, } from 'lucide-react' import { useMemo, useState, useEffect } from 'react' @@ -239,8 +240,13 @@ function MapaCurricularPage() { }, ) } - const guardarEdicionLinea = (id: string) => { - if (!tempNombreLinea.trim()) { + 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() + + if (!nombreAFijar) { setEditingLineaId(null) return } @@ -248,11 +254,10 @@ function MapaCurricularPage() { updateLineaApi( { lineaId: id, - patch: { nombre: tempNombreLinea.trim() }, + patch: { nombre: nombreAFijar }, }, { onSuccess: (lineaActualizada) => { - // ACTUALIZACIÓN MANUAL DEL ESTADO LOCAL setLineas((prev) => prev.map((l) => l.id === id ? { ...l, nombre: lineaActualizada.nombre } : l, @@ -261,6 +266,10 @@ function MapaCurricularPage() { setEditingLineaId(null) setTempNombreLinea('') }, + onError: (err) => { + console.error('Error al actualizar linea:', err) + // Opcional: revertir cambios o avisar al usuario + }, }, ) } @@ -454,6 +463,33 @@ 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 lineaOriginal = lineas.find((l) => l.id === id) + + if (nuevoNombre !== lineaOriginal?.nombre) { + // IMPORTANTE: Pasamos nuevoNombre directamente + guardarEdicionLinea(id, nuevoNombre) + } else { + setEditingLineaId(null) + } + } + if (loadingAsig || loadingLineas) return
Cargando mapa curricular...
@@ -568,36 +604,52 @@ function MapaCurricularPage() { }} >
- {editingLineaId === linea.id ? ( - setTempNombreLinea(e.target.value)} - onBlur={() => guardarEdicionLinea(linea.id)} - onKeyDown={(e) => - e.key === 'Enter' && guardarEdicionLinea(linea.id) - } - /> - ) : ( - // eslint-disable-next-line jsx-a11y/no-static-element-interactions +
handleKeyDownLinea(e, linea.id)} + onBlur={(e) => handleBlurLinea(e, linea.id)} onClick={() => { - setEditingLineaId(linea.id) - setTempNombreLinea(linea.nombre) + if (editingLineaId !== linea.id) { + setEditingLineaId(linea.id) + setTempNombreLinea(linea.nombre) + } }} + className={`block w-full text-xs font-bold break-words outline-none ${ + editingLineaId === linea.id + ? 'cursor-text border-b border-teal-500/50 pb-1' + : 'cursor-pointer' + }`} > {linea.nombre} - )} +
- borrarLinea(linea.id)} // Aquí también podrías añadir una mutación delete - /> +
+ {/* Botón de edición que aparece en hover o si está editando */} + + + borrarLinea(linea.id)} + /> +
{ciclosArray.map((ciclo) => (