/* ═══════════════════════════════════════════════════════ CHANGELOG — Mission Update Log Controller ═══════════════════════════════════════════════════════ */ (function () { 'use strict'; const root = document.getElementById('changelogRoot'); if (!root) return; function esc(s) { const d = document.createElement('div'); d.textContent = s || ''; return d.innerHTML; } function formatDate(dateStr) { const d = new Date(dateStr + 'T00:00:00'); const day = d.getDate().toString().padStart(2, '0'); const month = (d.getMonth() + 1).toString().padStart(2, '0'); const year = d.getFullYear(); return `${day}/${month}/${year}`; } function render(data) { const entries = data.entries || []; const totalChanges = entries.reduce((sum, e) => sum + (e.changes ? e.changes.length : 0), 0); const latestVersion = entries.length > 0 ? entries[0].version : '0.0.0'; let html = ''; // Header html += `
`; html += `
MAINTENANCE LOG
`; html += `
// ALL MODIFICATIONS — LOGGED & VERIFIED
`; html += `
`; html += `CURRENT BUILD: v${esc(latestVersion)}`; html += `UPDATES: ${entries.length}`; html += `TOTAL CHANGES: ${totalChanges}`; html += `
`; // Timeline html += `
`; for (const entry of entries) { const badge = entry.category || 'update'; html += `
`; html += `
`; // Header row html += `
`; html += `v${esc(entry.version)}`; html += `${esc(badge)}`; html += `${formatDate(entry.date)}`; html += `
`; // Title html += `
${esc(entry.title)}
`; // Changes if (entry.changes && entry.changes.length > 0) { html += `
    `; for (const change of entry.changes) { html += `
  • ${esc(change)}
  • `; } html += `
`; } html += `
`; } html += `
`; root.innerHTML = html; } // Load data root.innerHTML = '
LOADING UPDATE LOG...
'; fetch('/api/changelog') .then(res => { if (!res.ok) throw new Error('API ' + res.status); return res.json(); }) .then(data => render(data)) .catch(err => { root.innerHTML = '
⚠ FAILED TO LOAD UPDATE LOG
'; console.error('Changelog load error:', err); }); })();