Commit Graph

12 Commits

Author SHA1 Message Date
Maxim Dolgolyov a33f622a35 style(textbooks): компактная кнопка «В лабораторию» (иконка + счётчик)
Кнопка на карточке учебника наследовала .tb-btn{flex:1} и растягивалась
наравне с «Продолжить» — длинный текст переносился на 3 строки, колба
вставала посреди слова. Теперь .tb-lab-btn — компактный квадрат (как
кнопка ДЗ): только колба, при нескольких связях добавляется число;
полное название в title. flex:0 0 auto + white-space:nowrap убирают
перенос, колба тонирована в --violet как научный акцент.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 19:12:48 +03:00
Maxim Dolgolyov 5a7724bdbb feat(lab-content-engine): phase 5 — кнопка «В лабораторию» на карточке учебника
textbooks.html: батч-запрос /api/lab/links/all?kind=textbook при загрузке ->
labLinks byRef; на карточке учебника со связанными симуляциями добавлена кнопка
«В лабораторию» (deep-link /lab?sim=<id>, openLabSim со stopPropagation, чтобы
клик не открывал учебник). (Прошлый коммит метил не ту разметку карточки — фикс.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 17:28:25 +03:00
Maxim Dolgolyov a60349d339 fix(textbooks catalog): добавил классы sky/red/orange/yellow для обложек
Карточка Физики 7 в каталоге показывалась с прозрачной обложкой и
нечитаемым (белым на светло-голубом) заголовком — потому что миграция
039_physics_7_hub.sql указывает color='sky', а класса .tb-cover.sky
в textbooks.html не было.

Добавлено 4 новых цвета в 3 секциях CSS (tb-cover / tb-progress / tb-btn.primary):
- sky    (#0284c7) — для Физики 7 и других учебников с sky-палитрой
- red    (#dc2626) — на будущее для огненных тем
- orange (#ea580c) — для активных физических курсов
- yellow (#ca8a04) — для математических курсов

Теперь карточка Физики 7 показывает читаемый белый текст на градиенте
sky-700 → sky-400, совпадающем с темой хаба физики 7.
2026-05-30 12:04:39 +03:00
Maxim Dolgolyov 96b5e46660 revert(textbooks ui): откат компактной сетки — возврат к крупным карточкам с обложками 2026-05-29 21:43:11 +03:00
Maxim Dolgolyov f08a81263d refactor(textbooks ui): компактная сетка каталога — плитки 190px + фильтры по предмету
- Карточка: горизонтальный layout, 74px высоты — цветная маркер-полоса слева (46px) с классом + 4-буквенной аббрев. предмета + watermark, справа название/счётчик параграфов/прогресс-бар (3px)
- В ряд помещается 5-7 карточек на десктопе (вместо 2-3)
- Вся карточка кликабельна (ведёт на 'Продолжить' или 'Открыть')
- Кнопка 'Назначить ДЗ' для учителя — overlay в углу, появляется на hover
- Сверху сетки чипсы-фильтры по предмету с счётчиком; скрыты, если предметов <2
- На hover чуть приподнимается, в углу появляется 'Продолжить →'
- Mobile: 160px минимум, узкие отступы
2026-05-29 21:39:55 +03:00
Maxim Dolgolyov 5f8fcbd964 fix(textbooks): добавлены teal/cyan/emerald для tb-btn.primary и tb-progress-fill
Кнопка 'Открыть' и progress-bar тоже не рендерились без
правил для нестандартных цветов. Добавлены все 3 ассета:
.tb-progress.teal/cyan/emerald .tb-progress-fill
.tb-btn.primary.teal/cyan/emerald
2026-05-29 10:51:14 +03:00
Maxim Dolgolyov a4c933b62c fix(textbooks): добавлены CSS-обложки для teal/cyan/emerald
Карточка 'Алгебра — 10 класс' в каталоге не показывала
заголовок и градиентный фон, потому что у учебника
color='teal', а CSS-правила .tb-cover.teal не было.

Добавлены 4 цвета на будущее (для алгебры 10 теal, для
геометрии 10 cyan/emerald, для амбер вариант).
2026-05-29 10:49:53 +03:00
Maxim Dolgolyov 69a5707cb6 fix(textbooks catalog): добавлены цвета indigo и rose
Карточки Алгебры 9 (indigo) и Геометрии 9 (rose) показывались
белым на белом — отсутствовали CSS-классы .tb-cover.indigo
и .tb-cover.rose. Добавлены градиенты, fill прогресс-бара
и primary-кнопки для обоих цветов + расширен colorMap.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-29 10:47:06 +03:00
Maxim Dolgolyov 91696ba089 refactor: textbooks assign modal → LS.modal (−120 строк)
Та же миграция что и в exam9: убран inline-overlay HTML, дубликаты
CSS (.ex-overlay/.ex-panel/.ex-panel-* + .ax-error/.ax-success/
.ax-actions/.ax-btn) — всё это теперь .ls-mod-* из LS.modal.

Глобальные window.openAssignModal/closeAssignModal/onAssignOverlayClick/
onAssignEsc/setAssignTab/submitAssign и assignSlug/assignTitle/assignTab
переменные заменены на одну window.openAssignModal с локальным
closure по slug/title/currentTab.

Сохранены внутренние form-классы (.ax-form/.ax-classes/.ax-class/
.ax-tabs/.ax-tab/.ax-student-results/.ax-input/.ax-hint) — они
используются в body модалки.

Student search и tab-switching теперь обработчики на элементах
модалки (m.body.querySelector), а не глобальные document-listener'ы —
автоматически очищаются вместе с модалкой при close().

textbooks.html: 945 → 824 строки
2026-05-16 18:51:58 +03:00
Maxim Dolgolyov df29675cc7 ux: /textbook-progress и /admin-textbooks → вкладки в /textbooks
Раньше: 3 отдельные страницы со своими сайдбарами, header'ами и
скриптами. /textbook-progress был доступен только через кнопку в углу,
/admin-textbooks — только по прямому URL.

Теперь: одна страница /textbooks с тремя вкладками:
  • Каталог (все)
  • Прогресс класса (учитель/админ)
  • Управление (только админ)

URL hash routing: /textbooks#progress, /textbooks#manage. Lazy-init
для каждой вкладки (грузится при первом клике).

Старые страницы превращены в 312-байтные redirect-стабы для
сохранения старых ссылок и закладок:
  /textbook-progress  → /textbooks#progress
  /admin-textbooks    → /textbooks#manage

Effect:
  - Один header, один сайдбар-load, одна загрузка api.js/sidebar.js
  - HTML-страниц сокращено на ~530 строк (textbook-progress.html был
    248 строк, admin-textbooks.html — 219; сейчас ~10 каждая)
  - /textbooks.html: 467 → 945 строк (+478, поглотил функционал двух
    страниц с собственными стилями)
  - Чистый UX: всё про учебники в одном месте, переключение
    мгновенное (нет полной перезагрузки страницы)
2026-05-16 17:39:13 +03:00
Maxim Dolgolyov 3ff2f01178 feat: textbooks Phase 4 — A1+A2+A3+B4+C7 + назначение ученику
A1 — карточка ДЗ-чтения у ученика на /dashboard:
  - Новая ветка в buildAssignCard для assignments с textbook_id
  - Прогресс-бар «X из Y §», цвет берётся из textbook.color
  - Кнопка «Открыть / Продолжить» с deep-link на первый требуемый параграф
  - В classify(): textbook_all_read → done, deadline → overdue

A2 — авто-проверка выполнения:
  - При POST /:slug/progress с mark_read: проверяются активные textbook-assignments
  - Если все требуемые § прочитаны → INSERT в assignment_completion
  - SSE-уведомление учителю «Ученик завершил чтение: <title>»
  - myAssignments возвращает completed_at и textbook_all_read

A3 — учительский UI прогресса класса:
  - Новая страница /textbook-progress (учитель/админ)
  - Селекторы «учебник × класс» → таблица учеников с прогрессом
  - Сортировка по количеству прочитанного, дата last_at
  - Кнопка «Прогресс класса» добавлена в /textbooks (видна учителям)

B4 — admin-UI управления учебниками:
  - /admin-textbooks (только admin) — таблица всех учебников
  - Inline-редактирование title/author, тоггл is_active
  - Колонка «Читателей» (count из textbook_progress)
  - Endpoints: GET /api/textbooks/admin/all, PATCH /admin/:id

C7 — закладки/заметки внутри учебника:
  - Таблица textbook_bookmarks (user, textbook, para, text, note, color)
  - API: GET/POST/PATCH/DELETE для CRUD закладок
  - В tracker: при выделении текста (8-400 симв) появляется плавающая «+ Закладка»
  - Кнопка-иконка в overlay top-left открывает панель «Мои закладки»
  - Хранится paragraph-якорь, цвет, заметка, кнопка удалить

Назначение ученику (в дополнение к классу):
  - В модалке /textbooks — переключатель «Классу / Ученику»
  - Поиск ученика по имени/email через /api/classes/students
  - Submit использует POST /api/assignments (createDirectAssignment)
  - createDirectAssignment расширен textbook_slug + textbook_paragraphs
  - Учитель может назначать только ученикам своих классов

myAssignments расширен: возвращает textbook fields + post-process
  считает textbook_required_count, textbook_read_count, textbook_all_read.

Deep-link поддержка: /textbook/<slug>#pN в tracker.js — на load и hashchange
вызывает setParaTab(pN) (нативная функция учебника).

Миграция 005: assignment_completion + textbook_bookmarks + индексы.
2026-05-16 16:37: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