This is an automated email from the ASF dual-hosted git repository. wu-sheng pushed a commit to branch feat/template-modes-env-config in repository https://gitbox.apache.org/repos/asf/skywalking-horizon-ui.git
commit 411754ff3cf1eace3107171fbae76b478142588d Author: Wu Sheng <[email protected]> AuthorDate: Fri Jun 26 09:44:43 2026 +0800 fix(cluster): admin badge reads 'N/M reachable' in yellow when not all live '4 reachable · 1 bundled' wasn't a proper summary. The badge now shows a plain fraction — 'all reachable' (green) only when every feature probes live, else '{n}/{total} reachable' (yellow). Covers both a 404'd path and a bundled / not-probed feature (ui_template in readonly); the per-row chip says which. --- .../features/operate/cluster/ClusterStatusView.vue | 19 ++++++++----------- apps/ui/src/i18n/locales/de.json | 2 +- apps/ui/src/i18n/locales/en.json | 2 +- apps/ui/src/i18n/locales/es.json | 2 +- apps/ui/src/i18n/locales/fr.json | 2 +- apps/ui/src/i18n/locales/ja.json | 2 +- apps/ui/src/i18n/locales/ko.json | 2 +- apps/ui/src/i18n/locales/pt.json | 2 +- apps/ui/src/i18n/locales/zh-CN.json | 2 +- 9 files changed, 16 insertions(+), 19 deletions(-) diff --git a/apps/ui/src/features/operate/cluster/ClusterStatusView.vue b/apps/ui/src/features/operate/cluster/ClusterStatusView.vue index 792c842..7278d9b 100644 --- a/apps/ui/src/features/operate/cluster/ClusterStatusView.vue +++ b/apps/ui/src/features/operate/cluster/ClusterStatusView.vue @@ -106,8 +106,9 @@ const healthLabel = computed<string>(() => { const adminBadgeState = computed<'ok' | 'warn' | 'err' | 'unknown'>(() => { if (!preflight.value) return 'unknown'; if (!adminReachable.value) return 'err'; - // Admin port replied but a required feature's path doesn't respond. - if (preflight.value.modules.some((m) => m.required && m.reachable === false)) return 'warn'; + // Anything not fully live-reachable — a path that 404s, or a bundled / + // not-probed feature (ui_template in readonly) — is a partial state. + if (preflight.value.modules.some((m) => m.reachable !== true)) return 'warn'; return 'ok'; }); @@ -115,15 +116,11 @@ const adminBadgeLabel = computed<string>(() => { if (!preflight.value) return t('loading…'); if (!adminReachable.value) return t('unreachable'); const mods = preflight.value.modules; - const down = mods.filter((m) => m.reachable === false).length; - if (down > 0) return t('{n} unreachable', { n: down }); - // reachable === null = not probed (ui_template in readonly: bundled). It's - // healthy, but it isn't "reachable" — don't fold it into "all reachable". - const bundled = mods.filter((m) => m.reachable === null).length; - if (bundled > 0) { - return t('{n} reachable · {b} bundled', { n: mods.length - bundled, b: bundled }); - } - return t('all reachable'); + const reachable = mods.filter((m) => m.reachable === true).length; + if (reachable === mods.length) return t('all reachable'); + // X/Y — covers both an unreachable path and a bundled (readonly) feature; + // the per-row chip says which. + return t('{n}/{total} reachable', { n: reachable, total: mods.length }); }); const adminGeneratedAt = computed<string>(() => agoLabel(preflight.value?.generatedAt)); diff --git a/apps/ui/src/i18n/locales/de.json b/apps/ui/src/i18n/locales/de.json index d034f8a..d0c4389 100644 --- a/apps/ui/src/i18n/locales/de.json +++ b/apps/ui/src/i18n/locales/de.json @@ -1549,5 +1549,5 @@ "{n} unreachable": "{n} nicht erreichbar", "Reachability of each admin feature — the BFF GETs the relative REST path the feature actually calls and reports whether it responds. Health is the live probe, not config-presence: a path that 404s (selector off, renamed, or absent in a fork) reads as unreachable. 'selector detected' below is only an upstream-release hint, not the verdict.": "Erreichbarkeit jeder Admin-Funktion — der BFF sendet ein GET an den relativen REST-Pfad, den die Funktion tatsächlich aufruft, und meldet, ob er [...] "Enable on OAP:": "Auf OAP aktivieren:", - "{n} reachable · {b} bundled": "{n} erreichbar · {b} gebündelt" + "{n}/{total} reachable": "{n}/{total} erreichbar" } diff --git a/apps/ui/src/i18n/locales/en.json b/apps/ui/src/i18n/locales/en.json index 9be9b57..10d1945 100644 --- a/apps/ui/src/i18n/locales/en.json +++ b/apps/ui/src/i18n/locales/en.json @@ -1549,5 +1549,5 @@ "{n} unreachable": "{n} unreachable", "Reachability of each admin feature — the BFF GETs the relative REST path the feature actually calls and reports whether it responds. Health is the live probe, not config-presence: a path that 404s (selector off, renamed, or absent in a fork) reads as unreachable. 'selector detected' below is only an upstream-release hint, not the verdict.": "Reachability of each admin feature — the BFF GETs the relative REST path the feature actually calls and reports whether it responds. Health is th [...] "Enable on OAP:": "Enable on OAP:", - "{n} reachable · {b} bundled": "{n} reachable · {b} bundled" + "{n}/{total} reachable": "{n}/{total} reachable" } diff --git a/apps/ui/src/i18n/locales/es.json b/apps/ui/src/i18n/locales/es.json index 23778bb..107a9f1 100644 --- a/apps/ui/src/i18n/locales/es.json +++ b/apps/ui/src/i18n/locales/es.json @@ -1549,5 +1549,5 @@ "{n} unreachable": "{n} inaccesible(s)", "Reachability of each admin feature — the BFF GETs the relative REST path the feature actually calls and reports whether it responds. Health is the live probe, not config-presence: a path that 404s (selector off, renamed, or absent in a fork) reads as unreachable. 'selector detected' below is only an upstream-release hint, not the verdict.": "Accesibilidad de cada función de administración: el BFF hace un GET a la ruta REST relativa que la función realmente llama e informa si responde. [...] "Enable on OAP:": "Activar en OAP:", - "{n} reachable · {b} bundled": "{n} accesible(s) · {b} incluido(s)" + "{n}/{total} reachable": "{n}/{total} accesibles" } diff --git a/apps/ui/src/i18n/locales/fr.json b/apps/ui/src/i18n/locales/fr.json index 5ab140e..518256d 100644 --- a/apps/ui/src/i18n/locales/fr.json +++ b/apps/ui/src/i18n/locales/fr.json @@ -1549,5 +1549,5 @@ "{n} unreachable": "{n} inaccessible(s)", "Reachability of each admin feature — the BFF GETs the relative REST path the feature actually calls and reports whether it responds. Health is the live probe, not config-presence: a path that 404s (selector off, renamed, or absent in a fork) reads as unreachable. 'selector detected' below is only an upstream-release hint, not the verdict.": "Accessibilité de chaque fonctionnalité d'administration — le BFF envoie un GET sur le chemin REST relatif que la fonctionnalité appelle réellemen [...] "Enable on OAP:": "Activer sur OAP :", - "{n} reachable · {b} bundled": "{n} accessible(s) · {b} intégré(s)" + "{n}/{total} reachable": "{n}/{total} accessibles" } diff --git a/apps/ui/src/i18n/locales/ja.json b/apps/ui/src/i18n/locales/ja.json index 71d57f7..bcb8878 100644 --- a/apps/ui/src/i18n/locales/ja.json +++ b/apps/ui/src/i18n/locales/ja.json @@ -1549,5 +1549,5 @@ "{n} unreachable": "{n} 件が到達不可", "Reachability of each admin feature — the BFF GETs the relative REST path the feature actually calls and reports whether it responds. Health is the live probe, not config-presence: a path that 404s (selector off, renamed, or absent in a fork) reads as unreachable. 'selector detected' below is only an upstream-release hint, not the verdict.": "各管理機能の到達可能性 —— BFF は機能が実際に呼び出す相対 REST パスへ GET し、応答するかどうかを報告します。健全性は設定の有無ではなくライブプローブで判定されます。404 を返すパス(selector が無効、リネーム、またはフォークで欠落)は到達不可とみなされます。下の [...] "Enable on OAP:": "OAP で有効化:", - "{n} reachable · {b} bundled": "{n} 件が到達可能 · {b} 件がバンドル" + "{n}/{total} reachable": "{n}/{total} 件が到達可能" } diff --git a/apps/ui/src/i18n/locales/ko.json b/apps/ui/src/i18n/locales/ko.json index 40dc171..680a3a9 100644 --- a/apps/ui/src/i18n/locales/ko.json +++ b/apps/ui/src/i18n/locales/ko.json @@ -1549,5 +1549,5 @@ "{n} unreachable": "{n}개 도달 불가", "Reachability of each admin feature — the BFF GETs the relative REST path the feature actually calls and reports whether it responds. Health is the live probe, not config-presence: a path that 404s (selector off, renamed, or absent in a fork) reads as unreachable. 'selector detected' below is only an upstream-release hint, not the verdict.": "각 관리 기능의 도달 가능성 — BFF가 해당 기능이 실제로 호출하는 상대 REST 경로로 GET 요청을 보내 응답 여부를 보고합니다. 상태는 설정 존재 여부가 아니라 실시간 프로브로 판단합니다. 404를 반환하는 경로(selector 꺼짐, 이름 변경 또는 [...] "Enable on OAP:": "OAP에서 활성화:", - "{n} reachable · {b} bundled": "{n}개 도달 가능 · {b}개 번들" + "{n}/{total} reachable": "{n}/{total}개 도달 가능" } diff --git a/apps/ui/src/i18n/locales/pt.json b/apps/ui/src/i18n/locales/pt.json index 8b65797..8305b7f 100644 --- a/apps/ui/src/i18n/locales/pt.json +++ b/apps/ui/src/i18n/locales/pt.json @@ -1549,5 +1549,5 @@ "{n} unreachable": "{n} inacessível(is)", "Reachability of each admin feature — the BFF GETs the relative REST path the feature actually calls and reports whether it responds. Health is the live probe, not config-presence: a path that 404s (selector off, renamed, or absent in a fork) reads as unreachable. 'selector detected' below is only an upstream-release hint, not the verdict.": "Acessibilidade de cada recurso de administração: o BFF faz um GET no caminho REST relativo que o recurso realmente chama e informa se ele respond [...] "Enable on OAP:": "Ativar no OAP:", - "{n} reachable · {b} bundled": "{n} acessível(is) · {b} incluído(s)" + "{n}/{total} reachable": "{n}/{total} acessíveis" } diff --git a/apps/ui/src/i18n/locales/zh-CN.json b/apps/ui/src/i18n/locales/zh-CN.json index 76f2c14..2eb38b0 100644 --- a/apps/ui/src/i18n/locales/zh-CN.json +++ b/apps/ui/src/i18n/locales/zh-CN.json @@ -1549,5 +1549,5 @@ "{n} unreachable": "{n} 个不可达", "Reachability of each admin feature — the BFF GETs the relative REST path the feature actually calls and reports whether it responds. Health is the live probe, not config-presence: a path that 404s (selector off, renamed, or absent in a fork) reads as unreachable. 'selector detected' below is only an upstream-release hint, not the verdict.": "每个管理功能的可达性 —— BFF 会向该功能实际调用的相对 REST 路径发起 GET,并报告其是否响应。健康状态取决于实时探测,而非配置存在性:返回 404 的路径(selector 关闭、被重命名或在 fork 版本中缺失)将被视为不可达。下方的“检测到 selector”仅为上游发 [...] "Enable on OAP:": "在 OAP 上启用:", - "{n} reachable · {b} bundled": "{n} 个可达 · {b} 个内置" + "{n}/{total} reachable": "{n}/{total} 个可达" }
