diff --git a/internal/issues/search_issues.go b/internal/issues/search_issues.go index 5b06336..835645e 100644 --- a/internal/issues/search_issues.go +++ b/internal/issues/search_issues.go @@ -229,10 +229,16 @@ func (view *searchIssuesView) runSelectStatus() { func (view *searchIssuesView) runSelectUser() { app.GetApp().ClearNow() app.GetApp().Loading(true) - us := view.fetchUsers(view.project.Key) - us = append(us, jira.User{DisplayName: ui.MessageAll}) - usersStrings := users.FormatJiraUsers(us) - view.fuzzyFind = app.NewFuzzyFind(ui.MessageSelectUser, usersStrings) + var us []jira.User + view.fuzzyFind = app.NewFuzzyFindWithProvider(ui.MessageSelectUser, func(query string) []string { + if len(us) > 0 && len(us) < JiraFetchRecordsThreshold { + return users.FormatJiraUsers(us) + } + us = view.fetchUsers(view.project.Key, query) + us = append(us, jira.User{DisplayName: ui.MessageAll}) + usersStrings := users.FormatJiraUsers(us) + return usersStrings + }) app.GetApp().Loading(false) if user := <-view.fuzzyFind.Complete; true { app.GetApp().ClearNow() @@ -311,8 +317,8 @@ func (view *searchIssuesView) fetchStatuses(projectId string) []jira.IssueStatus return ss } -func (view *searchIssuesView) fetchUsers(projectKey string) []jira.User { - us, err := view.api.FindUsers(projectKey) +func (view *searchIssuesView) fetchUsers(projectKey string, query string) []jira.User { + us, err := view.api.FindUsersWithQuery(projectKey, query) if err != nil { app.Error(err.Error()) } diff --git a/internal/issues/search_issues_test.go b/internal/issues/search_issues_test.go index e44ed9b..f2730a6 100644 --- a/internal/issues/search_issues_test.go +++ b/internal/issues/search_issues_test.go @@ -295,12 +295,11 @@ func Test_fjiraSearchIssuesView_runSelectUser(t *testing.T) { view.runSelectUser() done <- struct{}{} }() - for { - if view.fuzzyFind != nil { - break - } - <-time.NewTimer(10 * time.Millisecond).C + for view.fuzzyFind == nil { + <-time.After(10 * time.Millisecond) } + view.fuzzyFind.SetDebounceDisabled(true) + view.fuzzyFind.Update() query := "John" for _, key := range query { view.fuzzyFind.HandleKeyEvent(tcell.NewEventKey(-1, key, tcell.ModNone)) diff --git a/internal/jira/jira.go b/internal/jira/jira.go index 5b8b613..869d467 100644 --- a/internal/jira/jira.go +++ b/internal/jira/jira.go @@ -12,6 +12,7 @@ type Api interface { SearchJql(query string) ([]Issue, error) SearchJqlPageable(query string, page int32, pageSize int32) ([]Issue, int32, int32, error) FindUsers(project string) ([]User, error) + FindUsersWithQuery(project string, query string) ([]User, error) FindProjects() ([]Project, error) FindLabels(issue *Issue, query string) ([]string, error) AddLabel(issueId string, label string) error diff --git a/internal/jira/jira_user.go b/internal/jira/jira_user.go index 69ecd52..99b9a44 100644 --- a/internal/jira/jira_user.go +++ b/internal/jira/jira_user.go @@ -26,15 +26,23 @@ const ( var UserSearchDeserializeErr = errors.New("Cannot deserialize jira user search response.") type findUserQueryParams struct { - Project string `url:"project"` - MaxResults int `url:"maxResults"` + Project string `url:"project"` + MaxResults int `url:"maxResults"` + Query *string `url:"query"` } func (api *httpApi) FindUsers(project string) ([]User, error) { + return api.FindUsersWithQuery(project, "") +} + +func (api *httpApi) FindUsersWithQuery(project string, query string) ([]User, error) { queryParams := &findUserQueryParams{ Project: project, MaxResults: 10000, } + if query != "" { + queryParams.Query = &query + } response, err := api.jiraRequest("GET", FindUser, queryParams, nil) if err != nil { return nil, err