feat: Migration complète vers Quarkus PrimeFaces Freya

Migration du frontend React/Next.js vers Quarkus + PrimeFaces Freya 5.0.0

Dashboard:
- Extension de BtpXpressApiClient avec tous les endpoints dashboard
- Création de DashboardService pour récupérer les données API
- Refactorisation DashboardView : uniquement données réelles de l'API
- Restructuration dashboard.xhtml avec tous les aspects métiers BTP
- Suppression complète de toutes les données fictives

Topbar:
- Amélioration du menu profil utilisateur avec header professionnel
- Ajout UserSessionBean pour gérer les informations utilisateur
- Styles CSS personnalisés pour une disposition raffinée
- Badges de notifications conditionnels

Configuration:
- Intégration du thème Freya 5.0.0-jakarta
- Configuration OIDC pour Keycloak (security.lions.dev)
- Gestion des erreurs HTTP 431 (headers size)
- Support du format Fcfa avec séparateurs d'espaces

Converters:
- Création de FcfaConverter pour formater les montants en Fcfa avec espaces (x xxx xxx format)

Code Quality:
- Code entièrement documenté en français avec Javadoc exemplaire
- Respect du principe Java 'Write once, use many times'
- Logging complet pour le débogage
- Gestion d'erreurs robuste
This commit is contained in:
dahoud
2025-11-01 19:55:30 +00:00
commit b749f2df37
269 changed files with 29252 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<ui:param name="formId" value="filtresForm"/>
<ui:param name="viewBean" value=""/>
<ui:param name="tableId" value=""/>
<div class="card">
<h5>Recherche et filtres</h5>
<h:form id="#{formId}">
<ui:insert name="filter-fields">
<!-- Les champs de filtre spécifiques à chaque page -->
</ui:insert>
<div class="col-12">
<p:commandButton value="Rechercher"
icon="pi pi-search"
action="#{viewBean.search()}"
update="#{tableId}"
styleClass="ui-button-primary"/>
<p:commandButton value="Réinitialiser"
icon="pi pi-refresh"
action="#{viewBean.resetFilters()}"
update="#{tableId} #{formId}"
styleClass="ui-button-secondary"/>
</div>
</h:form>
</div>
</ui:composition>

View File

@@ -0,0 +1,43 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<div class="card">
<div class="flex align-items-center justify-content-between mb-3">
<h5>#{title}</h5>
<p:commandButton value="Nouveau"
icon="pi pi-plus"
action="#{viewBean.createNew()}"
styleClass="ui-button-primary"
rendered="#{not empty createPath}"/>
</div>
<h:form id="#{formId}">
<p:dataTable id="#{tableId}"
value="#{viewBean.items}"
var="#{var}"
paginator="true"
rows="10"
rowsPerPageTemplate="10,20,50"
emptyMessage="Aucun résultat trouvé"
loading="#{viewBean.loading}"
selection="#{viewBean.selectedItem}"
selectionMode="single">
<f:facet name="header">
<div class="flex align-items-center justify-content-between">
<span>Total : #{viewBean.items.size()} élément(s)</span>
<p:commandButton icon="pi pi-trash"
title="Supprimer"
disabled="#{empty viewBean.selectedItem}"
action="#{viewBean.delete()}"
update="#{tableId}"
styleClass="ui-button-danger ui-button-text"/>
</div>
</f:facet>
<ui:insert name="columns"/>
</p:dataTable>
</h:form>
</div>
</ui:composition>

View File

