1197 Commits

Author SHA1 Message Date
Colin Maudry 8135029174 Gitea flow copie de Github
Déploiement / deploy (push) Failing after 33s
2026-07-19 15:29:12 +02:00
Colin Maudry b265930e6f Rédactionnel chapeau page d'accueil 2026-07-19 13:30:59 +02:00
Colin Maudry 41738b60ef fix(recherche): centrer verticalement la flèche du bouton de recherche
Le padding vertical (.375rem) et le line-height (1.5) de .btn nécessitent 38px
alors que le bouton a une hauteur fixe de 34px (alignée sur l'input) : le
glyphe débordait vers le bas au lieu d'être centré.

Centrage en flex + neutralisation du padding vertical, pour que l'alignement
ne dépende plus du line-height.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 13:30:35 +02:00
Colin Maudry 2a1b43a6fa fix(carte): restaurer les points quand dash-ag-grid écrase le global L (#121)
Le bundle dash-ag-grid (async-community.js) fuit un helper esbuild sous le nom
global `L`, écrasant le window.L de Leaflet. Nos fonctions clientside
pointToLayer/clusterToLayer lisaient ce global → `L.point`/`L.circleMarker is
not a function` → l'exception cassait tout le calque GeoJSON → carte vide.
Course entre le chunk AG Grid et le rendu : d'où le pattern « surtout avec
beaucoup de marchés ».

Une IIFE capture en privé le vrai Leaflet (celui exposant circleMarker) en
écoutant les affectations de window.L, sans changer ce que window.L renvoie
(AG Grid garde son helper). pointToLayer/clusterToLayer utilisent
window.leafletReal(). Nettoie aussi des console.log oubliés et un `color`
inutilisé dans clusterToLayer.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 12:53:38 +02:00
Colin Maudry 03bf5686e0 fix(figures): éviter le crash quand une colonne considérations est absente/vide
compute_considerations_stats initialisait les défauts `{key}_renseignees` en
2-uplets `(0, 0)` mais get_considerations_card_content les dépaquette en
3-uplets. Quand une colonne (considerationsSociales/Environnementales) est
absente du schéma filtré (fréquent avec peu de marchés sélectionnés), le défaut
survivait → ValueError: not enough values to unpack (expected 3, got 2).

Défaut porté à `(0, 0, 0)` : la barre dégrade à 0 % au lieu de planter.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 12:53:37 +02:00
Colin Maudry dadb11a164 Rédactionnel 2026-07-19 01:09:45 +02:00
Colin Maudry 6374ae1ec0 Rédactionnel lié au livechat chatwoot #120 2026-07-15 18:25:36 +02:00
Colin Maudry 6252b65671 Aligne la hauteur du bouton de recherche sur l'input (débordement en bas)
Le bouton utilisait height:auto, dépendant du padding/line-height par
défaut de .btn (~38px), plus haut que l'input fixé à 34px. Fixe la
hauteur du bouton à 34px pour qu'il s'aligne avec l'input.

Inclut aussi les changements en cours sur recherche.py (tagline
dynamique avec stats, home_intro, layout en fonction).
2026-07-15 16:08:56 +02:00
Colin Maudry 85b0dd0b39 Ajoute le widget de chat Chatwoot (essai) — issue #120
Injecte le script d'intégration Chatwoot dans app.index_string, activé
via CHATWOOT_WEBSITE_TOKEN. Vide par défaut, donc désactivé en test/CI.
2026-07-15 15:50:17 +02:00
Colin Maudry 986600d3ef Ajoute spec pour le widget de chat Chatwoot (issue #120) 2026-07-15 15:41:09 +02:00
Colin Maudry 30375a262f Rédactionnel abonnement et page d'accueil 2026-07-15 10:57:21 +02:00
Colin Maudry f571627a6b Jetons MCP chiffrés au repos + bouton « Copier le jeton » sur /compte/mcp
Les jetons MCP sont désormais chiffrés (Fernet dérivée de SECRET_KEY) en plus
du hash conservé pour l'auth, permettant leur ré-affichage/copie à tout moment.
Getter scopé au propriétaire, dégradation propre si clé absente/changée.
Migration 0013 + colonne token_enc. UI alignée sur « Copier le lien » des vues.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 23:55:01 +02:00
Colin Maudry 43d8ba5098 Ordre des instructions MCP 2026-07-14 23:33:12 +02:00
Colin Maudry 17e9c33934 ILIKE généralisé dans API/MCP pour contains 2026-07-14 21:23:07 +02:00
Colin Maudry d920e1ca8e Support dans l'API et le MCP de l'opérateur startswith, utile pour les codes CPV 2026-07-14 21:16:08 +02:00
Colin Maudry ca320bdc1f Amélioration instructions config MCP et prompts 2026-07-14 21:15:17 +02:00
Colin Maudry 2efb5e067c Précisions config claude.ai/Desktop 2026-07-14 19:48:19 +02:00
Colin Maudry b077baf0a3 fix(mcp): dedoublonne les colonnes demandees (evite SELECT dupliqué) (#114) 2026-07-14 18:12:50 +02:00
Colin Maudry b4930537a1 feat(mcp): parametre colonnes (enum) pour rechercher_marches (#114) 2026-07-14 18:06:02 +02:00
Colin Maudry f668db1419 feat(mcp): colonnes configurables + lien dans rechercher_marches (#114)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 17:58:19 +02:00
Colin Maudry 1636db68ea docs(mcp): plan colonnes configurables rechercher_marches (#114) 2026-07-14 17:55:19 +02:00
Colin Maudry 9961bb19df docs(mcp): coherence union colonnes dans le design (#114) 2026-07-14 17:49:38 +02:00
Colin Maudry 8905f083ea docs(mcp): design colonnes configurables pour rechercher_marches (#114) 2026-07-14 17:49:20 +02:00
Colin Maudry 70ca65e962 Adaptation de l'effet de TOUS_ABONNES 2026-07-14 12:53:01 +02:00
Colin Maudry ad293acd88 Message d'info pour les users en trial dans /compte/roadmap 2026-07-14 11:48:29 +02:00
Colin Maudry ea95431eae docs: spec de refonte du système de votes de la roadmap
Championnat mensuel (fenêtre glissante sur created_at), recharge des
votes le lundi (Europe/Paris) sans report, pas de cap par feature, et
précondition de déploiement gatée sur le nombre de votants.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 11:44:32 +02:00
Colin Maudry 906c6a7f15 Changement font en-tetes colonnes (akshar) 2026-07-13 23:48:54 +02:00
Colin Maudry f84ca73b04 fix(abonnement): erreurs console JS et re-render en boucle sur la page mes-infos
Le label du checklist CGU mélangeait des chaînes brutes et un composant
html.A dans une liste, ce que le rendu compound-label de dcc.Checklist
ne supporte pas (chaque item passe par ExternalWrapper qui suppose un
vrai composant Dash). Ça crashait en boucle et déclenchait des dizaines
de re-render, ce qui faisait aussi clignoter le lien Abonnement dans le
menu latéral. Fix : tout regrouper dans un seul html.Span.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-13 23:38:29 +02:00
Colin Maudry a225dbb0ef Normalisation du style des boutons 2026-07-13 23:24:27 +02:00
Colin Maudry 34f10f2283 Tooltips abonnement sur Sauvegarder vue et Mes vues 2026-07-13 23:04:48 +02:00
Colin Maudry 8b9433b7f2 Amélioration de la modale de renommage des vues 2026-07-13 22:50:23 +02:00
Colin Maudry c0d8a40c92 Couleur hover dans les dropdowns 2026-07-13 22:49:56 +02:00
Colin Maudry bee401430b feat(tableau): lien « Gérer mes vues » en tête du dropdown + fix hover dropdown (#112)
- Dropdown « Mes vues » : ajoute en tête un lien « Gérer mes vues » (couleur
  primary) vers /compte/vues, séparé de la liste des vues.
- Corrige l'override de --bs-dropdown-link-hover-bg : Bootstrap 5.3 scope cette
  variable sur .dropdown-menu, donc un override sur :root est masqué. Déplacé
  sur .dropdown-menu.
2026-07-13 22:38:57 +02:00
Colin Maudry 31427a8b3b feat(vues): jeton de partage en minuscules (base36, #112)
Alphabet du jeton passé de base62 (a-z A-Z 0-9) à base36 (a-z 0-9), longueur
inchangée (6). Lien plus lisible/dictable et cohérent avec le slug déjà en
minuscules. Les jetons déjà générés (à casse mixte) restent valides (lookup par
match exact).
2026-07-13 22:17:26 +02:00
Colin Maudry e0828a7e13 feat(vues): bouton « Copier le lien » + lien de partage en texte stylé (#112)
- Bouton de copie explicite (icône copy.svg + « Copier le lien » + retour
  « ✓ Copié ») sur /tableau et /compte/vues, via dcc.Clipboard (children /
  copied_children), à la place de l'icône seule.
- Le lien direct s'affiche en texte (span#share-url-text) plutôt qu'un
  <input> : évite la troncature d'affichage du champ Bootstrap form-control en
  flex (zone de texte bloquée ~218px), montre tout le lien avec retour à la
  ligne, et prend la largeur du lien. Stylé comme un champ (bordure, coins
  arrondis, texte 90%).
- Instructions /compte/vues simplifiées ; E2E adapté (#share-url-text).
2026-07-13 22:08:00 +02:00
Colin Maudry 770b7cbdf8 fix(entity_grid): sortie MATCH unique pour le datasource (dash.set_props)
Le datasource _get_rows des grilles acheteur/titulaire mélangeait une sortie
MATCH (getRowsResponse de la grille pattern-matching) avec deux sorties fixes
(<org>-total / -total-unique). Dash l'interdit : le dev-renderer (mode debug de
run.py) lève « MATCH wildcards must be on the same keys for all Outputs » (4
erreurs : 2 par page). Le callback échoue au dispatch et la grille reste vide.

Correctif : _get_rows n'a plus qu'une sortie MATCH (getRowsResponse) ; les
stores totaux (id fixes) sont alimentés impérativement via dash.set_props.

Test de régression en debug=True (dev-renderer) : sans le correctif la grille ne
charge aucune ligne ; avec, lignes + compteur « N marchés » présents.
2026-07-13 19:40:26 +02:00
Colin Maudry f0a891b73f fix(tableau): griser/désactiver les boutons vues pour les non-abonnés
La barre des vues sauvegardées restait masquée pour les non-abonnés via un
style inline display:none — inopérant car .d-inline-flex est
display:inline-flex !important, la barre était donc toujours visible.

La barre reste désormais visible pour tous ; « Sauvegarder la vue » et
« Mes vues » sont grisés et désactivés (disabled) pour les non-abonnés. Le
gating serveur de save_view (prepare_view_to_save) reste inchangé.
2026-07-13 19:23:03 +02:00
Colin Maudry 3034e911e7 feat(tableau): masquage du bloc de partage piloté par événements AG Grid (#112)
Remplace le verrou de dérive à compteur (suppress-next) par une détection
événementielle : eventListeners AG Grid (filterChanged/sortChanged) →
dashAgGridFunctions.hideShareOnUserAction, qui efface active-view sur action
utilisateur (source != 'api') et ignore l'écho de l'application programmatique.

Le compteur suppress-next souffrait d'une course d'ordonnancement Dash (l'écho
lisait la valeur pré-batch) et le diff de columnState était impraticable (état
réémis bruité). La visibilité du bloc bascule via la classe (d-flex/d-none) et
non le style inline, car .d-flex est display:flex !important.

Task 7 : test E2E de bout en bout (application + masquage sur action).
2026-07-13 18:41:36 +02:00
Colin Maudry 0e0fb32222 feat(compte/vues): Ouvrir via URL courte + bouton copier (#112) 2026-07-13 17:35:53 +02:00
Colin Maudry 2a22951829 feat(tableau): verrou de derive + affichage du bloc de partage (#112) 2026-07-13 17:34:29 +02:00
Colin Maudry 301a8668b3 feat(tableau): resolution ?vue= + bloc URL de partage (#112) 2026-07-13 17:32:48 +02:00
Colin Maudry 439b6f9cdc feat(vues): resolveur pur du parametre ?vue= (#112) 2026-07-13 15:28:54 +02:00
Colin Maudry 3a0d868e93 feat(vues): slugify + build_view_url + parsing du jeton (#112) 2026-07-13 15:23:47 +02:00
Colin Maudry a66af0190d feat(vues): jeton public + get_by_token + backfill (#112) 2026-07-13 15:19:32 +02:00
Colin Maudry 940f0de0a7 Tirets pour le slug, _ pour le token (spec) #112 2026-07-13 15:14:14 +02:00
Colin Maudry ac73f6efc1 docs(vues): plan d'implementation partage par URL courte (#112)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 15:13:30 +02:00
Colin Maudry d2fa17761d feat(mcp): durcir le consentement OAuth (remember-cookie SameSite + CSRF) (#114)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 15:07:59 +02:00
Colin Maudry bb2aee85a2 Libellés français pour la pagination #47 2026-07-13 15:02:47 +02:00
Colin Maudry 10770c5d14 docs(vues): design partage de vues par URL courte (#112)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 15:02:06 +02:00
Colin Maudry cc412f459f docs(mcp): documenter APP_BASE_URL/egress pour le connecteur OAuth (#114) 2026-07-13 14:47:41 +02:00