From aee352924e12f87266554267fd08ff032171ba64 Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 27 Oct 2025 15:30:50 +0100 Subject: [PATCH] activate/deactivate user from index table --- assets/controllers/user_controller.js | 129 +++++++++++++++++--------- src/Controller/UserController.php | 6 +- 2 files changed, 89 insertions(+), 46 deletions(-) diff --git a/assets/controllers/user_controller.js b/assets/controllers/user_controller.js index 3fef33c..8163815 100644 --- a/assets/controllers/user_controller.js +++ b/assets/controllers/user_controller.js @@ -164,75 +164,118 @@ export default class extends Controller { {title: "Nom", field: "name", headerFilter: "input", widthGrow: 2, vertAlign: "middle"}, {title: "Prénom", field: "prenom", headerFilter: "input", widthGrow: 2, vertAlign: "middle"}, {title: "Email", field: "email", headerFilter: "input", widthGrow: 3, vertAlign: "middle"}, + { + title: "Statut", field: "statut", vertAlign: "middle", + formatter: (cell) => { + const statut = cell.getValue(); + if (statut) { + return `Actif` + } else { + return `Inactif` + } + } + }, { title: "Actions", field: "showUrl", - width: 130, vertAlign: "middle", headerSort: false, formatter: (cell) => { const url = cell.getValue(); - if (!url) return ''; - // You can get other row data like ID for delete endpoint if needed const rowData = cell.getRow().getData(); - const deleteId = rowData.id; + const userId = rowData.id; + const statut = rowData.statut; + + // Decide which action (deactivate vs activate) + const isActive = Boolean(statut); + + const actionClass = isActive ? 'deactivate-user' : 'activate-user'; + const actionTitle = isActive ? 'Désactiver' : 'Réactiver'; + const actionColorClass = isActive ? 'color-secondary' : 'color-primary'; + + // SVGs + const deactivateSvg = ` + + + `; + + const activateSvg = ` + + `; + + const actionSvg = isActive ? deactivateSvg : activateSvg; return ` -
- - - + + + - + - - - - - -
- `; + + ${actionSvg} + + + `; }, + cellClick: function (e, cell) { const target = e.target.closest('a'); - if (target && target.classList.contains('delete-user')) { + if (!target) return; + + // Deactivate + if (target.classList.contains('deactivate-user')) { e.preventDefault(); const userId = target.getAttribute('data-id'); + if (confirm('Voulez-vous vraiment désactiver cet utilisateur ?')) { - if (confirm('Voulez-vous vraiment supprimer cet utilisateur ?')) { - // Example delete call (replace URL as needed) - fetch(`/user/delete/${userId}`, { + fetch(`/user/deactivate/${userId}`, { method: 'POST', + headers: {'X-Requested-With': 'XMLHttpRequest'} }) - .then(response => { + .then(async (response) => { if (response.ok) { - alert('Utilisateur supprimé'); - cell.getRow().delete(); // Remove row from table + // Option 1: update row status and re-render to switch icon + const data = cell.getRow().getData(); + data.statut = false; + cell.getRow().reformat(); } else { - alert('Erreur lors de la suppression'); + const text = await response.text(); + alert('Erreur lors de la désactivation: ' + text); } }) - .catch(() => alert('Erreur lors de la suppression')); + .catch(() => alert('Erreur lors de la désactivation')); + } + } + + // Activate + if (target.classList.contains('activate-user')) { + e.preventDefault(); + const userId = target.getAttribute('data-id'); + if (confirm('Voulez-vous réactiver cet utilisateur ?')) { + + fetch(`/user/activate/${userId}`, { + method: 'POST', + headers: {'X-Requested-With': 'XMLHttpRequest'} + }) + .then(async (response) => { + if (response.ok) { + // Switch status back to active and re-render row + const data = cell.getRow().getData(); + data.statut = true; + cell.getRow().reformat(); + } else { + const text = await response.text(); + alert('Erreur lors de la réactivation: ' + text); + } + }) + .catch(() => alert('Erreur lors de la réactivation')); } } } diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 71dd6bd..8f2e55b 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -216,7 +216,7 @@ class UserController extends AbstractController $user->setIsActive(false); $user->setModifiedAt(new \DateTimeImmutable('now')); $this->userOrganizationService->deactivateAllUserOrganizationLinks($user, $actingUser); - if($this->userService->isUserConnected($user)){ + if($this->userService->isUserConnected($user->getUserIdentifier())){ $this->userService->revokeUserTokens($user->getUserIdentifier()); } $this->entityManager->persist($user); @@ -397,8 +397,7 @@ class UserController extends AbstractController // Base query: keep your constraints intact (isDeleted=false, isActive=true) $qb = $repo->createQueryBuilder('u') - ->where('u.isDeleted = :del')->setParameter('del', false) - ->andWhere('u.isActive = :active')->setParameter('active', true); + ->where('u.isDeleted = :del')->setParameter('del', false); $countQb = clone $qb; $total = (int)$countQb->select('COUNT(u.id)')->getQuery()->getSingleScalarResult(); @@ -416,6 +415,7 @@ class UserController extends AbstractController 'email' => $user->getEmail(), 'isConnected' => $this->userService->isUserConnected($user->getUserIdentifier()), 'showUrl' => $this->generateUrl('user_show', ['id' => $user->getId()]), + 'statut' => $user->isActive(), ]; }, $rows);