OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

ssl.js

6 KB
/* ============================================
   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; }
        }
    });
}());