let links = []; let groups = []; let editingId = null; let studentsLoaded = false; function linkUrl(token) { return `${location.origin}/s/${token}`; } async function loadLinks() { const res = await fetch(`${API}/api/links`, { headers: hdr() }); links = await res.json(); const el = document.getElementById('linksList'); if (!links.length) { el.innerHTML = '
Ссылок пока нет. Создайте её в Журнале кнопкой «Ссылка».
'; return; } el.innerHTML = links.map(l => `
${esc(l.name)}
${l.group_name ? `Группа: ${esc(l.group_name)}` : ''} ${l.student_name ? `${l.group_name ? ' · ' : ''}Ученик: ${esc(l.student_name)}` : ''} ${l.date_from || l.date_to ? ` · период: ${l.date_from ? l.date_from.split('-').reverse().join('.') : '…'} — ${l.date_to ? l.date_to.split('-').reverse().join('.') : '…'}` : ' · весь период'} ${l.expires_at ? ` · истекает ${new Date(l.expires_at).toLocaleDateString('ru')}` : ''} ${l.anonymize_names ? ` · анонимизировано` : ''} ${l.access_password_hash ? ` · 🔒 пароль` : ''} · создана ${new Date(l.created_at).toLocaleString('ru')}
Открыть
`).join(''); } function fmtDate(d) { const [y, m, day] = (d || '').split('-'); return d ? `${day}.${m}.${y}` : ''; } async function openLinkModal() { editingId = null; document.getElementById('linkModalTitle').textContent = 'Новая ссылка'; document.getElementById('linkName').value = ''; document.getElementById('linkDateFrom').value = ''; document.getElementById('linkDateTo').value = ''; document.getElementById('linkExpiresDays').value = '7'; document.getElementById('linkAnonymizeNames').checked = false; document.getElementById('linkPassword').value = ''; document.getElementById('linkMessage').value = ''; document.getElementById('linkUrl').value = ''; if (!groups.length) { const res = await fetch(`${API}/api/groups`, { headers: hdr() }); groups = await res.json(); document.getElementById('linkGroup').innerHTML = '' + groups.map(g => ``).join(''); } if (!studentsLoaded) { const res = await fetch(`${API}/api/students/names`, { headers: hdr() }); const names = await res.json(); const dl = document.getElementById('linkStudentList'); dl.innerHTML = names.map(n => `' + groups.map(g => ``).join(''); } document.getElementById('linkGroup').value = l.group_id || ''; if (!studentsLoaded) { const res = await fetch(`${API}/api/students/names`, { headers: hdr() }); const names = await res.json(); const dl = document.getElementById('linkStudentList'); dl.innerHTML = names.map(n => `