Commit Graph

9 Commits

Author SHA1 Message Date
Maxim Dolgolyov 846a3c389d fix: sidebar group headers — контраст под светлую тему
Заголовки групп были rgba(255,255,255,0.45) — белые 45%, что под
тёмный sidebar. Но LearnSpace использует светлую тему (--bg=#EEF2FF),
из-за чего «УЧЕБНЫЙ ПРОЦЕСС» и пр. сливались с фоном.

Теперь:
  color: var(--text-3, #56687A) с opacity .72
  hover: var(--violet) с opacity 1

Visible contrast: было ~1.2:1 (невидимо), стало ~4:1 (WCAG AA для
небольшого uppercase-текста — годится).
2026-05-16 19:39:29 +03:00
Maxim Dolgolyov f1fbebe4da ux: sidebar — группировка по 4 секциям, сворачивание со state
Раньше: плоский список из 25 пунктов в один столбец, для учителя
видно ~20+, новички терялись.

Теперь: 4 группы со свёртывающимися заголовками + always-visible
top-блок и admin-нижний блок.

Группы:
  • (top, без заголовка) Поиск · Дашборд · Путеводитель · Руководство
  • «УЧЕБНЫЙ ПРОЦЕСС» (6): Классы, Мои ученики, Онлайн-урок,
    Архив уроков, Live-квиз, Доска
  • «КОНТЕНТ» (6): Учебники, Библиотека, Теория, Карта знаний,
    Банк вопросов, Экзамен 9 класс
  • «ПРАКТИКА И ИГРЫ» (7): Лаборатория, Биохимия, Красная книга,
    Кроссворд, Виселица, Питомец, Коллекция
  • «ОТЧЁТЫ И УПРАВЛЕНИЕ» (3, teacher+): Аналитика, Журнал, Управление

Технически:
  - Helper G(slug, label, body) — создаёт группу с уникальным slug
  - localStorage 'ls_sb_g_<slug>' хранит свёрнутое состояние
  - Click на заголовок группы → toggle .collapsed
  - Sidebar-collapsed (icon-only) режим: заголовки групп скрыты,
    все пункты остаются видны (компактный режим работает как раньше)
  - Стили инжектятся inline через id=sb-group-styles (защита от
    повторной инжекции при HMR)

Совместимость: все ссылки и их id/class сохранены, нет правок в
других файлах. Существующие onClick'и через id (btn-board, btn-classes,
btn-admin, btn-join) работают.
2026-05-16 17:49:00 +03:00
Maxim Dolgolyov eeb79246db @
feat: teacher_students — назначения ученикам без класса

Новая модель «Мои ученики» — учитель связывает с собой учеников
независимо от классов (репетиторский сценарий).

Backend:
  - Таблица teacher_students (teacher_id, student_id, added_at, note)
    + индекс на student_id для обратного поиска
  - GET/POST/PATCH/DELETE /api/teacher-students — управление списком
  - Добавление по email с проверкой роли student/free_student
  - Уведомление ученику при добавлении

  - createDirectAssignment: проверка inClass расширена до
    inClass OR (teacher_id, student_id) в teacher_students
  - listStudents (/api/classes/students): возвращает объединение
    учеников из классов + из teacher_students. Это автоматически
    обновляет student-picker в /textbooks без правок UI.

Frontend:
  - /my-students — таблица личных учеников + форма добавления
    по email + заметка + счётчик созданных заданий
  - Сайдбар: пункт «Мои ученики» (user-plus, только для учителей)

Миграция 006_teacher_students.sql.

Что работает end-to-end:
  - Добавить ученика на /my-students
  - Открыть /textbooks → «Назначить» → «Ученику» → ученик ищется
    в общем списке (классовые + личные)
  - Создаётся запись в assignments с user_id, видна ученику на
    дашборде с пометкой «Личное задание»
@
2026-05-16 17:01:11 +03:00
Maxim Dolgolyov e8018d85c1 feat: textbooks — модуль учебников + чтение как ДЗ (3 фазы)
Фаза 1 — структура и каталог:
  - frontend/textbooks/chemistry_9.html (Шиманович, 60 §) + physics_9.html (Исаченкова, 38 §)
  - frontend/textbooks.html — каталог в стиле LearnSpace (карточки с обложками)
  - Маршруты: /textbooks (каталог), /textbook/<slug> (полноэкранный учебник)
  - Сайдбар: пункт «Учебники» (book-open-text)
  - Feature flag feature_textbooks_enabled, hideDisabledFeatures map

Фаза 2 — прогресс в localStorage + UI чтения:
  - frontend/js/textbook-tracker.js — инжектится в каждый учебник:
    - «← Учебники» overlay-кнопка (top-left, semi-transparent)
    - «Прочитано» чекбокс рядом с каждым §-заголовком
    - Зелёный dot на pill уже прочитанных параграфов
    - Авто-открытие последнего параграфа при возврате
  - Каталог показывает прогресс-бар «X из Y прочитано» + кнопку «Продолжить»

Фаза 3 — серверный прогресс + назначение чтения как ДЗ:
  - Таблица textbooks (slug, subject, grade, title, author, color, ...)
  - Таблица textbook_progress (user_id, textbook_id, JSON read[], last_para)
  - Колонки assignments.textbook_id + textbook_paragraphs
  - API: GET /api/textbooks (с прогрессом), GET /:slug, POST /:slug/progress,
    GET /:slug/class-progress (учитель)
  - tracker.js синхронизирует прогресс через POST /progress (если залогинен)
  - На каталоге у учителей кнопка «Назначить чтение» — модалка с выбором
    классов + параграфы («1-5» или «1,3,5») + deadline
  - bulkCreateAssignment расширен: принимает textbook_slug, резолвит в id

Миграция 004 идемпотентная; сиды двух учебников включены.
2026-05-16 14:05:19 +03:00
Maxim Dolgolyov 6cff327e88 feat: exam9 — Экзамен 9 класс по математике (80 вариантов)
Новый отдельный модуль /exam9 в стиле LearnSpace:
- 80 вариантов × 10 заданий = 800 задач с разбором (KaTeX + SVG)
- Сайдбар: пункт «Экзамен 9 класс» (clipboard-check)
- Feature flag: feature_exam9_enabled (мигр. 002)
- Видим всем авторизованным; рендер на стороне клиента
- Прогресс в localStorage: подсветка вариантов (done/partial)
- Возобновление последнего варианта при возврате

Структура:
  frontend/exam9.html              — страница (LearnSpace layout)
  frontend/js/exam9/app.js         — рендерер
  frontend/js/exam9/variants/      — 80 файлов с данными
  frontend/img/exam9/              — 22 PNG/JPG фигур заданий

Картинки путей _tmp/ → /img/exam9/ переписаны автоматически.

Все маршруты проверены: 200 OK на /exam9, /js/exam9/*, /img/exam9/*.
2026-05-16 12:53:49 +03:00
Maxim Dolgolyov 6429e07606 fix: sidebar profile always visible — only .sb-nav scrolls, .sb-foot pinned at bottom 2026-04-14 20:40:45 +03:00
Maxim Dolgolyov 7f8838515a feat: интерактивное руководство для учителей /teacher-guide + ссылка в сайдбаре 2026-04-14 08:47:06 +03:00
Maxim Dolgolyov bc2e3909bb feat: страница-путеводитель /sitemap для новых учеников
Интерактивная карта всех модулей платформы:
- Hero с анимированными blob-элементами и gradient-заголовком
- Sticky filter bar (Учёба / Практика / Игры / Личное)
- Маршрут новичка (Дашборд → Теория → Задания)
- 16 карточек модулей с accent-цветами по категориям
- Staggered entrance через IntersectionObserver
- Тёмная тема, мобильная адаптация
- Ссылка в sidebar.js

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 08:31:07 +03:00
Maxim Dolgolyov edb4c211a0 feat: universal sidebar via sidebar.js + stale ID cleanup
- Add js/sidebar.js: generates full sidebar HTML into #app-sidebar,
  handles role-based visibility, active link (with prefix matching),
  toggle wiring, collapsed state, board/features/notif init
- Replace <aside class="sidebar">...</aside> with <aside id="app-sidebar">
  across all 35 standard-layout pages via scripts/apply-sidebar.js
- Add notifications.js to 5 pages that were missing it
- Fix api.js initPage(): skip toggle re-wiring if data-sb-wired set,
  fix active link selector .sb-item → .sb-link
- Remove stale sbl-*/nav-admin/btn-upload-nav getElementById calls
  that crashed after sidebar replacement (lab, classes, collection,
  crossword, hangman, knowledge-map, library, pet, profile)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 21:22:21 +03:00