';
- h += ''+f.t.retryAttempt+' '+(f.t.retryAttempt===1?'retry':'retries')+'';
- h += ''+fmt(f.t.durationMs)+'';
- h += '
';
- });
- h += '
';
- sec.innerHTML = h;
-}
-
-function sortGroups(grps) {
- if (sortMode === 'duration') {
- const maxDur = new Map(grps.map(g => [g, g.tests.length ? Math.max(...g.tests.map(t => t.durationMs)) : 0]));
- return [...grps].sort((a,b) => maxDur.get(b) - maxDur.get(a));
- }
- if (sortMode === 'name') return [...grps].sort((a,b) => a.label.localeCompare(b.label));
- const minStatus = new Map(grps.map(g => [g, g.tests.length ? Math.min(...g.tests.map(t => statusOrder[t.status] ?? 9)) : 9]));
- return [...grps].sort((a,b) => minStatus.get(a) - minStatus.get(b));
-}
-
-function render() {
- let total = 0;
- let html = '';
- const displayGroups = sortGroups(computeDisplayGroups());
- const limited = displayGroups.slice(0, renderLimit);
- limited.forEach((g,gi)=>{
- const ft = sortTests(g.tests.filter(matchesFilter));
- if (!ft.length) return;
- total += ft.length;
- const c = countStatuses(ft);
- const fail = c.f > 0;
- const open = fail || searchText;
- html += '
';
- html += '
';
- html += '';
- html += arrow;
- html += ''+(searchText?highlight(g.label,searchText):esc(g.label))+'';
- html += '';
- if(c.p) html += ''+c.p+'';
- if(c.f) html += ''+c.f+'';
- if(c.s) html += ''+c.s+'';
- html += ''+ft.length+'';
- html += '
';
- html += '
';
- if (groupMode === 'class') {
- html += renderClassSummary(g, ft);
- html += renderSuiteTrace(g);
- }
- ft.forEach((t,ti)=>{
- html += '
';
- var bl=badgeLabel(t);html += ''+esc(bl)+'';
- html += ''+(searchText?highlight(t.displayName,searchText):esc(t.displayName))+'';
- if(t.retryAttempt>0) html += 'retry '+t.retryAttempt+'';
- html += '';
- html += ''+fmt(t.durationMs)+'';
- html += '
';
- html += '
';
- });
- html += '
';
- });
- if (displayGroups.length > renderLimit) {
- html += '