Files
task-master/internal/ui/keys.go
T
skrueckenandCursor 98d2253f44
CI / test-and-build (push) Failing after 1m19s
CI / demo (push) Skipped
Add YouTrack pull/push sync with project settings and time tracking.
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>
2026-10-24 00:17:51 +02:00

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()}
}