Update from the list that says what is out of date

The Updates tab could tell you eleven images were behind and offer nothing to
do about it; updating meant knowing which stack each image belonged to and
going to find it. Now each row has Update and the header has Update all.

Updating is per stack, because that is the unit compose deals in, so a row
acts on whichever stacks use that image — postgres:15-alpine is wikijs's,
postgres:17 is vikunja's — and Update all walks the affected stacks through a
queue one at a time, with each task's output on screen, rather than
recreating half the machine at once. A stack that finishes says "updated just
now" rather than re-checking, since every check is a registry request and
Docker Hub counts them.

Also: cron expressions read as English. "daily at 3:15am", with 15 3 * * *
kept beside it. Jobs.tsx had a smaller version of this for its own list; it
now uses the shared one, which handles lists, ranges, steps, names,
weekdays/weekends, midnight and noon, and says nothing at all when it is not
certain — the caller falls back to the expression.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Mitchell-Johnson
2026-09-26 12:49:32 -07:00
co-authored by Claude Opus 5
parent 03e0761f3e
commit 94800b8207
5 changed files with 195 additions and 19 deletions
+13
View File
@@ -177,6 +177,19 @@ something long in one, switch away and back, refresh — it's all still there.
the daemon's sampling clock; the chart window is always 300 samples, so 30 s at 100 ms
and 10 min at 2 s. Still to do: persistent
history (SQLite ring, e.g. 10 s × 7 days), SMART (`smartctl -j`), longer time ranges.
- **Updating from the Updates tab** — **shipped 2026-09-26**: the "what is out of date" list
was read-only, so seeing a newer image and doing something about it were different places.
Each row now has **Update**, and the header has **Update all**. Updating is per stack —
that is the unit compose deals in — so a row acts on whichever stacks use that image, and
several stacks run through a queue one at a time rather than recreating half the machine at
once, each with its task output on screen. A row that succeeds says "updated just now"
instead of re-checking, since a check is a registry request.
- **Cron in English** (`crontext.ts`, 2026-09-26): schedules read "daily at 3:15am" rather
than `15 3 * * *`, with the expression kept beside it. Handles lists, ranges, steps, day
and month names, `@daily` and friends, weekdays/weekends, midnight and noon — and declines
to describe anything it is not sure of, because a confident wrong sentence is worse than
five fields. The Jobs tab had its own smaller version of this; it now uses this one.
- **Hardware tab** — **shipped 2026-09-25** (`internal/hardware`, `internal/api/hardware.go`,
`Hardware.tsx`): what the machine is physically made of, per machine like every other page.
Four headline tiles (processor, memory, storage, graphics) over cards for each: the