Compare commits

1 Commits

Author SHA1 Message Date
lerko faf7d36c64 refactor(tui): replace # column with colored status dot
CI / test (pull_request) Successful in 2m7s
CI / lint (pull_request) Successful in 1m27s
CI / vulncheck (pull_request) Successful in 1m1s
Drop the row-number column and add a colored status dot as the first
column. Dot uses the same icon/color as the existing status indicators
(▲ green for up, ▼ red for down, ◼ purple for maint, etc). Matches
the maint strip visual pattern. Status text column retained for
explicit label.
2026-06-30 23:38:05 -04:00
+49 -17
View File
@@ -37,7 +37,6 @@ const (
colDot colKey = iota colDot colKey = iota
colName colName
colType colType
colStatus
colLatency colLatency
colUptime colUptime
colHistory colHistory
@@ -57,15 +56,16 @@ type columnDef struct {
var siteColumns = []columnDef{ var siteColumns = []columnDef{
{colDot, "", "", 3, 3, 0}, {colDot, "", "", 3, 3, 0},
{colName, "NAME", "NAME", 0, 0, 0}, {colName, "NAME", "NAME", 0, 0, 0},
{colType, "TYPE", "TYPE", 10, 8, mediumBreakpoint}, {colType, "TYPE", "TYPE", 10, 8, 0},
{colStatus, "STATUS", "STATUS", 10, 10, 0},
{colLatency, "LATENCY", "LAT", 10, 7, 0}, {colLatency, "LATENCY", "LAT", 10, 7, 0},
{colUptime, "UPTIME", "UP%", 8, 8, mediumBreakpoint}, {colUptime, "UPTIME", "UP%", 8, 8, 0},
{colHistory, "HISTORY", "HISTORY", 0, 0, mediumBreakpoint}, {colHistory, "HISTORY", "HISTORY", 0, 0, 0},
{colSSL, "SSL", "SSL", 7, 5, wideBreakpoint}, {colSSL, "SSL", "SSL", 7, 5, 0},
{colRetries, "RETRIES", "RT", 9, 5, wideBreakpoint}, {colRetries, "RETRIES", "RT", 9, 5, 0},
} }
var columnDropOrder = []colKey{colHistory, colRetries, colSSL, colUptime, colType}
type tableLayout struct { type tableLayout struct {
nameW, sparkW int nameW, sparkW int
headers []string headers []string
@@ -76,17 +76,51 @@ type tableLayout struct {
func (m Model) computeLayout() tableLayout { func (m Model) computeLayout() tableLayout {
wide := m.isWide() wide := m.isWide()
var active []colKey
var headers []string
var widths []int
var fixed int
cw := m.contentWidth cw := m.contentWidth
if cw == 0 { if cw == 0 {
cw = m.termWidth cw = m.termWidth
} }
dropped := make(map[colKey]bool)
minNameW := 20
minSparkW := 12
for attempt := 0; attempt <= len(columnDropOrder); attempt++ {
var fixed int
var flexCount int
for _, c := range siteColumns {
if dropped[c.key] {
continue
}
w := c.narrowW
if wide {
w = c.wideW
}
if w > 0 {
fixed += w
} else {
flexCount++
}
}
numCols := len(siteColumns) - len(dropped)
borderOverhead := 2 + (numCols - 1)
avail := cw - chromePadH - 2 - borderOverhead - fixed
minFlex := minNameW
if flexCount > 1 {
minFlex += minSparkW
}
if avail >= minFlex || attempt >= len(columnDropOrder) {
break
}
dropped[columnDropOrder[attempt]] = true
}
var active []colKey
var headers []string
var widths []int
var fixed int
for _, c := range siteColumns { for _, c := range siteColumns {
if c.minTerm > 0 && cw < c.minTerm { if dropped[c.key] {
continue continue
} }
active = append(active, c.key) active = append(active, c.key)
@@ -106,12 +140,12 @@ func (m Model) computeLayout() tableLayout {
} }
sortColMap := map[int]colKey{ sortColMap := map[int]colKey{
sortStatus: colStatus, sortStatus: colDot,
sortName: colName, sortName: colName,
sortLatency: colLatency, sortLatency: colLatency,
} }
sortableKeys := map[colKey]string{ sortableKeys := map[colKey]string{
colStatus: "sort-status", colDot: "sort-status",
colName: "sort-name", colName: "sort-name",
colLatency: "sort-latency", colLatency: "sort-latency",
} }
@@ -250,7 +284,6 @@ func (m Model) viewSitesTab() string {
colDot: m.fmtStatusDot(site.Status, site.Paused, inMaint), colDot: m.fmtStatusDot(site.Status, site.Paused, inMaint),
colName: m.zones.Mark(fmt.Sprintf("site-%d", i), icon+" "+limitStr(site.Name, nameW-4)), colName: m.zones.Mark(fmt.Sprintf("site-%d", i), icon+" "+limitStr(site.Name, nameW-4)),
colType: "group", colType: "group",
colStatus: m.fmtStatus(site.Status, site.Paused, inMaint),
colLatency: m.st.subtleStyle.Render("—"), colLatency: m.st.subtleStyle.Render("—"),
colUptime: m.groupUptime(site.ID), colUptime: m.groupUptime(site.ID),
colHistory: m.groupSparkline(site.ID, sparkWidth, rowBg), colHistory: m.groupSparkline(site.ID, sparkWidth, rowBg),
@@ -299,7 +332,6 @@ func (m Model) viewSitesTab() string {
colDot: m.fmtStatusDot(site.Status, site.Paused, inMaint), colDot: m.fmtStatusDot(site.Status, site.Paused, inMaint),
colName: m.zones.Mark(fmt.Sprintf("site-%d", i), name), colName: m.zones.Mark(fmt.Sprintf("site-%d", i), name),
colType: typeIcon(site.Type, false) + " " + site.Type, colType: typeIcon(site.Type, false) + " " + site.Type,
colStatus: m.fmtStatus(site.Status, site.Paused, inMaint),
colLatency: m.fmtLatency(site.Latency), colLatency: m.fmtLatency(site.Latency),
colUptime: m.fmtUptimeMaint(hist.Statuses, site.ID), colUptime: m.fmtUptimeMaint(hist.Statuses, site.ID),
colHistory: spark, colHistory: spark,