Add results_visualization/js/uiRenderer.js
This commit is contained in:
parent
a06e985674
commit
58beb0ba4c
1 changed files with 121 additions and 0 deletions
121
results_visualization/js/uiRenderer.js
Normal file
121
results_visualization/js/uiRenderer.js
Normal file
|
|
@ -0,0 +1,121 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* uiRenderer.js
|
||||||
|
* Verantwortlich für DOM-Manipulation zur Anzeige von Daten.
|
||||||
|
* Enthält Rendering-Methoden für Timeline, Statistik-Zusammenfassungen und Tabellen.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rendert die Timeline der write_pre / write_post Ereignisse.
|
||||||
|
* @param {Array<{corr_id: string, type: string, timestamp: number, details?: object}>} eventPairs
|
||||||
|
*/
|
||||||
|
export function renderTimeline(eventPairs = []) {
|
||||||
|
const panel = document.getElementById('timeline-panel');
|
||||||
|
if (!panel) return;
|
||||||
|
panel.innerHTML = '';
|
||||||
|
|
||||||
|
if (!Array.isArray(eventPairs) || eventPairs.length === 0) {
|
||||||
|
const msg = document.createElement('p');
|
||||||
|
msg.textContent = 'Keine Ereignisse vorhanden.';
|
||||||
|
panel.appendChild(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const list = document.createElement('ul');
|
||||||
|
list.className = 'timeline__list';
|
||||||
|
|
||||||
|
eventPairs.forEach(event => {
|
||||||
|
const item = document.createElement('li');
|
||||||
|
item.className = `timeline__item timeline__item--${event.type}`;
|
||||||
|
|
||||||
|
const label = document.createElement('div');
|
||||||
|
label.className = 'timeline__label';
|
||||||
|
const tsDate = new Date(event.timestamp).toLocaleTimeString();
|
||||||
|
label.textContent = `${event.type} [${tsDate}] (corr: ${event.corr_id})`;
|
||||||
|
|
||||||
|
item.appendChild(label);
|
||||||
|
list.appendChild(item);
|
||||||
|
});
|
||||||
|
|
||||||
|
panel.appendChild(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aktualisiert Statistik-Karten und Übersichten.
|
||||||
|
* @param {Object} statsObj - Enthält berechnete Statistiken
|
||||||
|
* @param {number} statsObj.totalEvents - Gesamtanzahl der Events
|
||||||
|
* @param {number} statsObj.avgDuration - Durchschnittliche Dauer zwischen pre/post
|
||||||
|
* @param {number} statsObj.numWrites - Anzahl write Events
|
||||||
|
* @param {number} statsObj.numReads - Anzahl read Events
|
||||||
|
*/
|
||||||
|
export function renderStatsSummary(statsObj = {}) {
|
||||||
|
const container = document.getElementById('stats-summary');
|
||||||
|
if (!container) return;
|
||||||
|
|
||||||
|
const { totalEvents = 0, avgDuration = 0, numWrites = 0, numReads = 0 } = statsObj;
|
||||||
|
container.innerHTML = '';
|
||||||
|
|
||||||
|
const createCard = (label, value) => {
|
||||||
|
const card = document.createElement('div');
|
||||||
|
card.className = 'stats__card';
|
||||||
|
const header = document.createElement('h3');
|
||||||
|
header.textContent = label;
|
||||||
|
const val = document.createElement('p');
|
||||||
|
val.textContent = value;
|
||||||
|
card.append(header, val);
|
||||||
|
return card;
|
||||||
|
};
|
||||||
|
|
||||||
|
container.append(
|
||||||
|
createCard('Gesamtanzahl Events', totalEvents),
|
||||||
|
createCard('Durchschnittliche Dauer (ms)', avgDuration.toFixed(2)),
|
||||||
|
createCard('Writes', numWrites),
|
||||||
|
createCard('Reads', numReads)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Füllt Tabelle mit den Schreib-/Lesepaaren.
|
||||||
|
* @param {Array<{corr_id: string, type: string, timestamp: number, details?: object}>} dataPairs
|
||||||
|
*/
|
||||||
|
export function renderDataTable(dataPairs = []) {
|
||||||
|
const table = document.getElementById('data-table');
|
||||||
|
if (!table) return;
|
||||||
|
|
||||||
|
const tbody = table.querySelector('tbody') || document.createElement('tbody');
|
||||||
|
tbody.innerHTML = '';
|
||||||
|
|
||||||
|
if (!Array.isArray(dataPairs) || dataPairs.length === 0) {
|
||||||
|
const tr = document.createElement('tr');
|
||||||
|
const td = document.createElement('td');
|
||||||
|
td.colSpan = 4;
|
||||||
|
td.textContent = 'Keine Daten verfügbar';
|
||||||
|
tr.appendChild(td);
|
||||||
|
tbody.appendChild(tr);
|
||||||
|
table.appendChild(tbody);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dataPairs.forEach(item => {
|
||||||
|
const tr = document.createElement('tr');
|
||||||
|
const tsFmt = new Date(item.timestamp).toLocaleString();
|
||||||
|
|
||||||
|
const cols = [
|
||||||
|
item.corr_id,
|
||||||
|
item.type,
|
||||||
|
tsFmt,
|
||||||
|
item.details ? JSON.stringify(item.details) : '-'
|
||||||
|
];
|
||||||
|
|
||||||
|
cols.forEach(value => {
|
||||||
|
const td = document.createElement('td');
|
||||||
|
td.textContent = value;
|
||||||
|
tr.appendChild(td);
|
||||||
|
});
|
||||||
|
|
||||||
|
tbody.appendChild(tr);
|
||||||
|
});
|
||||||
|
|
||||||
|
table.appendChild(tbody);
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue