Add interactive Markdown checklist toggles in the ticket preview.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user