/* OPENBUREAU — Versionsverlauf eines Beitrags direkt auf der Seite. Die Marke „Version xxx" neben dem Kopf öffnet die Liste der Fassungen (aus /api/history); Auswahl ersetzt den Beitragstext mit der alten Fassung (aus /api/history/version) und zeigt einen Banner mit Rücksprung. */ (function () { var badge = document.getElementById('version-badge'); if (!badge) return; var path = badge.dataset.path; var content = document.querySelector('.single-content'); var article = document.querySelector('article.single'); if (!path || !content || !article) return; var originalHTML = content.innerHTML; var originalLabel = badge.textContent; var panel = null, banner = null; function api(p) { return fetch(p).then(function (r) { return r.ok ? r.json() : null; }).catch(function () { return null; }); } function fmt(d) { try { return new Date(d).toLocaleDateString('de-CH'); } catch (e) { return d || ''; } } function closePanel() { if (panel) { panel.remove(); panel = null; } badge.setAttribute('aria-expanded', 'false'); } function restore() { content.innerHTML = originalHTML; badge.textContent = originalLabel; if (banner) { banner.remove(); banner = null; } } function showBanner(v) { if (banner) banner.remove(); banner = document.createElement('div'); banner.className = 'version-banner'; banner.append('Ältere Fassung vom ' + fmt(v.date) + ' · Version ' + v.short + ' '); var back = document.createElement('button'); back.type = 'button'; back.className = 'version-back'; back.textContent = '→ Zur aktuellen Fassung'; back.addEventListener('click', restore); banner.appendChild(back); article.insertBefore(banner, article.firstChild); } function loadVersion(v) { closePanel(); content.innerHTML = '

Lade Fassung …

'; api('/api/history/version?path=' + encodeURIComponent(path) + '&rev=' + encodeURIComponent(v.rev)).then(function (data) { if (!data || !data.html) { restore(); return; } content.innerHTML = data.html; badge.textContent = 'Version ' + v.short; showBanner(v); window.scrollTo({ top: 0, behavior: 'smooth' }); }); } function openPanel() { api('/api/history?path=' + encodeURIComponent(path)).then(function (list) { panel = document.createElement('div'); panel.className = 'version-panel'; if (!list || !list.length) { panel.innerHTML = '

Kein Verlauf verfügbar.

'; } else { var ol = document.createElement('ol'); ol.className = 'version-list'; list.forEach(function (v, i) { var li = document.createElement('li'); var b = document.createElement('button'); b.type = 'button'; var date = document.createElement('span'); date.className = 'v-date'; date.textContent = fmt(v.date); var subj = document.createElement('span'); subj.className = 'v-subject'; subj.textContent = v.subject || ''; var hash = document.createElement('span'); hash.className = 'v-hash'; hash.textContent = v.short + (i === 0 ? ' · aktuell' : ''); b.append(date, subj, hash); if (i === 0) b.addEventListener('click', function () { restore(); closePanel(); }); else b.addEventListener('click', function () { loadVersion(v); }); li.appendChild(b); ol.appendChild(li); }); panel.appendChild(ol); } badge.parentNode.insertBefore(panel, badge.nextSibling); badge.setAttribute('aria-expanded', 'true'); }); } badge.addEventListener('click', function () { panel ? closePanel() : openPanel(); }); })();