64 Commits

Author SHA1 Message Date
Thomas Fransolet
0df5dc03fa Web mobile : le clavier se refermait aussitot ouvert sur le login
Le meta viewport manquant n'expliquait pas tout : le clavier s'ouvrait puis se
refermait apres une demi-seconde. C'est le focus qui etait perdu, pas la saisie
qui n'arrivait pas.

Sur Flutter web, un AutofillGroup se materialise par un <form> DOM qui porte les
inputs caches par lesquels passe la saisie. L'ouverture du clavier redimensionne
la fenetre, l'ecran se reconstruit, le groupe d'autofill est renegocie et le
<form> recree : l'input focus disparait avec lui. Sur desktop rien ne
redimensionne au clic, d'ou un bug invisible hors mobile.

L'AutofillGroup est retire — les autofillHints portes par chaque champ suffisent
au navigateur pour proposer le remplissage, le groupe ne servait qu'a
finishAutofillContext. Trois protections completent la correction :

- les deux champs passent par un TextEditingController detenu par le State, donc
  la saisie survit a une reconstruction, la ou initialValue repartait de zero ;
- ils portent une ValueKey stable, pour etre reapparies plutot que recrees si la
  structure de leurs freres bouge ;
- le Scaffold ne se redimensionne plus a l'ouverture du clavier ; le contenu est
  deja dans un SingleChildScrollView, rien ne reste masque.

Au passage, le pre-remplissage de developpement (localhost) etait ecrit dans
build() a chaque reconstruction : il passe dans initState, ou il a du sens.

Le routeur, lui, etait fabrique dans le builder d'un FutureBuilder et l'appel a
getInstanceInfo partait de l'arbre passe a runApp. Chaque passage du builder
rendait un GoRouter neuf, donc un arbre neuf et un historique perdu. Les deux
sont desormais resolus une fois, avant runApp — 45 lignes de moins.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 22:07:17 +02:00
Thomas Fransolet
842f69ebc9 Web mobile : le clavier ne s'ouvrait pas sur l'ecran de login
web/index.html n'avait aucune balise <meta name="viewport">. Les navigateurs
mobiles appliquaient donc un viewport virtuel de ~980px et dezoomaient la page,
ce qui decalait les <input> DOM caches par lesquels Flutter web gere la saisie :
le tap donnait bien le focus cote Flutter, mais le navigateur n'ouvrait pas le
clavier et tentait de zoomer sur l'element — l'ecran semblait juste se rafraichir.
Effet de bord, le LayoutBuilder du login voyait maxWidth ~980, donc isMobile
etait toujours faux et la mise en page mobile ne s'appliquait jamais.

maximum-scale=1.0 evite en plus le zoom automatique de Safari iOS au focus.

Au passage :
- suppression de window.flutterWebRenderer = "html", sans effet depuis que le
  renderer HTML a ete retire de Flutter (3.29, on est en 3.44) ;
- badge de version sur l'ecran de login. kGitSha est injecte au build
  (--dart-define=GIT_SHA) et affiche a cote du numero de pubspec, pour relier
  un bundle deploye au commit exact qui l'a produit ;
- la Future de PackageInfo etait recreee a chaque build() du login, ce qui
  faisait clignoter le libelle : elle est desormais construite une seule fois.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 16:31:01 +02:00
