/* ============================================================ BAN YARO — Wurfbörse Öffentliche Wurfankündigungen aller Züchter ============================================================ */ window.Page_wurfboerse = (() => { let _container = null; let _appState = null; let _data = []; // ---------------------------------------------------------- // Hilfsfunktionen // ---------------------------------------------------------- function _fmtDate(iso) { if (!iso) return '—'; const d = new Date(iso + 'T12:00:00'); return d.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric' }); } function _statusBadge(status) { const map = { geplant: { label: 'Geplant', cls: 'wb-badge--geplant' }, geboren: { label: 'Geboren', cls: 'wb-badge--geboren' }, verfuegbar: { label: 'Verfügbar', cls: 'wb-badge--verfuegbar' }, abgeschlossen: { label: 'Abgeschlossen', cls: 'wb-badge--abgeschlossen' }, }; const s = map[status] || { label: status, cls: 'wb-badge--geplant' }; return `${s.label}`; } function _truncate(text, max) { if (!text) return ''; return text.length > max ? text.slice(0, max).trimEnd() + '…' : text; } // ---------------------------------------------------------- // INIT // ---------------------------------------------------------- async function init(container, appState) { _container = container; _appState = appState; _render(); await _loadData(); } function refresh() { _loadData(); } function onDogChange() {} // ---------------------------------------------------------- // Grundstruktur rendern // ---------------------------------------------------------- function _render() { _container.innerHTML = `

Lädt…

`; // Suchen-Button document.getElementById('wb-search-btn').addEventListener('click', () => _loadData()); // Enter im Rasse-Feld document.getElementById('wb-filter-rasse').addEventListener('keydown', e => { if (e.key === 'Enter') _loadData(); }); } // ---------------------------------------------------------- // Daten laden // ---------------------------------------------------------- async function _loadData() { const rasseEl = document.getElementById('wb-filter-rasse'); const statusEl = document.getElementById('wb-filter-status'); const params = {}; if (rasseEl?.value.trim()) params.rasse = rasseEl.value.trim(); if (statusEl?.value) params.status = statusEl.value; try { _data = await API.litters.public(params); _renderList(); } catch (err) { UI.toast.error(err.message || 'Fehler beim Laden der Wurfbörse.'); _renderEmpty('Fehler beim Laden', 'Bitte später erneut versuchen.'); } } // ---------------------------------------------------------- // Liste rendern // ---------------------------------------------------------- function _renderList() { const el = document.getElementById('wb-list'); if (!el) return; if (!_data.length) { _renderEmpty('Keine Würfe gefunden', 'Für die gewählten Filter gibt es aktuell keine Wurfankündigungen.'); return; } el.innerHTML = `
${_data.map(b => _cardHTML(b)).join('')}
`; el.querySelectorAll('.wb-profile-btn').forEach(btn => { btn.addEventListener('click', () => { const zwingername = btn.dataset.zwingername; App.navigate('breeder', true, { zwingername }); }); }); el.querySelectorAll('.wb-chat-btn').forEach(btn => { btn.addEventListener('click', () => { const breederId = parseInt(btn.dataset.breederUserId, 10); _contactBreeder(breederId); }); }); el.querySelectorAll('.wb-login-btn').forEach(btn => { btn.addEventListener('click', () => App.navigate('settings')); }); } function _renderEmpty(title, text) { const el = document.getElementById('wb-list'); if (!el) return; el.innerHTML = `
${UI.icon('dog')}

${UI.escape(title)}

${UI.escape(text)}

`; } // ---------------------------------------------------------- // Card HTML // ---------------------------------------------------------- function _cardHTML(b) { // Züchter-Kopfzeile const zuechterName = b.zuechter_name || b.zwingername || '—'; const zwingername = b.zwingername ? ` (${UI.escape(b.zwingername)})` : ''; const stadtLine = b.stadt ? ` · ${UI.escape(b.stadt)}` : ''; // Elterntiere const elternParts = []; if (b.vater_name) elternParts.push(UI.escape(b.vater_name)); if (b.mutter_name) elternParts.push(UI.escape(b.mutter_name)); const elternLine = elternParts.length === 2 ? `
${UI.icon('gender-male')} ${elternParts[0]} × ${UI.icon('gender-female')} ${elternParts[1]}
` : elternParts.length === 1 ? `
${elternParts[0]}
` : ''; // Datum let datumLine = ''; if (b.geburt_datum) { datumLine = `
${UI.icon('calendar-dots')} Geboren: ${_fmtDate(b.geburt_datum)}
`; } else if (b.erwartetes_datum) { datumLine = `
${UI.icon('calendar-dots')} Erwartet: ${_fmtDate(b.erwartetes_datum)}
`; } // Welpen-Verfügbarkeit let welpenLine = ''; if (b.welpen_gesamt != null || b.welpen_verfuegbar != null) { const gesamt = b.welpen_gesamt != null ? b.welpen_gesamt : '?'; const verfuegb = b.welpen_verfuegbar != null ? b.welpen_verfuegbar : '?'; welpenLine = `
${UI.icon('paw-print')} Welpen verfügbar: ${UI.escape(String(verfuegb))} von ${UI.escape(String(gesamt))}
`; } // Preis const preisLine = b.preis_spanne ? `
${UI.icon('currency-eur')} Preis: ${UI.escape(b.preis_spanne)} €
` : ''; // Gesundheitstests const gesundheitLine = b.gesundheitstests ? `
${UI.icon('heart')} ${UI.escape(b.gesundheitstests)}
` : ''; // Beschreibung (max. 150 Zeichen) const beschreibungLine = b.beschreibung ? `
${UI.escape(_truncate(b.beschreibung, 150))}
` : ''; return `
${UI.escape(zuechterName)}${zwingername}${stadtLine}
${_statusBadge(b.status)}
${b.rasse_text ? `
${UI.icon('dog')} ${UI.escape(b.rasse_text)}
` : ''}
${elternLine} ${datumLine} ${welpenLine} ${preisLine} ${gesundheitLine} ${beschreibungLine}
`; } // ---------------------------------------------------------- // Züchter per Chat kontaktieren // ---------------------------------------------------------- async function _contactBreeder(breederId) { if (!_appState?.user) { App.navigate('settings'); return; } try { const conv = await API.chat.start(breederId); App.navigate('chat'); } catch (e) { UI.toast.error(e.message || 'Chat konnte nicht geöffnet werden.'); } } return { init, refresh, onDogChange }; })();