Refactoring

This commit is contained in:
dahoud
2026-03-01 22:00:28 +00:00
parent c0e2c4da45
commit 6b28cf751e
469 changed files with 26866 additions and 14768 deletions

View File

@@ -1,122 +1,164 @@
<!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"
xmlns:uf="http://xmlns.jcp.org/jsf/composite/components">
<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"
template="/templates/main-template.xhtml">
<ui:define name="title">Organisations - UnionFlow</ui:define>
<ui:composition template="/templates/main-template.xhtml">
<ui:param name="page" value="#{organisationsBean}"/>
<ui:define name="title">Gestion des Organisations</ui:define>
<ui:define name="content">
<h:form id="formOrganisations">
<p:messages id="messages" showDetail="true" closable="true"/>
<!-- En-tête avec titre et action principale (DRY/WOU: card-header) -->
<ui:decorate template="/templates/components/cards/card-header.xhtml">
<ui:param name="title" value="Gestion des Organisations" />
<ui:param name="subtitle" value="Liste complète des organisations avec filtres et actions." />
<ui:param name="styleClass" value="mb-3" />
<ui:define name="actions">
<p:button value="Nouvelle Organisation"
icon="pi pi-plus"
outcome="/pages/secure/organisation/nouvelle"
styleClass="ui-button-success" />
</ui:define>
</ui:decorate>
<div class="ui-fluid">
<!-- Statistiques (DRY/WOU: stat-card) -->
<div class="grid mb-3">
<ui:include src="/templates/components/cards/stat-card.xhtml">
<ui:param name="value" value="#{organisationsBean.totalOrganisations}" />
<ui:param name="label" value="Total" />
<ui:param name="icon" value="pi pi-building" />
<ui:param name="bgColor" value="blue" />
</ui:include>
<ui:include src="/templates/components/cards/stat-card.xhtml">
<ui:param name="value" value="#{organisationsBean.organisationsActives}" />
<ui:param name="label" value="Actives" />
<ui:param name="icon" value="pi pi-check-circle" />
<ui:param name="bgColor" value="green" />
</ui:include>
<ui:include src="/templates/components/cards/stat-card.xhtml">
<ui:param name="value" value="#{organisationsBean.organisationsInactives}" />
<ui:param name="label" value="Inactives" />
<ui:param name="icon" value="pi pi-times-circle" />
<ui:param name="bgColor" value="orange" />
</ui:include>
</div>
<!-- Filtres et recherche (DRY/WOU: filter-bar) -->
<ui:decorate template="/templates/components/cards/filter-bar.xhtml">
<ui:param name="title" value="Filtres" />
<ui:param name="styleClass" value="mb-3" />
<ui:define name="filters">
<div class="col-12 md:col-4">
<div class="field">
<p:outputLabel for="rechercheGlobale" value="Rechercher" />
<p:inputText id="rechercheGlobale"
value="#{organisationsBean.rechercheGlobale}"
placeholder="Nom, ville, description..."
styleClass="w-full">
<p:ajax event="keyup" update="dtOrganisations" listener="#{organisationsBean.appliquerFiltres}" delay="500"/>
</p:inputText>
</div>
<!-- ═══════════════════════════════════════════════════════════════ -->
<!-- EN-TÊTE -->
<!-- ═══════════════════════════════════════════════════════════════ -->
<div class="card mb-3">
<div class="formgrid grid align-items-center">
<div class="field col-12 lg:col-8 mb-0">
<h2 class="text-primary font-bold mb-1 mt-0">
<i class="pi pi-building text-blue-500 mr-2"></i>
Organisations
</h2>
<p class="text-600 m-0">
Administration des organisations ·
<span class="font-semibold text-900">#{organisationsBean.totalOrganisations}</span> au total ·
<span class="font-semibold text-green-600">#{organisationsBean.organisationsActives} active(s)</span>
</p>
</div>
<div class="col-12 md:col-2">
<div class="field">
<p:outputLabel for="filtreStatut" value="Statut" />
<p:selectOneMenu id="filtreStatut"
value="#{organisationsBean.filtreStatut}"
styleClass="w-full">
<f:selectItems value="#{organisationsBean.statutsSelectItems}" />
<p:ajax event="change" update="dtOrganisations" listener="#{organisationsBean.appliquerFiltres}"/>
</p:selectOneMenu>
</div>
</div>
<div class="col-12 md:col-2">
<div class="field">
<p:outputLabel for="filtreType" value="Type" />
<p:selectOneMenu id="filtreType"
value="#{organisationsBean.filtreType}"
styleClass="w-full">
<f:selectItems value="#{organisationsBean.typesSelectItems}" />
<p:ajax event="change" update="dtOrganisations" listener="#{organisationsBean.appliquerFiltres}"/>
</p:selectOneMenu>
</div>
</div>
</ui:define>
<ui:define name="actions">
<div class="col-12 md:col-2">
<div class="field">
<label class="invisible">Actions</label>
<p:commandButton value="Réinitialiser"
icon="pi pi-filter-slash"
action="#{organisationsBean.reinitialiserFiltres}"
update="dtOrganisations rechercheGlobale filtreStatut filtreType"
styleClass="ui-button-secondary w-full" />
</div>
</div>
<div class="col-12 md:col-2">
<div class="field">
<label class="invisible">Actions</label>
<div class="field col-12 lg:col-4 mb-0 flex justify-content-end gap-2">
<h:form id="formEntete">
<p:commandButton value="Rafraîchir"
icon="pi pi-refresh"
action="#{organisationsBean.recharger}"
update="@form"
styleClass="ui-button-secondary w-full" />
styleClass="ui-button-secondary ui-button-outlined"
actionListener="#{organisationsBean.recharger}"
update=":panelKPIs :formOrganisations" />
</h:form>
<p:button value="Nouvelle organisation"
icon="pi pi-plus"
styleClass="ui-button-success"
outcome="/pages/secure/organisation/nouvelle" />
</div>
</div>
</div>
<!-- ═══════════════════════════════════════════════════════════════ -->
<!-- KPIs -->
<!-- ═══════════════════════════════════════════════════════════════ -->
<h:panelGroup id="panelKPIs" layout="block">
<div class="formgrid grid">
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Total Organisations" />
<ui:param name="value" value="#{organisationsBean.totalOrganisations}" />
<ui:param name="icon" value="pi-building" />
<ui:param name="iconColor" value="blue-600" />
<ui:param name="showGrowth" value="false" />
<ui:param name="showProgress" value="false" />
</ui:include>
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Actives" />
<ui:param name="value" value="#{organisationsBean.organisationsActives}" />
<ui:param name="icon" value="pi-check-circle" />
<ui:param name="iconColor" value="green-600" />
<ui:param name="progressValue" value="#{organisationsBean.tauxActivite}" />
<ui:param name="noDataLabel" value="Aucune organisation active" />
<ui:param name="showGrowth" value="false" />
</ui:include>
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Inactives / Suspendues" />
<ui:param name="value" value="#{organisationsBean.organisationsInactives}" />
<ui:param name="icon" value="pi-pause-circle" />
<ui:param name="iconColor" value="orange-600" />
<ui:param name="showGrowth" value="false" />
<ui:param name="showProgress" value="false" />
</ui:include>
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Taux d'activité" />
<ui:param name="value" value="#{organisationsBean.tauxActivite} %" />
<ui:param name="icon" value="pi-chart-pie" />
<ui:param name="iconColor" value="purple-600" />
<ui:param name="progressValue" value="#{organisationsBean.tauxActivite}" />
<ui:param name="showGrowth" value="false" />
</ui:include>
</div>
</h:panelGroup>
<!-- ═══════════════════════════════════════════════════════════════ -->
<!-- FILTRES -->
<!-- ═══════════════════════════════════════════════════════════════ -->
<div class="card mb-3">
<h5 class="mb-3 mt-0">
<i class="pi pi-filter text-blue-500 mr-2"></i>
Filtres et Recherche
</h5>
<h:form id="formFiltres">
<div class="formgrid grid align-items-end">
<div class="field col-12 md:col-6 lg:col-4">
<label for="searchNom" class="block text-900 font-medium mb-2">Nom / Description</label>
<span class="p-input-icon-left w-full">
<i class="pi pi-search"></i>
<p:inputText id="searchNom"
value="#{organisationsBean.rechercheGlobale}"
placeholder="Nom, ville, description..."
styleClass="w-full">
<p:ajax event="keyup" delay="400"
listener="#{organisationsBean.appliquerFiltres}"
update=":formOrganisations:dtOrganisations" />
</p:inputText>
</span>
</div>
<div class="field col-12 md:col-6 lg:col-3">
<label for="filterStatut" class="block text-900 font-medium mb-2">Statut</label>
<p:selectOneMenu id="filterStatut"
value="#{organisationsBean.filtreStatut}"
styleClass="w-full">
<f:selectItems value="#{organisationsBean.statutsSelectItems}" />
<p:ajax listener="#{organisationsBean.appliquerFiltres}"
update=":formOrganisations:dtOrganisations" />
</p:selectOneMenu>
</div>
<div class="field col-12 md:col-6 lg:col-3">
<label for="filterType" class="block text-900 font-medium mb-2">Type</label>
<p:selectOneMenu id="filterType"
value="#{organisationsBean.filtreType}"
styleClass="w-full">
<f:selectItems value="#{organisationsBean.typesSelectItems}" />
<p:ajax listener="#{organisationsBean.appliquerFiltres}"
update=":formOrganisations:dtOrganisations" />
</p:selectOneMenu>
</div>
<div class="field col-12 md:col-6 lg:col-2">
<p:commandButton value="Réinitialiser"
icon="pi pi-filter-slash"
styleClass="ui-button-secondary ui-button-outlined w-full"
actionListener="#{organisationsBean.reinitialiserFiltres}"
update="@form :formOrganisations:dtOrganisations" />
</div>
</div>
</ui:define>
</ui:decorate>
</h:form>
</div>
<!-- ═══════════════════════════════════════════════════════════════ -->
<!-- TABLE -->
<!-- ═══════════════════════════════════════════════════════════════ -->
<div class="card">
<h:form id="formOrganisations">
<p:messages id="messages" showDetail="true" closable="true" styleClass="mb-3" />
<div class="flex align-items-center justify-content-between mb-3">
<h5 class="m-0">
<i class="pi pi-list text-primary mr-2"></i>
Liste des Organisations
</h5>
</div>
<!-- Table des organisations (DRY/WOU: card-simple) -->
<ui:decorate template="/templates/components/cards/card-simple.xhtml">
<ui:param name="title" value="Liste des Organisations" />
<ui:define name="content">
<!-- Note: p:dataTable avec var, sortBy, filterBy doit être directement dans la page -->
<p:dataTable id="dtOrganisations"
value="#{organisationsBean.organisationsFiltrees}"
var="org"
@@ -124,97 +166,130 @@
rows="20"
rowsPerPageTemplate="10,20,50,100"
paginatorPosition="bottom"
emptyMessage="Aucune organisation trouvée"
styleClass="table-responsive"
size="small">
<!-- Logo (DRY/WOU: organisation-logo) -->
<p:column headerText="" style="width: 80px;">
<ui:include src="/templates/components/layout/organisation-logo.xhtml">
<ui:param name="logo" value="#{org.logo}"/>
<ui:param name="size" value="40"/>
</ui:include>
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
currentPageReportTemplate="Affichage {startRecord}-{endRecord} sur {totalRecords} organisations"
styleClass="p-datatable-sm p-datatable-gridlines p-datatable-striped"
emptyMessage="Aucune organisation trouvée">
<!-- Organisation : nom + type -->
<p:column headerText="Organisation" sortBy="#{org.nom}">
<div class="flex align-items-center">
<div class="flex align-items-center justify-content-center bg-primary-100 border-circle mr-3"
style="width: 2.5rem; height: 2.5rem; min-width: 2.5rem;">
<i class="pi pi-building text-primary-600"></i>
</div>
<div>
<div class="text-900 font-semibold">#{org.nom}</div>
<div class="text-500 text-xs">
#{empty org.nomCourt ? '' : org.nomCourt}
</div>
</div>
</div>
</p:column>
<!-- Nom avec sous-titre -->
<p:column headerText="Nom" sortBy="#{org.nom}" filterBy="#{org.nom}">
<h:outputText value="#{org.nom}" styleClass="font-bold"/>
<br/>
<h:outputText value="#{org.typeLibelle}" styleClass="text-sm text-500"/>
</p:column>
<!-- Type -->
<p:column headerText="Type" sortBy="#{org.typeAssociation}" style="width: 150px;">
<p:tag value="#{org.typeLibelle}"
severity="#{org.typeAssociation == 'LIONS_CLUB' ? 'info' : 'primary'}"/>
<p:column headerText="Type" sortBy="#{org.typeAssociation}" style="width: 11rem;">
<p:tag value="#{org.typeLibelle}"
severity="info"
styleClass="text-xs" />
</p:column>
<!-- Localisation -->
<p:column headerText="Localisation" style="width: 200px;">
<i class="pi pi-map-marker mr-2 text-500"/>
<h:outputText value="#{org.ville}, #{org.region}"/>
<p:column headerText="Localisation" style="width: 13rem;">
<div class="flex align-items-center text-700 text-sm">
<i class="pi pi-map-marker text-400 mr-1"></i>
<span>
#{empty org.ville ? '' : org.ville}#{(not empty org.ville and not empty org.region) ? ', ' : ''}#{empty org.region ? '' : org.region}
</span>
</div>
<div class="text-400 text-xs mt-1" rendered="#{not empty org.pays}">
#{org.pays}
</div>
</p:column>
<!-- Membres -->
<p:column headerText="Membres" styleClass="text-center" style="width: 100px;">
<p:tag value="#{org.nombreMembres}" severity="info" icon="pi pi-users"/>
<p:column headerText="Membres" style="width: 7rem; text-align: center;">
<div class="text-center">
<span class="text-900 font-bold text-lg">
#{empty org.nombreMembres ? 0 : org.nombreMembres}
</span>
<div class="text-500 text-xs">membres</div>
</div>
</p:column>
<!-- Statut -->
<p:column headerText="Statut" sortBy="#{org.statut}" styleClass="text-center" style="width: 100px;">
<p:tag value="#{org.statut}"
severity="#{org.statut == organisationsBean.statutActive ? 'success' : 'warning'}"
icon="#{org.statut == organisationsBean.statutActive ? 'pi pi-check' : 'pi pi-times'}"/>
<p:column headerText="Statut" sortBy="#{org.statut}" style="width: 9rem; text-align: center;">
<p:tag value="#{org.statut}"
severity="#{org.statut == organisationsBean.statutActive ? 'success' :
(org.statut == organisationsBean.statutSuspendue ? 'danger' :
(org.statut == organisationsBean.statutDissoute ? 'danger' : 'warning'))}"
icon="pi #{org.statut == organisationsBean.statutActive ? 'pi-check' :
(org.statut == organisationsBean.statutSuspendue ? 'pi-ban' : 'pi-pause')}"
styleClass="text-xs w-full" />
</p:column>
<!-- Actions (DRY/WOU: Composite Components) -->
<p:column headerText="Actions" style="width:200px">
<!-- Actions -->
<p:column headerText="Actions" style="width: 10rem;" exportable="false">
<div class="flex gap-1">
<!-- DRY/WOU: Composite Component action-button-view -->
<uf:action-button-view itemId="#{org.id.toString()}"
detailPage="/pages/secure/organisation/detail.xhtml"
iconOnly="true"/>
<!-- DRY/WOU: button-icon pour Modifier -->
<p:button icon="pi pi-eye"
title="Voir le détail"
styleClass="ui-button-rounded ui-button-text ui-button-info ui-button-sm"
href="/pages/secure/organisation/detail.xhtml?id=#{org.id}" />
<p:commandButton icon="pi pi-pencil"
actionListener="#{organisationsBean.setOrganisationSelectionnee(org)}"
oncomplete="PF('dlgModifier').show();"
styleClass="ui-button-rounded ui-button-text ui-button-warning ui-button-sm"
title="Modifier"
update=":formModifier"
styleClass="ui-button-rounded ui-button-warning"
title="Modifier"/>
<!-- DRY/WOU: button-icon pour Activer/Désactiver -->
<p:commandButton icon="#{org.statut == organisationsBean.statutActive ? 'pi pi-ban' : 'pi pi-check'}"
actionListener="#{organisationsBean.basculerStatutOrganisation(org)}"
update=":formOrganisations:dtOrganisations :formOrganisations:messages"
styleClass="ui-button-rounded #{org.statut == organisationsBean.statutActive ? 'ui-button-secondary' : 'ui-button-success'}"
title="#{org.statut == organisationsBean.statutActive ? 'Désactiver' : 'Activer'}">
<p:confirm header="Confirmation"
message="Êtes-vous sûr de vouloir changer le statut de cette organisation ?"
icon="pi pi-exclamation-triangle"/>
oncomplete="PF('dlgModifier').show();">
<f:setPropertyActionListener target="#{organisationsBean.organisationSelectionnee}" value="#{org}" />
</p:commandButton>
<!-- DRY/WOU: button-icon pour Supprimer -->
<p:commandButton icon="pi pi-trash"
actionListener="#{organisationsBean.supprimerOrganisation(org)}"
update=":formOrganisations:dtOrganisations :formOrganisations:messages"
styleClass="ui-button-rounded ui-button-danger"
title="Supprimer">
<p:commandButton icon="#{org.statut == organisationsBean.statutActive ? 'pi pi-ban' : 'pi pi-check'}"
styleClass="ui-button-rounded ui-button-text ui-button-sm #{org.statut == organisationsBean.statutActive ? 'ui-button-secondary' : 'ui-button-success'}"
title="#{org.statut == organisationsBean.statutActive ? 'Désactiver' : 'Activer'}"
actionListener="#{organisationsBean.basculerStatutOrganisation(org)}"
update=":panelKPIs :formOrganisations:dtOrganisations :formOrganisations:messages">
<p:confirm header="Confirmation"
message="Êtes-vous sûr de vouloir supprimer cette organisation ? Cette action est irréversible."
icon="pi pi-exclamation-triangle"/>
message="Changer le statut de cette organisation ?"
icon="pi pi-exclamation-triangle" />
</p:commandButton>
<p:commandButton icon="pi pi-trash"
styleClass="ui-button-rounded ui-button-text ui-button-danger ui-button-sm"
title="Supprimer"
actionListener="#{organisationsBean.supprimerOrganisation(org)}"
update=":panelKPIs :formOrganisations:dtOrganisations :formOrganisations:messages">
<p:confirm header="Confirmation"
message="Supprimer définitivement cette organisation ? Cette action est irréversible."
icon="pi pi-exclamation-triangle" />
</p:commandButton>
</div>
</p:column>
</p:dataTable>
</ui:define>
</ui:decorate>
<!-- Dialogue de confirmation global (DRY/WOU: confirm-dialog) -->
<ui:include src="/templates/components/dialogs/confirm-dialog.xhtml" />
</h:form>
<!-- Dialogue Modifier Organisation (DRY/WOU: form-dialog) -->
<p:confirmDialog global="true" showEffect="fade" hideEffect="fade" responsive="true" width="380">
<p:commandButton value="Non"
type="button"
styleClass="ui-button-secondary ui-button-outlined"
icon="pi pi-times"
onclick="PF('confirmDialog').hide()" />
<p:commandButton value="Oui"
type="button"
styleClass="ui-button-danger"
icon="pi pi-check" />
</p:confirmDialog>
</h:form>
</div>
</div><!-- /ui-fluid -->
<!-- ═══════════════════════════════════════════════════════════════ -->
<!-- DIALOGUE MODIFICATION -->
<!-- ═══════════════════════════════════════════════════════════════ -->
<ui:decorate template="/templates/components/dialogs/form-dialog.xhtml">
<ui:param name="dialogId" value="dlgModifier" />
<ui:param name="header" value="Modifier Organisation" />
<ui:param name="header" value="Modifier l'organisation" />
<ui:param name="widgetVar" value="dlgModifier" />
<ui:param name="formId" value="formModifier" />
<ui:param name="width" value="900" />
@@ -225,27 +300,24 @@
<ui:include src="/ui/includes/organisation-form.xhtml">
<ui:param name="model" value="#{organisationsBean.organisationSelectionnee}" />
<ui:param name="typesItems" value="#{organisationsBean.typesSelectItemsForForm}" />
<ui:param name="completionBean" value="#{organisationsBean}" />
</ui:include>
</ui:fragment>
</ui:define>
<ui:define name="footer">
<!-- Bouton Annuler : type="button" pour éviter la soumission -->
<p:commandButton value="Annuler"
icon="pi pi-times"
type="button"
onclick="PF('dlgModifier').hide();"
styleClass="ui-button-secondary" />
<!-- DRY/WOU: button-form-submit pour action backend -->
<ui:decorate template="/templates/components/buttons/button-form-submit.xhtml">
<ui:param name="value" value="Enregistrer" />
<ui:param name="icon" value="pi pi-check" />
<ui:param name="action" value="#{organisationsBean.modifierOrganisation}" />
<ui:param name="update" value=":formOrganisations:dtOrganisations :formOrganisations:messages" />
<ui:param name="oncomplete" value="if(!args.validationFailed) PF('dlgModifier').hide();" />
<ui:param name="severity" value="success" />
</ui:decorate>
styleClass="ui-button-secondary ui-button-outlined" />
<p:commandButton value="Enregistrer"
icon="pi pi-check"
actionListener="#{organisationsBean.modifierOrganisation}"
update=":panelKPIs :formOrganisations:dtOrganisations :formOrganisations:messages"
oncomplete="if(!args.validationFailed) PF('dlgModifier').hide();"
styleClass="ui-button-success" />
</ui:define>
</ui:decorate>
</ui:define>
</ui:composition>
</html>

