Improve delete UX and wrap the helpbar on narrow terminals.

Confirm with x, force-delete with X, and wrap keybinding hints so all shortcuts stay visible.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Skruecken
2026-10-19 10:32:40 +02:00
co-authored by Cursor
parent 73216ec4ae
commit 28cd2628e4
4 changed files with 143 additions and 50 deletions
+39 -3
View File
@@ -36,6 +36,7 @@ const (
ModeProjects
ModeStatus
ModeBoard
ModeConfirmDelete
)
// Model is the root Bubble Tea model.
@@ -60,8 +61,9 @@ type Model struct {
keys KeyMap
styles Styles
version string
allTickets []ticket.Ticket
creatingProject bool
allTickets []ticket.Ticket
creatingProject bool
pendingDeleteTitle string
}
// New creates the root UI model.
@@ -124,6 +126,8 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m.updateStatus(msg)
case ModeBoard:
return m.updateBoard(msg)
case ModeConfirmDelete:
return m.updateConfirmDelete(msg)
default:
return m.updateList(msg)
}
@@ -212,7 +216,7 @@ func (m Model) updateList(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
m.mode = ModeBoard
return m, nil
case key.Matches(msg, m.keys.Delete):
case key.Matches(msg, m.keys.DeleteForce):
m.clearStatus()
if err := m.deleteSelected(); err != nil {
m.setError(err)
@@ -221,6 +225,17 @@ func (m Model) updateList(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
}
return m, nil
case key.Matches(msg, m.keys.Delete):
m.clearStatus()
t, ok := m.tickets.Selected()
if !ok {
m.setError(fmt.Errorf("no ticket selected"))
return m, nil
}
m.pendingDeleteTitle = strings.TrimSpace(t.Title)
m.mode = ModeConfirmDelete
return m, nil
case key.Matches(msg, m.keys.Undo):
m.clearStatus()
if err := m.undo(); err != nil {
@@ -324,6 +339,27 @@ func (m Model) updateBoard(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
return m, nil
}
func (m Model) updateConfirmDelete(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
switch {
case key.Matches(msg, m.keys.Escape):
m.pendingDeleteTitle = ""
m.mode = ModeList
m.clearStatus()
return m, nil
case key.Matches(msg, m.keys.Enter), key.Matches(msg, m.keys.ConfirmYes):
m.pendingDeleteTitle = ""
m.mode = ModeList
if err := m.deleteSelected(); err != nil {
m.setError(err)
} else {
m.setStatus("deleted")
}
return m, nil
}
return m, nil
}
func (m Model) updateInput(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
switch {
case key.Matches(msg, m.keys.Escape):