@oliverio
Und wie hast du gemerkt, dass es nicht funktioniert?
Gibt es Fehlermeldung?
Der Button aktualisiert sich nicht mehr, der Text darin bleibt gleich. Ja es gibt auch eine Fehlermeldung in der Konsole: TypeError: undefined is not an object (evaluating 'window.jsontemplate.clicktodo')
Den kann ich allerdings nicht nachvollziehen, weil sie gesagt, es zuvor eigentlich einwandfrei funktioniert hatte. Ich habe es zwar für ca. 10 Minuten getestet gehabt, aber merke eben erst, dass es nicht mehr will.
Hier der bisherige Zustand von dem JSON-Template:
<%
let todo = data.map(el => {
return {
...el,
color: parseInt(el.countdown) <= 20 ? "red"
: parseInt(el.countdown) <= 35 ? "yellow"
: "green",
};
});
%>
<style>
table {
border-collapse: separate;
border-spacing: 0 4px;
width: 100%;
text-align: center;
}
.rowBorder td {
border-top: 2px solid var(--borderColor);
border-bottom: 2px solid var(--borderColor);
padding: 4px;
}
.rowBorder td:first-child {
border-left: 2px solid var(--borderColor);
}
.rowBorder td:last-child {
border-right: 2px solid var(--borderColor);
}
h1, h2 {
text-align: center;
}
table th:last-child, table td:last-child {
width: 160px;
}
</style>
<table>
<thead>
<tr>
<th>Maschine</th>
<th>Wartungsname</th>
<th>Beschreibung</th>
<th>Startdatum</th>
<th>verbliebene Tage</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<% todo.forEach(item => { %>
<tr class="rowBorder" style="--borderColor: <%= item.color %>;">
<td><%- item.machine_name %></td>
<td><%- item.name %></td>
<td><%- item.description %></td>
<td><%- item.date %></td>
<td><%- item.countdown %></td>
<td><%- getButton(item.machine_id, item.status) %></td>
</tr>
<% }); %>
</tbody>
</table>
<%
window.jsontemplate = {clicktodo: clicktodo};
function getButton(machine_id, status) {
let text = "";
switch (status) {
case 0:
text = "nicht begonnen";
break;
case 1:
text = "in Bearbeitung";
break;
case 2:
text = "erledigt";
break;
}
return '<button onclick="window.jsontemplate.clicktodo(this)" data-machine_id="' +machine_id+ '"data-status="'+status+'">'+text+'</button>';
}
async function clicktodo(el) {
let machine_id = el.dataset.machine_id;
let status = parseInt(el.dataset.status);
let nextstatus = (status === 0) ? 1 : (status === 1) ? 2 : 0;
el.textContent = (nextstatus === 0) ? "nicht begonnen"
: (nextstatus === 1) ? "in Bearbeitung"
: "erledigt";
el.dataset.status = nextstatus;
await setStatus(machine_id, nextstatus);
}
async function setStatus(machine_id, status) {
console.log('Datenbank wird aktualisiert: Maschine ' +machine_id+ ', neuer Status ' +status);
const req = await sendToAsync("sql.2", "query", "UPDATE data.machine_maintenance_dates SET status = " +status+ " WHERE machine_id = '" +machine_id+ "'");
vis.setValue("local_trigger", Math.random());
}
async function sendToAsync(instance, command, sendData) {
console.log('Sende Befehl: '+command+', Daten: ' +sendData);
return new Promise((resolve, reject) => {
try {
vis.conn.sendTo(instance, command, sendData, function (receiveData) {
resolve(receiveData);
});
} catch (error) {
reject(error);
}
});
}
%>
Ich habe eine kleine Anpassung. Es wird zwar der machine_name angezeigt, aber verglichen wird die Zeile mit der machine_id. Die ID ist natürlich in der JSON-Datei enthalten.
Nein ich habe kein phpadmin, mein Heimserver wurde mal von einem Kollegen eingerichtet.