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:
+39
-3
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user