This is an automated email from the ASF dual-hosted git repository.

wu-sheng pushed a commit to branch feat/service-internal-topology
in repository https://gitbox.apache.org/repos/asf/skywalking-horizon-ui.git

commit f8bb992e5c2cbdef6b5b0fdd8e99eedae816c834
Author: Wu Sheng <[email protected]>
AuthorDate: Tue Jun 9 15:00:48 2026 +0800

    feat(admin): add 'Not configured' filter to the layer picker
    
    Alongside Diverged / Local, a 'Not configured' checkbox filters the picker
    to layers OAP reports that have no dashboard template yet (the synthesized
    blanks). Disabled + auto-unchecked when that set is empty, matching the
    other filters.
---
 .../admin/layer-templates/LayerDashboardsAdmin.vue       | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git 
a/apps/ui/src/features/admin/layer-templates/LayerDashboardsAdmin.vue 
b/apps/ui/src/features/admin/layer-templates/LayerDashboardsAdmin.vue
index d415cc3..7985ebd 100644
--- a/apps/ui/src/features/admin/layer-templates/LayerDashboardsAdmin.vue
+++ b/apps/ui/src/features/admin/layer-templates/LayerDashboardsAdmin.vue
@@ -224,10 +224,16 @@ const layerSearch = ref('');
 // "Sync all to OAP" would push. Off shows every layer.
 const divergedOnly = ref(false);
 const localOnly = ref(false);
+const unconfiguredOnly = ref(false);
 function isDivergedRow(key: string): boolean {
   const s = sync.badgeFor(`horizon.layer.${key}`);
   return s === 'diverged' || s === 'bundled-fallback';
 }
+/** A layer with no dashboard template yet — present only via the merged live
+ *  roster (a synthesized blank), not in the BFF's loaded template set. */
+function isUnconfiguredRow(key: string): boolean {
+  return !rawTemplates.value.some((t) => t.key.toUpperCase() === 
key.toUpperCase());
+}
 // Declared HERE — before divergedCount / localCount and their watches.
 // Those watches evaluate their source at setup, and `templates` can already
 // be non-empty (the merged live roster), so the filter callbacks read
@@ -249,11 +255,13 @@ const localCount = computed(() => 
templates.value.filter((t) => localEdits.has(l
 // Catches every path that depletes the set, not just reset.
 watch(divergedCount, (n) => { if (n === 0) divergedOnly.value = false; });
 watch(localCount, (n) => { if (n === 0) localOnly.value = false; });
+watch(unconfiguredCount, (n) => { if (n === 0) unconfiguredOnly.value = false; 
});
 const filteredTemplates = computed<AdminLayerTemplate[]>(() => {
   const q = layerSearch.value.trim().toLowerCase();
   return templates.value.filter((t) => {
     if (divergedOnly.value && !isDivergedRow(t.key)) return false;
     if (localOnly.value && !localEdits.has(layerEditName(t.key))) return false;
+    if (unconfiguredOnly.value && !isUnconfiguredRow(t.key)) return false;
     if (!q) return true;
     return (t.alias ?? '').toLowerCase().includes(q) || 
t.key.toLowerCase().includes(q);
   });
@@ -1892,6 +1900,10 @@ const namingTest = computed<NamingTestResult>(() => {
             <input v-model="localOnly" type="checkbox" :disabled="localCount 
=== 0" />
             Local<span v-if="localCount" class="diverged-count local">{{ 
localCount }}</span>
           </label>
+          <label class="diverged-filter unconfigured" :class="{ on: 
unconfiguredOnly }" :title="unconfiguredCount === 0 ? 'Every reported layer has 
a dashboard template' : `${unconfiguredCount} layer(s) reported by OAP with no 
dashboard template yet`">
+            <input v-model="unconfiguredOnly" type="checkbox" 
:disabled="unconfiguredCount === 0" />
+            Not configured<span v-if="unconfiguredCount" 
class="diverged-count">{{ unconfiguredCount }}</span>
+          </label>
         </div>
         <button
           v-for="t in filteredTemplates"
@@ -1951,6 +1963,10 @@ const namingTest = computed<NamingTestResult>(() => {
                     <input v-model="localOnly" type="checkbox" 
:disabled="localCount === 0" />
                     Local<span v-if="localCount" class="diverged-count 
local">{{ localCount }}</span>
                   </label>
+                  <label class="diverged-filter unconfigured" :class="{ on: 
unconfiguredOnly }" :title="unconfiguredCount === 0 ? 'Every reported layer has 
a dashboard template' : `${unconfiguredCount} layer(s) reported by OAP with no 
dashboard template yet`">
+                    <input v-model="unconfiguredOnly" type="checkbox" 
:disabled="unconfiguredCount === 0" />
+                    Not configured<span v-if="unconfiguredCount" 
class="diverged-count">{{ unconfiguredCount }}</span>
+                  </label>
                 </div>
                 <div class="layer-dd-list">
                   <button

Reply via email to