Keep search input focused while typing

This commit is contained in:
mirivlad 2026-06-30 22:42:42 +08:00
parent 9aa837e14d
commit 9a59cd29e4
1 changed files with 23 additions and 7 deletions

View File

@ -287,13 +287,18 @@
var index = null; var index = null;
var cleanupFns = []; var cleanupFns = [];
var indexRefresh = Promise.resolve(); var indexRefresh = Promise.resolve();
var input = null;
var button = null;
var statusEl = null;
var resultsEl = null;
function render() { function ensureLayout() {
if (input) return;
containerEl.innerHTML = ''; containerEl.innerHTML = '';
containerEl.className = 'search-root'; containerEl.className = 'search-root';
containerEl.setAttribute('data-plugin-id', 'verstak.search'); containerEl.setAttribute('data-plugin-id', 'verstak.search');
var input = el('input', { input = el('input', {
className: 'search-input', className: 'search-input',
type: 'search', type: 'search',
placeholder: 'Search files, folders, text', placeholder: 'Search files, folders, text',
@ -304,10 +309,8 @@
scheduleSearch(); scheduleSearch();
} }
}); });
var button = el('button', { button = el('button', {
className: 'search-btn', className: 'search-btn',
textContent: state.searching ? 'Searching...' : 'Search',
disabled: state.searching ? 'disabled' : null,
'data-search-action': 'run', 'data-search-action': 'run',
onClick: search onClick: search
}); });
@ -317,9 +320,22 @@
el('span', { className: 'search-scope', title: rootPath || 'Vault' }, [rootPath || 'Vault']) el('span', { className: 'search-scope', title: rootPath || 'Vault' }, [rootPath || 'Vault'])
])); ]));
containerEl.appendChild(el('div', { className: 'search-status' + (state.error ? ' error' : '') }, [state.error || state.status])); statusEl = el('div', { className: 'search-status' });
var resultsEl = el('div', { className: 'search-results' }); containerEl.appendChild(statusEl);
resultsEl = el('div', { className: 'search-results' });
containerEl.appendChild(resultsEl); containerEl.appendChild(resultsEl);
}
function render() {
ensureLayout();
if (document.activeElement !== input && input.value !== state.query) {
input.value = state.query;
}
button.textContent = state.searching ? 'Searching...' : 'Search';
button.disabled = !!state.searching;
statusEl.className = 'search-status' + (state.error ? ' error' : '');
statusEl.textContent = state.error || state.status;
resultsEl.innerHTML = '';
if (!state.results.length) { if (!state.results.length) {
resultsEl.appendChild(el('div', { className: 'search-empty' }, [state.searching ? 'Searching...' : 'No results'])); resultsEl.appendChild(el('div', { className: 'search-empty' }, [state.searching ? 'Searching...' : 'No results']));
return; return;