fix: reviewers not correctly shown on dashboard edit screen

This commit is contained in:
2026-07-30 11:26:21 +02:00
parent bcad515698
commit e045bd39b2
7 changed files with 549 additions and 15 deletions

View File

@@ -61,10 +61,47 @@ func selectedLoginPrefix(value string) string {
return ""
}
func (m App) reviewerInputContext(value string) (
prefix, query string,
selected []string,
currentComplete bool,
) {
prefix = selectedLoginPrefix(value)
query = currentLoginQuery(value)
selected = parseLoginList(prefix)
if canonical, ok := m.eligibleReviewerLogin(query); ok {
selected = normalizedLogins(append(selected, canonical))
query = ""
currentComplete = true
}
return prefix, query, selected, currentComplete
}
func (m App) eligibleReviewerLogin(value string) (string, bool) {
value = strings.TrimSpace(strings.TrimPrefix(value, "@"))
if value == "" {
return "", false
}
for _, user := range m.prEditUsers {
if user.CanReview &&
!strings.EqualFold(user.Login, m.details.Author) &&
strings.EqualFold(user.Login, value) {
return user.Login, true
}
}
return "", false
}
func (m App) userSuggestions() []userSuggestion {
field := m.prEditField
query := strings.ToLower(currentLoginQuery(m.prEditEditors[field].Text))
selected := parseLoginList(selectedLoginPrefix(m.prEditEditors[field].Text))
if field == prEditReviewersField {
_, reviewerQuery, reviewerSelected, _ :=
m.reviewerInputContext(m.prEditEditors[field].Text)
query = strings.ToLower(reviewerQuery)
selected = reviewerSelected
}
selectedSet := make(map[string]bool, len(selected))
for _, login := range selected {
selectedSet[strings.ToLower(login)] = true
@@ -78,10 +115,18 @@ func (m App) userSuggestions() []userSuggestion {
for _, login := range current {
currentSet[strings.ToLower(login)] = true
}
existingReviewers := make(map[string]bool, len(m.details.Reviewers))
if field == prEditReviewersField {
for _, reviewer := range m.details.Reviewers {
existingReviewers[strings.ToLower(reviewer.Login)] = true
}
}
now := time.Now()
for _, user := range m.prEditUsers {
if field == prEditReviewersField {
if !user.CanReview || strings.EqualFold(user.Login, m.details.Author) {
if !user.CanReview ||
strings.EqualFold(user.Login, m.details.Author) ||
existingReviewers[strings.ToLower(user.Login)] {
continue
}
} else if !user.CanAssign {
@@ -197,7 +242,14 @@ func (m *App) completeUserSuggestion() bool {
index := clamp(m.prEditUserIndex, 0, len(suggestions)-1)
login := suggestions[index].user.Login
editor := &m.prEditEditors[m.prEditField]
completed := selectedLoginPrefix(editor.Text) + login
prefix := selectedLoginPrefix(editor.Text)
if m.prEditField == prEditReviewersField {
_, _, _, currentComplete := m.reviewerInputContext(editor.Text)
if currentComplete {
return false
}
}
completed := prefix + login
if editor.Text == completed {
return false
}
@@ -208,6 +260,25 @@ func (m *App) completeUserSuggestion() bool {
return true
}
func (m *App) startNextReviewer() bool {
if m.prEditField != prEditReviewersField {
return false
}
editor := &m.prEditEditors[prEditReviewersField]
if editor.Cursor != len([]rune(editor.Text)) {
return false
}
_, _, _, currentComplete := m.reviewerInputContext(editor.Text)
if !currentComplete {
return false
}
editor.Text = strings.TrimRight(editor.Text, " \t") + ", "
editor.Cursor = len([]rune(editor.Text))
m.prEditUserIndex = 0
m.err = nil
return true
}
func (m App) userCompletionLines(width int) []string {
width = max(1, width)
if m.prEditUsersLoading {
@@ -232,9 +303,14 @@ func (m App) userCompletionLines(width int) []string {
" ranked by latest 100 default-branch commits",
))
}
separatorHelp := "comma separates users"
if m.prEditField == prEditReviewersField {
separatorHelp = "space starts next reviewer"
}
lines = append(lines,
dimStyle.Render(fmt.Sprintf(
" comma separates users • %s choose • %s complete",
" %s • %s choose • %s complete",
separatorHelp,
primaryCombinedKeyLabel(
m.keybindings.Input.PreviousCompletion,
m.keybindings.Input.NextCompletion,