SillyTavern/public/scripts/server-history.js

87 lines
2.6 KiB
JavaScript

import { saveSettingsDebounced } from "../script.js";
import { power_user } from "./power-user.js";
import { isUrlOrAPIKey } 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 || !isUrlOrAPIKey(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);
});