V10 belongs to the unfinished groups/courses branch and must not be pulled into master. Production already has V11/V12 applied; master starts with that migration history without V10 and without out-of-order mode.
V10 came from the feature branch after V11/V12 were already applied in production. It is safe to apply after them and adds only profile author columns plus an index.
- use numeric semesters 1–8 and add show/hide publication per attestation
- edit attestation results directly in the group table without a modal
- hide unpublished attestations from students
- align header separators, average column and action buttons with the existing UI
- remove missed-hours fields until a separate attendance model is ready
- store attestation columns and per-student results in progress-service
- add teacher UI for intermediate/pass/exam columns with semester and missed hours
- show average score per student on the group page
- show attestation results on the student dashboard
Add a non-required general comment for a student's lab grade (progress V9, API, admin modal, student card). Empty string is the default. Switch the UI to square corners and bump static asset versions.
- Lab page is now read-only with a settings screen for levels/variants;
variant issuance moved to a large modal on the group page (assign-fragment).
- Header: bordeaux logo and 2px accent underline, bordeaux login/logout/theme
buttons; smaller radii across the UI; filled secondary/danger buttons.
- Includes prior agent work (login backoff, no-cache pages, API timeouts,
content tweaks) and fixes (variant usage Map.values, import order).
- Bump static asset version to v=9.
- article page: ← / → navigation across the whole material tree (including
between sections), sticky sidebar outline with the current article highlighted
- editing on chapter, section and article pages: rename, publish/hide, delete,
create section/article, move articles while deleting a section; forms return
to the page they were opened from (validated internal `back` parameter)
- article page opens the edit dialog directly via ?edit=1 (used by "Править"
links on section/chapter pages)
- import: optional sync flag — with it stale sections/articles of archived
chapters are deleted (previous behaviour), without it import only adds and
updates, so material edited in the UI is not overwritten
- student area: lab page and lab cards now show the defense date next to the
submission deadline
- fix SpEL crash on the student lab page (`and` with nullable strings)
- markdown: new directives `:::figure assets/x.png | Подпись` and
`:::video assets/x.mp4 | Подпись` rendered as figure/figcaption and a
video player (works with HTML escaping on); sanitizer allows video/source/
track/figure with safe attributes only
- assets: video extensions (mp4/webm/ogg) allowed, separate limits — images
up to 10 MB, video up to 100 MB; correct content types
- upload limits raised: web/academic multipart 120 MB per file / 200 MB per
request, nginx client_max_body_size 200m (covers media inside ZIP imports)
- docs: new docs/06-authoring.md (markdown, images, video, assets, limits,
import semantics); import message now says "медиафайлов"
- importZip now updates titles/positions of existing chapters and sections and
removes sections/articles of archived chapters that are missing in the archive
(so restructured material no longer leaves stale sections behind); removed
count is reported in ContentImportResult and in the admin flash message
- docs: note about import semantics in the class diagram and sequences
- academic: POST /api/v1/content/reorder applies a full tree arrangement in one
request — chapter order, section order and section->chapter moves, article
order and article->section moves (positions and parent ids updated)
- web: POST /admin/content/reorder accepts the tree from JS (CSRF via query
param), calls the gateway with the admin token
- /learn admin view: draggable handles (⠿) for chapters, sections and articles;
drop before/after to reorder, drop into a chapter/section to move; visual
indicators; structure is collected from DOM and saved, then page reloads
- docs: class diagram method + new sequence diagram for drag & drop
- migration V5 adds published flag (default true) to chapters/sections/articles
- ContentService: tree(includeHidden) filters, treeAll(), findArticle(includeHidden),
set*Published; public tree/article expose only published items
- admin API: GET /tree/all, GET /all/{chapter}/{section}/{article}, PUT
/{chapters|sections|articles}/{id}/published
- web: learn pages for admins load the full tree, show "скрыто" badges and
publish/hide buttons for every chapter, section and article; hidden articles
open in preview for admins, guests get "not found"; article view carries
published flag
- identity group detail (and thus every student list) is ordered by full name;
defense rows on the group page sorted by name + lab number
- tablekit.js: click a header to sort (numeric-aware, ru locale), second click
flips direction (▲/▼ indicator); search input with data-target filters rows
by substring live
- tables wired: group matrix (with data-sort on variant cells), defense table
(data-sort on status/date), students table, lab assignment lists per group,
groups list and labs list; name/number columns pre-marked ascending
- non-sortable columns marked data-nosort (checkbox/actions)