{ const template = `
`; const css = ` @media print { body * { visibility: hidden; } #Content1, #Content2, #Content3, #Content4 { visibility: visible; } #Content1 * { visibility: visible; } #Content2 * { visibility: visible; } #Content3 * { visibility: visible; } #Content4 * { visibility: visible; } } .hidden-print { display: none !important; } `; window.customElements.define( "renn-historie", class extends HTMLElement { constructor() { super(); this.attachShadow({ mode: "open" }); this.shadowRoot.innerHTML = template; const style = new CSSStyleSheet(); style.replaceSync(css); this.shadowRoot.adoptedStyleSheets = [style]; } connectedCallback() { this.fetchRaces(); } // ---------------------------- API Calls --------------------------- \\ //Holt alle Rennen, die bereits abgeschlossen sind (Status 2), ruft generateRaceNodes und setupToggleButtons auf async fetchRaces() { try { const response = await fetch("/api/rennen/byStatus/?status=2"); const data = await response.json(); if (data.status && Array.isArray(data.rennen)) { this.generateRaceNodes(data.rennen); this.setupToggleButtons(); } else { console.error("Expected an array but got:", data); } } catch (error) { console.error("Error fetching race data:", error); } } //Holt die Ergebnisse für die Rennen, die angezeigt werden. Ruft displayRaceResults auf. async fetchRaceResults(raceId) { try { const response = await fetch(`/api/historie/index.php?r_id=${raceId}`); const results = await response.json(); if (results.status && Array.isArray(results.data)) { this.displayRaceResults(raceId, results.data); } else { console.error("Expected an array but got:", results); } } catch (error) { console.error("Error fetching race results:", error); } } // ---------------------------- Nodes'n'Tables --------------------------- \\ //Genereiert eine Node (Collapsible) für jedes abgeschlossene Rennen. Ruft orintSection und fetchRaceResults auf für jedes Rennen. generateRaceNodes(races) { const container = this.shadowRoot.getElementById("race-container"); const noRacesMessage = this.shadowRoot.getElementById("KeineErgebnisse"); container.innerHTML = ""; if (!races.length) { noRacesMessage.style.display = "block"; return; } // Für jedes Rennen wird eine Node erstellt (Collapsible mit Rennen Name, Datum und Überschrift) races.forEach((race) => { const raceNode = document.createElement("div"); raceNode.classList.add("row", "mt-2"); const dateObj = new Date(race.data.r_datum); const year = dateObj.getFullYear(); // Extract the year from the date const monthName = dateObj.toLocaleString("de-DE", { month: "long" }); // "März", "April", etc. const fullDate = dateObj.toLocaleDateString("de-DE", { day: "2-digit", month: "long", year: "numeric", }); // Deutsches Format raceNode.innerHTML = `| Lauf ${i}L${i} | `; } // Tabelle wird erstellt, unterschiedliche Anzeige der Header für große/kleine Bildschirme const table = document.createElement("table"); table.setAttribute("data-durchgaenge", cat.durchgaenge); table.className = "table table-striped caption-top caption-dark table-fixed"; //Design //Erst Head mit dynamischen Läufen, dann Body mit Ergebnissen table.innerHTML = `||||||
|---|---|---|---|---|---|---|
| Platz Pl. | StNr. | Name | Jahrgang Jhg. | ${laufHeaders}Ziel Zeit Ziel🏁 | Abstand Diff. | |
| ${idx + 1} | ${result.Startnummer ?? ''} | ${result.Name} | ${result.Jahr} | ${Array.from( { length: cat.durchgaenge }, (_, i) => `${result["Lauf" + (i + 1)] || ""} | ` ).join("")}${result.Zielzeit} | ${result.Abstand == '00:00:00.00' ? "-" : result.Abstand} |