Update app.js

This commit is contained in:
oliver
2026-06-15 09:59:11 -03:00
parent de69f1184a
commit 4272ee4f84
+35 -35
View File
@@ -8,7 +8,6 @@ const ROUTES = {
instances: "/admin/instance", instances: "/admin/instance",
backup: "/admin/backup-repo", backup: "/admin/backup-repo",
servers: "/admin/server", servers: "/admin/server",
seats: "/server",
keys: "/admin/key", keys: "/admin/key",
crm: "/crm", crm: "/crm",
}; };
@@ -904,48 +903,47 @@ async function serversLoadData() {
document.getElementById("server-dashboard").innerHTML = document.getElementById("server-dashboard").innerHTML =
`<div class="empty-state"><div class="spinner"></div><p style="margin-top:12px">Loading…</p></div>`; `<div class="empty-state"><div class="spinner"></div><p style="margin-top:12px">Loading…</p></div>`;
try { try {
const res = await apiFetch(apiUrl(ROUTES.servers), { /* ─── Step 1: Fetch server list with seats ──────────────── */
headers: apiHeaders(),
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);
const json = await res.json();
const raw = Array.isArray(json) ? json : [json];
serversData = raw
.map((item) => {
try {
return typeof item.text === "string" ? JSON.parse(item.text) : item;
} catch {
return null;
}
})
.filter(Boolean);
/* ─── Fetch seat data ─────────────────────────────────────── */
let seatMap = {};
try {
const seatRes = await fetch("https://n8n.derez.ai/webhook/server"); const seatRes = await fetch("https://n8n.derez.ai/webhook/server");
if (seatRes.ok) { if (!seatRes.ok) throw new Error(`Seat API HTTP ${seatRes.status}`);
const seatJson = await seatRes.json(); const seatJson = await seatRes.json();
const seatArr = Array.isArray(seatJson?.data) const seatList = Array.isArray(seatJson?.data)
? seatJson.data ? seatJson.data
: Array.isArray(seatJson) : Array.isArray(seatJson)
? seatJson ? seatJson
: []; : [];
for (const s of seatArr) { if (!seatList.length) throw new Error("No servers in seat endpoint");
if (s.server) seatMap[s.server.toLowerCase().trim()] = s;
/* ─── Step 2: Fetch full dashboard for each server ─────── */
serversData = [];
for (const seat of seatList) {
const serverName = seat.server;
try {
const res = await apiFetch(
apiUrl(ROUTES.servers) + "?server=" + encodeURIComponent(serverName),
{
headers: apiHeaders(),
},
);
if (res.ok) {
const json = await res.json();
const raw = Array.isArray(json) ? json : [json];
for (const item of raw) {
let parsed;
try {
parsed =
typeof item.text === "string" ? JSON.parse(item.text) : item;
} catch {
continue;
}
if (!parsed) continue;
parsed.seats = seat;
serversData.push(parsed);
} }
} }
} catch (_) { } catch (_) {
/* seat data is optional */ /* skip servers that fail */
} }
/* ─── Merge seats into server data ─────────────────────────── */
for (const sv of serversData) {
const key = (
typeof sv.server === "string" ? sv.server : (sv.server?.name ?? "")
)
.toLowerCase()
.trim();
sv.seats = seatMap[key] || null;
} }
if (serversData.length === 0) throw new Error("No server data in response"); if (serversData.length === 0) throw new Error("No server data in response");
@@ -981,7 +979,9 @@ function serversRenderTabs() {
.map((s, i) => { .map((s, i) => {
const status = s.summary?.overall_status ?? "unknown"; const status = s.summary?.overall_status ?? "unknown";
const color = dotColor[status] ?? "var(--text-muted)"; const color = dotColor[status] ?? "var(--text-muted)";
const name = escHtml(s.server?.name ?? `Server ${i + 1}`); const name = escHtml(
s.server?.name ?? s.seats?.server ?? `Server ${i + 1}`,
);
return `<div class="server-tab${i === currentServerIdx ? " active" : ""}" onclick="serversSelectTab(${i})"> return `<div class="server-tab${i === currentServerIdx ? " active" : ""}" onclick="serversSelectTab(${i})">
<span class="server-tab-dot" style="background:${color}"></span> <span class="server-tab-dot" style="background:${color}"></span>
${name} ${name}
@@ -1108,7 +1108,7 @@ function serversRenderDashboard(idx) {
<div style="display:flex;align-items:flex-start;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:14px"> <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:14px">
<div> <div>
<div style="display:flex;align-items:center;gap:10px;margin-bottom:6px"> <div style="display:flex;align-items:center;gap:10px;margin-bottom:6px">
<span style="font-size:20px;font-weight:700">${escHtml(server.name)}</span> <span style="font-size:20px;font-weight:700">${escHtml(server.name ?? s.seats?.server)}</span>
<span class="badge badge-${escHtml(summary.overall_status)}">${summary.overall_status.toUpperCase()}</span> <span class="badge badge-${escHtml(summary.overall_status)}">${summary.overall_status.toUpperCase()}</span>
</div> </div>
<div class="text-muted" style="font-size:12px"> <div class="text-muted" style="font-size:12px">