refactor: Ajout des sous-catégories et refonte de la gestion de l'appartenance
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`.
This commit is contained in:
66
em2rp/lib/views/equipment_form/subcategory_selector.dart
Normal file
66
em2rp/lib/views/equipment_form/subcategory_selector.dart
Normal file
@@ -0,0 +1,66 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:em2rp/models/equipment_model.dart';
|
||||
|
||||
/// Widget de sélection de sous-catégorie avec autocomplétion
|
||||
/// Similaire au système Brand/Model mais filtré par catégorie
|
||||
class SubCategorySelector extends StatelessWidget {
|
||||
final TextEditingController controller;
|
||||
final EquipmentCategory? selectedCategory;
|
||||
final List<String> filteredSubCategories;
|
||||
final ValueChanged<String?>? onChanged;
|
||||
|
||||
const SubCategorySelector({
|
||||
super.key,
|
||||
required this.controller,
|
||||
required this.selectedCategory,
|
||||
required this.filteredSubCategories,
|
||||
this.onChanged,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Autocomplete<String>(
|
||||
initialValue: TextEditingValue(text: controller.text),
|
||||
optionsBuilder: (TextEditingValue textEditingValue) {
|
||||
if (selectedCategory == null) {
|
||||
return const Iterable<String>.empty();
|
||||
}
|
||||
if (textEditingValue.text.isEmpty) {
|
||||
return filteredSubCategories;
|
||||
}
|
||||
return filteredSubCategories.where((String subCategory) {
|
||||
return subCategory.toLowerCase().contains(
|
||||
textEditingValue.text.toLowerCase(),
|
||||
);
|
||||
});
|
||||
},
|
||||
onSelected: (String selection) {
|
||||
controller.text = selection;
|
||||
onChanged?.call(selection);
|
||||
},
|
||||
fieldViewBuilder: (context, fieldController, focusNode, onEditingComplete) {
|
||||
if (fieldController.text != controller.text) {
|
||||
fieldController.text = controller.text;
|
||||
}
|
||||
return TextFormField(
|
||||
controller: fieldController,
|
||||
focusNode: focusNode,
|
||||
enabled: selectedCategory != null,
|
||||
decoration: InputDecoration(
|
||||
labelText: 'Sous-catégorie',
|
||||
border: const OutlineInputBorder(),
|
||||
prefixIcon: const Icon(Icons.category_outlined),
|
||||
hintText: selectedCategory == null
|
||||
? 'Catégorie requise'
|
||||
: 'Saisissez la sous-catégorie',
|
||||
helperText: 'Optionnel - Permet un classement plus précis',
|
||||
),
|
||||
onChanged: (value) {
|
||||
controller.text = value;
|
||||
onChanged?.call(value.isNotEmpty ? value : null);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user