205 Commits

Author SHA1 Message Date
Thomas Fransolet
bac086f1e1 Studio lot 6 : mention « image générée par IA » chez le visiteur
Une reconstitution n'est pas une photographie d'archive, et rien dans l'image ne le dit :
la mention est due au visiteur. Elle est posée au-dessus des trois branches de rendu
(réseau, cache hors ligne, URL externe) plutôt qu'à chacune, pour qu'aucun point
d'affichage ne puisse l'oublier.

Traduite dans les onze langues publiées : l'app visiteur n'a pas d'infrastructure de
traduction pour ses propres libellés.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 17:33:55 +02:00
Thomas Fransolet
9e213968f5 Clé d'API rendue au client reconstruit au démarrage
La clé est persistée en base locale, mais le client était reconstruit sans elle :
tous les appels suivants partaient anonymes, à commencer par celui qui rapporte la
configuration à afficher.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 17:33:21 +02:00
Thomas Fransolet
6efd67611f K8 : retour automatique à l'accueil après 5 min sans interaction
flutter build apk --debug vert. Un visiteur part sans fermer l'écran ; le
suivant trouvait le contenu du précédent.

Écrit une seule fois, dans section_page_detail : il enveloppe les treize
types et portait déjà les crochets initState/dispose des statistiques.
L'écrire dans les écrans eux-mêmes l'aurait fait écrire treize fois.

Bénéfice de bord, et ce n'est pas un détail : le retour automatique passe
par le même dispose, donc il émet un sectionLeave avec sa durée réelle.
Sans lui, une consultation abandonnée restait ouverte jusqu'au visiteur
suivant et gonflait la durée mesurée d'autant. K8 répare donc une
statistique en plus d'un écran.

Listener plutôt que GestureDetector pour réarmer le minuteur : il observe
les pointeurs sans entrer en concurrence avec les gestes des écrans en
dessous. Une carte qu'on fait glisser ou un quiz qu'on tape ne doivent
rien perdre. onPointerDown et onPointerMove, donc le défilement d'un long
article compte comme une interaction.

Délai dans constants.dart (kKioskIdleTimeout) plutôt qu'en dur : c'est un
réglage de comportement de borne, pas une valeur d'implémentation.

Non vérifié : le comportement réel après 5 minutes, qui demande un device
et cinq minutes d'attente. popUntil(isFirst) suppose que l'accueil est
bien la première route de la pile — à confirmer au §0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 15:57:43 +02:00
Thomas Fransolet
7c29b4bb76 K7 et K3 : SectionArticle et SectionEvent sur la borne
flutter build apk --debug vert, APK produit. La borne couvre désormais
12 des 13 types ; seul SectionParcours reste dehors, et définitivement —
un parcours guidé fait marcher le visiteur avec géodéclenchement.

Les deux écrans suivent la maquette paysage validée le 12/08 : ils sont
dessinés pour une dalle large et fixe, pas pour un téléphone debout.

K7 — Article. article_view.dart remplace le stub Text("TODO Article") et
le case est décommenté (l'import d'ArticleView était déjà en tête de
main_view, laissé par celui qui avait écrit le TODO). Rail média à 38 %
avec image, vignettes à plat et audio docké ; colonne de lecture à 62 %
plafonnée à 720 px, parce qu'étirer le texte sur 1280 px le rend
illisible. isContentTop, qui voulait dire « texte au-dessus » en portrait,
devient le côté : à true, texte à gauche et rail à droite.

Trois états incomplets, tous possibles en configuration. Le rail n'existe
que s'il a quelque chose à ancrer : sans audio le dock tombe, sans photo
le rail disparaît et l'audio passe en tête de la colonne, sans rien la
colonne se centre.

L'audio est porté par langue (audioIds est une List<TranslationDTO>) :
pas d'entrée pour la langue choisie, pas de lecteur, sans repli sur une
autre langue. TranslationHelper.get renvoyant "" quand la langue manque,
la règle tombe juste.