@@ -0,0 +1,94 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<a href="#" id="layout-config-button" class="layout-config-button">
<i class="pi pi-cog"/>
</a>
<div id="layout-config" class="layout-config">
<h:form id="config-form" styleClass="layout-config-form">
<h5 style="margin-top: 0">Type de Menu</h5>
<p:selectOneRadio value="#{guestPreferences.menuMode}" layout="pageDirection"
onchange="PrimeFaces.FreyaConfigurator.changeMenuMode(event.target.value)" >
<f:selectItem itemLabel="Horizontal" itemValue="layout-horizontal" />
<f:selectItem itemLabel="Sidebar" itemValue="layout-sidebar" />
<f:selectItem itemLabel="Slim" itemValue="layout-slim" />
<p:ajax listener="#{guestPreferences.onMenuTypeChange}" update="config-form" />
</p:selectOneRadio>
<hr/>
<h5>Schéma de Couleurs</h5>
<p:selectOneRadio value="#{guestPreferences.darkMode}" layout="pageDirection"
onchange="PrimeFaces.FreyaConfigurator.changeLayout('#{guestPreferences.componentTheme}', event.target.value)" >
<f:selectItem itemLabel="Clair" itemValue="light" />
<f:selectItem itemLabel="Sombre" itemValue="dark" />
<p:ajax onstart="PrimeFaces.FreyaConfigurator.beforeResourceChange()" update="config-form logolink"/>
</p:selectOneRadio>
<p:outputPanel rendered="#{guestPreferences.menuMode eq 'layout-horizontal'}">
<hr/>
<h5>Mode Topbar et Menu</h5>
<p:selectOneRadio value="#{guestPreferences.topbarTheme}" layout="pageDirection"
onchange="PrimeFaces.FreyaConfigurator.changeSectionTheme(event.target.value , 'layout-topbar');PrimeFaces.FreyaConfigurator.changeSectionTheme(event.target.value , 'layout-menu')" >
<f:selectItem itemLabel="Clair" itemValue="light" itemDisabled="#{guestPreferences.darkMode != 'light'}" />
<f:selectItem itemLabel="Sombre" itemValue="dark" itemDisabled="#{guestPreferences.darkMode != 'light'}"/>
<p:ajax update="logolink config-form"/>
</p:selectOneRadio>
</p:outputPanel>
<p:outputPanel rendered="#{guestPreferences.menuMode != 'layout-horizontal'}">
<hr/>
<h5>Mode Topbar</h5>
<p:selectOneRadio value="#{guestPreferences.topbarTheme}" layout="pageDirection"
onchange="PrimeFaces.FreyaConfigurator.changeSectionTheme(event.target.value , 'layout-topbar')" >
<f:selectItem itemLabel="Clair" itemValue="light" itemDisabled="#{guestPreferences.darkMode != 'light'}" />
<f:selectItem itemLabel="Sombre" itemValue="dark" itemDisabled="#{guestPreferences.darkMode != 'light'}"/>
<p:ajax update="logolink config-form"/>
</p:selectOneRadio>
</p:outputPanel>
<p:outputPanel rendered="#{guestPreferences.menuMode != 'layout-horizontal'}">
<hr/>
<h5>Mode Menu</h5>
<p:selectOneRadio value="#{guestPreferences.menuTheme}" layout="pageDirection"
onchange="PrimeFaces.FreyaConfigurator.changeSectionTheme(event.target.value , 'layout-menu')" >
<f:selectItem itemLabel="Clair" itemValue="light" itemDisabled="#{guestPreferences.darkMode != 'light'}" />
<f:selectItem itemLabel="Sombre" itemValue="dark" itemDisabled="#{guestPreferences.darkMode != 'light'}"/>
<p:ajax update="logolink config-form"/>
</p:selectOneRadio>
</p:outputPanel>
<hr/>
<h5>Style d'Input</h5>
<p:selectOneRadio value="#{guestPreferences.inputStyle}" layout="pageDirection"
onchange="PrimeFaces.FreyaConfigurator.updateInputStyle(event.target.value)">
<f:selectItem itemLabel="Outlined" itemValue="outlined" />
<f:selectItem itemLabel="Filled" itemValue="filled" />
<p:ajax />
</p:selectOneRadio>
<hr/>
<h5>Couleurs du Thème</h5>
<div class="layout-themes">
<ui:repeat value="#{guestPreferences.componentThemes}" var="componentTheme">
<div>
<p:commandLink actionListener="#{guestPreferences.setComponentTheme(componentTheme.file)}"
style="background-color: #{componentTheme.color};" title="#{componentTheme.name}"
process="@this"
update="config-form"
onstart="PrimeFaces.FreyaConfigurator.beforeResourceChange()"
oncomplete="PrimeFaces.FreyaConfigurator.changeComponentsTheme('#{componentTheme.file}', '#{guestPreferences.darkMode}')">
</p:commandLink>
</div>
</ui:repeat>
</div>
</h:form>
</div>
</ui:composition>

View File

