// JavaScript für Medi-WOL Web-Oberfläche class PCManager { constructor() { this.init(); } init() { this.loadPCs(); this.setupEventListeners(); } setupEventListeners() { // Formular für neuen PC document.getElementById('addPCForm').addEventListener('submit', (e) => { e.preventDefault(); this.addPC(); }); // Edit PC Modal speichern Button document.getElementById('saveEditBtn').addEventListener('click', () => { this.saveEditPC(); }); // MAC-Adresse Formatierung für Edit-Formular document.getElementById('editMACAddress')?.addEventListener('input', (e) => { this.formatMACAddress(e.target); }); } async loadPCs() { try { const response = await fetch('/api/pcs'); const data = await response.json(); if (data.success) { this.displayPCs(data.pcs); } else { this.showNotification('Fehler', data.message, 'danger'); } } catch (error) { this.showNotification('Fehler', 'Fehler beim Laden der PCs', 'danger'); } } displayPCs(pcs) { const tableBody = document.getElementById('pcTableBody'); const noPCs = document.getElementById('noPCs'); const pcList = document.getElementById('pcList'); if (pcs.length === 0) { tableBody.innerHTML = ''; noPCs.style.display = 'block'; pcList.style.display = 'none'; return; } noPCs.style.display = 'none'; pcList.style.display = 'block'; tableBody.innerHTML = pcs.map(pc => ` ${this.escapeHtml(pc.name)} ${this.escapeHtml(pc.mac)} ${new Date(pc.created_at).toLocaleDateString('de-DE')}
`).join(''); } async addPC() { const name = document.getElementById('pcName').value.trim(); const mac = document.getElementById('macAddress').value.trim(); if (!name || !mac) { this.showNotification('Warnung', 'Bitte füllen Sie alle Felder aus', 'warning'); return; } try { const response = await fetch('/api/pcs', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ name, mac }) }); const data = await response.json(); if (data.success) { this.showNotification('Erfolg', 'PC erfolgreich hinzugefügt', 'success'); document.getElementById('addPCForm').reset(); this.loadPCs(); } else { this.showNotification('Fehler', data.message, 'danger'); } } catch (error) { this.showNotification('Fehler', 'Fehler beim Hinzufügen des PCs', 'danger'); } } editPC(id, name, mac) { // Modal mit PC-Daten füllen document.getElementById('editPCId').value = id; document.getElementById('editPCName').value = name; document.getElementById('editMACAddress').value = mac; // Modal öffnen const editModal = new bootstrap.Modal(document.getElementById('editPCModal')); editModal.show(); } async saveEditPC() { const id = document.getElementById('editPCId').value; const name = document.getElementById('editPCName').value.trim(); const mac = document.getElementById('editMACAddress').value.trim(); if (!name || !mac) { this.showNotification('Warnung', 'Bitte füllen Sie alle Felder aus', 'warning'); return; } try { const response = await fetch(`/api/pcs/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ name, mac }) }); const data = await response.json(); if (data.success) { this.showNotification('Erfolg', 'PC erfolgreich aktualisiert', 'success'); // Modal schließen const editModal = bootstrap.Modal.getInstance(document.getElementById('editPCModal')); editModal.hide(); // PC-Liste neu laden this.loadPCs(); } else { this.showNotification('Fehler', data.message, 'danger'); } } catch (error) { this.showNotification('Fehler', 'Fehler beim Aktualisieren des PCs', 'danger'); } } async deletePC(id) { if (!confirm('Sind Sie sicher, dass Sie diesen PC löschen möchten?')) { return; } try { const response = await fetch(`/api/pcs/${id}`, { method: 'DELETE' }); const data = await response.json(); if (data.success) { this.showNotification('Erfolg', 'PC erfolgreich gelöscht', 'success'); this.loadPCs(); } else { this.showNotification('Fehler', data.message, 'danger'); } } catch (error) { this.showNotification('Fehler', 'Fehler beim Löschen des PCs', 'danger'); } } async wakePC(id) { try { const response = await fetch(`/api/pcs/${id}/wake`, { method: 'POST' }); const data = await response.json(); if (data.success) { this.showNotification('Erfolg', data.message, 'success'); } else { this.showNotification('Fehler', data.message, 'danger'); } } catch (error) { this.showNotification('Fehler', 'Fehler beim Senden des Wake-on-LAN Pakets', 'danger'); } } showNotification(title, message, type = 'info') { const toast = document.getElementById('notificationToast'); const toastTitle = document.getElementById('toastTitle'); const toastMessage = document.getElementById('toastMessage'); // Toast-Typ setzen toast.className = `toast ${type === 'success' ? 'bg-success' : type === 'danger' ? 'bg-danger' : type === 'warning' ? 'bg-warning' : 'bg-info'} text-white`; toastTitle.textContent = title; toastMessage.textContent = message; // Toast anzeigen const bsToast = new bootstrap.Toast(toast); bsToast.show(); } escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; } formatMACAddress(input) { let value = input.value.replace(/[^0-9A-Fa-f]/g, ''); if (value.length > 12) { value = value.substring(0, 12); } // MAC-Adresse mit Doppelpunkten formatieren if (value.length >= 2) { value = value.match(/.{1,2}/g).join(':'); } input.value = value.toUpperCase(); } } // PC Manager initialisieren, wenn die Seite geladen ist document.addEventListener('DOMContentLoaded', () => { window.pcManager = new PCManager(); }); // MAC-Adresse Formatierung für das Hauptformular document.getElementById('macAddress')?.addEventListener('input', (e) => { let value = e.target.value.replace(/[^0-9A-Fa-f]/g, ''); if (value.length > 12) { value = value.substring(0, 12); } // MAC-Adresse mit Doppelpunkten formatieren if (value.length >= 2) { value = value.match(/.{1,2}/g).join(':'); } e.target.value = value.toUpperCase(); });