GUI : retirer la vue Chaîne redondante

Son contenu (renduChaine) est déjà accessible, par hôte, dans l'onglet
« Chaîne » du détail de la vue Inventaire ; la vue ne faisait que le
répéter pour tous les hôtes. Retire le bouton, le rendu dessinerArbre et
le CSS .arbre-* ; raccourcis clavier ramenés à 1-4. La chaîne reste
consultable hôte par hôte.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-06-30 13:28:04 -04:00
parent 738fd2b88c
commit 2f9db3f516
2 changed files with 9 additions and 28 deletions

View file

@ -30,6 +30,13 @@
`roles/client_*`). Le type `liste` (chaîne virgulée → liste YAML dédoublonnée) est
ajouté au schéma des intrants.
### Supprimé
- **Vue « Chaîne » du bandeau (redondante).** Son contenu (`renduChaine`) était déjà
rendu, par hôte, dans l'onglet « Chaîne » du détail de la vue Inventaire ; la vue ne
faisait que le répéter pour tous les hôtes à la fois, sans réseau/proxmox ni boutons
d'opération. Retirée (bouton, rendu `dessinerArbre`, CSS `.arbre-*`) ; la chaîne
reste consultable hôte par hôte. Raccourcis clavier ramenés à 1-4.
### Modifié
- **Vue Inventaire (cartes) : détail converti en inspection lecture seule.** La vue
affichait « généré depuis le plan (lecture seule) » tout en exposant une surface

View file

@ -691,13 +691,6 @@ HTML = r"""<!doctype html>
.vue-bascule button { border: none; background: transparent; border-radius: 999px; padding: 6px 13px; font-size: 12.5px; font-weight: 750; color: var(--muted); box-shadow: none; }
.vue-bascule button:hover { color: var(--texte); background: transparent; }
.vue-bascule button.on { background: var(--surface); color: var(--teal); box-shadow: var(--ombre); }
.arbre-vm { background: var(--surface); border: 1px solid var(--ligne); border-radius: var(--rayon); margin-bottom: 10px; box-shadow: var(--ombre); }
.arbre-vm > summary { list-style: none; cursor: pointer; padding: 11px 14px; display: flex; align-items: center; gap: 10px; font-size: 14px; }
.arbre-vm > summary::-webkit-details-marker { display: none; }
.arbre-vm > summary::before { content: "\25B8"; color: var(--faint); }
.arbre-vm[open] > summary::before { content: "\25BE"; }
.arbre-vm .ch-meta { color: var(--muted); font-size: 12px; margin-left: auto; }
.arbre-corps { padding: 2px 16px 14px 32px; display: grid; gap: 9px; }
.ch-grp { border-left: 2px solid var(--ligne-forte); padding: 3px 0 3px 12px; }
.ch-grp-tete { display: flex; align-items: center; gap: 7px; font-weight: 700; font-size: 13px; flex-wrap: wrap; }
.ch-fleche { color: var(--faint); }
@ -756,11 +749,10 @@ HTML = r"""<!doctype html>
<span class="chemin" id="chemin"></span>
<div class="grandit"></div>
<div class="resume" id="resume"></div>
<div class="barre" title="Raccourcis clavier — 1-5 : changer de vue · j/k : naviguer les hôtes · v : vérifier · d : déployer · / : filtrer · Ctrl+S : sauvegarder la vue">
<div class="barre" title="Raccourcis clavier — 1-4 : changer de vue · j/k : naviguer les hôtes · v : vérifier · d : déployer · / : filtrer · Ctrl+S : sauvegarder la vue">
<div class="vue-bascule">
<button type="button" id="btn-vue-cartes" class="on" onclick="setVue('cartes')">Inventaire</button>
<button type="button" id="btn-vue-serveurs" onclick="setVue('serveurs')">Serveurs</button>
<button type="button" id="btn-vue-chaine" onclick="setVue('chaine')">Chaîne</button>
<button type="button" id="btn-vue-applications" onclick="setVue('applications')">Applications</button>
<button type="button" id="btn-vue-bases" onclick="setVue('bases')">Bases</button>
</div>
@ -1021,7 +1013,6 @@ HTML = r"""<!doctype html>
vuePrincipale = v;
document.getElementById('btn-vue-cartes').classList.toggle('on', v === 'cartes');
document.getElementById('btn-vue-serveurs').classList.toggle('on', v === 'serveurs');
document.getElementById('btn-vue-chaine').classList.toggle('on', v === 'chaine');
document.getElementById('btn-vue-applications').classList.toggle('on', v === 'applications');
document.getElementById('btn-vue-bases').classList.toggle('on', v === 'bases');
dessinerGrilles();
@ -1031,7 +1022,6 @@ HTML = r"""<!doctype html>
function dessinerGrilles() {
document.getElementById('chips').style.display = vuePrincipale === 'cartes' ? '' : 'none';
if (vuePrincipale === 'serveurs') { dessinerServeurs(); return; }
if (vuePrincipale === 'chaine') { dessinerArbre(); return; }
if (vuePrincipale === 'applications') { dessinerApplications(); return; }
if (vuePrincipale === 'bases') { dessinerBases(); return; }
const cible = document.getElementById('grilles');
@ -1095,22 +1085,6 @@ HTML = r"""<!doctype html>
return grpHtml + appSection;
}
function dessinerArbre() {
const cible = document.getElementById('grilles');
const visibles = hotes.map((h, i) => [h, i]).filter(([h]) => correspond(h));
if (!visibles.length) { cible.innerHTML = '<div class="vide">Aucun hôte.</div>'; return; }
cible.innerHTML = visibles.map(([h]) => {
const st = statutHote(h);
const cls = st === 'bloque' ? 'bloq' : (h.etat === 'actif' ? 'actif' : 'plan');
return `<details class="arbre-vm">
<summary><span class="pt ${cls}"></span><b>${echapper(h.nom || '(sans nom)')}</b>
<span class="badge-statut ${st}">${libelleStatut(st)}</span>
<span class="ch-meta">${(h.groupes || []).length} groupes</span></summary>
<div class="arbre-corps">${renduChaine(h)}</div>
</details>`;
}).join('');
}
function chargerBases(data) {
const b = data.bases || {serveurs_bd: {}, bases_donnees: {}};
bdServeurs = Object.entries(b.serveurs_bd || {}).map(([nom, s]) => ({
@ -1764,7 +1738,7 @@ HTML = r"""<!doctype html>
if ((e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S')) { e.preventDefault(); sauvegarderVue(); return; }
const dansSaisie = /^(INPUT|SELECT|TEXTAREA)$/.test((document.activeElement || {}).tagName || '');
if (dansSaisie || e.ctrlKey || e.metaKey || e.altKey) return;
const vues = {'1': 'cartes', '2': 'serveurs', '3': 'chaine', '4': 'applications', '5': 'bases'};
const vues = {'1': 'cartes', '2': 'serveurs', '3': 'applications', '4': 'bases'};
if (vues[e.key]) { setVue(vues[e.key]); return; }
if (e.key === '/') { e.preventDefault(); const f = document.getElementById('filtre'); if (f) f.focus(); return; }
if (vuePrincipale !== 'cartes') return;