gitea源码

SearchUserBox.ts 1.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import {htmlEscape} from '../../utils/html.ts';
  2. import {fomanticQuery} from '../../modules/fomantic/base.ts';
  3. const {appSubUrl} = window.config;
  4. const looksLikeEmailAddressCheck = /^\S+@\S+$/;
  5. export function initCompSearchUserBox() {
  6. const searchUserBox = document.querySelector('#search-user-box');
  7. if (!searchUserBox) return;
  8. const allowEmailInput = searchUserBox.getAttribute('data-allow-email') === 'true';
  9. const allowEmailDescription = searchUserBox.getAttribute('data-allow-email-description') ?? undefined;
  10. fomanticQuery(searchUserBox).search({
  11. minCharacters: 2,
  12. apiSettings: {
  13. url: `${appSubUrl}/user/search_candidates?q={query}`,
  14. onResponse(response: any) {
  15. const resultItems = [];
  16. const searchQuery = searchUserBox.querySelector('input').value;
  17. const searchQueryUppercase = searchQuery.toUpperCase();
  18. for (const item of response.data) {
  19. const resultItem = {
  20. title: item.login,
  21. image: item.avatar_url,
  22. description: htmlEscape(item.full_name),
  23. };
  24. if (searchQueryUppercase === item.login.toUpperCase()) {
  25. resultItems.unshift(resultItem); // add the exact match to the top
  26. } else {
  27. resultItems.push(resultItem);
  28. }
  29. }
  30. if (allowEmailInput && !resultItems.length && looksLikeEmailAddressCheck.test(searchQuery)) {
  31. const resultItem = {
  32. title: searchQuery,
  33. description: allowEmailDescription,
  34. };
  35. resultItems.push(resultItem);
  36. }
  37. return {results: resultItems};
  38. },
  39. },
  40. searchFields: ['login', 'full_name'],
  41. showNoResults: false,
  42. });
  43. }