8.5 KiB
Pré-remplissage complet du formulaire PCI
Contexte
Lors de l'import de périphériques PCI, certains champs n'étaient pas pré-remplis dans le formulaire:
- Le sous-type n'était pas sélectionné (select vide)
- Le Device ID (slot PCI comme 08:00.0) n'était pas rempli
- Le fabricant de carte (pour GPU) n'était pas rempli
Problèmes résolus
1. Sous-type non sélectionné
Problème: Le champ type_principal était pré-rempli avec "PCI", mais le select sous_type restait vide car les options n'étaient pas chargées avant de tenter de sélectionner la valeur.
Solution: Appeler loadPeripheralSubtypes() après avoir défini le type_principal, puis définir le sous_type.
// Fill type_principal and trigger sous_type loading
if (suggested.type_principal) {
document.getElementById('type_principal').value = suggested.type_principal;
// Load subtypes for this type
await loadPeripheralSubtypes();
// Then set the sous_type value
if (suggested.sous_type) {
document.getElementById('sous_type').value = suggested.sous_type;
}
}
2. Device ID manquant
Problème: Le slot PCI (ex: 08:00.0) n'était pas pré-rempli dans le champ device_id.
Solution: Ajouter le slot dans les données suggérées du backend.
Backend - peripherals.py
suggested = {
"nom": nom,
"type_principal": type_principal,
"sous_type": sous_type,
"marque": brand or device_info.get("vendor_name"),
"modele": model or device_info.get("device_name"),
"device_id": device_info.get("slot"), # PCI slot (e.g., 08:00.0)
"pci_device_id": device_info.get("pci_device_id"), # vendor:device (e.g., 10de:2504)
"cli_raw": device_section,
"caracteristiques_specifiques": caracteristiques_specifiques
}
Frontend - peripherals.js
// Fill Device ID (PCI slot like 08:00.0)
if (suggested.device_id) {
const deviceIdField = document.getElementById('device_id');
if (deviceIdField) deviceIdField.value = suggested.device_id;
}
3. Fabricant de carte manquant
Problème: Pour les cartes graphiques, le fabricant de la carte (ex: Gigabyte) extrait du subsystem n'était pas pré-rempli.
Solution: Le backend extrait déjà le fabricant, il suffit de le pré-remplir dans le frontend.
// Fill fabricant if present (for GPU cards)
if (suggested.fabricant) {
const fabricantField = document.getElementById('fabricant');
if (fabricantField) fabricantField.value = suggested.fabricant;
}
Champs pré-remplis automatiquement
Lors de l'import d'un périphérique PCI, le formulaire pré-remplit maintenant:
Champs de base
- ✅ Nom: Construit à partir de marque + modèle (ex:
NVIDIA GeForce RTX 3060 Lite Hash Rate) - ✅ Type principal:
PCI - ✅ Sous-type: Classification automatique (ex:
Carte graphique,SSD NVMe, etc.) - ✅ Marque: Premier mot du vendor (ex:
NVIDIA,Micron) - ✅ Modèle: Nom commercial du périphérique (ex:
GeForce RTX 3060 Lite Hash Rate)
Champs spécifiques PCI
- ✅ Device ID: Slot PCI (ex:
08:00.0) - ✅ PCI Device ID: Identifiant vendor:device (ex:
10de:2504) - ✅ Fabricant: Fabricant de la carte pour GPU (ex:
Gigabyte)
Champs techniques
- ✅ CLI Raw: Sortie complète de lspci pour ce périphérique
- ✅ Caractéristiques spécifiques: JSON avec:
- Slot PCI
- Device class
- Vendor name
- Subsystem
- Driver
- IOMMU group
- Revision
- Modules
Exemple complet - NVIDIA RTX 3060
Données d'entrée
08:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate] (rev a1) (prog-if 00 [VGA controller])
Subsystem: Gigabyte Technology Co., Ltd Device 4074
Flags: bus master, fast devsel, latency 0, IRQ 84, IOMMU group 16
Kernel driver in use: nvidia
Formulaire pré-rempli
| Champ | Valeur | Source |
|---|---|---|
| Nom | NVIDIA GeForce RTX 3060 Lite Hash Rate |
brand + model |
| Type principal | PCI ✅ |
Classification automatique |
| Sous-type | Carte graphique ✅ |
Classification automatique |
| Marque | NVIDIA |
Premier mot de "NVIDIA Corporation" |
| Modèle | GeForce RTX 3060 Lite Hash Rate |
Contenu des brackets [...] |
| Fabricant | Gigabyte ✅ |
Premier mot du subsystem |
| Device ID | 08:00.0 ✅ |
Slot PCI |
| PCI Device ID | 10de:2504 |
Vendor:device depuis lspci -n |
Caractéristiques spécifiques (JSON)
{
"slot": "08:00.0",
"device_class": "VGA compatible controller",
"vendor_name": "NVIDIA Corporation",
"subsystem": "Gigabyte Technology Co., Ltd Device 4074",
"driver": "nvidia",
"iommu_group": "16",
"revision": "a1",
"modules": "nvidia"
}
Exemple complet - Micron NVMe SSD
Données d'entrée
01:00.0 Non-Volatile memory controller: Micron/Crucial Technology P2 [Nick P2] / P3 / P3 Plus NVMe PCIe SSD (DRAM-less) (rev 01)
Subsystem: Micron/Crucial Technology P2 [Nick P2] / P3 / P3 Plus NVMe PCIe SSD (DRAM-less)
Kernel driver in use: nvme
Formulaire pré-rempli
| Champ | Valeur | Source |
|---|---|---|
| Nom | Micron P2/P3/P3 Plus NVMe PCIe SSD (DRAM-less) |
brand + model |
| Type principal | PCI ✅ |
Classification automatique |
| Sous-type | SSD NVMe ✅ |
Classification automatique |
| Marque | Micron |
Premier mot de "Micron/Crucial Technology" |
| Modèle | P2/P3/P3 Plus NVMe PCIe SSD (DRAM-less) |
Nettoyé des brackets |
| Device ID | 01:00.0 ✅ |
Slot PCI |
| PCI Device ID | c0a9:5407 |
Vendor:device depuis lspci -n |
Workflow de pré-remplissage
1. User colle lspci -v et lspci -n
2. Backend détecte les périphériques
3. User sélectionne un périphérique (ex: 08:00.0)
4. Backend extrait et parse les informations
├─ Parse vendor/device name intelligemment
├─ Classifie le périphérique (type + sous-type)
├─ Extrait marque et modèle
├─ Extrait fabricant (pour GPU)
└─ Construit les caractéristiques spécifiques
5. Frontend ouvre le formulaire d'ajout
6. Pré-remplissage séquentiel:
├─ Champs de base (nom, marque, modèle)
├─ Type principal → déclenche chargement sous-types
├─ Sous-type (une fois les options chargées) ✅
├─ Fabricant (si GPU)
├─ Device ID (slot PCI) ✅
├─ PCI Device ID (vendor:device)
└─ Caractéristiques spécifiques (JSON)
7. User valide/modifie et sauvegarde
Code modifié
Backend - peripherals.py (ligne 1507)
"device_id": device_info.get("slot"), # Ajouté: slot PCI
Frontend - peripherals.js
Lignes 1822-1830: Chargement async des sous-types
if (suggested.type_principal) {
document.getElementById('type_principal').value = suggested.type_principal;
await loadPeripheralSubtypes(); // IMPORTANT: async
if (suggested.sous_type) {
document.getElementById('sous_type').value = suggested.sous_type;
}
}
Lignes 1833-1836: Fabricant
if (suggested.fabricant) {
const fabricantField = document.getElementById('fabricant');
if (fabricantField) fabricantField.value = suggested.fabricant;
}
Lignes 1839-1842: Device ID (slot PCI)
if (suggested.device_id) {
const deviceIdField = document.getElementById('device_id');
if (deviceIdField) deviceIdField.value = suggested.device_id;
}
Bénéfices
✅ Formulaire complet: Tous les champs pertinents sont pré-remplis ✅ Gain de temps: L'utilisateur n'a plus qu'à valider ✅ Moins d'erreurs: Les types et sous-types sont correctement sélectionnés ✅ Traçabilité: Le slot PCI permet d'identifier précisément le périphérique ✅ Distinction GPU: Le fabricant de carte est séparé du fabricant du chipset
Tests
Pour tester le pré-remplissage complet:
- Importer un périphérique PCI (GPU ou NVMe)
- Vérifier que le formulaire affiche:
- Type principal:
PCI✅ - Sous-type: Sélectionné automatiquement ✅
- Device ID: Slot PCI (ex:
08:00.0) ✅ - Fabricant: Pour GPU uniquement ✅
- PCI Device ID: vendor:device (ex:
10de:2504) ✅
- Type principal:
Fichiers modifiés
- backend/app/api/endpoints/peripherals.py - Ajout du device_id (slot)
- frontend/js/peripherals.js - Pré-remplissage async du sous-type + device_id + fabricant
Conclusion
Le formulaire d'import PCI pré-remplit maintenant tous les champs disponibles, offrant une expérience utilisateur optimale avec validation minimale requise.