Création de 2 écrans professionnels pour le module Devis:
1. devis/nouveau.xhtml:
- 4 sections: Informations générales, Détail du devis, Montants, Conditions
- Numéro auto-généré avec icône
- Statut avec 5 valeurs (BROUILLON, ATTENTE, ACCEPTE, REFUSE, EXPIRE)
- Dates d'émission et validité avec calendriers
- Client et objet du devis requis
- Placeholder pour lignes de devis (future développement)
- Calcul automatique TVA 18% et TTC
- Récapitulatif visuel HT/TVA/TTC avec composant monétaire
- Conditions de paiement et remarques (section collapsible)
- 3 boutons: Annuler, Brouillon, Envoyer
2. devis/details.xhtml:
- En-tête: numéro, statut, client, objet, dates
- Actions: Retour, Convertir en chantier, PDF, Modifier
- 4 KPI cards: Montant HT, TVA, TTC, Statut
- 6 onglets professionnels:
* Vue d'ensemble: infos + récap financier + actions rapides
* Détail des lignes: table lignes (placeholder)
* Conditions: paiement, délais, garanties
* Documents: GED associée (placeholder)
* Suivi: timeline actions
* Historique: modifications (placeholder)
Corrections:
- Fix navigation /factures/nouvelle -> /factures/nouveau (factures.xhtml)
- Fix menu /factures/nouvelle -> /factures/nouveau (menu.xhtml)
Tous les composants réutilisables utilisés (status-badge, monetary-display).
Validation complète côté client et serveur.
UI/UX professionnel adapté au métier BTP.
116 lines
4.7 KiB
HTML
116 lines
4.7 KiB
HTML
<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:c="http://xmlns.jcp.org/jsp/jstl/core">
|
|
|
|
<!--
|
|
Composant réutilisable: Indicateur de progression
|
|
|
|
Principe DRY: Un seul composant pour tous les indicateurs de progression
|
|
|
|
Paramètres:
|
|
- value: Pourcentage (0-100) - requis
|
|
- label: Libellé à afficher - optionnel
|
|
- showValue: Afficher le pourcentage (true/false - défaut: true)
|
|
- mode: Mode d'affichage (determinate, indeterminate - défaut: determinate)
|
|
- color: Couleur (primary, success, info, warning, danger - défaut: auto basé sur valeur)
|
|
- height: Hauteur de la barre (défaut: 1rem)
|
|
- labelPosition: Position du label (top, inside, bottom - défaut: top)
|
|
|
|
Utilisation basique:
|
|
<ui:include src="/WEB-INF/components/progress-indicator.xhtml">
|
|
<ui:param name="value" value="#{chantier.progressionPourcentage}"/>
|
|
<ui:param name="label" value="Progression du chantier"/>
|
|
</ui:include>
|
|
|
|
Avec couleur personnalisée:
|
|
<ui:include src="/WEB-INF/components/progress-indicator.xhtml">
|
|
<ui:param name="value" value="75"/>
|
|
<ui:param name="color" value="success"/>
|
|
<ui:param name="labelPosition" value="inside"/>
|
|
</ui:include>
|
|
|
|
Mode indéterminé (chargement):
|
|
<ui:include src="/WEB-INF/components/progress-indicator.xhtml">
|
|
<ui:param name="mode" value="indeterminate"/>
|
|
<ui:param name="label" value="Chargement en cours..."/>
|
|
</ui:include>
|
|
-->
|
|
|
|
<c:set var="progressMode" value="#{empty mode ? 'determinate' : mode}"/>
|
|
<c:set var="displayValue" value="#{empty showValue ? true : showValue}"/>
|
|
<c:set var="barHeight" value="#{empty height ? '1rem' : height}"/>
|
|
<c:set var="labelPos" value="#{empty labelPosition ? 'top' : labelPosition}"/>
|
|
|
|
<!-- Déterminer la couleur automatiquement si non fournie -->
|
|
<c:choose>
|
|
<c:when test="#{not empty color}">
|
|
<c:set var="barColor" value="#{color}"/>
|
|
</c:when>
|
|
<c:when test="#{value >= 100}">
|
|
<c:set var="barColor" value="success"/>
|
|
</c:when>
|
|
<c:when test="#{value >= 75}">
|
|
<c:set var="barColor" value="info"/>
|
|
</c:when>
|
|
<c:when test="#{value >= 50}">
|
|
<c:set var="barColor" value="primary"/>
|
|
</c:when>
|
|
<c:when test="#{value >= 25}">
|
|
<c:set var="barColor" value="warning"/>
|
|
</c:when>
|
|
<c:otherwise>
|
|
<c:set var="barColor" value="danger"/>
|
|
</c:otherwise>
|
|
</c:choose>
|
|
|
|
<!-- Classes CSS pour la couleur -->
|
|
<c:choose>
|
|
<c:when test="#{barColor eq 'success'}">
|
|
<c:set var="colorClass" value="bg-green-500"/>
|
|
</c:when>
|
|
<c:when test="#{barColor eq 'info'}">
|
|
<c:set var="colorClass" value="bg-blue-500"/>
|
|
</c:when>
|
|
<c:when test="#{barColor eq 'warning'}">
|
|
<c:set var="colorClass" value="bg-orange-500"/>
|
|
</c:when>
|
|
<c:when test="#{barColor eq 'danger'}">
|
|
<c:set var="colorClass" value="bg-red-500"/>
|
|
</c:when>
|
|
<c:otherwise>
|
|
<c:set var="colorClass" value="bg-primary"/>
|
|
</c:otherwise>
|
|
</c:choose>
|
|
|
|
<div class="progress-indicator-container" style="width: 100%;">
|
|
<!-- Label en haut -->
|
|
<div class="flex align-items-center justify-content-between mb-2"
|
|
style="#{labelPos eq 'top' ? '' : 'display: none;'}">
|
|
<span class="text-900 font-medium">#{label}</span>
|
|
<span class="text-900 font-semibold" style="#{displayValue ? '' : 'display: none;'}">
|
|
#{value}%
|
|
</span>
|
|
</div>
|
|
|
|
<!-- Barre de progression -->
|
|
<p:progressBar value="#{value}"
|
|
mode="#{progressMode}"
|
|
style="height: #{barHeight}; border-radius: 0.5rem;"
|
|
styleClass="#{colorClass}"
|
|
displayValue="#{labelPos eq 'inside' and displayValue}"/>
|
|
|
|
<!-- Label en bas -->
|
|
<div class="flex align-items-center justify-content-between mt-2"
|
|
style="#{labelPos eq 'bottom' ? '' : 'display: none;'}">
|
|
<span class="text-700">#{label}</span>
|
|
<span class="text-900 font-semibold" style="#{displayValue ? '' : 'display: none;'}">
|
|
#{value}%
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
</ui:composition>
|