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,95 @@
<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"
template="/WEB-INF/template.xhtml">
<ui:define name="title">Clients - BTP Xpress</ui:define>
<ui:define name="content">
<div class="layout-dashboard">
<div class="grid">
<div class="col-12">
<div class="card">
<div class="flex align-items-center justify-content-between mb-3">
<h1>Gestion des Clients</h1>
<p:commandButton value="Nouveau client" icon="pi pi-user-plus"
action="#{clientsView.createNew()}"
styleClass="ui-button-primary"/>
</div>
</div>
</div>
<div class="col-12">
<ui:include src="/WEB-INF/components/liste-filters.xhtml">
<ui:param name="formId" value="filtresForm"/>
<ui:param name="viewBean" value="#{clientsView}"/>
<ui:param name="tableId" value="clientsTable"/>
<ui:define name="filter-fields">
<div class="grid">
<div class="col-12 md:col-4">
<h:outputLabel for="filtreNom" value="Nom / Raison sociale"/>
<p:inputText id="filtreNom" value="#{clientsView.filtreNom}"
placeholder="Rechercher par nom..." style="width: 100%;"/>
</div>
<div class="col-12 md:col-4">
<h:outputLabel for="filtreEmail" value="Email"/>
<p:inputText id="filtreEmail" value="#{clientsView.filtreEmail}"
placeholder="Rechercher par email..." style="width: 100%;"/>
</div>
<div class="col-12 md:col-4">
<h:outputLabel for="filtreVille" value="Ville"/>
<p:inputText id="filtreVille" value="#{clientsView.filtreVille}"
placeholder="Rechercher par ville..." style="width: 100%;"/>
</div>
</div>
</ui:define>
</ui:include>
</div>
<div class="col-12">
<ui:include src="/WEB-INF/components/liste-table.xhtml">
<ui:param name="formId" value="clientsForm"/>
<ui:param name="tableId" value="clientsTable"/>
<ui:param name="viewBean" value="#{clientsView}"/>
<ui:param name="var" value="client"/>
<ui:param name="title" value="Liste des clients"/>
<ui:param name="createPath" value="/clients/nouveau"/>
<ui:define name="columns">
<p:column headerText="Raison sociale" sortBy="#{client.raisonSociale}">
<h:outputText value="#{client.raisonSociale}"/>
</p:column>
<p:column headerText="Contact" sortBy="#{client.nomContact}">
<h:outputText value="#{client.nomContact}"/>
</p:column>
<p:column headerText="Email" sortBy="#{client.email}">
<h:outputText value="#{client.email}"/>
</p:column>
<p:column headerText="Téléphone">
<h:outputText value="#{client.telephone}"/>
</p:column>
<p:column headerText="Ville" sortBy="#{client.ville}">
<h:outputText value="#{client.ville}"/>
</p:column>
<p:column headerText="Chantiers">
<p:tag value="#{client.nombreChantiers}" severity="info"/>
</p:column>
<p:column headerText="Chiffre d'affaires">
<h:outputText value="#{client.chiffreAffairesTotal}">
<f:converter converterId="fcfaConverter"/>
</h:outputText>
<h:outputText value=" Fcfa"/>
</p:column>
<p:column headerText="Actions" style="width: 150px;">
<p:commandButton icon="pi pi-eye" title="Voir les détails"
styleClass="ui-button-text"
action="#{clientsView.viewDetails(client.id)}"/>
</p:column>
</ui:define>
</ui:include>
</div>
</div>
</div>
</ui:define>
</ui:composition>