From 2d2834b70a88a85c836f8cff53a895883de07b8d Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 11 Nov 2025 13:33:11 +0000 Subject: [PATCH] Feature: Ajout modification du mot de passe dans l'administration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ajout bouton 🔑 Mot de passe pour chaque utilisateur - Fonction changeUserPassword avec confirmation du mot de passe - Validation de longueur minimum (6 caractères) - Double saisie pour confirmation - Utilisation de la route PUT /api/users/:id existante - Style bleu pour le bouton d'édition - Event delegation pour le nouveau bouton - Permet aux admins de changer leur propre mot de passe --- public/css/components.css | 16 ++++++++++++++- public/js/complete-app.js | 43 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/public/css/components.css b/public/css/components.css index 53f7229..f96a037 100644 --- a/public/css/components.css +++ b/public/css/components.css @@ -509,15 +509,29 @@ background: var(--color-background); } +.btn-edit-user, .btn-delete-user { padding: var(--spacing-sm) var(--spacing-md); - background: var(--color-danger); color: white; border: none; border-radius: 6px; cursor: pointer; font-size: 0.875rem; transition: all var(--transition-speed); + margin-right: var(--spacing-sm); +} + +.btn-edit-user { + background: var(--color-primary); +} + +.btn-edit-user:hover { + background: #2980b9; + transform: translateY(-1px); +} + +.btn-delete-user { + background: var(--color-danger); } .btn-delete-user:hover { diff --git a/public/js/complete-app.js b/public/js/complete-app.js index e2096b0..b80ea52 100644 --- a/public/js/complete-app.js +++ b/public/js/complete-app.js @@ -692,11 +692,14 @@ function renderUsersTable(users) { ${user.is_admin ? '✓ Oui' : '✗ Non'} ${new Date(user.created_at).toLocaleDateString('fr-FR')} + ${user.id !== state.user.id ? ` - ` : 'Vous-même'} + ` : ''} `).join(''); @@ -756,6 +759,32 @@ async function createUser() { } } +async function changeUserPassword(id, username) { + const password = prompt(`Nouveau mot de passe pour "${username}" :`); + + if (!password) return; + + if (password.length < 6) { + alert('Le mot de passe doit contenir au moins 6 caractères'); + return; + } + + const confirmPassword = prompt('Confirmer le nouveau mot de passe :'); + + if (password !== confirmPassword) { + alert('Les mots de passe ne correspondent pas'); + return; + } + + try { + await api.put(`/api/users/${id}`, { password }); + alert('Mot de passe modifié avec succès'); + } catch (error) { + console.error('Erreur modification mot de passe:', error); + alert('Erreur lors de la modification du mot de passe'); + } +} + async function deleteUser(id, username) { const confirmed = await confirmDialog.show({ icon: '⚠️', @@ -899,11 +928,19 @@ async function init() { }); } - // Event delegation pour les boutons de suppression d'utilisateurs + // Event delegation pour les boutons d'administration des utilisateurs const usersTableBody = document.getElementById('usersTableBody'); if (usersTableBody) { usersTableBody.addEventListener('click', (e) => { - if (e.target.classList.contains('btn-delete-user') || e.target.closest('.btn-delete-user')) { + // Bouton changer mot de passe + if (e.target.classList.contains('btn-edit-user') || e.target.closest('.btn-edit-user')) { + const btn = e.target.classList.contains('btn-edit-user') ? e.target : e.target.closest('.btn-edit-user'); + const userId = parseInt(btn.dataset.userId); + const username = btn.dataset.username; + changeUserPassword(userId, username); + } + // Bouton supprimer utilisateur + else if (e.target.classList.contains('btn-delete-user') || e.target.closest('.btn-delete-user')) { const btn = e.target.classList.contains('btn-delete-user') ? e.target : e.target.closest('.btn-delete-user'); const userId = parseInt(btn.dataset.userId); const username = btn.dataset.username;