Commit Graph

67 Commits

Author SHA1 Message Date
4bb1e332e3 Modals: action buttons bottom-right, no empty space under content 2026-09-28 17:39:10 +03:00
a73226b2ab Admin group: large variant modal with the assigned variant task text 2026-09-28 17:37:18 +03:00
ed8d853d2a Admin group: counter = number of group students who submitted a solution 2026-09-28 17:35:10 +03:00
6d1b36f02e Defense: keep assignment text for admins, hide it only from students 2026-09-28 17:30:11 +03:00
f630b0267e Admin group: fix script loading (extra div), total submissions counter, label cleanup 2026-09-28 17:22:09 +03:00
9df1af7647 Admin group: variant modal, cell badges/counters, header cleanup, bigger modal 2026-09-28 17:09:55 +03:00
fb67f5313d Admin group: rework lab cells/columns, fix sort toggle and card rounding 2026-09-28 16:39:18 +03:00
23213f2d75 Admin grades: comment autocomplete by substring, larger grade dialog 2026-09-28 16:32:01 +03:00
82f231c940 Admin group: single table, defense actions in cells; flash messages as toasts 2026-09-28 16:23:29 +03:00
debf157194 Refactor: bind admin forms via @ModelAttribute DTOs; detekt fully default 2026-09-27 23:13:29 +03:00
6129055962 Refactor: extract helpers from groupDetail/editLab; detekt thresholds to defaults 2026-09-27 22:58:35 +03:00
4035bc5a0f Refactor: split ContentService and ProgressService; defaults tightened 2026-09-27 22:48:13 +03:00
290b2a5a20 Refactor: split content order API; near-default detekt thresholds 2026-09-27 22:38:48 +03:00
3ed48b35fc Refactor: split AdminController into AdminSupport and domain controllers 2026-09-27 22:36:41 +03:00
f08ab16af0 Refactor: move defense API methods into separate extension file 2026-09-27 22:31:06 +03:00
c22eb15d3e Refactor: split ApiClient into domain extension files 2026-09-27 22:29:57 +03:00
6e891e4326 Test: Testcontainers integration tests for distribution and content import 2026-09-27 22:22:54 +03:00
47ec9884a3 Add ContentImporter tests; drop redundant elvis; document lint/test commands 2026-09-27 22:17:59 +03:00
a87110580b Lint: strict mode on; tune detekt thresholds; more decompositions 2026-09-27 22:15:00 +03:00
4a8a10971c Refactor: bind content admin forms via @ModelAttribute DTOs 2026-09-27 22:06:09 +03:00
9a2a4023b5 Refactor: split loop/throws helpers; drop deprecated JSON accessors 2026-09-27 22:02:56 +03:00
511df7977e Refactor: extract helpers to satisfy detekt (throws, returns, loops) 2026-09-27 22:00:15 +03:00
b7d96d2ea4 Refactor: reduce detekt findings (unused params, throws, long methods, config) 2026-09-27 21:54:00 +03:00
f3e8b2668f Build: enable ktlint+detekt, format sources, add core unit tests 2026-09-27 21:46:05 +03:00
802616918f Admin: name submission archives as group-studentNo-name-attempt 2026-09-27 20:46:17 +03:00
a8785d48d9 Submissions: reject XML project files, show submitted file names to admin 2026-09-24 11:32:19 +03:00
d81cebef70 Content: match imported chapters/sections/articles by title; slug without number 2026-09-22 17:53:59 +03:00
7f4a518e46 trigger gitea hooks 2026-09-18 11:43:13 +03:00
3d05affdab trigger gitea hooks 2026-09-18 11:43:00 +03:00
18d3ae5650 Edit README.md 2026-09-18 11:25:16 +03:00
0bb55e6e4b Fix mobile layout; scroll tables themselves, not cards 2026-09-17 22:13:56 +03:00
3c40ffb11d Bump LMS version to 0.2.0 2026-09-17 21:19:52 +03:00
51f0836894 Learn: remember expanded sections, open only in the last chapter by default 2026-09-17 20:41:54 +03:00
930e2fb580 Learn: remove link underlines 2026-09-17 20:35:29 +03:00
22b732633c Learn: section actions on the title row, scrollable tables, copy code 2026-09-17 20:16:35 +03:00
78b72267a8 Learn: drag handles on the left, chapters always expanded 2026-09-17 19:56:35 +03:00
cb4cfee05b Learn: drag & drop sections and articles on chapter and section pages 2026-09-17 19:15:56 +03:00
03c712fe2f Learn: fix navigate buttons 2026-09-17 19:01:52 +03:00
80f551745a Learn: fix alert notification 2026-09-17 18:55:57 +03:00
57052ed117 Learn: icon formatting toolbar; fix editor shown when hidden 2026-09-17 18:38:19 +03:00
c111dce6da Learn: inline markdown editor with formatting toolbar; drop edit modals 2026-09-17 18:31:43 +03:00
8753d3658e Learn: outline panel moved to the left of the article
- article layout: content column on the right, sticky outline (chapters, sections,
  articles) on the left; on narrow screens the article comes first and the
  outline follows it
2026-09-17 17:36:54 +03:00
df5020fea6 Learn UI: prev/next navigation, sidebar outline, editing on every page; merge import; defense date
- 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)
2026-09-17 17:14:16 +03:00
6246d4c8d3 Materials: images with captions and video support
- 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 "медиафайлов"
2026-09-17 15:44:16 +03:00
a1392a469e Content import: sync sections and articles (archive is the source of truth)
- 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
2026-09-16 22:00:22 +03:00
da464f882a Content sort: autosave without reload; keep page state across reloads
- drag & drop now saves in the background (700 ms debounce) without reloading:
  sections stay open, scroll position is kept; on failure it retries every 3 s,
  and navigator.sendBeacon flushes unsaved changes on page leave
- removed the explicit save button (autosave only), status indicator shows
  «Изменения не сохранены… / Сохранение… / Порядок сохранён»
- new global ui-state.js: restores open <details> and scroll position after any
  reload/redirect within the same page (applies to all pages, not just /learn)
- auto-expand a collapsed chapter/section while hovering during drag
2026-09-16 19:00:03 +03:00
5ffeaa0217 Content: drag & drop reordering and moving of chapters, sections and articles
- 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
2026-09-16 18:51:21 +03:00
6ffc6304e3 docs: add UML and architecture documentation (Mermaid)
- docs/README.md — index and short system overview
- 01-architecture.md — context, per-service components, Gradle modules,
  authentication/authorization, web interceptors (flowcharts)
- 02-deployment.md — deployment diagram, containers/env/volumes, build stages,
  nginx, update sequence
- 03-domain-model.md — class diagrams for identity/academic/progress and web,
  ER model of all schemas (cross-schema references noted)
- 04-sequences.md — 10 sequence diagrams (login, JWT check, forced password
  change, lab import, distribution, submission, defense, grades+publication,
  content publishing, group page aggregation)
- 05-states.md — state diagrams for defense session, grade publication, lab
  status, content visibility, submission lifecycle, variant assignment, password
MS
git log --oneline -3
2026-09-16 18:44:14 +03:00
c379be7fba Content: publish/hide chapters, sections and articles
- 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
2026-09-16 18:29:44 +03:00
2a0e8ddf9f Table columns: dropdown/text filters per column
- 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 (Статус)
2026-09-15 22:43:48 +03:00