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

@@ -2,7 +2,8 @@
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:p="http://primefaces.org/ui"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
<!--
Composant bouton icône seule réutilisable (WOU/DRY)
@@ -20,9 +21,9 @@
<ui:fragment rendered="#{empty rendered or rendered}">
<p:commandButton
icon="#{icon}"
action="#{action}"
update="#{update}"
onclick="#{onclick}"
type="button"
disabled="#{not empty disabled and disabled}"
styleClass="#{not empty rounded and rounded ? 'ui-button-rounded' : ''} #{not empty text and text ? 'ui-button-text' : ''} #{not empty severity ? 'ui-button-' += severity : ''} #{not empty styleClass ? styleClass : ''}"
title="#{title}" />

View File

@@ -15,21 +15,21 @@
-->
<div class="col-12 md:col-3">
<h:panelGroup layout="block"
styleClass="card #{bgColor == 'blue' ? 'bg-blue-100 border-left-3 border-blue-500' : (bgColor == 'green' ? 'bg-green-100 border-left-3 border-green-500' : (bgColor == 'orange' ? 'bg-orange-100 border-left-3 border-orange-500' : 'bg-blue-100 border-left-3 border-blue-500'))}">
<h:panelGroup layout="block"
styleClass="card bg-#{bgColor}-100 border-left-3 border-#{bgColor}-500">
<div class="flex justify-content-between">
<div>
<h:panelGroup layout="block"
styleClass="font-bold text-xl #{bgColor == 'blue' ? 'text-blue-900' : (bgColor == 'green' ? 'text-green-900' : (bgColor == 'orange' ? 'text-orange-900' : 'text-blue-900'))}">
styleClass="font-bold text-xl text-#{bgColor}-900">
<h:outputText value="#{value}" />
</h:panelGroup>
<h:panelGroup layout="block"
styleClass="#{bgColor == 'blue' ? 'text-blue-700' : (bgColor == 'green' ? 'text-green-700' : (bgColor == 'orange' ? 'text-orange-700' : 'text-blue-700'))}">
styleClass="text-#{bgColor}-700">
<h:outputText value="#{label}" />
</h:panelGroup>
</div>
<h:panelGroup layout="block"
styleClass="text-white border-round text-center #{bgColor == 'blue' ? 'bg-blue-500' : (bgColor == 'green' ? 'bg-green-500' : (bgColor == 'orange' ? 'bg-orange-500' : 'bg-blue-500'))}"
styleClass="text-white border-round text-center bg-#{bgColor}-500"
style="width: 2.5rem; height: 2.5rem; line-height: 2.5rem;">
<i class="#{icon} text-lg"></i>
</h:panelGroup>

View File

@@ -1,7 +1,5 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
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:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:p="http://primefaces.org/ui">
<!--
Composant colonne Texte avec icône réutilisable - DRY/WOU
@@ -14,12 +12,13 @@
</ui:include>
-->
<p:column headerText="#{headerText}"
style="#{not empty width ? 'width: ' += width : ''}">
<p:column headerText="#{headerText}" sortBy="#{sortBy}" filterBy="#{filterBy}"
filterMatchMode="#{empty filterMatchMode ? 'contains' : filterMatchMode}"
style="#{not empty width ? 'width: ' += width : ''}">
<ui:fragment rendered="#{not empty icon}">
<i class="#{icon} mr-1"></i>
<i class="#{icon} mr-1 text-primary"></i>
</ui:fragment>
<h:outputText value="#{text}"/>
<h:outputText value="#{text}" styleClass="#{not empty styleClass ? styleClass : ''}" />
<ui:insert />
</p:column>
</ui:composition>
</ui:composition>

View File

@@ -11,22 +11,19 @@
<ui:param name="value" value="#{bean.property}"/>
<ui:param name="multiline" value="true" />
</ui:include>
Note : utilise l'opérateur EL `empty` pour gérer correctement null,
chaînes vides, 0 (entier valide) et false (booléen valide).
-->
<div class="mb-3">
<div class="text-600 text-sm mb-1">
<h:outputText value="#{label}" />
<h:panelGroup rendered="#{not empty value}">
<div class="mb-4">
<div style="font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.09em;color:var(--text-color-secondary);opacity:.7;margin-bottom:.35rem;">
<h:outputText value="#{label}" />
</div>
<div style="font-size:.925rem;font-weight:600;color:var(--text-color);#{multiline ? 'white-space:pre-line;line-height:1.6;' : ''}">
<h:outputText value="#{value}" escape="true" />
</div>
</div>
<div class="text-900">
<h:outputText value="#{value}"
rendered="#{value != null}"
escape="true"
style="#{multiline ? 'white-space: pre-line;' : ''}" />
<h:outputText value="Non renseigné"
rendered="#{value == null}"
styleClass="text-400" />
</div>
</div>
</h:panelGroup>
</ui:composition>

View File

@@ -1,57 +1,12 @@
<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">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<div class="layout-footer">
<div class="grid">
<div class="col-12 lg:col-4">
<div class="grid">
<div class="col-6">
<span class="footer-menutitle">NAVIGATION</span>
<ul>
<li><a href="/pages/secure/dashboard">Tableau de Bord</a></li>
<li><a href="/pages/secure/membre/liste">Membres</a></li>
<li><a href="/pages/secure/adhesion/liste">Adhésions</a></li>
<li><a href="/pages/secure/aide/documentation">Aide</a></li>
</ul>
</div>
<div class="col-6">
<span class="footer-menutitle"></span>
<ul>
<li><a href="/pages/secure/evenement/calendrier">Calendrier</a></li>
<li><a href="/pages/secure/cotisation/historique">Cotisations</a></li>
<li><a href="/pages/secure/rapport/membres">Rapports</a></li>
<li><a href="/pages/secure/admin/parametres">Paramètres</a></li>
</ul>
</div>
</div>
</div>
<div class="col-12 md:col-6 lg:col-3">
<span class="footer-menutitle">CONTACT</span>
<ul>
<li>+221 77 123 45 67</li>
<li>Plateau, Dakar,</li>
<li>Sénégal</li>
<li>contact@unionflow.sn</li>
</ul>
</div>
<div class="col-12 md:col-6 lg:col-5">
<span class="footer-menutitle">NEWSLETTER</span>
<span class="footer-subtitle">Rejoignez notre newsletter pour être informé des nouvelles fonctionnalités.</span>
<h:form>
<div class="newsletter-input">
<p:inputText placeholder="adresse email" />
<p:commandButton value="S'abonner" styleClass="ui-button-secondary" />
</div>
</h:form>
</div>
<div class="col-12">
<div class="footer-bottom">
<h4>UnionFlow</h4>
<h6>Copyright © Lions Dev Team</h6>
</div>
</div>
<div class="footer-bottom" style="justify-content:space-between;align-items:center;flex-wrap:wrap;gap:.5rem;">
<h4 style="margin:0;">UnionFlow</h4>
<h6 style="margin:0;opacity:.7;">Copyright &#169; Lions Dev Team</h6>
</div>
</div>
</ui:composition>
</ui:composition>

