feat(tui): mouse click for settings sections, column sort, logs toggle
CI / test (pull_request) Successful in 1m50s
CI / lint (pull_request) Successful in 1m16s
CI / vulncheck (pull_request) Successful in 51s

- Click Alerts/Nodes/Users sub-tabs in settings to switch sections
- Click STATUS/NAME/LATENCY column headers to sort (click again
  to reverse direction)
- Click logs panel to toggle focus (click again to unfocus)
This commit is contained in:
2026-06-28 11:34:34 -04:00
parent ab1194f74d
commit 83d9754c89
3 changed files with 55 additions and 3 deletions
+6 -2
View File
@@ -1,6 +1,8 @@
package tui
import (
"fmt"
"github.com/charmbracelet/lipgloss"
)
@@ -18,11 +20,13 @@ func (m Model) viewSettingsTab() string {
var tabs []string
for i, name := range sections {
var rendered string
if i == m.settingsSection {
tabs = append(tabs, m.st.activeTab.Render(name))
rendered = m.st.activeTab.Render(name)
} else {
tabs = append(tabs, m.st.inactiveTab.Render(name))
rendered = m.st.inactiveTab.Render(name)
}
tabs = append(tabs, m.zones.Mark(fmt.Sprintf("section-%d", i), rendered))
}
header := lipgloss.JoinHorizontal(lipgloss.Top, tabs...)
+10
View File
@@ -110,6 +110,11 @@ func (m Model) computeLayout() tableLayout {
sortName: colName,
sortLatency: colLatency,
}
sortableKeys := map[colKey]string{
colStatus: "sort-status",
colName: "sort-name",
colLatency: "sort-latency",
}
if sortedKey, ok := sortColMap[m.sortColumn]; ok {
arrow := "▼"
if m.sortAsc {
@@ -122,6 +127,11 @@ func (m Model) computeLayout() tableLayout {
}
}
}
for i, k := range active {
if zoneID, ok := sortableKeys[k]; ok {
headers[i] = m.zones.Mark(zoneID, headers[i])
}
}
numCols := len(headers)
borderOverhead := 2 + (numCols - 1)
+38
View File
@@ -840,11 +840,49 @@ func (m *Model) handleClick(msg tea.MouseMsg) (tea.Model, tea.Cmd) {
}
}
if m.currentTab == tabSettings {
maxSec := 1
if m.isAdmin {
maxSec = 2
}
for i := 0; i <= maxSec; i++ {
if m.zones.Get(fmt.Sprintf("section-%d", i)).InBounds(msg) {
m.switchSettingsSection(i)
return m, nil
}
}
}
if m.currentTab == tabMonitors {
sortZones := []struct {
zone string
col int
}{
{"sort-status", sortStatus},
{"sort-name", sortName},
{"sort-latency", sortLatency},
}
for _, sz := range sortZones {
if m.zones.Get(sz.zone).InBounds(msg) {
if m.sortColumn == sz.col {
m.sortAsc = !m.sortAsc
} else {
m.sortColumn = sz.col
m.sortAsc = false
}
m.refreshLive()
return m, nil
}
}
if m.zones.Get("panel-monitors").InBounds(msg) {
m.focusedPanel = panelMonitors
} else if m.zones.Get("panel-logs").InBounds(msg) {
if m.focusedPanel == panelLogs {
m.focusedPanel = panelMonitors
} else {
m.focusedPanel = panelLogs
}
return m, nil
} else if m.detailOpen && m.zones.Get("panel-detail").InBounds(msg) {
m.focusedPanel = panelDetail