From 1ea5cea6fc42a645968cfd5029f15218b48be0a2 Mon Sep 17 00:00:00 2001 From: ElPoyo Date: Fri, 16 Jan 2026 00:42:16 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20Am=C3=A9lioration=20de=20l'exp=C3=A9rien?= =?UTF-8?q?ce=20utilisateur=20lors=20de=20la=20g=C3=A9n=C3=A9ration=20de?= =?UTF-8?q?=20QR=20codes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cette mise à jour améliore la génération de QR codes pour les équipements et les containers en ajoutant un retour visuel à l'utilisateur et une gestion des erreurs plus robuste. **Changements :** - **Ajout d'un indicateur de chargement :** Un `CircularProgressIndicator` est désormais affiché pendant que les données des équipements ou des containers sélectionnés sont récupérées, informant l'utilisateur qu'une opération est en cours. - **Gestion des erreurs :** Un bloc `try...catch` a été ajouté autour de la logique de génération dans les pages de gestion des équipements (`EquipmentManagementPage`) et des containers (`ContainerManagementPage`). - **Affichage des erreurs :** En cas d'échec, le chargement est stoppé et une `SnackBar` rouge apparaît pour notifier l'utilisateur de l'erreur, améliorant ainsi la robustesse de la fonctionnalité. --- .../lib/views/container_management_page.dart | 104 ++++++++++++------ .../lib/views/equipment_management_page.dart | 92 +++++++++++----- 2 files changed, 132 insertions(+), 64 deletions(-) diff --git a/em2rp/lib/views/container_management_page.dart b/em2rp/lib/views/container_management_page.dart index 61b6825..f5c07cf 100644 --- a/em2rp/lib/views/container_management_page.dart +++ b/em2rp/lib/views/container_management_page.dart @@ -473,49 +473,81 @@ class _ContainerManagementPageState extends State Future _generateQRCodesForSelected() async { if (!hasSelection) return; - // Récupérer les containers sélectionnés - final containerProvider = context.read(); - final List selectedContainers = []; - final Map> containerEquipmentMap = {}; + // Afficher un indicateur de chargement + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => const Center( + child: CircularProgressIndicator(color: AppColors.rouge), + ), + ); - for (final id in selectedIds) { - final container = await containerProvider.getContainerById(id); - if (container != null) { - selectedContainers.add(container); - // Charger les équipements pour ce container - final equipment = await containerProvider.getContainerEquipment(id); - containerEquipmentMap[id] = equipment; + try { + // Récupérer les containers sélectionnés + final containerProvider = context.read(); + final List selectedContainers = []; + final Map> containerEquipmentMap = {}; + + for (final id in selectedIds) { + final container = await containerProvider.getContainerById(id); + if (container != null) { + selectedContainers.add(container); + // Charger les équipements pour ce container + final equipment = await containerProvider.getContainerEquipment(id); + containerEquipmentMap[id] = equipment; + } } - } - if (selectedContainers.isEmpty) { + // Fermer l'indicateur de chargement if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Aucun container trouvé')), + Navigator.of(context).pop(); + } + + if (selectedContainers.isEmpty) { + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Aucun container trouvé')), + ); + } + return; + } + + // Afficher le dialogue de sélection de format avec le widget générique + if (mounted) { + showDialog( + context: context, + builder: (context) => QRCodeFormatSelectorDialog( + itemList: selectedContainers, + getId: (c) => c.id, + getTitle: (c) => c.name, + getDetails: (ContainerModel c) { + final equipment = containerEquipmentMap[c.id] ?? []; + return [ + 'Contenu (${equipment.length}):', + ...equipment.take(5).map((eq) => '- ${eq.id}'), + if (equipment.length > 5) '... +${equipment.length - 5}', + ]; + }, + dialogTitle: 'Générer ${selectedContainers.length} QR Code(s)', + ), ); } - return; - } + } catch (e) { + // Fermer l'indicateur si une erreur survient + if (mounted) { + Navigator.of(context).pop(); + } - // Afficher le dialogue de sélection de format avec le widget générique - if (mounted) { - showDialog( - context: context, - builder: (context) => QRCodeFormatSelectorDialog( - itemList: selectedContainers, - getId: (c) => c.id, - getTitle: (c) => c.name, - getDetails: (ContainerModel c) { - final equipment = containerEquipmentMap[c.id] ?? []; - return [ - 'Contenu (${equipment.length}):', - ...equipment.take(5).map((eq) => '- ${eq.id}'), - if (equipment.length > 5) '... +${equipment.length - 5}', - ]; - }, - dialogTitle: 'Générer ${selectedContainers.length} QR Code(s)', - ), - ); + DebugLog.error('[ContainerManagementPage] Error generating QR codes', e); + + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Erreur lors de la génération : ${e.toString()}'), + backgroundColor: Colors.red, + ), + ); + } } } diff --git a/em2rp/lib/views/equipment_management_page.dart b/em2rp/lib/views/equipment_management_page.dart index dbb83ae..5a2c9d8 100644 --- a/em2rp/lib/views/equipment_management_page.dart +++ b/em2rp/lib/views/equipment_management_page.dart @@ -791,39 +791,75 @@ class _EquipmentManagementPageState extends State void _generateQRCodesForSelected() async { if (!hasSelection) return; - // Récupérer les équipements sélectionnés - final provider = context.read(); - final List selectedEquipment = []; + // Afficher un indicateur de chargement + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => const Center( + child: CircularProgressIndicator(color: AppColors.rouge), + ), + ); - // On doit récupérer les équipements depuis le stream - await for (final equipmentList in provider.equipmentStream.take(1)) { - for (final equipment in equipmentList) { - if (isItemSelected(equipment.id)) { - selectedEquipment.add(equipment); + try { + // Récupérer les équipements sélectionnés + final provider = context.read(); + final List selectedEquipment = []; + + // On doit récupérer les équipements depuis le stream + await for (final equipmentList in provider.equipmentStream.take(1)) { + for (final equipment in equipmentList) { + if (isItemSelected(equipment.id)) { + selectedEquipment.add(equipment); + } + } + break; + } + + // Fermer l'indicateur de chargement + if (mounted) { + Navigator.of(context).pop(); + } + + if (selectedEquipment.isEmpty) return; + + if (selectedEquipment.length == 1) { + // Un seul équipement : afficher le dialogue simple + if (mounted) { + showDialog( + context: context, + builder: (context) => QRCodeDialog.forEquipment(selectedEquipment.first), + ); + } + } else { + // Plusieurs équipements : afficher le sélecteur de format + if (mounted) { + showDialog( + context: context, + builder: (context) => QRCodeFormatSelectorDialog( + itemList: selectedEquipment, + getId: (eq) => eq.id, + getTitle: (eq) => '${eq.brand ?? ''} ${eq.model ?? ''}'.trim(), + dialogTitle: 'Générer ${selectedEquipment.length} QR Code(s)', + ), + ); } } - break; - } + } catch (e) { + // Fermer l'indicateur si une erreur survient + if (mounted) { + Navigator.of(context).pop(); + } - if (selectedEquipment.isEmpty) return; + DebugLog.error('[EquipmentManagementPage] Error generating QR codes', e); - if (selectedEquipment.length == 1) { - // Un seul équipement : afficher le dialogue simple - showDialog( - context: context, - builder: (context) => QRCodeDialog.forEquipment(selectedEquipment.first), - ); - } else { - // Plusieurs équipements : afficher le sélecteur de format - showDialog( - context: context, - builder: (context) => QRCodeFormatSelectorDialog( - itemList: selectedEquipment, - getId: (eq) => eq.id, - getTitle: (eq) => '${eq.brand ?? ''} ${eq.model ?? ''}'.trim(), - dialogTitle: 'Générer ${selectedEquipment.length} QR Code(s)', - ), - ); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Erreur lors de la génération : ${e.toString()}'), + backgroundColor: Colors.red, + ), + ); + } } }