// Autopass entries tab — ledger list chrome and overview stats function classifyEntryKey(key) { const text = String(key || ''); if (text.startsWith('claim:')) { return { label: 'Claim', className: 'entry-badge--claim' }; } if (text.startsWith('vote:')) { return { label: 'Vote', className: 'entry-badge--vote' }; } return { label: 'Other', className: 'entry-badge--muted' }; } function computeEntryStats(data) { const entries = Array.isArray(data) ? data : []; let claims = 0; let votes = 0; let other = 0; for (const entry of entries) { const key = entry?.key || ''; if (key.startsWith('claim:')) claims += 1; else if (key.startsWith('vote:')) votes += 1; else other += 1; } return { total: entries.length, claims, votes, other }; } function updateEntriesChrome(filteredCount) { const totalCount = (window.entriesData || []).length; const visibleCount = filteredCount != null ? filteredCount : (window.filteredEntries || window.entriesData || []).length; const searchEl = document.getElementById('search-entries'); const hasSearch = Boolean(searchEl?.value?.trim()); const emptyEl = document.getElementById('entriesEmpty'); const filteredEmptyEl = document.getElementById('entriesFilteredEmpty'); const endEl = document.getElementById('entriesEnd'); const tableEl = document.querySelector('.entries-table'); const countEl = document.getElementById('entriesCount'); const trulyEmpty = totalCount === 0; const filteredToZero = !trulyEmpty && visibleCount === 0 && hasSearch; if (emptyEl) emptyEl.classList.toggle('entry-empty--visible', trulyEmpty); if (filteredEmptyEl) filteredEmptyEl.classList.toggle('entry-empty--visible', filteredToZero); if (tableEl) tableEl.classList.toggle('entries-table--hidden', trulyEmpty || filteredToZero); if (endEl) endEl.classList.remove('entry-list-end--visible'); if (countEl) { if (trulyEmpty) { countEl.textContent = 'No ledger entries'; } else if (hasSearch && visibleCount !== totalCount) { countEl.textContent = `${visibleCount.toLocaleString()} of ${totalCount.toLocaleString()} shown`; } else { countEl.textContent = `${totalCount.toLocaleString()} entr${totalCount === 1 ? 'y' : 'ies'}`; } } renderEntriesSummary(window.entriesData || []); } function showEntriesListEnd() { const totalCount = (window.entriesData || []).length; const visibleCount = (window.filteredEntries || window.entriesData || []).length; const endEl = document.getElementById('entriesEnd'); if (endEl && totalCount > 0 && visibleCount > 0) { endEl.classList.add('entry-list-end--visible'); } } function renderEntriesSummary(data) { const stats = computeEntryStats(data); const setStat = (id, value) => { const el = document.getElementById(id); if (el) el.textContent = value.toLocaleString(); }; setStat('entryStatTotal', stats.total); setStat('entryStatClaims', stats.claims); setStat('entryStatVotes', stats.votes); setStat('entryStatOther', stats.other); const overviewEl = document.getElementById('entriesOverviewLine'); if (overviewEl) { overviewEl.textContent = stats.total === 0 ? 'Ledger is empty' : `${stats.claims} claims · ${stats.votes} votes`; } } async function copyEntryValue(value) { const text = String(value ?? ''); try { await navigator.clipboard.writeText(text); if (window.showNotification) window.showNotification('Value copied to clipboard'); } catch (err) { console.error('Failed to copy entry value:', err); if (window.showNotification) window.showNotification('Failed to copy value', 'error'); } } window.classifyEntryKey = classifyEntryKey; window.updateEntriesChrome = updateEntriesChrome; window.showEntriesListEnd = showEntriesListEnd; window.renderEntriesSummary = renderEntriesSummary; window.copyEntryValue = copyEntryValue;