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:
dahoud
2025-11-29 22:57:14 +00:00
parent d9b0aa3ac9
commit 9e2da68c6e
4 changed files with 73 additions and 74 deletions

View File

@@ -6,18 +6,24 @@
xmlns:p="http://primefaces.org/ui"
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">
<!-- En-tête -->
<ui:include src="/templates/components/layout/page-header.xhtml">
<ui:param name="icon" value="pi pi-user-plus text-primary" />
<ui:param name="title" value="Inscription Nouveau Membre" />
<ui:param name="description" value="Formulaire complet d'inscription avec photo et documents" />
<ui:param name="icon" value="#{empty param.id ? 'pi pi-user-plus text-primary' : 'pi pi-pencil text-warning'}" />
<ui:param name="title" value="#{empty param.id ? 'Inscription Nouveau Membre' : 'Modifier le Membre'}" />
<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">
<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>
</ui:define>
</ui:include>

View File

@@ -197,7 +197,7 @@
iconOnly="true"/>
<!-- DRY/WOU: Composite Component action-button-edit-nav -->
<uf:action-button-edit-nav itemId="#{membre.id}"
editPage="/pages/secure/membre/modifier.xhtml"
editPage="/pages/secure/membre/inscription.xhtml"
iconOnly="true"/>
<ui:include src="/templates/components/buttons/button-icon.xhtml">
<ui:param name="icon" value="pi pi-dollar" />

View File

@@ -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>