Cette mise à jour structurelle améliore la classification des équipements en introduisant la notion de sous-catégories et supprime la gestion directe de l'appartenance d'un équipement à une boîte (`parentBoxIds`). L'appartenance est désormais uniquement définie côté conteneur. Une nouvelle catégorie "Régie / Backline" est également ajoutée.
**Changements majeurs :**
- **Suppression de `parentBoxIds` sur `EquipmentModel` :**
- Le champ `parentBoxIds` a été retiré du modèle de données `EquipmentModel` et de toutes les logiques associées (création, mise à jour, copie).
- La responsabilité de lier un équipement à un conteneur est désormais exclusivement gérée par le `ContainerModel` via sa liste `equipmentIds`.
- La logique de synchronisation complexe dans `EquipmentFormPage` qui mettait à jour les conteneurs lors de la modification d'un équipement a été entièrement supprimée, simplifiant considérablement le code.
- Le sélecteur de boîtes parentes (`ParentBoxesSelector`) a été retiré du formulaire d'équipement.
- **Ajout des sous-catégories :**
- Un champ optionnel `subCategory` (String) a été ajouté au `EquipmentModel`.
- Le formulaire de création/modification d'équipement inclut désormais un nouveau champ "Sous-catégorie" avec autocomplétion.
- Ce champ est contextuel : il propose des suggestions basées sur les sous-catégories existantes pour la catégorie principale sélectionnée (ex: "Console", "Micro" pour la catégorie "Son").
- La sous-catégorie est maintenant affichée sur les fiches de détail des équipements et dans les listes de la page de gestion, améliorant la visibilité du classement.
**Nouvelle catégorie d'équipement :**
- Une nouvelle catégorie `backline` ("Régie / Backline") a été ajoutée à `EquipmentCategory` avec une icône (`Icons.piano`) et une couleur associée.
**Refactorisation et nettoyage :**
- Le `EquipmentProvider` et `EquipmentService` ont été mis à jour pour charger et filtrer les sous-catégories.
- De nombreuses instanciations d'un `EquipmentModel` vide (`dummy`) à travers l'application ont été nettoyées pour retirer la référence à `parentBoxIds`.
- **Version de l'application :**
- La version a été incrémentée à `1.0.4`.
115 lines
3.2 KiB
Dart
115 lines
3.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:em2rp/utils/colors.dart';
|
|
import 'package:em2rp/models/equipment_model.dart';
|
|
|
|
/// Widget pour afficher un équipement dans la liste d'un container
|
|
class ContainerEquipmentTile extends StatelessWidget {
|
|
final EquipmentModel equipment;
|
|
final VoidCallback onView;
|
|
final VoidCallback onRemove;
|
|
|
|
const ContainerEquipmentTile({
|
|
super.key,
|
|
required this.equipment,
|
|
required this.onView,
|
|
required this.onRemove,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return ListTile(
|
|
contentPadding: const EdgeInsets.symmetric(vertical: 8),
|
|
leading: CircleAvatar(
|
|
backgroundColor: AppColors.rouge.withOpacity(0.1),
|
|
child: const Icon(Icons.inventory_2, color: AppColors.rouge),
|
|
),
|
|
title: Text(
|
|
equipment.id,
|
|
style: const TextStyle(fontWeight: FontWeight.bold),
|
|
),
|
|
subtitle: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
if (equipment.brand != null || equipment.model != null)
|
|
Text('${equipment.brand ?? ''} ${equipment.model ?? ''}'),
|
|
const SizedBox(height: 4),
|
|
Row(
|
|
children: [
|
|
_buildSmallBadge(
|
|
_getCategoryLabel(equipment.category),
|
|
Colors.blue,
|
|
),
|
|
const SizedBox(width: 8),
|
|
if (equipment.weight != null)
|
|
_buildSmallBadge(
|
|
'${equipment.weight} kg',
|
|
Colors.grey,
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
trailing: Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
IconButton(
|
|
icon: const Icon(Icons.visibility, size: 20),
|
|
tooltip: 'Voir détails',
|
|
onPressed: onView,
|
|
),
|
|
IconButton(
|
|
icon: const Icon(Icons.remove_circle, color: Colors.red, size: 20),
|
|
tooltip: 'Retirer',
|
|
onPressed: onRemove,
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildSmallBadge(String label, Color color) {
|
|
return Container(
|
|
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
|
|
decoration: BoxDecoration(
|
|
color: color.withOpacity(0.1),
|
|
borderRadius: BorderRadius.circular(12),
|
|
border: Border.all(color: color.withOpacity(0.3)),
|
|
),
|
|
child: Text(
|
|
label,
|
|
style: TextStyle(
|
|
fontSize: 11,
|
|
color: color,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
String _getCategoryLabel(EquipmentCategory category) {
|
|
switch (category) {
|
|
case EquipmentCategory.lighting:
|
|
return 'Lumière';
|
|
case EquipmentCategory.sound:
|
|
return 'Son';
|
|
case EquipmentCategory.video:
|
|
return 'Vidéo';
|
|
case EquipmentCategory.effect:
|
|
return 'Effets';
|
|
case EquipmentCategory.structure:
|
|
return 'Structure';
|
|
case EquipmentCategory.consumable:
|
|
return 'Consommable';
|
|
case EquipmentCategory.cable:
|
|
return 'Câble';
|
|
case EquipmentCategory.vehicle:
|
|
return 'Véhicule';
|
|
case EquipmentCategory.backline:
|
|
return 'Régie / Backline';
|
|
case EquipmentCategory.other:
|
|
return 'Autre';
|
|
}
|
|
}
|
|
}
|
|
|