No events.
';
return;
}
- body.innerHTML = events.map(e => {
- // Recovery = letzter State-Uebergang endet in "-> healthy".
- // Image-Rollout = vom Backend markiert via reason "ImageRolled".
- // Beide kriegen eigene Badges, damit man Erholungen und neue
- // Images von generischen Info-Events (nur-Revision-Rollouts)
- // trennen kann.
- const isRecovery = typeof e.message === 'string' && e.message.endsWith('-> healthy');
- const isImageRoll = e.reason === 'ImageRolled';
- let sev = e.severity;
- if (isRecovery) sev = 'recovered';
- else if (isImageRoll) sev = 'image';
- return `
-
-
${formatTime(e.timestamp)}
-
${sev}
-
-
${escapeHtml(e.message)}
-
${escapeHtml(e.workloadId)} · ${escapeHtml(e.reason || '')}
-
-
- `;
+ const clusters = clusterEvents(events);
+
+ let lastDate = null;
+ body.innerHTML = clusters.map(cluster => {
+ const sev = dominantSev(cluster.events);
+ const showDate = !lastDate || !sameDay(lastDate, cluster.ts);
+ lastDate = cluster.ts;
+ const d = new Date(cluster.ts);
+ const badge = showDate
+ ? `
+ ${cluster.events.map(e => {
+ const esev = eventSev(e);
+ const wid = e.workloadId || '';
+ return `
+
+
+ ${esev}
+ ${escapeHtml(workloadShort(wid))}
+ ${escapeHtml(e.reason || '')}
+
+
${escapeHtml(e.message || '')}
+
+ `;
+ }).join('')}
+
`;
+ return `