src/main/webapp/issue-search.js

Tue, 11 Mar 2025 17:01:30 +0100

author
Mike Becker <universe@uap-core.de>
date
Tue, 11 Mar 2025 17:01:30 +0100
changeset 362
576bd8ac4d96
parent 358
e46bef1bdddd
permissions
-rw-r--r--

dynamically load suggestions for related issues

resolves #616

207
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
358
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
2 * Copyright 2025 Mike Becker. All rights reserved.
207
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Redistribution and use in source and binary forms, with or without
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 * modification, are permitted provided that the following conditions are met:
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 *
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * 1. Redistributions of source code must retain the above copyright
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 * notice, this list of conditions and the following disclaimer.
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 *
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * 2. Redistributions in binary form must reproduce the above copyright
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 * notice, this list of conditions and the following disclaimer in the
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * documentation and/or other materials provided with the distribution.
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 *
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 */
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25
358
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
26 function debounce(func){
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
27 let timer;
362
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
28 return (...args) => {
358
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
29 clearTimeout(timer);
362
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
30 timer = setTimeout(() => { func.apply(this, args); }, 300);
358
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
31 };
207
479dd7993ef9 #22 adds possibility to edit own comments
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32 }
334
2696337baa3d add cancel button to comment editor - fixes #455
Mike Becker <universe@uap-core.de>
parents: 263
diff changeset
33
358
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
34 let searchBoxOldContent = '';
362
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
35 function issueSearchImpl(elementId, project) {
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
36 const searchBox = document.getElementById(elementId);
358
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
37 if (searchBoxOldContent !== searchBox.value) {
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
38 searchBoxOldContent = searchBox.value;
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
39 const req = new XMLHttpRequest();
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
40 req.addEventListener("load", (evt) => {
362
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
41 const dataList = document.getElementById(elementId+'-list');
358
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
42 dataList.innerHTML = '';
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
43 JSON.parse(evt.target.responseText).forEach(function(item){
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
44 const option = document.createElement('option');
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
45 option.value = item;
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
46 dataList.appendChild(option);
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
47 });
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
48 });
362
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
49 let url = baseHref+'issues/search?q='+encodeURIComponent(searchBox.value);
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
50 if (project > 0) url+='&p='+project;
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
51 req.open("GET", url);
358
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
52 req.send();
351
3720c7375146 implement changing and saving variant status
Mike Becker <universe@uap-core.de>
parents: 334
diff changeset
53 }
3720c7375146 implement changing and saving variant status
Mike Becker <universe@uap-core.de>
parents: 334
diff changeset
54 }
362
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
55 const issueSearch = debounce((elementId, project = 0) => issueSearchImpl(elementId, project))
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
56
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
57 function configureSearchBox(elementId, project, navigateOnEnter = false) {
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
58 const searchBox = document.getElementById(elementId);
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
59 searchBox.addEventListener('change', () => issueSearch(elementId, project));
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
60 if (navigateOnEnter) {
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
61 searchBox.addEventListener('keyup', (evt) => {
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
62 if (evt.code === 'Enter' || evt.code === 'NumpadEnter') {
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
63 let stext = searchBox.value.trim()
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
64 if (stext.length === 0) return;
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
65 if (stext[0] === '#') stext = stext.substring(1);
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
66 const snum = Number.parseInt(stext.split(' ')[0], 10);
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
67 if (snum !== Number.NaN) {
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
68 location.assign(baseHref + 'issues/' + snum + '?in_project=true');
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
69 }
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
70 } else {
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
71 issueSearch(elementId, project);
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
72 }
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
73 })
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
74 } else {
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
75 searchBox.addEventListener('keyup', () => issueSearch(elementId, project));
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
76 }
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
77 }
351
3720c7375146 implement changing and saving variant status
Mike Becker <universe@uap-core.de>
parents: 334
diff changeset
78
362
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
79 // configure the global search box
576bd8ac4d96 dynamically load suggestions for related issues
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
80 window.addEventListener('load', () => configureSearchBox('search-box', 0, true));
358
e46bef1bdddd add issue search box
Mike Becker <universe@uap-core.de>
parents: 351
diff changeset
81

mercurial