Le panneau était découpé par table SQL, pas par question que se pose l'admin. Conséquence : « je constate ici, j'agis dans un autre onglet », et aucun moyen de voir ce qui coince réellement. Redécoupage — un onglet = une question - Pilotage : est-ce que ça tourne ? (fusionne l'ancien « Actions ») - Groupes : trouver et corriger - Localisations : qu'est-ce qui coince dans le géocodage ? ← NOUVEAU - Journal : que s'est-il passé ? - LLM & coûts : combien ça coûte ? Pilotage : chaque chiffre problématique porte son action - Bandeau de santé (groupes, géocodage, file, bloqués, coût) coloré par état - Alertes actionnables : « 12 localisations en erreur » + [Examiner] + [Tout remettre en file], au lieu d'un mur de boutons dans un autre onglet - Déclencheurs de traitements inline, opérations destructives repliées - L'ancien bloc « Éléments de genre » (des centaines de mots-clés jamais consultés) est retiré Localisations : la vue qui manquait totalement L'admin ne disposait que d'actions EN MASSE sur band_locations et d'aucun moyen de voir CE qui échouait. Débloquer un seul lieu supposait de relancer des milliers d'appels Geoapify/Groq facturés. - GET /admin/api/locations liste filtrable (statut, lieu, groupe, pays) - POST /admin/api/locations/:id/requeue relance UNE ligne - PATCH /admin/api/locations/:id saisie manuelle des coordonnées - Diagnostic lisible sans clic : lieu brut, statut, essais, erreur réelle Groupes : recherche d'abord Une barre de recherche et des filtres rapides en chips remplacent les 8 champs texte ; les filtres avancés sont repliés. Accessibilité - Lignes de tableau activables au clavier (role=button, tabindex, Entrée) - Modales : Échap ferme, focus piégé, focus rendu à l'élément d'origine - Contraste : --err (#c61a1a) échouait WCAG AA en texte sur fond sombre (3,4:1). Les messages d'erreur étaient difficiles à lire. Ajout de --err-text / --ok-text (~6,5:1) pour les usages en couleur de texte. Détecté par les nouveaux tests axe sur les vues rendues. - Statuts affichés en français au lieu des valeurs brutes de la base Tests - 36 tests API sur les trois nouveaux endpoints (allowlist de statuts, bornes des coordonnées, audit, 404) - 53 parcours Playwright sur la VRAIE app Fastify + faux pool, dans une topologie identique à la production (statique servi + /admin/* proxifié) - Tests axe sur les vues RENDUES : le test jsdom existant ne voyait que la coquille vide du dashboard, tout étant construit en JavaScript - e2e branché sur le hook pre-push, pas sur `check` : la boucle de développement reste à 6 s, le push coûte 28 s Correction trouvée par les tests Le routeur ne séparait pas la query string du nom de vue : « #/locations?status=error » ne correspondait à aucun alias et retombait sur Pilotage — les liens des alertes ne fonctionnaient pas. Co-Authored-By: Claude <noreply@anthropic.com>
109 lines
3.2 KiB
JavaScript
109 lines
3.2 KiB
JavaScript
import js from "@eslint/js";
|
|
import globals from "globals";
|
|
|
|
/**
|
|
* Config ESLint « flat » (ESLint 9).
|
|
*
|
|
* Trois environnements coexistent dans ce repo et n'ont pas les mêmes globales :
|
|
* - apps/api : Node ESM
|
|
* - apps/web/site : scripts classiques navigateur (Leaflet en global)
|
|
* - apps/admin/site : scripts classiques navigateur
|
|
*/
|
|
export default [
|
|
{
|
|
ignores: [
|
|
"**/node_modules/**",
|
|
"apps/web/quizz-site/**",
|
|
"reports/**",
|
|
".stryker-tmp/**",
|
|
"coverage/**",
|
|
],
|
|
},
|
|
|
|
js.configs.recommended,
|
|
|
|
// ---- API : Node, ESM ----
|
|
{
|
|
files: ["apps/api/src/**/*.js"],
|
|
languageOptions: {
|
|
ecmaVersion: 2023,
|
|
sourceType: "module",
|
|
globals: { ...globals.node },
|
|
},
|
|
rules: {
|
|
"no-unused-vars": ["error", { argsIgnorePattern: "^_", caughtErrors: "none" }],
|
|
"no-console": "off",
|
|
eqeqeq: ["error", "smart"],
|
|
"prefer-const": "error",
|
|
"no-var": "error",
|
|
"no-throw-literal": "error",
|
|
"require-await": "warn",
|
|
},
|
|
},
|
|
|
|
// ---- Tests (vitest + Playwright). Certains tournent sous jsdom ou dans un
|
|
// navigateur → globales navigateur en plus de Node. Le harnais e2e est en
|
|
// .mjs (modules ES chargés directement par node). ----
|
|
{
|
|
files: ["apps/*/test/**/*.{js,mjs}"],
|
|
languageOptions: {
|
|
ecmaVersion: 2023,
|
|
sourceType: "module",
|
|
globals: { ...globals.node, ...globals.browser },
|
|
},
|
|
rules: {
|
|
"no-unused-vars": ["error", { argsIgnorePattern: "^_", caughtErrors: "none" }],
|
|
},
|
|
},
|
|
|
|
// ---- Frontends : scripts classiques navigateur ----
|
|
{
|
|
files: ["apps/web/site/**/*.js", "apps/admin/site/**/*.js"],
|
|
languageOptions: {
|
|
ecmaVersion: 2023,
|
|
sourceType: "script",
|
|
globals: {
|
|
...globals.browser,
|
|
// Chargés via <script> (CDN ou fichier local) avant app.js
|
|
L: "readonly",
|
|
LOCALES: "readonly",
|
|
noUiSlider: "readonly",
|
|
BMPure: "readonly",
|
|
// Footer CJS des modules « purs » partagés navigateur/test
|
|
module: "writable",
|
|
},
|
|
},
|
|
rules: {
|
|
"no-unused-vars": ["error", { argsIgnorePattern: "^_", caughtErrors: "none" }],
|
|
// `try { … } catch {}` volontaire sur les appels best-effort (logout, télémétrie)
|
|
"no-empty": ["error", { allowEmptyCatch: true }],
|
|
"no-console": ["warn", { allow: ["warn", "error"] }],
|
|
eqeqeq: ["error", "smart"],
|
|
"prefer-const": "error",
|
|
"no-var": "error",
|
|
// Les frontends déclarent volontairement des globales partagées entre fichiers
|
|
"no-redeclare": ["error", { builtinGlobals: false }],
|
|
},
|
|
},
|
|
|
|
// ---- Traductions : les espaces insécables fines sont de la typographie
|
|
// volontaire (français, tchèque…), pas des caractères parasites. ----
|
|
{
|
|
files: ["apps/web/site/locales.js"],
|
|
rules: { "no-irregular-whitespace": "off" },
|
|
},
|
|
|
|
// ---- Config et scripts d'outillage (racine + scripts/) ----
|
|
{
|
|
files: ["*.js", "*.config.js", "scripts/**/*.{js,mjs}"],
|
|
languageOptions: {
|
|
ecmaVersion: 2023,
|
|
sourceType: "module",
|
|
globals: { ...globals.node },
|
|
},
|
|
rules: {
|
|
"no-unused-vars": ["error", { argsIgnorePattern: "^_", caughtErrors: "none" }],
|
|
"no-console": "off",
|
|
},
|
|
},
|
|
];
|