- tablekit builds a filter row under the headers for every th with data-filter;
distinct cell values become a select (label from data-filter-label), or a
text substring filter with data-filter="text"
- filters combine with the global table search; placeholder rows (colspan) are
not filtered away; filter row follows the lab-focus column hiding
- enabled on: matrix lab columns (by variant), defense table (ЛР, status with
readable values), students (Основа, Пароль), lab assignment lists (Уровень,
Источник, Сдача), labs list (Статус)
- 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)
- group/lab/labs: move dialogs/scripts INSIDE the #content fragment (they were
outside — the layout fragment dropped them, which is why 'add student' did nothing)
- group.html toast had swallowed the dialog (th:if createdStudent) — split properly
- .input-score width no longer overridden by .inline-form .input-sm (10rem min)
- lab page: remove separate 'change status' button — status badge is now a toggle
button itself (confirm dialog kept)
- DateUtils.localInput/toUtcIso: dates entered in datetime-local are Moscow-local,
stored as UTC instant, shown back MSK — correct round-trip both ways
- academic parseInstant: naive local datetimes treated as Europe/Moscow
- README/module docs left as-is
- run.sh: start/stop/restart/status/logs for the whole stack, JAVA_BIN
override, pinned to /usr/lib/jvm/java-21-openjdk (Java 25 breaks
logback ThrowableProxy inside fat jars and kills Tomcat threads)
- -Xmx320m per service, health-gated startup, logs/ dir (gitignored)
- README: requirements, run.sh workflow, full current feature list
- verified: 25-round load test across all pages under JDK 21 — 0 failures
- DateUtils: format ISO instants as dd.MM.yyyy HH:mm in Europe/Moscow
- admin/lab page and student dashboard show deadlines in MSK time
- CSRF failure redirects to /login with friendly message instead of 403
- session tracking-modes=cookie (no ;jsessionid in URLs) (previously set)
- web rebuild with all dialog/status-toggle fixes verified end-to-end
- Dashboard: real stats (groups, students, labs, average grade), labs/groups
summary lists, no placeholder tile
- Lab page: view + edit combined — metadata form in modal, condition rendered
as markdown, per-level variant tables with add/edit/delete dialogs,
level rename/delete, student level/variant selectors with group filter
- Labs list: create-lab dialog with manual level entry (code; title lines)
- Groups: create-group dialog, add-student dialog (auto password, toast card)
- Content: public /learn reader is the single place; admin buttons (new
article with chapter/section create-or-select, rename/delete chapters and
sections, move articles between sections, import zip) appear for admins;
removed separate 'Контент' admin section
- Buttons use btn classes instead of nav-link
- Favicon: generated SVG book icon
- Security: CSRF synchronizer token interceptor (replaced spring-security in
web which broke logback under nested jars), session regenerated on login,
hardened session cookie, gateway actuator limited to health,info
- Jackson 3: nullable-safe request DTOs for labs (FAIL_ON_NULL_FOR_PRIMITIVES)
- academic: POST /labs (manual create with levels), level add/rename/delete,
content chapters/sections CRUD, article create/move/delete endpoints
- Replace all inline style= with reusable CSS classes
- Add layout classes: page, page-header, page-main, page-footer
- Fix footer at bottom via flex column + flex:1 on main
- Remove jsessionid from static resource URLs
- Create lab1-full.zip with 30 variants from PDF metodichka
- All templates use CSS var classes for light/dark theme