View File

@@ -21,7 +21,7 @@
<p:menuitem id="m_dashboard" value="Tableau de Bord" icon="pi pi-home" outcome="/pages/secure/dashboard" />
<!-- Super Administration -->
<p:submenu id="m_super_admin" label="Super Administration" icon="pi pi-shield">
<p:submenu id="m_super_admin" label="Super Administration" icon="pi pi-shield" rendered="#{menuBean.superAdminMenuVisible}">
<p:menuitem id="m_super_dashboard" value="Dashboard Super-Admin" icon="pi pi-chart-bar" outcome="/pages/super-admin/dashboard" />
<p:menuitem id="m_gestion_entites" value="Gestion des Entités" icon="pi pi-sitemap" outcome="/pages/super-admin/entites/gestion" />
<p:menuitem id="m_gestion_types_organisations" value="Types d'Organisation" icon="pi pi-tags" outcome="/pages/super-admin/types/organisations" />
@@ -29,140 +29,154 @@
</p:submenu>
<!-- Administration Générale -->
<p:submenu id="m_administration" label="Administration" icon="pi pi-cog">
<p:menuitem id="m_gestion_cotisations" value="Gestion Cotisations" icon="pi pi-dollar" outcome="/pages/admin/cotisations/gestion" />
<p:menuitem id="m_gestion_evenements" value="Gestion Événements" icon="pi pi-calendar" outcome="/pages/admin/evenements/gestion" />
<p:menuitem id="m_demandes_aide" value="Demandes d'Aide" icon="pi pi-heart" outcome="/pages/admin/demandes/gestion" />
<p:menuitem id="m_rapports_stats" value="Rapports et Statistiques" icon="pi pi-chart-bar" outcome="/pages/admin/rapports/statistiques" />
<p:submenu id="m_administration" label="Administration" icon="pi pi-cog" rendered="#{menuBean.administrationMenuVisible}">
<p:menuitem id="m_gestion_cotisations" value="Gestion Cotisations" icon="pi pi-dollar" outcome="/pages/admin/cotisations/gestion" rendered="#{menuBean.cotisationsAdminVisible}" />
<p:menuitem id="m_gestion_evenements" value="Gestion Événements" icon="pi pi-calendar" outcome="/pages/admin/evenements/gestion" rendered="#{menuBean.creationEvenementVisible}" />
<p:menuitem id="m_demandes_aide" value="Demandes d'Aide" icon="pi pi-heart" outcome="/pages/admin/demandes/gestion" rendered="#{menuBean.traitementAideVisible}" />
<p:menuitem id="m_rapports_stats" value="Rapports et Statistiques" icon="pi pi-chart-bar" outcome="/pages/admin/rapports/statistiques" rendered="#{menuBean.rapportsMenuVisible}" />
<p:menuitem id="m_gestion_documents" value="Gestion Documents" icon="pi pi-folder" outcome="/pages/admin/documents/gestion" />
<p:menuitem id="m_parametres" value="Paramètres Système" icon="pi pi-sliders-h" url="#" />
<p:menuitem id="m_utilisateurs" value="Gestion Utilisateurs" icon="pi pi-users" outcome="/pages/admin/utilisateurs/gestion" />
<p:menuitem id="m_roles" value="Rôles et Permissions" icon="pi pi-key" outcome="/pages/super-admin/roles/gestion" />
<p:menuitem id="m_audit" value="Journal d'Audit" icon="pi pi-file-o" outcome="/pages/admin/audit/journal" />
<p:menuitem id="m_parametres" value="Paramètres Système" icon="pi pi-sliders-h" url="#" rendered="#{menuBean.adminOrganisation or menuBean.superAdmin}" />
<p:menuitem id="m_roles" value="Rôles Applicatifs" icon="pi pi-key" outcome="/pages/super-admin/roles/gestion" rendered="#{menuBean.superAdmin}" />
<p:menuitem id="m_audit" value="Journal d'Audit Applicatif" icon="pi pi-file-o" outcome="/pages/admin/audit/journal" rendered="#{menuBean.adminOrganisation or menuBean.superAdmin}" />
<p:separator rendered="#{menuBean.keycloakUserManagerVisible}" />
<!-- Lions User Manager - Gestion Keycloak -->
<p:menuitem id="m_user_manager_list" value="Utilisateurs Keycloak" icon="pi pi-users-cog" outcome="/pages/user-manager/users/list" rendered="#{menuBean.keycloakUserManagerVisible}" />
<p:menuitem id="m_user_manager_create" value="Nouvel Utilisateur Keycloak" icon="pi pi-user-plus" outcome="/pages/user-manager/users/create" rendered="#{menuBean.keycloakUserManagerVisible}" />
<p:menuitem id="m_user_manager_roles" value="Rôles Keycloak" icon="pi pi-shield" outcome="/pages/user-manager/roles/list" rendered="#{menuBean.keycloakUserManagerVisible}" />
<p:menuitem id="m_user_manager_audit" value="Journal d'Audit Keycloak" icon="pi pi-history" outcome="/pages/user-manager/audit/logs" rendered="#{menuBean.keycloakUserManagerVisible}" />
</p:submenu>
<!-- Gestion des Membres -->
<p:submenu id="m_membres" label="Gestion des Membres" icon="pi pi-users">
<!-- Annuaire des Membres (MEMBRE_ACTIF et plus - Consultation) -->
<p:submenu id="m_annuaire" label="Annuaire des Membres" icon="pi pi-users" rendered="#{menuBean.annuaireMembresVisible}">
<p:menuitem id="m_liste_membres_lecture" value="Liste des Membres" icon="pi pi-list" outcome="/pages/secure/membre/liste" />
<p:menuitem id="m_recherche_membres" value="Rechercher un Membre" icon="pi pi-search" outcome="/pages/secure/membre/recherche" />
</p:submenu>
<!-- Gestion des Membres (SECRETAIRE, ADMIN - Administration) -->
<p:submenu id="m_gestion_membres" label="Gestion des Membres" icon="pi pi-users-cog" rendered="#{menuBean.gestionMembresMenuVisible}">
<p:menuitem id="m_inscription" value="Nouvelle Inscription" icon="pi pi-user-plus" outcome="/pages/secure/membre/inscription" />
<p:menuitem id="m_liste_membres" value="Liste des Membres" icon="pi pi-list" outcome="/pages/secure/membre/liste" />
<p:menuitem id="m_recherche_membres" value="Recherche Avancée" icon="pi pi-search" outcome="/pages/secure/membre/recherche" />
<p:menuitem id="m_profil_membre" value="Mon Profil" icon="pi pi-user" outcome="/pages/secure/membre/profil" />
<p:menuitem id="m_liste_membres" value="Liste Complète" icon="pi pi-list" outcome="/pages/secure/membre/liste" />
<p:menuitem id="m_validation_membres" value="Validation Inscriptions" icon="pi pi-check-circle" outcome="/pages/secure/membre/validation" />
<p:menuitem id="m_import_membres" value="Import en Masse" icon="pi pi-upload" outcome="/pages/secure/membre/import" />
<p:menuitem id="m_export_membres" value="Export Membres" icon="pi pi-download" outcome="/pages/secure/membre/export" />
<p:separator />
<!-- Lions User Manager - Gestion Keycloak -->
<p:menuitem id="m_user_manager_list" value="Utilisateurs Keycloak" icon="pi pi-users-cog" outcome="/pages/user-manager/users/list" />
<p:menuitem id="m_user_manager_create" value="Nouvel Utilisateur" icon="pi pi-user-plus" outcome="/pages/user-manager/users/create" />
<p:menuitem id="m_user_manager_roles" value="Gestion des Rôles" icon="pi pi-shield" outcome="/pages/user-manager/roles/list" />
<p:menuitem id="m_user_manager_audit" value="Journal d'Audit" icon="pi pi-history" outcome="/pages/user-manager/audit/logs" />
</p:submenu>
<!-- Gestion des Organisations -->
<p:submenu id="m_organisations" label="Organisations" icon="pi pi-building">
<p:submenu id="m_organisations" label="Organisations" icon="pi pi-building" rendered="#{menuBean.organisationsMenuVisible}">
<p:menuitem id="m_liste_organisations" value="Liste des Organisations" icon="pi pi-list" outcome="/pages/secure/organisation/liste" />
<p:menuitem id="m_nouvelle_organisation" value="Nouvelle Organisation" icon="pi pi-plus" outcome="/pages/secure/organisation/nouvelle" />
<p:menuitem id="m_statistiques_orga" value="Statistiques" icon="pi pi-chart-bar" url="#" />
<p:menuitem id="m_statistiques_orga" value="Statistiques" icon="pi pi-chart-bar" outcome="/pages/secure/organisation/statistiques" />
</p:submenu>
<!-- Gestion des Adhésions -->
<p:submenu id="m_adhesions" label="Gestion des Adhésions" icon="pi pi-bookmark">
<p:submenu id="m_adhesions" label="Gestion des Adhésions" icon="pi pi-bookmark" rendered="#{menuBean.adhesionsMenuVisible}">
<p:menuitem id="m_demande_adhesion" value="Nouvelle Demande" icon="pi pi-plus-circle" outcome="/pages/secure/adhesion/demande" />
<p:menuitem id="m_validation_adhesion" value="Validation des Demandes" icon="pi pi-check-circle" outcome="/pages/secure/adhesion/validation" />
<p:menuitem id="m_validation_adhesion" value="Validation des Demandes" icon="pi pi-check-circle" outcome="/pages/secure/adhesion/validation" rendered="#{menuBean.validationAdhesionVisible}" />
<p:menuitem id="m_liste_adhesions" value="Toutes les Adhésions" icon="pi pi-list" outcome="/pages/secure/adhesion/liste" />
<p:menuitem id="m_renouvellement" value="Renouvellements" icon="pi pi-refresh" outcome="/pages/secure/adhesion/renouvellement" />
<p:menuitem id="m_cartes_membres" value="Cartes de Membres" icon="pi pi-id-card" url="#" />
<p:menuitem id="m_historique_adhesions" value="Historique" icon="pi pi-history" url="#" />
<p:menuitem id="m_cartes_membres" value="Cartes de Membres" icon="pi pi-id-card" outcome="/pages/secure/adhesion/cartes-membres" rendered="#{menuBean.secretaire or menuBean.adminOrganisation or menuBean.superAdmin}" />
<p:menuitem id="m_historique_adhesions" value="Historique" icon="pi pi-history" outcome="/pages/secure/adhesion/historique" />
</p:submenu>
<!-- Gestion Financière -->
<p:submenu id="m_finances" label="Gestion Financière" icon="pi pi-dollar">
<p:menuitem id="m_cotisations" value="Cotisations" icon="pi pi-credit-card" outcome="/pages/secure/cotisation/paiement" />
<p:menuitem id="m_historique_cotisations" value="Historique Paiements" icon="pi pi-history" outcome="/pages/secure/cotisation/historique" />
<p:menuitem id="m_relances" value="Relances et Rappels" icon="pi pi-bell" outcome="/pages/secure/cotisation/relances" />
<!-- Mes Finances (TOUS - Finances personnelles) -->
<p:submenu id="m_mes_finances" label="Mes Finances" icon="pi pi-wallet" rendered="#{menuBean.mesFinancesMenuVisible}">
<p:menuitem id="m_mes_cotisations" value="Mes Cotisations" icon="pi pi-credit-card" outcome="/pages/secure/membre/cotisations" rendered="#{menuBean.paiementCotisationVisible}" />
<p:menuitem id="m_payer_cotisations" value="Payer mes Cotisations" icon="pi pi-dollar" outcome="/pages/secure/cotisation/paiement" rendered="#{menuBean.paiementCotisationVisible}" />
<p:menuitem id="m_historique_finances" value="Historique" icon="pi pi-history" outcome="/pages/secure/cotisation/historique" />
</p:submenu>
<!-- Gestion Financière (TRESORIER, ADMIN - Administration finances) -->
<p:submenu id="m_gestion_finances" label="Gestion Financière" icon="pi pi-dollar" rendered="#{menuBean.gestionFinancesMenuVisible}">
<p:menuitem id="m_tresorerie" value="Trésorerie" icon="pi pi-wallet" outcome="/pages/secure/finance/tresorerie" />
<p:menuitem id="m_budgets" value="Gestion des Budgets" icon="pi pi-chart-pie" outcome="/pages/secure/finance/budgets" />
<p:menuitem id="m_comptabilite" value="Comptabilité" icon="pi pi-calculator" outcome="/pages/secure/comptabilite/gestion" />
<p:menuitem id="m_relances" value="Relances Cotisations" icon="pi pi-bell" outcome="/pages/secure/cotisation/relances" />
<p:menuitem id="m_rapports_cotisations" value="Rapports Cotisations" icon="pi pi-chart-bar" outcome="/pages/secure/cotisation/rapports" />
<p:menuitem id="m_budgets" value="Gestion des Budgets" icon="pi pi-chart-pie" url="#" />
<p:menuitem id="m_tresorerie" value="Trésorerie" icon="pi pi-wallet" url="#" />
<p:menuitem id="m_comptabilite" value="Comptabilité" icon="pi pi-calculator" url="#" />
<p:menuitem id="m_bilans" value="Bilans Financiers" icon="pi pi-chart-line" url="#" />
<p:menuitem id="m_bilans" value="Bilans Financiers" icon="pi pi-chart-line" outcome="/pages/secure/finance/bilans" />
</p:submenu>
<!-- Épargne et Crédit (RESPONSABLE_CREDIT, TRESORIER, ADMIN - Spécifique mutuelles) -->
<p:submenu id="m_epargne_credit" label="Épargne et Crédit" icon="pi pi-money-bill" rendered="#{menuBean.epargneCreditVisible}">
<p:menuitem id="m_demandes_credit" value="Demandes de Crédit" icon="pi pi-inbox" outcome="/pages/secure/credit/demandes" />
<p:menuitem id="m_evaluation_credit" value="Évaluation Solvabilité" icon="pi pi-search" outcome="/pages/secure/credit/evaluation" />
<p:menuitem id="m_suivi_credits" value="Suivi des Crédits" icon="pi pi-eye" outcome="/pages/secure/credit/suivi" />
<p:menuitem id="m_remboursements" value="Remboursements" icon="pi pi-replay" outcome="/pages/secure/credit/remboursements" />
<p:menuitem id="m_stats_credit" value="Statistiques Crédit" icon="pi pi-chart-bar" outcome="/pages/secure/credit/statistiques" />
</p:submenu>
<!-- Aide Sociale -->
<p:submenu id="m_aides" label="Aide Sociale" icon="pi pi-heart">
<p:menuitem id="m_demande_aide" value="Nouvelle Demande" icon="pi pi-plus" outcome="/pages/secure/aide/demande" />
<!-- Mes Demandes d'Aide (TOUS - Demandes personnelles) -->
<p:submenu id="m_mes_aides" label="Aide Sociale" icon="pi pi-heart" rendered="#{menuBean.mesAidesSocialesMenuVisible}">
<p:menuitem id="m_demande_aide" value="Faire une Demande" icon="pi pi-plus" outcome="/pages/secure/aide/demande" rendered="#{menuBean.demandeAideSocialeVisible}" />
<p:menuitem id="m_mes_demandes_aide" value="Mes Demandes" icon="pi pi-list" outcome="/pages/secure/aide/requests" rendered="#{menuBean.mesDemandesAideVisible}" />
<p:menuitem id="m_historique_aides" value="Historique" icon="pi pi-clock" outcome="/pages/secure/aide/historique" />
</p:submenu>
<!-- Gestion Aide Sociale (RESPONSABLE_SOCIAL, ADMIN - Administration aide sociale) -->
<p:submenu id="m_gestion_aides" label="Gestion Aide Sociale" icon="pi pi-heart-fill" rendered="#{menuBean.gestionAidesSocialesMenuVisible}">
<p:menuitem id="m_traitement_aide" value="Traitement des Demandes" icon="pi pi-cog" outcome="/pages/secure/aide/traitement" />
<p:menuitem id="m_evaluation_aide" value="Évaluation Sociale" icon="pi pi-search" url="#" />
<p:menuitem id="m_suivi_aide" value="Suivi des Bénéficiaires" icon="pi pi-eye" url="#" />
<p:menuitem id="m_historique_aides" value="Historique des Aides" icon="pi pi-clock" outcome="/pages/secure/aide/historique" />
<p:menuitem id="m_suivi_aide" value="Suivi des Bénéficiaires" icon="pi pi-eye" outcome="/pages/secure/aide/approved" />
<p:menuitem id="m_statistiques_aides" value="Statistiques Sociales" icon="pi pi-chart-line" outcome="/pages/secure/aide/statistiques" />
<p:menuitem id="m_fonds_solidarite" value="Fonds de Solidarité" icon="pi pi-heart-fill" url="#" />
</p:submenu>
<!-- Gestion des Événements -->
<p:submenu id="m_evenements" label="Gestion des Événements" icon="pi pi-calendar">
<p:menuitem id="m_creation_evenement" value="Nouvel Événement" icon="pi pi-plus" outcome="/pages/secure/evenement/creation" />
<!-- Événements (TOUS - Participation) -->
<p:submenu id="m_mes_evenements" label="Événements" icon="pi pi-calendar" rendered="#{menuBean.mesEvenementsMenuVisible}">
<p:menuitem id="m_calendrier" value="Calendrier" icon="pi pi-calendar-plus" outcome="/pages/secure/evenement/calendrier" />
<p:menuitem id="m_mes_inscriptions_events" value="Mes Inscriptions" icon="pi pi-list" outcome="/pages/secure/evenement/participants" rendered="#{menuBean.mesInscriptionsEvenementsVisible}" />
<p:menuitem id="m_mes_reservations" value="Mes Réservations" icon="pi pi-ticket" outcome="/pages/secure/evenement/reservations" />
</p:submenu>
<!-- Gestion Événements (RESPONSABLE_EVENEMENTS, SECRETAIRE, ADMIN - Organisation) -->
<p:submenu id="m_gestion_evenements" label="Gestion Événements" icon="pi pi-calendar-clock" rendered="#{menuBean.gestionEvenementsMenuVisible}">
<p:menuitem id="m_creation_evenement" value="Nouvel Événement" icon="pi pi-plus" outcome="/pages/secure/evenement/creation" />
<p:menuitem id="m_planification" value="Planification" icon="pi pi-clock" outcome="/pages/secure/evenement/planification" />
<p:menuitem id="m_participation" value="Gestion des Participations" icon="pi pi-users" outcome="/pages/secure/evenement/participation" />
<p:menuitem id="m_gestion_generale_evenements" value="Gestion Générale" icon="pi pi-cog" outcome="/pages/secure/evenement/gestion" />
<p:menuitem id="m_logistique" value="Logistique" icon="pi pi-truck" outcome="/pages/secure/evenement/logistique" />
<p:menuitem id="m_bilan_evenements" value="Bilan des Événements" icon="pi pi-chart-bar" outcome="/pages/secure/evenement/bilan" />
<p:menuitem id="m_reservations" value="Réservations" icon="pi pi-ticket" outcome="/pages/secure/evenement/reservations" />
<p:menuitem id="m_participation" value="Gestion Participations" icon="pi pi-users" outcome="/pages/secure/evenement/participation" />
<p:menuitem id="m_gestion_generale_evenements" value="Gestion Générale" icon="pi pi-cog" outcome="/pages/secure/evenement/gestion" />
<p:menuitem id="m_bilan_evenements" value="Bilans" icon="pi pi-chart-bar" outcome="/pages/secure/evenement/bilan" />
</p:submenu>
<!-- Communication -->
<p:submenu id="m_communication" label="Communication" icon="pi pi-envelope">
<p:menuitem id="m_messages" value="Centre de Messages" icon="pi pi-inbox" url="#" />
<p:menuitem id="m_notifications" value="Notifications" icon="pi pi-bell" url="#" />
<p:menuitem id="m_annonces" value="Annonces Officielles" icon="pi pi-megaphone" url="#" />
<p:menuitem id="m_newsletter" value="Newsletter" icon="pi pi-send" url="#" />
<p:menuitem id="m_sms" value="Envoi SMS" icon="pi pi-mobile" url="#" />
<p:menuitem id="m_emailing" value="Campagnes Email" icon="pi pi-at" url="#" />
<p:menuitem id="m_reseaux_sociaux" value="Réseaux Sociaux" icon="pi pi-share-alt" url="#" />
<!-- Communication (TOUS - Messages et notifications personnelles) -->
<p:submenu id="m_mes_communications" label="Communication" icon="pi pi-envelope" rendered="#{menuBean.mesCommunicationsMenuVisible}">
<p:menuitem id="m_mes_notifications" value="Mes Notifications" icon="pi pi-bell" outcome="/pages/secure/communication/notifications" />
</p:submenu>
<!-- Gestion Documentaire -->
<p:submenu id="m_documents" label="Gestion Documentaire" icon="pi pi-folder">
<p:submenu id="m_documents" label="Gestion Documentaire" icon="pi pi-folder" rendered="#{menuBean.documentsMenuVisible}">
<p:menuitem id="m_bibliotheque" value="Bibliothèque" icon="pi pi-book" url="#" />
<p:menuitem id="m_mes_documents" value="Mes Documents" icon="pi pi-file" url="#" />
<p:menuitem id="m_modeles" value="Modèles et Templates" icon="pi pi-file-o" url="#" />
<p:menuitem id="m_archivage" value="Archivage" icon="pi pi-archive" url="#" />
<p:menuitem id="m_mes_documents" value="Mes Documents" icon="pi pi-file" outcome="/pages/secure/documents/mes-documents" />
<p:menuitem id="m_modeles" value="Modèles et Templates" icon="pi pi-file-o" url="#" rendered="#{menuBean.secretaire or menuBean.adminOrganisation or menuBean.superAdmin}" />
<p:menuitem id="m_archivage" value="Archivage" icon="pi pi-archive" url="#" rendered="#{menuBean.secretaire or menuBean.adminOrganisation or menuBean.superAdmin}" />
<p:menuitem id="m_partage" value="Documents Partagés" icon="pi pi-share-alt" url="#" />
<p:menuitem id="m_signatures" value="Signatures Électroniques" icon="pi pi-verified" url="#" />
<p:menuitem id="m_workflow_doc" value="Workflow Documentaire" icon="pi pi-sitemap" url="#" />
<p:menuitem id="m_signatures" value="Signatures Électroniques" icon="pi pi-verified" url="#" rendered="#{menuBean.adminOrganisation or menuBean.superAdmin}" />
<p:menuitem id="m_workflow_doc" value="Workflow Documentaire" icon="pi pi-sitemap" url="#" rendered="#{menuBean.secretaire or menuBean.adminOrganisation or menuBean.superAdmin}" />
</p:submenu>
<!-- Formation et Développement -->
<p:submenu id="m_formation" label="Formation et Développement" icon="pi pi-graduation-cap">
<p:menuitem id="m_formations" value="Catalogue de Formations" icon="pi pi-book" url="#" />
<p:menuitem id="m_inscriptions_formation" value="Inscriptions" icon="pi pi-user-plus" url="#" />
<p:menuitem id="m_planning_formation" value="Planning des Formations" icon="pi pi-calendar" url="#" />
<p:menuitem id="m_certifications" value="Certifications" icon="pi pi-verified" url="#" />
<p:menuitem id="m_competences" value="Gestion des Compétences" icon="pi pi-star" url="#" />
<p:menuitem id="m_e_learning" value="E-Learning" icon="pi pi-desktop" url="#" />
<p:menuitem id="m_evaluations" value="Évaluations" icon="pi pi-check-square" url="#" />
<!-- Formations (TOUS - Inscriptions et suivi) -->
<p:submenu id="m_mes_formations" label="Formations" icon="pi pi-graduation-cap" rendered="#{menuBean.mesFormationsMenuVisible}">
<p:menuitem id="m_info_formations" value="Informations" icon="pi pi-info-circle" outcome="/pages/secure/dashboard" />
</p:submenu>
<!-- Rapports et Analyses -->
<p:submenu id="m_rapports" label="Rapports et Analyses" icon="pi pi-chart-bar">
<p:menuitem id="m_tableaux_bord" value="Tableaux de Bord" icon="pi pi-chart-line" url="#" />
<p:submenu id="m_rapports" label="Rapports et Analyses" icon="pi pi-chart-bar" rendered="#{menuBean.rapportsMenuVisible}">
<p:menuitem id="m_tableaux_bord" value="Tableaux de Bord" icon="pi pi-chart-line" outcome="/pages/secure/rapport/tableaux-bord" />
<p:menuitem id="m_rapport_membres" value="Rapport Membres" icon="pi pi-users" outcome="/pages/secure/rapport/membres" />
<p:menuitem id="m_rapport_finances" value="Rapport Financier" icon="pi pi-dollar" outcome="/pages/secure/rapport/finances" />
<p:menuitem id="m_rapport_finances" value="Rapport Financier" icon="pi pi-dollar" outcome="/pages/secure/rapport/finances" rendered="#{menuBean.rapportFinancierVisible}" />
<p:menuitem id="m_rapport_activites" value="Rapport d'Activités" icon="pi pi-chart-line" outcome="/pages/secure/rapport/activites" />
<p:menuitem id="m_indicateurs" value="Indicateurs de Performance" icon="pi pi-gauge" url="#" />
<p:menuitem id="m_analyses_predicitives" value="Analyses Prédictives" icon="pi pi-eye" url="#" />
<p:menuitem id="m_export" value="Exports Personnalisés" icon="pi pi-download" outcome="/pages/secure/rapport/export" />
<p:menuitem id="m_indicateurs" value="Indicateurs de Performance" icon="pi pi-gauge" url="#" rendered="#{menuBean.adminOrganisation or menuBean.superAdmin}" />
<p:menuitem id="m_analyses_predicitives" value="Analyses Prédictives" icon="pi pi-eye" url="#" rendered="#{menuBean.adminOrganisation or menuBean.superAdmin}" />
<p:menuitem id="m_export" value="Exports Personnalisés" icon="pi pi-download" outcome="/pages/secure/rapport/export" rendered="#{menuBean.exportsPersonnalisesVisible}" />
</p:submenu>
<!-- Outils et Utilitaires -->
<p:submenu id="m_outils" label="Outils et Utilitaires" icon="pi pi-wrench">
<p:submenu id="m_outils" label="Outils et Utilitaires" icon="pi pi-wrench" rendered="#{menuBean.outilsMenuVisible}">
<p:menuitem id="m_calculatrices" value="Calculatrices" icon="pi pi-calculator" url="#" />
<p:menuitem id="m_generateurs" value="Générateurs" icon="pi pi-cog" url="#" />
<p:menuitem id="m_imports" value="Imports de Données" icon="pi pi-upload" url="#" />
<p:menuitem id="m_exports_masse" value="Exports en Masse" icon="pi pi-download" url="#" />
<p:menuitem id="m_sauvegardes" value="Sauvegardes" icon="pi pi-save" url="#" />
<p:menuitem id="m_synchronisation" value="Synchronisation" icon="pi pi-sync" url="#" />
<p:menuitem id="m_maintenance" value="Maintenance" icon="pi pi-wrench" url="#" />
<p:menuitem id="m_api_externe" value="APIs Externes" icon="pi pi-cloud" url="#" />
<p:menuitem id="m_generateurs" value="Générateurs" icon="pi pi-cog" url="#" rendered="#{menuBean.adminOrganisation or menuBean.superAdmin}" />
<p:menuitem id="m_imports" value="Imports de Données" icon="pi pi-upload" url="#" rendered="#{menuBean.importExportMembreVisible}" />
<p:menuitem id="m_exports_masse" value="Exports en Masse" icon="pi pi-download" outcome="/pages/secure/outils/exports-masse" rendered="#{menuBean.exportsPersonnalisesVisible}" />
<p:menuitem id="m_sauvegardes" value="Sauvegardes" icon="pi pi-save" url="#" rendered="#{menuBean.maintenanceVisible}" />
<p:menuitem id="m_synchronisation" value="Synchronisation" icon="pi pi-sync" url="#" rendered="#{menuBean.adminOrganisation or menuBean.superAdmin}" />
<p:menuitem id="m_maintenance" value="Maintenance" icon="pi pi-wrench" url="#" rendered="#{menuBean.maintenanceVisible}" />
<p:menuitem id="m_api_externe" value="APIs Externes" icon="pi pi-cloud" url="#" rendered="#{menuBean.superAdmin}" />
</p:submenu>
<!-- Mon Espace Personnel -->

