388 lines
18 KiB
HTML
388 lines
18 KiB
HTML
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
|
|
xmlns:h="http://xmlns.jcp.org/jsf/html"
|
|
xmlns:f="http://xmlns.jcp.org/jsf/core"
|
|
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
|
|
xmlns:p="http://primefaces.org/ui"
|
|
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
|
|
|
|
<!--
|
|
Composant réutilisable: Actions Utilisateur (WOU/DRY Pattern)
|
|
|
|
Auteur: Lions User Manager
|
|
Version: 1.0.0
|
|
Description: Boutons d'action pour un utilisateur (activate, deactivate, delete, etc.)
|
|
|
|
Paramètres:
|
|
- user: UserDTO (requis) - L'utilisateur concerné
|
|
- showView: Boolean (défaut: true) - Afficher le bouton "Voir"
|
|
- showEdit: Boolean (défaut: true) - Afficher le bouton "Modifier"
|
|
- showDelete: Boolean (défaut: true) - Afficher le bouton "Supprimer"
|
|
- showActivate: Boolean (défaut: true) - Afficher le bouton "Activer"
|
|
- showDeactivate: Boolean (défaut: true) - Afficher le bouton "Désactiver"
|
|
- showResetPassword: Boolean (défaut: true) - Afficher le bouton "Réinitialiser mot de passe"
|
|
- showLogoutSessions: Boolean (défaut: false) - Afficher le bouton "Déconnecter toutes les sessions"
|
|
- viewAction: String (optionnel) - Action pour "Voir"
|
|
- editAction: String (optionnel) - Action pour "Modifier"
|
|
- deleteAction: String (optionnel) - Action pour "Supprimer"
|
|
- activateAction: String (optionnel) - Action pour "Activer"
|
|
- deactivateAction: String (optionnel) - Action pour "Désactiver"
|
|
- resetPasswordAction: String (optionnel) - Action pour "Réinitialiser mot de passe"
|
|
- logoutSessionsAction: String (optionnel) - Action pour "Déconnecter sessions"
|
|
- viewOutcome: String (optionnel) - Page pour "Voir"
|
|
- editOutcome: String (optionnel) - Page pour "Modifier"
|
|
- update: String (défaut: "@form") - Composants à mettre à jour
|
|
- layout: String (défaut: "horizontal") - Layout: "horizontal" ou "vertical" ou "dropdown"
|
|
|
|
Exemples d'utilisation:
|
|
|
|
1. Actions horizontales (défaut):
|
|
<ui:include src="/templates/components/user-management/user-actions.xhtml">
|
|
<ui:param name="user" value="#{user}" />
|
|
<ui:param name="update" value="userTable" />
|
|
</ui:include>
|
|
|
|
2. Actions en dropdown:
|
|
<ui:include src="/templates/components/user-management/user-actions.xhtml">
|
|
<ui:param name="user" value="#{user}" />
|
|
<ui:param name="layout" value="dropdown" />
|
|
<ui:param name="update" value="userTable" />
|
|
</ui:include>
|
|
|
|
3. Actions limitées:
|
|
<ui:include src="/templates/components/user-management/user-actions.xhtml">
|
|
<ui:param name="user" value="#{user}" />
|
|
<ui:param name="showDelete" value="false" />
|
|
<ui:param name="showResetPassword" value="false" />
|
|
</ui:include>
|
|
-->
|
|
|
|
<c:set var="update" value="#{empty update ? '@form' : update}" />
|
|
<c:set var="layout" value="#{empty layout ? 'horizontal' : layout}" />
|
|
<c:set var="showView" value="#{empty showView ? true : showView}" />
|
|
<c:set var="showEdit" value="#{empty showEdit ? true : showEdit}" />
|
|
<c:set var="showDelete" value="#{empty showDelete ? true : showDelete}" />
|
|
<c:set var="showActivate" value="#{empty showActivate ? true : showActivate}" />
|
|
<c:set var="showDeactivate" value="#{empty showDeactivate ? true : showDeactivate}" />
|
|
<c:set var="showResetPassword" value="#{empty showResetPassword ? true : showResetPassword}" />
|
|
<c:set var="showLogoutSessions" value="#{empty showLogoutSessions ? false : showLogoutSessions}" />
|
|
|
|
<!-- Définir les actions par défaut si non fournies -->
|
|
<c:set var="defaultActivateAction" value="#{userBean.activateUser(user.id)}" />
|
|
<c:set var="defaultDeactivateAction" value="#{userBean.deactivateUser(user.id)}" />
|
|
<c:set var="defaultDeleteAction" value="#{userBean.deleteUser(user.id)}" />
|
|
<c:set var="defaultResetPasswordAction" value="#{userBean.resetPassword(user.id)}" />
|
|
<c:set var="defaultLogoutSessionsAction" value="#{userBean.logoutAllSessions(user.id)}" />
|
|
|
|
<c:choose>
|
|
<!-- Layout Dropdown -->
|
|
<c:when test="#{layout == 'dropdown'}">
|
|
<p:commandButton
|
|
icon="pi pi-ellipsis-v"
|
|
styleClass="p-button-text p-button-sm p-button-rounded p-button-plain"
|
|
type="button"
|
|
title="Actions"
|
|
style="width: 2rem; height: 2rem; padding: 0; margin: 0;">
|
|
<p:menu styleClass="w-12rem">
|
|
<c:if test="#{showView}">
|
|
<p:menuitem
|
|
value="Voir le profil"
|
|
icon="pi pi-eye"
|
|
outcome="#{not empty viewOutcome ? viewOutcome : '/pages/user-manager/users/profile'}">
|
|
<f:param name="userId" value="#{user.id}" />
|
|
</p:menuitem>
|
|
</c:if>
|
|
|
|
<c:if test="#{showEdit}">
|
|
<p:menuitem
|
|
value="Modifier"
|
|
icon="pi pi-pencil"
|
|
outcome="#{not empty editOutcome ? editOutcome : '/pages/user-manager/users/edit'}">
|
|
<f:param name="userId" value="#{user.id}" />
|
|
</p:menuitem>
|
|
</c:if>
|
|
|
|
<c:if test="#{showResetPassword}">
|
|
<p:menuitem
|
|
value="Réinitialiser mot de passe"
|
|
icon="pi pi-key"
|
|
onclick="PF('resetPasswordDialog').show()" />
|
|
</c:if>
|
|
|
|
<p:separator />
|
|
|
|
<c:if test="#{showActivate and not user.enabled}">
|
|
<c:choose>
|
|
<c:when test="#{not empty activateAction}">
|
|
<p:menuitem
|
|
value="Activer"
|
|
icon="pi pi-check"
|
|
styleClass="text-green-600"
|
|
action="#{activateAction}"
|
|
update="#{update}" />
|
|
</c:when>
|
|
<c:otherwise>
|
|
<p:menuitem
|
|
value="Activer"
|
|
icon="pi pi-check"
|
|
styleClass="text-green-600"
|
|
action="#{userBean.activateUser(user.id)}"
|
|
update="#{update}" />
|
|
</c:otherwise>
|
|
</c:choose>
|
|
</c:if>
|
|
|
|
<c:if test="#{showDeactivate and user.enabled}">
|
|
<c:choose>
|
|
<c:when test="#{not empty deactivateAction}">
|
|
<p:menuitem
|
|
value="Désactiver"
|
|
icon="pi pi-times"
|
|
styleClass="text-orange-600"
|
|
action="#{deactivateAction}"
|
|
update="#{update}" />
|
|
</c:when>
|
|
<c:otherwise>
|
|
<p:menuitem
|
|
value="Désactiver"
|
|
icon="pi pi-times"
|
|
styleClass="text-orange-600"
|
|
action="#{userBean.deactivateUser(user.id)}"
|
|
update="#{update}" />
|
|
</c:otherwise>
|
|
</c:choose>
|
|
</c:if>
|
|
|
|
<c:if test="#{showLogoutSessions}">
|
|
<c:choose>
|
|
<c:when test="#{not empty logoutSessionsAction}">
|
|
<p:menuitem
|
|
value="Déconnecter toutes les sessions"
|
|
icon="pi pi-sign-out"
|
|
styleClass="text-blue-600"
|
|
action="#{logoutSessionsAction}"
|
|
update="#{update}" />
|
|
</c:when>
|
|
<c:otherwise>
|
|
<p:menuitem
|
|
value="Déconnecter toutes les sessions"
|
|
icon="pi pi-sign-out"
|
|
styleClass="text-blue-600"
|
|
action="#{userBean.logoutAllSessions(user.id)}"
|
|
update="#{update}" />
|
|
</c:otherwise>
|
|
</c:choose>
|
|
</c:if>
|
|
|
|
<c:if test="#{showDelete}">
|
|
<p:separator />
|
|
<p:menuitem
|
|
value="Supprimer"
|
|
icon="pi pi-trash"
|
|
styleClass="text-red-600"
|
|
onclick="PF('confirmDeleteDialog').show()" />
|
|
</c:if>
|
|
</p:menu>
|
|
</p:commandButton>
|
|
</c:when>
|
|
|
|
<!-- Layout Horizontal (défaut) -->
|
|
<c:otherwise>
|
|
<div class="flex gap-1">
|
|
<c:if test="#{showView}">
|
|
<p:commandButton
|
|
icon="pi pi-eye"
|
|
title="Voir le profil"
|
|
styleClass="p-button-text p-button-sm p-button-info"
|
|
outcome="#{not empty viewOutcome ? viewOutcome : '/pages/user-manager/users/profile'}">
|
|
<f:param name="userId" value="#{user.id}" />
|
|
</p:commandButton>
|
|
</c:if>
|
|
|
|
<c:if test="#{showEdit}">
|
|
<p:commandButton
|
|
icon="pi pi-pencil"
|
|
title="Modifier"
|
|
styleClass="p-button-text p-button-sm p-button-warning"
|
|
outcome="#{not empty editOutcome ? editOutcome : '/pages/user-manager/users/edit'}">
|
|
<f:param name="userId" value="#{user.id}" />
|
|
</p:commandButton>
|
|
</c:if>
|
|
|
|
<c:if test="#{showResetPassword}">
|
|
<p:commandButton
|
|
icon="pi pi-key"
|
|
title="Réinitialiser mot de passe"
|
|
styleClass="p-button-text p-button-sm p-button-help"
|
|
onclick="PF('resetPasswordDialog').show()" />
|
|
</c:if>
|
|
|
|
<c:if test="#{showActivate and not user.enabled}">
|
|
<c:choose>
|
|
<c:when test="#{not empty activateAction}">
|
|
<p:commandButton
|
|
icon="pi pi-check"
|
|
title="Activer"
|
|
styleClass="p-button-text p-button-sm p-button-success"
|
|
action="#{activateAction}"
|
|
update="#{update}" />
|
|
</c:when>
|
|
<c:otherwise>
|
|
<p:commandButton
|
|
icon="pi pi-check"
|
|
title="Activer"
|
|
styleClass="p-button-text p-button-sm p-button-success"
|
|
action="#{userBean.activateUser(user.id)}"
|
|
update="#{update}" />
|
|
</c:otherwise>
|
|
</c:choose>
|
|
</c:if>
|
|
|
|
<c:if test="#{showDeactivate and user.enabled}">
|
|
<c:choose>
|
|
<c:when test="#{not empty deactivateAction}">
|
|
<p:commandButton
|
|
icon="pi pi-times"
|
|
title="Désactiver"
|
|
styleClass="p-button-text p-button-sm p-button-warning"
|
|
action="#{deactivateAction}"
|
|
update="#{update}" />
|
|
</c:when>
|
|
<c:otherwise>
|
|
<p:commandButton
|
|
icon="pi pi-times"
|
|
title="Désactiver"
|
|
styleClass="p-button-text p-button-sm p-button-warning"
|
|
action="#{userBean.deactivateUser(user.id)}"
|
|
update="#{update}" />
|
|
</c:otherwise>
|
|
</c:choose>
|
|
</c:if>
|
|
|
|
<c:if test="#{showLogoutSessions}">
|
|
<c:choose>
|
|
<c:when test="#{not empty logoutSessionsAction}">
|
|
<p:commandButton
|
|
icon="pi pi-sign-out"
|
|
title="Déconnecter toutes les sessions"
|
|
styleClass="p-button-text p-button-sm p-button-info"
|
|
action="#{logoutSessionsAction}"
|
|
update="#{update}" />
|
|
</c:when>
|
|
<c:otherwise>
|
|
<p:commandButton
|
|
icon="pi pi-sign-out"
|
|
title="Déconnecter toutes les sessions"
|
|
styleClass="p-button-text p-button-sm p-button-info"
|
|
action="#{userBean.logoutAllSessions(user.id)}"
|
|
update="#{update}" />
|
|
</c:otherwise>
|
|
</c:choose>
|
|
</c:if>
|
|
|
|
<c:if test="#{showDelete}">
|
|
<p:commandButton
|
|
icon="pi pi-trash"
|
|
title="Supprimer"
|
|
styleClass="p-button-text p-button-sm p-button-danger"
|
|
onclick="PF('confirmDeleteDialog').show()" />
|
|
</c:if>
|
|
</div>
|
|
</c:otherwise>
|
|
</c:choose>
|
|
|
|
<!-- Dialog de confirmation de suppression -->
|
|
<p:confirmDialog
|
|
id="confirmDeleteDialog"
|
|
widgetVar="confirmDeleteDialog"
|
|
message="Êtes-vous sûr de vouloir supprimer l'utilisateur #{user.username} ?"
|
|
header="Confirmation de suppression"
|
|
severity="warn">
|
|
<c:choose>
|
|
<c:when test="#{not empty deleteAction}">
|
|
<p:commandButton
|
|
value="Oui"
|
|
icon="pi pi-check"
|
|
styleClass="p-button-danger"
|
|
action="#{deleteAction}"
|
|
update="#{update}"
|
|
oncomplete="PF('confirmDeleteDialog').hide()" />
|
|
</c:when>
|
|
<c:otherwise>
|
|
<p:commandButton
|
|
value="Oui"
|
|
icon="pi pi-check"
|
|
styleClass="p-button-danger"
|
|
action="#{userBean.deleteUser(user.id)}"
|
|
update="#{update}"
|
|
oncomplete="PF('confirmDeleteDialog').hide()" />
|
|
</c:otherwise>
|
|
</c:choose>
|
|
<p:commandButton
|
|
value="Non"
|
|
icon="pi pi-times"
|
|
styleClass="p-button-secondary"
|
|
onclick="PF('confirmDeleteDialog').hide()" />
|
|
</p:confirmDialog>
|
|
|
|
<!-- Dialog de réinitialisation de mot de passe -->
|
|
<p:dialog
|
|
id="resetPasswordDialog"
|
|
widgetVar="resetPasswordDialog"
|
|
header="Réinitialiser le mot de passe"
|
|
modal="true"
|
|
styleClass="w-full md:w-4">
|
|
<h:form>
|
|
<p:panelGrid columns="2" styleClass="w-full">
|
|
<p:outputLabel for="newPassword" value="Nouveau mot de passe *" />
|
|
<p:password id="newPassword"
|
|
value="#{userBean.newPassword}"
|
|
feedback="true"
|
|
required="true"
|
|
styleClass="w-full">
|
|
<f:validateLength minimum="8" maximum="100" />
|
|
</p:password>
|
|
|
|
<p:outputLabel for="newPasswordConfirm" value="Confirmer *" />
|
|
<p:password id="newPasswordConfirm"
|
|
value="#{userBean.newPasswordConfirm}"
|
|
required="true"
|
|
styleClass="w-full" />
|
|
</p:panelGrid>
|
|
|
|
<f:facet name="footer">
|
|
<div class="flex gap-2 justify-content-end">
|
|
<c:choose>
|
|
<c:when test="#{not empty resetPasswordAction}">
|
|
<p:commandButton
|
|
value="Réinitialiser"
|
|
icon="pi pi-check"
|
|
styleClass="p-button-primary"
|
|
action="#{resetPasswordAction}"
|
|
update="#{update}"
|
|
oncomplete="PF('resetPasswordDialog').hide()"
|
|
process="@form" />
|
|
</c:when>
|
|
<c:otherwise>
|
|
<p:commandButton
|
|
value="Réinitialiser"
|
|
icon="pi pi-check"
|
|
styleClass="p-button-primary"
|
|
action="#{userBean.resetPassword(user.id)}"
|
|
update="#{update}"
|
|
oncomplete="PF('resetPasswordDialog').hide()"
|
|
process="@form" />
|
|
</c:otherwise>
|
|
</c:choose>
|
|
<p:commandButton
|
|
value="Annuler"
|
|
icon="pi pi-times"
|
|
styleClass="p-button-secondary"
|
|
onclick="PF('resetPasswordDialog').hide()" />
|
|
</div>
|
|
</f:facet>
|
|
</h:form>
|
|
</p:dialog>
|
|
|
|
</ui:composition>
|
|
|