feat(tui): persist detail panel state as user preference
Detail open/closed state saved via SetPreference on toggle and restored on session start. Same pattern as theme persistence — survives restarts and works per-user over SSH.
This commit is contained in:
@@ -219,6 +219,8 @@ func InitialModel(isAdmin bool, s store.Store, eng *monitor.Engine, version stri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
detailPref, _ := s.GetPreference(context.Background(), "detail_open")
|
||||||
|
|
||||||
return Model{
|
return Model{
|
||||||
state: stateDashboard,
|
state: stateDashboard,
|
||||||
logViewport: vpLogs,
|
logViewport: vpLogs,
|
||||||
@@ -232,6 +234,7 @@ func InitialModel(isAdmin bool, s store.Store, eng *monitor.Engine, version stri
|
|||||||
theme: theme,
|
theme: theme,
|
||||||
themeIndex: themeIdx,
|
themeIndex: themeIdx,
|
||||||
st: newStyles(theme),
|
st: newStyles(theme),
|
||||||
|
detailOpen: detailPref == "true",
|
||||||
demoMode: os.Getenv("UPTOP_DEMO") == "1",
|
demoMode: os.Getenv("UPTOP_DEMO") == "1",
|
||||||
version: version,
|
version: version,
|
||||||
sparkTooltipIdx: -1,
|
sparkTooltipIdx: -1,
|
||||||
|
|||||||
+19
-1
@@ -624,9 +624,23 @@ func (m *Model) handleDashboardKey(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
|
|||||||
if m.currentTab == tabMonitors && len(m.sites) > 0 {
|
if m.currentTab == tabMonitors && len(m.sites) > 0 {
|
||||||
m.detailOpen = !m.detailOpen
|
m.detailOpen = !m.detailOpen
|
||||||
m.recalcLayout()
|
m.recalcLayout()
|
||||||
|
st := m.store
|
||||||
|
open := m.detailOpen
|
||||||
|
var cmd tea.Cmd
|
||||||
if m.detailOpen {
|
if m.detailOpen {
|
||||||
return m, m.loadDetailCmd(m.sites[m.cursor].ID)
|
cmd = m.loadDetailCmd(m.sites[m.cursor].ID)
|
||||||
}
|
}
|
||||||
|
saveCmd := writeCmd("Save detail preference", func() error {
|
||||||
|
v := "false"
|
||||||
|
if open {
|
||||||
|
v = "true"
|
||||||
|
}
|
||||||
|
return st.SetPreference(context.Background(), "detail_open", v)
|
||||||
|
})
|
||||||
|
if cmd != nil {
|
||||||
|
return m, tea.Batch(cmd, saveCmd)
|
||||||
|
}
|
||||||
|
return m, saveCmd
|
||||||
} else if m.currentTab == tabSettings && m.settingsSection == sectionAlerts && len(m.alerts) > 0 {
|
} else if m.currentTab == tabSettings && m.settingsSection == sectionAlerts && len(m.alerts) > 0 {
|
||||||
m.state = stateAlertDetail
|
m.state = stateAlertDetail
|
||||||
}
|
}
|
||||||
@@ -637,6 +651,10 @@ func (m *Model) handleDashboardKey(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
|
|||||||
} else if m.detailOpen {
|
} else if m.detailOpen {
|
||||||
m.detailOpen = false
|
m.detailOpen = false
|
||||||
m.recalcLayout()
|
m.recalcLayout()
|
||||||
|
st := m.store
|
||||||
|
return m, writeCmd("Save detail preference", func() error {
|
||||||
|
return st.SetPreference(context.Background(), "detail_open", "false")
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "h":
|
case "h":
|
||||||
|
|||||||
Reference in New Issue
Block a user