let me = null; let allSongs = []; let setlist = null; let editRows = []; function formatDate(dateStr) { const d = new Date(dateStr); return d.toLocaleDateString('fr-FR', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }); } function songOptions(selectedId) { return allSongs .map((s) => ``) .join(''); } function readOnlyView() { const main = setlist.songs.filter((s) => !s.is_encore); const encore = setlist.songs.filter((s) => s.is_encore); return `
Aucun morceau pour le moment.
'}Aucun morceau de rappel prévu.
'}Aucun concert à venir.
${editView()}` : 'Aucun concert à venir pour le moment.
'; if (me.isAdmin) attachMetaFormHandler(); return; } container.innerHTML = readOnlyView(); const editBtn = document.getElementById('edit-btn'); if (editBtn) editBtn.addEventListener('click', enterEditMode); } function enterEditMode() { editRows = setlist.songs.map((s) => ({ setlistSongId: s.id, songId: s.song_id, position: s.position, note: s.note, isEncore: s.is_encore, })); renderEdit(); } function renderEdit() { const container = document.getElementById('content'); container.innerHTML = editView(); attachMetaFormHandler(); attachEditHandlers(); } function attachMetaFormHandler() { const form = document.getElementById('meta-form'); if (!form) return; form.addEventListener('submit', async (e) => { e.preventDefault(); const name = form.name.value.trim(); const venue = form.venue.value.trim(); const concertDate = form.concertDate.value; try { if (setlist) { setlist = await api.patch(`/api/setlists/${setlist.id}`, { name, venue, concertDate }); setlist.songs = (await api.get(`/api/setlists/${setlist.id}`)).songs; } else { setlist = await api.post('/api/setlists', { name, venue, concertDate }); setlist.songs = []; } enterEditMode(); } catch (err) { showError(err.message); } }); } function attachEditHandlers() { document.querySelectorAll('.remove-row').forEach((btn) => { btn.addEventListener('click', () => { editRows.splice(parseInt(btn.dataset.index, 10), 1); renderEdit(); }); }); document.querySelectorAll('[data-row-index]').forEach((rowEl) => { const index = parseInt(rowEl.dataset.rowIndex, 10); rowEl.querySelectorAll('[data-field]').forEach((input) => { input.addEventListener('change', () => { const field = input.dataset.field; if (field === 'isEncore') editRows[index][field] = input.checked; else if (field === 'position') editRows[index][field] = parseInt(input.value, 10); else if (field === 'songId') editRows[index][field] = parseInt(input.value, 10); else editRows[index][field] = input.value; }); }); }); const addBtn = document.getElementById('add-row-btn'); if (addBtn) { addBtn.addEventListener('click', () => { const nextPos = editRows.filter((r) => !r.isEncore).length + 1; editRows.push({ songId: allSongs[0]?.id, position: nextPos, note: '', isEncore: false }); renderEdit(); }); } const saveBtn = document.getElementById('save-songs-btn'); if (saveBtn) { saveBtn.addEventListener('click', async () => { try { const payload = editRows.map((r) => ({ songId: r.songId, position: r.position, note: r.note, isEncore: !!r.isEncore, })); setlist = await api.put(`/api/setlists/${setlist.id}/songs`, { songs: payload }); renderReadOnly(); } catch (err) { showError(err.message); } }); } const cancelBtn = document.getElementById('cancel-edit-btn'); if (cancelBtn) cancelBtn.addEventListener('click', renderReadOnly); } function showError(message) { document.getElementById('error').innerHTML = ``; } (async function init() { me = await initNav('setlist'); if (me.isAdmin) { allSongs = await api.get('/api/songs'); } setlist = await api.get('/api/setlists/next'); renderReadOnly(); })();