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} 个可达"
 }

Reply via email to