feat(tui): responsive table layout for all tabs
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:
@@ -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 ""
|
||||
|
||||
Reference in New Issue
Block a user