feat: background tasks manager and book sentence mining for CEFR tests

This commit is contained in:
2026-10-06 16:36:39 +03:00
parent 332286b641
commit c9da5bd351
11 changed files with 1377 additions and 16 deletions
+56 -2
View File
@@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
<title>Notes — Персональный тренажер и словарь английского языка</title>
<meta name="description" content="Защищённый персональный тренажёр и словарь английского языка с интервальными повторениями SRS SM-2, контекстным поиском и озвучкой">
<link rel="stylesheet" href="/static/css/style.css?v=5.4">
<link rel="stylesheet" href="/static/css/style.css?v=5.5">
<!-- PWA meta and icons -->
<link rel="manifest" href="/manifest.json">
@@ -608,8 +608,16 @@
<h2>🎯 Уровневые тесты CEFR (A1 – B2)</h2>
<p class="subtitle">Эталонные тесты по международной шкале Oxford 3000/5000. Ошибки автоматически добавляются в ваш личный тренажёр SRS со статусом «В процессе»!</p>
</div>
<div class="cefr-header-actions">
<button type="button" id="cefr-mine-books-btn" class="btn btn-secondary">
⚡ Собрать тесты из книг
</button>
</div>
</div>
<!-- Active Background Task Banner -->
<div id="cefr-task-banner" class="cefr-task-banner hidden"></div>
<div id="cefr-levels-grid" class="cefr-levels-grid">
<!-- Dynamic level cards rendered by cefr.js -->
</div>
@@ -1226,6 +1234,52 @@
</div>
</div>
<!-- Mine CEFR Questions from Books Modal -->
<div id="mine-books-modal" class="modal-backdrop hidden">
<div class="modal-window">
<div class="modal-header">
<h3>⚡ Сборка тестов из библиотеки книг</h3>
<button type="button" id="close-mine-books-modal-btn" class="icon-btn">✕</button>
</div>
<form id="mine-books-form">
<div class="modal-body">
<p class="modal-desc" style="margin-bottom: 1rem; color: var(--text-muted); font-size: 0.9rem;">
Сканирует ваши книги, находит аутентичные предложения с лексикой CEFR и создает тесты с выбором вариантов. Фоновая задача работает без задержек.
</p>
<div class="form-group">
<label for="mine-books-select">Книга для анализа:</label>
<select id="mine-books-select" class="input-styled">
<option value="">📚 Все книги библиотеки</option>
</select>
</div>
<div class="form-group">
<label for="mine-level-select">Целевой уровень CEFR:</label>
<select id="mine-level-select" class="input-styled">
<option value="ALL">Все уровни (A1 – B2)</option>
<option value="A1">A1 – Начальный</option>
<option value="A2">A2 – Элементарный</option>
<option value="B1">B1 – Средний</option>
<option value="B2">B2 – Выше среднего</option>
</select>
</div>
<div class="form-group">
<label for="mine-count-input">Количество вопросов для сборки:</label>
<select id="mine-count-input" class="input-styled">
<option value="15" selected>15 вопросов</option>
<option value="25">25 вопросов</option>
<option value="35">35 вопросов</option>
<option value="50">50 вопросов</option>
</select>
</div>
</div>
<div class="modal-footer">
<button type="button" id="cancel-mine-books-btn" class="btn btn-outline">Отмена</button>
<button type="submit" id="submit-mine-books-btn" class="btn btn-primary">⚡ Запустить сборку</button>
</div>
</form>
</div>
</div>
<!-- Reader Appearance Settings Popover / Bottom Sheet -->
<div id="reader-settings-panel" class="reader-settings-panel hidden">
<div class="sheet-drag-handle mobile-only"></div>
@@ -1383,7 +1437,7 @@
<!-- Audio Element for native streaming -->
<audio id="global-audio-player" preload="none"></audio>
<script type="module" src="/static/js/app.js?v=5.4"></script>
<script type="module" src="/static/js/app.js?v=5.5"></script>
</body>
</html>