feat: mise à jour de la version à 1.1.18 et amélioration de la page calendrier avec ajout de la fonctionnalité de rafraîchissement des événements
This commit is contained in:
@@ -6,11 +6,8 @@ import 'package:em2rp/models/equipment_model.dart';
|
||||
import 'package:em2rp/models/container_model.dart';
|
||||
import 'package:em2rp/providers/equipment_provider.dart';
|
||||
import 'package:em2rp/providers/container_provider.dart';
|
||||
import 'package:em2rp/services/data_service.dart';
|
||||
import 'package:em2rp/services/api_service.dart';
|
||||
import 'package:em2rp/utils/colors.dart';
|
||||
import 'package:em2rp/views/widgets/event/equipment_selection_dialog.dart';
|
||||
import 'package:em2rp/services/event_availability_service.dart';
|
||||
|
||||
/// Section pour afficher et gérer le matériel assigné à un événement
|
||||
class EventAssignedEquipmentSection extends StatefulWidget {
|
||||
@@ -37,8 +34,6 @@ class EventAssignedEquipmentSection extends StatefulWidget {
|
||||
|
||||
class _EventAssignedEquipmentSectionState extends State<EventAssignedEquipmentSection> {
|
||||
bool get _canAddMaterial => widget.startDate != null && widget.endDate != null;
|
||||
final EventAvailabilityService _availabilityService = EventAvailabilityService();
|
||||
final DataService _dataService = DataService(FirebaseFunctionsApiService());
|
||||
final Map<String, EquipmentModel> _equipmentCache = {};
|
||||
final Map<String, ContainerModel> _containerCache = {};
|
||||
bool _isLoading = true;
|
||||
@@ -66,97 +61,53 @@ class _EventAssignedEquipmentSectionState extends State<EventAssignedEquipmentSe
|
||||
final equipmentProvider = context.read<EquipmentProvider>();
|
||||
final containerProvider = context.read<ContainerProvider>();
|
||||
|
||||
// 🔧 FIX: Si on a un eventId, utiliser getEventWithDetails pour charger les données complètes
|
||||
if (widget.eventId != null && widget.eventId!.isNotEmpty) {
|
||||
DebugLog.info('[EventAssignedEquipmentSection] Loading event with details: ${widget.eventId}');
|
||||
DebugLog.info('[EventAssignedEquipmentSection] Loading caches from assigned lists');
|
||||
|
||||
final result = await _dataService.getEventWithDetails(widget.eventId!);
|
||||
final equipmentsMap = result['equipments'] as Map<String, dynamic>;
|
||||
final containersMap = result['containers'] as Map<String, dynamic>;
|
||||
// Toujours partir des données locales du formulaire pour éviter les décalages visuels.
|
||||
final equipmentIds = widget.assignedEquipment.map((eq) => eq.equipmentId).toList();
|
||||
final containers = await containerProvider.getContainersByIds(widget.assignedContainers);
|
||||
|
||||
DebugLog.info('[EventAssignedEquipmentSection] Loaded ${equipmentsMap.length} equipments and ${containersMap.length} containers with details');
|
||||
final childEquipmentIds = <String>[];
|
||||
for (final container in containers) {
|
||||
childEquipmentIds.addAll(container.equipmentIds);
|
||||
}
|
||||
|
||||
// Construire les caches à partir des données reçues
|
||||
_equipmentCache.clear();
|
||||
_containerCache.clear();
|
||||
final allEquipmentIds = <String>{...equipmentIds, ...childEquipmentIds}.toList();
|
||||
final equipment = await equipmentProvider.getEquipmentsByIds(allEquipmentIds);
|
||||
|
||||
// Remplir le cache d'équipements
|
||||
equipmentsMap.forEach((id, data) {
|
||||
try {
|
||||
_equipmentCache[id] = EquipmentModel.fromMap(data as Map<String, dynamic>, id);
|
||||
} catch (e) {
|
||||
DebugLog.error('[EventAssignedEquipmentSection] Error parsing equipment $id', e);
|
||||
}
|
||||
});
|
||||
_equipmentCache.clear();
|
||||
_containerCache.clear();
|
||||
|
||||
// Remplir le cache de containers
|
||||
containersMap.forEach((id, data) {
|
||||
try {
|
||||
_containerCache[id] = ContainerModel.fromMap(data as Map<String, dynamic>, id);
|
||||
} catch (e) {
|
||||
DebugLog.error('[EventAssignedEquipmentSection] Error parsing container $id', e);
|
||||
}
|
||||
});
|
||||
for (final eq in widget.assignedEquipment) {
|
||||
final equipmentItem = equipment.firstWhere(
|
||||
(e) => e.id == eq.equipmentId,
|
||||
orElse: () => EquipmentModel(
|
||||
id: eq.equipmentId,
|
||||
name: 'Équipement inconnu',
|
||||
category: EquipmentCategory.other,
|
||||
status: EquipmentStatus.available,
|
||||
maintenanceIds: [],
|
||||
createdAt: DateTime.now(),
|
||||
updatedAt: DateTime.now(),
|
||||
),
|
||||
);
|
||||
_equipmentCache[eq.equipmentId] = equipmentItem;
|
||||
}
|
||||
|
||||
DebugLog.info('[EventAssignedEquipmentSection] Caches populated: ${_equipmentCache.length} equipments, ${_containerCache.length} containers');
|
||||
|
||||
} else {
|
||||
// Mode création d'événement : charger via les providers
|
||||
DebugLog.info('[EventAssignedEquipmentSection] Loading via providers (creation mode)');
|
||||
|
||||
// Extraire les IDs des équipements assignés
|
||||
final equipmentIds = widget.assignedEquipment
|
||||
.map((eq) => eq.equipmentId)
|
||||
.toList();
|
||||
|
||||
// Charger les conteneurs
|
||||
final containers = await containerProvider.getContainersByIds(widget.assignedContainers);
|
||||
|
||||
// Extraire les IDs des équipements enfants des containers
|
||||
final childEquipmentIds = <String>[];
|
||||
for (var container in containers) {
|
||||
childEquipmentIds.addAll(container.equipmentIds);
|
||||
}
|
||||
|
||||
// Combiner les IDs des équipements assignés + enfants des containers
|
||||
final allEquipmentIds = <String>{...equipmentIds, ...childEquipmentIds}.toList();
|
||||
|
||||
// Charger TOUS les équipements nécessaires
|
||||
final equipment = await equipmentProvider.getEquipmentsByIds(allEquipmentIds);
|
||||
|
||||
// Créer le cache des équipements
|
||||
for (var eq in widget.assignedEquipment) {
|
||||
final equipmentItem = equipment.firstWhere(
|
||||
(e) => e.id == eq.equipmentId,
|
||||
orElse: () => EquipmentModel(
|
||||
id: eq.equipmentId,
|
||||
name: 'Équipement inconnu',
|
||||
category: EquipmentCategory.other,
|
||||
status: EquipmentStatus.available,
|
||||
maintenanceIds: [],
|
||||
createdAt: DateTime.now(),
|
||||
updatedAt: DateTime.now(),
|
||||
),
|
||||
);
|
||||
_equipmentCache[eq.equipmentId] = equipmentItem;
|
||||
}
|
||||
|
||||
// Créer le cache des conteneurs
|
||||
for (var containerId in widget.assignedContainers) {
|
||||
final container = containers.firstWhere(
|
||||
(c) => c.id == containerId,
|
||||
orElse: () => ContainerModel(
|
||||
id: containerId,
|
||||
name: 'Conteneur inconnu',
|
||||
type: ContainerType.flightCase,
|
||||
status: EquipmentStatus.available,
|
||||
equipmentIds: [],
|
||||
updatedAt: DateTime.now(),
|
||||
createdAt: DateTime.now(),
|
||||
),
|
||||
);
|
||||
_containerCache[containerId] = container;
|
||||
}
|
||||
for (final containerId in widget.assignedContainers) {
|
||||
final container = containers.firstWhere(
|
||||
(c) => c.id == containerId,
|
||||
orElse: () => ContainerModel(
|
||||
id: containerId,
|
||||
name: 'Conteneur inconnu',
|
||||
type: ContainerType.flightCase,
|
||||
status: EquipmentStatus.available,
|
||||
equipmentIds: [],
|
||||
updatedAt: DateTime.now(),
|
||||
createdAt: DateTime.now(),
|
||||
),
|
||||
);
|
||||
_containerCache[containerId] = container;
|
||||
}
|
||||
} catch (e) {
|
||||
DebugLog.error('[EventAssignedEquipmentSection] Error loading equipment and containers', e);
|
||||
@@ -262,9 +213,6 @@ class _EventAssignedEquipmentSectionState extends State<EventAssignedEquipmentSe
|
||||
|
||||
// Notifier le changement
|
||||
widget.onChanged(updatedEquipment, updatedContainers);
|
||||
|
||||
// Recharger le cache
|
||||
await _loadEquipmentAndContainers();
|
||||
}
|
||||
|
||||
void _removeEquipment(String equipmentId) {
|
||||
@@ -519,7 +467,14 @@ class _EventAssignedEquipmentSectionState extends State<EventAssignedEquipmentSe
|
||||
|
||||
Widget _buildContainerItem(ContainerModel? container) {
|
||||
if (container == null) {
|
||||
return const SizedBox.shrink();
|
||||
return const Card(
|
||||
margin: EdgeInsets.only(bottom: 8),
|
||||
child: ListTile(
|
||||
leading: Icon(Icons.inventory_2, color: Colors.grey),
|
||||
title: Text('Conteneur inconnu'),
|
||||
subtitle: Text('Données du conteneur indisponibles'),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
return Card(
|
||||
@@ -609,7 +564,24 @@ class _EventAssignedEquipmentSectionState extends State<EventAssignedEquipmentSe
|
||||
|
||||
Widget _buildEquipmentItem(EquipmentModel? equipment, EventEquipment eventEq) {
|
||||
if (equipment == null) {
|
||||
return const SizedBox.shrink();
|
||||
return Card(
|
||||
margin: const EdgeInsets.only(bottom: 8),
|
||||
child: ListTile(
|
||||
leading: const CircleAvatar(
|
||||
backgroundColor: Color(0xFFE0E0E0),
|
||||
child: Icon(Icons.inventory_2, color: Colors.grey),
|
||||
),
|
||||
title: Text(
|
||||
eventEq.equipmentId,
|
||||
style: const TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
subtitle: const Text('Équipement indisponible dans le cache local'),
|
||||
trailing: IconButton(
|
||||
icon: const Icon(Icons.delete, color: Colors.red),
|
||||
onPressed: () => _removeEquipment(eventEq.equipmentId),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
final isConsumable = equipment.category == EquipmentCategory.consumable ||
|
||||
|
||||
Reference in New Issue
Block a user