--- a/src/main/webapp/issue-search.js Tue Mar 11 14:01:48 2025 +0100 +++ b/src/main/webapp/issue-search.js Tue Mar 11 17:01:30 2025 +0100 @@ -25,21 +25,20 @@ function debounce(func){ let timer; - return () => { + return (...args) => { clearTimeout(timer); - timer = setTimeout(() => { func.apply(this); }, 300); + timer = setTimeout(() => { func.apply(this, args); }, 300); }; } -const issueSearch = debounce(() => issueSearchImpl()) let searchBoxOldContent = ''; -function issueSearchImpl() { - const searchBox = document.getElementById('search-box'); +function issueSearchImpl(elementId, project) { + const searchBox = document.getElementById(elementId); if (searchBoxOldContent !== searchBox.value) { searchBoxOldContent = searchBox.value; const req = new XMLHttpRequest(); req.addEventListener("load", (evt) => { - const dataList = document.getElementById('search-box-list'); + const dataList = document.getElementById(elementId+'-list'); dataList.innerHTML = ''; JSON.parse(evt.target.responseText).forEach(function(item){ const option = document.createElement('option'); @@ -47,27 +46,36 @@ dataList.appendChild(option); }); }); - req.open("GET", baseHref+'issues/search?q='+encodeURIComponent(searchBox.value)); + let url = baseHref+'issues/search?q='+encodeURIComponent(searchBox.value); + if (project > 0) url+='&p='+project; + req.open("GET", url); req.send(); } } +const issueSearch = debounce((elementId, project = 0) => issueSearchImpl(elementId, project)) + +function configureSearchBox(elementId, project, navigateOnEnter = false) { + const searchBox = document.getElementById(elementId); + searchBox.addEventListener('change', () => issueSearch(elementId, project)); + if (navigateOnEnter) { + searchBox.addEventListener('keyup', (evt) => { + if (evt.code === 'Enter' || evt.code === 'NumpadEnter') { + let stext = searchBox.value.trim() + if (stext.length === 0) return; + if (stext[0] === '#') stext = stext.substring(1); + const snum = Number.parseInt(stext.split(' ')[0], 10); + if (snum !== Number.NaN) { + location.assign(baseHref + 'issues/' + snum + '?in_project=true'); + } + } else { + issueSearch(elementId, project); + } + }) + } else { + searchBox.addEventListener('keyup', () => issueSearch(elementId, project)); + } +} -// configure the search box -window.addEventListener('load', () => { - const searchBox = document.getElementById('search-box'); - searchBox.addEventListener('change', () => issueSearch()) - searchBox.addEventListener('keyup', (evt) => { - if (evt.code === 'Enter' || evt.code === 'NumpadEnter') { - let stext = searchBox.value.trim() - if (stext.length === 0) return; - if (stext[0] === '#') stext = stext.substring(1); - const snum = Number.parseInt(stext.split(' ')[0], 10); - if (snum !== Number.NaN) { - location.assign(baseHref+'issues/'+snum+'?in_project=true'); - } - } else { - issueSearch(); - } - }) -}); +// configure the global search box +window.addEventListener('load', () => configureSearchBox('search-box', 0, true));