/* ============================================================ BAN YARO — Partner-Dashboard Operative Daten für Partner: Code + Einladungslink, Statistik, QR-Kontingente mit Einzel-Code-Status, Profil-Status. (Die öffentliche Präsenz wird in partner-profil.js gepflegt.) ============================================================ */ window.Page_partner_dashboard = (() => { let _container = null; let _stats = null; let _qrBatches = []; async function init(container) { _container = container; _render(); await _load(); } function refresh() { _load(); } function onDogChange() {} function _render() { _container.innerHTML = `

${UI.icon('handshake')} Partner-Bereich

Dein Code, deine Zahlen, deine QR-Kontingente.

Lade…
`; } async function _load() { const el = _container.querySelector('#pd-content'); try { _stats = await API.get('/partner/my-stats'); _qrBatches = (await API.get('/partner/my-qr').catch(() => [])) || []; el.innerHTML = _renderDashboard(); _bindEvents(el); } catch (e) { el.innerHTML = `

${UI.escape(e.message || 'Fehler beim Laden.')}

`; } } function _renderDashboard() { const codes = _stats?.codes || []; return ` ${codes.length === 0 ? `

Dir ist noch kein Partner-Code zugeordnet.
Melde dich bei partner@banyaro.app — wir richten ihn ein.

` : codes.map(c => _renderCodeCard(c)).join('')} ${_renderQrSection()} ${_renderProfileCard()} `; } function _renderCodeCard(c) { const link = `https://banyaro.app/?ref=${encodeURIComponent(c.code)}`; return `
Dein Einladungscode
${UI.escape(c.code)}
${c.registrations}
Registrierungen
${c.registrations_month}
diesen Monat
Zählt alle Wege: geteilter Link, eingetippter Code und deine gedruckten QR-Codes.
`; } function _renderQrSection() { if (!_qrBatches.length) return ''; return `
Meine QR-Codes

Deine gedruckten QR-Codes (Sticker, Flyer) — und wie viele davon schon neue Hundefreunde gebracht haben.

${_qrBatches.map(b => `
${UI.escape(b.label)}
${b.quantity} Codes · ${(b.created_at || '').slice(0, 10)}
${b.codes_used} von ${b.quantity}
genutzt
${UI.icon('file-pdf')} PDF
`).join('')}
`; } function _renderProfileCard() { const p = _stats?.profile || {}; let badge; if (p.approved === 1) badge = `✓ Öffentlich sichtbar`; else if (p.approved === -1) badge = `✗ Abgelehnt`; else if (p.submitted_at) badge = `⏳ In Prüfung`; else if (p.exists) badge = `Entwurf`; else badge = `Noch nicht angelegt`; return `
Öffentliches Profil
${badge}
`; } function _bindEvents(el) { // Einladungslink kopieren el.querySelectorAll('.pd-copy').forEach(btn => { btn.addEventListener('click', async () => { try { await navigator.clipboard.writeText(btn.dataset.link); UI.toast.success('Einladungslink kopiert.'); } catch { UI.toast.info(btn.dataset.link); } }); }); // Einzel-Code-Status (lazy, .hidden via classList) el.querySelectorAll('.pd-qr-codes-btn').forEach(btn => { btn.addEventListener('click', async () => { const box = el.querySelector(`#pd-qr-codes-${btn.dataset.id}`); if (!box) return; box.classList.toggle('hidden'); if (box.classList.contains('hidden') || box.dataset.loaded === '1') return; try { const codes = await API.get(`/partner/my-qr/${btn.dataset.id}/codes`); box.dataset.loaded = '1'; box.innerHTML = codes.map(c => { const used = c.registrations > 0; return `
#${c.seq} banyaro.app/q/${UI.escape(c.token)} ${used ? `● genutzt${c.registrations > 1 ? ` (${c.registrations}×)` : ''}` : `○ frei`}
`; }).join(''); } catch (err) { UI.toast.error(err.message); } }); }); el.querySelector('#pd-edit-profile')?.addEventListener('click', () => App.navigate('partner-profil')); } return { init, refresh, onDogChange }; })();