7c488b2d83
Features: - Add work item sorting by ID, Type, State (keys 1, 2, 3) - Add user assignment modal with team member filtering (key a) - Add parent work item title display in details panel - Preserve sort order and selection on panel reload UI improvements: - Remove zebra striping from work items list - Remove priority column from list and details - Align metadata fields in details panel - Add markdown rendering for descriptions (using glamour) - Add state colors: To Do (orange), In Progress (purple), Done (green), Testing (yellow) 🤖 Generated with [Claude Code](https://claude.ai/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
153 lines
3.3 KiB
Go
153 lines
3.3 KiB
Go
package theme
|
|
|
|
import "github.com/charmbracelet/bubbles/key"
|
|
|
|
// KeyMap defines all keyboard shortcuts
|
|
type KeyMap struct {
|
|
// Navigation
|
|
Up key.Binding
|
|
Down key.Binding
|
|
Left key.Binding
|
|
Right key.Binding
|
|
Top key.Binding
|
|
Bottom key.Binding
|
|
NextPanel key.Binding
|
|
PrevPanel key.Binding
|
|
|
|
// Actions
|
|
Select key.Binding
|
|
Open key.Binding
|
|
View key.Binding
|
|
Search key.Binding
|
|
Refresh key.Binding
|
|
Help key.Binding
|
|
Back key.Binding
|
|
Quit key.Binding
|
|
ChangeState key.Binding
|
|
CreateBranch key.Binding
|
|
Assign key.Binding
|
|
|
|
// Sorting
|
|
SortByID key.Binding
|
|
SortByState key.Binding
|
|
SortByType key.Binding
|
|
}
|
|
|
|
// DefaultKeyMap returns the default key bindings
|
|
func DefaultKeyMap() KeyMap {
|
|
return KeyMap{
|
|
Up: key.NewBinding(
|
|
key.WithKeys("up", "k"),
|
|
key.WithHelp("↑/k", "up"),
|
|
),
|
|
Down: key.NewBinding(
|
|
key.WithKeys("down", "j"),
|
|
key.WithHelp("↓/j", "down"),
|
|
),
|
|
Left: key.NewBinding(
|
|
key.WithKeys("left", "h"),
|
|
key.WithHelp("←/h", "left"),
|
|
),
|
|
Right: key.NewBinding(
|
|
key.WithKeys("right", "l"),
|
|
key.WithHelp("→/l", "right"),
|
|
),
|
|
Top: key.NewBinding(
|
|
key.WithKeys("g"),
|
|
key.WithHelp("g", "top"),
|
|
),
|
|
Bottom: key.NewBinding(
|
|
key.WithKeys("G"),
|
|
key.WithHelp("G", "bottom"),
|
|
),
|
|
NextPanel: key.NewBinding(
|
|
key.WithKeys("tab"),
|
|
key.WithHelp("Tab", "next panel"),
|
|
),
|
|
PrevPanel: key.NewBinding(
|
|
key.WithKeys("shift+tab"),
|
|
key.WithHelp("Shift+Tab", "prev panel"),
|
|
),
|
|
Select: key.NewBinding(
|
|
key.WithKeys("enter", " "),
|
|
key.WithHelp("Enter/Space", "select"),
|
|
),
|
|
Open: key.NewBinding(
|
|
key.WithKeys("enter"),
|
|
key.WithHelp("Enter", "open in browser"),
|
|
),
|
|
View: key.NewBinding(
|
|
key.WithKeys("v"),
|
|
key.WithHelp("v", "view details"),
|
|
),
|
|
Search: key.NewBinding(
|
|
key.WithKeys("/"),
|
|
key.WithHelp("/", "search"),
|
|
),
|
|
Refresh: key.NewBinding(
|
|
key.WithKeys("ctrl+r"),
|
|
key.WithHelp("Ctrl+r", "refresh"),
|
|
),
|
|
Help: key.NewBinding(
|
|
key.WithKeys("?"),
|
|
key.WithHelp("?", "help"),
|
|
),
|
|
Back: key.NewBinding(
|
|
key.WithKeys("esc"),
|
|
key.WithHelp("Esc", "back"),
|
|
),
|
|
Quit: key.NewBinding(
|
|
key.WithKeys("q", "ctrl+c"),
|
|
key.WithHelp("q", "quit"),
|
|
),
|
|
ChangeState: key.NewBinding(
|
|
key.WithKeys("s"),
|
|
key.WithHelp("s", "change state"),
|
|
),
|
|
CreateBranch: key.NewBinding(
|
|
key.WithKeys("b"),
|
|
key.WithHelp("b", "create branch"),
|
|
),
|
|
Assign: key.NewBinding(
|
|
key.WithKeys("a"),
|
|
key.WithHelp("a", "assign"),
|
|
),
|
|
SortByID: key.NewBinding(
|
|
key.WithKeys("1"),
|
|
key.WithHelp("1", "sort by ID"),
|
|
),
|
|
SortByType: key.NewBinding(
|
|
key.WithKeys("2"),
|
|
key.WithHelp("2", "sort by type"),
|
|
),
|
|
SortByState: key.NewBinding(
|
|
key.WithKeys("3"),
|
|
key.WithHelp("3", "sort by state"),
|
|
),
|
|
}
|
|
}
|
|
|
|
// ShortHelp returns a short help text for the status bar
|
|
func (k KeyMap) ShortHelp() []key.Binding {
|
|
return []key.Binding{
|
|
k.NextPanel,
|
|
k.Up, k.Down,
|
|
k.Top, k.Bottom,
|
|
k.Open,
|
|
k.Help,
|
|
}
|
|
}
|
|
|
|
// FullHelp returns all key bindings for the help panel
|
|
func (k KeyMap) FullHelp() [][]key.Binding {
|
|
return [][]key.Binding{
|
|
{k.Up, k.Down, k.Top, k.Bottom},
|
|
{k.NextPanel, k.PrevPanel},
|
|
{k.Select, k.Open, k.View},
|
|
{k.ChangeState, k.CreateBranch, k.Assign},
|
|
{k.SortByID, k.SortByType, k.SortByState},
|
|
{k.Search, k.Refresh},
|
|
{k.Help, k.Back, k.Quit},
|
|
}
|
|
}
|