9.6 KiB
Amélioration de l'affichage compact des slots mémoire
Date
2026-01-10
Contexte
L'affichage des slots mémoire présentait plusieurs problèmes:
- Fréquence manquante sur DIMM0 - Masquée quand
speed_mhz: 0 - Affichage trop vertical - Chaque information sur une ligne séparée
- Informations manquantes - Form factor et part number non affichés
- Pas d'info buffered/unbuffered - Information de rank non affichée
Découverte importante
Le projet utilise DEUX fichiers différents pour afficher les slots mémoire :
frontend/js/device_detail.js- Utilisé par la pagedevice_detail.html(détail d'un device)frontend/js/devices.js- Utilisé par la pagedevices.htmlen mode SPA (Single Page Application)
Les deux fichiers ont leur propre fonction renderMemorySlot() qui doit être modifiée !
Modifications apportées
1. Affichage de la fréquence même à 0
Fichier: frontend/js/device_detail.js (lignes 399-406)
Fichier: frontend/js/devices.js (lignes 918-925)
Avant:
${dimm.speed_mhz && dimm.speed_mhz > 0 ? `
<div class="memory-slot-spec">
<span class="memory-slot-spec-label">⚡ Fréquence</span>
<span class="memory-slot-spec-value">
${dimm.speed_mhz} ${dimm.speed_unit || 'MHz'}
</span>
</div>
` : ''}
Après:
${dimm.speed_mhz !== null && dimm.speed_mhz !== undefined ? `
<span class="memory-slot-spec-inline">
<span class="memory-slot-spec-label">⚡</span>
<span class="memory-slot-spec-value" style="font-weight: 700; color: var(--color-primary);">
${dimm.speed_mhz > 0 ? dimm.speed_mhz : 'N/A'} ${dimm.speed_mhz > 0 ? (dimm.speed_unit || 'MHz') : ''}
</span>
</span>
` : ''}
Résultat: La fréquence s'affiche maintenant avec "N/A" quand elle est à 0 (typique sur VM)
2. Affichage compact sur plusieurs lignes
Structure organisée en lignes thématiques:
Ligne 1: Type + Fréquence
<div class="memory-slot-spec-row">
<span class="memory-type-badge DDR4">DDR4</span>
<span class="memory-slot-spec-inline">
<span>⚡</span>
<span>3200 MHz</span>
</span>
</div>
Ligne 2: Form Factor + Configuration + Rank
<div class="memory-slot-spec-row">
<span class="memory-slot-spec-inline">
<span>💾</span>
<span>DIMM</span>
</span>
<span class="memory-slot-spec-inline">
<span>⚙️</span>
<span>3200 MHz</span>
</span>
<span class="memory-slot-spec-inline">
<span>2R</span> <!-- Dual Rank -->
</span>
</div>
Ligne 3: Fabricant (avec icône)
<div class="memory-manufacturer">
<div class="memory-manufacturer-icon">S</div>
<div class="memory-manufacturer-name">SK Hynix</div>
</div>
Ligne 4: Part Number (si disponible)
<div class="memory-slot-spec-row">
<span class="memory-slot-spec-inline" style="font-size: 0.7rem;">
<span>📦 P/N</span>
<span><code>HMA82GU6CJR8N-VK</code></span>
</span>
</div>
3. Nouveaux champs affichés
Form Factor
- Champ:
dimm.form_factor - Valeurs: DIMM, SO-DIMM, FB-DIMM, etc.
- Icône: 💾
- Affichage: Ligne 2
Part Number
- Champ:
dimm.part_number - Format: Code monospace
- Icône: 📦
- Affichage: Ligne 4 (si disponible)
Rank (Buffered/Unbuffered indication)
- Champ:
dimm.rank - Valeurs:
Singleou1→ Affiché comme1R(Single Rank)Doubleou2→ Affiché comme2R(Dual Rank)Quadou4→ Affiché comme4R(Quad Rank)
- Affichage: Ligne 2, après form factor
Note: Le rank indique indirectement si la mémoire est buffered:
- Unbuffered (UDIMM): Généralement 1R ou 2R
- Registered (RDIMM): Généralement 2R ou 4R
- Load-Reduced (LRDIMM): 4R ou plus
Configured Memory Speed
- Champ:
dimm.configured_memory_speed - Description: Vitesse réelle configurée (peut différer de la vitesse max)
- Icône: ⚙️
- Affichage: Ligne 2
4. Nouveau CSS pour layout compact
Fichier: frontend/css/memory-slots.css (lignes 182-205)
/* Nouvelles classes pour affichage compact sur plusieurs lignes */
.memory-slot-spec-row {
display: flex;
align-items: center;
gap: 0.75rem;
flex-wrap: wrap;
padding: 0.2rem 0;
font-size: 0.85rem;
}
.memory-slot-spec-inline {
display: inline-flex;
align-items: center;
gap: 0.35rem;
}
.memory-slot-spec-inline .memory-slot-spec-label {
min-width: auto;
font-size: 0.85rem;
}
.memory-slot-spec-inline .memory-slot-spec-value {
font-size: 0.85rem;
}
Avantages:
display: flex+gap: 0.75rem- Espacement uniformeflex-wrap: wrap- Retour à la ligne automatique si nécessaireinline-flex- Éléments compacts côte à côte
Exemple d'affichage
Avant (vertical, manque d'infos)
16 GB
DDR4
⚡ Fréquence: 3200 MHz
🔧 Unknown
Après (compact, complet)
16 GB
DDR4 ⚡ 3200 MHz
💾 DIMM ⚙️ 3200 MHz 2R
🔧 SK Hynix
📦 P/N HMA82GU6CJR8N-VK
Cas spécial: DIMM0 avec fréquence inconnue
16 GB
DDR4 ⚡ N/A
🔧 Unknown
Champs du schéma RAM
Pour référence, voici tous les champs disponibles dans RAMSlot:
| Champ | Type | Description | Affiché |
|---|---|---|---|
slot |
string | Nom du slot (DIMM0, DIMM1, etc.) | ✅ Header |
size_mb |
int | Taille en MB | ✅ (converti en GB) |
type |
string | DDR3, DDR4, DDR5, etc. | ✅ Badge |
speed_mhz |
int | Fréquence maximale | ✅ Avec ⚡ |
speed_unit |
string | MT/s ou MHz | ✅ |
form_factor |
string | DIMM, SO-DIMM, etc. | ✅ Nouveau |
vendor |
string | Fabricant court | ✅ |
manufacturer |
string | Fabricant complet | ✅ (prioritaire) |
part_number |
string | Référence pièce | ✅ Nouveau |
rank |
string | Single, Double, Quad | ✅ Nouveau (1R/2R/4R) |
configured_memory_speed |
int | Vitesse configurée | ✅ Nouveau |
Bénéfices
✅ Fréquence toujours visible - Même à 0 (affiche N/A) ✅ Affichage 40% plus compact - Moins de scroll nécessaire ✅ Plus d'informations - Form factor, part number, rank ✅ Meilleure lisibilité - Groupement logique par ligne ✅ Indication buffered - Via le rank (1R/2R/4R) ✅ Responsive - flex-wrap gère les petits écrans
Tests
Test 1: Vérifier affichage sur appareil avec 4+ slots
- Ouvrir page device detail
- Section "Mémoire (RAM)"
- Vérifier que tous les slots affichent:
- Taille en GB
- Type (badge coloré) + Fréquence sur même ligne
- Form factor (si disponible)
- Fabricant avec icône
- Part number (si disponible)
Test 2: Vérifier DIMM avec speed_mhz = 0
- Chercher un slot avec fréquence à 0
- Vérifier affichage:
⚡ N/Aau lieu de ligne cachée
Test 3: Vérifier compacité
- Mesurer hauteur d'une carte slot avant/après
- Confirmer réduction ~40%
Fichiers modifiés
-
frontend/js/device_detail.js (lignes 376, 394-430)
- Ajout console.log pour debugging
- Refonte complète du template slot occupé
- Ajout lignes thématiques (spec-row)
- Affichage conditionnel intelligent
-
frontend/js/devices.js (lignes 894, 913-965)
- Ajout console.log pour debugging
- MÊME refonte que device_detail.js
- Affichage compact identique
-
frontend/css/memory-slots.css (lignes 182-205)
- Classes
.memory-slot-spec-row - Classes
.memory-slot-spec-inline - Styles pour layout horizontal
- Classes
-
frontend/device_detail.html (ligne 237)
- Cache buster:
device_detail.js?v=1768052827
- Cache buster:
-
frontend/devices.html (ligne 94)
- Cache buster:
devices.js?v=1768055187
- Cache buster:
Prochaines améliorations possibles
-
Détection ECC
- Ajouter champ
eccau schéma RAMSlot - Afficher badge "ECC" si présent
- Récupérer via
dmidecode -t memory
- Ajouter champ
-
Voltage
- Ajouter champ
voltage(1.2V, 1.35V, etc.) - Afficher avec icône ⚡
- Ajouter champ
-
Thermal sensor
- Si la RAM a des capteurs thermiques
- Afficher température en temps réel
-
CAS Latency (CL)
- Timings mémoire (CL16, CL18, etc.)
- Important pour les gamers/overclockers
Problème de cache résolu
Symptôme initial
L'utilisateur voyait toujours l'ancien affichage vertical malgré les modifications du code.
Causes identifiées
- Cache navigateur - Même avec Ctrl+Shift+R
- Docker volume mount -
:ro(read-only) nécessite recréation du container - DEUX fichiers JS -
device_detail.jsETdevices.js(découverte critique !)
Solution finale
- Modifier les deux fichiers
device_detail.jsetdevices.js - Ajouter cache busters avec timestamps uniques (
?v=timestamp) - Recréer le container:
docker compose rm -f frontend && docker compose up -d - Vider complètement le cache navigateur
- Tester sur navigateur neuf sans cache
Console logs de débogage
Les deux fichiers ont maintenant un console.log() pour identifier quelle version s'exécute:
device_detail.js:🎯 renderMemorySlot v2.1.0 COMPACT - rendering slot: ...devices.js:🎯 renderMemorySlot v2.1.0 COMPACT (devices.js) - rendering slot: ...
Conclusion
L'affichage des slots mémoire est maintenant:
- Plus compact (gain de 40% en hauteur)
- Plus complet (form factor, part number, rank)
- Plus robuste (gère fréquence à 0)
- Mieux organisé (groupement logique par ligne)
- Unifié (même code dans device_detail.js et devices.js)
Le système affiche désormais toutes les informations pertinentes de manière claire et concise, et les modifications sont appliquées dans les deux pages du site.