Thomas Fransolet
608231f71c C4 : compression des images à l'upload, 2560 px / JPEG q82
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>
2026-08-12 15:52:14 +02:00
Thomas Fransolet
bb4d4fe2d5 Écran Statistiques refondu + Guide IA + onboarding (auth, abonnement) + i18n FR/EN/NL
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.
2026-08-09 22:14:37 +02:00
Thomas Fransolet
0f2fa9bf3e refacto misc + bento layout 2026-07-14 17:20:20 +02:00
Thomas Fransolet
a54952e5f4 MISC 2026-07-10 16:54:26 +02:00
Thomas Fransolet
205f1ec933 Misc 2026-05-09 00:23:04 +02:00
Thomas Fransolet
0059582e9f Multi langues + Assign plan dialog + display quotas + translator IA 2026-04-10 17:17:49 +02:00
Thomas Fransolet
b9ab5238ba Add stat screen (wip) to be tested + ia assistant activation for mobile (todo add to tablet) + SERVICE GENERATION 2026-03-13 15:07:39 +01:00
Thomas Fransolet
3520d2d3d2 Geometry update, update quill editor, fix save in multiple new features + MISC 2026-03-06 15:23:10 +01:00
Thomas Fransolet
ded4620bf2 Wip changements fantastiquement rapide d'antigravity, très bonne base mais du wip 2026-03-02 09:06:53 +01:00
Thomas Fransolet
61b3289e35 Wip manager, mobile layout + login and added logo + finetuning menu and drawer etc 2025-10-04 23:24:46 +02:00
Thomas Fransolet
4501aaac9c clean code (main screen) + support routes navigation (not yet detail) 2025-08-20 18:15:00 +02:00
Thomas Fransolet
61fd4a44a1 Fix session not working 2025-08-14 23:24:18 +02:00
Thomas Fransolet
0dacb685b5 Update host to preprod. 2025-06-06 11:43:21 +02:00
Thomas Fransolet
f0efb3a447 update version to 3.0.0 2025-06-06 10:40:32 +02:00
Thomas Fransolet
4818a1af52 Configuration (create, update, del) + Section (create, update, del)
more test to be sure for section but should be ok
2025-05-13 17:12:04 +02:00
Thomas Fransolet
5b9295ceb2 update title limit characters (for quizz) + update some of plugins 2024-11-21 13:34:15 +01:00
Thomas Fransolet
97363dfae0 init version + remove print in login screen 2024-10-17 11:36:36 +02:00
Thomas Fransolet
a9f9aa81e0 updated snackbar to flushbar + added copy to other languages 2024-07-02 16:22:45 +02:00
Thomas Fransolet
5564810e75 Update gradle, kotlin version to match docker build 2024-06-21 09:47:55 +02:00
Thomas Fransolet
e5a2d4f06a Update tarif to title (more char) + add image geopoint 2024-06-20 16:23:44 +02:00
Thomas Fransolet
b04d90a3ad Added image principal geopoint + set centrage localisation mapdto 2024-04-18 17:25:39 +02:00
Thomas Fransolet
9e0277be6e missing file 2024-04-11 17:36:27 +02:00
Thomas Fransolet
649955044f Service generation + init new version + Add weather as a section + download resource + filter geoPoint + added new config params 2024-04-10 10:43:09 +02:00
Thomas Fransolet
8824609fad Clean code + add pick location 2024-03-14 14:41:55 +01:00
Thomas Fransolet
1d81997a99 Handle resource viewer + add rows and cols to puzzle 2023-12-29 14:59:21 +01:00
Thomas Fransolet
dca7474551 Init version 2.0.0 + wip visitNamur request + wip upload resource to firebase 2023-12-14 17:52:07 +01:00
Thomas Fransolet
3a29ec8715 Add language icons + quill editor for title, descriptions 2023-10-31 21:08:49 +01:00
Thomas Fransolet
a7741d8151 Update flutter + dart + all packages + generation + update quill layout (wip) 2023-10-27 16:35:06 +02:00
Thomas Fransolet
2bef54f267 HTML component test + responsive test 2023-06-21 17:21:59 +02:00
2b9e609599 Add version to login screen 2023-04-26 16:09:48 +02:00
ae6dd648c1 increment version to 1.0.1-2 2023-04-26 15:55:33 +02:00
3585a67ee2 Copy QrCode as image + download 2023-04-26 15:42:42 +02:00
9de38c2cfc Fix bug beaconId null 2023-04-17 22:34:45 +02:00
a3a62d1903 Null safety ! 2023-04-01 16:52:13 +02:00
Thomas Fransolet
d3f60bcbe6 Add audio visualisation in resource 2023-03-31 16:45:06 +02:00
11f5e2860f Search fix + fix pdf generation with special character 2023-03-10 19:25:22 +01:00
Thomas Fransolet
798d3ca451 Update policy page text 2023-02-21 08:57:27 +01:00
ed9c4bfc15 Update openapi generation .. + update code + fix issue on authenticate try on build 2022-12-22 17:30:37 +01:00
eddc4005ae Add audio in web + update code for resource .. 2022-10-27 17:32:44 +02:00
5b0f9cc954 Add languages multi select dialog 2022-09-13 18:54:07 +02:00
98e066c712 PDF QRCode download + code clean 2022-06-23 17:48:02 +02:00
7195ebb64f Add Article management ! 2022-06-22 18:54:27 +02:00
cf7fd02599 Import / export config update 2022-03-25 17:42:09 +01:00
d290135ef9 Tentative store password + version 1.3 2022-03-23 20:46:45 +01:00
Thomas Fransolet
6b2c74424a Add filepicker +update size image section 2021-12-23 11:53:36 +01:00
Thomas Fransolet
a69d1aa03f WEB - WIP 2021-11-19 18:54:52 +01:00
Thomas Fransolet
c8fd56ebdc Fix resource bug + flutter update 2021-10-14 19:49:37 +02:00
Thomas Fransolet
4a516d8d29 Add msix, translate in french (wip) 2021-08-25 18:12:49 +02:00