Update app.js
This commit is contained in:
@@ -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">
|
||||||
|
|||||||
Reference in New Issue
Block a user