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.
This commit is contained in:
Knutwurst committed 2026-06-24 22:00:42 +02:00
1 parent 81d6f0e332
commit 2bc15cbaa2
1 file changed
+7 -3
+7 -3
View File
@@ -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;