From 2bc15cbaa22033b29af03a697bacb3a014ebeb5a Mon Sep 17 00:00:00 2001 From: Knutwurst <36196269+knutwurst@users.noreply.github.com> Date: Wed, 24 Jun 2026 22:00:42 +0200 Subject: [PATCH] UI: Updating now means only the queue; active downloads stay in Updatable Previous behaviour moved a game out of Updatable the moment it entered the pool, which made it disappear from the list you came to watch. The queue chip now means literally that: jobs in state="queued" waiting for a free pool slot. Active, paused and installing jobs stay under Updatable so you don't have to switch tabs to see the thing you just told to download. Implementation: reconcileFromJobs stamps the raw j.state on the title as g._jobState; gameCategory routes only "queued" to Updating, every other live state falls through to the existing Updatable branch. --- web/app.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/web/app.js b/web/app.js index 76ccf62..1aec9bd 100644 --- a/web/app.js +++ b/web/app.js @@ -323,9 +323,11 @@ function renderGames() { // Mutually-exclusive bucket per game for the filter chips. function gameCategory(game) { - // In-flight work (queued, active, paused, installing) lives in its own - // bucket so Updatable shows only what the user could still trigger. - if (game.installing || game.downloading || game.resumable) return "updating"; + // Updating is the queue — jobs waiting for a pool slot. An actively + // downloading game stays under Updatable so you don't lose sight of it + // while drilling into the queue; same for paused (the user knows where + // it is and can resume from the card) and installing. + if (game._jobState === "queued") return "updating"; // checking is transient (version lookup still running); keep it visible under // Updatable rather than letting it fall out of every specific filter. if (game.status === "checking") return "updatable"; @@ -569,9 +571,11 @@ function reconcileFromJobs(jobs) { g._localDownloading = false; } if (g.downloading && !g._localDownloading) g.downloading = false; + g._jobState = null; return; } g._localDownloading = false; // the pool now tracks it + g._jobState = j.state; if (j.state === "active" || j.state === "queued") { g.downloading = true; g.resumable = false;