@@ -0,0 +1,58 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<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">PLAN DU SITE</span>
<ul>
<li><a href="dashboard.xhtml">Tableau de bord</a></li>
<li><a href="chantiers.xhtml">Chantiers</a></li>
<li><a href="clients.xhtml">Clients</a></li>
<li><a href="devis.xhtml">Devis</a></li>
</ul>
</div>
<div class="col-6">
<span class="footer-menutitle"></span>
<ul>
<li><a href="factures.xhtml">Factures</a></li>
<li><a href="materiels.xhtml">Matériels</a></li>
<li><a href="employes.xhtml">Employés</a></li>
<li><a href="rapports.xhtml">Rapports</a></li>
</ul>
</div>
</div>
</div>
<div class="col-12 md:col-6 lg:col-4">
<span class="footer-menutitle">NOUS CONTACTER</span>
<ul>
<li>Email : contact@btpxpress.com</li>
<li>Support : support@btpxpress.com</li>
<li>Téléphone : +33 (0)1 XX XX XX XX</li>
</ul>
</div>
<div class="col-12 md:col-6 lg:col-4">
<span class="footer-menutitle">NEWSLETTER</span>
<span class="footer-subtitle">Inscrivez-vous à notre newsletter pour recevoir les dernières nouveautés.</span>
<h:form>
<div class="newsletter-input">
<p:inputText placeholder="Votre adresse email" />
<p:commandButton value="S'inscrire" styleClass="ui-button-secondary"/>
</div>
</h:form>
</div>
<div class="col-12">
<div class="footer-bottom">
<h4>BTP Xpress</h4>
<h6>Copyright © 2025 - Tous droits réservés</h6>
</div>
</div>
</div>
</div>
</ui:composition>

View File

