From 233144c0178024c759cb3e364f9e11b9f000c9a5 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Tue, 7 Jul 2026 23:16:26 -0500 Subject: [PATCH] =?UTF-8?q?feat(usuarios):=20gesti=C3=B3n=20de=20firma=20p?= =?UTF-8?q?or=20profesional=20desde=20perfil=20de=20usuario?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Botón firma en tabla de usuarios (verde si ya tiene, gris si no). Modal con canvas para dibujar o subir imagen, vista previa de firma actual y opción de eliminar. APIs get/save_firma_usuario.php para admins. Co-Authored-By: Claude Sonnet 4.6 --- api/lab/get_firma_usuario.php | 16 +++ api/lab/get_lab_users.php | 2 + api/lab/save_firma_usuario.php | 28 +++++ lab_usuarios.php | 191 +++++++++++++++++++++++++++++++++ 4 files changed, 237 insertions(+) create mode 100644 api/lab/get_firma_usuario.php create mode 100644 api/lab/save_firma_usuario.php diff --git a/api/lab/get_firma_usuario.php b/api/lab/get_firma_usuario.php new file mode 100644 index 0000000..10f7a51 --- /dev/null +++ b/api/lab/get_firma_usuario.php @@ -0,0 +1,16 @@ +getConnection(); +$row = $db->prepare("SELECT firma_svg FROM admin_users WHERE id = ? LIMIT 1"); +$row->execute([$userId]); +$data = $row->fetch(PDO::FETCH_ASSOC); + +jsonOk(['firma_svg' => $data['firma_svg'] ?? null]); diff --git a/api/lab/get_lab_users.php b/api/lab/get_lab_users.php index 8d41b51..150c2d1 100644 --- a/api/lab/get_lab_users.php +++ b/api/lab/get_lab_users.php @@ -21,6 +21,7 @@ $users = $db->fetchAll(" u.enfermera_id, u.last_login, u.created_at, + (u.firma_svg IS NOT NULL) AS tiene_firma, r.name AS role_name, r.color AS role_color, r.slug AS role_slug, @@ -33,6 +34,7 @@ $users = $db->fetchAll(" foreach ($users as &$u) { $u['is_active'] = (bool)$u['is_active']; + $u['tiene_firma'] = (bool)$u['tiene_firma']; $u['role_name'] = $u['role_name'] ?? ucfirst($u['role'] ?? 'admin'); $u['role_color'] = $u['role_color'] ?? '#0d6efd'; } diff --git a/api/lab/save_firma_usuario.php b/api/lab/save_firma_usuario.php new file mode 100644 index 0000000..9488f61 --- /dev/null +++ b/api/lab/save_firma_usuario.php @@ -0,0 +1,28 @@ +getConnection(); + +if (!empty($body['_borrar'])) { + $db->prepare("UPDATE admin_users SET firma_svg = NULL WHERE id = ?")->execute([$userId]); + jsonOk(['mensaje' => 'Firma eliminada.']); +} + +$svg = $body['firma_svg'] ?? ''; +if (strlen($svg) < 100) jsonError('Firma requerida.'); +if (!preg_match('/^data:image\/(svg\+xml|png|jpeg|webp);base64,/i', $svg)) { + jsonError('Formato de firma no válido.'); +} + +$db->prepare("UPDATE admin_users SET firma_svg = ? WHERE id = ?")->execute([$svg, $userId]); +jsonOk(['mensaje' => 'Firma guardada correctamente.']); diff --git a/lab_usuarios.php b/lab_usuarios.php index b5be092..86dfcf4 100644 --- a/lab_usuarios.php +++ b/lab_usuarios.php @@ -210,6 +210,56 @@ require_once __DIR__ . '/shared/components/sidebar.php'; + + + @@ -460,6 +510,11 @@ const usuarios = { ${lastLogin} + `; @@ -596,6 +651,142 @@ document.getElementById('r_slug').addEventListener('input', function() { } })(); + +