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

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