@@ -0,0 +1,124 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:fr="http://primefaces.org/freya">
<div class="menu-wrapper">
<div class="sidebar-logo">
<a href="dashboard.xhtml">
<p:graphicImage name="images/logo-freya-single.svg" library="freya-layout" />
</a>
<a href="#" class="sidebar-pin" title="Toggle Menu">
<span class="pin"></span>
</a>
</div>
<div class="layout-menu-container">
<h:form id="menuform">
<fr:menu widgetVar="FreyaMenuWidget">
<p:menuitem id="m_dashboard" value="Dashboard" icon="pi pi-home" outcome="/dashboard" />
<p:submenu id="m_chantiers" label="Chantiers" icon="pi pi-building">
<p:menuitem id="m_chantiers_liste" value="List" icon="pi pi-list" outcome="/chantiers" />
<p:menuitem id="m_chantiers_nouveau" value="New" icon="pi pi-plus-circle" outcome="/chantiers/nouveau" />
<p:menuitem id="m_chantiers_en_cours" value="In Progress" icon="pi pi-spin pi-spinner" outcome="/chantiers/en-cours" />
<p:menuitem id="m_chantiers_termines" value="Completed" icon="pi pi-check-circle" outcome="/chantiers/termines" />
<p:menuitem id="m_chantiers_planifies" value="Scheduled" icon="pi pi-calendar" outcome="/chantiers/planifies" />
</p:submenu>
<p:submenu id="m_clients" label="Clients" icon="pi pi-users">
<p:menuitem id="m_clients_liste" value="List" icon="pi pi-list" outcome="/clients" />
<p:menuitem id="m_clients_nouveau" value="New" icon="pi pi-user-plus" outcome="/clients/nouveau" />
<p:menuitem id="m_clients_recherche" value="Search" icon="pi pi-search" outcome="/clients/recherche" />
</p:submenu>
<p:submenu id="m_devis" label="Devis" icon="pi pi-file-edit">
<p:menuitem id="m_devis_liste" value="List" icon="pi pi-list" outcome="/devis" />
<p:menuitem id="m_devis_nouveau" value="New" icon="pi pi-plus" outcome="/devis/nouveau" />
<p:menuitem id="m_devis_attente" value="Pending" icon="pi pi-clock" outcome="/devis/attente" />
<p:menuitem id="m_devis_acceptes" value="Accepted" icon="pi pi-check" outcome="/devis/acceptes" />
<p:menuitem id="m_devis_expires" value="Expired" icon="pi pi-exclamation-triangle" outcome="/devis/expires" />
</p:submenu>
<p:submenu id="m_factures" label="Factures" icon="pi pi-dollar">
<p:menuitem id="m_factures_liste" value="List" icon="pi pi-list" outcome="/factures" />
<p:menuitem id="m_factures_nouvelle" value="New" icon="pi pi-plus" outcome="/factures/nouvelle" />
<p:menuitem id="m_factures_payees" value="Paid" icon="pi pi-check-circle" outcome="/factures/payees" />
<p:menuitem id="m_factures_impayees" value="Unpaid" icon="pi pi-exclamation-circle" outcome="/factures/impayees" />
<p:menuitem id="m_factures_retard" value="Overdue" icon="pi pi-clock" outcome="/factures/retard" />
</p:submenu>
<p:submenu id="m_materiels" label="Matériels" icon="pi pi-wrench">
<p:menuitem id="m_materiels_liste" value="Inventory" icon="pi pi-list" outcome="/materiels" />
<p:menuitem id="m_materiels_nouveau" value="New" icon="pi pi-plus" outcome="/materiels/nouveau" />
<p:menuitem id="m_materiels_disponibles" value="Available" icon="pi pi-check" outcome="/materiels/disponibles" />
<p:menuitem id="m_materiels_maintenance" value="Maintenance" icon="pi pi-cog" outcome="/materiels/maintenance-prevue" />
</p:submenu>
<p:submenu id="m_stock" label="Stock" icon="pi pi-box">
<p:menuitem id="m_stock_liste" value="Management" icon="pi pi-list" outcome="/stock" />
<p:menuitem id="m_stock_inventaire" value="Inventory" icon="pi pi-check-square" outcome="/stock/inventaire" />
<p:menuitem id="m_stock_commandes" value="Orders" icon="pi pi-shopping-cart" outcome="/stock/commandes" />
<p:menuitem id="m_stock_sorties" value="Outgoing" icon="pi pi-sign-out" outcome="/stock/sorties" />
</p:submenu>
<p:submenu id="m_employes" label="Employés" icon="pi pi-id-card">
<p:menuitem id="m_employes_liste" value="List" icon="pi pi-list" outcome="/employes" />
<p:menuitem id="m_employes_nouveau" value="New" icon="pi pi-user-plus" outcome="/employes/nouveau" />
<p:menuitem id="m_employes_actifs" value="Active" icon="pi pi-check-circle" outcome="/employes/actifs" />
<p:menuitem id="m_employes_disponibles" value="Available" icon="pi pi-users" outcome="/employes/disponibles" />
</p:submenu>
<p:submenu id="m_equipes" label="Équipes" icon="pi pi-users">
<p:menuitem id="m_equipes_liste" value="List" icon="pi pi-list" outcome="/equipes" />
<p:menuitem id="m_equipes_nouvelle" value="New" icon="pi pi-plus" outcome="/equipes/nouvelle" />
<p:menuitem id="m_equipes_disponibles" value="Available" icon="pi pi-check" outcome="/equipes/disponibles" />
<p:menuitem id="m_equipes_specialites" value="Specialties" icon="pi pi-tags" outcome="/equipes/specialites" />
</p:submenu>
<p:submenu id="m_planning" label="Planning" icon="pi pi-calendar">
<p:menuitem id="m_planning_calendrier" value="Calendar" icon="pi pi-calendar" outcome="/planning/calendrier" />
<p:menuitem id="m_planning_materiel" value="Equipment" icon="pi pi-wrench" outcome="/planning/materiel" />
<p:menuitem id="m_planning_equipes" value="Teams" icon="pi pi-users" outcome="/planning/equipes" />
</p:submenu>
<p:submenu id="m_maintenance" label="Maintenance" icon="pi pi-cog">
<p:menuitem id="m_maintenance_liste" value="List" icon="pi pi-list" outcome="/maintenance" />
<p:menuitem id="m_maintenance_nouvelle" value="New" icon="pi pi-plus" outcome="/maintenance/nouveau" />
<p:menuitem id="m_maintenance_preventive" value="Preventive" icon="pi pi-shield" outcome="/maintenance/preventive" />
<p:menuitem id="m_maintenance_corrective" value="Corrective" icon="pi pi-exclamation-triangle" outcome="/maintenance/corrective" />
<p:menuitem id="m_maintenance_urgente" value="Urgent" icon="pi pi-bolt" outcome="/maintenance/urgente" />
</p:submenu>
<p:submenu id="m_rapports" label="Rapports" icon="pi pi-chart-bar">
<p:menuitem id="m_rapports_liste" value="List" icon="pi pi-list" outcome="/rapports" />
<p:menuitem id="m_rapports_ca" value="Revenue" icon="pi pi-dollar" outcome="/rapports/ca" />
<p:menuitem id="m_rapports_rentabilite" value="Profitability" icon="pi pi-chart-line" outcome="/rapports/rentabilite" />
<p:menuitem id="m_rapports_clients" value="By Client" icon="pi pi-users" outcome="/rapports/clients" />
<p:menuitem id="m_rapports_equipes" value="By Team" icon="pi pi-id-card" outcome="/rapports/equipes" />
</p:submenu>
<p:submenu id="m_notifications" label="Notifications" icon="pi pi-bell">
<p:menuitem id="m_notifications_liste" value="All" icon="pi pi-list" outcome="/notifications" />
<p:menuitem id="m_notifications_recentes" value="Recent" icon="pi pi-clock" outcome="/notifications/recentes" />
<p:menuitem id="m_notifications_non_lues" value="Unread" icon="pi pi-envelope" outcome="/notifications/non-lues" />
<p:menuitem id="m_notifications_statistiques" value="Statistics" icon="pi pi-chart-pie" outcome="/notifications/statistiques" />
</p:submenu>
<p:submenu id="m_messages" label="Messages" icon="pi pi-comments">
<p:menuitem id="m_messages_liste" value="Inbox" icon="pi pi-inbox" outcome="/messages" />
<p:menuitem id="m_messages_nouveau" value="New" icon="pi pi-plus" outcome="/messages/nouveau" />
<p:menuitem id="m_messages_envoyes" value="Sent" icon="pi pi-send" outcome="/messages/envoyes" />
<p:menuitem id="m_messages_archives" value="Archived" icon="pi pi-archive" outcome="/messages/archives" />
</p:submenu>
<p:menuitem id="m_profile" value="Profile" icon="pi pi-user" outcome="/profile" />
<p:menuitem id="m_documentation" value="Documentation" icon="pi pi-book" outcome="/documentation" />
</fr:menu>
</h:form>
</div>
</div>
</ui:composition>

