Skip to content

Commit fc9e39f

Browse files
committed
client: activate search when pressing down
1 parent d496d87 commit fc9e39f

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

src/static/js/client/sidebar-search.js

+29-1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ export const info = {
7676

7777
stoppedTypingTimeout: null,
7878
stoppedScrollingTimeout: null,
79+
focusFirstResultTimeout: null,
7980

8081
indexDownloadStatuses: Object.create(null),
8182
},
@@ -104,6 +105,8 @@ export const info = {
104105
stoppedTypingDelay: 800,
105106
stoppedScrollingDelay: 200,
106107

108+
pressDownToFocusFirstResultLatency: 200,
109+
107110
maxActiveResultsStorage: 100000,
108111
},
109112
};
@@ -340,18 +343,35 @@ export function addPageListeners() {
340343

341344
state.stoppedTypingTimeout =
342345
setTimeout(() => {
346+
state.stoppedTypingTimeout = null;
343347
activateSidebarSearch(info.searchInput.value);
344348
}, settings.stoppedTypingDelay);
345349
});
346350

347351
info.searchInput.addEventListener('drop', handleDroppedIntoSearchInput);
348352

349353
info.searchInput.addEventListener('keydown', domEvent => {
354+
const {settings, state} = info;
355+
350356
if (domEvent.key === 'ArrowUp' || domEvent.key === 'ArrowDown') {
351357
domEvent.preventDefault();
352358
}
353359

354-
if (domEvent.key === 'ArrowDown') {
360+
if (domEvent.key === 'ArrowDown') handleDown: {
361+
if (state.stoppedTypingTimeout) {
362+
clearTimeout(state.stoppedTypingTimeout);
363+
state.stoppedTypingTimeout = null;
364+
365+
state.focusFirstResultTimeout =
366+
setTimeout(() => {
367+
state.focusFirstResultTimeout = null;
368+
}, settings.pressDownToFocusFirstResultLatency);
369+
370+
activateSidebarSearch(info.searchInput.value);
371+
372+
break handleDown;
373+
}
374+
355375
const elem = info.results.firstChild;
356376
if (elem?.classList.contains('wiki-search-result')) {
357377
elem.focus({focusVisible: true});
@@ -479,6 +499,14 @@ async function activateSidebarSearch(query) {
479499
session.resultsScrollOffset = 0;
480500

481501
showSidebarSearchResults(results);
502+
503+
if (state.focusFirstResultTimeout) {
504+
clearTimeout(state.focusFirstResultTimeout);
505+
state.focusFirstResultTimeout = null;
506+
if (!state.stoppedTypingTimeout) {
507+
info.results.firstChild?.focus();
508+
}
509+
}
482510
}
483511

484512
function clearSidebarSearch() {

0 commit comments

Comments
 (0)