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 c1247c7a0a139f785591628babdd57f32c77977e
Author: Wu Sheng <[email protected]>
AuthorDate: Fri Jun 26 09:28:38 2026 +0800

    fix(cluster): badge no longer claims 'all reachable' when a feature is 
bundled
    
    reachable===null (ui_template in readonly: not probed, serving bundled
    templates) was slipping past the reachable===false filter, so the summary 
read
    'all reachable' while a row showed 'readonly · bundled'. Count the 
null/bundled
    features separately — the badge now reads '4 reachable · 1 bundled'.
---
 apps/ui/src/features/operate/cluster/ClusterStatusView.vue | 13 ++++++++++---
 apps/ui/src/i18n/locales/de.json                           |  3 ++-
 apps/ui/src/i18n/locales/en.json                           |  3 ++-
 apps/ui/src/i18n/locales/es.json                           |  3 ++-
 apps/ui/src/i18n/locales/fr.json                           |  3 ++-
 apps/ui/src/i18n/locales/ja.json                           |  3 ++-
 apps/ui/src/i18n/locales/ko.json                           |  3 ++-
 apps/ui/src/i18n/locales/pt.json                           |  3 ++-
 apps/ui/src/i18n/locales/zh-CN.json                        |  3 ++-
 9 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/apps/ui/src/features/operate/cluster/ClusterStatusView.vue 
b/apps/ui/src/features/operate/cluster/ClusterStatusView.vue
index 05431b2..792c842 100644
--- a/apps/ui/src/features/operate/cluster/ClusterStatusView.vue
+++ b/apps/ui/src/features/operate/cluster/ClusterStatusView.vue
@@ -114,9 +114,16 @@ const adminBadgeState = computed<'ok' | 'warn' | 'err' | 
'unknown'>(() => {
 const adminBadgeLabel = computed<string>(() => {
   if (!preflight.value) return t('loading…');
   if (!adminReachable.value) return t('unreachable');
-  const down = preflight.value.modules.filter((m) => m.required && m.reachable 
=== false);
-  if (down.length === 0) return t('all reachable');
-  return t('{n} unreachable', { n: down.length });
+  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 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 fe09296..d034f8a 100644
--- a/apps/ui/src/i18n/locales/de.json
+++ b/apps/ui/src/i18n/locales/de.json
@@ -1548,5 +1548,6 @@
   "all reachable": "alle erreichbar",
   "{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:"
+  "Enable on OAP:": "Auf OAP aktivieren:",
+  "{n} reachable · {b} bundled": "{n} erreichbar · {b} gebündelt"
 }
diff --git a/apps/ui/src/i18n/locales/en.json b/apps/ui/src/i18n/locales/en.json
index 63f9e62..9be9b57 100644
--- a/apps/ui/src/i18n/locales/en.json
+++ b/apps/ui/src/i18n/locales/en.json
@@ -1548,5 +1548,6 @@
   "all reachable": "all reachable",
   "{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:"
+  "Enable on OAP:": "Enable on OAP:",
+  "{n} reachable · {b} bundled": "{n} reachable · {b} bundled"
 }
diff --git a/apps/ui/src/i18n/locales/es.json b/apps/ui/src/i18n/locales/es.json
index 292b594..23778bb 100644
--- a/apps/ui/src/i18n/locales/es.json
+++ b/apps/ui/src/i18n/locales/es.json
@@ -1548,5 +1548,6 @@
   "all reachable": "todos accesibles",
   "{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:"
+  "Enable on OAP:": "Activar en OAP:",
+  "{n} reachable · {b} bundled": "{n} accesible(s) · {b} incluido(s)"
 }
diff --git a/apps/ui/src/i18n/locales/fr.json b/apps/ui/src/i18n/locales/fr.json
index 5a93b26..5ab140e 100644
--- a/apps/ui/src/i18n/locales/fr.json
+++ b/apps/ui/src/i18n/locales/fr.json
@@ -1548,5 +1548,6 @@
   "all reachable": "tous accessibles",
   "{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 :"
+  "Enable on OAP:": "Activer sur OAP :",
+  "{n} reachable · {b} bundled": "{n} accessible(s) · {b} intégré(s)"
 }
diff --git a/apps/ui/src/i18n/locales/ja.json b/apps/ui/src/i18n/locales/ja.json
index 6dd4723..71d57f7 100644
--- a/apps/ui/src/i18n/locales/ja.json
+++ b/apps/ui/src/i18n/locales/ja.json
@@ -1548,5 +1548,6 @@
   "all reachable": "すべて到達可能",
   "{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 で有効化:"
+  "Enable on OAP:": "OAP で有効化:",
+  "{n} reachable · {b} bundled": "{n} 件が到達可能 · {b} 件がバンドル"
 }
diff --git a/apps/ui/src/i18n/locales/ko.json b/apps/ui/src/i18n/locales/ko.json
index 7909e29..40dc171 100644
--- a/apps/ui/src/i18n/locales/ko.json
+++ b/apps/ui/src/i18n/locales/ko.json
@@ -1548,5 +1548,6 @@
   "all reachable": "모두 도달 가능",
   "{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에서 활성화:"
+  "Enable on OAP:": "OAP에서 활성화:",
+  "{n} reachable · {b} bundled": "{n}개 도달 가능 · {b}개 번들"
 }
diff --git a/apps/ui/src/i18n/locales/pt.json b/apps/ui/src/i18n/locales/pt.json
index ad09cda..8b65797 100644
--- a/apps/ui/src/i18n/locales/pt.json
+++ b/apps/ui/src/i18n/locales/pt.json
@@ -1548,5 +1548,6 @@
   "all reachable": "todos acessíveis",
   "{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:"
+  "Enable on OAP:": "Ativar no OAP:",
+  "{n} reachable · {b} bundled": "{n} acessível(is) · {b} incluído(s)"
 }
diff --git a/apps/ui/src/i18n/locales/zh-CN.json 
b/apps/ui/src/i18n/locales/zh-CN.json
index a884228..76f2c14 100644
--- a/apps/ui/src/i18n/locales/zh-CN.json
+++ b/apps/ui/src/i18n/locales/zh-CN.json
@@ -1548,5 +1548,6 @@
   "all reachable": "全部可达",
   "{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 上启用:"
+  "Enable on OAP:": "在 OAP 上启用:",
+  "{n} reachable · {b} bundled": "{n} 个可达 · {b} 个内置"
 }

Reply via email to