polish(tui): overhaul tab bar — consistent counts, active highlight, colored alerts
Closes #89
This commit was merged in pull request #94.
This commit is contained in:
+1
-1
@@ -43,7 +43,7 @@ func applyTheme(t Theme) {
|
|||||||
sparkDanger = string(t.Danger)
|
sparkDanger = string(t.Danger)
|
||||||
|
|
||||||
titleStyle = lipgloss.NewStyle().Foreground(t.Accent).Bold(true)
|
titleStyle = lipgloss.NewStyle().Foreground(t.Accent).Bold(true)
|
||||||
activeTab = lipgloss.NewStyle().Border(lipgloss.NormalBorder(), false, false, true, false).BorderForeground(t.Accent).Foreground(t.Accent).Bold(true).Padding(0, 1)
|
activeTab = lipgloss.NewStyle().Background(t.Surface).Foreground(t.Accent).Bold(true).Padding(0, 1)
|
||||||
inactiveTab = lipgloss.NewStyle().Padding(0, 1).Foreground(t.Muted)
|
inactiveTab = lipgloss.NewStyle().Padding(0, 1).Foreground(t.Muted)
|
||||||
|
|
||||||
tableHeaderStyle = lipgloss.NewStyle().Foreground(t.Accent).Bold(true).Padding(0, 1)
|
tableHeaderStyle = lipgloss.NewStyle().Foreground(t.Accent).Bold(true).Padding(0, 1)
|
||||||
|
|||||||
@@ -190,45 +190,42 @@ func (m Model) viewDashboard() string {
|
|||||||
return outerPad.Render(lipgloss.JoinVertical(lipgloss.Top, header, paddedContent, footer))
|
return outerPad.Render(lipgloss.JoinVertical(lipgloss.Top, header, paddedContent, footer))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type tabEntry struct {
|
||||||
|
name string
|
||||||
|
count int
|
||||||
|
warn int
|
||||||
|
}
|
||||||
|
|
||||||
func (m Model) renderTabBar(stats dashboardStats) string {
|
func (m Model) renderTabBar(stats dashboardStats) string {
|
||||||
var sitesLabel string
|
tabs := []tabEntry{
|
||||||
if stats.downCount > 0 {
|
{"Sites", stats.totalMonitors, stats.downCount + stats.lateCount},
|
||||||
sitesLabel = fmt.Sprintf("Sites (%d↓)", stats.downCount)
|
{"Alerts", len(m.alerts), 0},
|
||||||
} else if stats.lateCount > 0 {
|
{"Logs", 0, 0},
|
||||||
sitesLabel = fmt.Sprintf("Sites (%d⚠)", stats.lateCount)
|
{"Nodes", len(m.nodes), stats.offlineNodes},
|
||||||
} else if stats.totalMonitors > 0 {
|
{"Maint", len(m.maintenanceWindows), stats.activeMaint},
|
||||||
sitesLabel = fmt.Sprintf("Sites (%d)", stats.totalMonitors)
|
|
||||||
} else {
|
|
||||||
sitesLabel = "Sites"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var nodesLabel string
|
|
||||||
if stats.offlineNodes > 0 {
|
|
||||||
nodesLabel = fmt.Sprintf("Nodes (%d!)", stats.offlineNodes)
|
|
||||||
} else if len(m.nodes) > 0 {
|
|
||||||
nodesLabel = fmt.Sprintf("Nodes (%d)", len(m.nodes))
|
|
||||||
} else {
|
|
||||||
nodesLabel = "Nodes"
|
|
||||||
}
|
|
||||||
|
|
||||||
var maintLabel string
|
|
||||||
if stats.activeMaint > 0 {
|
|
||||||
maintLabel = fmt.Sprintf("Maint (%d)", stats.activeMaint)
|
|
||||||
} else {
|
|
||||||
maintLabel = "Maint"
|
|
||||||
}
|
|
||||||
|
|
||||||
tabs := []string{sitesLabel, "Alerts", "Logs", nodesLabel, maintLabel}
|
|
||||||
if m.isAdmin {
|
if m.isAdmin {
|
||||||
tabs = append(tabs, "Users")
|
tabs = append(tabs, tabEntry{"Users", len(m.users), 0})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
countStyle := lipgloss.NewStyle().Foreground(m.theme.Muted)
|
||||||
|
|
||||||
var renderedTabs []string
|
var renderedTabs []string
|
||||||
for i, t := range tabs {
|
for i, t := range tabs {
|
||||||
|
label := t.name
|
||||||
|
if t.count > 0 {
|
||||||
|
badge := countStyle.Render(fmt.Sprintf(" %d", t.count))
|
||||||
|
if t.warn > 0 {
|
||||||
|
badge = dangerStyle.Render(fmt.Sprintf(" %d", t.warn))
|
||||||
|
}
|
||||||
|
label += badge
|
||||||
|
}
|
||||||
|
|
||||||
var rendered string
|
var rendered string
|
||||||
if i == m.currentTab {
|
if i == m.currentTab {
|
||||||
rendered = activeTab.Render(t)
|
rendered = activeTab.Render(label)
|
||||||
} else {
|
} else {
|
||||||
rendered = inactiveTab.Render(t)
|
rendered = inactiveTab.Render(label)
|
||||||
}
|
}
|
||||||
renderedTabs = append(renderedTabs, m.zones.Mark(fmt.Sprintf("tab-%d", i), rendered))
|
renderedTabs = append(renderedTabs, m.zones.Mark(fmt.Sprintf("tab-%d", i), rendered))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user