generated from coulomb/repo-seed
fix(dashboard): repair broken SBOM card on Overview
The card titled "SBOM" was displaying contribution type counts (FR/BR/EP/UPR) which is unrelated to SBOM data. Added a sbomSnapState generator that fetches /sbom/snapshots/ and shows: total tracked packages (sum of entry_count across all snapshots), repos tracked, and copyleft risk count from the existing licence_risk_count in the summary. Card turns orange if licenceRisk > 0. Resolves suggestion b6775727. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -46,6 +46,24 @@ const refreshDecisions = async () => {
|
|||||||
refreshDecisions();
|
refreshDecisions();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
// SBOM snapshots — repo coverage and total package count
|
||||||
|
const sbomSnapState = (async function*() {
|
||||||
|
while (true) {
|
||||||
|
let snapshots = [], totalPkgs = 0;
|
||||||
|
try {
|
||||||
|
const r = await fetch(`${API}/sbom/snapshots/`);
|
||||||
|
if (r.ok) {
|
||||||
|
snapshots = await r.json();
|
||||||
|
totalPkgs = snapshots.reduce((s, sn) => s + (sn.entry_count ?? 0), 0);
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
yield {snapshots, totalPkgs};
|
||||||
|
await new Promise(res => setTimeout(res, POLL));
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
```
|
||||||
|
|
||||||
```js
|
```js
|
||||||
// Registered projects — milestone events tagged with registration
|
// Registered projects — milestone events tagged with registration
|
||||||
const regsState = (async function*() {
|
const regsState = (async function*() {
|
||||||
@@ -316,6 +334,8 @@ const contribCounts = summary.contribution_counts ?? {};
|
|||||||
const licenceRisk = summary.licence_risk_count ?? 0;
|
const licenceRisk = summary.licence_risk_count ?? 0;
|
||||||
const totalContribs = ["br","fr","ep","upr"].reduce((s, t) => s + (contribCounts[t] ?? 0), 0);
|
const totalContribs = ["br","fr","ep","upr"].reduce((s, t) => s + (contribCounts[t] ?? 0), 0);
|
||||||
const needsFollowUp = (contribCounts["submitted"] ?? 0) + (contribCounts["acknowledged"] ?? 0);
|
const needsFollowUp = (contribCounts["submitted"] ?? 0) + (contribCounts["acknowledged"] ?? 0);
|
||||||
|
const sbomSnaps = sbomSnapState.snapshots ?? [];
|
||||||
|
const totalPkgs = sbomSnapState.totalPkgs ?? 0;
|
||||||
|
|
||||||
display(html`<div class="grid grid-cols-3" style="gap:1rem;margin-bottom:1.5rem">
|
display(html`<div class="grid grid-cols-3" style="gap:1rem;margin-bottom:1.5rem">
|
||||||
<a class="card card-link" href="./contributions">
|
<a class="card card-link" href="./contributions">
|
||||||
@@ -328,9 +348,10 @@ display(html`<div class="grid grid-cols-3" style="gap:1rem;margin-bottom:1.5rem"
|
|||||||
<p class="big-num">${licenceRisk}</p>
|
<p class="big-num">${licenceRisk}</p>
|
||||||
<small>${licenceRisk === 0 ? html`<span style="color:green">✓ no copyleft in direct deps</span>` : html`<span style="color:red">copyleft in direct prod deps</span>`}</small>
|
<small>${licenceRisk === 0 ? html`<span style="color:green">✓ no copyleft in direct deps</span>` : html`<span style="color:red">copyleft in direct prod deps</span>`}</small>
|
||||||
</a>
|
</a>
|
||||||
<a class="card card-link" href="./sbom">
|
<a class="card card-link ${licenceRisk > 0 ? 'warn' : ''}" href="./sbom">
|
||||||
<h3>SBOM</h3>
|
<h3>SBOM</h3>
|
||||||
<p class="big-num" style="font-size:1rem;padding-top:0.5rem">By type: ${["br","fr","ep","upr"].filter(t => contribCounts[t]).map(t => html`<span style="margin-right:0.4rem">${t.toUpperCase()} ${contribCounts[t]}</span>`).join("") || "—"}</p>
|
<p class="big-num">${totalPkgs.toLocaleString()}</p>
|
||||||
|
<small>${sbomSnaps.length} repo${sbomSnaps.length !== 1 ? "s" : ""} tracked · ${licenceRisk > 0 ? html`<span style="color:red">${licenceRisk} copyleft risks</span>` : html`<span style="color:green">✓ no copyleft</span>`}</small>
|
||||||
</a>
|
</a>
|
||||||
</div>`);
|
</div>`);
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user