feat(tui): responsive table layout for all tabs
CI / test (pull_request) Successful in 2m45s
CI / lint (pull_request) Successful in 1m12s
CI / vulncheck (pull_request) Successful in 1m6s

Extract shared computeTableLayout() into table_helpers.go — takes column
definitions with short/full headers, min/max widths, and a flex column
that absorbs surplus space. All tabs now use it:

- Alerts: CONFIG column is flex, NAME/TYPE/SENT expand with width
- Maint: TITLE column is flex, TYPE/MONITORS/STATUS/dates expand
- Nodes: NAME column is flex, REGION/LAST SEEN/VERSION expand
- Users: PUBLIC KEY column is flex, USERNAME expands
- Sites: uses same colDef type (keeps special dual-flex for NAME+HISTORY)

Headers auto-switch short/full based on available width across all tabs.
This commit is contained in:
2026-05-28 15:20:12 -04:00
parent 217276ca18
commit d05bbd007b
6 changed files with 144 additions and 30 deletions
+73
View File
@@ -15,6 +15,79 @@ var (
type StyleOverride func(row, col int) *lipgloss.Style
type colDef struct {
short string
full string
minWidth int
maxWidth int
flex bool
}
func (m Model) computeTableLayout(cols []colDef, maxContentWidth int) ([]string, []int) {
numCols := len(cols)
borderOverhead := 2 + (numCols - 1)
usable := m.termWidth - chromePadH - 2 - borderOverhead
if usable < 40 {
usable = 40
}
fixedMin := 0
flexIdx := -1
for i, c := range cols {
if c.flex {
flexIdx = i
continue
}
fixedMin += c.minWidth
}
flexW := usable - fixedMin
if maxContentWidth > 0 && flexW > maxContentWidth {
flexW = maxContentWidth
}
if flexW < 8 {
flexW = 8
}
surplus := usable - fixedMin - flexW
if surplus < 0 {
surplus = 0
}
headers := make([]string, numCols)
widths := make([]int, numCols)
for i, c := range cols {
if c.flex {
headers[i] = c.full
widths[i] = flexW
continue
}
w := c.minWidth
expand := c.maxWidth - c.minWidth
if surplus >= expand {
w = c.maxWidth
surplus -= expand
} else if surplus > 0 {
w += surplus
surplus = 0
}
if w >= len(c.full)+2 {
headers[i] = c.full
} else {
headers[i] = c.short
}
widths[i] = w
}
if surplus > 0 && flexIdx >= 0 {
widths[flexIdx] += surplus
}
return headers, widths
}
func (m Model) renderTable(headers []string, items int, buildRows func(start, end int) [][]string, colWidths []int, styleOverride StyleOverride) string {
if items == 0 {
return ""