diff --git a/pkg/tui/commands.go b/pkg/tui/commands.go index 20c73ef..9f881bb 100644 --- a/pkg/tui/commands.go +++ b/pkg/tui/commands.go @@ -11,7 +11,6 @@ import ( "slices" "github.com/PagerDuty/go-pagerduty" - "github.com/charmbracelet/bubbles/table" tea "github.com/charmbracelet/bubbletea" "github.com/clcollins/srepd/pkg/pd" ) @@ -459,14 +458,19 @@ func acknowledged(a []pagerduty.Acknowledgement) string { return dot } -func doIfIncidentSelected(table table.Model, cmd tea.Cmd) tea.Cmd { - return func() tea.Msg { - if table.SelectedRow() == nil { - return errMsg{errors.New("no incident selected")} - } +func doIfIncidentSelected(m *model, cmd tea.Cmd) tea.Cmd { + debug("doIfIncidentSelected()") + if m.table.SelectedRow() == nil { + debug("doIfIncidentSelected(): selected row is nil") + m.setStatus(nilIncidentErr) + m.viewingIncident = false return tea.Sequence( - func() tea.Msg { return getIncidentMsg(table.SelectedRow()[1]) }, - cmd, + func() tea.Msg { return errMsg{errors.New(nilIncidentErr)} }, ) } + debug("doIfIncidentSelected(): got selected row") + return tea.Sequence( + func() tea.Msg { return getIncidentMsg(m.table.SelectedRow()[1]) }, + cmd, + ) } diff --git a/pkg/tui/keymap.go b/pkg/tui/keymap.go index 10efe4e..24488e7 100644 --- a/pkg/tui/keymap.go +++ b/pkg/tui/keymap.go @@ -3,7 +3,7 @@ package tui import "github.com/charmbracelet/bubbles/key" func (k keymap) ShortHelp() []key.Binding { - return []key.Binding{k.Help, k.Quit} + return []key.Binding{k.Help, k.Back, k.Quit} } func (k keymap) FullHelp() [][]key.Binding { @@ -102,3 +102,14 @@ var defaultKeyMap = keymap{ key.WithHelp("o", "open in browser"), ), } + +var errorViewKeyMap = keymap{ + Quit: key.NewBinding( + key.WithKeys("q", "ctrl+c"), + key.WithHelp("q/ctrl+c", "quit"), + ), + Back: key.NewBinding( + key.WithKeys("esc"), + key.WithHelp("esc", "back"), + ), +} diff --git a/pkg/tui/model.go b/pkg/tui/model.go index f5a5015..c343478 100644 --- a/pkg/tui/model.go +++ b/pkg/tui/model.go @@ -89,6 +89,10 @@ func (m *model) setStatus(msg string) { log.Printf("%s\n", d) } +func (m *model) toggleHelp() { + m.help.ShowAll = !m.help.ShowAll +} + func newTableWithStyles() table.Model { debug("newTableWithStyles") t := table.New(table.WithFocused(true)) @@ -108,7 +112,7 @@ func newTextInput() textinput.Model { func newHelp() help.Model { debug("newHelp") h := help.New() - h.ShowAll = false + h.ShowAll = true return h } diff --git a/pkg/tui/msgHandlers.go b/pkg/tui/msgHandlers.go index c033f04..868dc4e 100644 --- a/pkg/tui/msgHandlers.go +++ b/pkg/tui/msgHandlers.go @@ -78,7 +78,7 @@ func switchTableFocusMode(m model, msg tea.Msg) (tea.Model, tea.Cmd) { case tea.KeyMsg: switch { case key.Matches(msg, defaultKeyMap.Help): - m.help.ShowAll = !m.help.ShowAll + m.toggleHelp() case key.Matches(msg, defaultKeyMap.Up): m.table.MoveUp(1) @@ -95,8 +95,9 @@ func switchTableFocusMode(m model, msg tea.Msg) (tea.Model, tea.Cmd) { case key.Matches(msg, defaultKeyMap.Enter): m.viewingIncident = true // TODO TODAY - fix this + debug("Enter key pressed") return m, doIfIncidentSelected( - m.table, + &m, func() tea.Msg { return waitForSelectedIncidentThenDoMsg{action: func() tea.Msg { return renderIncidentMsg("render") }, msg: "render"} }, @@ -176,7 +177,7 @@ func switchInputFocusMode(m model, msg tea.Msg) (tea.Model, tea.Cmd) { case tea.KeyMsg: switch { case key.Matches(msg, defaultKeyMap.Help): - m.help.ShowAll = !m.help.ShowAll + m.toggleHelp() case key.Matches(msg, defaultKeyMap.Back): m.input.Blur() @@ -200,7 +201,7 @@ func switchIncidentFocusMode(m model, msg tea.Msg) (tea.Model, tea.Cmd) { case tea.KeyMsg: switch { case key.Matches(msg, defaultKeyMap.Help): - m.help.ShowAll = !m.help.ShowAll + m.toggleHelp() // This un-sets the selected incident and returns to the table view case key.Matches(msg, defaultKeyMap.Back): @@ -242,12 +243,8 @@ func switchErrorFocusMode(m model, msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch { - case key.Matches(msg, defaultKeyMap.Help): - m.help.ShowAll = !m.help.ShowAll - case key.Matches(msg, defaultKeyMap.Back): m.err = nil - m.setStatus("") } } return m, nil diff --git a/pkg/tui/tui.go b/pkg/tui/tui.go index 59e9d45..664d1b1 100644 --- a/pkg/tui/tui.go +++ b/pkg/tui/tui.go @@ -14,7 +14,8 @@ const ( waitTime = time.Millisecond * 1 defaultInputPrompt = " $ " u - nilNoteErr = "incident note content is empty" + nilNoteErr = "incident note content is empty" + nilIncidentErr = "no incident selected" ) type errMsg struct{ error } @@ -34,6 +35,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case errMsg: + m.Init() return m.errMsgHandler(msg) case tea.WindowSizeMsg: @@ -240,7 +242,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // This is a catch all for any action that requires a selected incident // case waitForSelectedIncidentThenDoMsg: - debug("waitForSelectedIncidentThenDoMsg: ", fmt.Sprintf("%+v, %+v", msg.action, msg.msg)) + debug("waitForSelectedIncidentThenDoMsg: ", fmt.Sprintf("action: %+v, msg: %+v", msg.action, msg.msg)) if msg.action == nil { m.setStatus("failed to perform action: no action included in msg") return m, nil diff --git a/pkg/tui/views.go b/pkg/tui/views.go index 250ed1b..a3afe73 100644 --- a/pkg/tui/views.go +++ b/pkg/tui/views.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/PagerDuty/go-pagerduty" + "github.com/charmbracelet/bubbles/help" "github.com/charmbracelet/bubbles/table" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/glamour" @@ -55,7 +56,8 @@ func (m model) View() string { switch { case m.err != nil: debug("error") - return (errorStyle.Render(dot+"ERROR"+dot+"\n\n"+m.err.Error()) + "\n" + helpView) + errHelpView := helpStyle.Render(help.New().View(errorViewKeyMap)) + return (errorStyle.Render(dot+"ERROR"+dot+"\n\n"+m.err.Error()) + "\n" + errHelpView) case m.viewingIncident: debug("viewingIncident")