/* ============================================================
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 = `
`;
// 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 `
${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 };
})();