# 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`. ```javascript // 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` ```python 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` ```javascript // 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. ```javascript // 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) ```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) ```python "device_id": device_info.get("slot"), # Ajouté: slot PCI ``` ### Frontend - `peripherals.js` **Lignes 1822-1830**: Chargement async des sous-types ```javascript 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 ```javascript if (suggested.fabricant) { const fabricantField = document.getElementById('fabricant'); if (fabricantField) fabricantField.value = suggested.fabricant; } ``` **Lignes 1839-1842**: Device ID (slot PCI) ```javascript 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: 1. Importer un périphérique PCI (GPU ou NVMe) 2. 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`) ✅ ## Fichiers modifiés 1. **backend/app/api/endpoints/peripherals.py** - Ajout du device_id (slot) 2. **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.