feat: show deferred details cache mode

This commit is contained in:
Luca Sacchi Ricciardi
2026-04-25 16:13:41 +02:00
parent 165ad9c02b
commit 1c76515d8c
3 changed files with 37 additions and 4 deletions
+32 -4
View File
@@ -91,6 +91,8 @@ class LLMMonitorApp {
this.lastData.models = models; this.lastData.models = models;
this.renderModels(this.lastData.models); this.renderModels(this.lastData.models);
} }
this.updateCacheModeIndicator(models);
} }
// Gestire messaggi dal Worker // Gestire messaggi dal Worker
@@ -115,11 +117,15 @@ class LLMMonitorApp {
if (modelsData && JSON.stringify(this.lastData.models) !== JSON.stringify(modelsData)) { if (modelsData && JSON.stringify(this.lastData.models) !== JSON.stringify(modelsData)) {
this.lastData.models = modelsData; this.lastData.models = modelsData;
try { try {
writeServerCache(this.activeServer.id, "models", modelsData); const persistedModels = writeServerCache(this.activeServer.id, "models", modelsData);
if (persistedModels) {
this.lastData.models = persistedModels;
}
} catch (error) { } catch (error) {
console.warn("Cannot persist models in localStorage:", error); console.warn("Cannot persist models in localStorage:", error);
} }
this.renderModels(modelsData); this.updateCacheModeIndicator(this.lastData.models);
this.renderModels(this.lastData.models);
if (this.selectedModelName) { if (this.selectedModelName) {
this.showModelDetails(this.selectedModelName); this.showModelDetails(this.selectedModelName);
} }
@@ -432,8 +438,12 @@ class LLMMonitorApp {
timestamp: new Date().toISOString() timestamp: new Date().toISOString()
}; };
this.lastData.models = modelsData; this.lastData.models = modelsData;
writeServerCache(this.activeServer.id, "models", modelsData); const persistedModels = writeServerCache(this.activeServer.id, "models", modelsData);
this.renderModels(modelsData); if (persistedModels) {
this.lastData.models = persistedModels;
}
this.updateCacheModeIndicator(this.lastData.models);
this.renderModels(this.lastData.models);
if (this.selectedModelName) { if (this.selectedModelName) {
this.showModelDetails(this.selectedModelName); this.showModelDetails(this.selectedModelName);
} }
@@ -493,6 +503,7 @@ class LLMMonitorApp {
const statusIndicator = document.getElementById("status-indicator"); const statusIndicator = document.getElementById("status-indicator");
const statusText = document.getElementById("status-text"); const statusText = document.getElementById("status-text");
const ollamaStatus = document.getElementById("ollama-status"); const ollamaStatus = document.getElementById("ollama-status");
const cacheModeIndicator = document.getElementById("cache-mode-indicator");
if (count) count.textContent = "0"; if (count) count.textContent = "0";
if (totalSize) totalSize.textContent = "0 B"; if (totalSize) totalSize.textContent = "0 B";
@@ -504,6 +515,9 @@ class LLMMonitorApp {
if (ollamaStatus) { if (ollamaStatus) {
ollamaStatus.innerHTML = "🟡 Not configured"; ollamaStatus.innerHTML = "🟡 Not configured";
} }
if (cacheModeIndicator) {
cacheModeIndicator.classList.add("hidden");
}
if (container) { if (container) {
container.innerHTML = ` container.innerHTML = `
<div class="text-center py-10 text-gray-300"> <div class="text-center py-10 text-gray-300">
@@ -515,6 +529,20 @@ class LLMMonitorApp {
} }
} }
updateCacheModeIndicator(modelsData) {
const cacheModeIndicator = document.getElementById("cache-mode-indicator");
if (!cacheModeIndicator) {
return;
}
if (hasDeferredShowDetails(modelsData)) {
cacheModeIndicator.classList.remove("hidden");
return;
}
cacheModeIndicator.classList.add("hidden");
}
renderLoadingState() { renderLoadingState() {
if (this.lastData.models) { if (this.lastData.models) {
return; return;
+4
View File
@@ -250,3 +250,7 @@ function isCacheStale(timestamp, maxAgeMs = DATA_REFRESH_INTERVAL_MS) {
return (Date.now() - timestamp) >= maxAgeMs; return (Date.now() - timestamp) >= maxAgeMs;
} }
function hasDeferredShowDetails(cacheValue) {
return Boolean(cacheValue && cacheValue.showDetailsDeferred);
}
+1
View File
@@ -88,6 +88,7 @@
<div> <div>
<h2 class="text-xl font-bold">Available Models</h2> <h2 class="text-xl font-bold">Available Models</h2>
<p class="text-xs text-gray-400 mt-1">Hover or click a card to open the details modal.</p> <p class="text-xs text-gray-400 mt-1">Hover or click a card to open the details modal.</p>
<p id="cache-mode-indicator" class="hidden text-xs text-amber-300 mt-2">Model details are loaded on demand to keep device storage usage low.</p>
</div> </div>
<button id="refresh-btn" class="bg-purple-600 hover:bg-purple-700 px-4 py-2 rounded-lg text-sm font-medium transition"> <button id="refresh-btn" class="bg-purple-600 hover:bg-purple-700 px-4 py-2 rounded-lg text-sm font-medium transition">
Refresh Refresh