diff --git a/web_interface/static/v3/app.css b/web_interface/static/v3/app.css index b22a179f..38036194 100644 --- a/web_interface/static/v3/app.css +++ b/web_interface/static/v3/app.css @@ -204,6 +204,7 @@ body { .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } .grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } +.gap-1\.5 { gap: 0.375rem; } .gap-2 { gap: 0.5rem; } .gap-3 { gap: 0.75rem; } .gap-4 { gap: 1rem; } diff --git a/web_interface/static/v3/plugins_manager.js b/web_interface/static/v3/plugins_manager.js index f7a677ce..cd290093 100644 --- a/web_interface/static/v3/plugins_manager.js +++ b/web_interface/static/v3/plugins_manager.js @@ -5593,7 +5593,7 @@ function renderPluginStore(plugins) { container.innerHTML = plugins.map(plugin => { const isInstalled = installedMap.has(plugin.id); const installedVersion = installedMap.get(plugin.id); - const hasUpdate = isInstalled && plugin.version && installedVersion && plugin.version !== installedVersion; + const hasUpdate = isInstalled && plugin.version && installedVersion && isNewerVersion(plugin.version, installedVersion); return `
@@ -6354,6 +6354,20 @@ function formatCommit(commit, branch) { return 'Latest'; } +// Check if storeVersion is strictly newer than installedVersion (semver-aware) +function isNewerVersion(storeVersion, installedVersion) { + const parse = (v) => (v || '').replace(/^v/, '').split('.').map(n => parseInt(n, 10) || 0); + const a = parse(storeVersion); + const b = parse(installedVersion); + const len = Math.max(a.length, b.length); + for (let i = 0; i < len; i++) { + const diff = (a[i] || 0) - (b[i] || 0); + if (diff > 0) return true; + if (diff < 0) return false; + } + return false; +} + // Check if plugin is new (updated within last 7 days) function isNewPlugin(lastUpdated) { if (!lastUpdated) return false;