Test

Bridge Beheer - Offline Versie

Bridge Aanmeldbeheer

Controleert bibliotheek...
Stap 1: Importeer Paren (XML):

Stap 2: Importeer Losse Spelers (Excel):
Handmatig Paar:
Handmatig Losse Speler:

Paren (0)

    Wachtkamer

    Beschikbaar om te koppelen

      In de zaal / Niet beschikbaar

        // Check of de Excel motor geladen is window.onload = function() { const msg = document.getElementById('libMessage'); if (typeof XLSX !== 'undefined') { msg.innerHTML = "✅ Excel-motor geladen (Excel import & Export werken)"; msg.style.backgroundColor = "#d4edda"; } else { msg.innerHTML = "⚠️ Excel-motor geblokkeerd. Sla 'xlsx.full.min.js' op in deze map voor Excel functies. XML werkt wel."; msg.style.backgroundColor = "#f8d7da"; } }; let paren = JSON.parse(localStorage.getItem('bridgeParen')) || []; let individuen = JSON.parse(localStorage.getItem('bridgeIndividuen')) || []; let geselecteerdeIndexen = []; // --- XML IMPORT --- document.getElementById('xmlParenInput').addEventListener('change', function(e) { const reader = new FileReader(); reader.onload = function(event) { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(event.target.result, "text/xml"); const pairNodes = xmlDoc.getElementsByTagName("Pair"); let teller = 0; for (let i = 0; i < pairNodes.length; i++) { const playerNodes = pairNodes[i].getElementsByTagName("Player"); if (playerNodes.length >= 2) { const s1 = playerNodes[0].getElementsByTagName("FullName")[0]?.textContent; const s2 = playerNodes[1].getElementsByTagName("FullName")[0]?.textContent; if(s1 && s2) { paren.push({ id: Date.now() + Math.random(), speler1: s1.trim(), speler2: s2.trim() }); teller++; } } } sorteerIndividuen(); opslaanEnRender(); alert(teller + " paren ingeladen uit XML."); }; reader.readAsText(e.target.files[0]); }); // --- EXCEL IMPORT --- document.getElementById('excelLosInput').addEventListener('change', function(e) { if (typeof XLSX === 'undefined') return alert("Excel-motor is niet geladen."); const reader = new FileReader(); reader.onload = function(event) { const data = new Uint8Array(event.target.result); const workbook = XLSX.read(data, { type: 'array' }); const json = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]], { header: 1 }); json.forEach(rij => { if (rij[0]) individuen.push({ naam: String(rij[0]), beschikbaar: true }); }); sorteerIndividuen(); opslaanEnRender(); alert("Losse spelers toegevoegd."); }; reader.readAsArrayBuffer(e.target.files[0]); }); // --- CORE LOGICA --- function opslaanEnRender() { localStorage.setItem('bridgeParen', JSON.stringify(paren)); localStorage.setItem('bridgeIndividuen', JSON.stringify(individuen)); render(); } function handmatigPaar() { const n1 = document.getElementById('pNaam1'); const n2 = document.getElementById('pNaam2'); if(n1.value && n2.value) { paren.push({ id: Date.now(), speler1: n1.value, speler2: n2.value }); n1.value = ''; n2.value = ''; opslaanEnRender(); } } function handmatigLosseSpeler() { const n = document.getElementById('losseNaam'); if(n.value) { individuen.push({ naam: n.value, beschikbaar: true }); n.value = ''; sorteerIndividuen(); opslaanEnRender(); } } window.afmelden = function(id) { const idx = paren.findIndex(p => p.id === id); const p = paren.splice(idx, 1)[0]; individuen.push({ naam: p.speler1, beschikbaar: false }, { naam: p.speler2, beschikbaar: false }); sorteerIndividuen(); opslaanEnRender(); }; function toggleStatus(index) { individuen[index].beschikbaar = !individuen[index].beschikbaar; geselecteerdeIndexen = []; // Reset selectie bij statuswijziging om fouten te voorkomen sorteerIndividuen(); opslaanEnRender(); } function selecteerVoorPaar(index) { if (geselecteerdeIndexen.includes(index)) { geselecteerdeIndexen = geselecteerdeIndexen.filter(i => i !== index); } else if (geselecteerdeIndexen.length < 2) { geselecteerdeIndexen.push(index); } render(); } function maakPaar() { const p1 = individuen[geselecteerdeIndexen[0]]; const p2 = individuen[geselecteerdeIndexen[1]]; paren.push({ id: Date.now(), speler1: p1.naam, speler2: p2.naam }); // Verwijderen op basis van naam omdat de index kan verschuiven door sorteren const namenWissen = [p1.naam, p2.naam]; individuen = individuen.filter(i => !namenWissen.includes(i.naam)); geselecteerdeIndexen = []; opslaanEnRender(); } function wisAlles() { if(confirm("Lijsten volledig leegmaken?")) { paren = []; individuen = []; localStorage.clear(); render(); } } // --- SORTEER FUNCTIES --- function sorteerParen() { paren.sort((a, b) => { const achternaamA = a.speler1.trim().split(" ").pop().toLowerCase(); const achternaamB = b.speler1.trim().split(" ").pop().toLowerCase(); return achternaamA.localeCompare(achternaamB); }); opslaanEnRender(); } function sorteerIndividuen() { individuen.sort((a, b) => a.naam.localeCompare(b.naam)); } // --- RENDER --- function render() { const zoekTerm = document.getElementById('zoekVeld').value.toLowerCase(); document.getElementById('count').textContent = paren.length; const pLijst = document.getElementById('parenLijst'); pLijst.innerHTML = ''; paren.forEach(p => { if (p.speler1.toLowerCase().includes(zoekTerm) || p.speler2.toLowerCase().includes(zoekTerm)) { const li = document.createElement('li'); li.innerHTML = `${p.speler1} & ${p.speler2} `; pLijst.appendChild(li); } }); const bLijst = document.getElementById('lijstBeschikbaar'); const nbLijst = document.getElementById('lijstNietBeschikbaar'); bLijst.innerHTML = ''; nbLijst.innerHTML = ''; individuen.forEach((persoon, index) => { const li = document.createElement('li'); li.textContent = persoon.naam; if (persoon.beschikbaar) { li.className = 'status-beschikbaar'; if (geselecteerdeIndexen.includes(index)) li.classList.add('selected'); li.onclick = () => selecteerVoorPaar(index); const btnZetTerug = document.createElement('button'); btnZetTerug.textContent = "Naar 'In de zaal'"; btnZetTerug.style.fontSize = "10px"; btnZetTerug.onclick = (e) => { e.stopPropagation(); toggleStatus(index); }; li.appendChild(btnZetTerug); bLijst.appendChild(li); } else { li.className = 'status-niet-beschikbaar'; li.onclick = () => toggleStatus(index); nbLijst.appendChild(li); } }); document.getElementById('maakPaarBtn').style.display = geselecteerdeIndexen.length === 2 ? 'block' : 'none'; } // Eerste keer sorteren bij laden sorteerIndividuen(); render();