View File

@@ -1,64 +1,113 @@
<!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 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"
template="/templates/main-template.xhtml">
<ui:composition template="/templates/main-template.xhtml">
<ui:param name="page" value="#{organisationsBean}"/>
<ui:define name="title">Nouvelle Organisation</ui:define>
<ui:define name="content">
<!-- Initialiser le modèle et le catalogue des types à chaque affichage de la vue -->
<f:event type="preRenderView" listener="#{organisationsBean.preparerNouvelleOrganisation}" />
<h:form id="formNouvelleOrganisation">
<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">Nouvelle Organisation</h3>
<span class="text-600">
Renseignez l'ensemble des informations de l'organisation.
</span>
<!-- En-tête avec titre et actions (DRY/WOU: card-header) -->
<ui:decorate template="/templates/components/cards/card-header.xhtml">
<ui:param name="title" value="Nouvelle Organisation" />
<ui:param name="subtitle" value="Créez une nouvelle organisation en renseignant les informations essentielles." />
<ui:param name="icon" value="pi pi-building" />
<ui:param name="styleClass" value="mb-3" />
<ui:define name="actions">
<!-- Bouton Enregistrer (MethodExpression direct) -->
<p:commandButton value="Enregistrer"
icon="pi pi-save"
action="#{organisationsBean.creerOrganisation}"
update="formNouvelleOrganisation messages"
styleClass="p-button-success p-button-lg"
validateClient="true">
<p:confirm header="Confirmation"
message="Voulez-vous créer cette organisation ?"
icon="pi pi-question-circle"/>
</p:commandButton>
<!-- DRY/WOU: button-secondary pour Annuler -->
<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/organisation/liste"/>
</ui:include>
</ui:define>
<ui:define name="info">
<p class="text-500 text-sm m-0">
<i class="pi pi-asterisk text-red-500 mr-1" style="font-size: 0.5rem;"/>
Les champs marqués d'un astérisque sont obligatoires
</p>
</ui:define>
</ui:decorate>
<!-- Messages globaux -->
<p:messages id="messages" showDetail="true" closable="true" styleClass="mb-3"/>
<!-- Formulaire (DRY/WOU: card-simple) -->
<ui:decorate template="/templates/components/cards/card-simple.xhtml">
<ui:param name="styleClass" value="shadow-2" />
<ui:define name="content">
<!-- DRY/WOU: organisation-form.xhtml include réutilisable -->
<ui:include src="/ui/includes/organisation-form.xhtml">
<ui:param name="model" value="#{organisationsBean.nouvelleOrganisation}" />
<ui:param name="typesItems" value="#{organisationsBean.typesSelectItemsForForm}" />
<ui:param name="completionBean" value="#{organisationsBean}" />
</ui:include>
<!-- Actions du formulaire (bas de page) -->
<p:divider styleClass="mt-5"/>
<div class="flex justify-content-between align-items-center flex-column md:flex-row gap-3 mt-4">
<div class="text-600">
<i class="pi pi-shield mr-2"/>
Toutes les données sont sécurisées et conformes
</div>
<div class="flex gap-2">
<!-- Bouton Réinitialiser avec confirmation -->
<p:commandButton value="Réinitialiser"
icon="pi pi-refresh"
action="#{organisationsBean.preparerNouvelleOrganisation}"
update="formNouvelleOrganisation"
styleClass="p-button-outlined p-button-warning"
immediate="true">
<p:confirm header="Confirmation"
message="Réinitialiser le formulaire ? Toutes les données seront perdues."
icon="pi pi-exclamation-triangle"/>
</p:commandButton>
<!-- DRY/WOU: button-secondary pour Annuler -->
<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/organisation/liste"/>
</ui:include>
<!-- Bouton Créer l'organisation (MethodExpression direct) -->
<p:commandButton value="Créer l'organisation"
icon="pi pi-check"
action="#{organisationsBean.creerOrganisation}"
update="formNouvelleOrganisation messages"
styleClass="p-button-success p-button-lg"
validateClient="true">
<p:confirm header="Confirmation de création"
message="Créer cette organisation avec les informations saisies ?"
icon="pi pi-question-circle"/>
</p:commandButton>
</div>
</div>
<div class="flex gap-2">
<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/organisation/liste"/>
</ui:include>
</div>
</div>
</div>
</ui:define>
</ui:decorate>
<div class="card">
<h5 class="mb-3">Informations de l'Organisation</h5>
<ui:include src="/ui/includes/organisation-form.xhtml">
<ui:param name="model" value="#{organisationsBean.nouvelleOrganisation}" />
<ui:param name="typesItems" value="#{organisationsBean.typesSelectItemsForForm}" />
</ui:include>
</div>
<!-- Dialog de confirmation global (DRY/WOU: confirm-dialog) -->
<ui:include src="/templates/components/dialogs/confirm-dialog.xhtml" />
<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/organisation/liste"/>
</ui:include>
<!-- Bouton Créer : p:commandButton direct car action avec méthode backend -->
<p:commandButton value="Créer"
icon="pi pi-check"
action="#{organisationsBean.creerOrganisation}"
update=":formNouvelleOrganisation:messages"
styleClass="ui-button-success" />
</div>
</h:form>
</ui:define>
</ui:composition>
</html>