/
Lekant
/
Anketa
Обзор
Документация
Войти
/
Lekant
/
Anketa
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
admin.js
134 строки
5 KB
Lekant
update: admin.js
26 май 2026, 10:54
Верифицирован
26 май 2026, 10:54
a161f97
Код
Авторство
О чём код?
let autoRefreshInterval; async function loadData() { try { const response = await fetch('/api/responses'); const data = await response.json(); updateTable(data); updateStats(data); } catch (error) { console.error('Ошибка загрузки:', error); document.getElementById('tableBody').innerHTML = '<tr><td colspan="11" style="text-align: center; color: red;">❌ Ошибка загрузки данных</td></tr>'; } } function updateTable(data) { const tbody = document.getElementById('tableBody'); const searchTerm = document.getElementById('searchInput').value.toLowerCase(); const filteredData = data.filter(row => (row.fullName || '').toLowerCase().includes(searchTerm) || (row.faculty || '').toLowerCase().includes(searchTerm) || (row.desiredPosition || '').toLowerCase().includes(searchTerm) ); if (filteredData.length === 0) { tbody.innerHTML = '<tr><td colspan="11" style="text-align: center;">📭 Нет данных для отображения</td></tr>'; return; } tbody.innerHTML = filteredData.map(row => ` <tr> <td><span class="status-badge status-filled">✓ Заполнено</span></td> <td>${escapeHtml(row.timestamp) || '-'}</td> <td><strong>${escapeHtml(row.fullName) || '-'}</strong></td> <td>${escapeHtml(row.graduationYear) || '-'}</td> <td>${escapeHtml(row.faculty) || '-'}</td> <td>${escapeHtml(row.profession) || '-'}</td> <td>${escapeHtml(row.desiredPosition) || '-'}</td> <td>${row.expectedSalary ? Number(row.expectedSalary).toLocaleString() + ' ₽' : '-'}</td> <td>${escapeHtml(row.relocation) || '-'}</td> <td>${escapeHtml(row.skills) || '-'}</td> <td>${escapeHtml(row.comment) || '-'}</td> </tr> `).join(''); } function updateStats(data) { const count = data.length; document.getElementById('statsCount').innerHTML = `${count} / ${count} ответов`; } function escapeHtml(str) { if (!str) return ''; return str.replace(/[&<>]/g, function(m) { if (m === '&') return '&'; if (m === '<') return '<'; if (m === '>') return '>'; return m; }); } function exportToCSV() { fetch('/api/responses') .then(res => res.json()) .then(data => { if (data.length === 0) { alert('Нет данных для экспорта'); return; } const headers = ['timestamp', 'fullName', 'graduationYear', 'faculty', 'profession', 'desiredPosition', 'expectedSalary', 'relocation', 'skills', 'comment']; const csvRows = []; csvRows.push(headers.join(',')); for (const row of data) { const values = headers.map(header => { let val = row[header] || ''; val = val.toString().replace(/"/g, '""'); return `"${val}"`; }); csvRows.push(values.join(',')); } const blob = new Blob(['\uFEFF' + csvRows.join('\n')], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement('a'); const url = URL.createObjectURL(blob); link.href = url; link.setAttribute('download', `responses_${new Date().toISOString().slice(0,19)}.csv`); document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); }); } function refreshTable() { loadData(); const indicator = document.getElementById('refreshStatus'); if (indicator) { indicator.textContent = 'обновлено!'; setTimeout(() => { if (autoRefreshInterval) { indicator.textContent = 'активно (каждые 10 сек)'; } }, 2000); } } function resetAutoRefresh() { if (autoRefreshInterval) { clearInterval(autoRefreshInterval); autoRefreshInterval = null; document.getElementById('refreshStatus').textContent = 'остановлено'; } else { startAutoRefresh(); } } function startAutoRefresh() { autoRefreshInterval = setInterval(() => { loadData(); }, 10000); } // Инициализация if (document.getElementById('searchInput')) { document.getElementById('searchInput').addEventListener('input', () => { loadData(); }); } startAutoRefresh(); loadData();