mirror of
				https://github.com/SillyTavern/SillyTavern.git
				synced 2025-06-05 21:59:27 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.6 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();
 | |
|     });
 | |
| }
 | |
| 
 | |
| export function initServerHistory() {
 | |
|     $('[data-server-history]').each(createServerAutocomplete);
 | |
|     $(document).on('click', '[data-server-connect]', onServerConnectClick);
 | |
| }
 |