flutter build web vert. Un seul helper, ImageCompressor, appelé par les
DEUX chemins d'upload de resources_screen — c'est le motif qui a fait
diverger Create et Upload côté serveur deux fois de suite : sur
StoragePath en C1, sur le pré-vol de quota en C3.
La compression se fait AVANT resourceCreate, pas avant l'upload. Le
contrôle de quota livré en C3 porte sur sizeBytes à la création : le
faire après aurait fait décider le serveur sur la taille du fichier
d'origine, et compté au quota une image qui n'existe pas. Un quota qui
compte 12x trop se remplit 12x trop vite.
Deux écarts assumés par rapport à l'énoncé « 2560 px / JPEG q82 » :
- Un PNG à canal alpha reste un PNG. Le passer en JPEG remplirait la
transparence de noir, ce qui abîmerait logos et filigranes. Le
redimensionnement s'applique dans les deux cas ; seul l'encodage
diffère, et le type MIME suit — sinon Firebase servirait un JPEG
étiqueté PNG.
- Si le ré-encodage produit un fichier plus gros que l'original — ce
qui arrive sur une petite image déjà bien encodée — l'original est
conservé. Un échec de décodage renvoie aussi l'original plutôt que
de bloquer l'upload.
Défaut préexistant corrigé au passage : le second chemin d'upload ne
renseignait sizeBytes ni avant ni après. Toutes les ressources créées
par ce chemin comptent donc 0 octet au quota sur l'existant — même
famille que ce que C1 et C3 ont trouvé côté serveur, et un argument de
plus pour le backfill C2.
image 4.2.0 déclarée explicitement : elle était déjà présente en
transitif, dépendre d'un hasard de résolution pour une fonction
utilisateur n'est pas tenable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Statistiques — refonte complète, aucun changement backend
statistics_screen.dart réécrit (+1832) : barres horizontales monochromes à la place
des barres verticales tronquées et des deux anneaux, barre de filtres unique avec les
volumes par canal, règle mono-canal, 4 KPI portant chacun leur variation, bandeau
« à retenir », courbe en aire avec bandes de week-end. La période précédente s'obtient
en rappelant le même endpoint.
statistics_report.dart : export PDF généré côté client (paquet pdf Dart), il partage
les valeurs calculées de l'écran — un chiffre ne peut pas diverger entre l'écran et le
document envoyé à la commune. Deux puces du sommaire promettaient des données
inexistantes (parcours terminés, questions au guide IA), retirées.
⚠️ Jamais ouvert dans un navigateur. Cases de test : test-plan.md §8bis / §8ter.
Guide IA
Screens/GuideIa/guide_ia_screen.dart — onglet Configuration. Menu conditionné à
isAssistant, le même drapeau que la garde d'AiController. L'onglet « Ce que demandent
vos visiteurs » n'est pas dans ce commit : le schéma backend est prêt, l'UI non.
Onboarding self-service
Screens/Auth/ (mot de passe oublié, définition du mot de passe),
Screens/Billing/subscription_screen.dart, ai_quota_hint.dart.
⚠️ Aucun parcours joué de bout en bout — test-plan.md §18.
Parcours guidés
progression_mode.dart : 9 booléens sur 3 niveaux remplacés par 3 questions.
Popups GuidedPath / GuidedStep / QuizQuestion mises à jour en conséquence.
Client API (manager_api_new) — édité À LA MAIN, ne pas relancer la génération
onboarding_api.dart, authentication_api.dart (+80), instance_dto (champs Guide*),
guided_step / quiz_question_guided_step (flags morts retirés).
Le // @dart=2.18 manquant dans onboarding_api.dart cassait les 3 apps Flutter d'un
coup — corrigé ici.
i18n : ~180 clés par langue (FR/EN/NL) + fichiers générés.
Tests : progression_mode_test, statistics_report_test (le second a attrapé deux
plantages qui seraient sortis au premier clic).
flutter build web ✅. flutter analyze : 68 erreurs, toutes dans les fichiers modèle
orphelins de manager_api_new — dette connue, pas une régression, ces fichiers ne sont
pas dans le graphe de compilation.