Skip to content

Commit ea02778

Browse files
committed
fix /user/search
1 parent 03292a8 commit ea02778

File tree

3 files changed

+22
-38
lines changed

3 files changed

+22
-38
lines changed

routers/web/user/search.go

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
package user
55

66
import (
7+
"code.gitea.io/gitea/modules/optional"
8+
"code.gitea.io/gitea/modules/setting"
79
"net/http"
810

911
"code.gitea.io/gitea/models/db"
@@ -12,33 +14,18 @@ import (
1214
"code.gitea.io/gitea/services/convert"
1315
)
1416

15-
// Search search users
16-
func Search(ctx *context.Context) {
17-
listOptions := db.ListOptions{
18-
Page: ctx.FormInt("page"),
19-
PageSize: convert.ToCorrectPageSize(ctx.FormInt("limit")),
20-
}
21-
22-
users, maxResults, err := user_model.SearchUsers(ctx, &user_model.SearchUserOptions{
17+
// SearchCandidates searches candidate users for dropdown list
18+
func SearchCandidates(ctx *context.Context) {
19+
users, _, err := user_model.SearchUsers(ctx, &user_model.SearchUserOptions{
2320
Actor: ctx.Doer,
2421
Keyword: ctx.FormTrim("q"),
25-
UID: ctx.FormInt64("uid"),
2622
Type: user_model.UserTypeIndividual,
27-
IsActive: ctx.FormOptionalBool("active"),
28-
ListOptions: listOptions,
23+
IsActive: optional.Some(true),
24+
ListOptions: db.ListOptions{PageSize: setting.UI.MembersPagingNum},
2925
})
3026
if err != nil {
31-
ctx.JSON(http.StatusInternalServerError, map[string]any{
32-
"ok": false,
33-
"error": err.Error(),
34-
})
27+
ctx.ServerError("Unable to search users", err)
3528
return
3629
}
37-
38-
ctx.SetTotalCountHeader(maxResults)
39-
40-
ctx.JSON(http.StatusOK, map[string]any{
41-
"ok": true,
42-
"data": convert.ToUsers(ctx, ctx.Doer, users),
43-
})
30+
ctx.JSON(http.StatusOK, map[string]any{"data": convert.ToUsers(ctx, ctx.Doer, users)})
4431
}

routers/web/web.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ func registerRoutes(m *web.Router) {
670670
m.Post("/forgot_password", auth.ForgotPasswdPost)
671671
m.Post("/logout", auth.SignOut)
672672
m.Get("/stopwatches", reqSignIn, user.GetStopwatches)
673-
m.Get("/search", ignExploreSignIn, user.Search)
673+
m.Get("/search_candidates", ignExploreSignIn, user.SearchCandidates)
674674
m.Group("/oauth2", func() {
675675
m.Get("/{provider}", auth.SignInOAuth)
676676
m.Get("/{provider}/callback", auth.SignInOAuthCallback)

web_src/js/features/comp/SearchUserBox.ts

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,41 +8,38 @@ export function initCompSearchUserBox() {
88
const searchUserBox = document.querySelector('#search-user-box');
99
if (!searchUserBox) return;
1010

11-
const $searchUserBox = $(searchUserBox);
1211
const allowEmailInput = searchUserBox.getAttribute('data-allow-email') === 'true';
1312
const allowEmailDescription = searchUserBox.getAttribute('data-allow-email-description') ?? undefined;
14-
$searchUserBox.search({
13+
$(searchUserBox).search({
1514
minCharacters: 2,
1615
apiSettings: {
17-
url: `${appSubUrl}/user/search?active=1&q={query}`,
16+
url: `${appSubUrl}/user/search_candidates?q={query}`,
1817
onResponse(response) {
19-
const items = [];
20-
const searchQuery = $searchUserBox.find('input').val();
18+
const resultItems = [];
19+
const searchQuery = searchUserBox.querySelector('input').value;
2120
const searchQueryUppercase = searchQuery.toUpperCase();
22-
$.each(response.data, (_i, item) => {
21+
for (const item of response.data) {
2322
const resultItem = {
2423
title: item.login,
2524
image: item.avatar_url,
25+
description: htmlEscape(item.full_name),
2626
};
27-
if (item.full_name) {
28-
resultItem.description = htmlEscape(item.full_name);
29-
}
3027
if (searchQueryUppercase === item.login.toUpperCase()) {
31-
items.unshift(resultItem);
28+
resultItems.unshift(resultItem); // add the exact match to the top
3229
} else {
33-
items.push(resultItem);
30+
resultItems.push(resultItem);
3431
}
35-
});
32+
}
3633

37-
if (allowEmailInput && !items.length && looksLikeEmailAddressCheck.test(searchQuery)) {
34+
if (allowEmailInput && !resultItems.length && looksLikeEmailAddressCheck.test(searchQuery)) {
3835
const resultItem = {
3936
title: searchQuery,
4037
description: allowEmailDescription,
4138
};
42-
items.push(resultItem);
39+
resultItems.push(resultItem);
4340
}
4441

45-
return {results: items};
42+
return {results: resultItems};
4643
},
4744
},
4845
searchFields: ['login', 'full_name'],

0 commit comments

Comments
 (0)