import { saveSettingsDebounced } from '../script.js'; import { power_user } from './power-user.js'; import { isValidUrl } from './utils.js'; /** * @param {{ term: string; }} request * @param {function} resolve * @param {string} serverLabel */ function findServers(request, resolve, serverLabel) { if (!power_user.servers) { power_user.servers = []; } const needle = request.term.toLowerCase(); const result = power_user.servers.filter(x => x.label == serverLabel).sort((a, b) => b.lastConnection - a.lastConnection).map(x => x.url).slice(0, 5); const hasExactMatch = result.findIndex(x => x.toLowerCase() == needle) !== -1; if (request.term && !hasExactMatch) { result.unshift(request.term); } resolve(result); } function selectServer(event, ui, serverLabel) { // unfocus the input $(event.target).val(ui.item.value).trigger('input').trigger('blur'); $('[data-server-connect]').each(function () { const serverLabels = String($(this).data('server-connect')).split(','); if (serverLabels.includes(serverLabel)) { $(this).trigger('click'); } }); } function createServerAutocomplete() { const inputElement = $(this); const serverLabel = inputElement.data('server-history'); inputElement .autocomplete({ source: (i, o) => findServers(i, o, serverLabel), select: (e, u) => selectServer(e, u, serverLabel), minLength: 0, }) .focus(onInputFocus); // <== show tag list on click } function onInputFocus() { $(this).autocomplete('search', $(this).val()); } function onServerConnectClick() { const serverLabels = String($(this).data('server-connect')).split(','); serverLabels.forEach(serverLabel => { if (!power_user.servers) { power_user.servers = []; } const value = String($(`[data-server-history="${serverLabel}"]`).val()).toLowerCase().trim(); // Don't save empty values or invalid URLs if (!value || !isValidUrl(value)) { return; } const server = power_user.servers.find(x => x.url === value && x.label === serverLabel); if (!server) { power_user.servers.push({ label: serverLabel, url: value, lastConnection: Date.now() }); } else { server.lastConnection = Date.now(); } saveSettingsDebounced(); }); } jQuery(function () { $('[data-server-history]').each(createServerAutocomplete); $(document).on('click', '[data-server-connect]', onServerConnectClick); });