function formatDate(dateStr) { const d = new Date(dateStr); return d.toLocaleDateString('fr-FR', { year: 'numeric', month: 'long', day: 'numeric' }); } function showError(message) { document.getElementById('error').innerHTML = `
`; } function statTile(value, label) { return `Aucun calendrier configuré.
'; container.querySelectorAll('.remove-my-feed-btn').forEach((btn) => { btn.addEventListener('click', () => onRemoveMyFeed(parseInt(btn.dataset.feedId, 10))); }); } async function onAddMyFeed(e) { e.preventDefault(); const form = e.target; const label = form.label.value.trim(); const icsUrl = form.icsUrl.value.trim(); try { await api.post('/api/calendar/my-feeds', { label, icsUrl }); form.reset(); await loadMyFeeds(); } catch (err) { showError(err.message); } } async function onRemoveMyFeed(feedId) { try { await api.del(`/api/calendar/my-feeds/${feedId}`); await loadMyFeeds(); } catch (err) { showError(err.message); } } (async function init() { await initNav(null); try { const profile = await api.get('/api/users/me/profile'); const container = document.getElementById('content'); container.innerHTML = `Ajoutez le lien ICS (iCal) d'un ou plusieurs de vos calendriers (Google, Outlook, Apple...) pour apparaître dans les disponibilités du groupe sur la page Disponibilités. L'application ne conserve jamais le contenu de vos calendriers — seul un statut disponible/occupé par créneau est déduit et enregistré.
Chargement…
Identité gérée par Authentik — pour changer votre nom, email ou mot de passe, ${profile.authentikAccountUrl ? `rendez-vous sur votre compte Authentik.` : 'rendez-vous sur votre compte Authentik.'}