5401266e83
Replace continuous surplus distribution with two fixed layouts per table. Breakpoint at 120 columns — matches how btop/k9s do it. Compact (<120): short headers (LAT, UP%, RT, ST, MON, SENT, VER), tight fixed widths, no surplus guessing. Wide (≥120): full headers (LATENCY, UPTIME, RETRIES, STATUS, MONITORS, LAST SENT, VERSION), generous widths. Sites tab keeps content-aware NAME sizing + sparkline flex. All other tabs (Alerts, Maint, Nodes, Users) use simple fixed tiers. Removed old computeTableLayout/colDef/tierCol/pickTier — no longer needed.
84 lines
1.9 KiB
Go
84 lines
1.9 KiB
Go
package tui
|
|
|
|
import (
|
|
"github.com/charmbracelet/lipgloss"
|
|
"github.com/charmbracelet/lipgloss/table"
|
|
)
|
|
|
|
var (
|
|
tableHeaderStyle lipgloss.Style
|
|
tableCellStyle lipgloss.Style
|
|
tableSelectedStyle lipgloss.Style
|
|
tableBorderStyle lipgloss.Style
|
|
tableZebraStyle lipgloss.Style
|
|
)
|
|
|
|
type StyleOverride func(row, col int) *lipgloss.Style
|
|
|
|
const wideBreakpoint = 120
|
|
|
|
func (m Model) isWide() bool {
|
|
return m.termWidth >= wideBreakpoint
|
|
}
|
|
|
|
func (m Model) renderTable(headers []string, items int, buildRows func(start, end int) [][]string, colWidths []int, styleOverride StyleOverride) string {
|
|
if items == 0 {
|
|
return ""
|
|
}
|
|
|
|
end := m.tableOffset + m.maxTableRows
|
|
if end > items {
|
|
end = items
|
|
}
|
|
|
|
selectedVisual := m.cursor - m.tableOffset
|
|
rows := buildRows(m.tableOffset, end)
|
|
|
|
tableWidth := m.termWidth - chromePadH - 2
|
|
if tableWidth < 40 {
|
|
tableWidth = 40
|
|
}
|
|
|
|
t := table.New().
|
|
Border(lipgloss.RoundedBorder()).
|
|
BorderStyle(tableBorderStyle).
|
|
Width(tableWidth).
|
|
Headers(headers...).
|
|
Rows(rows...).
|
|
StyleFunc(func(row, col int) lipgloss.Style {
|
|
if row == table.HeaderRow {
|
|
h := tableHeaderStyle
|
|
if col < len(colWidths) && colWidths[col] > 0 {
|
|
h = h.Width(colWidths[col]).MaxWidth(colWidths[col])
|
|
}
|
|
return h
|
|
}
|
|
isSelected := row == selectedVisual
|
|
if styleOverride != nil {
|
|
if s := styleOverride(row, col); s != nil {
|
|
style := *s
|
|
if isSelected {
|
|
style = tableSelectedStyle.Foreground(s.GetForeground())
|
|
}
|
|
if col < len(colWidths) && colWidths[col] > 0 {
|
|
style = style.Width(colWidths[col]).MaxWidth(colWidths[col])
|
|
}
|
|
return style
|
|
}
|
|
}
|
|
base := tableCellStyle
|
|
if row%2 == 1 {
|
|
base = tableZebraStyle
|
|
}
|
|
if isSelected {
|
|
base = tableSelectedStyle
|
|
}
|
|
if col < len(colWidths) && colWidths[col] > 0 {
|
|
base = base.Width(colWidths[col]).MaxWidth(colWidths[col])
|
|
}
|
|
return base
|
|
})
|
|
|
|
return "\n" + t.Render()
|
|
}
|