code.gitea.io/gitea@v1.22.3/web_src/js/features/comp/SearchUserBox.js (about) 1 import $ from 'jquery'; 2 import {htmlEscape} from 'escape-goat'; 3 4 const {appSubUrl} = window.config; 5 const looksLikeEmailAddressCheck = /^\S+@\S+$/; 6 7 export function initCompSearchUserBox() { 8 const searchUserBox = document.getElementById('search-user-box'); 9 if (!searchUserBox) return; 10 11 const $searchUserBox = $(searchUserBox); 12 const allowEmailInput = searchUserBox.getAttribute('data-allow-email') === 'true'; 13 const allowEmailDescription = searchUserBox.getAttribute('data-allow-email-description') ?? undefined; 14 $searchUserBox.search({ 15 minCharacters: 2, 16 apiSettings: { 17 url: `${appSubUrl}/user/search?active=1&q={query}`, 18 onResponse(response) { 19 const items = []; 20 const searchQuery = $searchUserBox.find('input').val(); 21 const searchQueryUppercase = searchQuery.toUpperCase(); 22 $.each(response.data, (_i, item) => { 23 const resultItem = { 24 title: item.login, 25 image: item.avatar_url, 26 }; 27 if (item.full_name) { 28 resultItem.description = htmlEscape(item.full_name); 29 } 30 if (searchQueryUppercase === item.login.toUpperCase()) { 31 items.unshift(resultItem); 32 } else { 33 items.push(resultItem); 34 } 35 }); 36 37 if (allowEmailInput && !items.length && looksLikeEmailAddressCheck.test(searchQuery)) { 38 const resultItem = { 39 title: searchQuery, 40 description: allowEmailDescription, 41 }; 42 items.push(resultItem); 43 } 44 45 return {results: items}; 46 }, 47 }, 48 searchFields: ['login', 'full_name'], 49 showNoResults: false, 50 }); 51 }