mirror of
				https://github.com/SillyTavern/SillyTavern.git
				synced 2025-06-05 21:59:27 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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);
 | 
						|
});
 |