Refactoring - Version OK
This commit is contained in:
@@ -63,7 +63,7 @@
|
||||
<h:form>
|
||||
<p:button value="Se reconnecter"
|
||||
icon="pi pi-sign-in"
|
||||
outcome="/pages/public/login"
|
||||
outcome="/"
|
||||
styleClass="ui-button-primary ui-button-lg" />
|
||||
<p:button value="Page d'accueil"
|
||||
icon="pi pi-home"
|
||||
|
||||
@@ -3,171 +3,381 @@
|
||||
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"
|
||||
lang="fr">
|
||||
|
||||
<f:view>
|
||||
<f:event type="preRenderView" listener="#{navigationBean.checkAuthentication}" />
|
||||
<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" />
|
||||
</f:facet>
|
||||
|
||||
<h:head>
|
||||
<title>UnionFlow - Plateforme de Gestion Associative</title>
|
||||
<h:outputStylesheet name="freya-layout/css/primeflex.min.css"/>
|
||||
<h:outputStylesheet name="freya-layout/css/primeicons.css"/>
|
||||
<h:outputStylesheet name="primefaces-freya-blue-light/theme.css"/>
|
||||
|
||||
<style>
|
||||
body {
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
}
|
||||
|
||||
.hero-container {
|
||||
background: rgba(255, 255, 255, 0.95);
|
||||
backdrop-filter: blur(10px);
|
||||
border-radius: 20px;
|
||||
padding: 60px;
|
||||
box-shadow: 0 30px 80px rgba(0,0,0,0.3);
|
||||
text-align: center;
|
||||
max-width: 600px;
|
||||
border: 1px solid rgba(255,255,255,0.2);
|
||||
}
|
||||
|
||||
.logo-animation {
|
||||
font-size: 5rem;
|
||||
margin-bottom: 24px;
|
||||
animation: pulse 2s ease-in-out infinite alternate;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0% { transform: scale(1); }
|
||||
100% { transform: scale(1.05); }
|
||||
}
|
||||
|
||||
.hero-title {
|
||||
font-size: 3rem;
|
||||
font-weight: 700;
|
||||
margin-bottom: 16px;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
|
||||
.hero-subtitle {
|
||||
font-size: 1.3rem;
|
||||
color: #6c757d;
|
||||
margin-bottom: 32px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.features-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 20px;
|
||||
margin: 40px 0;
|
||||
}
|
||||
|
||||
.feature-item {
|
||||
background: rgba(102, 126, 234, 0.1);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.feature-icon {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 12px;
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.loading-text {
|
||||
margin-top: 20px;
|
||||
color: #6c757d;
|
||||
font-size: 0.9rem;
|
||||
animation: fadeInOut 1.5s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes fadeInOut {
|
||||
0%, 100% { opacity: 0.5; }
|
||||
50% { opacity: 1; }
|
||||
}
|
||||
</style>
|
||||
</h:head>
|
||||
<title>UnionFlow - Plateforme de Gestion Intégrée pour Mutuelles, Associations et Clubs</title>
|
||||
|
||||
<!-- Freya Layout Resources (placés dans le head pour éviter tout conflit et suivre le template) -->
|
||||
<h:outputStylesheet name="css/primeicons.css" library="freya-layout" />
|
||||
<h:outputStylesheet name="css/primeflex.min.css" library="freya-layout" />
|
||||
<h:outputStylesheet name="css/layout-#{guestPreferences.layout}.css" library="freya-layout" />
|
||||
<h:outputStylesheet name="primefaces-freya-#{guestPreferences.componentTheme}/theme.css" />
|
||||
<meta name="description" content="UnionFlow : La solution complète de gestion pour les mutuelles, associations, clubs (informatiques, juridiques, etc.) et organisations similaires. Gestion des membres, cotisations, événements, solidarité et analytics." />
|
||||
</h:head>
|
||||
|
||||
<h:body>
|
||||
<div class="hero-container">
|
||||
<!-- Logo animé -->
|
||||
<div class="logo-animation">
|
||||
<i class="pi pi-users"></i>
|
||||
</div>
|
||||
|
||||
<!-- Titre principal -->
|
||||
<h1 class="hero-title">UnionFlow</h1>
|
||||
<p class="hero-subtitle">
|
||||
Plateforme intégrée de gestion associative<br/>
|
||||
<strong>Moderne • Sécurisée • Intuitive</strong>
|
||||
</p>
|
||||
|
||||
<!-- Grille des fonctionnalités -->
|
||||
<div class="features-grid">
|
||||
<div class="feature-item">
|
||||
<div class="feature-icon">
|
||||
<i class="pi pi-users"></i>
|
||||
</div>
|
||||
<div class="text-900 font-semibold">Gestion Membres</div>
|
||||
</div>
|
||||
<div class="feature-item">
|
||||
<div class="feature-icon">
|
||||
<i class="pi pi-dollar"></i>
|
||||
</div>
|
||||
<div class="text-900 font-semibold">Cotisations</div>
|
||||
</div>
|
||||
<div class="feature-item">
|
||||
<div class="feature-icon">
|
||||
<i class="pi pi-calendar"></i>
|
||||
</div>
|
||||
<div class="text-900 font-semibold">Événements</div>
|
||||
</div>
|
||||
<div class="feature-item">
|
||||
<div class="feature-icon">
|
||||
<i class="pi pi-chart-bar"></i>
|
||||
</div>
|
||||
<div class="text-900 font-semibold">Analytics</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Boutons d'action -->
|
||||
<div class="flex justify-content-center gap-3 mb-4">
|
||||
<p:button value="Connexion Sécurisée"
|
||||
icon="pi pi-sign-in"
|
||||
outcome="/pages/public/login"
|
||||
styleClass="p-button-lg p-button-rounded"/>
|
||||
<h:body styleClass="landing-body">
|
||||
<div class="landing-wrapper">
|
||||
<!-- Landing Topbar -->
|
||||
<div class="landing-topbar">
|
||||
<div class="landing-topbar-left">
|
||||
<h:link id="logolink" outcome="/pages/secure/dashboard" styleClass="logo">
|
||||
<p:graphicImage name="images/logo-freya.svg" library="freya-layout" />
|
||||
</h:link>
|
||||
|
||||
<p:button value="Accès Direct"
|
||||
icon="pi pi-home"
|
||||
outcome="/pages/secure/dashboard"
|
||||
styleClass="p-button-lg p-button-rounded p-button-outlined"/>
|
||||
<ul class="landing-menu">
|
||||
<li>
|
||||
<a href="#" id="landing-menu-close">
|
||||
<i class="pi pi-times"> </i>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#home">Accueil</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#features">Fonctionnalités</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#benefits">Avantages</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- Texte de chargement -->
|
||||
<div class="loading-text">
|
||||
<i class="pi pi-spin pi-spinner mr-2"></i>
|
||||
Vérification de l'authentification...
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="mt-5 pt-4 border-top-1 surface-border">
|
||||
<small class="text-500">
|
||||
© 2024 UnionFlow v1.0 - Développé par <strong>Lions Dev</strong><br/>
|
||||
<span class="text-600">Côte d'Ivoire • Sénégal • Mali</span>
|
||||
</small>
|
||||
<div class="landing-topbar-right">
|
||||
<ui:include src="/templates/components/button-primary.xhtml">
|
||||
<ui:param name="value" value="Accéder" />
|
||||
<ui:param name="icon" value="pi pi-arrow-right" />
|
||||
<ui:param name="outcome" value="/pages/secure/dashboard" />
|
||||
<ui:param name="styleClass" value="landing-button" />
|
||||
</ui:include>
|
||||
<a href="#" id="landing-menu-button">
|
||||
<i class="pi pi-bars"> </i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Landing Banner (Hero Section) -->
|
||||
<div id="home" class="landing-banner">
|
||||
<div class="landing-banner-content">
|
||||
<span class="title">UnionFlow</span>
|
||||
<h3>Plateforme de Gestion Intégrée pour Mutuelles, Associations et Clubs<br/>
|
||||
Simplifiez la gestion de votre organisation avec une solution complète et moderne</h3>
|
||||
<ui:include src="/templates/components/button-primary.xhtml">
|
||||
<ui:param name="value" value="Accéder à la plateforme" />
|
||||
<ui:param name="icon" value="pi pi-sign-in" />
|
||||
<ui:param name="outcome" value="/pages/secure/dashboard" />
|
||||
<ui:param name="styleClass" value="landing-button" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</div>
|
||||
</h:body>
|
||||
</f:view>
|
||||
|
||||
</html>
|
||||
<!-- Landing Features Section -->
|
||||
<div id="features" class="landing-features">
|
||||
<div class="grid parallax-box">
|
||||
<div class="col-12 lg:col-3">
|
||||
<div class="feature yellow">
|
||||
<span>1</span>
|
||||
<div class="feature-card">
|
||||
<span>1</span>
|
||||
<div class="card-content">
|
||||
<h3>Gestion des Membres</h3>
|
||||
<h5>Inscription, profils détaillés, gestion des statuts, historique des adhésions et suivi complet de chaque membre.</h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-12 lg:col-3">
|
||||
<div class="grid">
|
||||
<div class="col-12">
|
||||
<div class="feature blue">
|
||||
<span>2</span>
|
||||
<div class="feature-card">
|
||||
<span>2</span>
|
||||
<div class="card-content">
|
||||
<h3>Gestion des Cotisations</h3>
|
||||
<h5>Types variés (mensuelle, annuelle, adhésion, événement, formation, projet, solidarité), suivi des paiements et rappels automatiques. <strong>Paiements sécurisés via Wave</strong> (bientôt disponible).</h5>
|
||||
<div style="margin-top: 10px;">
|
||||
<!-- Image locale du client (servie depuis META-INF/resources/images) -->
|
||||
<h:graphicImage value="#{request.contextPath}/images/logo-wave.png" style="max-height: 30px; width: auto;" alt="Wave - Paiements mobiles" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="feature gray">
|
||||
<span>3</span>
|
||||
<div class="feature-card">
|
||||
<span>3</span>
|
||||
<div class="card-content">
|
||||
<h3>Organisation<br/>d'Événements</h3>
|
||||
<h5>Assemblées générales, réunions, formations, conférences, ateliers, séminaires, événements sociaux avec gestion des inscriptions.</h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-12 lg:col-3 feature-4">
|
||||
<div class="col-12">
|
||||
<div class="feature darker-gray">
|
||||
<span>4</span>
|
||||
<div class="feature-card">
|
||||
<span>4</span>
|
||||
<div class="card-content">
|
||||
<h3>Système de Solidarité</h3>
|
||||
<h5>Gestion complète des demandes d'aide, propositions, évaluations, suivi des statuts et coordination des actions solidaires.</h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="feature darker-blue">
|
||||
<span>5</span>
|
||||
<div class="feature-card">
|
||||
<span>5</span>
|
||||
<div class="card-content">
|
||||
<h3>Gestion des Organisations</h3>
|
||||
<h5>Gestion des clubs et unions avec hiérarchie organisationnelle, statistiques détaillées, rapports et vue d'ensemble complète.</h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-12 lg:col-3">
|
||||
<div class="feature gray">
|
||||
<span>6</span>
|
||||
<div class="feature-card">
|
||||
<span>6</span>
|
||||
<div class="card-content">
|
||||
<h3>Analytics & Rapports</h3>
|
||||
<h5>Tableaux de bord interactifs, KPIs en temps réel, analyses approfondies et rapports personnalisables pour une prise de décision éclairée.</h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Benefits Section -->
|
||||
<div id="benefits" class="landing-pricing">
|
||||
<div class="section-header">
|
||||
<span class="title">Pourquoi choisir UnionFlow ?</span>
|
||||
<h3>Une solution pensée pour les mutuelles, associations, clubs et organisations similaires avec sécurité avancée, multi-plateforme et synchronisation temps réel.</h3>
|
||||
</div>
|
||||
<div class="grid">
|
||||
<div class="col-12 lg:col-4">
|
||||
<div class="pricing-card">
|
||||
<h2>Sécurité</h2>
|
||||
<span class="price">100%</span>
|
||||
<span class="time">Sécurisé</span>
|
||||
<ul>
|
||||
<li>Connexion sécurisée et centralisée</li>
|
||||
<li>Contrôle d'accès basé sur les rôles</li>
|
||||
<li>Protection des données sensibles</li>
|
||||
<li>Chiffrement des communications</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 lg:col-4 preferred">
|
||||
<div class="pricing-card pro">
|
||||
<span class="preferred-tag">RECOMMANDÉ</span>
|
||||
<h2>Multi-Plateforme</h2>
|
||||
<span class="price">24/7</span>
|
||||
<span class="time">Disponible</span>
|
||||
<ul>
|
||||
<li>Application web responsive</li>
|
||||
<li>Application mobile Flutter</li>
|
||||
<li>iOS et Android</li>
|
||||
<li>Accès depuis n'importe où</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 lg:col-4">
|
||||
<div class="pricing-card enterprise">
|
||||
<h2>Cloud</h2>
|
||||
<span class="price">Cloud</span>
|
||||
<span class="time">Moderne</span>
|
||||
<ul>
|
||||
<li>Architecture cloud-native</li>
|
||||
<li>Synchronisation temps réel</li>
|
||||
<li>Sauvegarde automatique</li>
|
||||
<li>Scalabilité illimitée</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center mt-5">
|
||||
<ui:include src="/templates/components/button-primary.xhtml">
|
||||
<ui:param name="value" value="Découvrir toutes les fonctionnalités" />
|
||||
<ui:param name="icon" value="pi pi-arrow-right" />
|
||||
<ui:param name="outcome" value="/pages/secure/dashboard" />
|
||||
<ui:param name="styleClass" value="landing-button" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<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="#home">Accueil</a></li>
|
||||
<li><a href="#features">Fonctionnalités</a></li>
|
||||
<li><a href="#benefits">Avantages</a></li>
|
||||
<li><a href="/pages/secure/dashboard">Tableau de Bord</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<span class="footer-menutitle">FONCTIONNALITÉS</span>
|
||||
<ul>
|
||||
<li><a href="/pages/secure/membre/liste">Membres</a></li>
|
||||
<li><a href="/pages/secure/cotisation/historique">Cotisations</a></li>
|
||||
<li><a href="/pages/secure/evenement/calendrier">Événements</a></li>
|
||||
<li><a href="/pages/secure/aide/documentation">Aide</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 md:col-6 lg:col-3">
|
||||
<span class="footer-menutitle">CONTACT</span>
|
||||
<ul>
|
||||
<li>support@unionflow.dev</li>
|
||||
<li>Abidjan, Côte d'Ivoire</li>
|
||||
<li>Plateforme de Gestion Intégrée</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" />
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="S'abonner" />
|
||||
<ui:param name="outlined" value="false" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</h:form>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="footer-bottom">
|
||||
<h4>UnionFlow</h4>
|
||||
<h6>Copyright © 2025 UnionFlow Dev Team</h6>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="landing-mask"> </div>
|
||||
</div>
|
||||
<!-- Landing Page JavaScript - selon Freya -->
|
||||
<h:outputScript name="js/layout.js" library="freya-layout" />
|
||||
<h:outputScript>
|
||||
<![CDATA[
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
const initParallax = function() {
|
||||
if (typeof $ === 'undefined') return;
|
||||
|
||||
$(document).ready(function() {
|
||||
const parallax = function() {
|
||||
const scrolled = $(window).scrollTop();
|
||||
$('.landing-banner').css('top', -(scrolled * 0.01) + '%');
|
||||
$('.landing-banner-content').css('top', (scrolled * -0.065) + '%');
|
||||
$('.parallax-box .lg\\:col-3:odd').css('transform', 'translateY(' + (scrolled * 0.01) + '%)');
|
||||
$('.parallax-box .lg\\:col-3:even').css('margin-top', -(scrolled * 0.01) + '%');
|
||||
};
|
||||
$(window).scroll(parallax);
|
||||
});
|
||||
};
|
||||
|
||||
const initMenu = function() {
|
||||
if (typeof $ === 'undefined') return;
|
||||
|
||||
const hideMenu = function() {
|
||||
$('.landing-menu').removeClass('fadeInDown').addClass('fadeOutUp');
|
||||
setTimeout(function() {
|
||||
$('.landing-wrapper').removeClass('landing-menu-active');
|
||||
$('.landing-menu').removeClass('fadeOutUp');
|
||||
$(document.body).removeClass('block-scroll');
|
||||
}, 150);
|
||||
};
|
||||
|
||||
const showMenu = function() {
|
||||
$('.landing-wrapper').addClass('landing-menu-active');
|
||||
$('.landing-menu').addClass('fadeInDown');
|
||||
$(document.body).addClass('block-scroll');
|
||||
};
|
||||
|
||||
$(function() {
|
||||
$('#landing-menu-button').on('click', function(e) {
|
||||
const wrapper = $('.landing-wrapper');
|
||||
if (wrapper.hasClass('landing-menu-active')) {
|
||||
hideMenu();
|
||||
} else {
|
||||
showMenu();
|
||||
}
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
$('.landing-menu').find('a').on('click', function() {
|
||||
hideMenu();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const initScroll = function() {
|
||||
if (typeof $ === 'undefined') return;
|
||||
|
||||
$(document).ready(function() {
|
||||
$('html, body').animate({ scrollTop: 0 }, 1);
|
||||
});
|
||||
|
||||
const isMobile = function() {
|
||||
return $(window).width() <= 896;
|
||||
};
|
||||
|
||||
$('a[href*="#"]:not([href="#"])').click(function() {
|
||||
const target = $(this.hash);
|
||||
if (target.length) {
|
||||
const offset = isMobile() ? target.offset().top : target.offset().top - 100;
|
||||
$('html, body').animate({ scrollTop: offset }, 500);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// Initialize when DOM is ready
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
initParallax();
|
||||
initMenu();
|
||||
initScroll();
|
||||
});
|
||||
} else {
|
||||
initParallax();
|
||||
initMenu();
|
||||
initScroll();
|
||||
}
|
||||
})();
|
||||
]]>
|
||||
</h:outputScript>
|
||||
|
||||
</h:body>
|
||||
|
||||
</html>
|
||||
|
||||
@@ -1,214 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<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"
|
||||
template="/templates/public-template.xhtml">
|
||||
|
||||
<ui:define name="title">Connexion - UnionFlow</ui:define>
|
||||
|
||||
<ui:define name="content">
|
||||
<div class="min-h-screen flex relative lg:static surface-ground">
|
||||
<!-- Panneau gauche - Branding -->
|
||||
<div class="flex flex-column align-items-center justify-content-center bg-blue-500 flex-shrink-0 w-full lg:w-6">
|
||||
<div class="text-center">
|
||||
<!-- Logo et icône principale -->
|
||||
<div class="mb-6">
|
||||
<div class="text-white text-7xl font-bold mb-4">
|
||||
<i class="pi pi-users"></i>
|
||||
</div>
|
||||
<h1 class="text-white text-5xl font-bold mb-2 line-height-3">UnionFlow</h1>
|
||||
<p class="text-blue-100 text-xl font-medium line-height-3 mb-0">
|
||||
Plateforme de Gestion Associative
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Fonctionnalités clés -->
|
||||
<div class="hidden lg:block">
|
||||
<div class="surface-0 shadow-2 border-round p-4 mx-6">
|
||||
<div class="text-900 text-lg font-bold mb-3">Fonctionnalités Principales</div>
|
||||
<ul class="list-none p-0 m-0 text-left">
|
||||
<li class="flex align-items-center py-2">
|
||||
<div class="w-2rem h-2rem bg-green-100 text-green-600 border-round flex align-items-center justify-content-center mr-3">
|
||||
<i class="pi pi-users"></i>
|
||||
</div>
|
||||
<span class="text-900 font-medium">Gestion des membres</span>
|
||||
</li>
|
||||
<li class="flex align-items-center py-2">
|
||||
<div class="w-2rem h-2rem bg-purple-100 text-purple-600 border-round flex align-items-center justify-content-center mr-3">
|
||||
<i class="pi pi-dollar"></i>
|
||||
</div>
|
||||
<span class="text-900 font-medium">Cotisations & Paiements</span>
|
||||
</li>
|
||||
<li class="flex align-items-center py-2">
|
||||
<div class="w-2rem h-2rem bg-orange-100 text-orange-600 border-round flex align-items-center justify-content-center mr-3">
|
||||
<i class="pi pi-calendar"></i>
|
||||
</div>
|
||||
<span class="text-900 font-medium">Événements & Activités</span>
|
||||
</li>
|
||||
<li class="flex align-items-center py-2">
|
||||
<div class="w-2rem h-2rem bg-cyan-100 text-cyan-600 border-round flex align-items-center justify-content-center mr-3">
|
||||
<i class="pi pi-chart-bar"></i>
|
||||
</div>
|
||||
<span class="text-900 font-medium">Rapports & Analytics</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Panneau droit - Formulaire de connexion -->
|
||||
<div class="flex flex-column align-items-center justify-content-center w-full lg:w-6 px-4 py-8 surface-card">
|
||||
<div class="w-full" style="max-width: 400px;">
|
||||
<!-- En-tête du formulaire -->
|
||||
<div class="text-center mb-6">
|
||||
<div class="text-900 text-3xl font-bold mb-2">Bienvenue !</div>
|
||||
<div class="text-600 mb-4">Connectez-vous à votre espace UnionFlow</div>
|
||||
|
||||
<!-- Messages système -->
|
||||
<p:messages id="messages" showDetail="true" closable="true"
|
||||
styleClass="mb-4" globalOnly="true" />
|
||||
|
||||
<!-- Message de session expirée -->
|
||||
<p:outputPanel rendered="#{param.expired == 'true'}" styleClass="mb-4">
|
||||
<div class="surface-100 border-round-lg p-3 border-left-3 border-orange-500">
|
||||
<div class="flex align-items-center">
|
||||
<i class="pi pi-clock text-orange-500 mr-3 text-2xl"></i>
|
||||
<div>
|
||||
<div class="text-900 font-semibold">Session expirée</div>
|
||||
<div class="text-600 text-sm mt-1">
|
||||
Votre session a expiré pour des raisons de sécurité. Veuillez vous reconnecter.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</p:outputPanel>
|
||||
</div>
|
||||
|
||||
<!-- Formulaire principal -->
|
||||
<h:form id="loginForm" styleClass="ui-fluid">
|
||||
|
||||
<!-- Sélecteur de type de compte avec design moderne -->
|
||||
<div class="field mb-4">
|
||||
<label for="typeCompte" class="block text-900 font-semibold mb-2">
|
||||
<i class="pi pi-user-plus mr-2"></i>Type de compte
|
||||
</label>
|
||||
<p:selectOneMenu id="typeCompte" value="#{loginBean.typeCompte}"
|
||||
required="true" styleClass="w-full">
|
||||
<f:selectItem itemLabel="Choisir votre profil..." itemValue="" noSelectionOption="true" />
|
||||
<f:selectItem itemLabel="🔱 Super-Administrateur Plateforme" itemValue="SUPER_ADMIN" />
|
||||
<f:selectItem itemLabel="🏛️ Administrateur d'Organisation" itemValue="ADMIN_ENTITE" />
|
||||
<f:selectItem itemLabel="👤 Membre Actif" itemValue="MEMBRE" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
|
||||
<!-- Champ email/username -->
|
||||
<div class="field mb-4">
|
||||
<label for="username" class="block text-900 font-semibold mb-2">
|
||||
<i class="pi pi-at mr-2"></i>Email ou nom d'utilisateur
|
||||
</label>
|
||||
<p:inputText id="username" value="#{loginBean.username}"
|
||||
placeholder="votre@email.com"
|
||||
required="true" styleClass="w-full p-3">
|
||||
<f:validateLength minimum="3" />
|
||||
</p:inputText>
|
||||
</div>
|
||||
|
||||
<!-- Champ mot de passe -->
|
||||
<div class="field mb-4">
|
||||
<label for="password" class="block text-900 font-semibold mb-2">
|
||||
<i class="pi pi-key mr-2"></i>Mot de passe
|
||||
</label>
|
||||
<p:password id="password" value="#{loginBean.password}"
|
||||
placeholder="••••••••••"
|
||||
required="true" toggleMask="true"
|
||||
styleClass="w-full p-3" />
|
||||
</div>
|
||||
|
||||
<!-- Options avancées -->
|
||||
<div class="flex align-items-center justify-content-between mb-5">
|
||||
<div class="flex align-items-center">
|
||||
<p:selectBooleanCheckbox id="rememberme" value="#{loginBean.rememberMe}"
|
||||
styleClass="mr-2" />
|
||||
<label for="rememberme" class="text-900 font-medium cursor-pointer">
|
||||
Se souvenir de moi
|
||||
</label>
|
||||
</div>
|
||||
<a href="#" class="font-semibold no-underline text-primary text-right cursor-pointer">
|
||||
Mot de passe oublié ?
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Bouton de connexion principal -->
|
||||
<p:commandButton id="loginButton" value="Se connecter"
|
||||
action="#{loginBean.login}"
|
||||
styleClass="w-full p-3 text-xl border-round font-bold mb-4"
|
||||
icon="pi pi-sign-in"
|
||||
iconPos="right"
|
||||
update="@form" />
|
||||
|
||||
<!-- Séparateur élégant -->
|
||||
<div class="flex align-items-center mb-4">
|
||||
<hr class="flex-1 border-top-1 border-300 m-0"/>
|
||||
<div class="px-3 text-500 font-medium">ou essayez en mode démo</div>
|
||||
<hr class="flex-1 border-top-1 border-300 m-0"/>
|
||||
</div>
|
||||
|
||||
<!-- Boutons démo redesignés -->
|
||||
<div class="grid gap-2">
|
||||
<div class="col-12">
|
||||
<p:commandButton value="🔱 Mode Démo Super-Admin"
|
||||
action="#{loginBean.loginDemo('SUPER_ADMIN')}"
|
||||
styleClass="ui-button-outlined ui-button-danger w-full p-2 font-bold"
|
||||
update="@form" />
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<p:commandButton value="🏛️ Démo Admin"
|
||||
action="#{loginBean.loginDemo('ADMIN')}"
|
||||
styleClass="ui-button-outlined ui-button-warning w-full p-2"
|
||||
update="@form" />
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<p:commandButton value="👤 Démo Membre"
|
||||
action="#{loginBean.loginDemo('MEMBRE')}"
|
||||
styleClass="ui-button-outlined ui-button-info w-full p-2"
|
||||
update="@form" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Call to action pour inscription -->
|
||||
<div class="surface-50 border-round p-4 mt-6 text-center">
|
||||
<div class="text-900 font-semibold mb-2">
|
||||
<i class="pi pi-star-fill text-yellow-500 mr-2"></i>
|
||||
Votre organisation n'est pas encore inscrite ?
|
||||
</div>
|
||||
<p class="text-600 mb-3 line-height-3">
|
||||
Découvrez UnionFlow avec une démonstration personnalisée
|
||||
</p>
|
||||
<a href="#" class="text-primary font-bold no-underline">
|
||||
<i class="pi pi-arrow-right mr-2"></i>Demander une démonstration
|
||||
</a>
|
||||
</div>
|
||||
</h:form>
|
||||
|
||||
<!-- Footer discret -->
|
||||
<div class="text-center mt-6 pt-4">
|
||||
<div class="text-500 text-sm mb-2">
|
||||
© 2024 UnionFlow - Développé par Lions Dev
|
||||
</div>
|
||||
<div class="flex justify-content-center gap-3 text-xs">
|
||||
<a href="#" class="text-500 no-underline hover:text-primary">Aide</a>
|
||||
<span class="text-300">•</span>
|
||||
<a href="#" class="text-500 no-underline hover:text-primary">Confidentialité</a>
|
||||
<span class="text-300">•</span>
|
||||
<a href="#" class="text-500 no-underline hover:text-primary">Conditions</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ui:define>
|
||||
|
||||
</ui:composition>
|
||||
@@ -32,8 +32,16 @@
|
||||
<p:inputTextarea id="motifAdhesion" rows="4" />
|
||||
</div>
|
||||
<div class="field col-12">
|
||||
<p:commandButton value="Soumettre la demande" icon="pi pi-send" styleClass="ui-button-success" />
|
||||
<p:commandButton value="Annuler" icon="pi pi-times" styleClass="ui-button-secondary" style="margin-left: 0.5rem" />
|
||||
<ui:include src="/templates/components/button-success.xhtml">
|
||||
<ui:param name="value" value="Soumettre la demande" />
|
||||
<ui:param name="icon" value="pi pi-send" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Annuler" />
|
||||
<ui:param name="icon" value="pi pi-times" />
|
||||
<ui:param name="outlined" value="false" />
|
||||
<ui:param name="styleClass" value="ml-2" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</div>
|
||||
</h:form>
|
||||
|
||||
@@ -23,8 +23,14 @@
|
||||
<h:outputText value="#{adhesion.statut}" />
|
||||
</p:column>
|
||||
<p:column headerText="Actions">
|
||||
<p:commandButton icon="pi pi-eye" styleClass="ui-button-rounded ui-button-info ui-button-text" />
|
||||
<p:commandButton icon="pi pi-pencil" styleClass="ui-button-rounded ui-button-success ui-button-text" />
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-eye" />
|
||||
<ui:param name="severity" value="info" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-pencil" />
|
||||
<ui:param name="severity" value="success" />
|
||||
</ui:include>
|
||||
</p:column>
|
||||
</p:dataTable>
|
||||
</div>
|
||||
|
||||
@@ -24,7 +24,11 @@
|
||||
<h:outputText value="#{adhesion.dateExpiration}" />
|
||||
</p:column>
|
||||
<p:column headerText="Action">
|
||||
<p:commandButton value="Renouveler" icon="pi pi-refresh" styleClass="ui-button-success ui-button-sm" />
|
||||
<ui:include src="/templates/components/button-success.xhtml">
|
||||
<ui:param name="value" value="Renouveler" />
|
||||
<ui:param name="icon" value="pi pi-refresh" />
|
||||
<ui:param name="styleClass" value="ui-button-sm" />
|
||||
</ui:include>
|
||||
</p:column>
|
||||
</p:dataTable>
|
||||
</div>
|
||||
|
||||
@@ -23,8 +23,16 @@
|
||||
<h:outputText value="#{adhesion.type}" />
|
||||
</p:column>
|
||||
<p:column headerText="Actions">
|
||||
<p:commandButton value="Approuver" icon="pi pi-check" styleClass="ui-button-success ui-button-sm" />
|
||||
<p:commandButton value="Rejeter" icon="pi pi-times" styleClass="ui-button-danger ui-button-sm" style="margin-left: 0.5rem" />
|
||||
<ui:include src="/templates/components/button-success.xhtml">
|
||||
<ui:param name="value" value="Approuver" />
|
||||
<ui:param name="icon" value="pi pi-check" />
|
||||
<ui:param name="styleClass" value="ui-button-sm" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Rejeter" />
|
||||
<ui:param name="icon" value="pi pi-times" />
|
||||
<ui:param name="styleClass" value="ui-button-danger ui-button-sm" />
|
||||
</ui:include>
|
||||
</p:column>
|
||||
</p:dataTable>
|
||||
</div>
|
||||
|
||||
@@ -26,13 +26,17 @@
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex gap-2">
|
||||
<p:commandButton value="Version PDF"
|
||||
styleClass="p-button-outlined"
|
||||
icon="pi pi-file-pdf" />
|
||||
<p:commandButton value="Rechercher"
|
||||
styleClass="p-button-primary p-button-outlined"
|
||||
icon="pi pi-search"
|
||||
onclick="PF('rechercheDialog').show()" />
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Version PDF" />
|
||||
<ui:param name="icon" value="pi pi-file-pdf" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-primary.xhtml">
|
||||
<ui:param name="value" value="Rechercher" />
|
||||
<ui:param name="icon" value="pi pi-search" />
|
||||
<ui:param name="onclick" value="PF('rechercheDialog').show()" />
|
||||
<ui:param name="styleClass" value="ui-button-outlined" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -145,12 +149,18 @@
|
||||
<!-- Actions rapides -->
|
||||
<div class="surface-card border-round p-3 mt-3">
|
||||
<div class="text-center">
|
||||
<p:commandButton value="Tout marquer comme lu"
|
||||
styleClass="p-button-text p-button-sm w-full"
|
||||
icon="pi pi-check-square" />
|
||||
<p:commandButton value="Réinitialiser progression"
|
||||
styleClass="p-button-text p-button-sm w-full mt-2"
|
||||
icon="pi pi-refresh" />
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Tout marquer comme lu" />
|
||||
<ui:param name="icon" value="pi pi-check-square" />
|
||||
<ui:param name="outlined" value="false" />
|
||||
<ui:param name="styleClass" value="ui-button-text ui-button-sm w-full" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Réinitialiser progression" />
|
||||
<ui:param name="icon" value="pi pi-refresh" />
|
||||
<ui:param name="outlined" value="false" />
|
||||
<ui:param name="styleClass" value="ui-button-text ui-button-sm w-full mt-2" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</div>
|
||||
</h:form>
|
||||
@@ -171,15 +181,27 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex gap-2">
|
||||
<p:commandButton icon="pi pi-bookmark"
|
||||
styleClass="p-button-rounded p-button-outlined p-button-sm"
|
||||
title="Marquer comme favori" />
|
||||
<p:commandButton icon="pi pi-share-alt"
|
||||
styleClass="p-button-rounded p-button-outlined p-button-sm"
|
||||
title="Partager" />
|
||||
<p:commandButton icon="pi pi-print"
|
||||
styleClass="p-button-rounded p-button-outlined p-button-sm"
|
||||
title="Imprimer" />
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-bookmark" />
|
||||
<ui:param name="title" value="Marquer comme favori" />
|
||||
<ui:param name="rounded" value="true" />
|
||||
<ui:param name="text" value="false" />
|
||||
<ui:param name="styleClass" value="ui-button-outlined ui-button-sm" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-share-alt" />
|
||||
<ui:param name="title" value="Partager" />
|
||||
<ui:param name="rounded" value="true" />
|
||||
<ui:param name="text" value="false" />
|
||||
<ui:param name="styleClass" value="ui-button-outlined ui-button-sm" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-print" />
|
||||
<ui:param name="title" value="Imprimer" />
|
||||
<ui:param name="rounded" value="true" />
|
||||
<ui:param name="text" value="false" />
|
||||
<ui:param name="styleClass" value="ui-button-outlined ui-button-sm" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -325,31 +347,37 @@
|
||||
|
||||
<!-- Navigation entre sections -->
|
||||
<div class="flex justify-content-between align-items-center mt-6 pt-4 border-top-1 border-200">
|
||||
<p:commandButton value="Section précédente"
|
||||
icon="pi pi-angle-left"
|
||||
styleClass="p-button-outlined"
|
||||
rendered="#{guideBean.APrecedent}"
|
||||
action="#{guideBean.sectionPrecedente}" />
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Section précédente" />
|
||||
<ui:param name="icon" value="pi pi-angle-left" />
|
||||
<ui:param name="action" value="#{guideBean.sectionPrecedente}" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="rendered" value="#{guideBean.APrecedent}" />
|
||||
</ui:include>
|
||||
|
||||
<div class="flex gap-2" rendered="#{guideBean.sectionCourante.id != 'default'}">
|
||||
<p:commandButton value="Marquer comme lu"
|
||||
icon="pi pi-check"
|
||||
styleClass="p-button-success"
|
||||
rendered="#{not guideBean.sectionCourante.lu}"
|
||||
action="#{guideBean.marquerCommeLu}" />
|
||||
<p:commandButton value="Lu"
|
||||
icon="pi pi-check"
|
||||
styleClass="p-button-outlined"
|
||||
rendered="#{guideBean.sectionCourante.lu}"
|
||||
disabled="true" />
|
||||
<ui:include src="/templates/components/button-success.xhtml">
|
||||
<ui:param name="value" value="Marquer comme lu" />
|
||||
<ui:param name="icon" value="pi pi-check" />
|
||||
<ui:param name="action" value="#{guideBean.marquerCommeLu}" />
|
||||
<ui:param name="rendered" value="#{not guideBean.sectionCourante.lu}" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Lu" />
|
||||
<ui:param name="icon" value="pi pi-check" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="disabled" value="true" />
|
||||
<ui:param name="rendered" value="#{guideBean.sectionCourante.lu}" />
|
||||
</ui:include>
|
||||
</div>
|
||||
|
||||
<p:commandButton value="Section suivante"
|
||||
icon="pi pi-angle-right"
|
||||
iconPos="right"
|
||||
styleClass="p-button-outlined"
|
||||
rendered="#{guideBean.ASuivant}"
|
||||
action="#{guideBean.sectionSuivante}" />
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Section suivante" />
|
||||
<ui:param name="icon" value="pi pi-angle-right" />
|
||||
<ui:param name="action" value="#{guideBean.sectionSuivante}" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="rendered" value="#{guideBean.ASuivant}" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -376,7 +404,7 @@
|
||||
</p:inputText>
|
||||
</div>
|
||||
|
||||
<div id="resultatsRecherche">
|
||||
<h:panelGroup id="resultatsRecherche" layout="block">
|
||||
<ui:repeat value="#{guideBean.resultatsRecherche}" var="resultat" rendered="#{not empty guideBean.termeRecherche}">
|
||||
<div class="surface-100 border-round p-3 mb-3 cursor-pointer hover:surface-200 transition-duration-200"
|
||||
onclick="#{guideBean.naviguerVers(resultat.id)}; PF('rechercheDialog').hide();">
|
||||
@@ -395,7 +423,7 @@
|
||||
<i class="pi pi-search text-3xl text-300 mb-2"></i>
|
||||
<p class="text-600">Aucun résultat trouvé pour "#{guideBean.termeRecherche}"</p>
|
||||
</div>
|
||||
</div>
|
||||
</h:panelGroup>
|
||||
</div>
|
||||
</h:form>
|
||||
</p:dialog>
|
||||
|
||||
@@ -26,18 +26,27 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-3 lg:mt-0">
|
||||
<p:commandButton value="Rapport mensuel" icon="pi pi-download"
|
||||
styleClass="ui-button-outlined ui-button-success mr-2"
|
||||
action="#{dashboardBean.generateRapport}"/>
|
||||
<p:commandButton value="Aide" icon="pi pi-question-circle"
|
||||
styleClass="ui-button-outlined ui-button-help"/>
|
||||
<ui:include src="/templates/components/button-success.xhtml">
|
||||
<ui:param name="value" value="Rapport mensuel" />
|
||||
<ui:param name="icon" value="pi pi-download" />
|
||||
<ui:param name="action" value="#{dashboardBean.generateRapport}" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="styleClass" value="mr-2" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Aide" />
|
||||
<ui:param name="icon" value="pi pi-question-circle" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="styleClass" value="ui-button-help" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Alertes URGENTES - En premier pour l'attention immédiate -->
|
||||
<div class="col-12" rendered="#{dashboardBean.hasAlerts}">
|
||||
<ui:fragment rendered="#{dashboardBean.hasAlerts}">
|
||||
<div class="col-12">
|
||||
<div class="card surface-50 border-round">
|
||||
<h5 class="text-900 font-bold mb-3">
|
||||
<i class="pi pi-exclamation-circle text-orange-500 mr-2"></i>
|
||||
@@ -110,6 +119,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ui:fragment>
|
||||
|
||||
<!-- KPIs principaux - Ordre psychologique optimal -->
|
||||
<div class="col-12">
|
||||
@@ -359,11 +369,11 @@
|
||||
|
||||
<!-- Journal d'activités et Tâches prioritaires -->
|
||||
<div class="col-12 lg:col-8">
|
||||
<div class="card">
|
||||
<div class="flex align-items-center justify-content-between mb-4">
|
||||
<h5>Journal d'activités</h5>
|
||||
<div>
|
||||
<h:form>
|
||||
<h:form>
|
||||
<div class="card">
|
||||
<div class="flex align-items-center justify-content-between mb-4">
|
||||
<h5>Journal d'activités</h5>
|
||||
<div>
|
||||
<p:selectOneMenu value="#{dashboardBean.filtreActivite}">
|
||||
<f:selectItem itemLabel="Toutes" itemValue="ALL" />
|
||||
<f:selectItem itemLabel="Cotisations" itemValue="COTISATION" />
|
||||
@@ -372,83 +382,105 @@
|
||||
<f:selectItem itemLabel="Événements" itemValue="EVENEMENT" />
|
||||
<p:ajax update="activitiesTable" />
|
||||
</p:selectOneMenu>
|
||||
</h:form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p:dataTable id="activitiesTable" value="#{dashboardBean.recentActivities}" var="activity"
|
||||
rows="8" paginator="true" paginatorPosition="bottom">
|
||||
<p:column headerText="Date" style="width:120px">
|
||||
<div class="flex flex-column">
|
||||
<span class="text-900 font-medium">
|
||||
<h:outputText value="#{activity.date}">
|
||||
<f:convertDateTime pattern="dd/MM HH:mm" type="localDateTime"/>
|
||||
</h:outputText>
|
||||
</span>
|
||||
<small class="text-500">
|
||||
<h:outputText value="#{activity.date}">
|
||||
<f:convertDateTime pattern="yyyy" type="localDateTime"/>
|
||||
</h:outputText>
|
||||
</small>
|
||||
</div>
|
||||
</p:column>
|
||||
<p:column headerText="Activité" style="width:100px">
|
||||
<p:tag value="#{activity.type}" severity="#{activity.severity}"
|
||||
icon="#{activity.icon}" styleClass="mr-2"/>
|
||||
</p:column>
|
||||
<p:column headerText="Description">
|
||||
<div>
|
||||
<div class="text-900 font-medium">#{activity.titre}</div>
|
||||
<div class="text-600 mt-1">#{activity.description}</div>
|
||||
<div class="mt-2" rendered="#{activity.montant != null}">
|
||||
<span class="text-green-600 font-medium">#{activity.montant} FCFA</span>
|
||||
<p:dataTable id="activitiesTable" value="#{dashboardBean.recentActivities}" var="activity"
|
||||
rows="8" paginator="true" paginatorPosition="bottom">
|
||||
<p:column headerText="Date" style="width:120px">
|
||||
<div class="flex flex-column">
|
||||
<span class="text-900 font-medium">
|
||||
<h:outputText value="#{activity.date}">
|
||||
<f:convertDateTime pattern="dd/MM HH:mm" type="localDateTime"/>
|
||||
</h:outputText>
|
||||
</span>
|
||||
<small class="text-500">
|
||||
<h:outputText value="#{activity.date}">
|
||||
<f:convertDateTime pattern="yyyy" type="localDateTime"/>
|
||||
</h:outputText>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</p:column>
|
||||
<p:column headerText="Acteur" style="width:150px">
|
||||
<div class="flex align-items-center">
|
||||
<p:graphicImage name="images/avatar/profile.jpg" library="demo"
|
||||
styleClass="w-2rem h-2rem border-circle mr-2"/>
|
||||
</p:column>
|
||||
<p:column headerText="Activité" style="width:100px">
|
||||
<p:tag value="#{activity.type}" severity="#{activity.severity}"
|
||||
icon="#{activity.icon}" styleClass="mr-2"/>
|
||||
</p:column>
|
||||
<p:column headerText="Description">
|
||||
<div>
|
||||
<div class="text-900 font-medium">#{activity.userNom}</div>
|
||||
<small class="text-500">#{activity.userRole}</small>
|
||||
<div class="text-900 font-medium">#{activity.titre}</div>
|
||||
<div class="text-600 mt-1">#{activity.description}</div>
|
||||
<ui:fragment rendered="#{activity.montant != null}">
|
||||
<div class="mt-2">
|
||||
<span class="text-green-600 font-medium">#{activity.montant} FCFA</span>
|
||||
</div>
|
||||
</ui:fragment>
|
||||
</div>
|
||||
</div>
|
||||
</p:column>
|
||||
<p:column headerText="Action" style="width:80px">
|
||||
<p:commandButton icon="pi pi-eye" styleClass="ui-button-rounded ui-button-text"
|
||||
title="Voir détails"/>
|
||||
</p:column>
|
||||
</p:dataTable>
|
||||
</div>
|
||||
</p:column>
|
||||
<p:column headerText="Acteur" style="width:150px">
|
||||
<div class="flex align-items-center">
|
||||
<p:graphicImage name="images/avatar/profile.jpg" library="demo"
|
||||
styleClass="w-2rem h-2rem border-circle mr-2"/>
|
||||
<div>
|
||||
<div class="text-900 font-medium">#{activity.userNom}</div>
|
||||
<small class="text-500">#{activity.userRole}</small>
|
||||
</div>
|
||||
</div>
|
||||
</p:column>
|
||||
<p:column headerText="Action" style="width:80px">
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-eye" />
|
||||
<ui:param name="title" value="Voir détails" />
|
||||
</ui:include>
|
||||
</p:column>
|
||||
</p:dataTable>
|
||||
</div>
|
||||
</h:form>
|
||||
</div>
|
||||
|
||||
<!-- Actions rapides et Tâches -->
|
||||
<div class="col-12 lg:col-4">
|
||||
<div class="card mb-4">
|
||||
<h5>Actions rapides</h5>
|
||||
<div class="grid">
|
||||
<div class="col-6">
|
||||
<p:commandButton value="Nouveau membre" icon="pi pi-user-plus"
|
||||
styleClass="ui-button-outlined w-full mb-2"
|
||||
action="#{dashboardBean.redirectToNewMember}"/>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<p:commandButton value="Collecter" icon="pi pi-wallet"
|
||||
styleClass="ui-button-success ui-button-outlined w-full mb-2"
|
||||
action="#{dashboardBean.redirectToCotisation}"/>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<p:commandButton value="Événement" icon="pi pi-calendar-plus"
|
||||
styleClass="ui-button-info ui-button-outlined w-full mb-2"
|
||||
action="#{dashboardBean.redirectToEvenement}"/>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<p:commandButton value="Rapport" icon="pi pi-chart-bar"
|
||||
styleClass="ui-button-warning ui-button-outlined w-full mb-2"
|
||||
action="#{dashboardBean.generateRapport}"/>
|
||||
<h:form>
|
||||
<div class="card mb-4">
|
||||
<h5>Actions rapides</h5>
|
||||
<div class="grid">
|
||||
<div class="col-6">
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Nouveau membre" />
|
||||
<ui:param name="icon" value="pi pi-user-plus" />
|
||||
<ui:param name="action" value="#{dashboardBean.redirectToNewMember}" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="styleClass" value="w-full mb-2" />
|
||||
</ui:include>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<ui:include src="/templates/components/button-success.xhtml">
|
||||
<ui:param name="value" value="Collecter" />
|
||||
<ui:param name="icon" value="pi pi-wallet" />
|
||||
<ui:param name="action" value="#{dashboardBean.redirectToCotisation}" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="styleClass" value="w-full mb-2" />
|
||||
</ui:include>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<ui:include src="/templates/components/button-info.xhtml">
|
||||
<ui:param name="value" value="Événement" />
|
||||
<ui:param name="icon" value="pi pi-calendar-plus" />
|
||||
<ui:param name="action" value="#{dashboardBean.redirectToEvenement}" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="styleClass" value="w-full mb-2" />
|
||||
</ui:include>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<ui:include src="/templates/components/button-warning.xhtml">
|
||||
<ui:param name="value" value="Rapport" />
|
||||
<ui:param name="icon" value="pi pi-chart-bar" />
|
||||
<ui:param name="action" value="#{dashboardBean.generateRapport}" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="styleClass" value="w-full mb-2" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</h:form>
|
||||
|
||||
<div class="card">
|
||||
<h5>Tâches prioritaires</h5>
|
||||
@@ -459,9 +491,11 @@
|
||||
<div class="text-900 font-medium">Valider #{dashboardBean.adhesionsPendantes} adhésions</div>
|
||||
<small class="text-600">Demandes en attente de validation</small>
|
||||
</div>
|
||||
<p:commandButton icon="pi pi-arrow-right"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-info"
|
||||
action="#{dashboardBean.redirectToAdhesionValidation}"/>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-arrow-right" />
|
||||
<ui:param name="action" value="#{dashboardBean.redirectToAdhesionValidation}" />
|
||||
<ui:param name="severity" value="info" />
|
||||
</ui:include>
|
||||
</div>
|
||||
|
||||
<div class="flex align-items-center p-3 border-round bg-orange-50 border-orange-200">
|
||||
@@ -470,9 +504,11 @@
|
||||
<div class="text-900 font-medium">Relancer #{dashboardBean.cotisationsRetard} cotisations</div>
|
||||
<small class="text-600">Paiements en retard</small>
|
||||
</div>
|
||||
<p:commandButton icon="pi pi-arrow-right"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-warning"
|
||||
action="#{dashboardBean.redirectToRelances}"/>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-arrow-right" />
|
||||
<ui:param name="action" value="#{dashboardBean.redirectToRelances}" />
|
||||
<ui:param name="severity" value="warning" />
|
||||
</ui:include>
|
||||
</div>
|
||||
|
||||
<div class="flex align-items-center p-3 border-round bg-green-50 border-green-200">
|
||||
@@ -481,9 +517,11 @@
|
||||
<div class="text-900 font-medium">Traiter #{dashboardBean.aidesEnAttente} aides</div>
|
||||
<small class="text-600">Demandes d'aide à examiner</small>
|
||||
</div>
|
||||
<p:commandButton icon="pi pi-arrow-right"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-success"
|
||||
action="#{dashboardBean.redirectToAidesTraitement}"/>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-arrow-right" />
|
||||
<ui:param name="action" value="#{dashboardBean.redirectToAidesTraitement}" />
|
||||
<ui:param name="severity" value="success" />
|
||||
</ui:include>
|
||||
</div>
|
||||
|
||||
<div class="flex align-items-center p-3 border-round bg-purple-50 border-purple-200">
|
||||
@@ -492,9 +530,11 @@
|
||||
<div class="text-900 font-medium">Organiser prochains événements</div>
|
||||
<small class="text-600">#{dashboardBean.evenementsAPlanifier} événements à planifier</small>
|
||||
</div>
|
||||
<p:commandButton icon="pi pi-arrow-right"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-help"
|
||||
action="#{dashboardBean.redirectToEvenementPlanning}"/>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-arrow-right" />
|
||||
<ui:param name="action" value="#{dashboardBean.redirectToEvenementPlanning}" />
|
||||
<ui:param name="styleClass" value="ui-button-help" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -511,9 +551,13 @@
|
||||
yearNavigator="true" yearRange="2020:2030">
|
||||
<p:ajax update="financialSummary" listener="#{dashboardBean.onMoisChange}"/>
|
||||
</p:calendar>
|
||||
<p:commandButton value="Exporter" icon="pi pi-download"
|
||||
styleClass="ui-button-outlined ui-button-sm"
|
||||
action="#{dashboardBean.exportFinancialReport}"/>
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Exporter" />
|
||||
<ui:param name="icon" value="pi pi-download" />
|
||||
<ui:param name="action" value="#{dashboardBean.exportFinancialReport}" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="styleClass" value="ui-button-sm" />
|
||||
</ui:include>
|
||||
</h:form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -177,11 +177,14 @@
|
||||
<i class="pi pi-file text-blue-500 mr-2"></i>
|
||||
<span class="text-900">#{document}</span>
|
||||
</div>
|
||||
<p:commandButton icon="pi pi-times"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-danger ui-button-sm"
|
||||
action="#{membreInscriptionBean.supprimerDocument(document)}"
|
||||
update="documentsListPanel"
|
||||
title="Supprimer le fichier" />
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-times" />
|
||||
<ui:param name="action" value="#{membreInscriptionBean.supprimerDocument(document)}" />
|
||||
<ui:param name="update" value="documentsListPanel" />
|
||||
<ui:param name="title" value="Supprimer le fichier" />
|
||||
<ui:param name="severity" value="danger" />
|
||||
<ui:param name="styleClass" value="ui-button-sm" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</ui:repeat>
|
||||
</h:panelGroup>
|
||||
@@ -242,8 +245,13 @@
|
||||
<p:outputLabel for="numeroParrain" value="N° Membre parrain" />
|
||||
<div class="ui-inputgroup">
|
||||
<p:inputText id="numeroParrain" value="#{membreInscriptionBean.numeroParrain}" />
|
||||
<p:commandButton icon="pi pi-search" styleClass="ui-button-info"
|
||||
action="#{membreInscriptionBean.rechercherParrain}" />
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-search" />
|
||||
<ui:param name="action" value="#{membreInscriptionBean.rechercherParrain}" />
|
||||
<ui:param name="severity" value="info" />
|
||||
<ui:param name="rounded" value="false" />
|
||||
<ui:param name="text" value="false" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
@@ -358,28 +366,37 @@
|
||||
</div>
|
||||
|
||||
<div class="flex flex-wrap gap-2">
|
||||
<p:commandButton value="🎯 Inscrire le membre" icon="pi pi-user-plus"
|
||||
styleClass="ui-button ui-button-success"
|
||||
onclick="return preparePhotoForSubmission(this);"
|
||||
action="#{membreInscriptionBean.inscrire}"
|
||||
update="messages"
|
||||
disabled="#{!membreInscriptionBean.formulaireValide}" />
|
||||
|
||||
<p:commandButton value="💾 Enregistrer brouillon" icon="pi pi-save"
|
||||
styleClass="ui-button ui-button-outlined ui-button-info"
|
||||
action="#{membreInscriptionBean.enregistrerBrouillon}"
|
||||
update="messages" />
|
||||
|
||||
<p:commandButton value="🔄 Réinitialiser" icon="pi pi-refresh"
|
||||
styleClass="ui-button ui-button-outlined ui-button-warning"
|
||||
type="reset"
|
||||
onclick="removePhoto(); return confirm('Êtes-vous sûr de vouloir réinitialiser le formulaire ?');" />
|
||||
|
||||
<p:commandButton value="❌ Annuler" icon="pi pi-times"
|
||||
styleClass="ui-button ui-button-outlined ui-button-secondary"
|
||||
action="#{membreInscriptionBean.annuler}"
|
||||
immediate="true"
|
||||
onclick="return confirm('Êtes-vous sûr de vouloir annuler l\'inscription ?');" />
|
||||
<ui:include src="/templates/components/button-success.xhtml">
|
||||
<ui:param name="value" value="🎯 Inscrire le membre" />
|
||||
<ui:param name="icon" value="pi pi-user-plus" />
|
||||
<ui:param name="onclick" value="return preparePhotoForSubmission(this);" />
|
||||
<ui:param name="action" value="#{membreInscriptionBean.inscrire}" />
|
||||
<ui:param name="update" value="messages" />
|
||||
<ui:param name="disabled" value="#{!membreInscriptionBean.formulaireValide}" />
|
||||
</ui:include>
|
||||
|
||||
<ui:include src="/templates/components/button-info.xhtml">
|
||||
<ui:param name="value" value="💾 Enregistrer brouillon" />
|
||||
<ui:param name="icon" value="pi pi-save" />
|
||||
<ui:param name="action" value="#{membreInscriptionBean.enregistrerBrouillon}" />
|
||||
<ui:param name="update" value="messages" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
</ui:include>
|
||||
|
||||
<ui:include src="/templates/components/button-warning.xhtml">
|
||||
<ui:param name="value" value="🔄 Réinitialiser" />
|
||||
<ui:param name="icon" value="pi pi-refresh" />
|
||||
<ui:param name="onclick" value="removePhoto(); return confirm('Êtes-vous sûr de vouloir réinitialiser le formulaire ?');" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
</ui:include>
|
||||
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="❌ Annuler" />
|
||||
<ui:param name="icon" value="pi pi-times" />
|
||||
<ui:param name="action" value="#{membreInscriptionBean.annuler}" />
|
||||
<ui:param name="onclick" value="return confirm('Êtes-vous sûr de vouloir annuler l\'inscription ?');" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
</ui:include>
|
||||
</div>
|
||||
|
||||
<div class="mt-4 text-600">
|
||||
|
||||
@@ -23,14 +23,17 @@
|
||||
</div>
|
||||
<h:form id="formActionsMembres">
|
||||
<div class="flex gap-2">
|
||||
<p:commandButton value="Nouveau membre"
|
||||
icon="pi pi-user-plus"
|
||||
styleClass="ui-button-success"
|
||||
action="/pages/secure/membre/inscription?faces-redirect=true" />
|
||||
<p:commandButton value="Import/Export"
|
||||
icon="pi pi-upload"
|
||||
styleClass="ui-button-outlined ui-button-secondary"
|
||||
onclick="PF('dlgImportExport').show();" />
|
||||
<ui:include src="/templates/components/button-success.xhtml">
|
||||
<ui:param name="value" value="Nouveau membre" />
|
||||
<ui:param name="icon" value="pi pi-user-plus" />
|
||||
<ui:param name="action" value="/pages/secure/membre/inscription?faces-redirect=true" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Import/Export" />
|
||||
<ui:param name="icon" value="pi pi-upload" />
|
||||
<ui:param name="onclick" value="PF('dlgImportExport').show();" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</h:form>
|
||||
</div>
|
||||
@@ -94,15 +97,22 @@
|
||||
</p:toolbarGroup>
|
||||
|
||||
<p:toolbarGroup align="right">
|
||||
<p:commandButton value="Filtres avancés"
|
||||
icon="pi pi-filter"
|
||||
styleClass="ui-button-outlined ui-button-secondary mr-2"
|
||||
onclick="PF('dlgFiltresAvances').show();" />
|
||||
<p:commandButton icon="pi pi-refresh"
|
||||
styleClass="ui-button-outlined ui-button-secondary"
|
||||
action="#{membreListeBean.actualiser}"
|
||||
update="@form"
|
||||
title="Actualiser" />
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Filtres avancés" />
|
||||
<ui:param name="icon" value="pi pi-filter" />
|
||||
<ui:param name="onclick" value="PF('dlgFiltresAvances').show();" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="styleClass" value="mr-2" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-refresh" />
|
||||
<ui:param name="action" value="#{membreListeBean.actualiser}" />
|
||||
<ui:param name="update" value="@form" />
|
||||
<ui:param name="title" value="Actualiser" />
|
||||
<ui:param name="rounded" value="false" />
|
||||
<ui:param name="text" value="false" />
|
||||
<ui:param name="styleClass" value="ui-button-outlined ui-button-secondary" />
|
||||
</ui:include>
|
||||
</p:toolbarGroup>
|
||||
</p:toolbar>
|
||||
|
||||
@@ -188,33 +198,45 @@
|
||||
|
||||
<p:column headerText="Actions" style="width:200px">
|
||||
<div class="flex gap-1">
|
||||
<p:commandButton icon="pi pi-eye"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-info"
|
||||
action="#{membreListeBean.voirProfil(membre)}"
|
||||
title="Voir profil" />
|
||||
<p:commandButton icon="pi pi-pencil"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-warning"
|
||||
action="#{membreListeBean.modifierMembre(membre)}"
|
||||
title="Modifier" />
|
||||
<p:commandButton icon="pi pi-dollar"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-success"
|
||||
action="#{membreListeBean.gererCotisations(membre)}"
|
||||
title="Cotisations" />
|
||||
<p:commandButton icon="pi pi-envelope"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-secondary"
|
||||
action="#{membreListeBean.contacterMembre(membre)}"
|
||||
title="Contacter" />
|
||||
<p:commandButton icon="pi pi-ban"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-danger"
|
||||
action="#{membreListeBean.suspendreMembre(membre)}"
|
||||
onclick="return confirm('Êtes-vous sûr de vouloir suspendre ce membre ?');"
|
||||
title="Suspendre"
|
||||
rendered="#{membre.statut == 'ACTIF'}" />
|
||||
<p:commandButton icon="pi pi-check"
|
||||
styleClass="ui-button-rounded ui-button-text ui-button-success"
|
||||
action="#{membreListeBean.reactiverMembre(membre)}"
|
||||
title="Réactiver"
|
||||
rendered="#{membre.statut == 'SUSPENDU'}" />
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-eye" />
|
||||
<ui:param name="action" value="#{membreListeBean.voirProfil(membre)}" />
|
||||
<ui:param name="title" value="Voir profil" />
|
||||
<ui:param name="severity" value="info" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-pencil" />
|
||||
<ui:param name="action" value="#{membreListeBean.modifierMembre(membre)}" />
|
||||
<ui:param name="title" value="Modifier" />
|
||||
<ui:param name="severity" value="warning" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-dollar" />
|
||||
<ui:param name="action" value="#{membreListeBean.gererCotisations(membre)}" />
|
||||
<ui:param name="title" value="Cotisations" />
|
||||
<ui:param name="severity" value="success" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-envelope" />
|
||||
<ui:param name="action" value="#{membreListeBean.contacterMembre(membre)}" />
|
||||
<ui:param name="title" value="Contacter" />
|
||||
<ui:param name="severity" value="" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-ban" />
|
||||
<ui:param name="action" value="#{membreListeBean.suspendreMembre(membre)}" />
|
||||
<ui:param name="onclick" value="return confirm('Êtes-vous sûr de vouloir suspendre ce membre ?');" />
|
||||
<ui:param name="title" value="Suspendre" />
|
||||
<ui:param name="severity" value="danger" />
|
||||
<ui:param name="rendered" value="#{membre.statut == 'ACTIF'}" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-check" />
|
||||
<ui:param name="action" value="#{membreListeBean.reactiverMembre(membre)}" />
|
||||
<ui:param name="title" value="Réactiver" />
|
||||
<ui:param name="severity" value="success" />
|
||||
<ui:param name="rendered" value="#{membre.statut == 'SUSPENDU'}" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</p:column>
|
||||
</p:dataTable>
|
||||
@@ -228,29 +250,35 @@
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex gap-2">
|
||||
<p:commandButton value="Envoyer message"
|
||||
icon="pi pi-envelope"
|
||||
styleClass="ui-button-outlined ui-button-info"
|
||||
onclick="PF('dlgMessageGroupe').show();"
|
||||
disabled="#{empty membreListeBean.selectedMembres}" />
|
||||
<p:commandButton value="Rappel cotisations"
|
||||
icon="pi pi-bell"
|
||||
styleClass="ui-button-outlined ui-button-warning"
|
||||
action="#{membreListeBean.rappelCotisationsGroupe}"
|
||||
update="@form"
|
||||
process="@form"
|
||||
disabled="#{empty membreListeBean.selectedMembres}" />
|
||||
<p:commandButton value="Exporter sélection"
|
||||
icon="pi pi-file-excel"
|
||||
styleClass="ui-button-outlined ui-button-success"
|
||||
action="#{membreListeBean.exporterSelection}"
|
||||
process="@form"
|
||||
disabled="#{empty membreListeBean.selectedMembres}" />
|
||||
<p:commandButton value="Modifier en lot"
|
||||
icon="pi pi-pencil"
|
||||
styleClass="ui-button-outlined ui-button-secondary"
|
||||
onclick="PF('dlgModificationLot').show();"
|
||||
disabled="#{empty membreListeBean.selectedMembres}" />
|
||||
<ui:include src="/templates/components/button-info.xhtml">
|
||||
<ui:param name="value" value="Envoyer message" />
|
||||
<ui:param name="icon" value="pi pi-envelope" />
|
||||
<ui:param name="onclick" value="PF('dlgMessageGroupe').show();" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="disabled" value="#{empty membreListeBean.selectedMembres}" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-warning.xhtml">
|
||||
<ui:param name="value" value="Rappel cotisations" />
|
||||
<ui:param name="icon" value="pi pi-bell" />
|
||||
<ui:param name="action" value="#{membreListeBean.rappelCotisationsGroupe}" />
|
||||
<ui:param name="update" value="@form" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="disabled" value="#{empty membreListeBean.selectedMembres}" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-success.xhtml">
|
||||
<ui:param name="value" value="Exporter sélection" />
|
||||
<ui:param name="icon" value="pi pi-file-excel" />
|
||||
<ui:param name="action" value="#{membreListeBean.exporterSelection}" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="disabled" value="#{empty membreListeBean.selectedMembres}" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Modifier en lot" />
|
||||
<ui:param name="icon" value="pi pi-pencil" />
|
||||
<ui:param name="onclick" value="PF('dlgModificationLot').show();" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="disabled" value="#{empty membreListeBean.selectedMembres}" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</div>
|
||||
</h:form>
|
||||
@@ -320,18 +348,27 @@
|
||||
</div>
|
||||
|
||||
<div class="flex gap-2 mt-3">
|
||||
<p:commandButton value="Appliquer" icon="pi pi-check"
|
||||
styleClass="ui-button-info"
|
||||
action="#{membreListeBean.appliquerFiltresAvances}"
|
||||
update=":formMembres:dtMembres"
|
||||
oncomplete="PF('dlgFiltresAvances').hide();" />
|
||||
<p:commandButton value="Réinitialiser" icon="pi pi-refresh"
|
||||
styleClass="ui-button-outlined ui-button-secondary"
|
||||
action="#{membreListeBean.reinitialiserFiltres}"
|
||||
update="@form :formMembres:dtMembres" />
|
||||
<p:commandButton value="Annuler" icon="pi pi-times"
|
||||
styleClass="ui-button-outlined ui-button-danger"
|
||||
onclick="PF('dlgFiltresAvances').hide();" type="button" />
|
||||
<ui:include src="/templates/components/button-info.xhtml">
|
||||
<ui:param name="value" value="Appliquer" />
|
||||
<ui:param name="icon" value="pi pi-check" />
|
||||
<ui:param name="action" value="#{membreListeBean.appliquerFiltresAvances}" />
|
||||
<ui:param name="update" value=":formMembres:dtMembres" />
|
||||
<ui:param name="onclick" value="PF('dlgFiltresAvances').hide();" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Réinitialiser" />
|
||||
<ui:param name="icon" value="pi pi-refresh" />
|
||||
<ui:param name="action" value="#{membreListeBean.reinitialiserFiltres}" />
|
||||
<ui:param name="update" value="@form :formMembres:dtMembres" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Annuler" />
|
||||
<ui:param name="icon" value="pi pi-times" />
|
||||
<ui:param name="onclick" value="PF('dlgFiltresAvances').hide();" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="styleClass" value="ui-button-danger" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</h:form>
|
||||
</p:dialog>
|
||||
@@ -370,14 +407,19 @@
|
||||
</div>
|
||||
|
||||
<div class="flex gap-2 mt-3">
|
||||
<p:commandButton value="Envoyer" icon="pi pi-send"
|
||||
styleClass="ui-button-info"
|
||||
action="#{membreListeBean.envoyerMessageGroupe}"
|
||||
update="@form"
|
||||
oncomplete="if(!args.validationFailed) PF('dlgMessageGroupe').hide();" />
|
||||
<p:commandButton value="Annuler" icon="pi pi-times"
|
||||
styleClass="ui-button-secondary"
|
||||
onclick="PF('dlgMessageGroupe').hide();" type="button" />
|
||||
<ui:include src="/templates/components/button-info.xhtml">
|
||||
<ui:param name="value" value="Envoyer" />
|
||||
<ui:param name="icon" value="pi pi-send" />
|
||||
<ui:param name="action" value="#{membreListeBean.envoyerMessageGroupe}" />
|
||||
<ui:param name="update" value="@form" />
|
||||
<ui:param name="onclick" value="if(!args.validationFailed) PF('dlgMessageGroupe').hide();" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Annuler" />
|
||||
<ui:param name="icon" value="pi pi-times" />
|
||||
<ui:param name="onclick" value="PF('dlgMessageGroupe').hide();" />
|
||||
<ui:param name="outlined" value="false" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</h:form>
|
||||
</p:dialog>
|
||||
@@ -408,13 +450,18 @@
|
||||
</div>
|
||||
|
||||
<div class="flex gap-2 mt-3">
|
||||
<p:commandButton value="Importer" icon="pi pi-upload"
|
||||
styleClass="ui-button-success"
|
||||
action="#{membreListeBean.importerMembres}"
|
||||
update="@form :formMembres" />
|
||||
<p:commandButton value="Télécharger modèle" icon="pi pi-download"
|
||||
styleClass="ui-button-outlined ui-button-info"
|
||||
action="#{membreListeBean.telechargerModele}" />
|
||||
<ui:include src="/templates/components/button-success.xhtml">
|
||||
<ui:param name="value" value="Importer" />
|
||||
<ui:param name="icon" value="pi pi-upload" />
|
||||
<ui:param name="action" value="#{membreListeBean.importerMembres}" />
|
||||
<ui:param name="update" value="@form :formMembres" />
|
||||
</ui:include>
|
||||
<ui:include src="/templates/components/button-info.xhtml">
|
||||
<ui:param name="value" value="Télécharger modèle" />
|
||||
<ui:param name="icon" value="pi pi-download" />
|
||||
<ui:param name="action" value="#{membreListeBean.telechargerModele}" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</p:tab>
|
||||
|
||||
@@ -448,17 +495,22 @@
|
||||
</div>
|
||||
|
||||
<div class="flex gap-2 mt-3">
|
||||
<p:commandButton value="Exporter" icon="pi pi-download"
|
||||
styleClass="ui-button-success"
|
||||
action="#{membreListeBean.exporterMembres}" />
|
||||
<ui:include src="/templates/components/button-success.xhtml">
|
||||
<ui:param name="value" value="Exporter" />
|
||||
<ui:param name="icon" value="pi pi-download" />
|
||||
<ui:param name="action" value="#{membreListeBean.exporterMembres}" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</p:tab>
|
||||
</p:tabView>
|
||||
|
||||
<div class="flex justify-content-end mt-3">
|
||||
<p:commandButton value="Fermer" icon="pi pi-times"
|
||||
styleClass="ui-button-secondary"
|
||||
onclick="PF('dlgImportExport').hide();" type="button" />
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Fermer" />
|
||||
<ui:param name="icon" value="pi pi-times" />
|
||||
<ui:param name="onclick" value="PF('dlgImportExport').hide();" />
|
||||
<ui:param name="outlined" value="false" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</h:form>
|
||||
</p:dialog>
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
<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">
|
||||
|
||||
<!--
|
||||
Composant bouton icône seule réutilisable (WOU/DRY)
|
||||
Usage: <ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-icon-name" />
|
||||
<ui:param name="action" value="#{bean.method}" />
|
||||
<ui:param name="update" value="componentId" />
|
||||
<ui:param name="onclick" value="javascript" />
|
||||
<ui:param name="severity" value="info|success|warning|danger" />
|
||||
<ui:param name="rounded" value="true" />
|
||||
<ui:param name="text" value="true" />
|
||||
</ui:include>
|
||||
-->
|
||||
|
||||
<ui:fragment rendered="#{empty rendered or rendered}">
|
||||
<p:commandButton
|
||||
icon="#{icon}"
|
||||
action="#{action}"
|
||||
actionListener="#{actionListener}"
|
||||
update="#{update}"
|
||||
onclick="#{onclick}"
|
||||
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 : ''} #{styleClass}"
|
||||
title="#{title}" />
|
||||
</ui:fragment>
|
||||
</ui:composition>
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<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">
|
||||
|
||||
<!--
|
||||
Composant bouton info réutilisable (WOU/DRY)
|
||||
-->
|
||||
|
||||
<ui:fragment rendered="#{empty rendered or rendered}">
|
||||
<ui:fragment rendered="#{empty outcome}">
|
||||
<p:commandButton
|
||||
value="#{value}"
|
||||
icon="#{icon}"
|
||||
action="#{action}"
|
||||
actionListener="#{actionListener}"
|
||||
update="#{update}"
|
||||
onclick="#{onclick}"
|
||||
disabled="#{not empty disabled and disabled}"
|
||||
styleClass="ui-button-info #{not empty outlined and outlined ? 'ui-button-outlined' : ''} #{styleClass}"
|
||||
title="#{title}" />
|
||||
</ui:fragment>
|
||||
<ui:fragment rendered="#{not empty outcome}">
|
||||
<p:button
|
||||
value="#{value}"
|
||||
icon="#{icon}"
|
||||
outcome="#{outcome}"
|
||||
styleClass="ui-button-info #{not empty outlined and outlined ? 'ui-button-outlined' : ''} #{styleClass}"
|
||||
title="#{title}" />
|
||||
</ui:fragment>
|
||||
</ui:fragment>
|
||||
</ui:composition>
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
<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">
|
||||
|
||||
<!--
|
||||
Composant bouton primaire réutilisable (WOU/DRY)
|
||||
Usage: <ui:include src="/templates/components/button-primary.xhtml">
|
||||
<ui:param name="value" value="Texte du bouton" />
|
||||
<ui:param name="icon" value="pi pi-icon-name" />
|
||||
<ui:param name="action" value="#{bean.method}" />
|
||||
<ui:param name="outcome" value="/page" />
|
||||
<ui:param name="update" value="componentId" />
|
||||
<ui:param name="onclick" value="javascript" />
|
||||
<ui:param name="disabled" value="false" />
|
||||
<ui:param name="styleClass" value="" />
|
||||
</ui:include>
|
||||
-->
|
||||
|
||||
<ui:fragment rendered="#{empty rendered or rendered}">
|
||||
<ui:fragment rendered="#{empty outcome}">
|
||||
<p:commandButton
|
||||
value="#{value}"
|
||||
icon="#{icon}"
|
||||
action="#{action}"
|
||||
actionListener="#{actionListener}"
|
||||
update="#{update}"
|
||||
onclick="#{onclick}"
|
||||
disabled="#{not empty disabled and disabled}"
|
||||
styleClass="ui-button-primary #{styleClass}"
|
||||
title="#{title}" />
|
||||
</ui:fragment>
|
||||
<ui:fragment rendered="#{not empty outcome}">
|
||||
<p:button
|
||||
value="#{value}"
|
||||
icon="#{icon}"
|
||||
outcome="#{outcome}"
|
||||
styleClass="ui-button-primary #{styleClass}"
|
||||
title="#{title}" />
|
||||
</ui:fragment>
|
||||
</ui:fragment>
|
||||
</ui:composition>
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
<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">
|
||||
|
||||
<!--
|
||||
Composant bouton secondaire réutilisable (WOU/DRY)
|
||||
Usage: <ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="Texte du bouton" />
|
||||
<ui:param name="icon" value="pi pi-icon-name" />
|
||||
<ui:param name="action" value="#{bean.method}" />
|
||||
<ui:param name="outcome" value="/page" />
|
||||
<ui:param name="update" value="componentId" />
|
||||
<ui:param name="onclick" value="javascript" />
|
||||
<ui:param name="disabled" value="false" />
|
||||
<ui:param name="outlined" value="true" />
|
||||
<ui:param name="styleClass" value="" />
|
||||
</ui:include>
|
||||
-->
|
||||
|
||||
<ui:fragment rendered="#{empty rendered or rendered}">
|
||||
<ui:fragment rendered="#{empty outcome}">
|
||||
<p:commandButton
|
||||
value="#{value}"
|
||||
icon="#{icon}"
|
||||
action="#{action}"
|
||||
actionListener="#{actionListener}"
|
||||
update="#{update}"
|
||||
onclick="#{onclick}"
|
||||
disabled="#{not empty disabled and disabled}"
|
||||
styleClass="ui-button-secondary #{not empty outlined and outlined ? 'ui-button-outlined' : ''} #{styleClass}"
|
||||
title="#{title}" />
|
||||
</ui:fragment>
|
||||
<ui:fragment rendered="#{not empty outcome}">
|
||||
<p:button
|
||||
value="#{value}"
|
||||
icon="#{icon}"
|
||||
outcome="#{outcome}"
|
||||
styleClass="ui-button-secondary #{not empty outlined and outlined ? 'ui-button-outlined' : ''} #{styleClass}"
|
||||
title="#{title}" />
|
||||
</ui:fragment>
|
||||
</ui:fragment>
|
||||
</ui:composition>
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<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">
|
||||
|
||||
<!--
|
||||
Composant bouton succès réutilisable (WOU/DRY)
|
||||
-->
|
||||
|
||||
<ui:fragment rendered="#{empty rendered or rendered}">
|
||||
<ui:fragment rendered="#{empty outcome}">
|
||||
<p:commandButton
|
||||
value="#{value}"
|
||||
icon="#{icon}"
|
||||
action="#{action}"
|
||||
actionListener="#{actionListener}"
|
||||
update="#{update}"
|
||||
onclick="#{onclick}"
|
||||
disabled="#{not empty disabled and disabled}"
|
||||
styleClass="ui-button-success #{not empty outlined and outlined ? 'ui-button-outlined' : ''} #{styleClass}"
|
||||
title="#{title}" />
|
||||
</ui:fragment>
|
||||
<ui:fragment rendered="#{not empty outcome}">
|
||||
<p:button
|
||||
value="#{value}"
|
||||
icon="#{icon}"
|
||||
outcome="#{outcome}"
|
||||
styleClass="ui-button-success #{not empty outlined and outlined ? 'ui-button-outlined' : ''} #{styleClass}"
|
||||
title="#{title}" />
|
||||
</ui:fragment>
|
||||
</ui:fragment>
|
||||
</ui:composition>
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<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">
|
||||
|
||||
<!--
|
||||
Composant bouton warning réutilisable (WOU/DRY)
|
||||
-->
|
||||
|
||||
<ui:fragment rendered="#{empty rendered or rendered}">
|
||||
<ui:fragment rendered="#{empty outcome}">
|
||||
<p:commandButton
|
||||
value="#{value}"
|
||||
icon="#{icon}"
|
||||
action="#{action}"
|
||||
actionListener="#{actionListener}"
|
||||
update="#{update}"
|
||||
onclick="#{onclick}"
|
||||
disabled="#{not empty disabled and disabled}"
|
||||
styleClass="ui-button-warning #{not empty outlined and outlined ? 'ui-button-outlined' : ''} #{styleClass}"
|
||||
title="#{title}" />
|
||||
</ui:fragment>
|
||||
<ui:fragment rendered="#{not empty outcome}">
|
||||
<p:button
|
||||
value="#{value}"
|
||||
icon="#{icon}"
|
||||
outcome="#{outcome}"
|
||||
styleClass="ui-button-warning #{not empty outlined and outlined ? 'ui-button-outlined' : ''} #{styleClass}"
|
||||
title="#{title}" />
|
||||
</ui:fragment>
|
||||
</ui:fragment>
|
||||
</ui:composition>
|
||||
|
||||
@@ -41,7 +41,10 @@
|
||||
<h:form>
|
||||
<div class="newsletter-input">
|
||||
<p:inputText placeholder="adresse email" />
|
||||
<p:commandButton value="S'abonner" styleClass="ui-button-secondary "/>
|
||||
<ui:include src="/templates/components/button-secondary.xhtml">
|
||||
<ui:param name="value" value="S'abonner" />
|
||||
<ui:param name="outlined" value="false" />
|
||||
</ui:include>
|
||||
</div>
|
||||
</h:form>
|
||||
</div>
|
||||
|
||||
@@ -22,7 +22,12 @@
|
||||
<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" />
|
||||
<ui:include src="/templates/components/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-plus" />
|
||||
<ui:param name="rounded" value="true" />
|
||||
<ui:param name="text" value="false" />
|
||||
<ui:param name="styleClass" value="ui-button-secondary ui-button-flat" />
|
||||
</ui:include>
|
||||
</h:form>
|
||||
</div>
|
||||
<ul>
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
# Configuration UnionFlow Client - Profil Développement
|
||||
# Ce fichier est chargé automatiquement quand le profil 'dev' est actif
|
||||
|
||||
# Configuration logging pour développement
|
||||
quarkus.log.category."dev.lions.unionflow".level=DEBUG
|
||||
quarkus.log.category."jakarta.faces".level=INFO
|
||||
quarkus.log.category."org.apache.myfaces".level=INFO
|
||||
quarkus.log.category."org.primefaces".level=INFO
|
||||
|
||||
# Configuration MyFaces pour développement
|
||||
quarkus.myfaces.project-stage=Development
|
||||
quarkus.live-reload.instrumentation=true
|
||||
|
||||
# Configuration Keycloak pour développement
|
||||
%dev.quarkus.oidc.enabled=true
|
||||
%dev.quarkus.oidc.tls.verification=none
|
||||
%dev.quarkus.oidc.authentication.redirect-path=/auth/callback
|
||||
# %dev.quarkus.oidc.authentication.force-redirect-https=false # Not supported in this Quarkus version
|
||||
%dev.quarkus.security.auth.enabled=true
|
||||
|
||||
# Secret Keycloak pour développement (UNIQUEMENT pour dev local)
|
||||
# ⚠️ ATTENTION: Ne jamais commiter ce secret en production
|
||||
# En production, utiliser la variable d'environnement KEYCLOAK_CLIENT_SECRET
|
||||
%dev.quarkus.oidc.credentials.secret=${KEYCLOAK_CLIENT_SECRET:7dnWMwlabtoyp08F6FIuDxzDPE5VdUF6}
|
||||
|
||||
# Logging OIDC pour debug
|
||||
%dev.quarkus.log.category."io.quarkus.oidc".level=DEBUG
|
||||
%dev.quarkus.log.category."io.vertx.ext.auth.oidc".level=DEBUG
|
||||
%dev.quarkus.log.category."io.quarkus.security".level=DEBUG
|
||||
@@ -0,0 +1,14 @@
|
||||
# Configuration UnionFlow Client - Profil Production
|
||||
# Ce fichier est chargé automatiquement quand le profil 'prod' est actif
|
||||
|
||||
# Configuration logging pour production
|
||||
quarkus.log.console.level=WARN
|
||||
|
||||
# Configuration MyFaces pour production
|
||||
quarkus.myfaces.project-stage=Production
|
||||
quarkus.myfaces.serialize-state-in-session=true
|
||||
|
||||
# Configuration Keycloak pour production
|
||||
%prod.quarkus.oidc.tls.verification=required
|
||||
%prod.quarkus.oidc.authentication.redirect-path=/auth/callback
|
||||
|
||||
@@ -3,7 +3,7 @@ quarkus.application.name=unionflow-client
|
||||
quarkus.application.version=1.0.0
|
||||
|
||||
# Configuration HTTP
|
||||
quarkus.http.port=8082
|
||||
quarkus.http.port=8086
|
||||
quarkus.http.host=0.0.0.0
|
||||
quarkus.http.root-path=/
|
||||
quarkus.http.so-reuse-port=true
|
||||
@@ -28,7 +28,7 @@ quarkus.myfaces.number-of-views-in-session=50
|
||||
quarkus.myfaces.number-of-sequential-views-in-session=10
|
||||
quarkus.myfaces.serialize-state-in-session=false
|
||||
quarkus.myfaces.client-view-state-timeout=3600000
|
||||
quarkus.myfaces.view-expired-exception-handler-redirect-page=/pages/public/login.xhtml
|
||||
quarkus.myfaces.view-expired-exception-handler-redirect-page=/
|
||||
quarkus.myfaces.check-id-production-mode=false
|
||||
quarkus.myfaces.strict-xhtml-links=false
|
||||
quarkus.myfaces.refresh-transient-build-on-pss=true
|
||||
@@ -36,7 +36,9 @@ quarkus.myfaces.resource-max-time-expires=604800000
|
||||
quarkus.myfaces.resource-buffer-size=2048
|
||||
|
||||
# PrimeFaces Configuration
|
||||
primefaces.THEME=freya-blue-light
|
||||
# IMPORTANT: Nous laissons PrimeFaces sans th<74>me par d<>faut et chargeons le th<74>me Freya via index.xhtml/main-template.xhtml
|
||||
# pour <20>viter tout double-chargement (ex: Saga + Freya).
|
||||
primefaces.THEME=none
|
||||
primefaces.FONT_AWESOME=true
|
||||
primefaces.CLIENT_SIDE_VALIDATION=true
|
||||
primefaces.MOVE_SCRIPTS_TO_BOTTOM=true
|
||||
@@ -51,7 +53,7 @@ omnifaces.CDN_RESOURCE_HANDLER_DISABLED=true
|
||||
omnifaces.COMBINED_RESOURCE_HANDLER_DISABLED=false
|
||||
|
||||
# Configuration Backend UnionFlow
|
||||
unionflow.backend.url=${UNIONFLOW_BACKEND_URL:http://localhost:8080}
|
||||
unionflow.backend.url=${UNIONFLOW_BACKEND_URL:http://localhost:8085}
|
||||
|
||||
# Configuration REST Client
|
||||
quarkus.rest-client."unionflow-api".url=${unionflow.backend.url}
|
||||
@@ -62,11 +64,46 @@ quarkus.rest-client."unionflow-api".read-timeout=30000
|
||||
# Gestion des erreurs REST
|
||||
quarkus.rest-client."unionflow-api".providers=dev.lions.unionflow.client.service.RestClientExceptionMapper
|
||||
|
||||
# Configuration JWT et Sécurité
|
||||
unionflow.jwt.secret=${JWT_SECRET:union-flow-secret-key-very-long-and-secure-2024}
|
||||
unionflow.jwt.issuer=${JWT_ISSUER:unionflow-platform}
|
||||
unionflow.jwt.expiration-time=${JWT_EXPIRATION:3600}
|
||||
unionflow.jwt.refresh-expiration-time=${JWT_REFRESH_EXPIRATION:86400}
|
||||
# Configuration Keycloak OIDC
|
||||
quarkus.oidc.enabled=true
|
||||
quarkus.oidc.auth-server-url=https://security.lions.dev/realms/unionflow
|
||||
quarkus.oidc.client-id=unionflow-client
|
||||
quarkus.oidc.credentials.secret=${KEYCLOAK_CLIENT_SECRET}
|
||||
quarkus.oidc.application-type=web-app
|
||||
quarkus.oidc.authentication.redirect-path=/auth/callback
|
||||
quarkus.oidc.authentication.restore-path-after-redirect=true
|
||||
quarkus.oidc.authentication.scopes=openid,profile,email,roles
|
||||
quarkus.oidc.token.issuer=https://security.lions.dev/realms/unionflow
|
||||
quarkus.oidc.tls.verification=none
|
||||
# quarkus.oidc.authentication.force-redirect-https=false # Not supported in this Quarkus version
|
||||
quarkus.oidc.authentication.cookie-same-site=lax
|
||||
quarkus.oidc.authentication.java-script-auto-redirect=false
|
||||
quarkus.oidc.discovery-enabled=true
|
||||
|
||||
# TEMPORAIRE: contourner un access token invalide (claim realm_access dupliqu<71>e c<>t<EFBFBD> KC)
|
||||
# Pour un flux web-app, on peut s'appuyer sur l'ID Token et d<>sactiver la v<>rification de l'Access Token
|
||||
# Les deux cl<63>s ci?dessous couvrent les variantes selon version de Quarkus; l'une sera ignor<6F>e si non support<72>e.
|
||||
# Vérification du token activée
|
||||
# ✅ CORRIGÉ: Le mapper Keycloak problématique a été supprimé (17/11/2025)
|
||||
# Le scope "roles" gère maintenant correctement realm_access.roles (objet unique)
|
||||
quarkus.oidc.verify-access-token=true
|
||||
|
||||
# Activation de la sécurité
|
||||
quarkus.security.auth.enabled=true
|
||||
|
||||
# Chemins publics (non prot<6F>g<EFBFBD>s par OIDC) - Doit <20>tre d<>fini en premier
|
||||
# La page d'accueil (/) et index.xhtml sont publics pour permettre l'affichage initial
|
||||
# IMPORTANT: Les ressources JSF/PrimeFaces sont servies via /jakarta.faces.resource/* (ou /javax.faces.resource/* selon la stack)
|
||||
# Elles doivent <20>tre publiques pour permettre le chargement des CSS/JS (th<74>me Freya, primeicons, primeflex, etc.)
|
||||
# On inclut <20>galement /q/oidc/* pour laisser Quarkus OIDC exposer ses endpoints internes si n<>cessaire.
|
||||
quarkus.http.auth.permission.public.paths=/,/index.xhtml,/pages/public/*,/auth/*,/q/*,/q/oidc/*,/favicon.ico,/resources/*,/META-INF/resources/*,/images/*,/jakarta.faces.resource/*,/javax.faces.resource/*
|
||||
quarkus.http.auth.permission.public.policy=permit
|
||||
|
||||
# Tous les autres chemins nécessitent une authentification
|
||||
# IMPORTANT: L'ordre est crucial - les permissions publiques doivent être définies AVANT les permissions authentifiées
|
||||
# Quarkus OIDC redirigera automatiquement vers Keycloak pour les chemins non publics
|
||||
quarkus.http.auth.permission.authenticated.paths=/*
|
||||
quarkus.http.auth.permission.authenticated.policy=authenticated
|
||||
|
||||
# Configuration Session
|
||||
unionflow.session.timeout=${SESSION_TIMEOUT:1800}
|
||||
@@ -78,16 +115,3 @@ unionflow.security.password.min-length=${PASSWORD_MIN_LENGTH:8}
|
||||
unionflow.security.password.require-special-chars=${PASSWORD_REQUIRE_SPECIAL:true}
|
||||
unionflow.security.max-login-attempts=${MAX_LOGIN_ATTEMPTS:5}
|
||||
unionflow.security.lockout-duration=${LOCKOUT_DURATION:300}
|
||||
|
||||
# Dev mode configuration
|
||||
%dev.quarkus.log.category."dev.lions.unionflow".level=DEBUG
|
||||
%dev.quarkus.log.category."jakarta.faces".level=INFO
|
||||
%dev.quarkus.log.category."org.apache.myfaces".level=INFO
|
||||
%dev.quarkus.log.category."org.primefaces".level=INFO
|
||||
%dev.quarkus.myfaces.project-stage=Development
|
||||
%dev.quarkus.live-reload.instrumentation=true
|
||||
|
||||
# Prod mode configuration
|
||||
%prod.quarkus.log.console.level=WARN
|
||||
%prod.quarkus.myfaces.project-stage=Production
|
||||
%prod.quarkus.myfaces.serialize-state-in-session=true
|
||||
Reference in New Issue
Block a user