86 lines
3.2 KiB
Plaintext
86 lines
3.2 KiB
Plaintext
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Импорт XLS — Справки</title>
|
||
<link rel="stylesheet" href="/style.css">
|
||
</head>
|
||
<body>
|
||
<div class="container">
|
||
<nav class="nav">
|
||
<a href="/" class="btn">← К списку</a>
|
||
<span class="user-bar"><%= user ? user.name : '' %></span>
|
||
<button id="logout-btn" class="btn btn-logout">Выйти</button>
|
||
</nav>
|
||
|
||
<h1>Импорт данных из XLS</h1>
|
||
|
||
<div class="card">
|
||
<form id="import-form" enctype="multipart/form-data">
|
||
<div class="form-row">
|
||
<input type="file" name="xlsfile" accept=".xls,.xlsx" class="input" required>
|
||
</div>
|
||
<button type="submit" class="btn btn-green">Загрузить и распарсить</button>
|
||
</form>
|
||
<div id="import-result" style="margin-top:15px"></div>
|
||
</div>
|
||
|
||
<div class="card">
|
||
<h2>Инструкция</h2>
|
||
<ol>
|
||
<li>Выберите XLS-файл с протоколом ГИА-9</li>
|
||
<li>Нажмите «Загрузить и распарсить»</li>
|
||
<li>Данные сохранятся в базу</li>
|
||
<li>Затем перейдите в карточку ученика и введите баллы по русскому и математике</li>
|
||
<li>Сформируйте справку (ГИА или ГВЭ)</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
window.__CSRF_TOKEN = '<%= csrfToken %>';
|
||
|
||
const _origFetch = window.fetch.bind(window);
|
||
window.fetch = function(input, init = {}) {
|
||
init.credentials = 'include';
|
||
const method = (init.method || 'GET').toUpperCase();
|
||
if (['POST','PUT','PATCH','DELETE'].includes(method)) {
|
||
if (!init.headers) init.headers = {};
|
||
init.headers['X-CSRF-Token'] = window.__CSRF_TOKEN || '';
|
||
}
|
||
return _origFetch(input, init);
|
||
};
|
||
|
||
document.getElementById('logout-btn').addEventListener('click', async () => {
|
||
await fetch('/api/logout', { method: 'POST' });
|
||
window.location.href = '/login';
|
||
});
|
||
|
||
document.getElementById('import-form').addEventListener('submit', async (e) => {
|
||
e.preventDefault();
|
||
const formData = new FormData(e.target);
|
||
const btn = e.target.querySelector('button');
|
||
const result = document.getElementById('import-result');
|
||
btn.disabled = true;
|
||
btn.textContent = 'Идёт импорт...';
|
||
result.innerHTML = '';
|
||
|
||
try {
|
||
const res = await fetch('/api/import', { method: 'POST', body: formData });
|
||
const data = await res.json();
|
||
if (res.ok) {
|
||
result.innerHTML = `<div class="msg msg-ok">Импортировано: ${data.students} учеников, ${data.subjects} предметов, ${data.results} результатов.</div>`;
|
||
} else {
|
||
result.innerHTML = `<div class="msg msg-err">Ошибка: ${data.error}</div>`;
|
||
}
|
||
} catch (err) {
|
||
result.innerHTML = `<div class="msg msg-err">Ошибка: ${err.message}</div>`;
|
||
}
|
||
btn.disabled = false;
|
||
btn.textContent = 'Загрузить и распарсить';
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|