100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
package tui
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/charmbracelet/lipgloss"
|
|
)
|
|
|
|
type helpBinding struct {
|
|
Key string
|
|
Desc string
|
|
}
|
|
|
|
func (a *App) activeTabBindings() ([]helpBinding, bool) {
|
|
switch a.activeTab {
|
|
case TabScan:
|
|
return []helpBinding{
|
|
{"s", "start scan"},
|
|
{"r", "retry errored rows"},
|
|
{"enter", "show row detail"},
|
|
{"esc", "cancel running scan / close modal"},
|
|
}, true
|
|
case TabEvaluate:
|
|
return []helpBinding{
|
|
{"r", "refresh pending"},
|
|
{"e", "evaluate pending batch"},
|
|
{"enter", "open report"},
|
|
{"esc", "cancel running eval / close modal"},
|
|
}, true
|
|
case TabTracker:
|
|
return []helpBinding{
|
|
{"r", "refresh list"},
|
|
{"a", "advance status (state machine)"},
|
|
{"n", "add note to selected app"},
|
|
{"f", "show pending follow-ups"},
|
|
}, true
|
|
case TabReports:
|
|
return []helpBinding{
|
|
{"enter", "open report file"},
|
|
{"/", "filter by company"},
|
|
{"r", "refresh list"},
|
|
}, true
|
|
case TabSettings:
|
|
return []helpBinding{
|
|
{"↑/↓", "move between fields"},
|
|
{"enter", "edit field"},
|
|
{"esc", "cancel edit"},
|
|
}, true
|
|
case TabIntake:
|
|
return []helpBinding{
|
|
{"tab", "next field"},
|
|
{"enter", "advance phase"},
|
|
}, true
|
|
}
|
|
return nil, false
|
|
}
|
|
|
|
func (a *App) renderHelp() string {
|
|
var b strings.Builder
|
|
b.WriteString(StyleTitle.Render("Help — keybindings"))
|
|
b.WriteString("\n\n")
|
|
b.WriteString(StyleSubtitle.Render("Global"))
|
|
b.WriteString("\n")
|
|
global := []helpBinding{
|
|
{"↑/↓", "switch tab (sidebar)"},
|
|
{"j/k", "move cursor in table"},
|
|
{"enter", "select / drill in"},
|
|
{"tab/shift+tab", "switch tab"},
|
|
{"?", "toggle help"},
|
|
{"q / ctrl+c", "quit"},
|
|
}
|
|
for _, kb := range global {
|
|
b.WriteString(" ")
|
|
b.WriteString(StyleKey.Render(padRight(kb.Key, 14)))
|
|
b.WriteString(StyleKeyDesc.Render(kb.Desc))
|
|
b.WriteString("\n")
|
|
}
|
|
if tab, ok := a.activeTabBindings(); ok {
|
|
b.WriteString("\n")
|
|
b.WriteString(StyleSubtitle.Render(a.activeTab))
|
|
b.WriteString("\n")
|
|
for _, kb := range tab {
|
|
b.WriteString(" ")
|
|
b.WriteString(StyleKey.Render(padRight(kb.Key, 14)))
|
|
b.WriteString(StyleKeyDesc.Render(kb.Desc))
|
|
b.WriteString("\n")
|
|
}
|
|
}
|
|
b.WriteString("\n")
|
|
b.WriteString(StyleKeyDesc.Render("press ? or esc to close"))
|
|
return lipgloss.NewStyle().Width(52).Render(StyleModal.Render(b.String()))
|
|
}
|
|
|
|
func padRight(s string, n int) string {
|
|
if len(s) >= n {
|
|
return s
|
|
}
|
|
return s + strings.Repeat(" ", n-len(s))
|
|
}
|