/* ═══════════════════════════════════════════════════════ CHANGELOG — Mission Update Log Controller Groups entries by date into unified cards ═══════════════════════════════════════════════════════ */ (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) { // Handle both DD/MM/YYYY and YYYY-MM-DD formats let d; if (dateStr.includes('/')) { const parts = dateStr.split('/'); d = new Date(parts[2], parts[1] - 1, parts[0]); } else { d = new Date(dateStr + 'T00:00:00'); } const day = d.getDate(); const months = ['January','February','March','April','May','June','July','August','September','October','November','December']; const suffix = (day === 1 || day === 21 || day === 31) ? 'st' : (day === 2 || day === 22) ? 'nd' : (day === 3 || day === 23) ? 'rd' : 'th'; return `${day}${suffix} ${months[d.getMonth()]} ${d.getFullYear()}`; } 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'; // Group entries by date const grouped = []; const dateMap = {}; for (const entry of entries) { if (!dateMap[entry.date]) { dateMap[entry.date] = { date: entry.date, entries: [] }; grouped.push(dateMap[entry.date]); } dateMap[entry.date].entries.push(entry); } let html = ''; // Header html += `