Add HIDE UNAVAIL toggle to KB Facts page; filter unavailable/empty fact values client-side

This commit is contained in:
2026-06-01 15:18:56 +00:00
parent f0e42cbcbd
commit cf95960e57
+9 -2
View File
@@ -768,6 +768,7 @@ select.filter-sel:focus{border-color:var(--cyan)}
<select class="filter-sel" id="factCat" onchange="loadFacts()"> <select class="filter-sel" id="factCat" onchange="loadFacts()">
<option value="__all__">ALL</option> <option value="__all__">ALL</option>
</select> </select>
&nbsp;<button class="filter-btn active" id="fact-hide-unavail" onclick="toggleFactUnavail(this)" title="Hide unavailable/empty values">HIDE UNAVAIL</button>
</div> </div>
<div class="tbl-wrap" id="facts-tbl"><div class="loading">SCANNING...</div></div> <div class="tbl-wrap" id="facts-tbl"><div class="loading">SCANNING...</div></div>
</div> </div>
@@ -1359,11 +1360,17 @@ async function loadFactCategories() {
const _factCntEl = document.getElementById('facts-count'); if(_factCntEl) _factCntEl.textContent=_factTotal.toLocaleString()+' TOTAL'; const _factCntEl = document.getElementById('facts-count'); if(_factCntEl) _factCntEl.textContent=_factTotal.toLocaleString()+' TOTAL';
} }
const _unavailValues = new Set(['unavailable','unknown','none','null','','N/A','n/a','undefined']);
function toggleFactUnavail(btn){ btn.classList.toggle('active'); loadFacts(); }
async function loadFacts() { async function loadFacts() {
scanShell('facts-tbl', ['CATEGORY','KEY','VALUE','UPDATED','ACTIONS'], null, null); scanShell('facts-tbl', ['CATEGORY','KEY','VALUE','UPDATED','ACTIONS'], null, null);
const cat = document.getElementById('factCat')?.value || '__all__'; const cat = document.getElementById('factCat')?.value || '__all__';
const facts = await api('facts_list', {category: cat}); let facts = await api('facts_list', {category: cat});
if (!facts.length) { document.getElementById('facts-tbl').innerHTML='<div class="empty">NO FACTS</div>'; return; } const hideUnavail = document.getElementById('fact-hide-unavail')?.classList.contains('active');
if (hideUnavail) facts = facts.filter(f => { const v=(f.fact_value||'').toLowerCase().trim(); return !_unavailValues.has(v); });
const _factDispEl = document.getElementById('facts-count');
if (_factDispEl && hideUnavail) _factDispEl.textContent += ` · ${facts.length} SHOWN`;
if (!facts.length) { document.getElementById('facts-tbl').innerHTML='<div class="empty">NO FACTS MATCH FILTER</div>'; return; }
document.getElementById('facts-tbl').innerHTML = `<table> document.getElementById('facts-tbl').innerHTML = `<table>
<thead><tr><th>CATEGORY</th><th>KEY</th><th>VALUE</th><th>UPDATED</th><th>ACTIONS</th></tr></thead> <thead><tr><th>CATEGORY</th><th>KEY</th><th>VALUE</th><th>UPDATED</th><th>ACTIONS</th></tr></thead>
<tbody id="facts-tbl-tbody"></tbody></table>`; <tbody id="facts-tbl-tbody"></tbody></table>`;