Erste Version

This commit is contained in:
Eric Neuber committed 2025-11-20 20:11:48 +01:00
1 parent 7e133d55de
commit f2417ec65d
8 files changed
+2729 -1

No files matched your search

+49
View File
@@ -0,0 +1,49 @@
async function saveTable() {
const rows = [];
const rowCount = document.querySelectorAll('tbody tr').length;
for (let i = 0; i < rowCount; i++) {
const bezeichnung = document.querySelector(`input[data-row='${i}'][data-field='bezeichnung']`).value;
const adresse = document.querySelector(`input[data-row='${i}'][data-field='adresse']`).value;
const type = document.querySelector(`input[data-row='${i}'][data-field='type']`).value;
const faktor = document.querySelector(`input[data-row='${i}'][data-field='faktor']`).value;
const mqtt = document.querySelector(`input[data-row='${i}'][data-field='mqtt']`).checked;
const influxdb = document.querySelector(`input[data-row='${i}'][data-field='influxdb']`).checked;
rows.push({
bezeichnung,
adresse,
type,
faktor,
mqtt,
influxdb
});
}
try {
const response = await fetch('/api/save', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ rows: rows })
});
const messageDiv = document.getElementById('message');
if (response.ok) {
messageDiv.className = 'message success';
messageDiv.textContent = '✓ Erfolgreich gespeichert!';
} else {
messageDiv.className = 'message error';
messageDiv.textContent = '✗ Fehler beim Speichern!';
}
setTimeout(() => {
messageDiv.style.display = 'none';
}, 3000);
} catch (error) {
const messageDiv = document.getElementById('message');
messageDiv.className = 'message error';
messageDiv.textContent = '✗ Verbindungsfehler!';
}
}
+162
View File
@@ -0,0 +1,162 @@
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
max-width: 1200px;
margin: 30px auto;
padding: 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.container {
background-color: white;
border-radius: 12px;
padding: 30px;
box-shadow: 0 10px 40px rgba(0,0,0,0.2);
}
h1 {
color: #333;
text-align: center;
margin-bottom: 30px;
font-size: 28px;
}
.table-wrapper {
overflow-x: auto;
}
table {
width: 100%;
border-collapse: collapse;
background-color: white;
}
th {
background-color: #667eea;
color: white;
padding: 15px;
text-align: left;
font-weight: 600;
border: 1px solid #5568d3;
}
td {
border: 1px solid #e0e0e0;
padding: 12px;
}
tr:hover {
background-color: #f8f9ff;
}
.text-input {
width: 100%;
padding: 8px 12px;
border: 2px solid #e0e0e0;
border-radius: 6px;
box-sizing: border-box;
font-size: 14px;
transition: border-color 0.3s;
}
.text-input:focus {
outline: none;
border-color: #667eea;
}
/* Toggle Switch Styles */
.switch {
position: relative;
display: inline-block;
width: 50px;
height: 24px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
transition: .4s;
border-radius: 24px;
}
.slider:before {
position: absolute;
content: "";
height: 18px;
width: 18px;
left: 3px;
bottom: 3px;
background-color: white;
transition: .4s;
border-radius: 50%;
}
input:checked + .slider {
background-color: #4CAF50;
}
input:focus + .slider {
box-shadow: 0 0 1px #4CAF50;
}
input:checked + .slider:before {
transform: translateX(26px);
}
.save-btn {
display: block;
width: 200px;
margin: 30px auto 0;
padding: 14px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
font-size: 16px;
font-weight: 600;
transition: transform 0.2s, box-shadow 0.2s;
}
.save-btn:hover {
transform: translateY(-2px);
box-shadow: 0 5px 20px rgba(102, 126, 234, 0.4);
}
.save-btn:active {
transform: translateY(0);
}
.message {
text-align: center;
padding: 12px;
margin: 20px 0;
border-radius: 8px;
display: none;
font-weight: 500;
}
.message.success {
background-color: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
display: block;
}
.message.error {
background-color: #f8d7da;
color: #721c24;
border: 1px solid #f5c6cb;
display: block;
}