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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user