Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/guide/02-board-and-panel.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@ red once breached.
| `backspace` | back to the issue you came from |
| `N` | your private notes on it, a file on this machine (`$EDITOR`) |
| `ctrl+a` | ask `ui.llm` (`claude -p` by default): a summary, acceptance criteria, subtasks, points |
| `/` | find text in the issue; `n` / `N` step through the hits |
| `ctrl+f` | find text in the issue; `n` / `N` step through the hits |
| `/` | search the board |
| `i` | the issue's images full size |
| `o` | open it in the browser |
| `y` / `Y` / `ctrl+y` | copy the key / the URL / a branch name |
Expand All @@ -143,7 +144,6 @@ red once breached.
| `[` `]` | the previous, next issue of the list you came from |
| `N` | your private notes on it, edited in place |
| `ctrl+a` | ask `ui.llm` (`claude -p` by default): a summary, acceptance criteria, subtasks, points |
| `/` | find text in the issue; `n` / `N` step through the hits |
| `i` | the issue's images, larger |
| `o` | open it in Jira |
| `y` / `Y` / `ctrl+y` | copy the key / the link / a branch name |
Expand Down
1 change: 0 additions & 1 deletion docs/reference/browser-keys.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,6 @@ are its tabs.
| `[` `]` | previous, next issue of the list you came from | |
| `backspace` | back along the trail | |
| `i` | images | |
| `/`, `n` `N` | find in the issue | |
| `<` `>` | widen, narrow the panel | |
| `*` `o` `y` `Y` | pin, Jira, copy key, link | |
| `ctrl+\` | its agent's terminal; `t` takes over | |
Expand Down
5 changes: 3 additions & 2 deletions docs/reference/terminal-keys.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,8 @@ panel's page. Keys for the browser: [Browser keys](browser-keys.md).
| `S` | start work, or attach to its agent |
| `N` | private notes in `$EDITOR` |
| `ctrl+a` | ask `ui.llm` about the issue |
| `/`, `n` `N` | find in the issue, next, previous hit |
| `ctrl+f`, `n` `N` | find in the issue, next, previous hit |
| `/` | search the board |
| `i` | images full size |
| `*` | pin |
| `o`, `y` `Y`, `ctrl+y` | browser, copy key, URL, branch |
Expand Down Expand Up @@ -271,7 +272,7 @@ A key bound to two actions on one screen is reported. The actions:
| Screen | Actions |
| --- | --- |
| Board | `up down left right top bottom page_up page_down open toggle_panel browser refresh quit help search goto create copy_key copy_url copy_branch move_left move_right rank_up rank_down rank_top rank_bottom move_sprint project board next_view prev_view toggle_mode sort fold unfold_all next_band prev_band compact empty_lanes lane_layout arrange_lanes assignee_filter mine clear_filters filter_builder jql mark mark_all undo bulk quick_edit repeat refine pin palette roadmap plan charts releases timer timesheet inbox standup my_work review closed_sprint time_machine agents merge_requests home site settings panel_wider panel_narrower` |
| Panel | `status priority points summary labels assign description comment reply next_comment prev_comment delete_comment log_work start_work linked_issue back image issue_actions history development notes ask` |
| Panel | `status priority points summary labels assign description comment reply next_comment prev_comment delete_comment log_work start_work linked_issue back image find issue_actions history development notes ask` |
| Agent terminal | `agent_back` |
| Planning | `plan_start plan_goal plan_rename plan_new plan_complete` |
| Charts | `chart_done chart_compare` |
Expand Down
2 changes: 1 addition & 1 deletion e2e/web/tests/details.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ test('T starts a timer and T again stops it into a work log', async ({ page }) =
await reload(page);
await expect(chip).toContainText('DEMO-4'); // the state file keeps it
await page.keyboard.press('T');
const dialog = page.getByRole('dialog', { name: 'Log work on DEMO-4' });
const dialog = page.getByRole('dialog', { name: 'Stop timer on DEMO-4' });
await expect(dialog.getByRole('textbox', { name: 'Time' })).toHaveValue(/m$/);
await dialog.getByRole('textbox', { name: 'Comment' }).fill('Timed');
await dialog.getByRole('button', { name: 'Log work' }).click();
Expand Down
1 change: 1 addition & 0 deletions internal/i18n/nl/ui-shell.json
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,7 @@
"search": "zoeken",
"search %s /%s": "zoeken %s /%s",
"search (esc clears)": "zoeken (esc wist)",
"search the board": "het bord doorzoeken",
"select a comment: R reply, ↵ edit yours, %s twice delete": "een reactie selecteren: R antwoord, ↵ je eigen bewerken, %s twee keer verwijderen",
"select it; letting go copies": "selecteren; loslaten kopieert",
"select; a field again: edit": "selecteren; een veld nogmaals: bewerken",
Expand Down
7 changes: 0 additions & 7 deletions internal/i18n/nl/web-board-issue.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
"%d empty lanes hidden": "%d lege banen verborgen",
"%d failed": "%d mislukt",
"%d flagged": "%d gemarkeerd",
"%d found": "%d gevonden",
"%d hidden": "%d verborgen",
"%d issue": "%d issue",
"%d issue · ctrl+enter lists it as a view": "%d issue · ctrl+enter toont hem als weergave",
Expand Down Expand Up @@ -292,7 +291,6 @@
"Filters": "Filters",
"Find a person…": "Zoek een persoon…",
"Find an issue or type its key…": "Zoek een issue of typ de key…",
"Find in this issue…": "Zoek in deze issue…",
"First %d of %d issues · ctrl+enter lists them as a view": "Eerste %d van %d issues · ctrl+enter toont ze als weergave",
"Flag": "Vlag",
"Flag as an impediment": "Markeren als blokkade",
Expand Down Expand Up @@ -366,7 +364,6 @@
"New issue in this epic": "Nieuwe issue in deze epic",
"New subtask": "Nieuwe subtaak",
"Next": "Volgende",
"Next (n)": "Volgende (n)",
"Next (→)": "Volgende (→)",
"No agent works on %s now.": "Er werkt nu geen agent aan %s.",
"No board in %s": "Geen bord in %s",
Expand Down Expand Up @@ -432,7 +429,6 @@
"Post notes": "Notities plaatsen",
"Post your private notes on %s as a comment?": "Je privénotities op %s als reactie plaatsen?",
"Previous": "Vorige",
"Previous (N)": "Vorige (N)",
"Previous (←)": "Vorige (←)",
"Priority": "Prioriteit",
"Priority of %d issues": "Prioriteit van %d issues",
Expand Down Expand Up @@ -648,7 +644,6 @@
"filter builder": "filterbouwer",
"filter by assignee": "filteren op toegewezene",
"filter cards": "kaarten filteren",
"find in the issue (n / N next, previous)": "zoeken in de issue (n / N volgende, vorige)",
"first card in lane": "eerste kaart in baan",
"fold the swimlane, or the stacked lane's section": "swimlane of sectie van gestapelde baan inklappen",
"go to a linked issue, child or web link": "naar een gekoppelde issue, onderliggende of weblink",
Expand Down Expand Up @@ -697,7 +692,6 @@
"next lane": "volgende baan",
"next lane (time machine: a day later)": "volgende baan (tijdmachine: een dag later)",
"next lane layout: the board's columns or a ui.lane_layouts entry": "volgende baanindeling: de kolommen van het bord of een ui.lane_layouts-item",
"next match": "volgende treffer",
"next row": "volgende rij",
"next swimlane, or the list's group": "volgende swimlane, of de groep van de lijst",
"next view": "volgende weergave",
Expand Down Expand Up @@ -730,7 +724,6 @@
"previous issue in the list": "vorige issue in de lijst",
"previous lane": "vorige baan",
"previous lane (time machine: a day earlier)": "vorige baan (tijdmachine: een dag eerder)",
"previous match": "vorige treffer",
"previous row": "vorige rij",
"previous swimlane, or the list's group": "vorige swimlane, of de groep van de lijst",
"previous view": "vorige weergave",
Expand Down
2 changes: 2 additions & 0 deletions internal/ui/harness_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,8 @@ func keyMsg(t *testing.T, name string) tea.KeyPressMsg {
return tea.KeyPressMsg{Code: 'x', Mod: tea.ModCtrl}
case "ctrl+y":
return tea.KeyPressMsg{Code: 'y', Mod: tea.ModCtrl}
case "ctrl+f":
return tea.KeyPressMsg{Code: 'f', Mod: tea.ModCtrl}
case "alt+e":
return tea.KeyPressMsg{Code: 'e', Mod: tea.ModAlt}
case "alt+m":
Expand Down
3 changes: 2 additions & 1 deletion internal/ui/help.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,8 @@ func (m *Model) helpSections() []struct {
{join(k.CopyKey, k.CopyURL), i18n.T("copy key / URL")},
row(k.CopyBranch, i18n.T("copy branch name")),
row(k.JiraLinks, i18n.T("go to linked issue, child or web link")),
row(k.Search, i18n.T("find in the issue (n / N next / previous)")),
row(k.Find, i18n.T("find in the issue (n / N next / previous)")),
row(k.Search, i18n.T("search the board")),
row(k.Image, i18n.T("view images full size")),
row(k.Back, i18n.T("previous issue")),
row(k.Refresh, i18n.T("refresh")),
Expand Down
4 changes: 2 additions & 2 deletions internal/ui/keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func (k *keyMap) keyNames() map[string]*key.Binding {
"status": &k.JiraStatus, "priority": &k.JiraPriority, "points": &k.JiraPoints, "summary": &k.JiraSummary, "labels": &k.JiraLabels,
"assign": &k.JiraAssignee, "comment": &k.JiraComment, "reply": &k.JiraReply,
"start_work": &k.JiraStart, "linked_issue": &k.JiraLinks, "back": &k.Back, "image": &k.Image,
"quit": &k.Quit, "help": &k.Help, "search": &k.Search, "goto": &k.Goto, "create": &k.Create,
"quit": &k.Quit, "help": &k.Help, "search": &k.Search, "find": &k.Find, "goto": &k.Goto, "create": &k.Create,
"copy_key": &k.CopyKey, "copy_url": &k.CopyURL, "copy_branch": &k.CopyBranch,
"move_left": &k.MoveCardLeft, "move_right": &k.MoveCardRight,
"project": &k.Project, "board": &k.Board, "next_view": &k.NextView, "prev_view": &k.PrevView,
Expand Down Expand Up @@ -77,7 +77,7 @@ var keyScopes = []struct {
"next_view", "prev_view", "toggle_mode", "sort", "move_sprint", "assignee_filter", "mine", "clear_filters", "roadmap", "palette", "mark", "mark_all", "undo", "bulk", "plan", "charts", "timer", "timesheet", "inbox", "site", "standup", "jql", "pin", "fold", "unfold_all", "next_band", "prev_band", "settings", "filter_builder", "panel_wider", "panel_narrower", "quick_edit", "my_work", "compact", "empty_lanes", "releases", "repeat", "refine", "rank_up", "rank_down", "rank_top", "rank_bottom", "closed_sprint", "agents", "merge_requests", "home",
}},
{"panel", []string{
"status", "priority", "points", "summary", "labels", "assign", "comment", "reply", "start_work", "search",
"status", "priority", "points", "summary", "labels", "assign", "comment", "reply", "start_work", "search", "find",
"linked_issue", "back", "image", "browser", "copy_key", "copy_url", "copy_branch", "help", "refresh", "toggle_panel", "palette",
"log_work", "timer", "timesheet", "description", "inbox", "issue_actions", "standup", "history", "development", "pin", "next_view", "prev_view", "settings", "panel_wider", "panel_narrower", "undo", "next_comment", "prev_comment", "delete_comment", "agents",
}},
Expand Down
4 changes: 2 additions & 2 deletions internal/ui/keys_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ func TestKeysConfigYAML(t *testing.T) {

func TestRebindKeys(t *testing.T) {
k := defaultKeys()
warn := k.applyKeys(map[string]config.KeyList{"search": {"ctrl+f"}, "bogus": {"x"}, "help": {}, "review": {"ctrl+r"}})
warn := k.applyKeys(map[string]config.KeyList{"search": {"ctrl+k"}, "bogus": {"x"}, "help": {}, "review": {"ctrl+r"}})
if len(warn) != 2 || !strings.Contains(warn[0], "bogus") || !strings.Contains(warn[1], "help") {
t.Errorf("warnings = %v", warn)
}
if keysLabel(k.Search) != "ctrl+f" || k.Search.Help().Desc != "search" {
if keysLabel(k.Search) != "ctrl+k" || k.Search.Help().Desc != "search" {
t.Errorf("search = %q %q", keysLabel(k.Search), k.Search.Help().Desc)
}
if keysLabel(k.Help) != "?" {
Expand Down
3 changes: 2 additions & 1 deletion internal/ui/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ type keyMap struct {
History, DevInfo, JQL, Pin key.Binding
Fold, UnfoldAll, Settings key.Binding
NextBand, PrevBand key.Binding
FilterBuilder, PanelWider key.Binding
FilterBuilder, PanelWider, Find key.Binding
PanelNarrower, QuickEdit, MyWork key.Binding
Compact, Releases, Repeat key.Binding
EmptyLanes, MergeRequests key.Binding
Expand Down Expand Up @@ -132,6 +132,7 @@ func defaultKeys() keyMap {
Quit: bind(i18n.T("quit"), "q"),
Help: bind(i18n.T("help"), "?"),
Search: bind(i18n.T("search"), "/"),
Find: bind(i18n.T("find in the issue"), "ctrl+f"),
Goto: bind(i18n.T("go to issue by key"), "#"),
Create: bind(i18n.T("new issue"), "n"),
CopyKey: bind(i18n.T("copy key"), "y"),
Expand Down
2 changes: 1 addition & 1 deletion internal/ui/palette.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ var paletteDesc = map[string]map[string]string{
"roadmap": {"move_left": i18n.N("move the bar a column earlier"), "move_right": i18n.N("move the bar a column later"),
"end_earlier": i18n.N("move its end earlier"), "end_later": i18n.N("move its end later"), "quit": i18n.N("close the roadmap")},
"planning": {"quit": i18n.N("close planning")},
"panel": {"search": i18n.N("find in the issue")},
"panel": {"search": i18n.N("search the board")},
"charts": {"quit": i18n.N("close the charts")},
"standup": {"quit": i18n.N("close the standup"), "open": i18n.N("open the issue"), "prev_view": i18n.N("a workday further back"), "next_view": i18n.N("a workday later")},
"inbox": {"quit": i18n.N("close the inbox"), "open": i18n.N("open the thread's issue")},
Expand Down
18 changes: 15 additions & 3 deletions internal/ui/panel_find_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ import (
"testing"
)

// TestPanelFind: / finds text in the panel, n steps on and wraps round, a
// TestPanelFind: ctrl+f finds text in the panel, n steps on and wraps round, a
// miss says so.
func TestPanelFind(t *testing.T) {
m := loadedJiraModel(t)
m.jiraIssue.Description = strings.Repeat("filler\n\n", 40) + "the widget broke\n\n" + strings.Repeat("more\n\n", 40)
m.renderRef()
out, _ := m.handleRefKey(keyMsg(t, "/"))
out, _ := m.handleRefKey(keyMsg(t, "ctrl+f"))
if m = out.(Model); !m.jiraFieldActive || m.jiraFieldName != "find" {
t.Fatal("/ should ask what to find")
t.Fatal("ctrl+f should ask what to find")
}
m.jiraFieldInput.SetValue("WIDGET")
out, _ = m.applyJiraField()
Expand All @@ -38,6 +38,18 @@ func TestPanelFind(t *testing.T) {
}
}

// TestPanelSlashSearchesBoard: / in the panel is the board's search, not
// the find in the issue.
func TestPanelSlashSearchesBoard(t *testing.T) {
m := loadedJiraModel(t)
m.focus = focusRef
out, _ := m.handleKey(keyMsg(t, "/"))
m = out.(Model)
if m.jiraFieldActive || !m.jiraTab.searching || m.focus != focusJira {
t.Fatalf("field %v, searching %v, focus %v", m.jiraFieldActive, m.jiraTab.searching, m.focus)
}
}

// TestPanelFindWrapped: a phrase the panel's wrap splits over two rows is
// still found, on the row it starts.
func TestPanelFindWrapped(t *testing.T) {
Expand Down
6 changes: 5 additions & 1 deletion internal/ui/ref.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,13 @@ func (m Model) handleRefKey(msg tea.KeyPressMsg) (tea.Model, tea.Cmd) {
case key.Matches(msg, m.keys.Palette):
m.openPalette()
return m, nil
case key.Matches(msg, m.keys.Search):
case key.Matches(msg, m.keys.Find):
m.openPanelFind()
return m, nil
case key.Matches(msg, m.keys.Search):
m.focus = focusJira
m.startJiraSearch()
return m, nil
case m.panelFind != "" && (msg.String() == "n" || msg.String() == "N"):
if msg.String() == "n" {
m.findInPanel(1)
Expand Down
Loading
Loading