76 lines
2.3 KiB
Dart
76 lines
2.3 KiB
Dart
import "package:flutter/material.dart";
|
|
import "../demo_identity.dart";
|
|
|
|
/// Représentation d'un matériel affiché dans le catalogue et son détail
|
|
/// à partir des réponses API.
|
|
class MaterielItem {
|
|
const MaterielItem({
|
|
required this.id,
|
|
required this.nom,
|
|
required this.categorie,
|
|
required this.marque,
|
|
required this.modele,
|
|
required this.reference,
|
|
required this.campus,
|
|
required this.etatGeneral,
|
|
required this.disponible,
|
|
required this.accessoires,
|
|
required this.icon,
|
|
});
|
|
|
|
/// Construit un MaterielItem depuis la réponse JSON du catalogue.
|
|
/// Les champs non fournis par cet endpoint (accessoires, icône) sont complétés.
|
|
factory MaterielItem.fromJson(Map<String, dynamic> json) {
|
|
final categorie = (json["categorie"] as Map<String, dynamic>)["nom"] as String;
|
|
final campus = json["campus"] as Map<String, dynamic>?;
|
|
final accessoires = json["accessoires"] as List<dynamic>?;
|
|
return MaterielItem(
|
|
id: json["id"] as int,
|
|
nom: json["nom"] as String,
|
|
categorie: categorie,
|
|
marque: json["marque"] as String,
|
|
modele: json["modele"] as String,
|
|
reference: json["reference"] as String,
|
|
campus: campus == null
|
|
? DemoIdentity.campusTag
|
|
: "${campus["nom"]} · ${campus["ville"]}",
|
|
etatGeneral: json["etatGeneral"] as String,
|
|
disponible: json["statut"] == "DISPONIBLE",
|
|
accessoires: accessoires == null ? const <String>[] : accessoires.cast<String>(),
|
|
icon: iconePourCategorie(categorie),
|
|
);
|
|
}
|
|
|
|
final int id;
|
|
final String nom;
|
|
final String categorie;
|
|
final String marque;
|
|
final String modele;
|
|
final String reference;
|
|
final String campus;
|
|
final String etatGeneral;
|
|
final bool disponible;
|
|
final List<String> accessoires;
|
|
final IconData icon;
|
|
}
|
|
|
|
/// Déduit une icône à partir du nom de catégorie renvoyé par l'API.
|
|
IconData iconePourCategorie(String categorie) {
|
|
switch (categorie) {
|
|
case "Ordinateur portable":
|
|
return Icons.laptop_mac;
|
|
case "Vidéoprojecteur":
|
|
return Icons.videocam_outlined;
|
|
case "Tablette":
|
|
return Icons.tablet_mac;
|
|
case "Caméra":
|
|
return Icons.photo_camera_outlined;
|
|
case "Périphérique audio":
|
|
return Icons.headphones;
|
|
case "Câble / Adaptateur":
|
|
return Icons.cable;
|
|
default:
|
|
return Icons.inventory_2_outlined;
|
|
}
|
|
}
|