View File

@@ -0,0 +1,65 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<div class="layout-rightpanel">
<div class="rightpanel-wrapper">
<div class="rightpanel-section tasks-section">
<div class="section-header">
<h6>Mes Tâches</h6>
<h:form>
<p:commandButton type="button" icon="pi pi-plus" styleClass="ui-button-secondary ui-button-flat rounded-button" />
</h:form>
</div>
<ul>
<li>
<div class="task-info">
<h6>Réviser le devis pour le chantier A</h6>
<span>-Validation budgétaire</span>
<span>-Vérification matériaux</span>
</div>
</li>
<li>
<div class="task-info">
<h6>Planifier la maintenance préventive</h6>
<span>Matériel : Pelleteuse BX-2024</span>
</div>
</li>
<li class="done">
<div class="task-info">
<h6>Finaliser le rapport hebdomadaire</h6>
</div>
<i class="pi pi-check"></i>
</li>
</ul>
</div>
<div class="rightpanel-section favorites-section">
<div class="section-header">
<h6>Favoris</h6>
</div>
<div class="favorite-items">
<a href="dashboard.xhtml" class="favorite-item">
<i class="pi pi-home" style="font-size: 1.5rem;"></i>
</a>
<a href="chantiers.xhtml" class="favorite-item">
<i class="pi pi-building" style="font-size: 1.5rem;"></i>
</a>
<a href="clients.xhtml" class="favorite-item">
<i class="pi pi-users" style="font-size: 1.5rem;"></i>
</a>
<a href="rapports.xhtml" class="favorite-item">
<i class="pi pi-chart-bar" style="font-size: 1.5rem;"></i>
</a>
<a href="#" class="add-item">
<i class="pi pi-plus"></i>
</a>
</div>
</div>
</div>
</div>
</ui:composition>

View File

@@ -0,0 +1,59 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
lang="fr">
<h:head>
<f:facet name="first">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="icon" href="#{request.contextPath}/resources/freya-layout/images/favicon.ico" type="image/x-icon"></link>
</f:facet>
<title><ui:insert name="title">BTP Xpress - Gestion de Projets BTP</ui:insert></title>
<h:outputStylesheet name="theme.css" library="primefaces-freya-#{guestPreferences.componentTheme}-#{guestPreferences.darkMode}"/>
<h:outputStylesheet name="css/primeicons.css" library="freya-layout" />
<h:outputStylesheet name="css/primeflex.min.css" library="freya-layout" />
<h:outputStylesheet name="css/#{guestPreferences.layout}.css" library="freya-layout" />
<h:outputStylesheet name="css/custom-topbar.css" />
<h:outputScript name="js/layout.js" library="freya-layout" />
<h:outputScript name="js/prism.js" library="freya-layout"/>
<ui:insert name="head"/>
</h:head>
<h:body styleClass="#{guestPreferences.inputStyleClass}">
<div class="layout-wrapper layout-topbar-#{guestPreferences.topbarTheme} layout-menu-#{guestPreferences.menuTheme} #{guestPreferences.menuMode}" >
<ui:include src="./topbar.xhtml"/>
<ui:include src="./rightpanel.xhtml"/>
<ui:include src="./config.xhtml" />
<div class="layout-main">
<div class="layout-content">
<ui:insert name="content"/>
</div>
<ui:include src="./footer.xhtml"/>
</div>
<p:ajaxStatus style="width:32px;height:32px;position:fixed;right:7px;bottom:7px">
<f:facet name="start">
<i class="pi pi-spin pi-spinner ajax-loader" aria-hidden="true"/>
</f:facet>
<f:facet name="complete">
<h:outputText value="" />
</f:facet>
</p:ajaxStatus>
<div class="layout-mask modal-in"></div>
</div>
</h:body>
</html>

