feat(client): Reutilisation inscription.xhtml pour modification membre (DRY/WOU)
SUPPRESSION: - modifier.xhtml supprime (duplication inutile) MODIFICATION inscription.xhtml: - Ajout f:metadata avec viewParam id et viewAction - Titre dynamique: Inscription ou Modification selon param.id - Icone dynamique: user-plus (creation) ou pencil (modification) - Description dynamique selon le mode MODIFICATION MembreInscriptionBean: - Ajout membreIdString (String) pour recevoir param URL - Ajout modeModification (boolean) pour detecter le mode - Ajout chargerMembreSiModification() : charge membre si ID fourni - Remplissage automatique des champs avec donnees existantes - Gestion erreurs ID invalide MODIFICATION liste.xhtml: - Bouton Modifier redirige vers inscription.xhtml?id=UUID UNE SEULE PAGE pour creation ET modification (DRY/WOU)! Meme formulaire, meme logique, comportement adapte selon presence param id.
This commit is contained in:
@@ -42,6 +42,8 @@ public class MembreInscriptionBean implements Serializable {
|
|||||||
|
|
||||||
// Propriétés système
|
// Propriétés système
|
||||||
private String numeroGenere;
|
private String numeroGenere;
|
||||||
|
private String membreIdString; // ID du membre en mode modification
|
||||||
|
private boolean modeModification = false;
|
||||||
|
|
||||||
// Informations personnelles
|
// Informations personnelles
|
||||||
private String prenom;
|
private String prenom;
|
||||||
@@ -103,8 +105,10 @@ public class MembreInscriptionBean implements Serializable {
|
|||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void init() {
|
public void init() {
|
||||||
// Générer un numéro de membre automatiquement
|
// Générer un numéro de membre automatiquement (seulement en mode création)
|
||||||
|
if (!modeModification) {
|
||||||
this.numeroGenere = "M" + System.currentTimeMillis();
|
this.numeroGenere = "M" + System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
// Charger les organisations actives
|
// Charger les organisations actives
|
||||||
try {
|
try {
|
||||||
@@ -116,6 +120,61 @@ public class MembreInscriptionBean implements Serializable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Getters/Setters pour mode modification
|
||||||
|
public String getMembreIdString() {
|
||||||
|
return membreIdString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMembreIdString(String membreIdString) {
|
||||||
|
this.membreIdString = membreIdString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isModeModification() {
|
||||||
|
return modeModification;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Méthode appelée par f:viewAction pour charger le membre en mode modification
|
||||||
|
public void chargerMembreSiModification() {
|
||||||
|
if (membreIdString != null && !membreIdString.isEmpty()) {
|
||||||
|
try {
|
||||||
|
java.util.UUID id = java.util.UUID.fromString(membreIdString);
|
||||||
|
MembreDTO membre = membreService.obtenirParId(id);
|
||||||
|
|
||||||
|
if (membre != null) {
|
||||||
|
modeModification = true;
|
||||||
|
// Remplir tous les champs avec les données du membre
|
||||||
|
this.numeroGenere = membre.getNumeroMembre();
|
||||||
|
this.prenom = membre.getPrenom();
|
||||||
|
this.nom = membre.getNom();
|
||||||
|
this.email = membre.getEmail();
|
||||||
|
this.telephone = membre.getTelephone();
|
||||||
|
this.dateNaissance = membre.getDateNaissance();
|
||||||
|
this.adresse = membre.getAdresse();
|
||||||
|
this.ville = membre.getVille();
|
||||||
|
this.nationalite = membre.getNationalite();
|
||||||
|
this.profession = membre.getProfession();
|
||||||
|
this.situationMatrimoniale = membre.getStatutMatrimonial();
|
||||||
|
this.organisationId = membre.getAssociationId() != null ? membre.getAssociationId().toString() : null;
|
||||||
|
// TODO: Charger les autres champs si disponibles
|
||||||
|
|
||||||
|
LOGGER.info("Membre chargé pour modification: " + membre.getNomComplet());
|
||||||
|
} else {
|
||||||
|
FacesContext.getCurrentInstance().addMessage(null,
|
||||||
|
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Membre introuvable"));
|
||||||
|
}
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
LOGGER.severe("ID invalide: " + membreIdString);
|
||||||
|
FacesContext.getCurrentInstance().addMessage(null,
|
||||||
|
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Identifiant de membre invalide"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.severe("Erreur lors du chargement du membre: " + e.getMessage());
|
||||||
|
FacesContext.getCurrentInstance().addMessage(null,
|
||||||
|
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur",
|
||||||
|
"Impossible de charger le membre: " + e.getMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Actions
|
// Actions
|
||||||
public String inscrire() {
|
public String inscrire() {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -6,18 +6,24 @@
|
|||||||
xmlns:p="http://primefaces.org/ui"
|
xmlns:p="http://primefaces.org/ui"
|
||||||
template="/templates/main-template.xhtml">
|
template="/templates/main-template.xhtml">
|
||||||
|
|
||||||
<ui:define name="title">Inscription Membre - UnionFlow</ui:define>
|
<ui:define name="title">#{empty param.id ? 'Inscription' : 'Modification'} Membre - UnionFlow</ui:define>
|
||||||
|
|
||||||
|
<!-- Charger le membre si ID fourni (mode modification) -->
|
||||||
|
<f:metadata>
|
||||||
|
<f:viewParam name="id" value="#{membreInscriptionBean.membreIdString}" />
|
||||||
|
<f:viewAction action="#{membreInscriptionBean.chargerMembreSiModification}" />
|
||||||
|
</f:metadata>
|
||||||
|
|
||||||
<ui:define name="content">
|
<ui:define name="content">
|
||||||
<!-- En-tête -->
|
<!-- En-tête -->
|
||||||
<ui:include src="/templates/components/layout/page-header.xhtml">
|
<ui:include src="/templates/components/layout/page-header.xhtml">
|
||||||
<ui:param name="icon" value="pi pi-user-plus text-primary" />
|
<ui:param name="icon" value="#{empty param.id ? 'pi pi-user-plus text-primary' : 'pi pi-pencil text-warning'}" />
|
||||||
<ui:param name="title" value="Inscription Nouveau Membre" />
|
<ui:param name="title" value="#{empty param.id ? 'Inscription Nouveau Membre' : 'Modifier le Membre'}" />
|
||||||
<ui:param name="description" value="Formulaire complet d'inscription avec photo et documents" />
|
<ui:param name="description" value="#{empty param.id ? 'Formulaire complet d\'inscription avec photo et documents' : 'Modifiez les informations du membre'}" />
|
||||||
<ui:define name="actions">
|
<ui:define name="actions">
|
||||||
<div>
|
<div>
|
||||||
<div class="text-900 font-medium">Numéro: #{membreInscriptionBean.numeroGenere}</div>
|
<div class="text-900 font-medium">Numéro: #{membreInscriptionBean.numeroGenere}</div>
|
||||||
<small class="text-600">Généré automatiquement</small>
|
<small class="text-600">#{empty param.id ? 'Généré automatiquement' : 'Existant'}</small>
|
||||||
</div>
|
</div>
|
||||||
</ui:define>
|
</ui:define>
|
||||||
</ui:include>
|
</ui:include>
|
||||||
|
|||||||
@@ -197,7 +197,7 @@
|
|||||||
iconOnly="true"/>
|
iconOnly="true"/>
|
||||||
<!-- DRY/WOU: Composite Component action-button-edit-nav -->
|
<!-- DRY/WOU: Composite Component action-button-edit-nav -->
|
||||||
<uf:action-button-edit-nav itemId="#{membre.id}"
|
<uf:action-button-edit-nav itemId="#{membre.id}"
|
||||||
editPage="/pages/secure/membre/modifier.xhtml"
|
editPage="/pages/secure/membre/inscription.xhtml"
|
||||||
iconOnly="true"/>
|
iconOnly="true"/>
|
||||||
<ui:include src="/templates/components/buttons/button-icon.xhtml">
|
<ui:include src="/templates/components/buttons/button-icon.xhtml">
|
||||||
<ui:param name="icon" value="pi pi-dollar" />
|
<ui:param name="icon" value="pi pi-dollar" />
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html 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">
|
|
||||||
|
|
||||||
<ui:composition template="/templates/main-template.xhtml">
|
|
||||||
<ui:define name="title">Modifier le Membre</ui:define>
|
|
||||||
|
|
||||||
<!-- Charger le membre à modifier -->
|
|
||||||
<f:metadata>
|
|
||||||
<f:viewParam name="id" value="#{membreListeBean.membreSelectionneIdString}" />
|
|
||||||
<f:viewAction action="#{membreListeBean.chargerMembreSelectionne}" />
|
|
||||||
</f:metadata>
|
|
||||||
|
|
||||||
<ui:define name="content">
|
|
||||||
<h:form id="formModifierMembre">
|
|
||||||
<p:messages id="messages" showDetail="true" closable="true"/>
|
|
||||||
|
|
||||||
<div class="card mb-3">
|
|
||||||
<div class="flex justify-content-between align-items-center flex-column md:flex-row">
|
|
||||||
<div class="mb-2 md:mb-0">
|
|
||||||
<h3 class="m-0">Modifier le Membre</h3>
|
|
||||||
<span class="text-600">
|
|
||||||
Modifiez les informations du membre.
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<!-- DRY/WOU: button-secondary pour navigation -->
|
|
||||||
<ui:include src="/templates/components/buttons/button-secondary.xhtml">
|
|
||||||
<ui:param name="value" value="Annuler"/>
|
|
||||||
<ui:param name="icon" value="pi pi-times"/>
|
|
||||||
<ui:param name="outcome" value="/pages/secure/membre/liste"/>
|
|
||||||
</ui:include>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card">
|
|
||||||
<h5 class="mb-3">Informations du Membre</h5>
|
|
||||||
<ui:include src="/ui/includes/membre-form.xhtml">
|
|
||||||
<ui:param name="model" value="#{membreListeBean.membreSelectionne}" />
|
|
||||||
<ui:param name="organisationsItems" value="#{membreListeBean.organisationsSelectItems}" />
|
|
||||||
</ui:include>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mt-3 flex justify-content-end gap-2">
|
|
||||||
<!-- DRY/WOU: button-secondary pour navigation -->
|
|
||||||
<ui:include src="/templates/components/buttons/button-secondary.xhtml">
|
|
||||||
<ui:param name="value" value="Annuler"/>
|
|
||||||
<ui:param name="icon" value="pi pi-times"/>
|
|
||||||
<ui:param name="outcome" value="/pages/secure/membre/liste"/>
|
|
||||||
</ui:include>
|
|
||||||
<!-- Bouton Enregistrer : p:commandButton direct car action avec méthode backend -->
|
|
||||||
<p:commandButton value="Enregistrer"
|
|
||||||
icon="pi pi-check"
|
|
||||||
action="#{membreListeBean.modifierMembreSelectionne}"
|
|
||||||
update=":formModifierMembre:messages"
|
|
||||||
styleClass="ui-button-success" />
|
|
||||||
</div>
|
|
||||||
</h:form>
|
|
||||||
</ui:define>
|
|
||||||
</ui:composition>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user