Compare commits

...

2 Commits

Author SHA1 Message Date
df1ab2f55b feat: TUI improvements and consistency fixes
All checks were successful
CI/CD / Test (push) Successful in 1m14s
CI/CD / Lint (push) Successful in 1m23s
CI/CD / Build & Release (push) Successful in 3m10s
- Add product branding header to main menu (version + tagline)
- Fix backup success/error report formatting consistency
- Remove extra newline before error box in backup_exec
- Align backup and restore completion screens
2026-01-17 16:26:00 +01:00
0e050b2def fix: cluster backup TUI success report formatting consistency
All checks were successful
CI/CD / Test (push) Successful in 1m15s
CI/CD / Lint (push) Successful in 1m24s
CI/CD / Build & Release (push) Successful in 3m10s
- Aligned box width and indentation with restore success screen
- Removed inconsistent 2-space prefix from success/error boxes
- Standardized content indentation to 4 spaces
- Moved timing section outside else block (always shown)
- Updated footer style to match restore screen
2026-01-17 16:15:16 +01:00
3 changed files with 38 additions and 38 deletions

View File

@@ -4,8 +4,8 @@ This directory contains pre-compiled binaries for the DB Backup Tool across mult
## Build Information ## Build Information
- **Version**: 3.42.50 - **Version**: 3.42.50
- **Build Time**: 2026-01-17_12:25:20_UTC - **Build Time**: 2026-01-17_15:15:55_UTC
- **Git Commit**: c5be9bc - **Git Commit**: 0e050b2
## Recent Updates (v1.1.0) ## Recent Updates (v1.1.0)
- ✅ Fixed TUI progress display with line-by-line output - ✅ Fixed TUI progress display with line-by-line output

View File

@@ -454,26 +454,24 @@ func (m BackupExecutionModel) View() string {
} else { } else {
// Show completion summary with detailed stats // Show completion summary with detailed stats
if m.err != nil { if m.err != nil {
s.WriteString("\n") s.WriteString(errorStyle.Render("╔══════════════════════════════════════════════════════════════╗"))
s.WriteString(errorStyle.Render(" ╔══════════════════════════════════════════════════════════╗"))
s.WriteString("\n") s.WriteString("\n")
s.WriteString(errorStyle.Render("║ [FAIL] BACKUP FAILED ║")) s.WriteString(errorStyle.Render("║ [FAIL] BACKUP FAILED ║"))
s.WriteString("\n") s.WriteString("\n")
s.WriteString(errorStyle.Render(" ╚══════════════════════════════════════════════════════════╝")) s.WriteString(errorStyle.Render("╚══════════════════════════════════════════════════════════════╝"))
s.WriteString("\n\n") s.WriteString("\n\n")
s.WriteString(errorStyle.Render(fmt.Sprintf(" Error: %v", m.err))) s.WriteString(errorStyle.Render(fmt.Sprintf(" Error: %v", m.err)))
s.WriteString("\n") s.WriteString("\n")
} else { } else {
s.WriteString("\n") s.WriteString(successStyle.Render("╔══════════════════════════════════════════════════════════════╗"))
s.WriteString(successStyle.Render(" ╔══════════════════════════════════════════════════════════╗"))
s.WriteString("\n") s.WriteString("\n")
s.WriteString(successStyle.Render("║ [OK] BACKUP COMPLETED SUCCESSFULLY ║")) s.WriteString(successStyle.Render("║ [OK] BACKUP COMPLETED SUCCESSFULLY ║"))
s.WriteString("\n") s.WriteString("\n")
s.WriteString(successStyle.Render(" ╚══════════════════════════════════════════════════════════╝")) s.WriteString(successStyle.Render("╚══════════════════════════════════════════════════════════════╝"))
s.WriteString("\n\n") s.WriteString("\n\n")
// Summary section // Summary section
s.WriteString(infoStyle.Render(" ─── Summary ─────────────────────────────────────────────")) s.WriteString(infoStyle.Render(" ─── Summary ───────────────────────────────────────────────"))
s.WriteString("\n\n") s.WriteString("\n\n")
// Backup type specific info // Backup type specific info
@@ -493,26 +491,24 @@ func (m BackupExecutionModel) View() string {
} }
s.WriteString("\n") s.WriteString("\n")
}
// Timing section // Timing section (always shown, consistent with restore)
s.WriteString(infoStyle.Render(" ─── Timing ──────────────────────────────────────────────")) s.WriteString(infoStyle.Render(" ─── Timing ────────────────────────────────────────────────"))
s.WriteString("\n\n") s.WriteString("\n\n")
elapsed := time.Since(m.startTime) elapsed := time.Since(m.startTime)
s.WriteString(fmt.Sprintf(" Total Time: %s\n", formatBackupDuration(elapsed))) s.WriteString(fmt.Sprintf(" Total Time: %s\n", formatBackupDuration(elapsed)))
if m.backupType == "cluster" && m.dbTotal > 0 { if m.backupType == "cluster" && m.dbTotal > 0 && m.err == nil {
avgPerDB := elapsed / time.Duration(m.dbTotal) avgPerDB := elapsed / time.Duration(m.dbTotal)
s.WriteString(fmt.Sprintf(" Avg per DB: %s\n", formatBackupDuration(avgPerDB))) s.WriteString(fmt.Sprintf(" Avg per DB: %s\n", formatBackupDuration(avgPerDB)))
} }
s.WriteString("\n") s.WriteString("\n")
s.WriteString(infoStyle.Render(" ─────────────────────────────────────────────────────────")) s.WriteString(infoStyle.Render(" ───────────────────────────────────────────────────────────"))
s.WriteString("\n") s.WriteString("\n\n")
} s.WriteString(infoStyle.Render(" [KEYS] Press Enter to continue"))
s.WriteString("\n")
s.WriteString(" [KEY] Press Enter or ESC to return to menu\n")
} }
return s.String() return s.String()

View File

@@ -299,9 +299,13 @@ func (m *MenuModel) View() string {
var s string var s string
// Product branding header
brandLine := fmt.Sprintf("dbbackup v%s • Enterprise Database Backup & Recovery", m.config.Version)
s += "\n" + infoStyle.Render(brandLine) + "\n"
// Header // Header
header := titleStyle.Render("Database Backup Tool - Interactive Menu") header := titleStyle.Render("Interactive Menu")
s += fmt.Sprintf("\n%s\n\n", header) s += fmt.Sprintf("%s\n\n", header)
if len(m.dbTypes) > 0 { if len(m.dbTypes) > 0 {
options := make([]string, len(m.dbTypes)) options := make([]string, len(m.dbTypes))