diff --git a/internal/tui/update.go b/internal/tui/update.go index 5b233a7..9ddcbb6 100644 --- a/internal/tui/update.go +++ b/internal/tui/update.go @@ -650,23 +650,27 @@ func (m *Model) handleDashboardKey(msg tea.KeyMsg) (tea.Model, tea.Cmd) { return m, nil } if len(m.sites) > 0 { - site := m.sites[m.cursor] - if site.Type == "group" { - m.collapsed[site.ID] = !m.collapsed[site.ID] - payload := collapsedJSON(m.collapsed) - st := m.store - ctx := m.ctx - m.refreshLive() - return m, writeCmd("Save collapsed groups", func() error { - return st.SetPreference(ctx, "collapsed_groups", payload) - }) + m.detailOpen = !m.detailOpen + m.detailMode = detailDefault + m.recalcLayout() + st := m.store + ctx := m.ctx + open := m.detailOpen + var cmd tea.Cmd + if m.detailOpen { + cmd = m.loadDetailCmd(m.sites[m.cursor].ID) } - if !m.detailOpen { - m.detailOpen = true - m.detailMode = detailDefault - m.recalcLayout() + saveCmd := writeCmd("Save detail preference", func() error { + v := "false" + if open { + v = "true" + } + return st.SetPreference(ctx, "detail_open", v) + }) + if cmd != nil { + return m, tea.Batch(cmd, saveCmd) } - return m, m.loadDetailCmd(site.ID) + return m, saveCmd } case "e": return m.handleEditItem() @@ -693,29 +697,6 @@ func (m *Model) handleDashboardKey(msg tea.KeyMsg) (tea.Model, tea.Cmd) { return st.UpdateSitePaused(ctx, id, paused) }) } - case "i": - if len(m.sites) > 0 { - m.detailOpen = !m.detailOpen - m.recalcLayout() - st := m.store - ctx := m.ctx - open := m.detailOpen - var cmd tea.Cmd - if m.detailOpen { - cmd = m.loadDetailCmd(m.sites[m.cursor].ID) - } - saveCmd := writeCmd("Save detail preference", func() error { - v := "false" - if open { - v = "true" - } - return st.SetPreference(ctx, "detail_open", v) - }) - if cmd != nil { - return m, tea.Batch(cmd, saveCmd) - } - return m, saveCmd - } case "esc": if m.focusedPanel != panelMonitors { m.focusedPanel = panelMonitors diff --git a/internal/tui/view_dashboard.go b/internal/tui/view_dashboard.go index cb0345e..5999fbb 100644 --- a/internal/tui/view_dashboard.go +++ b/internal/tui/view_dashboard.go @@ -277,28 +277,46 @@ func (m Model) renderStatusLine(stats dashboardStats) string { return left + strings.Repeat(" ", padW) + ver } +func (m Model) hotkey(key, desc string) string { + k := lipgloss.NewStyle().Foreground(m.theme.Accent).Render(key) + d := m.st.subtleStyle.Render(desc) + return k + " " + d +} + func (m Model) renderFooter(_ dashboardStats) string { + dot := m.st.subtleStyle.Render(" · ") + if m.filterMode { cursor := lipgloss.NewStyle().Foreground(m.theme.Accent).Render("│") - return "\n" + m.st.titleStyle.Render("/") + " " + m.filterText + cursor + " " + m.st.subtleStyle.Render("[Enter]Apply [Esc]Clear") + keys := m.hotkey("Enter", "Apply") + dot + m.hotkey("Esc", "Clear") + return "\n" + m.st.titleStyle.Render("/") + " " + m.filterText + cursor + " " + keys } - var keys string + var parts []string if m.focusedPanel == panelMaint { - keys = "[n]New [x]End [d]Del [Esc]Back [S]Settings [T]Theme [q]Quit" + parts = []string{m.hotkey("n", "New"), m.hotkey("x", "End"), m.hotkey("d", "Del"), m.hotkey("Esc", "Back")} } else if m.focusedPanel == panelLogs { - keys = "[↑/↓]Scroll [Enter]Expand [l/Esc]Back [S]Settings [T]Theme [q]Quit" + parts = []string{m.hotkey("↑/↓", "Scroll"), m.hotkey("Enter", "Expand"), m.hotkey("l/Esc", "Back")} } else if m.detailOpen && m.detailMode == detailSLA { - keys = "[1-4]Period [Esc]Back [l]Logs [S]Settings [T]Theme [q]Quit" + parts = []string{m.hotkey("1-4", "Period"), m.hotkey("Esc", "Back")} } else if m.detailOpen && m.detailMode == detailHistory { - keys = "[Esc]Back [l]Logs [S]Settings [T]Theme [q]Quit" + parts = []string{m.hotkey("Esc", "Back")} } else if m.detailOpen { - keys = "[i]Close [h]History [s]SLA [e]Edit [m]Maint [l]Logs [S]Settings [T]Theme [q]Quit" + parts = []string{m.hotkey("Enter", "Close"), m.hotkey("h", "History"), m.hotkey("s", "SLA"), m.hotkey("e", "Edit"), m.hotkey("m", "Maint")} } else { - keys = "[/]Filter [i]Info [Enter]Detail [n]New [e]Edit [d]Del [m]Maint [l]Logs [S]Settings [T]Theme [q]Quit" + parts = []string{m.hotkey("/", "Filter"), m.hotkey("Enter", "Detail")} + if m.cursor < len(m.sites) && m.sites[m.cursor].Type == "group" { + if m.collapsed[m.sites[m.cursor].ID] { + parts = append(parts, m.hotkey("Space", "Expand")) + } else { + parts = append(parts, m.hotkey("Space", "Collapse")) + } + } + parts = append(parts, m.hotkey("n", "New"), m.hotkey("e", "Edit"), m.hotkey("d", "Del"), m.hotkey("m", "Maint")) } + parts = append(parts, m.hotkey("l", "Logs"), m.hotkey("S", "Settings"), m.hotkey("T", "Theme"), m.hotkey("q", "Quit")) - line := m.st.subtleStyle.Render(keys) + line := strings.Join(parts, dot) if m.filterText != "" { line = m.st.subtleStyle.Render(fmt.Sprintf("filter: %s ", m.filterText)) + line }