v0.13.0: UI polish fixes (8 improvements)

- Fix 1: Dashboard backup card border (verified already correct)
- Fix 2: Show auto-generated env values on deploy page with copy/reveal
- Fix 3: Temperature value pill for better visibility on dashboard
- Fix 4: Rework dashboard backup section (remove manual trigger, add Tier 2 summary)
- Fix 5: Scope HDD warning banner to dashboard and monitoring pages only
- Fix 6: Move Tárhely section up in monitoring page
- Fix 7: Snapshot table clarity (HOZZÁADOTT header, n/a instead of -)
- Fix 8: Restructure Tároló section into tiered storage view

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-18 13:30:21 +01:00
parent 6bfdd88d10
commit 90826dec7a
10 changed files with 328 additions and 126 deletions
+61
View File
@@ -100,6 +100,28 @@ func (s *Server) dashboardHandler(w http.ResponseWriter, _ *http.Request) {
data["BackupStatus"] = fullStatus.LastBackup
data["BackupRunning"] = fullStatus.Running
data["BackupMaxAgeHours"] = s.cfg.Monitoring.Thresholds.BackupMaxAgeHours
// Cross-drive summary for dashboard Tier 2 status line
crossConfigs := s.settings.GetAllCrossDriveConfigs()
crossDriveTotal := 0
crossDriveConfigured := 0
crossDriveFailed := 0
for _, st := range deployedStacks {
if st.Protected {
continue
}
crossDriveTotal++
cfg, hasCfg := crossConfigs[st.Name]
if hasCfg && cfg != nil && cfg.Enabled {
crossDriveConfigured++
if cfg.LastStatus == "error" {
crossDriveFailed++
}
}
}
data["CrossDriveTotal"] = crossDriveTotal
data["CrossDriveConfigured"] = crossDriveConfigured
data["CrossDriveFailed"] = crossDriveFailed
}
s.render(w, "dashboard", data)
@@ -181,6 +203,16 @@ func (s *Server) deployHandler(w http.ResponseWriter, r *http.Request, name stri
data["AppPageURL"] = s.cfg.AppPageURL(meta.Slug)
data["UserFields"] = meta.UserFacingFields()
data["AutoFields"] = meta.AutoGeneratedFields()
// Auto-generated field values for already-deployed apps
autoFieldValues := make(map[string]string)
if alreadyDeployed && appCfg != nil {
for _, f := range meta.AutoGeneratedFields() {
if val, ok := appCfg.Env[f.EnvVar]; ok {
autoFieldValues[f.EnvVar] = val
}
}
}
data["AutoFieldValues"] = autoFieldValues
// Storage paths with free space info for deploy dropdown
var deployPaths []DeployStoragePath
for _, sp := range s.settings.GetSchedulableStoragePaths() {
@@ -487,6 +519,35 @@ func (s *Server) backupsHandler(w http.ResponseWriter, r *http.Request) {
if pw, err := s.backupMgr.GetResticPassword(); err == nil {
data["ResticPassword"] = pw
}
// Tároló section: DB dump directory and total size
data["DBDumpDir"] = s.cfg.Paths.DBDumpDir
var dbDumpTotalBytes int64
for _, f := range fullStatus.DumpFiles {
dbDumpTotalBytes += f.Size
}
data["DBDumpTotalBytes"] = dbDumpTotalBytes
// Tároló section: deduplicated Tier 2 destination list
tier2DestMap := make(map[string]map[string]string)
for _, item := range fullStatus.CrossDriveSummary {
if item.DestPath == "" {
continue
}
if _, exists := tier2DestMap[item.DestPath]; !exists {
tier2DestMap[item.DestPath] = map[string]string{
"Path": item.DestPath,
"Label": item.DestLabel,
"Method": item.MethodLabel,
"SizeHuman": item.SizeHuman,
}
}
}
var tier2DestList []map[string]string
for _, d := range tier2DestMap {
tier2DestList = append(tier2DestList, d)
}
data["Tier2Dests"] = tier2DestList
} else {
data["Backup"] = nil
}