This commit is contained in:
Mateusz Gruszczyński committed 2026-10-10 20:56:36 +02:00
1 parent f213d853e2
commit 76b8bb7ee2
78 files changed
+7750 -5204

No files matched your search

+35 -6
View File
@@ -363,14 +363,39 @@
}
function syncLiveSwitch() { const control = $("docker-live-refresh"); if (control) control.checked = liveEnabled(); }
function canLiveRender() { const target = $("docker-discovery-list"); return !target?.querySelector(".docker-service-row.is-dirty, .docker-service-editor[open], .docker-agent-details[open]") && !document.activeElement?.closest?.(".docker-service-row"); }
async function refresh(force = false) {
if (!authenticated) return; const button = $("docker-refresh"); if (button && force) button.disabled = true;
try { const data = await api(force ? "/api/docker/refresh" : "/api/docker", force ? { method: "POST", body: "{}" } : {}); observations = data.observations || []; pools = data.pools || []; poolRoutes = data.pool_routes || []; poolIndex = new Map(pools.map(pool => [pool.id, pool])); renderSettings(); if (force || canLiveRender()) renderDiscovery(); }
catch (error) { if (force) toast(error.message, true); } finally { if (button) button.disabled = false; }
let dockerLoading = null, dockerForcePending = false;
async function refresh(force = false, context = null) {
if (!authenticated) return;
if (dockerLoading) {
if (force) dockerForcePending = true;
return dockerLoading;
}
dockerLoading = loadDocker(force, context);
try { return await dockerLoading; }
finally {
dockerLoading = null;
if (dockerForcePending && authenticated) { dockerForcePending = false; void refresh(true); }
else dockerForcePending = false;
}
}
async function loadDocker(force = false, context = null) {
const button = $("docker-refresh"), epoch = authEpoch;
if (button && force) button.disabled = true;
const options = force ? { method: "POST", body: "{}" } : {};
if (context?.signal) options.signal = context.signal;
try {
const data = await api(force ? "/api/docker/refresh" : "/api/docker", options);
if (!authenticated || epoch !== authEpoch || (context?.isCurrent && !context.isCurrent())) return;
observations = data.observations || []; pools = data.pools || []; poolRoutes = data.pool_routes || [];
poolIndex = new Map(pools.map(pool => [pool.id, pool]));
renderSettings(); if (force || canLiveRender()) renderDiscovery();
} catch (error) {
if (force && error?.name !== "AbortError" && authenticated && epoch === authEpoch) toast(error.message, true);
} finally { if (button) button.disabled = false; }
}
$("docker-refresh")?.addEventListener("click", () => void refresh(true));
$("docker-live-refresh")?.addEventListener("change", event => { localStorage.setItem(LIVE_KEY, event.target.checked ? "1" : "0"); if (event.target.checked) void refresh(false); });
$("docker-live-refresh")?.addEventListener("change", event => { localStorage.setItem(LIVE_KEY, event.target.checked ? "1" : "0"); rustProxyRefresh.sync(); });
$("docker-settings-open")?.addEventListener("click", () => { setPanel("settings"); window.rustProxySettings?.select("docker-agents"); });
$("docker-search")?.addEventListener("input", applyViewFilters);
$("docker-vhost-sort")?.addEventListener("change", event => { listPrefs.sort = event.target.value; void saveListPrefs(); applyViewFilters(); });
@@ -379,6 +404,10 @@
$("docker-agent-add")?.addEventListener("click", () => { const target = $("docker-agent-settings-list"); target.querySelector(".empty")?.remove(); target.append(agentSettingsRow()); setSettingsDirty("docker-agents-form"); });
$("docker-agents-form")?.addEventListener("input", () => setSettingsDirty("docker-agents-form")); $("docker-agents-form")?.addEventListener("change", () => setSettingsDirty("docker-agents-form"));
$("docker-agents-form")?.addEventListener("submit", async event => { event.preventDefault(); const form = event.currentTarget; if (!envelope || busy) return; try { await withFormSubmitState(form, event.submitter, async () => { if (await saveSection("docker-agents", collectSettings())) { setSettingsDirty("docker-agents-form", false); await refresh(true); } }); } catch (error) { toast(error.message, true); } });
setInterval(() => { if (authenticated && liveEnabled() && typeof currentPanel !== "undefined" && currentPanel === "docker-vhosts" && canLiveRender()) void refresh(false); }, 5000);
rustProxyRefresh.register("docker", {
interval: () => 5,
active: () => currentPanel === "docker-vhosts" && liveEnabled() && canLiveRender(),
run: async context => refresh(false, context)
});
window.rustProxyDocker = { render() { syncLiveSwitch(); renderSettings(); renderDiscovery(); }, refresh, applyPreferences, reset() { observations = []; pools = []; poolRoutes = []; poolIndex = new Map(); showHidden = false; listPrefs = { sort: "service", descending: false }; hiddenVhosts = loadHidden(); if ($("docker-search")) $("docker-search").value = ""; if ($("docker-vhost-sort")) $("docker-vhost-sort").value = listPrefs.sort; syncSortDirection(); $("docker-discovery-list")?.replaceChildren(); $("docker-agent-settings-list")?.replaceChildren(); syncLiveSwitch(); applyViewFilters(); } };
})();