@@ -21,6 +21,9 @@ function loadBnetzData() {
2121 tbody . innerHTML = '' ;
2222 data . forEach ( function ( m , idx ) {
2323 var hasDeviation = m . verdict_download === 'deviation' || m . verdict_upload === 'deviation' ;
24+ var verdictIcon = hasDeviation
25+ ? '<i data-lucide="triangle-alert"></i>'
26+ : '<i data-lucide="circle-check"></i>' ;
2427 var verdictText = hasDeviation ? T . bnetz_verdict_deviation : T . bnetz_verdict_ok ;
2528 var verdictClass = hasDeviation ? 'val-crit' : 'val-good' ;
2629 var dlPct = m . download_max_tariff ? Math . round ( m . download_measured_avg / m . download_max_tariff * 100 ) : 0 ;
@@ -36,21 +39,21 @@ function loadBnetzData() {
3639 }
3740 var complaintBtn = '' ;
3841 if ( hasDeviation ) {
39- complaintBtn = '<a href="javascript:void(0)" onclick="generateBnetzComplaint(' + m . id + ')" ' +
40- 'title="' + ( T . bnetz_generate_complaint || 'Generate complaint' ) + '" ' +
41- 'style="margin-right:8px;">✎ </a>' ;
42+ complaintBtn = '<a href="javascript:void(0)" class="bnetz-action-btn" onclick="generateBnetzComplaint(' + m . id + ')" ' +
43+ 'title="' + ( T . bnetz_generate_complaint || 'Generate complaint' ) + '"> ' +
44+ '<i data-lucide="file-pen"></i> </a>' ;
4245 }
43- tr . innerHTML = '<td>' + ( hasMeasurements ? '<span class="bnetz-expand-arrow " id="bnetz-arrow-' + idx + '">▶</span > ' : '' ) + m . date + '</td>' +
46+ tr . innerHTML = '<td>' + ( hasMeasurements ? '<button class="bnetz-expand-btn " id="bnetz-arrow-' + idx + '"><i data-lucide="chevron-right"></i></button > ' : '' ) + m . date + '</td>' +
4447 '<td>' + ( m . provider || '-' ) + '</td>' +
4548 '<td>' + Math . round ( m . download_max_tariff || 0 ) + ' Mbit/s</td>' +
4649 '<td>' + Math . round ( m . download_measured_avg || 0 ) + ' Mbit/s (' + dlPct + '%)</td>' +
4750 '<td>' + Math . round ( m . upload_max_tariff || 0 ) + ' Mbit/s</td>' +
4851 '<td>' + Math . round ( m . upload_measured_avg || 0 ) + ' Mbit/s (' + ulPct + '%)</td>' +
49- '<td class="' + verdictClass + '"> ' + verdictText + '</td>' +
50- '<td style="white-space:nowrap; " onclick="event.stopPropagation();">' +
52+ '<td class="bnetz-verdict ' + verdictClass + '" title=" ' + verdictText + '">' + verdictIcon + '</td>' +
53+ '<td class="bnetz-actions-cell " onclick="event.stopPropagation();">' +
5154 complaintBtn +
52- ( m . source !== 'csv_import' ? '<a href="/api/bnetz/pdf/' + m . id + '" title="PDF" style="margin-right:8px;">📄 </a>' : '' ) +
53- '<a href="javascript:void(0)" onclick="deleteBnetzFromView(' + m . id + ')" title="' + ( T . delete_incident || 'Delete' ) + '">🗑 </a>' +
55+ ( m . source !== 'csv_import' ? '<a href="/api/bnetz/pdf/' + m . id + '" class="bnetz-action-btn" title="PDF"><i data-lucide="file-down"></i> </a>' : '' ) +
56+ '<a href="javascript:void(0)" class="bnetz-action-btn bnetz-action-delete" onclick="deleteBnetzFromView(' + m . id + ')" title="' + ( T . delete_incident || 'Delete' ) + '"><i data-lucide="trash-2"></i> </a>' +
5457 '</td>' ;
5558 tbody . appendChild ( tr ) ;
5659 // Detail expand row (hidden by default)
@@ -60,7 +63,7 @@ function loadBnetzData() {
6063 detailTr . style . display = 'none' ;
6164 var detailTd = document . createElement ( 'td' ) ;
6265 detailTd . colSpan = 8 ;
63- detailTd . style . padding = '0 8px 12px 24px ' ;
66+ detailTd . className = 'bnetz-detail-cell ' ;
6467 detailTd . innerHTML = buildBnetzDetailHtml ( m ) ;
6568 detailTr . appendChild ( detailTd ) ;
6669 tbody . appendChild ( detailTr ) ;
@@ -103,51 +106,49 @@ function toggleBnetzDetail(idx) {
103106 if ( ! row ) return ;
104107 var isOpen = row . style . display !== 'none' ;
105108 row . style . display = isOpen ? 'none' : 'table-row' ;
106- if ( arrow ) arrow . innerHTML = isOpen ? '▶' : '▼' ;
109+ if ( arrow ) arrow . classList . toggle ( 'open' , ! isOpen ) ;
107110}
108111
109112function buildBnetzDetailHtml ( m ) {
110113 var ms = m . measurements || { } ;
111114 var dlList = ms . download || [ ] ;
112115 var ulList = ms . upload || [ ] ;
113- var html = '<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:8px; ">' ;
116+ var html = '<div class="bnetz-detail-grid ">' ;
114117 // Download measurements
115118 if ( dlList . length > 0 ) {
116- html += '<div><strong style="font-size:0.85em;color:var(--text-secondary);">' + ( T . download || 'Download' ) + '</strong>' ;
117- html += '<table style="width:100%;font-size:0.8em;border-collapse:collapse;margin-top:4px;">' ;
118- html += '<tr style="color:var(--text-secondary);border-bottom:1px solid var(--card-border);">' +
119- '<th style="text-align:left;padding:3px 6px;">' + ( T . bnetz_measurement_nr || 'Nr.' ) + '</th>' +
120- '<th style="text-align:left;padding:3px 6px;">' + ( T . bnetz_measurement_time || 'Time' ) + '</th>' +
121- '<th style="text-align:right;padding:3px 6px;">' + ( T . bnetz_measurement_speed || 'Speed' ) + '</th></tr>' ;
119+ html += '<div><span class="bnetz-detail-label">' + ( T . download || 'Download' ) + '</span>' ;
120+ html += '<table class="bnetz-detail-table">' ;
121+ html += '<tr><th>' + ( T . bnetz_measurement_nr || 'Nr.' ) + '</th>' +
122+ '<th>' + ( T . bnetz_measurement_time || 'Time' ) + '</th>' +
123+ '<th class="bnetz-detail-speed-col">' + ( T . bnetz_measurement_speed || 'Speed' ) + '</th></tr>' ;
122124 dlList . forEach ( function ( meas , i ) {
123125 var speed = meas . speed || meas . value || 0 ;
124126 var color = 'var(--text)' ;
125127 if ( m . download_min_tariff && speed < m . download_min_tariff ) color = 'var(--crit)' ;
126128 else if ( m . download_normal_tariff && speed < m . download_normal_tariff ) color = 'var(--warn, orange)' ;
127- html += '<tr style="border-bottom:1px solid var(--card-border);" >' +
128- '<td style="padding:3px 6px;" >' + ( i + 1 ) + '</td>' +
129- '<td style="padding:3px 6px;" >' + ( meas . date || '' ) + ' ' + ( meas . time || '' ) + '</td>' +
130- '<td style="text-align:right;padding:3px 6px; color:' + color + ';">' + ( typeof speed === 'number' ? speed . toFixed ( 1 ) : speed ) + ' Mbit/s</td></tr>' ;
129+ html += '<tr>' +
130+ '<td>' + ( i + 1 ) + '</td>' +
131+ '<td>' + ( meas . date || '' ) + ' ' + ( meas . time || '' ) + '</td>' +
132+ '<td class="bnetz-detail-speed-col" style=" color:' + color + ';">' + ( typeof speed === 'number' ? speed . toFixed ( 1 ) : speed ) + ' Mbit/s</td></tr>' ;
131133 } ) ;
132134 html += '</table></div>' ;
133135 }
134136 // Upload measurements
135137 if ( ulList . length > 0 ) {
136- html += '<div><strong style="font-size:0.85em;color:var(--text-secondary);">' + ( T . upload || 'Upload' ) + '</strong>' ;
137- html += '<table style="width:100%;font-size:0.8em;border-collapse:collapse;margin-top:4px;">' ;
138- html += '<tr style="color:var(--text-secondary);border-bottom:1px solid var(--card-border);">' +
139- '<th style="text-align:left;padding:3px 6px;">' + ( T . bnetz_measurement_nr || 'Nr.' ) + '</th>' +
140- '<th style="text-align:left;padding:3px 6px;">' + ( T . bnetz_measurement_time || 'Time' ) + '</th>' +
141- '<th style="text-align:right;padding:3px 6px;">' + ( T . bnetz_measurement_speed || 'Speed' ) + '</th></tr>' ;
138+ html += '<div><span class="bnetz-detail-label">' + ( T . upload || 'Upload' ) + '</span>' ;
139+ html += '<table class="bnetz-detail-table">' ;
140+ html += '<tr><th>' + ( T . bnetz_measurement_nr || 'Nr.' ) + '</th>' +
141+ '<th>' + ( T . bnetz_measurement_time || 'Time' ) + '</th>' +
142+ '<th class="bnetz-detail-speed-col">' + ( T . bnetz_measurement_speed || 'Speed' ) + '</th></tr>' ;
142143 ulList . forEach ( function ( meas , i ) {
143144 var speed = meas . speed || meas . value || 0 ;
144145 var color = 'var(--text)' ;
145146 if ( m . upload_min_tariff && speed < m . upload_min_tariff ) color = 'var(--crit)' ;
146147 else if ( m . upload_normal_tariff && speed < m . upload_normal_tariff ) color = 'var(--warn, orange)' ;
147- html += '<tr style="border-bottom:1px solid var(--card-border);" >' +
148- '<td style="padding:3px 6px;" >' + ( i + 1 ) + '</td>' +
149- '<td style="padding:3px 6px;" >' + ( meas . date || '' ) + ' ' + ( meas . time || '' ) + '</td>' +
150- '<td style="text-align:right;padding:3px 6px; color:' + color + ';">' + ( typeof speed === 'number' ? speed . toFixed ( 1 ) : speed ) + ' Mbit/s</td></tr>' ;
148+ html += '<tr>' +
149+ '<td>' + ( i + 1 ) + '</td>' +
150+ '<td>' + ( meas . date || '' ) + ' ' + ( meas . time || '' ) + '</td>' +
151+ '<td class="bnetz-detail-speed-col" style=" color:' + color + ';">' + ( typeof speed === 'number' ? speed . toFixed ( 1 ) : speed ) + ' Mbit/s</td></tr>' ;
151152 } ) ;
152153 html += '</table></div>' ;
153154 }
0 commit comments