cestina, UI, UX

This commit is contained in:
JiriUhlir
2026-05-29 11:34:07 +02:00
parent d145161e4e
commit 6109bdfe61
11 changed files with 354 additions and 131 deletions
+21 -6
View File
@@ -1,5 +1,5 @@
(() => {
if (window.AppFactoryOperationsLive) {
if (window.CSBotOperationsLive) {
return;
}
@@ -19,6 +19,16 @@
const statusBadge = (status) => {
const value = String(status || "");
const normalized = value.toLowerCase();
const labels = {
queued: "čeká",
running: "běží",
cancelled_requested: "žádost o zrušení",
cancelled: "zrušeno",
success: "úspěšné",
failed: "selhalo",
ok: "úspěšné",
error: "chyba",
};
let className = "pill pill-muted";
if (["success", "ok", "succeeded", "done", "deployed", "completed"].includes(normalized)) {
className = "pill pill-success";
@@ -27,12 +37,12 @@
} else if (["failed", "failure", "error", "cancelled", "canceled"].includes(normalized)) {
className = "pill pill-danger";
}
return `<span class="${className}">${escapeHtml(value)}</span>`;
return `<span class="${className}">${escapeHtml(labels[normalized] || value)}</span>`;
};
const workerBadge = (online) => online
? '<span class="pill pill-success">ONLINE</span>'
: '<span class="pill pill-danger">OFFLINE</span>';
? '<span class="pill pill-success">online</span>'
: '<span class="pill pill-danger">offline</span>';
const setText = (selector, value) => {
document.querySelectorAll(selector).forEach((el) => {
@@ -51,7 +61,7 @@
<td>${escapeHtml(job.created_at)}</td>
</tr>
`).join("");
return rows || '<tr><td colspan="6">Zatím nejsou evidované žádné joby.</td></tr>';
return rows || '<tr><td colspan="6">Zatím nejsou evidované žádné úlohy.</td></tr>';
};
const renderWorkers = (workers) => {
@@ -107,16 +117,21 @@
setText("[data-live-count='jobs.running']", snapshot.jobs?.running);
setText("[data-live-count='jobs.failed_24h']", snapshot.jobs?.failed_24h);
setText("[data-live-count='jobs.success_24h']", snapshot.jobs?.success_24h);
setText("[data-live-count='apps.active']", snapshot.apps?.active);
setText("[data-live-count='apps.problematic']", snapshot.apps?.problematic);
setText("[data-live-count='workers.online']", snapshot.workers?.online);
setText("[data-live-count='workers.offline']", snapshot.workers?.offline);
setText("[data-live-count='workers.total']", (snapshot.workers?.online || 0) + (snapshot.workers?.offline || 0));
setText("[data-live-count='deployments.running']", snapshot.deployments?.running);
setText("[data-live-count='deployments.failed_24h']", snapshot.deployments?.failed_24h);
setText("[data-live-count='deployments.success_24h']", snapshot.deployments?.success_24h);
setText("[data-live-count='deployments.today']", snapshot.deployments?.today);
document.querySelectorAll("[data-live-table='jobs.recent']").forEach((el) => { el.innerHTML = renderJobs(snapshot.jobs?.recent); });
document.querySelectorAll("[data-live-table='jobs.failed']").forEach((el) => { el.innerHTML = renderJobs(snapshot.jobs?.recent_failed); });
document.querySelectorAll("[data-live-table='workers.recent']").forEach((el) => { el.innerHTML = renderWorkers(snapshot.workers?.recent); });
document.querySelectorAll("[data-live-table='deployments.recent']").forEach((el) => { el.innerHTML = renderDeployments(snapshot.deployments?.recent); });
document.querySelectorAll("[data-live-table='deployments.failed']").forEach((el) => { el.innerHTML = renderDeployments(snapshot.deployments?.recent_failed); });
document.querySelectorAll("[data-live-table='audit.recent']").forEach((el) => { el.innerHTML = renderAudit(snapshot.audit?.recent); });
(snapshot.workers?.recent || []).forEach((worker) => {
@@ -159,6 +174,6 @@
});
};
window.AppFactoryOperationsLive = { connect };
window.CSBotOperationsLive = { connect };
connect();
})();
+8
View File
@@ -76,6 +76,14 @@ nav a {
border-radius: 8px;
}
.nav-group {
color: rgba(255, 255, 255, 0.62);
margin-left: 14px;
font-size: 11px;
font-weight: 800;
text-transform: uppercase;
}
.user-menu {
display: flex;
align-items: center;