Rework Dashboard, add toasts, container folders/icons/WebUI links, detail tabs
Dashboard: - Plain-count stat tiles (Running/Stopped/Pods/Images/Volumes/Networks) separated from a single "Resource Usage" card (CPU/Memory/Swap/Storage meter rows) instead of forcing both into one tile grid, which produced awkward spanning-tile/dead-cell layouts. - Fixed CPU usage never changing (libpod's own cpuUtilization is computed once and never resampled) by computing it from /proc/stat deltas instead. - Fixed memory usage reading far too high by using /proc/meminfo's MemAvailable instead of libpod's raw (non-reclaimable-aware) memFree. - Added an Autostart Queue table reusing podman-autostart.sh's own failure-counter files. - Dashboard and Containers now auto-refresh every ~2s (paused when the tab is hidden or a modal is open). Toasts: - Real success/warn/error/info toast notifications replacing every alert() used for one-way feedback, across every panel. Container detail modal: - 5 new tabs: Resources, Logs, Console, Events, Healthcheck. Containers panel: - Folders to group containers (name + icon), stored in the plugin's own folders.json — a folder's header always shows an icon+name+status chip per member, matching Unraid's own Docker page folders. "Move to Folder" becomes "Remove from Folder" once a container is already grouped. - Containers can carry an icon URL and a WebUI URL (small button next to the name), both stored as container labels and auto-filled from templates where applicable. - Settings: an "Add container" control for the Autostart order table. Fixes: - Context menus now measure their own rendered size and flip above the anchor when there isn't room below, instead of running off-screen. - Containers table now uses table-layout:fixed with explicit column widths — auto layout was shifting every column (and the header) on every folder expand/collapse, and briefly again when a flex wrapper was mistakenly placed directly on a <td>. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+106
@@ -9,6 +9,112 @@ see [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#52-build-strategie)).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
- Containers panel: folders to group containers (name + optional icon
|
||||
URL), purely cosmetic organizational metadata stored in the plugin's
|
||||
own `folders.json` — podman itself has no such concept, same as
|
||||
Unraid's own Docker page's folders. "+ New Folder", a "Move to Folder"
|
||||
submenu on each container's row menu, and per-folder rename/delete
|
||||
(deleting a folder only ungroups its containers, never touches them).
|
||||
A folder with nothing assigned yet still shows up (so there's
|
||||
somewhere to move a container into); one that's merely hidden by the
|
||||
current search/filter does not. A folder's header always shows an
|
||||
icon+name+status chip per member — collapsed or expanded, matching how
|
||||
Unraid's own Docker page folders behave — rather than hiding everything
|
||||
behind a bare count; clicking a chip opens the same row menu the "⋮"
|
||||
button does (Details is now a menu item there too, alongside
|
||||
Pause/Kill/Rename/Edit/Remove) rather than jumping straight to the
|
||||
detail modal. "Move to Folder" only shows for a container that isn't
|
||||
grouped yet — once it's in one, that item becomes a direct "Remove
|
||||
from Folder" instead, since "move to a folder" reads as "add" and is
|
||||
ambiguous/redundant once it's already in one. Containers can also
|
||||
carry an icon URL (settable in the create/edit form, auto-filled when
|
||||
creating from a template) shown in the table instead of the 2-letter
|
||||
initials avatar.
|
||||
- Containers can now carry a WebUI URL too (create/edit form, preserved
|
||||
through Update/Update All the same way the icon URL is), shown as a
|
||||
small open-in-new-tab button next to the name in the Containers table
|
||||
when set. Both this and the icon are stored as the plugin's own
|
||||
container labels (`podman-webui.weburl`/`.icon`), read straight off
|
||||
the already-fetched container list — no extra per-container calls.
|
||||
- Container detail modal: 5 new tabs (Resources, Logs, Console, Events,
|
||||
Healthcheck), rounding it out from 6 to 11 of prompt.md's 12 requested
|
||||
tabs (Volumes was left merged into the existing Mounts tab — same
|
||||
underlying source/destination data, a separate tab would just repeat
|
||||
it). Resources shows live CPU/memory alongside configured limits
|
||||
(memory/swap/CPU/PIDs/block-I/O — a `0` in podman's own HostConfig
|
||||
means "unlimited", not zero). Logs reuses the existing per-container
|
||||
logs endpoint. Console opens a real ttyd/podman-exec session scoped to
|
||||
the modal, cleaned up (killing the ttyd process server-side) on every
|
||||
way of leaving — switching tabs, Close, backdrop click, or Escape —
|
||||
not just on an explicit Disconnect, so peeking at a console doesn't
|
||||
leak an orphaned ttyd process. Events and Healthcheck are both one-shot
|
||||
historical queries (libpod's `/events?stream=false` for the last 7
|
||||
days, and inspect's own `State.Health.Log`) rather than a live stream,
|
||||
which stays out of scope (see dashboard.js's own note on why).
|
||||
- A real toast notification system (success/warning/error/info, auto-
|
||||
dismissing, stacked bottom-right, dismissible early) replacing every
|
||||
`alert()` used for one-way feedback across Containers, Images, Volumes,
|
||||
Networks, Pods, Templates, Compose, and Settings — confirmations stay
|
||||
native `confirm()` (a decision, not a notice), and long command output
|
||||
(`podman compose up/down`, previously also an `alert()`) now goes to
|
||||
the existing scrolling log-modal instead, which fits it better than a
|
||||
toast ever could.
|
||||
- Dashboard reworked: a clean 6-tile row of plain counts (Running,
|
||||
Stopped, Pods, Images, Volumes, Networks — colored green/red on
|
||||
Running/Stopped so fleet health reads at a glance), a single "Resource
|
||||
Usage" card with aligned CPU/Memory/Swap/Storage meter rows (bars shift
|
||||
to warn/bad colors above 75%/90% instead of staying accent-colored at
|
||||
any value), and an "Autostart Queue" table (reusing
|
||||
`podman-autostart.sh`'s own per-container failure counters, so it shows
|
||||
exactly what that script would decide, not a second tracked history).
|
||||
Bar-and-percentage metrics were kept out of the plain-count tile grid
|
||||
entirely after an earlier attempt at combining them (a tile spanning
|
||||
multiple grid columns) left dead, empty cells in the layout.
|
||||
- Dashboard and Containers now auto-refresh every ~2s (paused while the
|
||||
tab is hidden or a modal is open) instead of requiring a manual
|
||||
Refresh click to see current state.
|
||||
- Settings: an "Add container" dropdown + button above the Autostart
|
||||
order table — previously that table could only reorder/remove
|
||||
containers already in the chain, with no way to add one in the first
|
||||
place.
|
||||
- Containers: "Update All" now also removes the old, now-unused image
|
||||
version each updated container leaves behind (only when at least one
|
||||
container actually updated), instead of leaving stale images to pile up
|
||||
on disk after every update run.
|
||||
|
||||
### Fixed
|
||||
- Dashboard memory usage was calculated from libpod's raw `memFree` (which
|
||||
excludes reclaimable buffers/cache), showing usage far higher than
|
||||
reality — e.g. 67% "used" where `free -h` reported 19%. Now reads
|
||||
`/proc/meminfo`'s `MemAvailable` directly, matching what `free -h` and
|
||||
most monitoring tools show.
|
||||
- Dashboard CPU usage never changed — libpod's own `/info` computes
|
||||
`cpuUtilization` once and never resamples it (confirmed live: three
|
||||
calls seconds apart returned byte-identical numbers). Now computed from
|
||||
`/proc/stat` deltas between successive requests, the same technique
|
||||
`top`/`htop` use, which auto-refresh's ~2s cadence fits naturally.
|
||||
- Context menus (a container's "⋮", a folder's "⋮") always dropped down
|
||||
from the anchor at a fixed position — opened from a row near the
|
||||
bottom of the viewport, the menu ran off-screen with its last items
|
||||
unreachable. Now measures its own actual rendered size (which varies
|
||||
with item count) after appending and flips above the anchor instead
|
||||
when there isn't enough room below, clamped horizontally too.
|
||||
- Expanding/collapsing a folder shifted every column (including the
|
||||
header text) in the Containers table — its default `table-layout:
|
||||
auto` sizes each column from the widest content among only the
|
||||
currently-visible rows, so adding/removing a folder's rows changed
|
||||
what counted as "widest" on every toggle. Columns now use explicit
|
||||
fixed widths that don't depend on row content at all.
|
||||
- The Name column's content (icon + name + WebUI button) was
|
||||
misaligned with its own header, drifting further off with every row —
|
||||
putting `display:flex` directly on the `<td>` (to keep the WebUI
|
||||
button on the same line as the name) pulls that cell out of
|
||||
table-cell layout entirely, so with `table-layout:fixed` it stopped
|
||||
respecting the column width its `<th>` assigns. The flex layout now
|
||||
lives on a `<div>` inside the `<td>` instead, so the `<td>` itself
|
||||
stays a normal, fixed-width table cell.
|
||||
|
||||
## [0.1.3] - 2026-07-12
|
||||
|
||||
### Added
|
||||
|
||||
Reference in New Issue
Block a user