Add interactive Markdown checklist toggles in the ticket preview.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Skruecken
2026-10-19 14:37:14 +02:00
co-authored by Cursor
parent 7666715f6c
commit f08084d5e1
8 changed files with 366 additions and 21 deletions
+63
View File
@@ -382,6 +382,23 @@ func (m Model) updateList(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
m.mode = ModeTimeEntries
return m, nil
case key.Matches(msg, m.keys.ChecklistNext):
m.clearStatus()
m.tickets.MoveChecklistDown()
return m, nil
case key.Matches(msg, m.keys.ChecklistPrev):
m.clearStatus()
m.tickets.MoveChecklistUp()
return m, nil
case key.Matches(msg, m.keys.Toggle):
m.clearStatus()
if err := m.toggleSelectedCheckbox(); err != nil {
m.setError(err)
}
return m, nil
case key.Matches(msg, m.keys.Down):
m.tickets.MoveDown()
return m, nil
@@ -985,6 +1002,52 @@ func (m *Model) applyStatus(st ticket.Status) error {
return nil
}
func (m *Model) toggleSelectedCheckbox() error {
t, ok := m.tickets.Selected()
if !ok {
return fmt.Errorf("no ticket selected")
}
boxes := ticket.ListCheckboxes(t.Description)
if len(boxes) == 0 {
return fmt.Errorf("no checkboxes in description")
}
checkIdx := m.tickets.ChecklistCursor
if checkIdx < 0 || checkIdx >= len(boxes) {
checkIdx = 0
}
newDesc, err := ticket.ToggleCheckbox(t.Description, checkIdx)
if err != nil {
return err
}
after := t
after.Description = newDesc
if err := m.exec.Do(&command.UpdateTicket{
Store: m.store,
Before: t,
After: after,
}); err != nil {
return err
}
ticketIdx := m.tickets.CursorIndex()
if err := m.reloadTickets(); err != nil {
return err
}
if ticketIdx < m.tickets.Len() {
m.tickets.Select(ticketIdx)
}
m.tickets.SetChecklistCursor(checkIdx)
state := "unchecked"
if !boxes[checkIdx].Checked {
state = "checked"
}
label := strings.TrimSpace(boxes[checkIdx].Text)
if label == "" {
label = fmt.Sprintf("#%d", checkIdx+1)
}
m.setStatus(fmt.Sprintf("%s %s", state, label))
return nil
}
func (m *Model) undo() error {
name := m.exec.LastUndoName()
if err := m.exec.Undo(); err != nil {