Wire manual Y menu and CLI sync for issues and work items, persist per-project credentials, and keep local edits until an explicit push. Co-authored-by: Cursor <cursoragent@cursor.com>
164 lines
4.3 KiB
Go
164 lines
4.3 KiB
Go
package ui
|
|
|
|
import "github.com/charmbracelet/bubbles/key"
|
|
|
|
// KeyMap defines vim-style bindings for the TUI.
|
|
type KeyMap struct {
|
|
Up key.Binding
|
|
Down key.Binding
|
|
New key.Binding
|
|
Search key.Binding
|
|
Project key.Binding
|
|
MoveTicket key.Binding // P — move selected ticket to another project
|
|
Board key.Binding
|
|
Status key.Binding
|
|
Edit key.Binding
|
|
EditInEditor key.Binding // ctrl+e — open $EDITOR while creating
|
|
Delete key.Binding // x — confirm first
|
|
DeleteForce key.Binding // X — immediate
|
|
ConfirmYes key.Binding
|
|
Toggle key.Binding // space — toggle multi-select / checklist item
|
|
ChecklistPrev key.Binding // K / shift+up — previous checkbox
|
|
ChecklistNext key.Binding // J / shift+down — next checkbox
|
|
Timer key.Binding // t — start/stop timer
|
|
TimeManual key.Binding // T — manual duration
|
|
TimeEntries key.Binding // m — manage time entries
|
|
Report key.Binding // r — time report
|
|
Sync key.Binding // Y — pull YouTrack issues
|
|
Undo key.Binding
|
|
Redo key.Binding
|
|
Quit key.Binding
|
|
Enter key.Binding
|
|
Escape key.Binding
|
|
Tab key.Binding // tab — next form field
|
|
ShiftTab key.Binding // shift+tab — previous form field
|
|
}
|
|
|
|
// DefaultKeyMap returns the default key bindings.
|
|
func DefaultKeyMap() KeyMap {
|
|
return KeyMap{
|
|
Up: key.NewBinding(
|
|
key.WithKeys("k", "up"),
|
|
key.WithHelp("j/k", "navigate"),
|
|
),
|
|
Down: key.NewBinding(
|
|
key.WithKeys("j", "down"),
|
|
key.WithHelp("j/k", "navigate"),
|
|
),
|
|
New: key.NewBinding(
|
|
key.WithKeys("n"),
|
|
key.WithHelp("n", "new"),
|
|
),
|
|
Search: key.NewBinding(
|
|
key.WithKeys("/"),
|
|
key.WithHelp("/", "search"),
|
|
),
|
|
Project: key.NewBinding(
|
|
key.WithKeys("p"),
|
|
key.WithHelp("p", "project"),
|
|
),
|
|
MoveTicket: key.NewBinding(
|
|
key.WithKeys("P"),
|
|
key.WithHelp("P", "move ticket"),
|
|
),
|
|
Board: key.NewBinding(
|
|
key.WithKeys("l", "tab"),
|
|
key.WithHelp("l", "list"),
|
|
),
|
|
Status: key.NewBinding(
|
|
key.WithKeys("s", "enter"),
|
|
key.WithHelp("s", "status"),
|
|
),
|
|
Edit: key.NewBinding(
|
|
key.WithKeys("e"),
|
|
key.WithHelp("e", "edit"),
|
|
),
|
|
EditInEditor: key.NewBinding(
|
|
key.WithKeys("ctrl+e"),
|
|
key.WithHelp("ctrl+e", "editor"),
|
|
),
|
|
Delete: key.NewBinding(
|
|
key.WithKeys("x"),
|
|
key.WithHelp("x", "delete"),
|
|
),
|
|
DeleteForce: key.NewBinding(
|
|
key.WithKeys("X"),
|
|
key.WithHelp("X", "force delete"),
|
|
),
|
|
ConfirmYes: key.NewBinding(
|
|
key.WithKeys("y", "Y"),
|
|
key.WithHelp("y", "confirm"),
|
|
),
|
|
Toggle: key.NewBinding(
|
|
key.WithKeys(" "),
|
|
key.WithHelp("space", "toggle"),
|
|
),
|
|
ChecklistPrev: key.NewBinding(
|
|
key.WithKeys("K", "shift+up"),
|
|
key.WithHelp("J/K", "checklist"),
|
|
),
|
|
ChecklistNext: key.NewBinding(
|
|
key.WithKeys("J", "shift+down"),
|
|
key.WithHelp("J/K", "checklist"),
|
|
),
|
|
Timer: key.NewBinding(
|
|
key.WithKeys("t"),
|
|
key.WithHelp("t", "timer"),
|
|
),
|
|
TimeManual: key.NewBinding(
|
|
key.WithKeys("T"),
|
|
key.WithHelp("T", "log time"),
|
|
),
|
|
TimeEntries: key.NewBinding(
|
|
key.WithKeys("m"),
|
|
key.WithHelp("m", "time entries"),
|
|
),
|
|
Report: key.NewBinding(
|
|
key.WithKeys("r"),
|
|
key.WithHelp("r", "report"),
|
|
),
|
|
Sync: key.NewBinding(
|
|
key.WithKeys("Y"),
|
|
key.WithHelp("Y", "YouTrack pull/push"),
|
|
),
|
|
Undo: key.NewBinding(
|
|
key.WithKeys("u", "ctrl+z"),
|
|
key.WithHelp("u", "undo"),
|
|
),
|
|
Redo: key.NewBinding(
|
|
key.WithKeys("ctrl+r", "U"),
|
|
key.WithHelp("U", "redo"),
|
|
),
|
|
Quit: key.NewBinding(
|
|
key.WithKeys("q", "ctrl+c"),
|
|
key.WithHelp("q", "quit"),
|
|
),
|
|
Enter: key.NewBinding(
|
|
key.WithKeys("enter"),
|
|
key.WithHelp("enter", "confirm"),
|
|
),
|
|
Escape: key.NewBinding(
|
|
key.WithKeys("esc"),
|
|
key.WithHelp("esc", "cancel"),
|
|
),
|
|
Tab: key.NewBinding(
|
|
key.WithKeys("tab"),
|
|
key.WithHelp("tab", "next field"),
|
|
),
|
|
ShiftTab: key.NewBinding(
|
|
key.WithKeys("shift+tab"),
|
|
key.WithHelp("shift+tab", "prev field"),
|
|
),
|
|
}
|
|
}
|
|
|
|
// ShortHelp implements help.KeyMap.
|
|
func (k KeyMap) ShortHelp() []key.Binding {
|
|
return []key.Binding{k.Up, k.New, k.Search, k.Project, k.MoveTicket, k.Board, k.Status, k.Edit, k.Timer, k.TimeManual, k.TimeEntries, k.Report, k.Sync, k.Delete, k.DeleteForce, k.Undo, k.Redo, k.Quit}
|
|
}
|
|
|
|
// FullHelp implements help.KeyMap.
|
|
func (k KeyMap) FullHelp() [][]key.Binding {
|
|
return [][]key.Binding{k.ShortHelp()}
|
|
}
|