From d51e67f199baa93165e9ed4abb70c2f4e11c95ea Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Sun, 15 Feb 2026 12:19:26 +0100 Subject: [PATCH] v0.4.1: app filtering + clickable dashboard stat cards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add filter bar (Mind/Futó/Leállítva/Telepíthető) to Alkalmazások page with URL-based filter persistence. Dashboard stat cards are now clickable links that navigate to the filtered stacks view. Co-Authored-By: Claude Opus 4.6 --- controller/internal/web/funcmap.go | 13 ++++ .../internal/web/templates/dashboard.html | 12 ++-- controller/internal/web/templates/stacks.html | 59 ++++++++++++++++++- controller/internal/web/templates/style.css | 48 +++++++++++++++ 4 files changed, 125 insertions(+), 7 deletions(-) diff --git a/controller/internal/web/funcmap.go b/controller/internal/web/funcmap.go index f0bae75..a554515 100644 --- a/controller/internal/web/funcmap.go +++ b/controller/internal/web/funcmap.go @@ -144,5 +144,18 @@ func (s *Server) templateFuncMap() template.FuncMap { "fmtLoad": func(load float64) string { return fmt.Sprintf("%.2f", load) }, + "filterCategory": func(state stacks.ContainerState, deployed bool) string { + switch state { + case stacks.StateRunning, stacks.StateStarting, stacks.StateUnhealthy, stacks.StateRestarting: + return "running" + case stacks.StateStopped, stacks.StateExited, stacks.StatePaused: + return "stopped" + default: + if deployed { + return "stopped" + } + return "available" + } + }, } } diff --git a/controller/internal/web/templates/dashboard.html b/controller/internal/web/templates/dashboard.html index 1e8fe5a..c090052 100644 --- a/controller/internal/web/templates/dashboard.html +++ b/controller/internal/web/templates/dashboard.html @@ -7,18 +7,18 @@ {{if .SystemInfo.TotalMemMB}} diff --git a/controller/internal/web/templates/stacks.html b/controller/internal/web/templates/stacks.html index 5af9933..c779277 100644 --- a/controller/internal/web/templates/stacks.html +++ b/controller/internal/web/templates/stacks.html @@ -8,9 +8,16 @@ +
+ + + + +
+
{{range .Stacks}} -
+
+ + {{template "layout_end" .}} {{end}} diff --git a/controller/internal/web/templates/style.css b/controller/internal/web/templates/style.css index 598e58a..f1cdaf0 100644 --- a/controller/internal/web/templates/style.css +++ b/controller/internal/web/templates/style.css @@ -822,6 +822,54 @@ select.form-control option { background: var(--bg-secondary); color: var(--text- border-color: rgba(218, 54, 51, 0.3); } +/* --- Filter bar --- */ +.filter-bar { + display: flex; + gap: 0.5rem; + margin-bottom: 1.5rem; + flex-wrap: wrap; +} + +.filter-btn { + padding: 0.4rem 1rem; + border-radius: 20px; + border: 1px solid var(--border-color); + background: var(--bg-secondary); + color: var(--text-secondary); + cursor: pointer; + font-size: 0.85rem; + font-family: inherit; + transition: all 0.2s; +} + +.filter-btn:hover { + border-color: var(--accent-blue); + color: var(--text-primary); +} + +.filter-btn.active { + background: var(--accent-blue); + border-color: var(--accent-blue); + color: #fff; +} + +.filter-count { + opacity: 0.7; + font-size: 0.8rem; +} + +/* Clickable stat cards */ +a.stat-card { + text-decoration: none; + color: inherit; + transition: transform 0.15s, box-shadow 0.15s; +} + +a.stat-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4); +} + /* Clickable cards */ [data-href] { cursor: pointer; }