diff --git a/dashboard/src/App.jsx b/dashboard/src/App.jsx index c0aa07b..e77876e 100644 --- a/dashboard/src/App.jsx +++ b/dashboard/src/App.jsx @@ -117,7 +117,7 @@ export default function App() { detailsPosition="right" details={['COE', 'P2P', 'P3P'].map((type) => { const typeStats = d.byType?.[type] ?? { completed: 0, total: 0 } - return `${type}: ${typeStats.completed}/${typeStats.total}` + return `${type}: ${typeStats.completed}/${typeStats.total} tests` })} /> diff --git a/dashboard/src/components/TestTable.jsx b/dashboard/src/components/TestTable.jsx index ccfd054..9b86ba4 100644 --- a/dashboard/src/components/TestTable.jsx +++ b/dashboard/src/components/TestTable.jsx @@ -196,7 +196,11 @@ export default function TestTable({ tests = [], allTests = [], isLoading }) { const pairs = parsePairArray(test.coe_pair) return pairs.length > 0 ? String(pairs.length) : null })()} colorClass="bg-cyan-900/50 text-cyan-300" /> - + { + const pairs = parsePairArray(test.p3p_pair) + return pairs.length > 0 ? String(pairs.length) : null + })()} colorClass="bg-orange-900/50 text-orange-300" /> + @@ -258,6 +262,94 @@ export default function TestTable({ tests = [], allTests = [], isLoading }) { ) } + return ( +
+ + + {open && ( +
+
+ + + + + + + + + + + + + +
+ {(() => { + const rows = parseTputRows(pairTest.tput_results) + if (!pairTest.completed || rows.length === 0) return null + return ( +
+ + + + + + + + + + + {rows.map(r => ( + + + + + + + ))} + +
StationThroughputDL RSSIUL RSSI
STA{r.station}{r.tput} Mbps{r.dlRssi} dBm{r.ulRssi} dBm
+
+ ) + })()} +
+ )} +
+ ) + })} + + + ) + })()} + {(() => { + const pairs = parsePairArray(test.p3p_pair) + if (pairs.length === 0) return null + return ( +
+

Paired P3P Tests

+
+ {pairs.map(pairKey => { + const pairTest = testsByLookupKey.get(pairKey) + const itemKey = `${test.id}-${pairKey}` + const open = pairedExpanded.has(`${test.id}::${pairKey}`) + + if (!pairTest) { + return ( +
+ {pairKey} +
+ ) + } + return (