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
