feat: Enhance container management UI with new management components and improved QR code generation flow

This commit is contained in:
ElPoyo
2025-10-30 20:06:13 +01:00
parent 6abb8f1d14
commit e59e3e6316
11 changed files with 815 additions and 485 deletions

View File

@@ -11,6 +11,7 @@ import 'package:em2rp/views/equipment_detail_page.dart';
import 'package:em2rp/views/widgets/common/qr_code_dialog.dart';
import 'package:em2rp/views/widgets/common/qr_code_format_selector_dialog.dart';
import 'package:em2rp/mixins/selection_mode_mixin.dart';
import 'package:em2rp/views/widgets/management/management_list.dart';
class EquipmentManagementPage extends StatefulWidget {
const EquipmentManagementPage({super.key});
@@ -418,61 +419,19 @@ class _EquipmentManagementPageState extends State<EquipmentManagementPage>
Widget _buildEquipmentList() {
return Consumer<EquipmentProvider>(
builder: (context, provider, child) {
return StreamBuilder<List<EquipmentModel>>(
return ManagementList<EquipmentModel>(
stream: provider.equipmentStream,
builder: (context, snapshot) {
// Mettre en cache les données quand elles arrivent
if (snapshot.hasData) {
_cachedEquipment = snapshot.data;
}
// Afficher le loader seulement si on n'a pas encore de cache
if (snapshot.connectionState == ConnectionState.waiting && _cachedEquipment == null) {
return const Center(child: CircularProgressIndicator());
}
if (snapshot.hasError) {
return Center(
child: Text('Erreur: ${snapshot.error}'),
);
}
// Utiliser le cache si disponible, sinon les nouvelles données
final equipment = _cachedEquipment ?? snapshot.data ?? [];
if (equipment.isEmpty) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.inventory_2_outlined,
size: 64, color: Colors.grey[400]),
const SizedBox(height: 16),
Text(
'Aucun équipement trouvé',
style: TextStyle(fontSize: 18, color: Colors.grey[600]),
),
const SizedBox(height: 8),
Text(
'Ajoutez votre premier équipement',
style: TextStyle(fontSize: 14, color: Colors.grey[500]),
),
],
),
);
}
// Créer une copie pour le tri
final sortedEquipment = List<EquipmentModel>.from(equipment);
cachedItems: _cachedEquipment,
emptyMessage: 'Aucun équipement trouvé',
emptyIcon: Icons.inventory_2_outlined,
onDataReceived: (items) {
_cachedEquipment = items;
},
itemBuilder: (equipment) {
// Trier les équipements par nom
final sortedEquipment = List<EquipmentModel>.from(_cachedEquipment ?? [equipment]);
sortedEquipment.sort((a, b) => a.name.compareTo(b.name));
return ListView.builder(
padding: const EdgeInsets.all(16),
itemCount: sortedEquipment.length,
itemBuilder: (context, index) {
return _buildEquipmentCard(sortedEquipment[index]);
},
);
return _buildEquipmentCard(equipment);
},
);
},
@@ -804,8 +763,11 @@ class _EquipmentManagementPageState extends State<EquipmentManagementPage>
// Plusieurs équipements : afficher le sélecteur de format
showDialog(
context: context,
builder: (context) => QRCodeFormatSelectorDialog(
equipmentList: selectedEquipment,
builder: (context) => QRCodeFormatSelectorDialog<EquipmentModel>(
itemList: selectedEquipment,
getId: (eq) => eq.id,
getTitle: (eq) => '${eq.brand ?? ''} ${eq.model ?? ''}'.trim(),
dialogTitle: 'Générer ${selectedEquipment.length} QR Code(s)',
),
);
}