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 @@
-
+
{{.RunningCount}}
Futó alkalmazás
-
-
+ +
{{.StoppedCount}}
Leállítva
-
-
+ +
{{.TotalCount}}
Összes alkalmazás
-
+
{{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; }