feat: Enhance container management UI with new management components and improved QR code generation flow
This commit is contained in:
@@ -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)',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user