Quelltext des aktuellen Standes
/* ============================================
SSL / TLS-Monitoring – UI-Logik
Add, Einzel-/Gesamtprüfung, Löschen, Zeilen-Navigation.
============================================ */
(function () {
'use strict';
function csrf() {
var m = document.querySelector('meta[name="csrf-token"]');
return m ? m.getAttribute('content') : '';
}
function post(url, body) {
return fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'X-CSRF-Token': csrf(),
'X-Requested-With': 'XMLHttpRequest'
},
body: body || ''
}).then(function (r) { return r.json(); });
}
// ---- Modal "Zertifikat hinzufügen" ----
var addModal = document.getElementById('sslAddModal');
function openAddModal() {
if (!addModal) { return; }
addModal.style.display = 'flex';
document.body.style.overflow = 'hidden';
var first = addModal.querySelector('[name=host]');
if (first) { first.focus(); }
}
function closeAddModal() {
if (!addModal) { return; }
addModal.style.display = 'none';
document.body.style.overflow = '';
}
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape' && addModal && addModal.style.display !== 'none') { closeAddModal(); }
});
// Klick auf Overlay-Hintergrund schließt das Modal
if (addModal) {
addModal.addEventListener('click', function (e) {
if (e.target === addModal) { closeAddModal(); }
});
}
// ---- Live-Suche über die Tabelle ----
var searchInput = document.getElementById('sslSearch');
if (searchInput) {
var noResults = document.getElementById('sslNoResults');
var filterRows = function () {
var q = searchInput.value.trim().toLowerCase();
var rows = document.querySelectorAll('#sslTable tbody tr');
var visible = 0;
rows.forEach(function (row) {
var hay = row.getAttribute('data-search') || '';
var match = q === '' || hay.indexOf(q) !== -1;
row.style.display = match ? '' : 'none';
if (match) { visible++; }
});
if (noResults) { noResults.hidden = !(rows.length > 0 && visible === 0); }
};
searchInput.addEventListener('input', filterRows);
}
// ---- Eintrag hinzufügen ----
var addForm = document.getElementById('sslAddForm');
if (addForm) {
addForm.addEventListener('submit', function (e) {
e.preventDefault();
var btn = document.getElementById('sslAddBtn');
var msg = document.getElementById('sslAddMsg');
if (!addForm.querySelector('[name=host]').value.trim()) { return; }
var data = new URLSearchParams(new FormData(addForm)).toString();
btn.disabled = true;
btn.innerHTML = '<span class="ssl-spin"></span> ' + window.onitText('Prüfe…');
if (msg) { msg.textContent = ''; }
post('/ssl/entries', data).then(function (d) {
btn.disabled = false;
btn.innerHTML = window.onitText('Hinzufügen');
if (d && d.error) {
if (msg) { msg.textContent = d.error; msg.style.color = '#b91c1c'; }
return;
}
location.reload();
}).catch(function () {
btn.disabled = false;
btn.innerHTML = window.onitText('Hinzufügen');
if (msg) { msg.textContent = 'Fehler beim Verbinden.'; msg.style.color = '#b91c1c'; }
});
});
}
// ---- Delegierte Aktionen ----
document.addEventListener('click', function (e) {
if (e.target.closest('[data-ssl-add-open]')) { e.preventDefault(); openAddModal(); return; }
if (e.target.closest('[data-ssl-modal-close]')) { e.preventDefault(); closeAddModal(); return; }
var checkBtn = e.target.closest('.ssl-check-btn');
if (checkBtn) {
e.preventDefault();
e.stopPropagation();
var orig = checkBtn.innerHTML;
checkBtn.disabled = true;
checkBtn.innerHTML = '<span class="ssl-spin"></span>';
post('/ssl/entries/' + checkBtn.dataset.id + '/check')
.then(function () { location.reload(); })
.catch(function () { checkBtn.disabled = false; checkBtn.innerHTML = orig; });
return;
}
var delBtn = e.target.closest('.ssl-delete-btn');
if (delBtn) {
e.preventDefault();
e.stopPropagation();
if (!window.confirm('Eintrag „' + (delBtn.dataset.host || '') + '" wirklich entfernen?')) { return; }
post('/ssl/entries/' + delBtn.dataset.id + '/delete').then(function () {
if (delBtn.dataset.redirect) { location.href = delBtn.dataset.redirect; return; }
var row = document.getElementById('sslRow' + delBtn.dataset.id);
if (row) { row.remove(); }
});
return;
}
var allBtn = e.target.closest('#sslCheckAllBtn');
if (allBtn) {
e.preventDefault();
var o = allBtn.innerHTML;
allBtn.disabled = true;
allBtn.innerHTML = '<span class="ssl-spin"></span> ' + window.onitText('Prüfe alle…');
post('/ssl/check-all')
.then(function () { location.reload(); })
.catch(function () { allBtn.disabled = false; allBtn.innerHTML = o; });
return;
}
// Zeilen-Navigation zur Detailseite (nicht bei Buttons/Links)
var row = e.target.closest('tr.clickable');
if (row && !e.target.closest('button') && !e.target.closest('a')) {
if (row.dataset.href) { location.href = row.dataset.href; }
}
});
}());