From 0f5b087eb7dbc608dc7e200b4578e105775f2821 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 21 Oct 2026 00:03:42 +0200 Subject: [PATCH] =?UTF-8?q?Auto=20NBA=20:=20un=20seul=20dialogue=20de=20r?= =?UTF-8?q?=C3=A9glages,=20chargement=20visible?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La liste des chaînes se chargeait sans retour visuel : chaque clic sur Réglages ouvrait un dialogue de plus. Enregistrer celui du dessus découvrait l'ancienne sélection en dessous, et l'enregistrer à son tour rétablissait l'ancien choix de chaînes. Le bouton est désactivé pendant le chargement, comme « Rafraîchir maintenant », et affiche le petit indicateur des onglets Films et Séries (16 × 16, trait 2, AppColors.onSurface). Vérifié par un agent distinct, après calibration sur une copie portant une différence plantée. Aucun SDK Flutter sur cette machine : rien n'est compilé ni rendu ici, la CI compile. Co-Authored-By: Claude Opus 5.5 --- lib/features/iptv/widgets/recordings_tab.dart | 40 ++++++++++++++----- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/lib/features/iptv/widgets/recordings_tab.dart b/lib/features/iptv/widgets/recordings_tab.dart index eade6c7..57161a5 100644 --- a/lib/features/iptv/widgets/recordings_tab.dart +++ b/lib/features/iptv/widgets/recordings_tab.dart @@ -1768,6 +1768,10 @@ class _AutoNbaViewState extends State<_AutoNbaView> { bool _busy = false; String? _error; bool _showOffBein = false; + // Liste des chaînes en cours de chargement avant l'ouverture des réglages : + // sans ce verrou, chaque clic ouvrait un dialogue de plus, et enregistrer + // celui du dessus découvrait l'ancienne sélection en dessous. + bool _openingSettings = false; // Dernier diagnostic serveur : source, diffusions, chaînes reliées. Map? _diag; @@ -1936,13 +1940,18 @@ class _AutoNbaViewState extends State<_AutoNbaView> { Future _showSettings() async { final rule = _rule; - if (rule == null) return; + if (rule == null || _openingSettings) return; + setState(() => _openingSettings = true); List channels = []; - final r = await AuthedHttp.get( - Uri.parse('/api/auto-rules/${rule['id']}/channels'), - ); - if (r.statusCode == 200) { - channels = json.decode(r.body)['channels'] as List; + try { + final r = await AuthedHttp.get( + Uri.parse('/api/auto-rules/${rule['id']}/channels'), + ); + if (r.statusCode == 200) { + channels = json.decode(r.body)['channels'] as List; + } + } finally { + if (mounted) setState(() => _openingSettings = false); } if (!mounted) return; @@ -2485,12 +2494,21 @@ class _AutoNbaViewState extends State<_AutoNbaView> { onPressed: _busy ? null : _refreshNow, ), IconButton( - icon: const Icon( - Icons.tune, - color: AppColors.onSurfaceVariant, - ), + icon: _openingSettings + ? const SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator( + strokeWidth: 2, + color: AppColors.onSurface, + ), + ) + : const Icon( + Icons.tune, + color: AppColors.onSurfaceVariant, + ), tooltip: 'Réglages', - onPressed: _showSettings, + onPressed: _openingSettings ? null : _showSettings, ), ], ],