mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-11 17:26:57 +02:00
Menu : reserver la hauteur des blocs charges par le reseau
This commit is contained in:
1 parent
0dcb4690c3
commit
d1ffc97dc3
4 files changed
+72
-4
No files matched your search
@@ -869,6 +869,7 @@ textarea.sctl{min-height:76px;resize:vertical;line-height:1.5}
|
||||
.lc-spin{display:inline-block;animation:spin 1s linear infinite}
|
||||
/* Serveurs MCP */
|
||||
.mcp-list{display:flex;flex-direction:column;gap:4px}
|
||||
|
||||
.mcp-row{display:flex;align-items:center;gap:8px;padding:6px 10px;border:1px solid var(--border);border-radius:6px;background:var(--panel);cursor:pointer}
|
||||
.mcp-row:hover{border-color:var(--accent)}
|
||||
.mcp-row.off{opacity:.6}
|
||||
@@ -1130,7 +1131,9 @@ button:hover{border-color:var(--dim);color:var(--text)}
|
||||
<div class="subhead">Serveurs MCP<span id="mcp-badge" class="sbadge"></span><span class="help" tabindex="0" onclick="event.preventDefault();event.stopPropagation();this.classList.toggle('open')">?<span class="tip">Connecte des <b>serveurs MCP</b> (Model Context Protocol) pour donner de nouveaux outils à l'IA : accès fichiers, bases de données, APIs métier… <b>stdio</b> = programme lancé localement (npx/uvx/binaire) · <b>http</b> = serveur distant. ⚠ un serveur stdio exécute du code sur cette machine, au même titre que le shell.</span></span></div>
|
||||
<div class="slist">
|
||||
<div class="rowbody">
|
||||
<div id="mcp-list" class="mcp-list"></div>
|
||||
<!-- Même texte que celui rendu après chargement quand il n'y a aucun
|
||||
serveur : sinon la carte partait vide puis grandissait d'une ligne. -->
|
||||
<div id="mcp-list" class="mcp-list"><div class="muted" style="font-size:12px">(aucun serveur — ajoute un serveur fichiers, une base de données, une API…)</div></div>
|
||||
<button class="addbtn" style="margin-top:6px" onclick="openMcp('')">+ ajouter un serveur</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -2074,6 +2077,31 @@ async function loadCfg(){
|
||||
if(m) rows.push(row('N-CPU-MOE', m[1]));
|
||||
document.getElementById('cfg').innerHTML = rows.join('');
|
||||
}
|
||||
// --- Réserve de hauteur des blocs peuplés par le réseau ---------------------
|
||||
// Ces blocs sont vides (ou réduits à « … ») tant que le serveur n'a pas répondu,
|
||||
// puis prennent leur vraie taille : tout le menu sautait alors d'un cran, ce qui
|
||||
// se voyait surtout sur les sections du bas (« Moteur »). On mémorise leur
|
||||
// hauteur d'une session à l'autre et on la réserve au démarrage ; la réserve
|
||||
// tombe dès que le vrai contenu est là (elle ne fait que TENIR la place, elle
|
||||
// n'affiche jamais rien de faux).
|
||||
const HRESERVE=['cfg','vram','ram-details','presets','internet-status','mcp-list'];
|
||||
function reserveHeights(){
|
||||
HRESERVE.forEach(id=>{
|
||||
try{
|
||||
const h=parseInt(localStorage.getItem('jean-h-'+id)||'0',10);
|
||||
const el=document.getElementById(id);
|
||||
if(el && h>0) el.style.minHeight=h+'px';
|
||||
}catch(e){}
|
||||
});
|
||||
}
|
||||
function releaseHeights(){
|
||||
HRESERVE.forEach(id=>{
|
||||
const el=document.getElementById(id); if(!el) return;
|
||||
el.style.minHeight='';
|
||||
try{ localStorage.setItem('jean-h-'+id, String(el.offsetHeight||0)); }catch(e){}
|
||||
});
|
||||
}
|
||||
document.addEventListener('DOMContentLoaded', reserveHeights);
|
||||
async function loadPresets(){
|
||||
const p=await jget('/api/presets');
|
||||
const act = p.find(x=>x.active);
|
||||
@@ -2340,7 +2368,13 @@ async function clearCrawlKey(){
|
||||
renderInternet(await jpost('/api/internet',{key:''}));
|
||||
toast('clé retirée');
|
||||
}
|
||||
async function loadAll(){ await Promise.all([loadStatus(),loadVram(),loadRam(),loadCfg(),loadPresets(),loadAgent(),loadInternet(),loadMCP(),loadApiKey(),loadPrefs(),loadLlamacpp(),loadRemote()]); }
|
||||
async function loadAll(){
|
||||
// allSettled et pas all : un seul chargement en échec (accès distant coupé,
|
||||
// clé API absente…) ne doit pas empêcher la suite — et surtout pas laisser les
|
||||
// hauteurs réservées en place pour toujours.
|
||||
await Promise.allSettled([loadStatus(),loadVram(),loadRam(),loadCfg(),loadPresets(),loadAgent(),loadInternet(),loadMCP(),loadApiKey(),loadPrefs(),loadLlamacpp(),loadRemote()]);
|
||||
releaseHeights(); // tout est en place : on rend la main et on mesure pour la prochaine fois
|
||||
}
|
||||
async function act(a){ toast(a+'…'); await jpost('/api/'+a); setTimeout(loadAll,1500); }
|
||||
function openBenchModal(){ showModal('bench-modal'); }
|
||||
function closeBenchModal(){ hideModal('bench-modal'); }
|
||||
|
||||
@@ -140,7 +140,9 @@
|
||||
<div class="subhead">Serveurs MCP<span id="mcp-badge" class="sbadge"></span><span class="help" tabindex="0" onclick="event.preventDefault();event.stopPropagation();this.classList.toggle('open')">?<span class="tip">Connecte des <b>serveurs MCP</b> (Model Context Protocol) pour donner de nouveaux outils à l'IA : accès fichiers, bases de données, APIs métier… <b>stdio</b> = programme lancé localement (npx/uvx/binaire) · <b>http</b> = serveur distant. ⚠ un serveur stdio exécute du code sur cette machine, au même titre que le shell.</span></span></div>
|
||||
<div class="slist">
|
||||
<div class="rowbody">
|
||||
<div id="mcp-list" class="mcp-list"></div>
|
||||
<!-- Même texte que celui rendu après chargement quand il n'y a aucun
|
||||
serveur : sinon la carte partait vide puis grandissait d'une ligne. -->
|
||||
<div id="mcp-list" class="mcp-list"><div class="muted" style="font-size:12px">(aucun serveur — ajoute un serveur fichiers, une base de données, une API…)</div></div>
|
||||
<button class="addbtn" style="margin-top:6px" onclick="openMcp('')">+ ajouter un serveur</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,3 +1,28 @@
|
||||
// --- Réserve de hauteur des blocs peuplés par le réseau ---------------------
|
||||
// Ces blocs sont vides (ou réduits à « … ») tant que le serveur n'a pas répondu,
|
||||
// puis prennent leur vraie taille : tout le menu sautait alors d'un cran, ce qui
|
||||
// se voyait surtout sur les sections du bas (« Moteur »). On mémorise leur
|
||||
// hauteur d'une session à l'autre et on la réserve au démarrage ; la réserve
|
||||
// tombe dès que le vrai contenu est là (elle ne fait que TENIR la place, elle
|
||||
// n'affiche jamais rien de faux).
|
||||
const HRESERVE=['cfg','vram','ram-details','presets','internet-status','mcp-list'];
|
||||
function reserveHeights(){
|
||||
HRESERVE.forEach(id=>{
|
||||
try{
|
||||
const h=parseInt(localStorage.getItem('jean-h-'+id)||'0',10);
|
||||
const el=document.getElementById(id);
|
||||
if(el && h>0) el.style.minHeight=h+'px';
|
||||
}catch(e){}
|
||||
});
|
||||
}
|
||||
function releaseHeights(){
|
||||
HRESERVE.forEach(id=>{
|
||||
const el=document.getElementById(id); if(!el) return;
|
||||
el.style.minHeight='';
|
||||
try{ localStorage.setItem('jean-h-'+id, String(el.offsetHeight||0)); }catch(e){}
|
||||
});
|
||||
}
|
||||
document.addEventListener('DOMContentLoaded', reserveHeights);
|
||||
async function loadPresets(){
|
||||
const p=await jget('/api/presets');
|
||||
const act = p.find(x=>x.active);
|
||||
@@ -264,5 +289,11 @@ async function clearCrawlKey(){
|
||||
renderInternet(await jpost('/api/internet',{key:''}));
|
||||
toast('clé retirée');
|
||||
}
|
||||
async function loadAll(){ await Promise.all([loadStatus(),loadVram(),loadRam(),loadCfg(),loadPresets(),loadAgent(),loadInternet(),loadMCP(),loadApiKey(),loadPrefs(),loadLlamacpp(),loadRemote()]); }
|
||||
async function loadAll(){
|
||||
// allSettled et pas all : un seul chargement en échec (accès distant coupé,
|
||||
// clé API absente…) ne doit pas empêcher la suite — et surtout pas laisser les
|
||||
// hauteurs réservées en place pour toujours.
|
||||
await Promise.allSettled([loadStatus(),loadVram(),loadRam(),loadCfg(),loadPresets(),loadAgent(),loadInternet(),loadMCP(),loadApiKey(),loadPrefs(),loadLlamacpp(),loadRemote()]);
|
||||
releaseHeights(); // tout est en place : on rend la main et on mesure pour la prochaine fois
|
||||
}
|
||||
async function act(a){ toast(a+'…'); await jpost('/api/'+a); setTimeout(loadAll,1500); }
|
||||
@@ -843,6 +843,7 @@ textarea.sctl{min-height:76px;resize:vertical;line-height:1.5}
|
||||
.lc-spin{display:inline-block;animation:spin 1s linear infinite}
|
||||
/* Serveurs MCP */
|
||||
.mcp-list{display:flex;flex-direction:column;gap:4px}
|
||||
|
||||
.mcp-row{display:flex;align-items:center;gap:8px;padding:6px 10px;border:1px solid var(--border);border-radius:6px;background:var(--panel);cursor:pointer}
|
||||
.mcp-row:hover{border-color:var(--accent)}
|
||||
.mcp-row.off{opacity:.6}
|
||||
|
||||
Reference in new issue
Block a user