let allSongs = []; let concerts = []; let historyViewMode = 'timeline'; function formatDate(dateStr) { const d = new Date(dateStr); return d.toLocaleDateString('fr-FR', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }); } function formatDateShort(dateStr) { const d = new Date(dateStr); return d.toLocaleDateString('fr-FR', { year: 'numeric', month: 'long', day: 'numeric' }); } function showError(message) { document.getElementById('error').innerHTML = `
`; } // ---------- Tabs ---------- function switchTab(tab) { document.getElementById('next-view').style.display = tab === 'next' ? '' : 'none'; document.getElementById('history-view').style.display = tab === 'history' ? '' : 'none'; document.getElementById('tab-next').classList.toggle('active', tab === 'next'); document.getElementById('tab-history').classList.toggle('active', tab === 'history'); } // ---------- Historique: liste (timeline / compact) ---------- function timelineSongRow(song) { const embed = youtubeEmbedUrl(song.youtube_url); return `${escapeHtml(song.note)}
` : ''} ${song.spotify_url ? `` : ''}Aucun morceau enregistré.
'}Aucun concert à venir pour le moment.
'; container.querySelectorAll('.concert-row-info').forEach((el) => { el.addEventListener('click', () => showNextDetail(el.dataset.concertId)); }); container.querySelectorAll('.edit-concert-btn').forEach((btn) => { btn.addEventListener('click', () => showNextDetail(btn.dataset.concertId)); }); container.querySelectorAll('.delete-concert-btn').forEach((btn) => { btn.addEventListener('click', () => onDeleteUpcoming(btn.dataset.concertId)); }); } async function onDeleteUpcoming(id) { if (!confirm('Supprimer ce concert ? Cette action est irréversible.')) return; try { await api.del(`/api/setlists/${id}`); await loadUpcoming(); } catch (err) { showError(err.message); } } async function onAddConcert(e) { e.preventDefault(); const form = e.target; const name = form.name.value.trim(); const venue = form.venue.value.trim(); const concertDate = form.concertDate.value; const submitBtn = form.querySelector('button[type="submit"]'); submitBtn.disabled = true; try { await api.post('/api/setlists', { name, venue, concertDate }); form.reset(); document.getElementById('add-concert-panel').style.display = 'none'; document.getElementById('toggle-add-concert-btn').textContent = '+ Proposer un concert'; await loadUpcoming(); } catch (err) { showError(err.message); } finally { submitBtn.disabled = false; } } function showUpcomingList() { document.getElementById('next-detail-view').style.display = 'none'; document.getElementById('next-list-view').style.display = 'block'; } function showNextDetail(id) { document.getElementById('next-list-view').style.display = 'none'; document.getElementById('next-detail-view').style.display = 'block'; const editor = createSetlistEditor({ containerId: 'next-detail-content', allSongs, getSetlist: async () => { try { return await api.get(`/api/setlists/${id}`); } catch (err) { return null; } }, emptyMessage: 'Concert introuvable.', allowDelete: true, onDeleted: async () => { showUpcomingList(); await loadUpcoming(); }, }); editor.load(); } function renderTimeline() { const container = document.getElementById('timeline-view'); if (!concerts.length) { container.innerHTML = 'Aucun concert passé enregistré.
'; return; } container.innerHTML = concerts.map(timelineConcertBlock).join(''); bindConcertLinks(container); } function renderCompact() { const container = document.getElementById('compact-view'); renderList(container, concerts, concertCardTemplate, 'Aucun concert passé enregistré.'); bindConcertLinks(container); } function applyHistoryViewMode() { const timelineEl = document.getElementById('timeline-view'); const compactEl = document.getElementById('compact-view'); const btn = document.getElementById('toggle-history-mode-btn'); if (historyViewMode === 'timeline') { timelineEl.style.display = 'block'; compactEl.style.display = 'none'; btn.textContent = 'Vue réduite'; } else { timelineEl.style.display = 'none'; compactEl.style.display = 'grid'; btn.textContent = 'Vue chronologique'; } } async function loadHistory() { concerts = await api.get('/api/setlists/history?full=1'); renderTimeline(); renderCompact(); applyHistoryViewMode(); } // ---------- Historique: détail d'un concert ---------- function showHistoryList() { document.getElementById('history-detail-view').style.display = 'none'; document.getElementById('history-list-view').style.display = 'block'; history.pushState({}, '', '/concerts.html?tab=history'); } function showHistoryDetail(id) { document.getElementById('history-list-view').style.display = 'none'; document.getElementById('history-detail-view').style.display = 'block'; history.pushState({}, '', `/concerts.html?tab=history&id=${id}`); const editor = createSetlistEditor({ containerId: 'history-detail-content', allSongs, getSetlist: async () => { try { return await api.get(`/api/setlists/${id}`); } catch (err) { return null; } }, emptyMessage: 'Concert introuvable.', allowDelete: true, onDeleted: async () => { showHistoryList(); await loadHistory(); }, }); editor.load(); } (async function init() { await initNav('concerts'); allSongs = await api.get('/api/songs'); document.getElementById('tab-next').addEventListener('click', () => switchTab('next')); document.getElementById('tab-history').addEventListener('click', () => switchTab('history')); document.getElementById('toggle-history-mode-btn').addEventListener('click', () => { historyViewMode = historyViewMode === 'timeline' ? 'compact' : 'timeline'; applyHistoryViewMode(); }); document.getElementById('back-to-history-link').addEventListener('click', (e) => { e.preventDefault(); showHistoryList(); }); document.getElementById('back-to-upcoming-link').addEventListener('click', (e) => { e.preventDefault(); showUpcomingList(); }); document.getElementById('toggle-add-concert-btn').addEventListener('click', () => { const panel = document.getElementById('add-concert-panel'); const isOpen = panel.style.display !== 'none'; panel.style.display = isOpen ? 'none' : 'block'; document.getElementById('toggle-add-concert-btn').textContent = isOpen ? '+ Proposer un concert' : 'Annuler'; }); document.getElementById('add-concert-form').addEventListener('submit', onAddConcert); try { await loadUpcoming(); await loadHistory(); const params = new URLSearchParams(window.location.search); const deepId = params.get('id'); if (deepId) { switchTab('history'); showHistoryDetail(deepId); } else if (params.get('tab') === 'history') { switchTab('history'); } } catch (err) { showError(err.message); } })();