- adjustBarWidth() brise le padding Bootstrap (margin-left négatif +
width: 100vw) pour que la barre s'étende jusqu'au bord de la fenêtre
- metrics() utilise window.innerWidth comme largeur de piste (cohérent
avec la barre pleine largeur)
- hasOverflow mesure la largeur de .cell-table de CETTE table via
getBoundingClientRect(), plutôt que document.documentElement.scrollWidth
→ les petits tableaux (top10 /acheteur, /titulaire, /observatoire)
n'affichent pas de barre s'ils ne débordent pas individuellement
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Remplace le scrollbar natif (invisible en mode overlay sous Linux) par
un thumb div orange toujours visible. Track gris (#e0e0e0) 16px.
Drag souris + toucher + clic sur le track supportés.
Supprime la dépendance aux pseudo-éléments webkit et scrollbar-color.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- overflow-x:scroll force le thumb orange toujours visible (pas overlay)
- hauteur 16px pour le drag-and-drop
- :has(.dt-hscroll:not(.is-hidden)) décale les th à top:16px quand la
barre est présente, évitant le recouvrement
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Abandonne le wrapper overflow-x (incompatible avec position:sticky des
en-têtes). La barre contrôle désormais le scroll horizontal de la page
via window.scrollTo/scrollX, ce qui préserve le sticky des th.
Scrollbar orange 12px, styling webkit + Firefox.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Si la garde est posée avant de vérifier que dashContainer existe, un
déclenchement prématuré de rootObs (avant le rendu Dash) marque le
wrapper comme traité sans jamais injecter le scroll wrapper.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Évite la boucle infinie : le rootObs se déclenchait sur les insertions
DOM de setup() avant que la garde ne soit posée, relançant setup() en
boucle et faisant monter le CPU.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Seule 'Sans objet' est considérée négative parmi les marchés renseignés,
cohérent avec le reste des traitements.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Affiche 4 barres groupées par type (sociales/env) : une pour les marchés
avec au moins une considération, une pour ceux qui ont une valeur renseignée
(non nulle, y compris 'Sans objet').
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Utilise les codes hex #CC6677 (sociales) et #117733 (env) via le prop
color de dbc.Progress, qui accepte les valeurs hex.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Requête identique envoyée aux deux APIs (drapeaux d'agrégation nus),
tableau côte à côte + ratio decp/datagouv. Couvre filtres, differs,
agrégation. --url decp.info paramétrable (défaut prod), data.gouv.fr
sans auth.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Si la page retournée est partielle (len < page_size), on sait qu'on est
sur la dernière page → next=null, parité data.gouv.fr.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Testé contre tabular-api data.gouv.fr : sort sur une colonne groupby
est honoré (200), sort sur un alias d'agrégat retourne 400 (colonne
inconnue). aggregate_marches reçoit order_by ; doc Swagger mise à jour.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace la description du paramètre <colonne>__<opérateur> par une
documentation complète listant tous les opérateurs de filtre (exact, differs,
contains, notcontains, in, notin, less, greater, strictly_less,
strictly_greater, isnull, isnotnull, sort) et les agrégations (groupby, count,
sum, avg, min, max).
Met à jour le docstring de data() pour documenter le mode agrégation et les
paramètres réservés.
Ajoute test_openapi_doc.py qui valide la présence des mots-clés clés dans
l'OpenAPI généré.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implémente l'opérateur de filtre `differs` qui génère un fragment SQL
`IS DISTINCT FROM` pour exclure des valeurs en tenant compte des NULL.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Renomme RESERVED_PARAMS dans src/api/filters.py
- Fait passer le paramètre de 'count' à 'count_results' dans src/api/routes.py
- Met à jour la documentation swagger pour le nouveau nom
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>