View File

@@ -4,104 +4,329 @@
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<div class="layout-topbar">
<!--
╔═══════════════════════════════════════════════════════════╗
║ UnionFlow - Elite Topbar (Freya Design System) ║
║ Real-time Session Monitor | Modern UI | Professional ║
╚═══════════════════════════════════════════════════════════╝
-->
<h:outputStylesheet library="css" name="topbar-elite.css" />
<div class="layout-topbar unionflow-elite">
<div class="layout-topbar-wrapper">
<!-- LEFT SECTION -->
<div class="layout-topbar-left">
<a href="#" class="menu-button">
<i class="pi pi-bars"/>
</a>
<h:link id="logolink" outcome="/pages/secure/dashboard" styleClass="layout-topbar-logo">
<p:graphicImage name="images/#{ guestPreferences.lightLogo ? 'logo-freya-white.svg' : 'logo-freya.svg'}" library="freya-layout" />
<p:graphicImage name="images/#{guestPreferences.lightLogo ? 'logo-freya-white.svg' : 'logo-freya.svg'}"
library="freya-layout"
alt="UnionFlow"
title="Retour au tableau de bord"/>
</h:link>
<span class="app-version">v1.0</span>
</div>
<!-- CENTER - Menu -->
<ui:include src="/templates/components/layout/menu.xhtml" />
<!-- RIGHT SECTION -->
<div class="layout-topbar-right">
<ul class="layout-topbar-actions">
<li class="topbar-item search-item ">
<a href="#">
<!-- Search -->
<li class="topbar-item search-item">
<a href="#" title="Rechercher">
<i class="topbar-icon pi pi-search"/>
</a>
<h:form>
<h:panelGroup styleClass="search-input-wrapper">
<p:inputText placeholder="Rechercher..." />
<i class="pi pi-search"/>
</h:panelGroup>
</h:form>
<ul>
<h:form onsubmit="return false;">
<h:panelGroup styleClass="search-input-wrapper">
<p:inputText placeholder="Rechercher..." />
<div class="search-dropdown">
<h:form styleClass="search-form-elite">
<div class="search-wrapper-elite">
<i class="pi pi-search"/>
</h:panelGroup>
<p:inputText placeholder="Rechercher membres, organisations..."
styleClass="search-input"/>
<p:commandButton icon="pi pi-arrow-right"
styleClass="p-button-rounded p-button-sm"/>
</div>
</h:form>
</div>
</li>
<!-- Notifications -->
<li class="topbar-item notifications-item">
<a href="#" title="Notifications">
<i class="topbar-icon pi pi-bell"/>
<span class="badge-count">3</span>
</a>
<ul class="notifications-dropdown">
<li class="notif-header">
<span class="font-semibold">Notifications</span>
<span class="count-label">3 nouvelles</span>
</li>
<li class="divider"/>
<li class="notif-item">
<i class="pi pi-info-circle text-blue-500"/>
<div>
<div class="notif-title">Nouvelle adhésion</div>
<div class="notif-time">Il y a 5 min</div>
</div>
</li>
<li class="notif-item">
<i class="pi pi-check-circle text-green-500"/>
<div>
<div class="notif-title">Cotisation validée</div>
<div class="notif-time">Il y a 1h</div>
</div>
</li>
<li class="divider"/>
<li class="notif-footer">
<a href="#" class="text-primary">Voir tout</a>
</li>
</ul>
</li>
<li class="topbar-item user-profile">
<a href="#" title="#{userSession.currentUser.nomComplet}">
<div class="flex align-items-center">
<div class="bg-primary text-white border-round flex align-items-center justify-content-center mr-2"
style="width: 32px; height: 32px; font-size: 12px; font-weight: bold;">
<!-- User Profile -->
<li class="topbar-item user-profile elite-user">
<a href="#" class="profile-trigger">
<div class="avatar-container">
<div class="avatar bg-gradient-primary">
#{userSession.currentUser.initiales}
</div>
<div class="text-sm">
<div class="text-900 font-medium">#{userSession.currentUser.nomComplet}</div>
<div class="text-600 text-xs">#{userSession.typeCompte}</div>
<span class="status-dot online"/>
</div>
<div class="user-info">
<div class="user-header">
<span class="user-name">#{userSession.currentUser.nomComplet}</span>
<span class="role-badge">#{userSession.typeCompte}</span>
</div>
<div class="session-timer">
<h:panelGroup id="sessionTimerDisplay">
<i class="#{sessionMonitor.timeIndicatorIcon} icon-sm"/>
<span class="#{sessionMonitor.timeIndicatorClass} timer-text">
#{sessionMonitor.formattedRemainingTime}
</span>
</h:panelGroup>
</div>
</div>
<i class="pi pi-angle-down arrow"/>
</a>
<ul>
<li>
<h:form>
<p:commandLink action="#{navigationBean.goToProfile}">
<i class="pi pi-user mr-2"></i>
<span>Mon Profil</span>
</p:commandLink>
</h:form>
</li>
<li>
<h:form>
<p:commandLink action="#{navigationBean.goToSettings}">
<i class="pi pi-cog mr-2"></i>
<span>Paramètres</span>
</p:commandLink>
</h:form>
</li>
<li>
<a href="/pages/secure/messages.xhtml">
<i class="pi pi-envelope mr-2"></i>
<span>Messages</span>
</a>
</li>
<li class="border-top-1 surface-border">
<div class="p-2 text-xs text-600">
<div>Entité: #{userSession.entite.nom}</div>
<div>Connecté depuis:
<span class="text-green-600">#{jwtTokenManager.timeUntilExpiration / 60} min</span>
<!-- User Dropdown -->
<ul class="user-dropdown elite-dropdown">
<!-- Header -->
<li class="dropdown-header">
<div class="header-content">
<div class="header-avatar">
<div class="avatar-lg bg-gradient-primary">
#{userSession.currentUser.initiales}
</div>
<span class="status-indicator online">
<i class="pi pi-circle-fill"/>
</span>
</div>
<div class="header-info">
<div class="name">#{userSession.currentUser.nomComplet}</div>
<div class="email">#{userSession.currentUser.email}</div>
<span class="role-tag">#{userSession.typeCompte}</span>
</div>
</div>
</li>
<li>
<!-- Session Card -->
<li class="session-card">
<div class="card-content">
<div class="info-row">
<span class="label">
<i class="pi pi-building"/>
Organisation
</span>
<span class="value">#{userSession.entite.nom}</span>
</div>
<div class="info-row">
<span class="label">
<i class="#{sessionMonitor.timeIndicatorIcon}"/>
Temps restant
</span>
<span class="value #{sessionMonitor.timeIndicatorClass}">
#{sessionMonitor.formattedRemainingTime}
</span>
</div>
<!-- Progress Bar -->
<div class="progress-container">
<div class="progress-bar">
<div class="progress-fill"
style="width: #{100 - sessionMonitor.sessionProgressPercent}%"/>
</div>
<div class="progress-label">
#{sessionMonitor.remainingMinutes} min
</div>
</div>
</div>
</li>
<li class="divider"/>
<!-- Actions -->
<li class="menu-section">
<div class="section-title">
<i class="pi pi-user"/>
Mon Compte
</div>
<div class="section-items">
<h:form>
<p:commandLink action="#{navigationBean.goToProfile}"
styleClass="menu-item">
<i class="pi pi-user-edit"/>
<span>Mon Profil</span>
<i class="pi pi-angle-right arrow-right"/>
</p:commandLink>
</h:form>
<h:form>
<p:commandLink action="#{navigationBean.goToSettings}"
styleClass="menu-item">
<i class="pi pi-cog"/>
<span>Paramètres</span>
<i class="pi pi-angle-right arrow-right"/>
</p:commandLink>
</h:form>
<a href="/pages/secure/messages.xhtml" class="menu-item">
<i class="pi pi-envelope"/>
<span>Messages</span>
<span class="item-badge">2</span>
<i class="pi pi-angle-right arrow-right"/>
</a>
</div>
</li>
<li class="divider"/>
<!-- Preferences -->
<li class="menu-section">
<div class="section-title">
<i class="pi pi-palette"/>
Préférences
</div>
<div class="section-items">
<a href="#" class="menu-item">
<i class="pi pi-sun"/>
<span>Thème</span>
<span class="value-badge">Clair</span>
</a>
<a href="#" class="menu-item">
<i class="pi pi-bell"/>
<span>Notifications</span>
<i class="pi pi-angle-right arrow-right"/>
</a>
</div>
</li>
<li class="divider"/>
<!-- Support -->
<li class="menu-section compact">
<div class="section-items">
<a href="#" class="menu-item">
<i class="pi pi-question-circle text-blue-500"/>
<span>Aide</span>
</a>
<a href="#" class="menu-item">
<i class="pi pi-info-circle text-cyan-500"/>
<span>À propos</span>
</a>
</div>
</li>
<li class="divider logout-divider"/>
<!-- Logout -->
<li class="logout-section">
<h:form>
<p:commandLink action="#{loginBean.logout}"
styleClass="text-red-600"
onclick="return confirm('Êtes-vous sûr de vouloir vous déconnecter ?');">
<i class="pi pi-sign-out mr-2"></i>
<p:commandLink styleClass="logout-btn"
onclick="PF('logoutDialog').show(); return false;">
<i class="pi pi-sign-out"/>
<span>Déconnexion</span>
<i class="pi pi-lock ml-auto"/>
</p:commandLink>
</h:form>
</li>
</ul>
</li>
</ul>
<a href="#" class="layout-rightpanel-button">
<i class="pi pi-arrow-left"></i>
<a href="#" class="layout-rightpanel-button" title="Configuration">
<i class="pi pi-arrow-left"/>
</a>
</div>
</div>
</div>
</ui:composition>
<!-- LOGOUT DIALOG -->
<p:dialog id="logoutDialog"
widgetVar="logoutDialog"
header="Confirmation de déconnexion"
modal="true"
closable="true"
styleClass="elite-dialog"
responsive="true"
width="450">
<div class="dialog-content">
<div class="icon-wrapper">
<i class="pi pi-sign-out icon-lg"/>
</div>
<h3 class="dialog-title">Êtes-vous sûr de vouloir vous déconnecter ?</h3>
<div class="info-box">
<div class="info-item">
<i class="pi pi-user"/>
<span>#{userSession.currentUser.nomComplet}</span>
</div>
<div class="info-item">
<i class="pi pi-clock"/>
<span>Session: #{sessionMonitor.formattedRemainingTime}</span>
</div>
</div>
<p class="warning-text">
<i class="pi pi-info-circle"/>
Vous devrez vous reconnecter pour accéder à l'application.
</p>
</div>
<f:facet name="footer">
<div class="dialog-footer">
<p:commandButton value="Annuler"
icon="pi pi-times"
styleClass="p-button-outlined p-button-secondary"
onclick="PF('logoutDialog').hide(); return false;"/>
<h:form>
<p:commandButton value="Se déconnecter"
icon="pi pi-sign-out"
styleClass="p-button-danger"
action="#{loginBean.logout}"
onclick="PF('logoutDialog').hide();"/>
</h:form>
</div>
</f:facet>
</p:dialog>
<!-- SESSION TIMER AUTO-REFRESH -->
<h:form id="sessionTimerForm">
<p:poll interval="5"
listener="#{sessionMonitor.updateActivity}"
update=":sessionTimerDisplay"
global="false"
autoStart="true"/>
</h:form>
</ui:composition>