217 lines
9.7 KiB
HTML
217 lines
9.7 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">
|
|
|
|
<p:panel header="#{mode == 'create' ? 'Nouvel Utilisateur' : 'Modifier Utilisateur'}"
|
|
styleClass="w-full">
|
|
|
|
<!-- Informations de base -->
|
|
<p:panelGrid columns="2" styleClass="w-full" columnClasses="col-12 md:col-6">
|
|
|
|
<!-- Username -->
|
|
<p:outputLabel for="username" value="Nom d'utilisateur *" />
|
|
<p:inputText id="username"
|
|
value="#{user.username}"
|
|
required="true"
|
|
readonly="#{readonly or mode == 'edit'}"
|
|
placeholder="jdupont"
|
|
styleClass="w-full">
|
|
<f:validateLength minimum="3" maximum="100" />
|
|
<f:validateRegex pattern="^[a-zA-Z0-9._-]+$" />
|
|
</p:inputText>
|
|
|
|
<!-- Email -->
|
|
<p:outputLabel for="email" value="Email *" />
|
|
<p:inputText id="email"
|
|
value="#{user.email}"
|
|
required="true"
|
|
readonly="#{readonly}"
|
|
placeholder="jean.dupont@lions.dev"
|
|
styleClass="w-full">
|
|
<f:validateLength minimum="5" maximum="255" />
|
|
</p:inputText>
|
|
|
|
<!-- Prénom -->
|
|
<p:outputLabel for="prenom" value="Prénom *" />
|
|
<p:inputText id="prenom"
|
|
value="#{user.prenom}"
|
|
required="true"
|
|
readonly="#{readonly}"
|
|
placeholder="Jean"
|
|
styleClass="w-full">
|
|
<f:validateLength minimum="2" maximum="100" />
|
|
</p:inputText>
|
|
|
|
<!-- Nom -->
|
|
<p:outputLabel for="nom" value="Nom *" />
|
|
<p:inputText id="nom"
|
|
value="#{user.nom}"
|
|
required="true"
|
|
readonly="#{readonly}"
|
|
placeholder="Dupont"
|
|
styleClass="w-full">
|
|
<f:validateLength minimum="2" maximum="100" />
|
|
</p:inputText>
|
|
|
|
<!-- Téléphone -->
|
|
<p:outputLabel for="telephone" value="Téléphone" />
|
|
<p:inputText id="telephone"
|
|
value="#{user.telephone}"
|
|
readonly="#{readonly}"
|
|
placeholder="+225 07 12 34 56 78"
|
|
styleClass="w-full" />
|
|
|
|
<!-- Organisation -->
|
|
<p:outputLabel for="organisation" value="Organisation" />
|
|
<p:inputText id="organisation"
|
|
value="#{user.organisation}"
|
|
readonly="#{readonly}"
|
|
placeholder="Lions Dev"
|
|
styleClass="w-full" />
|
|
|
|
<!-- Département -->
|
|
<p:outputLabel for="departement" value="Département" />
|
|
<p:inputText id="departement"
|
|
value="#{user.departement}"
|
|
readonly="#{readonly}"
|
|
placeholder="IT"
|
|
styleClass="w-full" />
|
|
|
|
<!-- Fonction -->
|
|
<p:outputLabel for="fonction" value="Fonction" />
|
|
<p:inputText id="fonction"
|
|
value="#{user.fonction}"
|
|
readonly="#{readonly}"
|
|
placeholder="Développeur Senior"
|
|
styleClass="w-full" />
|
|
|
|
<!-- Ville -->
|
|
<p:outputLabel for="ville" value="Ville" />
|
|
<p:inputText id="ville"
|
|
value="#{user.ville}"
|
|
readonly="#{readonly}"
|
|
placeholder="Abidjan"
|
|
styleClass="w-full" />
|
|
|
|
<!-- Pays -->
|
|
<p:outputLabel for="pays" value="Pays" />
|
|
<p:inputText id="pays"
|
|
value="#{user.pays}"
|
|
readonly="#{readonly}"
|
|
placeholder="Côte d'Ivoire"
|
|
styleClass="w-full" />
|
|
|
|
<!-- Statut -->
|
|
<p:outputLabel for="statut" value="Statut" />
|
|
<p:selectOneMenu id="statut"
|
|
value="#{user.statut}"
|
|
readonly="#{readonly}"
|
|
styleClass="w-full">
|
|
<f:selectItem itemLabel="Sélectionner..." itemValue="" />
|
|
<f:selectItems value="#{userBean.statutOptions}" />
|
|
</p:selectOneMenu>
|
|
|
|
<!-- Enabled -->
|
|
<p:outputLabel for="enabled" value="Compte activé" />
|
|
<p:selectBooleanCheckbox id="enabled"
|
|
value="#{user.enabled}"
|
|
readonly="#{readonly}" />
|
|
|
|
<!-- Email vérifié -->
|
|
<p:outputLabel for="emailVerified" value="Email vérifié" />
|
|
<p:selectBooleanCheckbox id="emailVerified"
|
|
value="#{user.emailVerified}"
|
|
readonly="#{readonly}" />
|
|
|
|
<!-- Realm (si affiché) -->
|
|
<c:if test="#{showRealmSelector}">
|
|
<p:outputLabel for="realmName" value="Realm *" />
|
|
<p:selectOneMenu id="realmName"
|
|
value="#{user.realmName}"
|
|
required="#{showRealmSelector}"
|
|
readonly="#{readonly}"
|
|
styleClass="w-full">
|
|
<f:selectItem itemLabel="Sélectionner..." itemValue="" />
|
|
<f:selectItems value="#{userBean.availableRealms}" />
|
|
</p:selectOneMenu>
|
|
</c:if>
|
|
|
|
</p:panelGrid>
|
|
|
|
<!-- Champs mot de passe (si affichés) -->
|
|
<c:if test="#{showPasswordFields and mode == 'create'}">
|
|
<p:separator />
|
|
<h3>Mot de passe</h3>
|
|
<p:panelGrid columns="2" styleClass="w-full" columnClasses="col-12 md:col-6">
|
|
<p:outputLabel for="password" value="Mot de passe *" />
|
|
<p:password id="password"
|
|
value="#{userBean.password}"
|
|
required="true"
|
|
feedback="true"
|
|
placeholder="Minimum 8 caractères"
|
|
styleClass="w-full">
|
|
<f:validateLength minimum="8" maximum="100" />
|
|
</p:password>
|
|
|
|
<p:outputLabel for="passwordConfirm" value="Confirmer le mot de passe *" />
|
|
<p:password id="passwordConfirm"
|
|
value="#{userBean.passwordConfirm}"
|
|
required="true"
|
|
placeholder="Répétez le mot de passe"
|
|
styleClass="w-full" />
|
|
</p:panelGrid>
|
|
</c:if>
|
|
|
|
<!-- Boutons d'action -->
|
|
<f:facet name="footer">
|
|
<div class="flex gap-2 justify-content-end">
|
|
<c:if test="#{not readonly}">
|
|
<c:choose>
|
|
<!-- Si hasSubmitAction est explicitement défini à true, utiliser action -->
|
|
<c:when test="#{hasSubmitAction == true}">
|
|
<p:commandButton
|
|
value="#{mode == 'create' ? 'Créer' : 'Modifier'}"
|
|
icon="pi pi-check"
|
|
styleClass="p-button-success"
|
|
action="#{submitAction}"
|
|
update="#{not empty update ? update : '@form'}"
|
|
process="@form" />
|
|
</c:when>
|
|
<!-- Si submitOutcome est fourni, utiliser outcome -->
|
|
<c:when test="#{not empty submitOutcome}">
|
|
<p:commandButton
|
|
value="#{mode == 'create' ? 'Créer' : 'Modifier'}"
|
|
icon="pi pi-check"
|
|
styleClass="p-button-success"
|
|
outcome="#{submitOutcome}"
|
|
update="#{not empty update ? update : '@form'}"
|
|
process="@form" />
|
|
</c:when>
|
|
<!-- Sinon, essayer d'utiliser submitAction si fourni -->
|
|
<c:otherwise>
|
|
<p:commandButton
|
|
value="#{mode == 'create' ? 'Créer' : 'Modifier'}"
|
|
icon="pi pi-check"
|
|
styleClass="p-button-success"
|
|
action="#{submitAction}"
|
|
update="#{not empty update ? update : '@form'}"
|
|
process="@form" />
|
|
</c:otherwise>
|
|
</c:choose>
|
|
</c:if>
|
|
<p:commandButton
|
|
value="Annuler"
|
|
icon="pi pi-times"
|
|
styleClass="p-button-secondary"
|
|
outcome="#{not empty cancelOutcome ? cancelOutcome : '/pages/user-manager/users/list'}"
|
|
immediate="true" />
|
|
</div>
|
|
</f:facet>
|
|
</p:panel>
|
|
|
|
</ui:composition>
|
|
|