class ServersPage { constructor() { this.form = document.getElementById("server-form"); this.serverIdInput = document.getElementById("server-id"); this.serverNameInput = document.getElementById("server-name"); this.serverHostInput = document.getElementById("server-host"); this.clearFormBtn = document.getElementById("clear-form-btn"); this.serversList = document.getElementById("servers-list"); this.serversCount = document.getElementById("servers-count"); this.init(); } init() { this.form?.addEventListener("submit", (event) => { event.preventDefault(); this.saveServer(); }); this.clearFormBtn?.addEventListener("click", () => this.resetForm()); this.renderServers(); } saveServer() { const name = this.serverNameInput?.value.trim() || ""; const host = normalizeHost(this.serverHostInput?.value || ""); if (!name || !host) { return; } const existingId = this.serverIdInput?.value || ""; const servers = loadServers(); if (existingId) { const index = servers.findIndex((server) => server.id === existingId); if (index >= 0) { servers[index] = { ...servers[index], name, host }; } saveServers(servers); setActiveServerId(existingId); } else { const newServer = { id: generateServerId(), name, host }; servers.push(newServer); saveServers(servers); setActiveServerId(newServer.id); } this.resetForm(); this.renderServers(); } editServer(serverId) { const server = getServerById(serverId); if (!server) { return; } this.serverIdInput.value = server.id; this.serverNameInput.value = server.name; this.serverHostInput.value = server.host; } deleteServer(serverId) { const servers = loadServers().filter((server) => server.id !== serverId); saveServers(servers); clearServerCaches(serverId); const activeServerId = getActiveServerId(); if (activeServerId === serverId) { if (servers.length > 0) { setActiveServerId(servers[0].id); } else { localStorage.removeItem(ACTIVE_SERVER_KEY); } } this.renderServers(); } selectServer(serverId) { setActiveServerId(serverId); this.renderServers(); } openAvailable(serverId) { window.location.href = buildServerUrl("/models-available", serverId); } openRunning(serverId) { window.location.href = buildServerUrl("/models-running", serverId); } resetForm() { this.serverIdInput.value = ""; this.serverNameInput.value = ""; this.serverHostInput.value = ""; } renderServers() { const servers = loadServers(); const activeServerId = getActiveServerId(); if (this.serversCount) { this.serversCount.textContent = `${servers.length} server${servers.length === 1 ? "" : "s"}`; } if (!this.serversList) { return; } if (servers.length === 0) { this.serversList.innerHTML = `
${this.escapeHtml(server.host)}