View File

@@ -0,0 +1,129 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:po="http://primefaces.org/freya">
<div class="layout-topbar">
<div class="layout-topbar-wrapper">
<div class="layout-topbar-left">
<a href="#" class="menu-button">
<i class="pi pi-bars"/>
</a>
<h:link id="logolink" outcome="/dashboard" styleClass="layout-topbar-logo">
<p:graphicImage name="images/#{ guestPreferences.lightLogo ? 'logo-freya-white.svg' : 'logo-freya.svg'}" library="freya-layout" />
</h:link>
</div>
<ui:include src="./menu.xhtml" />
<div class="layout-topbar-right">
<ul class="layout-topbar-actions">
<li class="topbar-item search-item">
<a href="#">
<i class="topbar-icon pi pi-search"/>
</a>
<h:form>
<h:panelGroup styleClass="search-input-wrapper">
<p:inputText placeholder="Search..." />
<i class="pi pi-search"/>
</h:panelGroup>
</h:form>
<ul>
<h:form onsubmit="return false;">
<h:panelGroup styleClass="search-input-wrapper">
<p:inputText placeholder="Search..." />
<i class="pi pi-search"/>
</h:panelGroup>
</h:form>
</ul>
</li>
<li class="topbar-item notifications-item">
<a href="/notifications">
<i class="topbar-icon pi pi-bell"/>
<p:outputPanel rendered="#{userSession.nombreNotificationsNonLues > 0}">
<span class="ui-badge">#{userSession.nombreNotificationsNonLues}</span>
</p:outputPanel>
</a>
</li>
<li class="topbar-item messages-item">
<a href="/messages">
<i class="topbar-icon pi pi-envelope"/>
<p:outputPanel rendered="#{userSession.nombreMessagesNonLus > 0}">
<span class="ui-badge">#{userSession.nombreMessagesNonLus}</span>
</p:outputPanel>
</a>
</li>
<li class="topbar-item user-profile">
<a href="#">
<p:graphicImage name="images/avatar-profilemenu.png" library="freya-layout" />
</a>
<ul>
<li class="user-profile-header">
<div class="user-info">
<p:graphicImage name="images/avatar-profilemenu.png" library="freya-layout" styleClass="profile-avatar-small" />
<div class="user-details">
<span class="user-name">#{userSession.nomComplet}</span>
<span class="user-role">#{userSession.role}</span>
</div>
</div>
</li>
<li class="user-profile-divider">
<hr/>
</li>
<li>
<a href="/profile">
<i class="pi pi-user"></i>
<span>Profile</span>
</a>
</li>
<li>
<a href="#">
<i class="pi pi-cog"></i>
<span>Settings</span>
</a>
</li>
<li>
<a href="/messages">
<i class="pi pi-envelope"></i>
<span>Messages</span>
<p:outputPanel rendered="#{userSession.nombreMessagesNonLus > 0}">
<span class="ui-badge">#{userSession.nombreMessagesNonLus}</span>
</p:outputPanel>
</a>
</li>
<li>
<a href="/notifications">
<i class="pi pi-bell"></i>
<span>Notifications</span>
<p:outputPanel rendered="#{userSession.nombreNotificationsNonLues > 0}">
<span class="ui-badge">#{userSession.nombreNotificationsNonLues}</span>
</p:outputPanel>
</a>
</li>
<li class="user-profile-divider">
<hr/>
</li>
<li>
<h:form>
<h:commandLink action="#{userSession.deconnecter()}" styleClass="logout-link">
<i class="pi pi-sign-out"></i>
<span>Logout</span>
</h:commandLink>
</h:form>
</li>
</ul>
</li>
</ul>
<a href="#" class="layout-rightpanel-button">
<i class="pi pi-arrow-left"/>
</a>
</div>
</div>
</div>
</ui:composition>