From e7143151bd3cdcea27ffd13061ce2ca426b98027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Sun, 8 Nov 2026 12:32:50 +0100 Subject: [PATCH] v0.36.6 --- SHA256SUMS | 6 +++--- src/admin/web/css/10-base.css | 2 ++ src/admin/web/css/60-monitoring.css | 3 +-- src/admin/web/host404.js | 10 ++++++++-- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/SHA256SUMS b/SHA256SUMS index a816f15..546939c 100644 --- a/SHA256SUMS +++ b/SHA256SUMS @@ -211,12 +211,12 @@ b7ead49224a4ec67181d3f24f9d9634bd6d76756f826a4d5d993300637d1d8f3 src/admin/web/ 0625f3bfdd8f67d375fbb7204fbed3108fb5091cc12c4dcc2b60b26ad97223da src/admin/web/cache-panel.js 9f323507649910561518b63cf6632e81b3ecc4b09501ae53b635705f34ea6587 src/admin/web/certificate-api.js 4810137aa4217a86770617d442cf5dc6bec0d9f19e20bb2155e932a9a111cedf src/admin/web/css/00-tokens.css -ec3ff1b7824a7f03ee6d6b7ae9b6e0cbdb300e4891d44f982b6c04b3870f5c2b src/admin/web/css/10-base.css +466a24e234e1ec15f17e7d1994e838ca1ee0f52f03a4ca8fb6d9903bf2afde55 src/admin/web/css/10-base.css 8a1996d37f138790c12a704deedde9de74f733e7dcbb6be816fd68c281e8e0a9 src/admin/web/css/20-shell.css 9495c1b9f6a2cc72c1d99b4ea8c3cf3706835cb4670b53d5d7d71ef41ad62006 src/admin/web/css/30-overview.css ca93e41d1c6001d82f4891cacdd712e896a0355d6db9f76cf62dd2f2225a8674 src/admin/web/css/40-editors.css 87df062d7478176641364c07de396ca988a37b1a8bcb892b53cc578fe8471850 src/admin/web/css/50-settings.css -eed482c4b7dd247682c135fac132bb66e501511423ca53d50e9a79f4314cbac5 src/admin/web/css/60-monitoring.css +733d10b6713006f53247fa6ea1cef31be75f90f989ed5811f8646b3a813667a4 src/admin/web/css/60-monitoring.css 483664859787a2c54b51e73891cb760cfa15ff5e2e4132c96989eaa8109cf3a4 src/admin/web/css/70-responsive.css 8009afdb04d5170687816730cc930a22fead1fe0248835ca7e8de81d6907395d src/admin/web/css/README.md 8241bd9489dfed082863948829a44a49bf0a8e9cd63c55809655109e393e0918 src/admin/web/css/manifest.json @@ -243,7 +243,7 @@ e6c4d91d1542d0a5b47bb8736f9539d43a6713df5a473b635519d5b7eac2eb9c src/admin/web/ 003d382cc8dd69ad7237679632c04a9389366bb71dd7dca8ee64ee06614aa9a5 src/admin/web/error_auth_provider.html 0a5fff35555153f59d4346933030a67b6e1a8768cee7a47cfa2fcf1a2c564f63 src/admin/web/favicon.svg 7cbdef9192a9dee1f8eac42b85f52b3190f7f6efae50004aa7ad116a910e4036 src/admin/web/file-logs.js -cd617f7942ed03f814ff828f107c13a50bc1a450ded6d2be744a247a45b18c52 src/admin/web/host404.js +882e99059bb2ff110c452eadc0b5779a16af1e34cb1b2536c80cf2056f8c3e8a src/admin/web/host404.js 463cdd85c53dfed869335fe4d8559554b7e555a0b44f648df94a97b1e17f6e56 src/admin/web/index.html 7979c490b7fcfcd8f5e52e99fcf7757d78509337a625341c98f62c6da50da374 src/admin/web/integrations.js 7a12f020fc587205694978ab41b660e9a80487d413fbf6e34fc525eabc58308f src/admin/web/login-keys.json diff --git a/src/admin/web/css/10-base.css b/src/admin/web/css/10-base.css index be57d41..cb0e959 100644 --- a/src/admin/web/css/10-base.css +++ b/src/admin/web/css/10-base.css @@ -1015,6 +1015,8 @@ dialog .vh-form, } #vhost-list, +#redirect-list, +#notfound-list, #web-service-list, #stream-list, .vh-www-choices, diff --git a/src/admin/web/css/60-monitoring.css b/src/admin/web/css/60-monitoring.css index 607e4bc..2d46e0e 100644 --- a/src/admin/web/css/60-monitoring.css +++ b/src/admin/web/css/60-monitoring.css @@ -1170,8 +1170,7 @@ html[data-table-density=ultra] .file-log-inline-detail pre { .cache-pager button { border: 0; border-radius: 0; min-width: 88px; margin: 0; } .cache-pager button:disabled { opacity: .45; } .cache-pager #cache-page { padding: 0 14px; min-width: 120px; text-align: center; font-variant-numeric: tabular-nums; border-inline: 1px solid var(--line); align-self: stretch; display: flex; align-items: center; justify-content: center; } -.cache-pager #cache-prev::before { content: "‹ "; } -.cache-pager #cache-next::after { content: " ›"; } +.cache-pager #cache-next { flex-direction: row-reverse; } /* Static transformation tables (0.36.4): same presentation as Cache → Domains and effectiveness */ .transform-vhost-table :is(th, td):nth-child(n+2), .transform-type-table :is(th, td):nth-child(2) { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; } diff --git a/src/admin/web/host404.js b/src/admin/web/host404.js index abea53b..8667d52 100644 --- a/src/admin/web/host404.js +++ b/src/admin/web/host404.js @@ -81,9 +81,15 @@ entries.sort((left, right) => { const a = sortValue(left), b = sortValue(right); const result = typeof a === "number" && typeof b === "number" ? a - b : String(a).localeCompare(String(b), locale(), { numeric: true, sensitivity: "base" }); return listPrefs.descending ? -result : result; }); list.replaceChildren(...entries.map(item => { const card = el("article", undefined, "vhost-card redirect-card"), head = el("div", undefined, "vhost-card-head"), identity = el("div", undefined, "vhost-card-identity"), title = el("div", undefined, "vhost-title-line"); - title.append(el("strong", item.name || item.id, "entity-title")); if (item.enabled === false) title.append(el("span", t("vhDisabled"), "pill")); identity.append(title, el("div", (item.frontend?.hosts || []).join(" · "), "vhost-hosts")); head.append(identity); + title.append(el("strong", item.name || item.id, "entity-title")); if (item.enabled === false) title.append(el("span", t("vhDisabled"), "pill")); identity.append(title); head.append(identity); const actions = el("div", undefined, "entity-actions"); actions.append(action(t("edit"), () => { window.rustProxyDrafts.prepare(); load(structuredClone(item)); }), action(t("copyEntry"), () => { window.rustProxyDrafts.prepare(); const copy = structuredClone(item); copy.id = ""; copy.name = ""; copy.frontend = { ...(copy.frontend || {}), hosts: [] }; copy.certificate_id = null; load(copy); }), action(t("remove"), async () => { if (busy || !(await appConfirm(t("confirmDelete"), { danger: true }))) return; const next = (envelope.config.not_found_hosts || []).filter(value => value.id !== item.id); if (await saveSection("not-found-hosts", next)) { if (editing === item.id) dialog.close(); render(); } })); head.append(actions); card.append(head); - const detail = el("div", undefined, "vhost-detail-strip"); for (const [key, text] of [["notfoundStatus", String(item.page?.status ?? 404)], ["notfoundMode", t(`notfoundMode${(item.page?.kind || "welcome").replace(/^./, c => c.toUpperCase())}`)], ["redirectListeners", (item.frontend?.listener_ids || []).join(", ")], ["vhCertificate", item.certificate_id || t("vhCertificateDefault")]]) { const node = el("div", undefined, "vhost-detail"); node.append(el("span", t(key), "small-label"), el("b", text)); detail.append(node); } card.append(detail); return card; + const flow = el("div", undefined, "redirect-flow"), from = el("div", undefined, "redirect-flow-from"), to = el("div", undefined, "redirect-flow-to"); + for (const host of item.frontend?.hosts || []) from.append(el("span", host, "redirect-host-chip")); + to.append(el("span", `${item.page?.status ?? 404} ${STATUS_NAMES[item.page?.status ?? 404] || ""}`.trim(), "redirect-target"), el("span", t(`notfoundMode${(item.page?.kind || "welcome").replace(/^./, c => c.toUpperCase())}`), "redirect-target-more")); + flow.append(from, el("span", "→", "redirect-flow-arrow"), to); card.append(flow); + const meta = el("div", undefined, "redirect-meta"); + for (const [k, v] of [["redirectListeners", (item.frontend?.listener_ids || []).join(", ") || "-"], ["vhCertificate", item.certificate_id || t("vhCertificateDefault")]]) { const node = el("span", undefined, "redirect-meta-item"); node.append(el("span", t(k)), el("b", v)); meta.append(node); } + card.append(meta); return card; })); if (!entries.length) list.append(el("p", t(query ? "notfoundSearchEmpty" : "notfoundEmpty"), "fine")); }