From 7b6baca2b566ada04340eeddf70594894e122829 Mon Sep 17 00:00:00 2001 From: Carlos Tello Date: Wed, 23 Sep 2026 15:58:03 -0300 Subject: [PATCH] fix(admin): resolver pantalla en blanco al editar ficha de usuario (GET /admin/users/edit/:id) --- backend/app/routes/api/admin.py | 14 ++++++++++ frontend/src/routes/admin.js | 49 ++++++++++++++++++++++++++++----- frontend/views/base.html | 17 ++++++------ 3 files changed, 65 insertions(+), 15 deletions(-) diff --git a/backend/app/routes/api/admin.py b/backend/app/routes/api/admin.py index 1acbbea..1e6748b 100644 --- a/backend/app/routes/api/admin.py +++ b/backend/app/routes/api/admin.py @@ -345,6 +345,20 @@ def create_user(): 'user': user.to_dict() }), 201 +@api_admin_bp.route('/users/', methods=['GET']) +@jwt_required +def get_user_by_id(id): + user = User.query.get_or_404(id) + d = user.to_dict() + d['role_obj'] = { + 'id': user.role_obj.id, + 'name': user.role_obj.name + } if user.role_obj else {'id': 1, 'name': user.role or 'Admin'} + return jsonify({ + 'status': 'success', + 'user': d + }), 200 + @api_admin_bp.route('/users/', methods=['PUT']) @jwt_required def update_user(id): diff --git a/frontend/src/routes/admin.js b/frontend/src/routes/admin.js index ae619d5..71be236 100644 --- a/frontend/src/routes/admin.js +++ b/frontend/src/routes/admin.js @@ -382,28 +382,63 @@ const handleUserAdd = async (req, res) => { title: 'Nuevo Usuario — Edu-Space Admin', user: null, roles, - document_types + document_types, + error: req.query.error || null, + msg: req.query.msg || null }); } catch (err) { console.error('Error in user add:', err.message); - res.render('admin/users/form', { title: 'Nuevo Usuario', user: null, roles: MOCK_ROLES, document_types: [] }); + res.render('admin/users/form', { + title: 'Nuevo Usuario — Edu-Space Admin', + user: null, + roles: MOCK_ROLES, + document_types: [], + error: req.query.error || null, + msg: null + }); } }; const handleUserEdit = async (req, res) => { try { - const { users, roles, document_types } = await fetchUsersAndRoles(req.apiClient); const userId = req.params.id || req.query.id; - const targetUser = (userId ? users.find(u => String(u.id) === String(userId)) : null) || users[0] || MOCK_USERS[0]; + const { users, roles, document_types } = await fetchUsersAndRoles(req.apiClient); + let targetUser = userId ? users.find(u => String(u.id) === String(userId)) : null; + + // Si no se encontró en la lista general y hay userId, intentar fetch individual + if (!targetUser && userId && req.apiClient) { + try { + const singleRes = await req.apiClient.get(`/users/${userId}`); + if (singleRes.data && (singleRes.data.user || singleRes.data.data)) { + targetUser = singleRes.data.user || singleRes.data.data; + } + } catch (e) { + console.warn(`User ${userId} not found via single endpoint:`, e.message); + } + } + + targetUser = targetUser || (userId ? null : users[0]) || MOCK_USERS[0]; + + const userName = targetUser ? (targetUser.name || `${targetUser.first_name || ''} ${targetUser.last_name || ''}`.trim() || targetUser.email || `Usuario #${targetUser.id}`) : 'Usuario'; + res.render('admin/users/form', { - title: `Editar Usuario: ${targetUser.name} — Edu-Space Admin`, + title: `Editar Usuario: ${userName} — Edu-Space Admin`, user: targetUser, roles, - document_types + document_types, + error: req.query.error || null, + msg: req.query.msg || null }); } catch (err) { console.error('Error in user edit:', err.message); - res.render('admin/users/form', { title: 'Editar Usuario', user: MOCK_USERS[0], roles: MOCK_ROLES, document_types: [] }); + res.render('admin/users/form', { + title: 'Editar Usuario — Edu-Space Admin', + user: MOCK_USERS[0], + roles: MOCK_ROLES, + document_types: [], + error: 'No se pudo cargar la información del usuario.', + msg: null + }); } }; diff --git a/frontend/views/base.html b/frontend/views/base.html index d92cf64..32c34f3 100644 --- a/frontend/views/base.html +++ b/frontend/views/base.html @@ -1,3 +1,4 @@ +{% set auth_user = current_user if (current_user and current_user.is_authenticated) else user %} @@ -11,7 +12,7 @@