last20Messages.acp als Script einbinden in dashboard/page.jsx und daten in der tabelle bekommen

This commit is contained in:
ISA
2024-09-25 11:29:34 +02:00
parent d9f12bb07d
commit 0bdfa9dd8d

View File

@@ -5,65 +5,66 @@ import "@fontsource/roboto";
import "bootstrap-icons/font/bootstrap-icons.css"; import "bootstrap-icons/font/bootstrap-icons.css";
function Dashboard() { function Dashboard() {
const [deviceData, setDeviceData] = useState(null); const [last20Messages, setLast20Messages] = useState([]); // State für die Meldungen als Array
const [digitalInputs, setDigitalInputs] = useState(null);
const [cableMonitoring, setCableMonitoring] = useState(null);
const [cableDetails, setCableDetails] = useState(null);
const [startData, setStartData] = useState(null);
const [last20Messages, setLast20Messages] = useState(null); // State für die Meldungen
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [error, setError] = useState(null); const [error, setError] = useState(null);
useEffect(() => { useEffect(() => {
// Funktion zum Laden der last20Messages von der Start.acp-Seite // Funktion zum Laden und Einbinden der last20Messages.acp
const fetchStartACP = async () => { const loadScript = (src) => {
try { return new Promise((resolve, reject) => {
const response = await fetch("https://10.10.0.118/CPL?Start.acp", { const script = document.createElement("script");
method: "GET", script.src = src;
mode: "cors", script.async = true;
credentials: "include", // Falls Authentifizierung erforderlich ist script.onload = () => {
}); // Prüfe, ob last20Messages im globalen Fensterobjekt existiert
if (window.last20Messages) {
if (!response.ok) { const parsedMessages = parseMessages(window.last20Messages);
throw new Error( setLast20Messages(parsedMessages);
`Fehler beim Laden von Start.acp: ${response.status}` console.log(
"Meldungen direkt aus dem Skript geladen:",
parsedMessages
); );
}
const text = await response.text();
// Extrahiere die last20Messages aus dem HTML-Text von Start.acp
const match = text.match(/var last20Messages = `(.*?)`;/s);
if (match && match[1]) {
const messages = match[1];
// Speichere die Nachrichten in localStorage
localStorage.setItem("last20Messages", messages);
setLast20Messages(messages);
// Speichere die Nachrichten im window-Objekt
window.last20Messages = messages; // Hinzufügen zu window
} else { } else {
console.error("Konnte last20Messages nicht finden."); console.error("Konnte last20Messages nicht finden.");
} }
resolve();
};
script.onerror = reject;
document.head.appendChild(script);
});
};
// Lade das Skript und aktualisiere den State
const fetchLast20Messages = async () => {
try {
await loadScript("/CPL?last20Messages.acp");
} catch (error) { } catch (error) {
console.error("Fehler beim Abrufen der Start.acp-Datei:", error); console.error(
"Fehler beim Laden des Skripts last20Messages.acp:",
error
);
} }
}; };
// Lade last20Messages, wenn sie nicht im localStorage sind fetchLast20Messages();
const messages = localStorage.getItem("last20Messages");
if (messages) {
setLast20Messages(messages);
// Speichere die Nachrichten im window-Objekt // Funktion zum Parsen der Nachrichten
window.last20Messages = messages; // Hinzufügen zu window const parseMessages = (messages) => {
} else { // Nachrichten in Zeilen aufteilen
fetchStartACP(); const rows = messages.split("\n");
} return rows.map((row) => {
// Passe die Längen hier basierend auf der Struktur in deinem Bild an
// Andere Daten laden (falls benötigt) const columns = [
// Hier kannst du deine ACP-Dateien laden, wie in deinem bestehenden Code gezeigt row.substring(0, 5), // ID
row.substring(5, 10), // Wert (z.B. Modulnummer)
row.substring(10, 34), // Zeitstempel
row.substring(34, 60), // Meldung
row.substring(60), // Status
];
return columns;
});
};
}, []); }, []);
return ( return (
@@ -108,25 +109,16 @@ function Dashboard() {
<thead className="bg-gray-200 text-sm font-semibold"> <thead className="bg-gray-200 text-sm font-semibold">
<tr> <tr>
<th className="py-2 px-4">ID</th> <th className="py-2 px-4">ID</th>
<th className="py-2 px-4">Wert</th>
<th className="py-2 px-4">Zeitstempel</th> <th className="py-2 px-4">Zeitstempel</th>
<th className="py-2 px-4">Modul</th>
<th className="py-2 px-4">Meldung</th> <th className="py-2 px-4">Meldung</th>
<th className="py-2 px-4">Status</th> <th className="py-2 px-4">Status</th>
</tr> </tr>
</thead> </thead>
<tbody className="text-sm"> <tbody className="text-sm">
{last20Messages ? ( {last20Messages.length > 0 ? (
// Aufteilung der Nachrichten und Mapping zu Zeilen // Aufteilung der Nachrichten und Mapping zu Zeilen
last20Messages last20Messages.map((columns, index) => (
.split("<tr>")
.slice(1)
.map((row, index) => {
const columns = row
.replace("</tr>", "")
.split("<td>")
.slice(1)
.map((col) => col.replace("</td>", ""));
return (
<tr key={index}> <tr key={index}>
<td className="py-2 px-4">{columns[0]}</td> <td className="py-2 px-4">{columns[0]}</td>
<td className="py-2 px-4">{columns[1]}</td> <td className="py-2 px-4">{columns[1]}</td>
@@ -134,8 +126,7 @@ function Dashboard() {
<td className="py-2 px-4">{columns[3]}</td> <td className="py-2 px-4">{columns[3]}</td>
<td className="py-2 px-4">{columns[4]}</td> <td className="py-2 px-4">{columns[4]}</td>
</tr> </tr>
); ))
})
) : ( ) : (
<tr> <tr>
<td className="py-2 px-4" colSpan="5"> <td className="py-2 px-4" colSpan="5">