K3 — Événement. event_view.dart : bande héros à 26 % au lieu des 52 % de
mymuseum (debout devant une borne, personne ne défile pour découvrir
qu'il y a un programme dessous), programme à gauche avec bloc « en
cours », carte flutter_map vive à droite. Le détail d'un bloc s'ouvre
sous la carte et non en showModalBottomSheet : ce dernier est une réponse
à l'étroitesse, or ici il y a la place à côté.

Quatre choses que le code a dictées :

- La barre de pied de la maquette n'appartient pas à ces écrans.
  section_page_detail la dessine déjà pour les treize types, avec les
  clés back/menu selon isFromMenu. La dessiner aurait affiché deux
  boutons retour.
- Un seul constructeur de marqueurs au lieu des quatre de mymuseum.
  MapAnnotationDTO et MapAnnotation portent des champs rigoureusement
  identiques mais sont deux types Dart distincts. Normalisé par une
  classe interne à deux fabriques — L5 appliqué au front, et il porte
  d'autant plus que la convention [lng, lat] est l'endroit exact où une
  divergence ne lève aucune erreur.
- L'audio d'article se résout dans contents avant l'API. ContentDTO
  porte son resource complet (idiome de marker_view), donc l'audio est
  trouvé sans appel réseau quand il est embarqué, donc hors ligne aussi.
  resourceGetDetail n'est qu'un repli ; mymuseum appelle l'API
  systématiquement en ligne.
- Nouvelle clé i18n event.live dans les 10 langues. Sans les 10,
  getFromLocale renvoie "" et la pastille rendrait une boîte vide.
  ATTENTION : PL, CN, UK et AR sont de ma main et demandent une
  relecture humaine.

Le nouveau code emploie withValues plutôt que withOpacity, déprécié —
le repo est en pleine migration (13 contre 9).

flutter analyze sur Screens/Article, Screens/Event et Helpers : zéro
issue dans les fichiers touchés. Les 2 restantes sont dans MQTTHelper,
préexistantes.

Non prouvé : le rendu. Aucun des deux écrans n'a été vu à l'œil, et un
build vert ne dit rien d'une mise en page. Aucun SectionEvent n'existe
en base, le type étant né avec Postgres v3 — c'est le §19.13 cas E qui
en créera un.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 15:20:08 +02:00
Thomas Fransolet
9f582dd8a7 Lot K : tablet-app reconstruit et rebranché sur le contrat Postgres v3
Premier vrai build depuis avril. Le diagnostic des docs — « un seul défaut,
purement Gradle, peut-être réglé par 5a6701d » — tenait parce que personne
n'avait lancé la commande.

K1 — dix crans d'outillage, chacun dicté par l'erreur du précédent :
Gradle 7.5 → 8.11.1, AGP 7.2.0 → 8.9.1, Kotlin 1.9.0 → 2.3.10,
enableUncompressedNativeLibs retirée (supprimée en AGP 8.1), jcenter → mavenCentral,
heap 1536M → 4096M, Jetifier coupé, et retrait du resolutionStrategy qui forçait
androidx.lifecycle à 2.4.0 « to fix mapbox issue » : il réglait un problème d'il y
a trois ans et causait celui d'aujourd'hui, mapbox_maps_flutter 2.21.1 appelant
setViewTreeLifecycleOwner. Les trois derniers crans étaient de simples alignements
sur mymuseum-visitapp, qui utilise le même plugin sans ces problèmes.

Le bloc buildscript commenté de android/build.gradle est supprimé : il déclarait
une config qui n'était pas celle appliquée et a fait conclure deux fois à tort.

K2 — les 132 erreurs Dart que le Gradle masquait. Trois causes : roundedValue,
isDate, isHour, isSectionImageBackground et screenPercentageSectionsMainPage ont
migré vers AppConfigurationLink ; GeoPointDTO.latitude/longitude sont devenus
geometry ; le reste en découlait. Deux bugs latents trouvés au passage :

- applicationInstanceDTO n'était assigné que si l'instance avait l'IA — il servait
  de drapeau d'assistant. Ce DTO portant désormais les AppConfigurationLink, les
  cinq réglages seraient retombés sur leurs défauts sur MDLF et le Fort, sans
  erreur ni log. Drapeau rendu explicite, en préservant le ET instance × canal.
- ConfigurationDTO.isTablet ayant disparu, le filtre des configurations tablette
  n'avait plus de source : il porte sur les liens du canal AppType.Tablet.

La formule de clé par coordonnées de geo_point_filter, dupliquée à quatre endroits
alors que les deux côtés de l'appariement doivent produire la même valeur, ne vit
plus qu'à un seul (Helpers/geo.dart). Ce fichier documente aussi les deux
conventions de coordonnées du projet : [lng, lat] pour les GeoPoint, [lat, lng]
pour les géométries de GuidedStep.

K4 — l'écran Game repris de mymuseum-visitapp, Screens/Puzzle supprimé. La tablette
gagne le puzzle glissant, le bouton d'indice et un dimensionnement au ratio de
l'image. Les couleurs, codées en dur par flavor client chez mymuseum, sont dérivées
de configuration.primaryColor : tablet-app n'a pas de flavor, un seul APK sert tous
les clients.

Reste à vérifier sur device : le rendu de l'écran Game, et l'écran de sélection de
configuration, qui sera vide si les configurations ne sont pas rattachées au canal
tablette.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 12:18:07 +02:00
Thomas Fransolet
6a23c6ab6d Suppression du déclencheur de génération du client API
lib/api/openApi.dart portait la même annotation @Openapi que son
équivalent de manager-app et mymuseum-visitapp, sous un nom de fichier
différent — ce qui lui avait permis d'échapper aux recherches sur
« openApiTest ». Importé nulle part.

Retiré au passage le résidu manager_api_new/ (un pubspec.lock seul, non
suivi par git, daté d'avril) : une génération avortée, alors que le
pubspec consomme le client de manager-app par `path:`.

Plus aucune annotation @Openapi dans les trois apps Flutter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 12:12:23 +02:00
Thomas Fransolet
5a6701dd1a Drapeaux du migrateur Flutter (builtInKotlin, newDsl)
Ajoutés automatiquement par le migrateur. Le build Gradle reste cassé
(échec sur flutter_tools/gradle/build.gradle.kts) — ces drapeaux sont
conservés pour ne pas repartir de zéro à la prochaine tentative.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:48:55 +02:00
Thomas Fransolet
2af485247d misc 2026-07-17 15:23:26 +02:00
Thomas Fransolet
6942518b4b Update Section video to support youtube, vimeo and local video (to be tested) 2026-04-17 14:14:58 +02:00
Thomas Fransolet
af1eb1ed75 Remove manager api new (as we use manager app) 2026-04-16 09:53:12 +02:00
Thomas Fransolet
8529bb2096 Get event from backend instead of local parsing (to be tested) + claude.md 2026-03-25 17:42:26 +01:00
Thomas Fransolet
da6ff5177e Add apikey ref + needed to test if ok get apikey after pin code 2026-03-13 17:41:42 +01:00
Thomas Fransolet
30d88df7b6 useless manager api new updates.. to be removed 2026-03-13 15:10:45 +01:00
Thomas Fransolet
9a46b443b6 Add stats and ia assistant (to be tested!) 2026-03-13 15:09:23 +01:00
Thomas Fransolet
1fddd6363f clean machine 2025-06-04 10:56:40 +02:00
Thomas Fransolet
d5861f7f1e Fix rpi5 issue 2025-06-04 09:31:53 +02:00
Thomas Fransolet
50e2fc393f wip version 3.0 2025-05-27 16:20:29 +02:00
Thomas Fransolet
0cd2b47211 WIP Version 3.0 2025-05-23 17:07:04 +02:00
Thomas Fransolet
a045fe51e9 init version 2.1.5 2024-12-05 17:03:31 +01:00
Thomas Fransolet
dc50a36033 appbundle 2024-12-05 16:50:59 +01:00
Thomas Fransolet
59d2fcbe51 update description size + fix some bug 2024-12-05 16:50:59 +01:00
Fransolet Thomas
4e19869aee after ios build 2024-10-17 14:28:51 +02:00
Thomas Fransolet
8bfa73784a init version 2.1.4 2024-08-30 16:36:31 +02:00
Thomas Fransolet
e28b0a9e8b update name 2024-08-30 16:34:43 +02:00
Thomas Fransolet
53affeb814 Fix filter not working for cat children 2024-08-30 16:28:51 +02:00
Thomas Fransolet
ce390331e2 Added permission storage (android 9.0) 2024-08-30 16:16:53 +02:00
Thomas Fransolet
78ac0788c4 init 2.1.3 2024-08-23 11:46:44 +02:00
Thomas Fransolet
2953c769f7 Added load local cert + misc map 2024-08-23 11:44:34 +02:00
Thomas Fransolet
dfa3cc6458 Fix map bug 2024-08-16 17:58:49 +02:00
Thomas Fransolet
8f6913407c Added new flutter map view (based on web) 2024-08-09 16:10:37 +02:00
Thomas Fransolet
192c893219 update to package_info_plus 2024-08-08 09:08:45 +02:00
Thomas Fransolet
a8ee72c11b Fix some issues (map search + video) 2024-08-08 08:46:59 +02:00
Thomas Fransolet
67dc2cd743 plugin ref update (gradle and kotlin..) 2024-08-08 08:45:55 +02:00
Thomas Fransolet
6251e76f43 init version 2024-07-15 16:09:20 +02:00
Thomas Fransolet
cc4aed859d Updated icons + playstore icons 2024-07-15 16:08:08 +02:00
Thomas Fransolet
4035e50190 Prevent wrong data for agenda + add translations for month filter 2024-07-10 14:53:55 +02:00
Thomas Fransolet
5885053ea9 app version + update targetSdk 2024-07-10 08:18:09 +02:00
Thomas Fransolet
db25416b50 update for play store submission 2024-07-09 14:16:46 +02:00
Thomas Fransolet
8e16fc840c Try fix submission issue 2024-07-09 12:57:40 +02:00
Thomas Fransolet
46467800ea clean repo + update bundle id 2024-07-08 17:06:06 +02:00
Thomas Fransolet
eef34bb935 Init version 2.0.9 2024-07-03 16:54:12 +02:00
Thomas Fransolet
a1e5a392e6 updated break point 2024-07-03 16:45:21 +02:00
Thomas Fransolet
b9215588b9 Updated price zone height 2024-07-03 16:42:50 +02:00
Thomas Fransolet
dee2dd480a Updated size 2024-07-03 16:39:50 +02:00
Thomas Fransolet
da557503fc Update price layout in marker view 2024-07-03 16:22:11 +02:00
Fransolet Thomas
89aeb4086f init version 2.0.8 2024-06-21 22:11:46 +02:00
Fransolet Thomas
d364a412f9 Update after ios test 2024-06-21 22:02:26 +02:00
Thomas Fransolet
7cffe9db6c Add copy carousel + update many packages.. + linked changes + update price position (geopoint) 2024-06-21 16:40:31 +02:00
Thomas Fransolet
fea8e11236 Merge branch 'Version-2.0.6' into Version-2.0.7
# Conflicts:
#	pubspec.yaml
2024-04-24 17:30:01 +02:00
Thomas Fransolet
e676220453 init version 2.0.7 2024-04-24 17:29:28 +02:00