- SUPER_ADMIN: "Organisations" (Liste, Nouvelle, Statistiques, Types)
- ADMIN_ORGANISATION: "Mon Organisation" (Détail avec orgId, Mon Abonnement)
- Supprimé le sous-menu unique partagé qui exposait toutes les orgs à l'admin
Le <i .../> auto-fermant cassait le parsing Facelets — toutes les colonnes
après Localisation ne rendaient plus (Membres, Statut, Actions vides).
Retour au pattern original : h:panelGroup wrapper + <i></i> avec balise
fermante explicite. Les h:outputText conditionnels restent pour les données.
PrimeFaces p:inputNumber sans decimalSeparator explicite utilise le point (EN).
L'utilisateur français tape une virgule → autoNumeric la rejette → seule la
partie entière est conservée (ex: 5,316667 → 5).
Fix : decimalSeparator=',' + thousandSeparator='' (pas de séparateur milliers
pour les coordonnées GPS). Placeholders mis à jour avec virgule.
La colonne 'Localisation' dans le DataTable des organisations affichait un
tiret hardcodé (<span>—</span>) — placeholder jamais remplacé par les données.
Fix : affiche ville + pays depuis le DTO, triable par ville.
Si aucune donnée → tiret gris en fallback.
Le <p:selectOneMenu> pour le type d'organisation écrivait dans typeAssociation
(alias obsolète) tandis que le backend OrganisationService.creerOrganisation()
lisait typeOrganisation → le type sélectionné par l'utilisateur était ignoré,
le type par défaut (premier du catalogue, ex: GROUPE_PRIERE) était utilisé.
Fix : value='#{model.typeAssociation}' → value='#{model.typeOrganisation}'
Le p:poll interval=5 dans topbar.xhtml bombardait le serveur toutes les 5 secondes.
Quand l'utilisateur soumettait un formulaire (ex: création d'organisation),
le poll concurrent provoquait l'annulation de la requête AJAX → erreur 499
(client closed connection before server response).
Changements :
- interval : 5 → 60 (60s suffit pour tracker l'activité session)
- async='true' ajouté (le poll ne bloque plus la queue AJAX PrimeFaces,
les soumissions de formulaires passent en priorité)
Le p:confirmDialog global PrimeFaces 13 utilise les classes CSS
ui-confirmdialog-yes et ui-confirmdialog-no pour câbler automatiquement
les boutons à l'action du p:commandButton source (qui contient le <p:confirm/>).
Avant : le bouton 'Oui' avait type='button' sans classe ni onclick
→ aucune réaction au clic, action jamais déclenchée.
Après : classes standards PrimeFaces ajoutées sur les deux boutons.
Supprimé onclick='PF(confirmDialog).hide()' sur 'Non' (la classe
ui-confirmdialog-no gère la fermeture automatiquement).
- DatePicker dateFondation : yearRange='1900:2025' → '1900:2030'
(on est en 2026 — le composant ne pouvait pas afficher LocalDate.now())
Supprimé maxdate=null (inutile, causait potentiellement un warning)
- InputNumber lat/long : ajout f:validateDoubleRange côté serveur
(la validation JS autoNumeric lance une exception non rattrapée quand
l'utilisateur colle une valeur hors bornes — le validator serveur rattrape)
Ajout modifyValueOnWheel=false (évite les modifications accidentelles au scroll)
Ajout p:message pour afficher les erreurs de validation
Le preRenderView de nouvelle.xhtml appelait preparerNouvelleOrganisation() à
chaque render — y compris les polls PrimeFaces du template (~5s) et les
partial AJAX updates. Cela réinitialisait nouvelleOrganisation = new OrganisationResponse()
à chaque cycle, perdant les données saisies par l'utilisateur.
Symptôme : erreurs 499 en boucle dans la console browser + impossible de soumettre
le formulaire (données toujours vides au moment du POST).
Fix : if (fc.isPostback()) return; → la méthode ne s'exécute que sur le
chargement initial (GET), pas sur les AJAX postbacks.
- OrganisationsBean : executeWithRetrySupplier → executeWithRetry (méthode correcte,
compatible ECJ — Callable<T> au lieu de Supplier<T> non capturé)
- OrganisationDetailBean : utiliser statutLibelle/statutSeverity si présents avant
fallback sur statut brut ; supprimer revenirAListe() (redirect manuel inutile) ;
propager typeLibelle en plus de typeOrganisationLibelle
- detail.xhtml : remplacer les panneaux adresseComplete/dateFondation/niveauHierarchique
(champs absents du DTO) par nombreEvenements qui existe dans OrganisationSummaryResponse
Pour les applications web-app (servlet/JSF), Quarkus OIDC utilise un filtre
qui intercepte AUTOMATIQUEMENT toute URL contenant les paramètres code+state,
sans nécessiter de redirect-path explicite.
En commentant quarkus.oidc.authentication.redirect-path:
- Le filtre Quarkus OIDC peut intercepter n'importe quelle URL après l'auth Keycloak
- Le callback devient transparent pour l'utilisateur (pas de page intermédiaire visible)
- Redirection immédiate vers le dashboard après authentification réussie
Cela corrige l'erreur 502 Bad Gateway observée sur /auth/callback en production.
Changements:
- application.properties: redirect-path commenté
- application-prod.properties: redirect-path commenté avec explication détaillée
Le wildcard https://unionflow.lions.dev/* dans Keycloak permet à Quarkus
de rediriger vers n'importe quelle page après l'authentification.
Le redirect-path doit être explicitement défini en production pour surcharger
la valeur par défaut de application.properties.
Quarkus OIDC gère automatiquement le callback sur ce path - pas besoin de
créer une page callback.xhtml. Le framework intercepte la requête, échange
le code OAuth contre un token, crée la session et redirige automatiquement.
Cela corrige l'erreur 502 Bad Gateway lors du retour d'authentification Keycloak.
- Commenté quarkus.oidc.authentication.redirect-path=/auth/callback
- Quarkus OIDC utilise maintenant son path par défaut /q/oidc/code-flow
- Ajouté https://unionflow.lions.dev/q/oidc/code-flow dans Keycloak
Cela corrige l'erreur 502 Bad Gateway lors du callback OAuth après authentification.
Le path personnalisé /auth/callback causait des conflits avec le gestionnaire automatique
de callback de Quarkus OIDC.
The applies-to=JAXRS,SERVLET syntax was invalid and caused:
Cannot convert JAXRS,SERVLET to enum class PolicyMappingConfig$AppliesTo
Removed applies-to lines - not needed for basic path-based permissions.
Changes:
- Removed unrecognized property quarkus.oidc.authentication.redirect-path-after-login
- Changed authenticated.paths from /* to /pages/secure/* to allow public landing page
- Added applies-to=JAXRS,SERVLET to both public and authenticated permissions
- Documented importance of permission order (most specific first)
This fixes the 403 Forbidden error on https://unionflow.lions.dev root path.
Now:
- / and /index.xhtml are publicly accessible (landing page)
- /pages/secure/* requires authentication
- After login, restore-path-after-redirect will redirect to originally requested page
🤖 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Version 1.0.1 includes explicit version for lions-user-manager-server-api
dependency, fixing Maven resolution issues during CI/CD builds.
This resolves the 'version can neither be null, empty nor blank' error
when building with lionsctl pipeline.
Quarkus 3.x changed the packaging format from uber-jar (*-runner.jar)
to a multi-file quarkus-app directory structure.
Changes:
- Copy quarkus-app/lib/, app/, quarkus/ directories
- Use quarkus-run.jar as entrypoint instead of app.jar
- Maintains same runtime configuration and health checks
Fixes Docker build compatibility with Quarkus 3.15.1